@@ -38,6 +38,11 @@ def recursive_fill_tree(tree_item, raw_data):
3838 break
3939
4040
41+ # Accepted amount of difference when checking parent value against it's children
42+ relative_error = 0.008
43+ absolute_error = 10
44+
45+
4146def check_tree_data (tree_item ):
4247 """
4348 Check and complete data in the given tree_item
@@ -68,10 +73,6 @@ def check_tree_data(tree_item):
6873 for child_name in tree_item ["children" ]:
6974 check_tree_data (tree_item ["children" ][child_name ])
7075
71- # Accepted amount of difference when checking parent value against it's children
72- relative_error = 0.005
73- absolute_error = 10
74-
7576 # Compute ourself tree_item's value from its children
7677 computed_sum = 0 # Result from official children's value
7778 computed_sum_from_computed = 0 # Result from computed children's value
@@ -122,14 +123,15 @@ def check_tree_data(tree_item):
122123 child_data ["value" ] = 0
123124
124125 computed_sum = computed_sum_from_computed
125- # If there is only on value missing from children, set this child's value equal to the computed difference
126+ # If there is only one value missing from children, set this child's value equal to the computed difference
126127 elif child_missing_count == 1 :
127128 for child_name in tree_item ["children" ]:
128129 child_data = tree_item ["children" ][child_name ]["data" ]
129130 if math .isnan (child_data ["value" ]):
130- child_data ["computedValue" ] = (value - computed_sum ) / child ["sign" ]
131- child_data ["value" ] = child_data ["computedValue" ]
132- child_data ["status" ] = "computed"
131+ doubleCheckComputedValueWithChildren (
132+ tree_item ["children" ][child_name ],
133+ (value - computed_sum ) / child ["sign" ],
134+ )
133135 tree_item ["data" ]["status" ] = "checked"
134136 break
135137
@@ -139,6 +141,7 @@ def check_tree_data(tree_item):
139141 or abs (computed_sum_without_sign - value ) < absolute_error
140142 ):
141143 tree_item ["data" ]["status" ] = "checked"
144+ tree_item ["data" ]["computedValue" ] = computed_sum_without_sign
142145 # Fix children sign and/or set to zero missing values if any
143146 for child_name in tree_item ["children" ]:
144147 flip_sign (tree_item ["children" ][child_name ])
@@ -148,10 +151,42 @@ def check_tree_data(tree_item):
148151 else :
149152 tree_item ["data" ]["status" ] = "error"
150153
151- if computed_sum != tree_item ["data" ]["value" ]:
154+ if (
155+ computed_sum != tree_item ["data" ]["value" ]
156+ and "computedValue" not in tree_item ["data" ]
157+ ):
152158 tree_item ["data" ]["computedValue" ] = computed_sum_from_computed
153159
154160
161+ def computeChildrenSum (item ):
162+ computedSum = 0
163+ for childName in item ["children" ]:
164+ child = item ["children" ][childName ]
165+ if "value" in child ["data" ]:
166+ computedSum += child ["data" ]["value" ] * child ["sign" ]
167+ return computedSum
168+
169+
170+ def areOpposite (value , reference ):
171+ """
172+ Check if given value is equal to minus reference
173+ """
174+ result = value + reference
175+ if abs (result / reference ) < relative_error or abs (result ) < absolute_error :
176+ return True
177+ return False
178+
179+
180+ def doubleCheckComputedValueWithChildren (item , computedValue ):
181+ item ["data" ]["value" ] = computedValue
182+ item ["data" ]["status" ] = "computed"
183+ if "children" in item :
184+ computedSum = computeChildrenSum (item )
185+ if areOpposite (computedSum , item ["data" ]["value" ]):
186+ item ["data" ]["value" ] = - item ["data" ]["value" ]
187+ flip_sign (item )
188+
189+
155190def set_to_zero_computed (tree_item ):
156191 """
157192 set value of given item and it's children to zero when it hasn't another value
@@ -178,12 +213,23 @@ def flip_sign(item):
178213 if item ["sign" ] == - 1 :
179214 item ["data" ]["value" ] = - item ["data" ]["value" ]
180215 item ["data" ]["status" ] = "signFlipped"
216+ if "children" in item :
217+ computedSum = computeChildrenSum (item )
218+ if not areOpposite (computedSum , item ["data" ]["value" ]):
219+ return
220+ for child_name in item ["children" ]:
221+ child = item ["children" ][child_name ]
222+ child ["data" ]["value" ] = - child ["data" ]["value" ]
223+ child ["data" ]["status" ] = "signFlipped"
181224
182225
183226def gather_data_to_compute (tree , raw ):
184227 root = tree ["children" ]
185228 resultat_avant_impot = root ["ResultatAvantImpot" ]["children" ]
186229 result = {
230+ "benefice_attribue" : resultat_avant_impot ["BenefAttribueOuPerteTransferee" ][
231+ "data"
232+ ]["value" ],
187233 "participation" : root ["ParticipationSalariesAuxResultats" ]["data" ]["value" ],
188234 "impot" : root ["ImpotsSurLesBenefices" ]["data" ]["value" ],
189235 "resultat_exceptionnel" : root ["ResultatExceptionnel" ]["data" ]["value" ],
0 commit comments