From 0cf3d9897fbd2d1ba22c4ae0241d7b75ebe2ba28 Mon Sep 17 00:00:00 2001 From: Damien De Paoli Date: Fri, 22 Aug 2025 13:24:25 +1000 Subject: [PATCH] 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 --- bills.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/bills.py b/bills.py index 9d7b650..0c5e226 100644 --- a/bills.py +++ b/bills.py @@ -6,6 +6,44 @@ def qtr(d): m = int(d[5:7]) 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 # 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 @@ -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] 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 if bill_info[bill_type]['first_bill_year'] == yr: start_m=int(mm) @@ -61,6 +94,12 @@ def add_missing_monthly_bills_in_yr( bill_type, bill_info, yr ): bill_found=True break 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 # we don't have a bill for this date, then add annual grotwh 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 # last param is estimated (and this is an estimate for a future bill / not real) 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 # given the bill_type has a which_growth contain min/avg/max, return the corresponding growth number