#2785 devisable mixin
[auf_rh_dae.git] / project / rh / models.py
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: