rapports : ménage + debug employés sans contrat
authorDavin Baragiotta <davin.baragiotta@auf.org>
Tue, 5 Jun 2012 18:54:37 +0000 (14:54 -0400)
committerDavin BARAGIOTTA <davin.baragiotta@auf.org>
Tue, 5 Jun 2012 18:54:37 +0000 (14:54 -0400)
project/rh/lib.py
project/rh/templates/rh/rapports/employes_sans_contrat.html
project/rh/templates/rh/rapports/postes.html [deleted file]
project/rh/urls.py
project/rh/views.py

index ebc0d2b..38595a1 100644 (file)
@@ -1,6 +1,9 @@
+from collections import defaultdict
 import datetime
+
 from django.db.models import Q
-from collections import defaultdict
+from django.utils.encoding import smart_str
+
 
 def calc_remun(dossier):
         thisyear = datetime.date.today().year
@@ -26,4 +29,21 @@ def calc_remun(dossier):
 
         return remun, remun_sum, remun_sum_euro
 
+def get_lookup_params(request):
+    lookup_params = dict(request.GET.items())
+    
+    # order by, order type
+    if 'ot' in lookup_params:
+        del lookup_params['ot']
+    if 'o' in lookup_params:
+        del lookup_params['o']
 
+    # autres
+    for key, value in lookup_params.items():
+        if not isinstance(key, str):
+            # 'key' will be used as a keyword argument later, so Python
+            # requires it to be a string.
+            del lookup_params[key]
+            lookup_params[smart_str(key)] = value
+            
+    return lookup_params
index 27369b4..43aae60 100644 (file)
@@ -10,7 +10,7 @@
 {% block nomrapport %}Rapport Contrats{% endblock %}
 
 {% block count_elements %}
-<h2>{{ count }} employés sans contrat</h2>
+<h2>{{ employes.count }} employés sans contrat</h2>
 {% endblock %}
 
 {% block contentrapport %}
   </thead>
   <tbody>
   {% spaceless %}
-    {% for c in employes.values %}
+    {% for e in employes %}
     <tr class="{% cycle 'row1' 'row2' %}">
-      <td>{{ c.employe.id }}</td>
-      <td>{{ c.employe.nom|upper }}</td>
-      <td>{{ c.employe.prenom }}</td>
+      <td>{{ e.id }}</td>
+      <td>{{ e.nom|upper }} {{ e.prenom }}</td>
       <td>
-        {% if c.dossiers|length > 1 %}
-          <ul>
-          {% for d in c.dossiers %}
-            <li><a href="{% url admin:rh_dossier_change d.id %}">{{ d }}</a></li>
-          {% endfor %}
-          </ul>
-        {% else %}
-          {% for d in c.dossiers %}
-              <a href="{% url admin:rh_dossier_change d.id %}">{{ d }}</a>
-          {% endfor %}
-        {% endif %}
+        {% for d in e.rh_dossiers.all %}
+          {% if d in dossiers_sans_contrat %}
+            <a href="{% url admin:rh_dossier_change d.id %}">Dossier</a> : {{ d.poste.nom }}
+            {% if not forloop.last %}<br />{% endif %}
+          {% endif %}
+        {% endfor %}
+      </td>
+      <td>
+        {% for d in e.rh_dossiers.all %}
+          {% if d in dossiers_sans_contrat %}
+            {{ d.date_debut|default_if_none:"" }}
+            {% if not forloop.last %}<br />{% endif %}
+          {% endif %}
+        {% endfor %}
+      </td>
+      <td>
+        {% for d in e.rh_dossiers.all %}
+          {% if d in dossiers_sans_contrat %}
+            {{ d.date_fin|default_if_none:"" }}
+            {% if not forloop.last %}<br />{% endif %}
+          {% endif %}
+        {% endfor %}
       </td>
     </tr>
     {% endfor %}
   {% endspaceless %}
   </tbody>
 </table>
+
 {% endblock %}
diff --git a/project/rh/templates/rh/rapports/postes.html b/project/rh/templates/rh/rapports/postes.html
deleted file mode 100644 (file)
index ec5ab19..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-{% extends 'rh/rapports/base.html' %}
-{% load adminmedia rapports i18n %}
-
-{% block nomrapport %}Rapport Postes{% endblock %}
-{% block count_elements %}<h2>{{ count }} postes</h2>{% endblock %}
-
-{% block contentrapport %}
-<div id="changelist-filter">
-<h2>{% trans 'Filter' %}</h2>
-{% filter_region %}
-{% filter_implantation %}
-{% filter_comble %}
-</div>
-
-<table id="result_list" class="results">
-<thead>
-<tr>
-    {% table_header headers %}
-</tr>
-</thead>
-{% spaceless %}{% for poste in postes %}
-<tr class="{% cycle 'row1' 'row2' %}">
-    <td style="text-align:right"><a href="{% url admin:rh_poste_change poste.id %}">{{ poste.id }}</td>
-    <td><a href="{% url admin:rh_poste_change poste.id %}">{{ poste.nom|upper }}</a></td>
-    <td>{{ poste.implantation }}</td>
-    <td>
-        {% if poste.employes %}
-            {% if poste.employes|length > 1 %}
-                <ul>
-                    {% for e in poste.employes %}
-                        <li><a href="{% url admin:rh_employe_change e.id %}">[{{ e.id }}] {{ e.nom|upper }} {{ e.prenom }}</a></li>
-                    {% endfor %}
-                </ul>
-            {% else %}
-                {% for e in poste.employes %}
-                    <a href="{% url admin:rh_employe_change e.id %}">[{{ e.id }}] {{ e.nom|upper }} {{ e.prenom }}</a>
-                {% endfor %}
-            {% endif %}
-        {% else %}
-        Vacant
-        {% endif %}
-    </td>
-</tr>
-{% endfor %}{% endspaceless %}
-</table>
-
-{% endblock %}
index 6e88324..f987404 100644 (file)
@@ -4,13 +4,10 @@ from django.conf.urls.defaults import patterns, url
 
 urlpatterns = patterns(
     'project.rh.views',
-    url(r'^admin/rh/rapports/postes$', 'rapports_poste', name='rhr_postes'),
     url(r'^admin/rh/rapports/employes_sans_contrats$',
         'rapports_employes_sans_contrat', name='rhr_employe_sans_contrat'),
     url(r'^admin/rh/rapports/contrats$', 'rapports_contrat',
         name='rhr_contrats'),
-    url(r'^admin/rh/rapports/remuneration$', 'rapports_remuneration',
-        name='rhr_remuneration'),
     url(r'^admin/rh/rapports/masse_salariale$', 'rapports_masse_salariale',
         name='rhr_masse_salariale'),
     url(r'^admin/rh/rapports/postes_par_service$',
index e719233..1ed8c53 100644 (file)
@@ -9,7 +9,6 @@ import pygraphviz as pgv
 from datamaster_modeles import models as ref
 from django.core.urlresolvers import reverse
 from django.db.models import Q
-from django.utils.encoding import smart_str
 from django.shortcuts import render_to_response, get_object_or_404
 from django.template import RequestContext
 from django.http import HttpResponse
@@ -18,7 +17,7 @@ from django.contrib.auth.decorators import login_required
 from django.core.servers.basehttp import FileWrapper
 
 from rh import models as rh
-from rh.lib import calc_remun
+from rh.lib import calc_remun, get_lookup_params
 from rh.decorators import drh_or_admin_required
 from rh.templatetags.rapports import SortHeaders
 from rh.change_list import RechercheTemporelle
@@ -78,102 +77,6 @@ def employe(request, id):
 
 @login_required
 @drh_or_admin_required
-def rapports_poste(request):
-
-    lookup_params = dict(request.GET.items())
-
-    for key, value in lookup_params.items():
-        if key == 'o' or key == 'ot':
-            del lookup_params[key]
-            continue
-        if not isinstance(key, str):
-            # 'key' will be used as a keyword argument later, so Python
-            # requires it to be a string.
-            del lookup_params[key]
-            lookup_params[smart_str(key)] = value
-
-        if key == 'comble':
-            del lookup_params[key]
-
-    sort_order = 'ASC' if request.GET.get('ot') == 'asc' else 'DESC'
-
-    postes = rh.Poste.objects.select_related('implantation') \
-            .extra(select={
-                'employe_id':
-                'SELECT GROUP_CONCAT(employe SEPARATOR "|") '
-                'FROM rh_dossier '
-                'WHERE poste = rh_poste.id '
-                'AND rh_dossier.date_fin IS NULL ' + (
-                    'ORDER BY employe ' + sort_order
-                    if request.GET.get('o') == 'employe_id' else ''
-                )
-            }) \
-            .extra(select={
-                'employe_nom':
-                'SELECT GROUP_CONCAT(rh_employe.nom SEPARATOR "|") '
-                'FROM rh_dossier INNER JOIN rh_employe '
-                'ON rh_dossier.employe = rh_employe.id '
-                'WHERE poste = rh_poste.id '
-                'AND rh_dossier.date_fin IS NULL ' + (
-                    'ORDER BY rh_employe.nom ' + sort_order
-                    if request.GET.get('o') == 'employe_nom' else ''
-                )
-            }) \
-            .extra(select={
-                'employe_prenom':
-                'SELECT GROUP_CONCAT(rh_employe.prenom SEPARATOR "|") '
-                'FROM rh_dossier INNER JOIN rh_employe '
-                'ON rh_dossier.employe = rh_employe.id '
-                'WHERE poste = rh_poste.id '
-                'AND rh_dossier.date_fin IS NULL ' + (
-                    'ORDER BY rh_employe.prenom ' + sort_order
-                    if request.GET.get('o') == 'employe_prenom' else ''
-                )
-            })
-
-    postes = postes.filter(**lookup_params)
-    if 'o' in request.GET:
-        postes = postes.order_by(
-            ('-' if sort_order == "DESC" else '') + request.GET['o']
-        )
-
-    out = []
-    for p in postes:
-        out.append({
-            'id': p.id,
-            'nom': p.nom,
-            'implantation': p.implantation,
-            'employes': [] if not p.employe_id else [
-                {'id': id, 'nom': nom, 'prenom': prenom}
-                for id, nom, prenom in izip(
-                    p.employe_id.split('|'),
-                    p.employe_nom.split('|'),
-                    p.employe_prenom.split('|')
-                )
-            ]
-        })
-
-    headers = [
-        ("id", u"# du poste"),
-        ("nom", u"Nom du poste"),
-        ("implantation__id", u"Implantation"),
-        ("employe_nom", u"Nom"),
-    ]
-    h = SortHeaders(request, headers, order_field_type="ot", order_field="o")
-    c = {
-        'title': 'Rapport des postes',
-        'postes': out,
-        'count': len(out),
-        'headers': list(h.headers()),
-    }
-
-    return render_to_response(
-        'rh/rapports/postes.html', c, RequestContext(request)
-    )
-
-
-@login_required
-@drh_or_admin_required
 def rapports_contrat(request):
     if 'HTTP_REFERER' in request.META.keys():
         referer = request.META['HTTP_REFERER']
@@ -184,18 +87,7 @@ def rapports_contrat(request):
             params.update({'statut': 'Actif'})
             request.GET = params
 
-    lookup_params = dict(request.GET.items())
-    if 'ot' in lookup_params:
-        del lookup_params['ot']
-    if 'o' in lookup_params:
-        del lookup_params['o']
-
-    for key, value in lookup_params.items():
-        if not isinstance(key, str):
-            # 'key' will be used as a keyword argument later, so Python
-            # requires it to be a string.
-            del lookup_params[key]
-            lookup_params[smart_str(key)] = value
+    lookup_params = get_lookup_params(request)
 
     contrats = rh.Contrat.objects.select_related(
         'dossier', 'dossier__poste', 'dossier__poste__implantation',
@@ -218,7 +110,7 @@ def rapports_contrat(request):
     headers = [
         ("dossier__employe__id", u"# de l'employé"),
         ("dossier__employe__nom", u"Employé"),
-        ("type_contrat__nom", u"Poste"),
+        ("dossier__poste__nom", u"Poste"),
         ("dossier__poste__implantation__region", u"Région"),
         ("dossier__poste__implantation", u"Implantation"),
         ("type_contrat__nom", u"Type de contrat"),
@@ -355,146 +247,49 @@ def rapports_masse_salariale(request):
 
 @login_required
 @drh_or_admin_required
-def rapports_remuneration(request):
-
-    lookup_params = dict(request.GET.items())
-    if 'ot' in lookup_params:
-        del lookup_params['ot']
-    if 'o' in lookup_params:
-        del lookup_params['o']
-
-    for key, value in lookup_params.items():
-        if not isinstance(key, str):
-            # 'key' will be used as a keyword argument later, so Python
-            # requires it to be a string.
-            del lookup_params[key]
-            lookup_params[smart_str(key)] = value
-
-    employes = rh.Employe.objects.all()
-    if 'o' in request.GET:
-        employes = employes.order_by(
-            ('-' if request.GET.get('ot') == "desc" else '') + request.GET['o']
-        )
-
-    employes = employes.filter(**lookup_params)
-
-    output = []
-    headers = [
-            ("id", u"# de l'employé"),
-            ("nom", u"Nom"),
-            ("prenom", u"Prénom"),
-            ("", u"Salaire"),
-            ("", u"RAS"),
-            ("", u"Indemnités"),
-            ("", u"Accessoire"),
-            ("", u"Charges patronales"),
-            ("", u"Total"),
-    ]
-    h = SortHeaders(request, headers, order_field_type="ot", order_field="o")
-
-    for employe in employes:
-        line = {}
-        output.append(line)
-
-        dossiers = employe.rh_dossiers.all()
-
-        remun = {}
-        remun_sum_euro = 0
-
-        for dossier in dossiers:
-            this_remun, this_remun_sum, this_remun_sum_euro = \
-                    calc_remun(dossier)
-
-            for item in this_remun:
-                if item not in remun:
-                    remun[item] = this_remun[item]
-                else:
-                    remun[item][0] += this_remun[item][0]
-                    remun[item][1] += this_remun[item][1]
-
-            remun_sum_euro += this_remun_sum_euro
-
-        line['remun_sum_euro'] = remun_sum_euro
-
-        for r in remun:
-            if r == u'Indemnité':
-                line['Indemnite'] = remun[r][1]
-            else:
-                line[r] = remun[r][1]
-
-        line['id'] = employe.id
-        line['nom'] = employe.nom
-        line['prenom'] = employe.prenom
-
-    c = {
-        'title': 'Rapport de remuneration',
-        'employes': output,
-        'headers': list(h.headers()),
-    }
-
-    return render_to_response(
-        'rh/rapports/remuneration.html', c, RequestContext(request)
-    )
-
-
-@login_required
-@drh_or_admin_required
 def rapports_employes_sans_contrat(request):
+    lookup_params = get_lookup_params(request)
 
-    # tri : TODO fonctionne pas
-    lookup_params = dict(request.GET.items())
-    if 'ot' in lookup_params:
-        del lookup_params['ot']
-    if 'o' in lookup_params:
-        del lookup_params['o']
-
-    for key, value in lookup_params.items():
-        if not isinstance(key, str):
-            # 'key' will be used as a keyword argument later, so Python
-            # requires it to be a string.
-            del lookup_params[key]
-            lookup_params[smart_str(key)] = value
-
-    employes_query = rh.Employe.objects
+    # contrats échus
+    contrats_echus = rh.Contrat.objects.filter(
+            date_fin__lt=date.today()
+        ).filter(
+            **lookup_params
+        )
+
+    # dossiers en cours sans contrat
+    dossiers_sans_contrat = rh.Dossier.objects.filter(
+            Q(date_fin=None) | Q(date_fin__gt=date.today()),
+        ).exclude(
+            date_debut__gt=date.today()
+        ).filter(
+            rh_contrats__in=contrats_echus
+        )
+    
+    # employés sans contrat
+    employes = rh.Employe.objects.filter(rh_dossiers__in=dossiers_sans_contrat).distinct()
     if 'o' in request.GET:
-        employes_query = employes_query.order_by(
+        employes = employes.order_by(
             ('-' if request.GET.get('ot') == "desc" else '') + request.GET['o']
         )
 
-    # données
-    employes = {}
-
-    dossiers_en_cours = rh.Dossier.objects.filter(
-        Q(date_fin=None) | Q(date_fin__gt=date.today())
-    )
-    tous_contrats_echus = rh.Contrat.objects.filter(
-        date_fin__lt=date.today(), dossier__in=dossiers_en_cours
-    )
-    contrats = tous_contrats_echus.filter(**lookup_params).all()
-    for c in contrats:
-        if c.dossier.employe.id not in employes.keys():
-            employes[c.dossier.employe.id] = {
-                'employe': c.dossier.employe,
-                'dossiers': []
-            }
-        employes[c.dossier.employe.id]['dossiers'] += [c.dossier]
-
     # affichage
     headers = [
         ("id", u"# de l'employé"),
-        ("nom", u"Nom"),
-        ("prenom", u"Prénom"),
-        ("dossier", u"Dossiers"),
+        ("nom", u"Employé"),
+        ("dossier", u"Dossier : Poste"),
+        ("dossier_date_debut", u"Début occupation poste"),
+        ("dossier_date_fin", u"Fin occupation poste"),
     ]
     h = SortHeaders(
         request, headers, order_field_type="ot", order_field="o",
-        not_sortable=('dossier',)
+        not_sortable=('dossier','dossier_date_debut','dossier_date_fin',)
     )
 
     c = {
         'title': u'Rapport des employés sans contrat',
         'employes': employes,
-        'count': len(employes),
+        'dossiers_sans_contrat':dossiers_sans_contrat,
         'headers': list(h.headers()),
     }