From 83030f6aea9c0f86bc82f0c9d1eb62f9b9a9aa59 Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Sat, 9 Jan 2016 18:02:17 +0100
Subject: [PATCH] Fix zsum computation ( #335 )

---
 src/sakia/core/money/quant_zerosum.py    | 14 +++++++-----
 src/sakia/core/money/quantitative.py     | 18 ++++++++++------
 src/sakia/core/money/relative.py         | 18 ++++++++++------
 src/sakia/core/money/relative_zerosum.py | 27 +++++++++++++++---------
 4 files changed, 49 insertions(+), 28 deletions(-)

diff --git a/src/sakia/core/money/quant_zerosum.py b/src/sakia/core/money/quant_zerosum.py
index 9bb7e211..a27bdbf9 100644
--- a/src/sakia/core/money/quant_zerosum.py
+++ b/src/sakia/core/money/quant_zerosum.py
@@ -33,13 +33,13 @@ class QuantitativeZSum:
         :param sakia.core.community.Community community: Community instance
         :return: int
         """
-        ud_block = yield from self.community.get_ud_block()
-        if ud_block and ud_block['membersCount'] > 0:
+        current = yield from self.community.get_block()
+        if current and current['membersCount'] > 0:
             monetary_mass = yield from self.community.monetary_mass()
-            average = monetary_mass / ud_block['membersCount']
+            average = monetary_mass / current['membersCount']
         else:
             average = 0
-        return self.amount - average
+        return self.amount - monetary_mass
 
     @asyncio.coroutine
     def differential(self):
@@ -50,7 +50,11 @@ class QuantitativeZSum:
     def localized(self, units=False, international_system=False):
         value = yield from self.value()
 
-        localized_value = QLocale().toString(float(value), 'f', 0)
+        prefix = ""
+        if international_system:
+            localized_value, prefix = Quantitative.to_si(value, self.app.preferences['digits_after_comma'])
+        else:
+            localized_value = QLocale().toString(float(value), 'f', 0)
 
         if units:
             return QCoreApplication.translate("QuantitativeZSum",
diff --git a/src/sakia/core/money/quantitative.py b/src/sakia/core/money/quantitative.py
index e0072fbf..4ac9024f 100644
--- a/src/sakia/core/money/quantitative.py
+++ b/src/sakia/core/money/quantitative.py
@@ -39,8 +39,15 @@ class Quantitative():
         value = yield from self.value()
         return value
 
-    def _to_si(self, value):
+    @staticmethod
+    def to_si(value, digits):
         prefixes = ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', 'z', 'y']
+        if value < 0:
+            value = -value
+            multiplier = -1
+        else:
+            multiplier = 1
+
         scientific_value = value
         prefix_index = 0
         prefix = ""
@@ -51,10 +58,9 @@ class Quantitative():
 
         if prefix_index < len(prefixes):
             prefix = prefixes[prefix_index]
-            localized_value = QLocale().toString(float(scientific_value), 'f',
-                                                 self.app.preferences['digits_after_comma'])
+            localized_value = QLocale().toString(float(scientific_value * multiplier), 'f', digits)
         else:
-            localized_value = QLocale().toString(float(value), 'f', 0)
+            localized_value = QLocale().toString(float(value * multiplier), 'f', 0)
 
         return localized_value, prefix
 
@@ -63,7 +69,7 @@ class Quantitative():
         value = yield from self.value()
         prefix = ""
         if international_system:
-            localized_value, prefix = self._to_si(value)
+            localized_value, prefix = Quantitative.to_si(value, self.app.preferences['digits_after_comma'])
         else:
             localized_value = QLocale().toString(float(value), 'f', 0)
 
@@ -81,7 +87,7 @@ class Quantitative():
         value = yield from self.differential()
         prefix = ""
         if international_system:
-            localized_value, prefix = self._to_si(value)
+            localized_value, prefix = Quantitative.to_si(value, self.app.preferences['digits_after_comma'])
         else:
             localized_value = QLocale().toString(float(value), 'f', 0)
 
diff --git a/src/sakia/core/money/relative.py b/src/sakia/core/money/relative.py
index 30d83ff4..171a09fe 100644
--- a/src/sakia/core/money/relative.py
+++ b/src/sakia/core/money/relative.py
@@ -42,8 +42,14 @@ class Relative():
         value = yield from self.value()
         return value
 
-    def _to_si(self, value):
+    @staticmethod
+    def to_si(value, digits):
         prefixes = ['', 'd', 'c', 'm', 'µ', 'n', 'p', 'f', 'a', 'z', 'y']
+        if value < 0:
+            value = -value
+            multiplier = -1
+        else:
+            multiplier = 1
         scientific_value = value
         prefix_index = 0
         prefix = ""
@@ -57,11 +63,9 @@ class Relative():
 
         if prefix_index < len(prefixes):
             prefix = prefixes[prefix_index]
-            localized_value = QLocale().toString(float(scientific_value), 'f',
-                                                 self.app.preferences['digits_after_comma'])
+            localized_value = QLocale().toString(float(scientific_value * multiplier), 'f', digits)
         else:
-            localized_value = QLocale().toString(float(value), 'f',
-                                                 self.app.preferences['digits_after_comma'])
+            localized_value = QLocale().toString(float(value * multiplier), 'f', digits)
 
         return localized_value, prefix
 
@@ -70,7 +74,7 @@ class Relative():
         value = yield from self.value()
         prefix = ""
         if international_system:
-            localized_value, prefix = self._to_si(value)
+            localized_value, prefix = Relative.to_si(value, self.app.preferences['digits_after_comma'])
         else:
             localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma'])
 
@@ -87,7 +91,7 @@ class Relative():
         value = yield from self.differential()
         prefix = ""
         if international_system and value != 0:
-            localized_value, prefix = self._to_si(value)
+            localized_value, prefix = Relative.to_si(value, self.app.preferences['digits_after_comma'])
         else:
             localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma'])
 
diff --git a/src/sakia/core/money/relative_zerosum.py b/src/sakia/core/money/relative_zerosum.py
index f32b5274..a98ae864 100644
--- a/src/sakia/core/money/relative_zerosum.py
+++ b/src/sakia/core/money/relative_zerosum.py
@@ -2,6 +2,7 @@ from PyQt5.QtCore import QCoreApplication, QT_TRANSLATE_NOOP, QLocale
 from .relative import Relative
 import asyncio
 
+
 class RelativeZSum:
     _NAME_STR_ = QT_TRANSLATE_NOOP('RelativeZSum', 'Relat Z-sum')
     _REF_STR_ = QT_TRANSLATE_NOOP('RelativeZSum', "{0} R0 {1}")
@@ -33,17 +34,15 @@ class RelativeZSum:
         :param sakia.core.community.Community community: Community instance
         :return: float
         """
-        ud_block = yield from self.community.get_ud_block()
-        if ud_block and ud_block['membersCount'] > 0:
+        current = yield from self.community.get_block()
+        if current and current['membersCount'] > 0:
             monetary_mass = yield from self.community.monetary_mass()
             dividend = yield from self.community.dividend()
-            median = monetary_mass / ud_block['membersCount']
-            relative_value = self.amount / float(dividend)
-            relative_median = median / dividend
+            average = monetary_mass / current['membersCount']
+            rz_value = (self.amount - average) / float(dividend)
         else:
-            relative_value = self.amount
-            relative_median = 0
-        return relative_value - relative_median
+            rz_value = self.amount
+        return rz_value
 
     @asyncio.coroutine
     def differential(self):
@@ -53,7 +52,11 @@ class RelativeZSum:
     def localized(self, units=False, international_system=False):
         value = yield from self.value()
 
-        localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma'])
+        prefix = ""
+        if international_system:
+            localized_value, prefix = Relative.to_si(value, self.app.preferences['digits_after_comma'])
+        else:
+            localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma'])
 
         if units:
             return QCoreApplication.translate("RelativeZSum", RelativeZSum._REF_STR_)\
@@ -65,7 +68,11 @@ class RelativeZSum:
     def diff_localized(self, units=False, international_system=False):
         value = yield from self.differential()
 
-        localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma'])
+        prefix = ""
+        if international_system and value != 0:
+            localized_value, prefix = Relative.to_si(value, self.app.preferences['digits_after_comma'])
+        else:
+            localized_value = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma'])
 
         if units:
             return QCoreApplication.translate("RelativeZSum", RelativeZSum._REF_STR_)\
-- 
GitLab