From 57e2b7937360a4b2dd192d07e5af48404135dbc4 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Caissy Date: Tue, 20 Mar 2012 17:08:09 -0500 Subject: [PATCH] Masse salariale HTML --- project/rh/masse_salariale.py | 194 +++++++++++++------- .../static/admin/js/jquery-stickytableheaders.js | 116 ++++++++++++ .../rh/templates/rh/rapports/masse_salariale.html | 27 ++- project/rh/templatetags/rapports.py | 7 + project/rh/views.py | 3 +- 5 files changed, 268 insertions(+), 79 deletions(-) create mode 100644 project/rh/static/admin/js/jquery-stickytableheaders.js diff --git a/project/rh/masse_salariale.py b/project/rh/masse_salariale.py index b07b5ca..ea5039f 100644 --- a/project/rh/masse_salariale.py +++ b/project/rh/masse_salariale.py @@ -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 index 0000000..9f55aa7 --- /dev/null +++ b/project/rh/static/admin/js/jquery-stickytableheaders.js @@ -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 to fix issue #7 + $this.css('padding', 0); + + $this.wrap('
'); + + 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); diff --git a/project/rh/templates/rh/rapports/masse_salariale.html b/project/rh/templates/rh/rapports/masse_salariale.html index 430604b..c4515ca 100644 --- a/project/rh/templates/rh/rapports/masse_salariale.html +++ b/project/rh/templates/rh/rapports/masse_salariale.html @@ -4,25 +4,38 @@ {% block nomrapport %}Rapport Postes{% endblock %} {% block count_elements %}

{{ count }} postes

{% endblock %} +{% block extrastyle %} +{{ block.super }} + + +{% endblock %} + {% block contentrapport %} +{% comment %}

{% trans 'Filter' %}

{% filter_region "dossier__poste__" %} {% filter_implantation "dossier__poste__" %}
- +{% endcomment %} +
{% table_header headers %} -{% spaceless %}{% for row in rapport %} - - {% for column in row %} - - {% endfor %} - +{% spaceless %} +{% for row in rapport %} + + {% for column in header_keys %} + + {% endfor %} + {% endfor %}{% endspaceless %}
{{ column.1 }}
{{ row|hash:column }}
diff --git a/project/rh/templatetags/rapports.py b/project/rh/templatetags/rapports.py index a2733b6..218a8b0 100644 --- a/project/rh/templatetags/rapports.py +++ b/project/rh/templatetags/rapports.py @@ -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) diff --git a/project/rh/views.py b/project/rh/views.py index 95b9e3d..8b2e155 100644 --- a/project/rh/views.py +++ b/project/rh/views.py @@ -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()) -- 1.7.10.4