Masse salariale HTML
authorJean-Philippe Caissy <jpcaissy@piji.ca>
Tue, 20 Mar 2012 22:08:09 +0000 (17:08 -0500)
committerJean-Philippe Caissy <jpcaissy@piji.ca>
Tue, 20 Mar 2012 22:08:09 +0000 (17:08 -0500)
project/rh/masse_salariale.py
project/rh/static/admin/js/jquery-stickytableheaders.js [new file with mode: 0644]
project/rh/templates/rh/rapports/masse_salariale.html
project/rh/templatetags/rapports.py
project/rh/views.py

index b07b5ca..ea5039f 100644 (file)
@@ -80,12 +80,64 @@ class MasseSalariale():
 
         self.rapport = []
 
-        pays_list = ref.Pays.objects.all()
+        pays_list = {}
+        for pays in ref.Pays.objects.all():
+            pays_list[pays.id] = pays
+
         valeurs_point_par_imp = \
                 dict(
                     (v.implantation.id, v) for v in \
                     rh.ValeurPoint.objects.filter(annee=self.annee).all()
                 )
+
+        self.headers = (
+                ('bureau', u"Bureau"),
+                ('pays', u"Pays"),
+                ('implantation', u"Implantation"),
+                ('valeur_point', u"Valeur du point"),
+                ('numero_employe', u"Numéro d'employé"),
+                ('nom', u"Nom"),
+                ('prenom', u"Prénom"),
+                ('type_de_poste', u"Type de poste"),
+                ('intitule_de_poste', u"Intitulé du poste"),
+                ('niveau', u"Niveau"),
+                ('point', u"Point"),
+                ('regime_de_travail', u"Régime de travail"),
+                ('local_expatrie', u"Local / Expatrié"),
+                ('statut', u"Statut"),
+                ('date_fin_contrat', u"Date de fin de contrat"),
+                ('date_debut', u"Date de début"),
+                ('date_fin', u"Date de fin"),
+                ('nb_jours', u"Nombre de jours"),
+                ('devise', u"Devise"),
+                ('salaire_bstg_annuel', u"Salaire annuel BSTG"),
+                ('salaire_bstg_total', u"Salaire total BSTG"),
+                ('organisme_bstg', u"Organisme BSTG"),
+                ('salaire_theorique', u"Salaire théorique"),
+                ('salaire_base_brut', u"Salaire de base brut"),
+                ('salaire_complementaire', u"Salaire complémentaire"),
+                ('indemnite_fonctions', u"Indemnités de fonctions"),
+                ('indemnite_expat', u"Indemnités d'expatriation"),
+                ('indemnite_logement', u"Indemnités de logement"),
+                ('indemnite_transp', u"Indemnités de transport"),
+                ('indemnite_13e', u"Indemnités 13e mois"),
+                ('indemnite_autre', u"Autre indemnités"),
+                ('total_brut', u"Total brut"),
+                ('prime_interim', u"Prime d'intérim"),
+                ('prime_installation', u"Prime d'installation"),
+                ('prime_demenagement', u"Prime de déménagement"),
+                ('prime_avion', u"Prime d'avion"),
+                ('prime_autre', u"Autre prime"),
+                ('prime_total', u"Total des primes"),
+                ('charges_patronales', u"Charges patronales"),
+                ('charges_patronales_annee', u"Charge patronale %s" % \
+                        self.annee),
+                ('masse_salariale', u"Masse salariale"),
+                ('masse_salariale_annee', u"Masse salariale %s" % self.annee),
+                ('masse_salariale_annee_euro', u"Masse salariale euro %s" % \
+                        self.annee),
+        )
+
         for item in self.employes.values():
             dossiers = item['dossiers']
             remuns = item['remunerations']
@@ -244,91 +296,91 @@ class MasseSalariale():
                     round(valeur_point.valeur * int(coefficient) * regime, 2) \
                     if valeur_point and coefficient and regime else "")
 
-            item_rapport = (
-                    ('bureau', dossier.poste.implantation.region.code),
-                    ('pays', unicode(pays)),
-                    ('implantation', dossier.poste.implantation.nom_court),
-                    ('type_implantation', dossier.poste.implantation.type),
-                    #'imputation', None),
-                    ('valeur_point', valeur_point),
-                    ('numero_employe', dossier.employe_id),
-                    ('nom', dossier.employe.nom.upper()),
-                    ('prenom', dossier.employe.prenom),
-                    ('type_de_poste', dossier.poste.type_poste.nom),
-                    ('intitule_de_poste', dossier.poste.nom),
-                    ('niveau', unicode(dossier.classement)),
-                    ('point', coefficient),
-                    ('regime_de_travail', "%s %%" % int(regime * 100)),
-                    ('local_expatrie', statut),
-                    ('statut', dossier.statut.code),
-                    ('date_fin_contrat', dossier.date_fin or ""),
-                    ('date_debut', d_date_debut or ""),
-                    ('date_fin', d_date_fin or ""),
-                    ('nb_jours', date_delta.days),
-                    ('devise', remuns[0].devise),
-                    ('salaire_bstg_annuel', bstg_remun.montant \
-                            if bstg_remun else ""),
-                    ('salaire_bstg_total', bstg_remun_euro.montant \
-                            if bstg_remun else ""),
-                    ('organisme_bstg', dossier.organisme_bstg or ""),
-                    ('salaire_theorique', salaire_theorique),
-                    ('salaire_base_brut', \
+            item_rapport = {
+                    'bureau': dossier.poste.implantation.region.code,
+                    'pays': unicode(pays),
+                    'implantation': dossier.poste.implantation.nom_court,
+                    'type_implantation': dossier.poste.implantation.type,
+                    #'imputation': None,
+                    'valeur_point': valeur_point,
+                    'numero_employe': dossier.employe_id,
+                    'nom': dossier.employe.nom.upper(),
+                    'prenom': dossier.employe.prenom,
+                    'type_de_poste': dossier.poste.type_poste.nom,
+                    'intitule_de_poste': dossier.poste.nom,
+                    'niveau': unicode(dossier.classement),
+                    'point': coefficient,
+                    'regime_de_travail': "%s %%" % int(regime * 100),
+                    'local_expatrie': statut,
+                    'statut': dossier.statut.code,
+                    'date_fin_contrat': dossier.date_fin or "",
+                    'date_debut': d_date_debut or "",
+                    'date_fin': d_date_fin or "",
+                    'nb_jours': date_delta.days,
+                    'devise': remuns[0].devise,
+                    'salaire_bstg_annuel': bstg_remun.montant \
+                            if bstg_remun else "",
+                    'salaire_bstg_total': bstg_remun_euro.montant \
+                            if bstg_remun else "",
+                    'organisme_bstg': dossier.organisme_bstg or "",
+                    'salaire_theorique': salaire_theorique,
+                    'salaire_base_brut': \
                             salaire_base * regime * (
                                 date_delta.days / rapport_date_delta.days
-                            )),
-                    ('salaire_complementaire', \
+                            ),
+                    'salaire_complementaire': \
                             salaire_complement * regime * (
                                 date_delta.days / rapport_date_delta.days
-                            )),
-                    #'salaire_total', None
-                    ('indemnite_fonctions', indemnites['fonc_resp'] * \
+                            ),
+                    #'salaire_total': None
+                    'indemnite_fonctions': indemnites['fonc_resp'] * \
                             regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('indemnite_expat', indemnites['expat'] * regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('indemnite_logement', indemnites['logement'] * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'indemnite_expat': indemnites['expat'] * regime * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'indemnite_logement': indemnites['logement'] * \
                             regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('indemnites_transp', indemnites['transp'] * regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('indemnites_13e', indemnites['13e'] * regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('indemnites_autre', indemnites['autre_recurr'] * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'indemnite_transp': indemnites['transp'] * regime * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'indemnite_13e': indemnites['13e'] * regime * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'indemnite_autre': indemnites['autre_recurr'] * \
                             regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('indemnites_total', total_indemnites * regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('total_brut', (
+                            (date_delta.days / rapport_date_delta.days),
+                    'indemnite_total': total_indemnites * regime * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'total_brut': (
                                 total_indemnites + salaire_base +
                                 salaire_complement
                             ) * regime * (
                                 date_delta.days / rapport_date_delta.days
-                            )),
-                    ('prime_interim', primes['interim'] * regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('prime_installation', primes['installation'] * regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('prime_demenagement', primes['demenagement'] * regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('prime_avion', primes['avion'] * regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('prime_autre', primes['autre'] * regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('prime_total', sum(primes.values()) * regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('charges_patronales', charges),
-                    ('charges_patronales_%s' % self.annee, charges * regime * \
-                            (date_delta.days / rapport_date_delta.days)),
-                    ('masse_salariale', masse_salariale),
-                    ('masse_salariale_%s' % self.annee, masse_salariale * \
+                            ),
+                    'prime_interim': primes['interim'] * regime * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'prime_installation': primes['installation'] * regime * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'prime_demenagement': primes['demenagement'] * regime * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'prime_avion': primes['avion'] * regime * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'prime_autre': primes['autre'] * regime * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'prime_total': sum(primes.values()) * regime * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'charges_patronales': charges,
+                    'charges_patronales_annee': charges * regime * \
+                            (date_delta.days / rapport_date_delta.days),
+                    'masse_salariale': masse_salariale,
+                    'masse_salariale_annee': masse_salariale * \
                             regime * (
                                     date_delta.days / rapport_date_delta.days
-                             )),
-                     ('masse_salariale__euro_%s' % self.annee, \
+                             ),
+                     'masse_salariale_annee_euro': \
                             masse_salariale_euro.montant * regime * (
                                     date_delta.days / rapport_date_delta.days
-                            )),
-            )
+                            ),
+            }
 
             self.rapport.append(item_rapport)
 
diff --git a/project/rh/static/admin/js/jquery-stickytableheaders.js b/project/rh/static/admin/js/jquery-stickytableheaders.js
new file mode 100644 (file)
index 0000000..9f55aa7
--- /dev/null
@@ -0,0 +1,116 @@
+
+/*! Copyright (c) 2011 by Jonas Mosbech - https://github.com/jmosbech/StickyTableHeaders 
+    MIT license info: https://github.com/jmosbech/StickyTableHeaders/blob/master/license.txt */
+
+(function ($) {
+    $.StickyTableHeaders = function (el, options) {
+        // To avoid scope issues, use 'base' instead of 'this'
+        // to reference this class from internal events and functions.
+        var base = this;
+
+        // Access to jQuery and DOM versions of element
+        base.$el = $(el);
+        base.el = el;
+
+        // Cache DOM refs for performance reasons
+        base.$window = $(window);
+        base.$clonedHeader = null;
+        base.$originalHeader = null;
+
+        // Add a reverse reference to the DOM object
+        base.$el.data('StickyTableHeaders', base);
+
+        base.init = function () {
+            base.options = $.extend({}, $.StickyTableHeaders.defaultOptions, options);
+
+            base.$el.each(function () {
+                var $this = $(this);
+
+                // remove padding on <table> to fix issue #7
+                $this.css('padding', 0);
+
+                $this.wrap('<div class="divTableWithFloatingHeader"></div>');
+
+                base.$originalHeader = $('thead:first', this);
+                base.$clonedHeader = base.$originalHeader.clone();
+
+                base.$clonedHeader.addClass('tableFloatingHeader');
+                base.$clonedHeader.css({
+                    'position': 'fixed',
+                    'top': 0,
+                    'left': $this.css('margin-left'),
+                    'display': 'none'
+                });
+
+                base.$originalHeader.addClass('tableFloatingHeaderOriginal');
+                
+                base.$originalHeader.before(base.$clonedHeader);
+
+                // enabling support for jquery.tablesorter plugin
+                // forward clicks on clone to original
+                $('th', base.$clonedHeader).click(function(e){
+                    var index = $('th', base.$clonedHeader).index(this);
+                    $('th', base.$originalHeader).eq(index).click();
+                });
+                $this.bind('sortEnd', base.updateCloneFromOriginal );
+            });
+
+            base.updateTableHeaders();
+            base.$window.scroll(base.updateTableHeaders);
+            base.$window.resize(base.updateTableHeaders);
+        };
+
+        base.updateTableHeaders = function () {
+            base.$el.each(function () {
+                var $this = $(this);
+
+                var fixedHeaderHeight = isNaN(base.options.fixedOffset) ? base.options.fixedOffset.height() : base.options.fixedOffset;
+
+                var offset = $this.offset();
+                var scrollTop = base.$window.scrollTop() + fixedHeaderHeight;
+                var scrollLeft = base.$window.scrollLeft();
+
+                if ((scrollTop > offset.top) && (scrollTop < offset.top + $this.height())) {
+                    base.$clonedHeader.css({
+                        'top': fixedHeaderHeight,
+                        'margin-top': 0,
+                        'left': offset.left - scrollLeft,
+                        'display': 'block'
+                    });
+
+                    base.updateCloneFromOriginal();
+                }
+                else {
+                    base.$clonedHeader.css('display', 'none');
+                }
+            });
+        };
+
+        base.updateCloneFromOriginal = function () {
+            // Copy cell widths and classes from original header
+            $('th', base.$clonedHeader).each(function (index) {
+                var $this = $(this);
+                var origCell = $('th', base.$originalHeader).eq(index);
+                $this.removeClass().addClass(origCell.attr('class'));
+                $this.css('width', origCell.width());
+            });
+
+            // Copy row width from whole table
+            base.$clonedHeader.css('width', base.$originalHeader.width());
+        };
+
+        // Run initializer
+        base.init();
+    };
+
+    $.StickyTableHeaders.defaultOptions = {
+        fixedOffset: 0
+    };
+
+    $.fn.stickyTableHeaders = function (options) {
+        return this.each(function () {
+            (new $.StickyTableHeaders(this, options));
+        });
+    };
+
+})(jQuery);
index 430604b..c4515ca 100644 (file)
@@ -4,25 +4,38 @@
 {% block nomrapport %}Rapport Postes{% endblock %}
 {% block count_elements %}<h2>{{ count }} postes</h2>{% endblock %}
 
+{% block extrastyle %}
+{{ block.super }}
+<script type="text/javascript" src="{{ STATIC_URL }}js/jquery-1.5.1.min.js"></script>
+<script type="text/javascript" src="{% admin_media_prefix %}js/jquery-stickytableheaders.js"></script>
+{% endblock %}
+
 {% block contentrapport %}
+{% comment %}
 <div id="changelist-filter">
 <h2>{% trans 'Filter' %}</h2>
 {% filter_region "dossier__poste__" %}
 {% filter_implantation "dossier__poste__" %}
 </div>
-
+{% endcomment %}
+<script type="text/javascript">
+    jQuery(document).ready(function(){
+        $("#result_list").stickyTableHeaders();
+    });
+</script>
 <table id="result_list" class="results">
 <thead>
 <tr>
     {% table_header headers %}
 </tr>
 </thead>
-{% spaceless %}{% for row in rapport %}
-<tr class="{% cycle 'row1' 'row2' %}">
-    {% for column in row %}
-        <td>{{ column.1 }}</td>
-    {% endfor %}
-</tr>
+{% spaceless %}
+{% for row in rapport %}
+    <tr class="{% cycle 'row1' 'row2' %}">
+        {% for column in header_keys %}
+            <td>{{ row|hash:column }}</td>
+        {% endfor %}
+    </tr>
 {% endfor %}{% endspaceless %}
 </table>
 
index a2733b6..218a8b0 100644 (file)
@@ -224,3 +224,10 @@ class SortHeaders:
 @register.filter
 def split(str, splitter):
     return str.split(splitter)
+
+@register.filter
+def hash(h,key):
+    if key in h:
+        return h[key]
+    else:
+        raise Exception("%s does not exist" % key)
index 95b9e3d..8b2e155 100644 (file)
@@ -217,7 +217,8 @@ def rapports_masse_salariale(request):
         masse = MasseSalariale(date_debut, date_fin, custom_filter)
         if masse.rapport:
             c['rapport'] = masse.rapport
-            headers = [(row[0], row[0]) for row in masse.rapport[0]]
+            headers = masse.headers
+            c['header_keys'] = [h[0] for h in masse.headers]
             h = SortHeaders(request, headers, order_field_type="ot", order_field="o")
             c['headers'] = list(h.headers())