a quick hack to display total payments per milestone
[utils.git] / src / budget_sync / budget_graph.py
index 3e417f360cfe2794cb9fc39efd1b6bcb572a5e81..5a9542b3edeb1d3b7026fa40075643a7609d9040 100644 (file)
@@ -9,7 +9,7 @@ import sys
 import enum
 from collections import deque
 from datetime import date, time, datetime
-
+from collections import OrderedDict
 
 class BudgetGraphBaseError(Exception):
     pass
@@ -296,7 +296,7 @@ class Node:
             new_err = BudgetGraphPayeesParseError(
                 self.bug.id, f"TOML parse error: {e}")
             raise new_err.with_traceback(sys.exc_info()[2])
-        retval = {}
+        retval = OrderedDict()
         for key, value in parsed.items():
             if not isinstance(key, str):
                 raise BudgetGraphPayeesParseError(
@@ -503,7 +503,7 @@ class BudgetGraph:
     nodes: Dict[int, Node]
 
     def __init__(self, bugs: Iterable[Bug], config: Config):
-        self.nodes = {}
+        self.nodes = OrderedDict()
         self.config = config
         for bug in bugs:
             self.nodes[bug.id] = Node(self, bug)
@@ -511,6 +511,7 @@ class BudgetGraph:
             if node.parent is None:
                 continue
             node.parent.immediate_children.add(node)
+        self.milestone_payments = OrderedDict()
         # useful debug prints
         #for bug in bugs:
         #    node = self.nodes[bug.id]
@@ -578,7 +579,7 @@ class BudgetGraph:
         #                        childlist)
 
         payees_total = Money(0)
-        payee_payments = {}
+        payee_payments = OrderedDict()
         for payment in node.payments.values():
             if payment.amount < 0:
                 errors.append(BudgetGraphNegativePayeeMoney(
@@ -589,12 +590,11 @@ class BudgetGraph:
                 payment.payee
                 previous_payment = payee_payments.get(payment.payee)
                 if previous_payment is not None:
-                    payee_payments[payment.payee].append(payment)
                     # NOT AN ERROR
                     print ("NOT AN ERROR", BudgetGraphDuplicatePayeesForTask(
                            node.bug.id, root.bug.id,
-                           previous_payment.payee_key, payment.payee_key
-                    ))
+                           previous_payment[-1].payee_key, payment.payee_key))
+                    payee_payments[payment.payee].append(payment)
                 else:
                     payee_payments[payment.payee] = [payment]
             except BudgetGraphBaseError as e:
@@ -738,16 +738,19 @@ class BudgetGraph:
 
     @cached_property
     def payments(self) -> Dict[Person, Dict[Milestone, List[Payment]]]:
-        retval = {}
+        retval = OrderedDict()
         for person in self.config.people.values():
-            milestone_payments = {}
+            milestone_payments = OrderedDict()
             for milestone in self.config.milestones.values():
-                milestone_payments[milestone] = []
+                milestone_payments[milestone] = []      # per-person payments
+                self.milestone_payments[milestone] = [] # global payments
             retval[person] = milestone_payments
         for node in self.nodes.values():
             if node.milestone is not None:
                 for payment in node.payments.values():
                     retval[payment.payee][node.milestone].append(payment)
+                    # add to global payments as well
+                    self.milestone_payments[node.milestone].append(payment)
         return retval
 
     def __repr__(self):