Finished with new calcs for remunerations
[auf_rh_dae.git] / project / rh / models.py
index 8f3b423..7a80262 100644 (file)
@@ -1294,38 +1294,55 @@ class Remuneration_(RemunerationMixin, DevisableMixin):
     """
     objects = RemunerationManager()
 
+    @staticmethod
+    def find_yearly_range(from_date, to_date, year):
+        today = date.today()
+        year = year or date.today().year
+        year_start = date(year, 1, 1)
+        year_end = date(year, 12, 31)
+
+        def constrain_to_year(*dates):
+            """
+            S'assure que les dates soient dans le range year_start a
+            year_end
+            """
+            return [min(max(year_start, d), year_end)
+                    for d in dates]
+
+        start_date = max(
+                from_date or year_start, year_start)
+        end_date = min(
+                to_date or year_end, year_end)
+        
+        start_date, end_date = constrain_to_year(start_date, end_date)
+
+        jours_annee = (year_end - year_start).days
+        jours_dates = (end_date - start_date).days
+        factor = Decimal(str(jours_dates)) / Decimal(str(jours_annee))
+        
+        return start_date, end_date, factor
+        
+
     def montant_ajuste_euros(self, annee=None):
         """
         Le montant ajusté représente le montant annuel, ajusté sur la
         période de temps travaillée, multipliée par le ratio de temps
         travaillé (en rapport au temps plein).
         """
-        if not annee:
-            annee = min(
-                self.date_debut or date.today(), date.today()).year
-
-        debut_annee = date(annee, 1, 1)
-        fin_annee = date(annee, 12, 31)
-        jours_annee = (fin_annee - debut_annee).days + 1
-
-        date_count_debut = max(
-            self.date_debut or debut_annee, debut_annee)
-        date_count_fin = min(self.date_fin or fin_annee, fin_annee)
-        jours = (date_count_fin - date_count_debut).days + 1
-        print "Date debut: ", date_count_debut
-        print "Date fin: ", date_count_fin
-        print "Jours: ", jours
-
-        montant_euro = Decimal(str(self.montant_euros_float()))
+        date_debut, date_fin, factor = self.find_yearly_range(
+            self.date_debut,
+            self.date_fin,
+            annee,
+            )
+
+        montant_euros = Decimal(str(self.montant_euros_float()) or '0')
+        
         if self.type.nature_remuneration != u'Accessoire':
-            return (montant_euro * ((
-                        min(self.date_fin or fin_annee, fin_annee) -
-                        max(self.date_debut or debut_annee, debut_annee)
-                    ).days + 1) / jours_annee * self.dossier.regime_travail / 100)
+            return (montant_euros * factor *
+                    self.dossier.regime_travail / 100)
         else:
-            return montant_euro
-
-
+            return montant_euros
+        
     def montant_mois(self):
         return round(self.montant / 12, 2)
 
@@ -1470,11 +1487,11 @@ TYPE_PAIEMENT_CHOICES = (
 )
 
 NATURE_REMUNERATION_CHOICES = (
-    (u'Accessoire', u'Accessoire'),
-    (u'Charges', u'Charges patronales'),
+    (u'Traitement', u'Traitement'),
     (u'Indemnité', u'Indemnité autre'),
+    (u'Charges', u'Charges patronales'),
+    (u'Accessoire', u'Accessoire'),
     (u'RAS', u'Rémunération autre source'),
-    (u'Traitement', u'Traitement'),
 )