fix: Simplify get_dimension_account_month_map

This commit updates get_dimension_account_month_map to no longer show
the actual expense when there is no budget. This also removes the other
functions and queries related to it. Spaces are also converted to tabs.
This commit is contained in:
Kevin Chan 2020-05-09 16:02:11 +08:00
parent b3ee6314f9
commit bc05855805

View File

@ -17,7 +17,6 @@ def execute(filters=None):
filters = {} filters = {}
columns = get_columns(filters) columns = get_columns(filters)
if filters.get("budget_against_filter"): if filters.get("budget_against_filter"):
dimensions = filters.get("budget_against_filter") dimensions = filters.get("budget_against_filter")
else: else:
@ -26,7 +25,6 @@ def execute(filters=None):
period_month_ranges = get_period_month_ranges( period_month_ranges = get_period_month_ranges(
filters["period"], filters["from_fiscal_year"] filters["period"], filters["from_fiscal_year"]
) )
cam_map = get_dimension_account_month_map(filters) cam_map = get_dimension_account_month_map(filters)
data = [] data = []
@ -149,7 +147,6 @@ def get_cost_centers(filters):
# Get dimension & target details # Get dimension & target details
def get_dimension_target_details(filters): def get_dimension_target_details(filters):
budget_against = frappe.scrub(filters.get("budget_against")) budget_against = frappe.scrub(filters.get("budget_against"))
cond = "" cond = ""
if filters.get("budget_against_filter"): if filters.get("budget_against_filter"):
cond += """ cond += """
@ -159,18 +156,22 @@ def get_dimension_target_details(filters):
) )
""".format( """.format(
budget_against=budget_against budget_against=budget_against
) % ", ".join( ) % ", ".join(["%s"] * len(filters.get("budget_against_filter")))
["%s"] * len(filters.get("budget_against_filter"))
)
return frappe.db.sql( return frappe.db.sql(
""" """
select distinct select
b.{budget_against} as name b.{budget_against} as budget_against,
b.monthly_distribution,
ba.account,
ba.budget_amount,
b.fiscal_year
from from
`tabBudget` b `tabBudget` b,
`tabBudget Account` ba
where where
b.docstatus = 1 b.name = ba.parent
and b.docstatus = 1
and b.fiscal_year between %s and %s and b.fiscal_year between %s and %s
and b.budget_against = %s and b.budget_against = %s
and b.company = %s and b.company = %s
@ -178,7 +179,8 @@ def get_dimension_target_details(filters):
order by order by
b.fiscal_year b.fiscal_year
""".format( """.format(
budget_against=budget_against, cond=cond budget_against=budget_against,
cond=cond,
), ),
tuple( tuple(
[ [
@ -207,9 +209,9 @@ def get_target_distribution_details(filters):
`tabMonthly Distribution` md `tabMonthly Distribution` md
where where
mdp.parent = md.name mdp.parent = md.name
and md.fiscal_year between %s and md.fiscal_year between %s and %s
and %s order by
order by md.fiscal_year md.fiscal_year
""", """,
(filters.from_fiscal_year, filters.to_fiscal_year), (filters.from_fiscal_year, filters.to_fiscal_year),
as_dict=1, as_dict=1,
@ -229,8 +231,8 @@ def get_actual_details(name, filters):
if filters.get("budget_against") == "Cost Center": if filters.get("budget_against") == "Cost Center":
cc_lft, cc_rgt = frappe.db.get_value("Cost Center", name, ["lft", "rgt"]) cc_lft, cc_rgt = frappe.db.get_value("Cost Center", name, ["lft", "rgt"])
cond = """ cond = """
and lft >= \'{lft}\' and lft >= "{lft}"
and rgt <= \'{rgt}\' and rgt <= "{rgt}"
""".format( """.format(
lft=cc_lft, rgt=cc_rgt lft=cc_lft, rgt=cc_rgt
) )
@ -288,38 +290,29 @@ def get_dimension_account_month_map(filters):
cam_map = {} cam_map = {}
for ccd in dimension_target_details: for ccd in dimension_target_details:
accounts = get_accounts(ccd.name, filters) actual_details = get_actual_details(ccd.budget_against, filters)
actual_details = get_actual_details(ccd.name, filters)
for year in get_fiscal_years(filters):
year = year[0]
monthly_distribution = get_monthly_distribution(ccd.name, year, filters)
for month_id in range(1, 13): for month_id in range(1, 13):
month = datetime.date(2013, month_id, 1).strftime( month = datetime.date(2013, month_id, 1).strftime("%B")
"%B" cam_map.setdefault(ccd.budget_against, {}).setdefault(
) # Get month string ccd.account, {}
).setdefault(ccd.fiscal_year, {}).setdefault(
for account in accounts: month, frappe._dict({"target": 0.0, "actual": 0.0})
account = account[0] )
cam_map.setdefault(ccd.name, {}).setdefault(account, {}).setdefault(
year, {}
).setdefault(month, frappe._dict({"target": 0.0, "actual": 0.0}))
tav_dict = cam_map[ccd.name][account][year][month]
tav_dict = cam_map[ccd.budget_against][ccd.account][ccd.fiscal_year][month]
month_percentage = ( month_percentage = (
tdd.get(monthly_distribution, {}).get(month, 0) tdd.get(ccd.monthly_distribution, {}).get(month, 0)
if monthly_distribution if ccd.monthly_distribution
else 100.0 / 12 else 100.0 / 12
) )
budget_amount = get_budget_amount(ccd.name, year, account, filters) tav_dict.target = flt(ccd.budget_amount) * month_percentage / 100
tav_dict.target = flt(budget_amount) * month_percentage / 100 for ad in actual_details.get(ccd.account, []):
if ad.month_name == month and ad.fiscal_year == ccd.fiscal_year:
for ad in actual_details.get(account, []):
if ad.month_name == month and ad.fiscal_year == year:
tav_dict.actual += flt(ad.debit) - flt(ad.credit) tav_dict.actual += flt(ad.debit) - flt(ad.credit)
return cam_map return cam_map
@ -343,78 +336,3 @@ def get_fiscal_years(filters):
) )
return fiscal_year return fiscal_year
def get_accounts(name, filters):
budget_against = frappe.scrub(filters.get("budget_against"))
accounts = frappe.db.sql(
"""
select
distinct(ba.account)
from
`tabBudget Account` ba
join
`tabBudget` b
on b.name = ba.parent
where
b.docstatus = 1
and b.fiscal_year between %s and %s
and b.{budget_against} = %s
order by
ba.account
""".format(
budget_against=budget_against
),
(filters.from_fiscal_year, filters.to_fiscal_year, name),
)
return accounts
def get_monthly_distribution(name, year, filters):
budget_against = frappe.scrub(filters.get("budget_against"))
monthly_distribution = frappe.db.sql(
"""
select
monthly_distribution
from
`tabBudget`
where
docstatus = 1
and {budget_against} = %s
and fiscal_year = %s
""".format(
budget_against=budget_against
),
(name, year),
)
return monthly_distribution[0][0] if monthly_distribution else None
def get_budget_amount(name, year, account, filters):
budget_against = frappe.scrub(filters.get("budget_against"))
budget_amount = frappe.db.sql(
"""
select
ba.budget_amount
from
`tabBudget Account` ba
join
`tabBudget` b
on b.name = ba.parent
where
b.docstatus = 1
and b.{budget_against} = %s
and b.fiscal_year = %s
and ba.account = %s
""".format(
budget_against=budget_against
),
(name, year, account),
)
return budget_amount[0][0] if budget_amount else 0