From da58e28e46fc2556aa363633527f16a3d5075e7a Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Fri, 21 Aug 2015 19:30:48 +0200
Subject: [PATCH] New API for referentials

---
 src/cutecoin/core/account.py                | 110 ++------------------
 src/cutecoin/core/money/__init__.py         |  12 +++
 src/cutecoin/core/money/quant_zerosum.py    |  50 +++++++++
 src/cutecoin/core/money/quantitative.py     |  44 ++++++++
 src/cutecoin/core/money/relative.py         |  58 +++++++++++
 src/cutecoin/core/money/relative_zerosum.py |  52 +++++++++
 src/cutecoin/gui/informations_tab.py        | 108 +++++--------------
 src/cutecoin/gui/mainwindow.py              |   6 +-
 src/cutecoin/gui/transactions_tab.py        |  18 ++--
 src/cutecoin/gui/wallets_tab.py             |  29 +-----
 src/cutecoin/models/txhistory.py            |  15 +--
 src/cutecoin/models/wallets.py              |  13 +--
 12 files changed, 269 insertions(+), 246 deletions(-)
 create mode 100644 src/cutecoin/core/money/__init__.py
 create mode 100644 src/cutecoin/core/money/quant_zerosum.py
 create mode 100644 src/cutecoin/core/money/quantitative.py
 create mode 100644 src/cutecoin/core/money/relative.py
 create mode 100644 src/cutecoin/core/money/relative_zerosum.py

diff --git a/src/cutecoin/core/account.py b/src/cutecoin/core/account.py
index 4efdaf9a..b26ad98b 100644
--- a/src/cutecoin/core/account.py
+++ b/src/cutecoin/core/account.py
@@ -12,9 +12,10 @@ import logging
 import time
 import asyncio
 
-from PyQt5.QtCore import QObject, pyqtSignal, QCoreApplication, QT_TRANSLATE_NOOP
+from PyQt5.QtCore import QObject, pyqtSignal, QCoreApplication
 from PyQt5.QtNetwork import QNetworkReply
 
+from . import money
 from .wallet import Wallet
 from .community import Community
 from .registry import LocalState
@@ -23,91 +24,12 @@ from ..core.net.api import bma as qtbma
 from ..core.net.api.bma import PROTOCOL_VERSION
 
 
-def quantitative(units, community):
-    """
-    Return quantitative value of units
-
-    :param int units:   Value
-    :param cutecoin.core.community.Community community: Community instance
-    :return: int
-    """
-    return int(units)
-
-
-def relative(units, community):
-    """
-    Return relaive value of units
-
-    :param int units:   Value
-    :param cutecoin.core.community.Community community: Community instance
-    :return: float
-    """
-    if community.dividend > 0:
-        return units / float(community.dividend)
-    else:
-        return 0
-
-
-def quantitative_zerosum(units, community):
-    """
-    Return quantitative value of units minus the average value
-
-    :param int units:   Value
-    :param cutecoin.core.community.Community community: Community instance
-    :return: int
-    """
-    ud_block = community.get_ud_block()
-    if ud_block and ud_block['membersCount'] > 0:
-        average = community.monetary_mass / ud_block['membersCount']
-    else:
-        average = 0
-    return units - average
-
-
-def relative_zerosum(units, community):
-    """
-    Return relative value of units minus the average value
-
-    :param int units:   Value
-    :param cutecoin.core.community.Community community: Community instance
-    :return: float
-    """
-    ud_block = community.get_ud_block()
-    if ud_block and ud_block['membersCount'] > 0:
-        median = community.monetary_mass / ud_block['membersCount']
-        relative_value = units / float(community.dividend)
-        relative_median = median / community.dividend
-    else:
-        relative_median = 0
-    return relative_value - relative_median
-
-
 class Account(QObject):
     """
     An account is specific to a key.
     Each account has only one key, and a key can
     be locally referenced by only one account.
     """
-    # referentials are defined here
-    # it is a list of tupple, each tupple contains :
-    # (
-    #   function used to calculate value,
-    #   format string to display value,
-    #   function used to calculate on differential value,
-    #   format string to display differential value,
-    #   translated name of referential,
-    #   type relative "r" or quantitative "q" to help choose precision on display
-    # )
-    referentials = (
-        (quantitative, '{0}', quantitative, '{0}', QT_TRANSLATE_NOOP('Account', 'Units'), 'q'),
-        (relative, QT_TRANSLATE_NOOP('Account', 'UD {0}'), relative, QT_TRANSLATE_NOOP('Account', 'UD {0}'),
-         QT_TRANSLATE_NOOP('Account', 'UD'), 'r'),
-        (quantitative_zerosum, QT_TRANSLATE_NOOP('Account', 'Q0 {0}'), quantitative, '{0}',
-         QT_TRANSLATE_NOOP('Account', 'Quant Z-sum'), 'q'),
-        (relative_zerosum, QT_TRANSLATE_NOOP('Account', 'R0 {0}'), relative, QT_TRANSLATE_NOOP('Account', 'UD {0}'),
-         QT_TRANSLATE_NOOP('Account', 'Relat Z-sum'), 'r')
-    )
-
     loading_progressed = pyqtSignal(int, int)
     loading_finished = pyqtSignal(list)
     inner_data_changed = pyqtSignal(str)
@@ -143,7 +65,7 @@ class Account(QObject):
         self.contacts = contacts
         self._refreshing = False
         self._identities_registry = identities_registry
-        self.referential = 0
+        self._current_ref = 0
 
     @classmethod
     def create(cls, name, identities_registry):
@@ -272,7 +194,7 @@ class Account(QObject):
                 w.refresh_transactions(community, received_list)
 
     def set_display_referential(self, index):
-        self.referential = index
+        self._current_ref = index
 
     def identity(self, community):
         """
@@ -287,28 +209,8 @@ class Account(QObject):
         return identity
 
     @property
-    def units_to_ref(self):
-        return Account.referentials[self.referential][0]
-
-    @property
-    def units_to_diff_ref(self):
-        return Account.referentials[self.referential][2]
-
-    def ref_name(self, currency):
-        text = QCoreApplication.translate('Account',
-                                          Account.referentials[self.referential][1])
-        return text.format(currency)
-
-    def diff_ref_name(self, currency):
-        text = QCoreApplication.translate('Account', Account.referentials[self.referential][3])
-        return text.format(currency)
-
-    def ref_type(self):
-        """
-        Return type of referential ('q' or 'r', for quantitative or relative)
-        :return: str
-        """
-        return Account.referentials[self.referential][5]
+    def current_ref(self):
+        return money.Referentials[self._current_ref]
 
     def set_walletpool_size(self, size, password):
         """
diff --git a/src/cutecoin/core/money/__init__.py b/src/cutecoin/core/money/__init__.py
new file mode 100644
index 00000000..7f550e49
--- /dev/null
+++ b/src/cutecoin/core/money/__init__.py
@@ -0,0 +1,12 @@
+from enum import Enum
+
+class RefType(Enum):
+    q = 0
+    r = 1
+
+from .quantitative import Quantitative
+from .relative import Relative
+from .quant_zerosum import QuantitativeZSum
+from .relative_zerosum import RelativeZSum
+
+Referentials = (Quantitative, Relative, QuantitativeZSum, RelativeZSum)
diff --git a/src/cutecoin/core/money/quant_zerosum.py b/src/cutecoin/core/money/quant_zerosum.py
new file mode 100644
index 00000000..e71f5e90
--- /dev/null
+++ b/src/cutecoin/core/money/quant_zerosum.py
@@ -0,0 +1,50 @@
+from PyQt5.QtCore import QCoreApplication, QT_TRANSLATE_NOOP
+from . import Quantitative
+
+
+class QuantitativeZSum:
+    _NAME_STR_ = QT_TRANSLATE_NOOP('QuantitativeZSum', 'Quant Z-sum')
+    _REF_STR_ = QT_TRANSLATE_NOOP('QuantitativeZSum', "{0} Q0 {1}")
+    _UNITS_STR_ = QT_TRANSLATE_NOOP('QuantitativeZSum', "Q0 {0}")
+
+    def __init__(self, amount, community, app):
+        self.amount = amount
+        self.community = community
+        self.app = app
+
+    @classmethod
+    def translated_name(cls):
+        return QCoreApplication.translate('QuantitativeZSum', QuantitativeZSum._NAME_STR_)
+
+    @classmethod
+    def units(cls, currency):
+        return QCoreApplication.translate("QuantitativeZSum", QuantitativeZSum._UNITS_STR_).format(currency)
+
+    @classmethod
+    def diff_units(cls, currency):
+        return QuantitativeZSum.units(currency)
+
+    def compute(self):
+        """
+        Return quantitative value of amount minus the average value
+
+        :param int amount:   Value
+        :param cutecoin.core.community.Community community: Community instance
+        :return: int
+        """
+        ud_block = self.community.get_ud_block()
+        if ud_block and ud_block['membersCount'] > 0:
+            average = self.community.monetary_mass / ud_block['membersCount']
+        else:
+            average = 0
+        return self.amount - average
+
+    def differential(self):
+        return Quantitative(self.amount, self.community, self.app).compute()
+
+    def localized(self, pretty_print=False):
+        value = self.compute()
+        return QCoreApplication.translate("Quantitative", Quantitative._REF_STR_).format(value, self.community.currency)
+
+    def diff_localized(self, pretty_print=False):
+        return Quantitative(self.amount, self.community, self.app).amount_to_str(pretty_print)
\ No newline at end of file
diff --git a/src/cutecoin/core/money/quantitative.py b/src/cutecoin/core/money/quantitative.py
new file mode 100644
index 00000000..c104b4ba
--- /dev/null
+++ b/src/cutecoin/core/money/quantitative.py
@@ -0,0 +1,44 @@
+from PyQt5.QtCore import QCoreApplication, QT_TRANSLATE_NOOP, QObject, QLocale
+
+
+class Quantitative(QObject):
+    _NAME_STR_ = QT_TRANSLATE_NOOP('Quantitative', 'Units')
+    _REF_STR_ = QT_TRANSLATE_NOOP('Quantitative', "{0} {1}")
+    _UNITS_STR_ = QT_TRANSLATE_NOOP('Quantitative', "{0}")
+
+    def __init__(self, amount, community, app):
+        self.amount = amount
+        self.community = community
+        self.app = app
+
+    @classmethod
+    def translated_name(cls):
+        return QCoreApplication.translate('Quantitative', 'UD')
+
+    @classmethod
+    def units(cls, currency):
+        return QCoreApplication.translate("Quantitative", Quantitative._UNITS_STR_).format(currency)
+
+    @classmethod
+    def diff_units(cls, currency):
+        return Quantitative.units(currency)
+
+    def compute(self):
+        """
+        Return quantitative value of amount
+
+        :param int amount:   Value
+        :param cutecoin.core.community.Community community: Community instance
+        :return: int
+        """
+        return int(self.amount)
+
+    def differential(self):
+        return self.compute()
+
+    def localized(self, pretty_print=False):
+        return QCoreApplication.translate("Quantitative", Quantitative._REF_STR_).format(self.amount, self.currency)
+
+    def diff_localized(self, pretty_print=False):
+        strvalue = QLocale().toString(float(self.amount), 'f', 0)
+        return QCoreApplication.translate("Quantitative", Quantitative._REF_STR_).format(strvalue, self.currency)
diff --git a/src/cutecoin/core/money/relative.py b/src/cutecoin/core/money/relative.py
new file mode 100644
index 00000000..1b184b17
--- /dev/null
+++ b/src/cutecoin/core/money/relative.py
@@ -0,0 +1,58 @@
+from PyQt5.QtCore import QObject, QCoreApplication, QT_TRANSLATE_NOOP, QLocale
+
+
+class Relative(QObject):
+    _NAME_STR_ = QT_TRANSLATE_NOOP('Relative', 'UD')
+    _REF_STR_ = QT_TRANSLATE_NOOP('Relative',  "{0} UD {1}")
+    _UNITS_STR_ = QT_TRANSLATE_NOOP('Relative',  "UD {0}")
+
+    def __init__(self, amount, community, app):
+        self.amount = amount
+        self.community = community
+        self.app = app
+
+    @classmethod
+    def translated_name(cls):
+        return QCoreApplication.translate('Relative', Relative._NAME_STR_)
+
+    @classmethod
+    def units(self, currency):
+        return QCoreApplication.translate("Relative", Relative._UNITS_STR_).format(currency)
+
+    @classmethod
+    def diff_units(self, currency):
+        return self.units(currency)
+
+    def compute(self):
+        """
+        Return relaive value of amount
+    type
+        :param int amount:   Value
+        :param cutecoin.core.community.Community community: Community instance
+        :return: float
+        """
+        if self.community.dividend > 0:
+            return self.amount / float(self.community.dividend)
+        else:
+            return 0
+
+    def differential(self):
+        return self.compute()
+
+    def localized(self, pretty_print=False):
+        value = self.compute()
+        if pretty_print:
+            pass
+        else:
+            strvalue = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma'])
+            return QCoreApplication.translate("Relative", Relative._REF_STR_).format(strvalue,
+                                                                                        self.community.currency)
+
+    def diff_localized(self, pretty_print=False):
+        value = self.differential()
+        if pretty_print:
+            pass
+        else:
+            strvalue = QLocale().toString(float(value), 'f', self.app.preferences['digits_after_comma'])
+            return QCoreApplication.translate("Relative", Relative._REF_STR_).format(strvalue,
+                                                                                        self.community.currency)
diff --git a/src/cutecoin/core/money/relative_zerosum.py b/src/cutecoin/core/money/relative_zerosum.py
new file mode 100644
index 00000000..7487ef54
--- /dev/null
+++ b/src/cutecoin/core/money/relative_zerosum.py
@@ -0,0 +1,52 @@
+from PyQt5.QtCore import QCoreApplication, QT_TRANSLATE_NOOP
+from . import relative
+
+
+class RelativeZSum:
+    _NAME_STR_ = QT_TRANSLATE_NOOP('RelativeZSum', 'Relat Z-sum')
+    _REF_STR_ = QT_TRANSLATE_NOOP('RelativeZSum', "{0} R0 {1}")
+    _UNITS_STR_ = QT_TRANSLATE_NOOP('RelativeZSum', "R0 {0}")
+
+    def __init__(self, amount, community, app):
+        self.amount = amount
+        self.community = community
+        self.app = app
+
+    @classmethod
+    def translated_name(cls):
+        return QCoreApplication.translate('RelativeZSum', RelativeZSum._NAME_STR_)
+
+    @classmethod
+    def units(cls, currency):
+        return QCoreApplication.translate("RelativeZSum", RelativeZSum._UNITS_STR_).format(currency)
+
+    @classmethod
+    def diff_units(cls, currency):
+        return RelativeZSum.units(currency)
+
+    def value(self):
+        """
+        Return relative value of amount minus the average value
+
+        :param int amount:   Value
+        :param cutecoin.core.community.Community community: Community instance
+        :return: float
+        """
+        ud_block = self.community.get_ud_block()
+        if ud_block and ud_block['membersCount'] > 0:
+            median = self.community.monetary_mass / ud_block['membersCount']
+            relative_value = self.amount / float(self.community.dividend)
+            relative_median = median / self.community.dividend
+        else:
+            relative_median = 0
+        return relative_value - relative_median
+
+    def differential(self):
+        return relative.compute(self.amount, self.community)
+
+    def localized(self, pretty_print=False):
+        value = self.compute(self.amount, self.community)
+        return QCoreApplication.translate("RelativeZSum", RelativeZSum._REF_STR_).format(value, self.community)
+
+    def diff_localized(self, pretty_print=False):
+        return relative.amount_to_str(self.amount, self.community, pretty_print)
\ No newline at end of file
diff --git a/src/cutecoin/gui/informations_tab.py b/src/cutecoin/gui/informations_tab.py
index a96464e3..5d494e1a 100644
--- a/src/cutecoin/gui/informations_tab.py
+++ b/src/cutecoin/gui/informations_tab.py
@@ -57,74 +57,30 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
             return False
 
         if block_ud:
-            ud = self.get_referential_diff_value(block_ud['dividend'])
-            # if referential type is quantitative...
-            if self.account.ref_type() == 'q':
-                # display int values
-                # use the float type of 64bits, to avoid display a 32bit signed integer...
-                localized_ud = QLocale().toString(float(ud), 'f', 0)
-                # display int values
-                localized_ud_plus_1 = QLocale().toString(
-                    float(
-                        self.get_referential_diff_value(
-                            self.community.computed_dividend
-                        )
-                    ),
-                    'f',
-                    0
-                )
-                localized_mass = QLocale().toString(
-                    float(self.get_referential_diff_value(block_ud['monetaryMass'])), 'f', 0
-                )
-                if block_ud_minus_1:
-                    localized_mass_minus_1_per_member = QLocale().toString(
-                        float(
-                            self.get_referential_diff_value(float(0) if block_ud['membersCount'] == 0 else
-                                block_ud_minus_1['monetaryMass'] / block_ud['membersCount']
-                            )
-                        ), 'f', 0
-                    )
-                    localized_mass_minus_1 = QLocale().toString(
-                        float(self.get_referential_diff_value(block_ud_minus_1['monetaryMass'])), 'f', 0
-                    )
-                else:
-                    localized_mass_minus_1_per_member = QLocale().toString(
-                        float(0), 'f', 0
-                    )
-                    localized_mass_minus_1 = QLocale().toString(
-                        float(0), 'f', 0
-                    )
+            # display float values
+            localized_ud = self.account.current_ref(block_ud['dividend'], self.community, self.app).diff_localized()
+
+            # display float values
+            localized_ud_plus_1 = self.account.current_ref(self.community.computed_dividend,
+                                                    self.community, self.app).diff_localized()
+
+            localized_mass = self.account.current_ref(block_ud['monetaryMass'],
+                                                    self.community, self.app)
+            if block_ud_minus_1:
+                mass_minus_1 = (float(0) if block_ud['membersCount'] == 0 else
+                        block_ud_minus_1['monetaryMass'] / block_ud['membersCount'])
+                localized_mass_minus_1_per_member = self.account.current_ref(mass_minus_1,
+                                                                  self.community, self.app).diff_localized()
+                localized_mass_minus_1 = self.account.current_ref(block_ud_minus_1['monetaryMass'],
+                                                                  self.community, self.app).diff_localized()
+
             else:
-                # display float values
-                localized_ud = QLocale().toString(float(ud), 'f', self.app.preferences['digits_after_comma'])
-                # display float values
-                localized_ud_plus_1 = QLocale().toString(
-                    float(
-                        self.get_referential_diff_value(
-                            self.community.computed_dividend
-                        )
-                    ),
-                    'f',
-                    self.app.preferences['digits_after_comma']
+                localized_mass_minus_1_per_member = QLocale().toString(
+                    float(0), 'f', self.app.preferences['digits_after_comma']
                 )
-                localized_mass = QLocale().toString(
-                    float(self.get_referential_diff_value(block_ud['monetaryMass'])), 'f', self.app.preferences['digits_after_comma']
+                localized_mass_minus_1 = QLocale().toString(
+                    float(0), 'f', self.app.preferences['digits_after_comma']
                 )
-                if block_ud_minus_1:
-                    localized_mass_minus_1_per_member = QLocale().toString(
-                        float(self.get_referential_diff_value(float(0) if block_ud['membersCount'] == 0 else
-                            block_ud_minus_1['monetaryMass'] / block_ud['membersCount'])), 'f', self.app.preferences['digits_after_comma']
-                    )
-                    localized_mass_minus_1 = QLocale().toString(
-                        float(self.get_referential_diff_value(block_ud_minus_1['monetaryMass'])), 'f', self.app.preferences['digits_after_comma']
-                    )
-                else:
-                    localized_mass_minus_1_per_member = QLocale().toString(
-                        float(0), 'f', self.app.preferences['digits_after_comma']
-                    )
-                    localized_mass_minus_1 = QLocale().toString(
-                        float(0), 'f', self.app.preferences['digits_after_comma']
-                    )
 
             # set infos in label
             self.label_general.setText(
@@ -141,15 +97,15 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
                 """).format(
                     localized_ud,
                     self.tr('Universal Dividend UD(t) in'),
-                    self.get_referential_diff_name(),
+                    self.account.current_ref.diff_units(self.community.currency),
                     localized_mass_minus_1,
                     self.tr('Monetary Mass M(t-1) in'),
-                    self.get_referential_diff_name(),
+                    self.account.current_ref.diff_units(self.community.currency),
                     block_ud['membersCount'],
                     self.tr('Members N(t)'),
                     localized_mass_minus_1_per_member,
                     self.tr('Monetary Mass per member M(t-1)/N(t) in'),
-                    self.get_referential_diff_name(),
+                    self.account.current_ref.diff_units(self.community.currency),
                     float(0) if block_ud['membersCount'] == 0 or block_ud_minus_1['monetaryMass'] == 0 else
                     block_ud['dividend'] / (block_ud_minus_1['monetaryMass'] / block_ud['membersCount']),
 
@@ -189,10 +145,10 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
                     self.tr('{:} = MAX {{ {:} {:} ; {:2.0%} &#215; {:} {:} / {:} }}').format(
                         localized_ud_plus_1,
                         localized_ud,
-                        self.get_referential_diff_name(),
+                        self.account.current_ref.diff_units(self.community.currency),
                         params['c'],
                         localized_mass,
-                        self.get_referential_diff_name(),
+                        self.account.current_ref.diff_units(self.community.currency),
                         block_ud['membersCount']
                     ),
                     self.tr('Universal Dividend (computed)')
@@ -262,15 +218,3 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
                 self.tr('Maximum distance between each WoT member and a newcomer'),
             )
         )
-
-    def get_referential_value(self, value):
-        return self.account.units_to_ref(value, self.community)
-
-    def get_referential_diff_value(self, value):
-        return self.account.units_to_diff_ref(value, self.community)
-
-    def get_referential_name(self):
-        return self.account.ref_name(self.community.short_currency)
-
-    def get_referential_diff_name(self):
-        return self.account.diff_ref_name(self.community.short_currency)
diff --git a/src/cutecoin/gui/mainwindow.py b/src/cutecoin/gui/mainwindow.py
index b685ad51..a893c9db 100644
--- a/src/cutecoin/gui/mainwindow.py
+++ b/src/cutecoin/gui/mainwindow.py
@@ -21,7 +21,7 @@ from .certification import CertificationDialog
 from .password_asker import PasswordAskerDialog
 from .preferences import PreferencesDialog
 from .homescreen import HomeScreenWidget
-from ..core.account import Account
+from ..core import money
 from ..__init__ import __version__
 from . import toast
 
@@ -301,8 +301,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
 
             self.combo_referential.blockSignals(True)
             self.combo_referential.clear()
-            for ref in self.app.current_account.referentials:
-                self.combo_referential.addItem(QCoreApplication.translate('Account', ref[4]))
+            for ref in money.Referentials:
+                self.combo_referential.addItem(ref.translated_name())
 
             self.combo_referential.setEnabled(True)
             self.combo_referential.blockSignals(False)
diff --git a/src/cutecoin/gui/transactions_tab.py b/src/cutecoin/gui/transactions_tab.py
index be4b11b4..2758daa9 100644
--- a/src/cutecoin/gui/transactions_tab.py
+++ b/src/cutecoin/gui/transactions_tab.py
@@ -101,7 +101,7 @@ class TransactionsTabWidget(QWidget, Ui_transactionsTabWidget):
 
     def refresh_balance(self):
         # if referential is "units"
-        if self.app.current_account.referential == 0:
+        if self.app.current_account._current_ref == 0:
             self.label_balance.show()
             self.label_deposit.show()
             self.label_payment.show()
@@ -112,25 +112,21 @@ class TransactionsTabWidget(QWidget, Ui_transactionsTabWidget):
 
         proxy = self.table_history.model()
         balance = proxy.deposits - proxy.payments
-        ref = self.app.current_account.units_to_diff_ref
-        deposits = ref(proxy.deposits, self.community)
-        localized_deposits = QLocale().toString(deposits)
-        localized_payments = QLocale().toString(
-            self.app.current_account.units_to_diff_ref(proxy.payments, self.community))
-        localized_balance = QLocale().toString(
-            self.app.current_account.units_to_diff_ref(balance, self.community))
+        localized_deposits = self.app.current_account.current_ref(proxy.deposits, self.community, self.app).diff_localized()
+        localized_payments = self.app.current_account.current_ref(proxy.payments, self.community, self.app).diff_localized()
+        localized_balance = self.app.current_account.current_ref(balance, self.community, self.app).diff_localized()
 
         self.label_deposit.setText(QCoreApplication.translate("TransactionsTabWidget", "<b>Deposits</b> {:} {:}").format(
             localized_deposits,
-            self.app.current_account.ref_name(self.community.short_currency)
+            self.app.current_account.current_ref.units(self.community.short_currency)
         ))
         self.label_payment.setText(QCoreApplication.translate("TransactionsTabWidget", "<b>Payments</b> {:} {:}").format(
             localized_payments,
-            self.app.current_account.ref_name(self.community.short_currency)
+            self.app.current_account.current_ref.units(self.community.short_currency)
         ))
         self.label_balance.setText(QCoreApplication.translate("TransactionsTabWidget", "<b>Balance</b> {:} {:}").format(
             localized_balance,
-            self.app.current_account.ref_name(self.community.short_currency)
+            self.app.current_account.current_ref.units(self.community.short_currency)
         ))
 
     def history_context_menu(self, point):
diff --git a/src/cutecoin/gui/wallets_tab.py b/src/cutecoin/gui/wallets_tab.py
index 881c18ee..77a12f9d 100644
--- a/src/cutecoin/gui/wallets_tab.py
+++ b/src/cutecoin/gui/wallets_tab.py
@@ -140,26 +140,17 @@ class WalletsTabWidget(QWidget, Ui_WalletsTab):
         amount = self.account.amount(self.community)
         maximum = self.community.monetary_mass
         # if referential type is quantitative...
-        if self.account.ref_type() == 'q':
             # display int values
-            localized_amount = QLocale().toString(float(self.get_referential_value(amount)), 'f', 0)
-            localized_minimum = QLocale().toString(float(self.get_referential_value(0)), 'f', 0)
-            localized_maximum = QLocale().toString(float(self.get_referential_value(maximum)), 'f', 0)
-        else:
-            # display float values
-            localized_amount = QLocale().toString(float(self.get_referential_value(amount)), 'f',
-                                                  self.app.preferences['digits_after_comma'])
-            localized_minimum = QLocale().toString(float(self.get_referential_value(0)), 'f',
-                                                   self.app.preferences['digits_after_comma'])
-            localized_maximum = QLocale().toString(float(self.get_referential_value(maximum)), 'f',
-                                                   self.app.preferences['digits_after_comma'])
+        localized_amount = self.account.current_ref(amount, self.community, self.app).localized()
+        localized_minimum = self.account.current_ref(maximum, self.community, self.app).localized()
+        localized_maximum = self.account.current_ref(0, self.community, self.app).localized()
 
         # set infos in label
         self.label_balance.setText(
             self.tr("{:} {:}")
             .format(
                 localized_amount,
-                self.get_referential_name()
+                self.account.current_ref.units(self.community.currency)
             )
         )
         self.label_balance_range.setText(
@@ -167,20 +158,10 @@ class WalletsTabWidget(QWidget, Ui_WalletsTab):
             .format(
                 localized_minimum,
                 localized_maximum,
-                self.get_referential_name()
+                self.account.current_ref.units(self.community.currency)
             )
         )
 
-
-    def get_referential_value(self, value):
-        return self.account.units_to_ref(value, self.community)
-
-    def get_referential_diff_value(self, value):
-        return self.account.units_to_diff_ref(value, self.community)
-
-    def get_referential_name(self):
-        return self.account.ref_name(self.community.short_currency)
-
     def wallet_context_menu(self, point):
         index = self.table_wallets.indexAt(point)
         model = self.table_wallets.model()
diff --git a/src/cutecoin/models/txhistory.py b/src/cutecoin/models/txhistory.py
index 6b07f369..e6b954b9 100644
--- a/src/cutecoin/models/txhistory.py
+++ b/src/cutecoin/models/txhistory.py
@@ -6,6 +6,7 @@ Created on 5 févr. 2014
 
 import datetime
 import logging
+from ..core import money
 from ..core.transfer import Transfer
 from PyQt5.QtCore import QAbstractTableModel, Qt, QVariant, QSortFilterProxyModel, \
     QDateTime, QLocale, QModelIndex
@@ -111,15 +112,7 @@ class TxFilterProxyModel(QSortFilterProxyModel):
             if source_index.column() == model.columns_types.index('payment') or \
                     source_index.column() == model.columns_types.index('deposit'):
                 if source_data is not "":
-                    amount_ref = self.account.units_to_diff_ref(source_data,
-                                                                self.community)
-                    # if referential type is quantitative...
-                    if self.account.ref_type() == 'q':
-                        # display int values
-                        return QLocale().toString(float(amount_ref), 'f', 0)
-                    else:
-                        # display float values
-                        return QLocale().toString(float(amount_ref), 'f', self.app.preferences['digits_after_comma'])
+                    return self.account.current_ref(source_data, self.community, self.app).diff_localized()
 
         if role == Qt.FontRole:
             font = QFont()
@@ -172,7 +165,7 @@ class HistoryTableModel(QAbstractTableModel):
         super().__init__(parent)
         self.app = app
         self.community = community
-        self.account.referential
+        self.account._current_ref
         self.transfers_data = []
         self.refresh_transfers()
 
@@ -278,7 +271,7 @@ class HistoryTableModel(QAbstractTableModel):
             if self.columns_types[section] == 'payment' or self.columns_types[section] == 'deposit':
                 return '{:}\n({:})'.format(
                     self.column_headers[section],
-                    self.account.diff_ref_name(self.community.short_currency)
+                    self.account.current_ref.diff_units(self.community.short_currency)
                 )
 
             return self.column_headers[section]
diff --git a/src/cutecoin/models/wallets.py b/src/cutecoin/models/wallets.py
index f94ffedb..48a939a1 100644
--- a/src/cutecoin/models/wallets.py
+++ b/src/cutecoin/models/wallets.py
@@ -42,16 +42,7 @@ class WalletsFilterProxyModel(QSortFilterProxyModel):
                 source_data = pubkey
                 return source_data
             if source_index.column() == self.sourceModel().columns_types.index('amount'):
-                amount_ref = self.account.units_to_ref(source_data, self.community)
-                # if referential type is quantitative...
-                if self.account.ref_type() == 'q':
-                    # display int values
-                    return QLocale().toString(float(amount_ref), 'f', 0)
-                else:
-                    # display float values
-                    return QLocale().toString(float(amount_ref), 'f',
-                                              self.app.preferences['digits_after_comma'])
-
+                return self.account.current_ref(source_data, self.community, self.app).localized()
         if role == Qt.TextAlignmentRole:
             if source_index.column() == self.sourceModel().columns_types.index('amount'):
                 return Qt.AlignRight | Qt.AlignVCenter
@@ -121,7 +112,7 @@ class WalletsTableModel(QAbstractTableModel):
             if self.columns_types[section] == 'amount':
                 return '{:}\n({:})'.format(
                     self.columns_headers[section],
-                    self.account.ref_name(self.community.short_currency)
+                    self.account.current_ref.units(self.community.short_currency)
                 )
             return self.columns_headers[section]
 
-- 
GitLab