From: Christian Heller 
Date: Tue, 7 Nov 2023 04:24:24 +0000 (+0100)
Subject: Improve ledger.py.
X-Git-Url: https://plomlompom.com/repos/do_day?a=commitdiff_plain;h=c8e39d2444ae290dba713c542a5f95a47ab67ba9;p=misc
Improve ledger.py.
---
diff --git a/ledger.py b/ledger.py
index 2b2a807..02e0273 100755
--- a/ledger.py
+++ b/ledger.py
@@ -295,12 +295,16 @@ class Database:
             i += 1
             bak_as = f'{bak_prefix}{i}'
 
-        # collect what numbered .bak files to save
+        # collect what numbered .bak files to save:
+        # shrink datetime string right to left character by character,
+        # on each step add the oldest file whose mtime still fits the pattern
+        # (privilege older files to keep existing longer)
         to_save = []
         datetime_len = 19
         now = str(datetime.datetime.now())[:datetime_len]
         while datetime_len > 2:
-            for i, date in reversed(list(enumerate(backup_dates))):
+            # assume backup_dates starts with oldest dates
+            for i, date in enumerate(backup_dates):
                 if date[:datetime_len] == now:
                     if i not in to_save:
                         to_save += [i] 
@@ -310,7 +314,7 @@ class Database:
 
         # remove redundant backup files 
         j = 0
-        for i in reversed(to_save):
+        for i in to_save:
             if i != j:
                 source = f'{bak_prefix}{i}'
                 target = f'{bak_prefix}{j}'
@@ -322,7 +326,7 @@ class Database:
             except FileNotFoundError:
                 pass
 
-        # 
+        # put second backup copy of current state at end of bak list 
         shutil.copy(self.db_file, f'{bak_prefix}{j}')
         with open(self.db_file, mode) as f:
             f.write(text);
@@ -337,6 +341,14 @@ class Database:
         text = '\n\n' + '\n'.join(lines) + '\n\n'
         self.write_db(text, 'a')
 
+    def get_nth_for_booking_of_start_line(self, start_line):
+        nth = 0
+        for b in self.bookings:
+            if b.start_line == start_line:
+                break
+            nth += 1
+        return nth
+
     def add_taxes(self, lines, finish=False):
         ret = []
         bookings, _ = parse_lines(lines)
@@ -374,11 +386,11 @@ class Database:
                     last_monthbreak_est = b.account_changes[acc_est]['â¬']
                     last_monthbreak_kk_minimum = b.account_changes[acc_kk_minimum]['â¬']
                     last_monthbreak_assets = b.account_changes[acc_buffer]['â¬']
-        old_needed_income = last_monthbreak_assets + last_monthbreak_kk_add + last_monthbreak_kk_minimum + last_monthbreak_est
+        old_needed_income_before_anything = - last_monthbreak_assets - last_monthbreak_kk_add - last_monthbreak_kk_minimum - last_monthbreak_est
         if finish:
-            ret += [f'  {acc_est}  {-last_monthbreak_est}⬠; for old assumption of needed income: {old_needed_income}â¬']
+            ret += [f'  {acc_est}  {-last_monthbreak_est}⬠; for old assumption of needed income: {old_needed_income_before_anything}â¬']
         _, account_sums = bookings_to_account_tree(bookings)
-        expenses_so_far = -1 * account_sums[acc_assets]['â¬'] - old_needed_income
+        expenses_so_far = -1 * account_sums[acc_assets]['â¬'] + old_needed_income_before_anything
         needed_income_before_kk = expenses_so_far
         ESt_this_month = 0
         left_over = needed_income_before_kk - ESt_this_month
@@ -426,21 +438,33 @@ class Database:
         else:
             kk_factor = decimal.Decimal(0.197)
             kk_minimum_tax = decimal.Decimal(222.94).quantize(decimal.Decimal('0.00'))
-        kk_add = max(0, kk_factor * needed_income_before_kk - kk_minimum_tax)
+        kk_add_so_far = account_sums[acc_kk_add]['â¬'] if acc_kk_add in account_sums.keys() else 0
+        kk_add = needed_income_before_kk / (1 - kk_factor) - needed_income_before_kk - kk_minimum_tax
+        hit_kk_minimum_income_limit = False
+        if kk_add_so_far + kk_add < 0:
+            hit_kk_minimum_income_limit = True 
+            kk_add_uncorrect = kk_add
+            kk_add = -(kk_add + kk_add_so_far) 
         kk_add = decimal.Decimal(kk_add).quantize(decimal.Decimal('0.00'))
         if finish:
-            ret += [f'  {acc_kk_add}  {-last_monthbreak_kk_add}⬠ ; max(0, {kk_factor:.3f} * {-(old_needed_income - last_monthbreak_est):.2f}⬠- {kk_minimum_tax}â¬)']
+            ret += [f'  {acc_kk_add}  {-last_monthbreak_kk_add}⬠ ; for old assumption of needed income']
         else:
             ret += [f'  {acc_kk_minimum}  {kk_minimum_tax}⬠ ; assumed minimum income {kk_minimum_income:.2f}⬠* {kk_factor:.3f}']
-        ret += [f'  {acc_kk_add}  {kk_add}⬠ ; max(0, {kk_factor:.3f} * {needed_income_before_kk:.2f}⬠- {kk_minimum_tax}â¬)']
+        if hit_kk_minimum_income_limit:
+            ret += [f'  {acc_kk_add}  {kk_add}⬠ ; {needed_income_before_kk:.2f}⬠/ (1 - {kk_factor:.3f}) - {needed_income_before_kk:.2f}⬠- {kk_minimum_tax}⬠= {kk_add_uncorrect:.2f}⬠would reduce current {acc_kk_dd} ({kk_add_so_far:.2f}â¬) below 0']
+        else:
+            ret += [f'  {acc_kk_add}  {kk_add}⬠ ; {needed_income_before_kk:.2f}⬠/ (1 - {kk_factor:.3f}) - {needed_income_before_kk:.2f}⬠- {kk_minimum_tax}â¬']
         diff = - last_monthbreak_est + ESt_this_month - last_monthbreak_kk_add + kk_add
         if not finish:
             diff += kk_minimum_tax
-        final_minus = expenses_so_far + old_needed_income + diff
+        final_minus = expenses_so_far - old_needed_income_before_anything + diff
         ret += [f'  {acc_assets}  {-diff} â¬']
         ret += [f'  {acc_assets}  {final_minus} â¬']
         year_needed = buffer_expenses + final_minus + (12 - months_passed - 1) * final_minus 
-        ret += [f'  {acc_buffer}  {-final_minus} ⬠; assume as to earn in year: {acc_buffer} + {12 - months_passed - 1} * this = {-year_needed}']
+        if finish:
+            ret += [f'  {acc_buffer}  {-final_minus} â¬']
+        else:
+            ret += [f'  {acc_buffer}  {-final_minus} ⬠; assume as to earn in year: {acc_buffer} + {12 - months_passed - 1} * this = {year_needed}']
         return ret
 
 
@@ -482,6 +506,10 @@ input[type=number] { text-align: right; font-family: monospace; }
 {% endfor %}
 
 """)
+    add_form_header = """