created find_previous_bill and use it to help work out gaps in bills - e.g. like with internet where I added only the new costs
This commit is contained in:
58
bills.py
58
bills.py
@@ -6,6 +6,44 @@ def qtr(d):
|
|||||||
m = int(d[5:7])
|
m = int(d[5:7])
|
||||||
return ( (m-1)//3 + 1 )
|
return ( (m-1)//3 + 1 )
|
||||||
|
|
||||||
|
def find_previous_bill( bill_type, bill_info, bill_date ):
|
||||||
|
# print( f"{bill_type}: find_previous_bill -> {bill_date}" )
|
||||||
|
wanted_year = int(bill_date[:4])
|
||||||
|
wanted_mm = int(bill_date[5:7])
|
||||||
|
# if we don't have a bill before this date, no way to set price
|
||||||
|
if int(wanted_year) < int(bill_info[bill_type]['first_bill_year']):
|
||||||
|
# print(f"{bill_type}: find_previous_bill - failed. wanted_year={wanted_year} is older than our first_bill={bill_info[bill_type]['first_bill_year']}" )
|
||||||
|
return None
|
||||||
|
|
||||||
|
# start loop from bill_date, go backwards and find which one it is (same year, should be month-based)
|
||||||
|
# earlier year, then just last one from the year.
|
||||||
|
yr_range=range( wanted_year, bill_info[bill_type]['first_bill_year'], -1 )
|
||||||
|
if wanted_year == int(bill_info[bill_type]['first_bill_year']):
|
||||||
|
# range of this year with -1, does not return anything, so force this year.
|
||||||
|
yr_range=[ wanted_year ]
|
||||||
|
for yr in yr_range:
|
||||||
|
# start with bills in the year wanted (if any)
|
||||||
|
# must include 'estimated' bills to deal with growth of future years
|
||||||
|
if yr in bill_info[bill_type]['year']:
|
||||||
|
# okay, we have the previous billing year, and we wanted one for a year in the future,
|
||||||
|
# just return the last one in this year as its the most recent
|
||||||
|
if wanted_year > yr:
|
||||||
|
# print("should be return last of {yr} - date={bill_info[bill_type]['year'][yr][-1]['bill_date']}" )
|
||||||
|
return bill_info[bill_type]['year'][yr][-1]
|
||||||
|
else:
|
||||||
|
# lets go through the newest to oldest of these bills
|
||||||
|
for bill in bill_info[bill_type]['year'][wanted_year][::-1]:
|
||||||
|
bill_mm = int(bill['bill_date'][5:7])
|
||||||
|
# reversing the bills, means we start with the 'most recent' in this year to the oldest
|
||||||
|
# if the month we want is after the bill, we are done
|
||||||
|
if wanted_mm > bill_mm:
|
||||||
|
return bill
|
||||||
|
|
||||||
|
# print(f"{bill_type}: find_previous_bill - failed. Seems our first bill = {bill_info[bill_type]['first_bill']['bill_date']} is in same year, but after wanted month={wanted_mm}, so no base to rely on" )
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# missing annual bill, find date based on MM-DD and add new year - given we start with first_bill anyway, will only be used for future bill predictions
|
# missing annual bill, find date based on MM-DD and add new year - given we start with first_bill anyway, will only be used for future bill predictions
|
||||||
# future only, so add ann_growth (based on drop-down) for each future year
|
# future only, so add ann_growth (based on drop-down) for each future year
|
||||||
# NOTE: only ever called when there is a need to add a new bill
|
# NOTE: only ever called when there is a need to add a new bill
|
||||||
@@ -37,11 +75,6 @@ def add_missing_monthly_bills_in_yr( bill_type, bill_info, yr ):
|
|||||||
mm = bill_info[bill_type]['first_bill']['bill_date'][5:7]
|
mm = bill_info[bill_type]['first_bill']['bill_date'][5:7]
|
||||||
lb_mm = bill_info[bill_type]['last_bill']['bill_date'][5:7]
|
lb_mm = bill_info[bill_type]['last_bill']['bill_date'][5:7]
|
||||||
|
|
||||||
# choose last bill from last amount to grow from as its most relevant
|
|
||||||
if not 'last_bill_amount' in bill_info[bill_type]:
|
|
||||||
bill_info[bill_type]['last_bill_amount']=bill_info[bill_type]['last_bill']['amount']
|
|
||||||
amt = bill_info[bill_type]['last_bill_amount']
|
|
||||||
|
|
||||||
#okay add monthly bills for the rest of this year if its the first year
|
#okay add monthly bills for the rest of this year if its the first year
|
||||||
if bill_info[bill_type]['first_bill_year'] == yr:
|
if bill_info[bill_type]['first_bill_year'] == yr:
|
||||||
start_m=int(mm)
|
start_m=int(mm)
|
||||||
@@ -61,6 +94,12 @@ def add_missing_monthly_bills_in_yr( bill_type, bill_info, yr ):
|
|||||||
bill_found=True
|
bill_found=True
|
||||||
break
|
break
|
||||||
if not bill_found:
|
if not bill_found:
|
||||||
|
pb=find_previous_bill( bill_type, bill_info, new_date )
|
||||||
|
if not pb:
|
||||||
|
print("Failed to find previous_bill, can't calculate missing bill - returning" )
|
||||||
|
return
|
||||||
|
|
||||||
|
amt = pb['amount']
|
||||||
# if this month is the same as the last bill month and as per above
|
# if this month is the same as the last bill month and as per above
|
||||||
# we don't have a bill for this date, then add annual grotwh
|
# we don't have a bill for this date, then add annual grotwh
|
||||||
if i == int(lb_mm):
|
if i == int(lb_mm):
|
||||||
@@ -69,6 +108,15 @@ def add_missing_monthly_bills_in_yr( bill_type, bill_info, yr ):
|
|||||||
bill_info[bill_type]['last_bill_amount']=amt
|
bill_info[bill_type]['last_bill_amount']=amt
|
||||||
# last param is estimated (and this is an estimate for a future bill / not real)
|
# last param is estimated (and this is an estimate for a future bill / not real)
|
||||||
new_bill( bill_type, amt, new_date, 1 )
|
new_bill( bill_type, amt, new_date, 1 )
|
||||||
|
if not yr in bill_info[bill_type]['year']:
|
||||||
|
bill_info[bill_type]['year'][yr]=[]
|
||||||
|
bill={}
|
||||||
|
bill['bill_date']=new_date
|
||||||
|
bill['amount']=amt
|
||||||
|
bill['estimated']=1
|
||||||
|
# need this for find_previous_bill to work but only need the above 2 fields?
|
||||||
|
bill_info[bill_type]['year'][yr].append(bill)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
# given the bill_type has a which_growth contain min/avg/max, return the corresponding growth number
|
# given the bill_type has a which_growth contain min/avg/max, return the corresponding growth number
|
||||||
|
|||||||
Reference in New Issue
Block a user