#2785 devisable mixin
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Wed, 14 Mar 2012 15:28:26 +0000 (11:28 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Wed, 14 Mar 2012 15:28:26 +0000 (11:28 -0400)
project/dae/models.py
project/dae/templates/dae/embauche-remun-consulter.html
project/dae/templates/dae/embauche-remun.html
project/dae/templates/dae/embauche_consulter.html
project/dae/templates/dae/poste_resume.html
project/dae/views.py
project/rh/lib.py
project/rh/models.py

index a260556..74b7c59 100644 (file)
@@ -533,7 +533,7 @@ class Dossier(DossierWorkflow, rh.Dossier_):
     def get_total_charges_salariales(self):
         total = 0.0
         for r in self.get_charges_salariales():
-            total += r.montant_euro()
+            total += r.montant_euros()
         return total
 
     def get_charges_patronales(self):
@@ -546,7 +546,7 @@ class Dossier(DossierWorkflow, rh.Dossier_):
     def get_total_charges_patronales(self):
         total = 0.0
         for r in self.get_charges_patronales():
-            total += r.montant_euro()
+            total += r.montant_euros()
         return total
 
     def get_salaire_brut(self):
@@ -555,7 +555,7 @@ class Dossier(DossierWorkflow, rh.Dossier_):
         """
         total = 0.0
         for r in self.get_remunerations_brutes():
-            total += r.montant_euro()
+            total += r.montant_euros()
         return total
 
     def get_salaire_net(self):
@@ -564,7 +564,7 @@ class Dossier(DossierWorkflow, rh.Dossier_):
         """
         total_charges = 0.0
         for r in self.get_charges_salariales():
-            total_charges += r.montant_euro()
+            total_charges += r.montant_euros()
         return self.get_salaire_brut() - total_charges
 
     def get_couts_auf(self):
@@ -573,7 +573,7 @@ class Dossier(DossierWorkflow, rh.Dossier_):
         """
         total_charges = 0.0
         for r in self.get_charges_patronales():
-            total_charges += r.montant_euro()
+            total_charges += r.montant_euros()
         return self.get_salaire_net() + total_charges
 
     def get_remunerations_tierces(self):
@@ -585,7 +585,7 @@ class Dossier(DossierWorkflow, rh.Dossier_):
     def get_total_remunerations_tierces(self):
         total = 0.0
         for r in self.get_remunerations_tierces():
-            total += r.montant_euro()
+            total += r.montant_euros()
         return total
 
     def valide(self):
index 8711e83..ac1d120 100644 (file)
@@ -20,7 +20,7 @@
     <td class="montant">{{ remun.montant_mois|floatformat:0 }} {{ remun.devise.code }}</td>
     <td class="montant">{{ remun.montant|floatformat:0 }} {{ remun.devise.code }}</td>
     <td class="montant">{{ remun.montant_euro_mois|floatformat:0 }}€</td>
-    <td class="montant">{{ remun.montant_euro|floatformat:0 }}€</td>
+    <td class="montant">{{ remun.montant_euros }}€</td>
     <td>{{ remun.precision }}</td>
   </tr>
 {% endfor %}
@@ -38,7 +38,7 @@
     <td class="montant">{{ remun.montant_mois|floatformat:0 }} {{ remun.devise.code }}</td>
     <td class="montant">{{ remun.montant|floatformat:0 }} {{ remun.devise.code }}</td>
     <td class="montant">{{ remun.montant_euro_mois|floatformat:0 }}€</td>
-    <td class="montant">{{ remun.montant_euro|floatformat:0 }}€</td>
+    <td class="montant">{{ remun.montant_euros }}€</td>
     <td>{{ remun.precision }}</td>
   </tr>
 {% endfor %}
@@ -61,7 +61,7 @@
     <td class="montant">{{ remun.montant_mois|floatformat:0 }} {{ remun.devise.code }}</td>
     <td class="montant">{{ remun.montant|floatformat:0 }} {{ remun.devise.code }}</td>
     <td class="montant">{{ remun.montant_euro_mois|floatformat:0 }}€</td>
-    <td class="montant">{{ remun.montant_euro|floatformat:0 }}€</td>
+    <td class="montant">{{ remun.montant_euros }}€</td>
     <td>{{ remun.precision }}</td>
   </tr>
 {% endfor %}
@@ -93,7 +93,7 @@
     <td class="montant">{{ remun.montant_mois|floatformat:0 }} {{ remun.devise.code }}</td>
     <td class="montant">{{ remun.montant|floatformat:0 }} {{ remun.devise.code }}</td>
     <td class="montant">{{ remun.montant_euro_mois|floatformat:0 }}€</td>
-    <td class="montant">{{ remun.montant_euro|floatformat:0 }}€</td>
+    <td class="montant">{{ remun.montant_euros }}€</td>
     <td>{{ remun.precision }}</td>
   </tr>
 {% endfor %}
index 6076b46..c509243 100644 (file)
@@ -64,7 +64,7 @@
     </td>
     <td id="montant_euro_mois-{{ remun.id }}" class="montant">
         {{ remun.montant_euro_mois }}</td>
-    <td id="montant_euro-{{ remun.id }}" class="montant cumulable">{{ remun.montant_euro }}</td>
+    <td id="montant_euro-{{ remun.id }}" class="montant cumulable">{{ remun.montant_euros }}</td>
     <td><input type="text" name="cg-precision-{{ remun.id }}" 
                value="{{ remun.precision|default_if_none:'' }}" /></td>
   </tr>
     </td>
     <td id="montant_euro_mois-{{ remun.id }}" class="montant">
         {{ remun.montant_euro_mois }}</td>
-    <td id="montant_euro-{{ remun.id }}" class="montant cumulable">{{ remun.montant_euro }}</td>
+    <td id="montant_euro-{{ remun.id }}" class="montant cumulable">{{ remun.montant_euros }}</td>
     <td><input type="text" name="cg-precision-{{ remun.id }}" 
                value="{{ remun.precision|default_if_none:'' }}" /></td>
   </tr>
index 46e7b3c..3b8337e 100644 (file)
@@ -72,7 +72,7 @@
           <td>{{ dc.personne }}</td>
           <td>{{ dc.poste }}</td>
           <td>{{ dc.montant|floatformat:0 }} {{ dc.devise.code }}</td>
-          <td>{{ dc.montant_euros|floatformat:0 }} EUR</td>
+          <td>{{ dc.montant_euros }} EUR</td>
       </tr>
       {% endfor %}
   </tbody>
index bd479c8..f921933 100644 (file)
         <td>{{ poste_connexe.nom }}</td>
         <td>{{ poste_connexe.implantation }}</td>
         <td>{{ poste_connexe.montant|floatformat:0 }} {{ poste_connexe.devise.code }}</td>
-        <td>{{ poste_connexe.montant_euros|floatformat:0 }} €</td>
+        <td>{{ poste_connexe.montant_euros }} €</td>
     </tr>
     {% endfor %}
     </tbody>
index 4d06290..49f7f5e 100644 (file)
@@ -634,7 +634,7 @@ def dossier_resume(request, dossier_id=None):
         data['montant'] = None
     if salaire is not None and salaire.devise is not None:
         data['devise'] = salaire.devise.id
-        data['montant_euros'] = salaire.montant_euro()
+        data['montant_euros'] = salaire.montant_euros()
     else:
         data['devise'] = None
         data['montant_euros'] = 0
@@ -659,7 +659,7 @@ def poste_resume(request, dossier_id=None):
     if salaire is not None:
         data['devise'] = salaire.devise.id
         data['montant'] = float(salaire.montant)
-        data['montant_euros'] = salaire.montant_euro()
+        data['montant_euros'] = salaire.montant_euros()
     else:
         data['devise'] = None
         data['montant'] = ""
index b5203c2..ebc0d2b 100644 (file)
@@ -15,9 +15,9 @@ def calc_remun(dossier):
         for r in remunnow:
             nature = r.type.nature_remuneration
             sums[nature] += r.montant
-            sums_euro[nature] += r.montant_euro()
+            sums_euro[nature] += r.montant_euros()
             remun_sum += r.montant
-            remun_sum_euro += r.montant_euro()
+            remun_sum_euro += r.montant_euros()
 
         remun = {}
         sums = dict(sums)
index 33b6b61..b1d1380 100644 (file)
@@ -50,6 +50,40 @@ def contrat_dispatch(instance, filename):
     return path
 
 
+class DevisableMixin(object):
+
+    def get_annee_pour_taux_devise(self):
+        raise NotImplementedError
+
+    def taux_devise(self):
+        if self.devise is None:
+            return None
+        if self.devise.code == "EUR":
+            return 1
+
+        annee = self.get_annee_pour_taux_devise()
+        taux = [tc.taux for tc in TauxChange.objects.filter(devise=self.devise, annee=annee)]
+        taux = set(taux)
+
+        if len(taux) == 0:
+            raise Exception(u"Pas de taux pour %s en %s" % (self.devise.code, annee))
+            
+        if len(taux) > 1:
+            raise Exception(u"Il existe plusieurs taux de %s en %s" %
+                    (self.devise.code, annee))
+        else:
+            return list(taux)[0]
+
+    def montant_euros(self):
+        try:
+            taux = self.taux_devise()
+        except Exception, e:
+            return e
+        if not taux:
+            return None
+        return int(round(float(self.montant) * float(taux), 2))
+
+
 class Commentaire(AUFMetadata):
     texte = models.TextField()
     owner = models.ForeignKey('auth.User', db_column='owner', related_name='+', verbose_name=u"Commentaire de")
@@ -278,7 +312,7 @@ class PostePiece_(models.Model):
 class PostePiece(PostePiece_):
     pass
 
-class PosteComparaison_(AUFMetadata):
+class PosteComparaison_(AUFMetadata, DevisableMixin):
     """
     De la même manière qu'un dossier, un poste peut-être comparé à un autre poste.
     """
@@ -293,24 +327,9 @@ class PosteComparaison_(AUFMetadata):
     class Meta:
         abstract = True
 
-    def taux_devise(self):
-        if self.devise is None:
-            return None
-        if self.devise.code == "EUR":
-            return 1
-        annee = self.poste.date_debut.year
-        taux = [tc.taux for tc in TauxChange.objects.filter(devise=self.devise, annee=annee)]
-        taux = set(taux)
-        if len(taux) != 1:
-            raise Exception(u"Le taux de la devise %s n'a pas n'existe pas pour %s ou il existe plusieurs taux pour la même année" % (self.devise.id, annee))
-        else:
-            return list(taux)[0]
 
-    def montant_euros(self):
-        taux = self.taux_devise()
-        if not taux:
-            return None
-        return round(float(self.montant) * float(taux), 2)
+    def get_annee_pour_taux_devise(self):
+        return self.poste.date_debut.year
 
     def __unicode__(self):
         return self.nom
@@ -686,7 +705,7 @@ class DossierCommentaire_(Commentaire):
 class DossierCommentaire(DossierCommentaire_):
     pass
 
-class DossierComparaison_(models.Model):
+class DossierComparaison_(models.Model, DevisableMixin):
     """
     Photo d'une comparaison salariale au moment de l'embauche.
     """
@@ -702,22 +721,9 @@ class DossierComparaison_(models.Model):
     class Meta:
         abstract = True
 
-    def taux_devise(self):
-        if self.devise is None:
-            return None
-        annee = self.dossier.contrat_date_debut.year
-        taux = [tc.taux for tc in TauxChange.objects.filter(devise=self.devise, annee=annee)]
-        taux = set(taux)
-        if len(taux) != 1:
-            raise Exception(u"Le taux de la devise %s n'a pas n'existe pas pour %s ou il existe plusieurs taux pour la même année" % (self.devise.id, annee))
-        else:
-            return list(taux)[0]
+    def get_annee_pour_taux_devise(self):
+        return self.dossier.contrat_date_debut.year
 
-    def montant_euros(self):
-        taux = self.taux_devise()
-        if not taux:
-            return None
-        return round(float(self.montant) * float(taux), 2)
 
 class DossierComparaison(DossierComparaison_):
     pass
@@ -754,7 +760,7 @@ class RemunerationMixin(AUFMetadata):
     def __unicode__(self):
         return u'%s %s (%s)' % (self.montant, self.devise.code, self.type.nom)
 
-class Remuneration_(RemunerationMixin):
+class Remuneration_(RemunerationMixin, DevisableMixin):
     """Structure de rémunération (données budgétaires) en situation normale
     pour un Dossier. Si un Evenement existe, utiliser la structure de
     rémunération EvenementRemuneration de cet événement.
@@ -766,10 +772,7 @@ class Remuneration_(RemunerationMixin):
     def montant_avec_regime(self):
         return round(self.montant * (self.dossier.regime_travail/100), 2)
 
-    def taux_devise(self):
-        if self.devise.code == "EUR":
-            return 1
-
+    def get_annee_pour_taux_devise(self):
         annee = datetime.datetime.now().year
         if self.dossier.poste.date_debut is not None:
             annee = self.dossier.poste.date_debut.year
@@ -777,19 +780,10 @@ class Remuneration_(RemunerationMixin):
             annee = self.dossier.date_debut.year
         if self.date_debut is not None:
             annee = self.date_debut.year
-
-        taux = [tc.taux for tc in TauxChange.objects.filter(devise=self.devise_id, annee=annee)]
-        taux = set(taux)
-        if len(taux) != 1:
-            raise Exception(u"Le taux de la devise %s n'a pas n'existe pas pour %s ou il existe plusieurs taux pour la même année %s (%s)" % (self.devise.code, annee, taux, self.dossier))
-        else:
-            return list(taux)[0]
-
-    def montant_euro(self):
-        return round(float(self.montant) * float(self.taux_devise()), 2)
+        return annee
 
     def montant_euro_mois(self):
-        return round(self.montant_euro() / 12, 2)
+        return round(self.montant_euros() / 12, 2)
 
     def __unicode__(self):
         try: