5834
authorBenoit C. Sirois <benoit.clennett-sirois@auf.org>
Mon, 25 Mar 2013 18:31:00 +0000 (14:31 -0400)
committerBenoit C. Sirois <benoit.clennett-sirois@auf.org>
Mon, 25 Mar 2013 18:31:00 +0000 (14:31 -0400)
project/dae/forms.py
project/dae/models.py
project/dae/templates/dae/embauche-dossier-consulter.html
project/dae/templates/dae/embauche_consulter.html
project/dae/templates/dae/poste_resume.html
project/dae/templatetags/dae.py
project/rh/models.py

index 8856a18..f27bf12 100644 (file)
@@ -600,7 +600,11 @@ DossierCompReadOnlyRemunFormSet = remun_formset_factory_factory(
     parent_model=dae.DossierComparaison,
     model=dae.DossierComparaisonRemuneration,
     )
-
+RHReadOnlyRemunFormSet = remun_formset_factory_factory(
+    read_only=True,
+    parent_model=rh.Dossier,
+    model=rh.Remuneration,
+    )
 
 class PosteForm(filtered_archived_fields_form_factory(
         'classement_min',
index 7a57911..0223445 100644 (file)
@@ -1,6 +1,7 @@
 # -=- encoding: utf-8 -=-
 
 import os
+from decimal import Decimal
 from dateutil.relativedelta import relativedelta
 from datetime import date, timedelta
 
@@ -78,6 +79,16 @@ class Poste(PosteWorkflow, rh.Poste_):
     # Managers
     objects = PosteManager()
 
+    @property
+    def indemn_min_cad(self):
+        return ((self.indemn_expat_min or Decimal('0')) +
+                (self.indemn_fct_min or Decimal('0')))
+
+    @property
+    def indemn_max_cad(self):
+        return ((self.indemn_expat_max or Decimal('0')) +
+                (self.indemn_fct_max or Decimal('0')))
+
     def _get_key(self):
         """
         Les vues sont montées selon une clef spéciale
@@ -729,6 +740,34 @@ class Dossier(DossierWorkflow, rh.Dossier_):
 
         return dossier_rh
 
+    def get_dossier_precedent_titulaire(self):
+        try:
+            rh_poste = self.poste.id_rh
+        except rh.Poste.DoesNotExist:
+            return None
+
+        try:
+            precedent_employe = self.employe_anterieur
+        except rh.Employe.DoesNotExist:
+            return None
+        
+        qs = rh.Dossier.objects.filter(
+            poste=rh_poste,
+            employe=precedent_employe,
+            ).order_by(
+            '-principal', 'date_fin')
+
+        if qs.count() == 0:
+            return None
+        
+        # Retourne en le premier du queryset si la date de fin est None
+        # Sinon, retourne le plus récent selon la date de fin.
+        first = qs[0]
+        if first.date_fin == None:
+            return first
+        else:
+            return qs.order_by('-principal', '-date_fin')[0]
+
     def get_salaire_anterieur_euros(self):
         if self.devise_anterieur is None:
             return None
index 9ae9a1d..2ec55f9 100644 (file)
@@ -1,3 +1,4 @@
+{% load dae %}
 <fieldset>
 <h2>Contrat</h2>
 <table>
 <h2>Classement et salaire de base</h2>
 
 <h3>Ancien dossier <span class="info">(le cas échéant)</span></h3>
-{% if dossier.salaire_anterieur != None %}
+{% with dossier.employe.id_rh.get_latest_dossier_ordered_by_date_fin_and_principal as ancien_dossier %}
+{% if ancien_dossier %}
 <table>
-    <tbody>
-    <tr>
-        <td colspan="7">
-            {{ dossier.employe }} <span class="info">{{ dossier.employe.id_rh.rh_dossiers.all.0.poste.type_poste.nom }} {{ dossier.employe.id_rh.dossier_set.all.0.complement1 }}</span>
-        </td>
-    </tr>
-    <tr>
-        <th>Classement antérieur</th>
-        <th>Salaire antérieur</th>
-        <th>Statut antérieur</th>
-        <th>Type contrat</th>
-    </tr>
-    <tr>
-        <td>{{ dossier.classement_anterieur|default:"" }}</td>
-        <td class="montant">{{ dossier.salaire_anterieur|floatformat:0 }}
-            {{ dossier.devise_anterieur.code }}
-            {% if dossier.devise_anterieur %}
-            ({{ dossier.get_salaire_anterieur_euros|floatformat:0 }}€)
-            {% endif %}
-        </td>
-        <td>{{ dossier.statut_anterieur|default:"" }}</td>
-        <td>{{ dossier.type_contrat_anterieur|default:"" }}</td>
-    </tr>
-    </tbody>
+  <tbody>
+      <tr>
+          <th>Classement</th>
+          <th>Statut</th>
+          <th>Implantation</th>
+          <th>Employé</th>
+          <th>Poste</th>
+          <th>Salaire</th>
+          <th>Salaire EUR</th>
+      </tr>
+      <tr class="gris-bkg">
+          <td>{{ ancien_dossier.classement|default:"" }}</td>
+          <td>{{ ancien_dossier.statut|default:"" }}</td>
+          <td>{{ ancien_dossier.poste.implantation }}</td>
+          <td>{{ dossier.employe }}</td>
+          <td>{{ ancien_dossier.poste.nom }}</td>
+         {% with ancien_dossier.get_salaire as salaire %} 
+         <td>{{ salaire }}</td>
+          <td>{{ salaire.montant_euros_float|floatformat:2 }} EUR</td>
+         {% endwith %}
+      </tr>
+      {% if ancien_dossier and ancien_dossier.remunerations.all.count > 0 %}
+      <tr>
+       <td colspan="1">
+         Rémunérations
+       </td>
+       <td colspan="6">
+         {% rh_remun_form_for_year ancien_dossier %}
+       </td>
+      </tr>
+      {% endif %}
+  </tbody>
 </table>
 {% else %}
     <p>Il n'y a pas d'ancien dossier pour cet employé</p>
 {% endif %}
+{% endwith %}
 
 <h3>Précédent titulaire <span class="info">(le cas échéant)</span></h3>
 {% if dossier.classement_titulaire_anterieur %}
+{% with dossier.get_dossier_precedent_titulaire as precedent_titulaire %}
 <table>
     <tbody>
     <tr>
-        <td colspan="3">
+        <td colspan="7">
             {{ dossier.employe_anterieur|default:"" }}
         </td>
     </tr>
     <tr>
-        <th>Classement du titulaire antérieur</th>
-        <th>Salaire du titulaire antérieur</th>
-        <th>Statut du titulaire antérieur</th>
+          <th>Classement</th>
+          <th>Statut</th>
+          <th>Implantation</th>
+          <th>Employé</th>
+          <th>Poste</th>
+          <th>Salaire</th>
+          <th>Salaire EUR</th>
+    </tr>
+    <tr>
+          <td>{{ precedent_titulaire.classement|default:"" }}</td>
+          <td>{{ precedent_titulaire.statut|default:"" }}</td>
+          <td>{{ precedent_titulaire.poste.implantation }}</td>
+          <td>{{ precedent_titulaire.employe }}</td>
+          <td>{{ precedent_titulaire.poste.nom }}</td>
+         {% with precedent_titulaire.get_salaire as salaire %} 
+         <td>{{ salaire }}</td>
+          <td>{{ salaire.montant_euros_float|floatformat:2 }} EUR</td>
+         {% endwith %}
     </tr>
+    {% if precedent_titulaire and precedent_titulaire.remunerations.all.count > 0 %}
     <tr>
-        <td>{{ dossier.classement_titulaire_anterieur|default:"" }}</td>
-        <td class="montant">{{ dossier.salaire_titulaire_anterieur|floatformat:0 }}
-            {% if dossier.devise_titulaire_anterieur %}
-            {{ dossier.devise_titulaire_anterieur.code }}
-            ({{ dossier.get_salaire_titulaire_anterieur_euros|floatformat:0 }}€)
-            {% endif %}</td>
-        <td>{{ dossier.statut_titulaire_anterieur|default:"" }}</td>
+      <td colspan="1">
+       Rémunérations
+      </td>
+      <td colspan="6">
+       {% rh_remun_form_for_year precedent_titulaire %}
+      </td>
     </tr>
+    {% endif %}
     </tbody>
 <table>
+{% endwith %}
 {% else %}
     <p>Il n'y a pas de précédent titulaire</p>
 {% endif %}
index a8b585a..c1959a0 100644 (file)
 <tr>
   <td>
     <h4>{{ dossier.justif_nouveau_statut_label }}</h4>
-    <p>{{ dossier.justif_nouveau_statut|default:"∅" }}
+    <p>{{ dossier.justif_nouveau_statut|default:"&#8709;" }}
     <h4>{{ dossier.justif_nouveau_tmp_remplacement_label }}</h4>
-    <p>{{ dossier.justif_nouveau_tmp_remplacement|default:"∅" }}</p>
+    <p>{{ dossier.justif_nouveau_tmp_remplacement|default:"&#8709;" }}</p>
     <h4>{{ dossier.justif_nouveau_salaire_label }}</h4>
-    <p>{{ dossier.justif_nouveau_salaire|default:"∅" }}</p>
+    <p>{{ dossier.justif_nouveau_salaire|default:"&#8709;" }}</p>
     <h4>{{ dossier.justif_nouveau_commentaire_label }}</h4>
-    <p>{{ dossier.justif_nouveau_commentaire|default:"∅" }}</p>
+    <p>{{ dossier.justif_nouveau_commentaire|default:"&#8709;" }}</p>
   </td>
   <td>
     <h4>{{ dossier.justif_rempl_type_contrat_label }}</h4>
-    <p>{{ dossier.justif_rempl_type_contrat|default:"∅"}}</p>
+    <p>{{ dossier.justif_rempl_type_contrat|default:"&#8709;"}}</p>
     <h4>{{ dossier.justif_rempl_statut_employe_label }}</h4>
-    <p>{{ dossier.justif_rempl_statut_employe|default:"∅"}}</p>
+    <p>{{ dossier.justif_rempl_statut_employe|default:"&#8709;"}}</p>
     <h4>{{ dossier.justif_rempl_evaluation_label }}</h4>
-    <p>{{ dossier.justif_rempl_evaluation|default:"∅"}}</p>
+    <p>{{ dossier.justif_rempl_evaluation|default:"&#8709;"}}</p>
     <h4>{{ dossier.justif_rempl_salaire_label }}</h4>
-    <p>{{ dossier.justif_rempl_salaire|default:"∅" }}</p>
+    <p>{{ dossier.justif_rempl_salaire|default:"&#8709;" }}</p>
     <h4>{{ dossier.justif_rempl_commentaire_label }}</h4>
-    <p>{{ dossier.justif_rempl_commentaire|default:"∅" }}</p>
+    <p>{{ dossier.justif_rempl_commentaire|default:"&#8709;" }}</p>
   </td>
 </tr>
 </table>
index 0b5387e..e1b8af8 100644 (file)
       <th>Échelon AUF</th>
       <td colspan="2">{{ poste.classement_min }}</td>
       <td colspan="2">{{ poste.classement_max }}</td>
+    </tr> 
+    <tr>
+      <th colspan="5">
+       Traitements
+      </th>
     </tr>
     <tr>
       <td class="spaced" >Salaire de base</td>
       </td>
     </tr>
     <tr>
+      <td class="spaced">Sous-total</td>
+      <td class="montant">
+        {{ poste.salaire_min|floatformat:0 }}
+      </td>
+      <td class="montant">
+        {{ poste.salaire_min|euros:poste.devise_min|floatformat:0 }}
+      </td>
+      <td class="montant">
+        {{ poste.salaire_max|floatformat:0 }}
+      </td>
+      <td class="montant">
+        {{ poste.salaire_max|euros:poste.devise_max|floatformat:0 }}
+      </td>
+    </tr>
+    <tr>
+      <th colspan="5">
+       Indemnités autres
+      </th>
+    </tr>
+    <tr>
       <td class="spaced">Indem. d'expatriation</td>
       <td class="montant">{{ poste.indemn_expat_min|floatformat:0 }}</td>
       <td class="montant">{{ poste.indemn_expat_min|euros:poste.devise_min|floatformat:0 }}</td>
       <td class="montant">{{ poste.indemn_fct_max|euros:poste.devise_max|floatformat:0 }}</td>
     </tr>
     <tr>
+      <td class="spaced">Sous-total</td>
+      <td class="montant">{{ poste.indemn_min_cad|floatformat:0 }}</td>
+      <td class="montant">{{ poste.indemn_min_cad|euros:poste.devise_min|floatformat:0 }}</td>
+      <td class="montant">{{ poste.indemn_max_cad|floatformat:0 }}</td>
+      <td class="montant">{{ poste.indemn_max_cad|euros:poste.devise_max|floatformat:0 }}</td>
+    </tr>
+    <tr>
+      <th colspan="5">
+       Charges patronales
+      </th>
+    </tr>
+    <tr>
       <td class="spaced">Charges patronales</td>
       <td class="montant">{{ poste.charges_patronales_min|floatformat:0 }}</td>
       <td class="montant">{{ poste.charges_patronales_min|euros:poste.devise_min|floatformat:0 }}</td>
       <td class="montant">{{ poste.charges_patronales_max|euros:poste.devise_max|floatformat:0 }}</td>
     </tr>
     <tr>
+      <td class="spaced">Sous-total</td>
+      <td class="montant">{{ poste.charges_patronales_min|floatformat:0 }}</td>
+      <td class="montant">{{ poste.charges_patronales_min|euros:poste.devise_min|floatformat:0 }}</td>
+      <td class="montant">{{ poste.charges_patronales_max|floatformat:0 }}</td>
+      <td class="montant">{{ poste.charges_patronales_max|euros:poste.devise_max|floatformat:0 }}</td>
+    </tr>
+    <tr>
+      <th colspan="5">
+       Autres
+      </th>
+    </tr>
+    <tr>
       <td class="spaced">Autres</td>
       <td class="montant">{{ poste.autre_min|floatformat:0 }}</td>
       <td class="montant">{{ poste.autre_min|euros:poste.devise_min|floatformat:0 }}</td>
       <td class="montant">{{ poste.autre_max|floatformat:0 }}</td>
       <td class="montant">{{ poste.autre_max|euros:poste.devise_max|floatformat:0 }}</td>
     </tr>
+    <tr>
+      <td class="spaced">Sous-total</td>
+      <td class="montant">{{ poste.autre_min|floatformat:0 }}</td>
+      <td class="montant">{{ poste.autre_min|euros:poste.devise_min|floatformat:0 }}</td>
+      <td class="montant">{{ poste.autre_max|floatformat:0 }}</td>
+      <td class="montant">{{ poste.autre_max|euros:poste.devise_max|floatformat:0 }}</td>
+    </tr>
     <tr class="total-row" >
       <th>TOTAL</th>
       <td class="montant">{{ poste.get_couts_minimum|floatformat:0 }}</td>
index 08088b3..e2ea834 100644 (file)
@@ -16,6 +16,7 @@ from project.dae.forms import (
     ReadOnlyRemunFormSet,
     PosteCompReadOnlyRemunFormSet,
     DossierCompReadOnlyRemunFormSet,
+    RHReadOnlyRemunFormSet,
     )
 from project.dae import models as dae
 from project.rh import models as rh
@@ -132,7 +133,7 @@ def dossier_cmp_remun_form(context, dossier_cmp):
 
 
 @register.inclusion_tag('dae/embauche-remun.html', takes_context=True)
-def rh_remun_form_for_year(context, dossier, year):
+def rh_remun_form_for_year(context, dossier, year=None):
 
     fs = remun_formset_factory_factory(
         read_only=True,
@@ -140,7 +141,14 @@ def rh_remun_form_for_year(context, dossier, year):
         model=rh.Remuneration,
         )
 
-    def _get_qs(inst):
+    def _get_qs(inst, year=year):
+
+        if year == None:
+            year = (
+                inst.instance.date_fin.year if
+                inst.instance.date_fin else
+                datetime.date.today().year)
+
         year_start = datetime.date(year, 1, 1)
         year_end = datetime.date(year, 12, 31)
         qs = inst.model.objects.filter(
@@ -151,7 +159,7 @@ def rh_remun_form_for_year(context, dossier, year):
                 Q(date_debut__isnull=True, date_fin__isnull=True)
                 ))
         return qs
-        
+
     fs.get_queryset = _get_qs
 
     return {
index 9b2af7a..5c4bb1f 100644 (file)
@@ -554,6 +554,18 @@ class Employe(models.Model):
     def __unicode__(self):
         return u'%s %s [%s]' % (self.nom.upper(), self.prenom, self.id)
 
+    def get_latest_dossier_ordered_by_date_fin_and_principal(self):
+        res = self.rh_dossiers.order_by(
+            '-principal', 'date_fin')
+
+        # Retourne en le premier du queryset si la date de fin est None
+        # Sinon, retourne le plus récent selon la date de fin.
+        first = res[0]
+        if first.date_fin == None:
+            return first
+        else:
+            return res.order_by('-principal', '-date_fin')[0]
+
     def civilite(self):
         civilite = u''
         if self.genre.upper() == u'M':