a quick hack to display total payments per milestone
[utils.git] / src / budget_sync / budget_graph.py
index d67f2f9f706f0a614a67c42ae1a02498bd7b0f82..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,11 +590,13 @@ class BudgetGraph:
                 payment.payee
                 previous_payment = payee_payments.get(payment.payee)
                 if previous_payment is not None:
-                    errors.append(BudgetGraphDuplicatePayeesForTask(
-                        node.bug.id, root.bug.id,
-                        previous_payment.payee_key, payment.payee_key
-                    ))
-                payee_payments[payment.payee] = payment
+                    # NOT AN ERROR
+                    print ("NOT AN ERROR", BudgetGraphDuplicatePayeesForTask(
+                           node.bug.id, root.bug.id,
+                           previous_payment[-1].payee_key, payment.payee_key))
+                    payee_payments[payment.payee].append(payment)
+                else:
+                    payee_payments[payment.payee] = [payment]
             except BudgetGraphBaseError as e:
                 errors.append(e)
 
@@ -735,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):