--- /dev/null
+
+$(document).ready(function() {
+ $(".selectlist input[type=text]").change(function() {
+ var filtre = $(this).val();
+ var choix = $(this).parent().find("option");
+ choix.show();
+ choix.each(function(idx) {
+ if ($(this).html().indexOf(filtre) == -1) $(this).hide();
+ });
+ });
+ });
return rh.Poste.objects.none()
self.q = q
- postes = rh.Poste.objects.filter(
- Q(nom__icontains=q) |
- Q(type_poste__nom__icontains=q) |
- Q(rh_dossiers__employe__nom__icontains=q) |
- Q(rh_dossiers__employe__prenom__icontains=q)
- ).distinct()
+ filtre = (
+ Q(poste__nom__icontains=q) |
+ Q(poste__type_poste__nom__icontains=q) |
+ Q(employe__nom__icontains=q) |
+ Q(employe__prenom__icontains=q)
+ )
+
+ dossiers = rh.Dossier.objects.\
+ select_related('poste', 'poste__type_poste').\
+ actifs().\
+ filter(filtre)
+ q = q.lower()
+ postes = list(set([d.poste for d in dossiers if q in
+ unicode(d.employe).lower() or \
+ q in d.poste.nom.lower() or \
+ q in d.poste.type_poste.nom.lower()]))
return postes
def format_result(self, poste):
Q(poste__nom__icontains=q) | Q(employe__nom__icontains=q) |
Q(employe__prenom__icontains=q)
)
- dossiers = rh.Dossier.objects.filter(filtre)
+ dossiers = rh.Dossier.objects.actifs().filter(filtre)
nom_poste = poste.nom
dossier = dossiers[0]
employe = dossier.employe
else:
- dossiers = poste.rh_dossiers.all()
+ dossiers = poste.rh_dossiers.all().order_by('-date_debut')
if len(dossiers) > 0:
employe = unicode(dossiers[0].employe)
else:
# -*- encoding: utf-8 -*-
from django import forms
+from django.core.urlresolvers import reverse
from django.forms.models import BaseInlineFormSet
-from django.contrib.admin import widgets as admin_widgets
-from django.db.models import Q, Max
from django.forms.models import inlineformset_factory, modelformset_factory
+from django.db.models import Q, Max, Count
+from django.shortcuts import redirect
+from django.contrib.admin import widgets as admin_widgets
from ajax_select.fields import AutoCompleteSelectField
from auf.django.references import models as ref
from auf.django.workflow.forms import WorkflowFormMixin
+from auf.django.workflow.models import WorkflowCommentaire
from project import groups
from project.rh import models as rh
from project.dae import models as dae
-from project.dae.workflow import POSTE_ETATS_BOUTONS
+from project.dae.workflow import POSTE_ETATS_BOUTONS, POSTE_ETAT_FINALISE
class BaseInlineFormSetWithInitial(BaseInlineFormSet):
annee = poste.date_debut.year
nom = poste.nom
-
- try:
- label = u"%s %s - %s [%s]" % (
- annee, nom, poste.type_poste.categorie_emploi.nom, poste.id
+ label = u"%s (%s) %s [%s]" % (
+ annee,
+ poste.implantation.nom_court,
+ nom,
+ #poste.type_poste.categorie_emploi.nom,
+ poste.id,
)
- except:
- label = unicode(poste)
return label
return cleaned_data
-class ChoosePosteForm(forms.ModelForm):
+class ChoosePosteForm(forms.Form):
class Meta:
- model = dae.Poste
fields = ('poste',)
# La liste des choix est laissée vide. Voir PosteForm.__init__.
- poste = forms.ChoiceField(choices=(), required=False)
+ postes_dae = forms.ChoiceField(choices=(), required=False)
+ postes_rh = forms.ChoiceField(choices=(), required=False)
def __init__(self, request=None, *args, **kwargs):
super(ChoosePosteForm, self).__init__(*args, **kwargs)
- self.fields['poste'].choices = self._poste_choices(request)
+ self.fields['postes_dae'].choices = self._poste_dae_choices(request)
+ self.fields['postes_rh'].choices = self._poste_rh_choices(request)
- def _poste_choices(self, request):
- """ Menu déroulant pour les postes. """
- dae_ = dae.Poste.objects.ma_region_ou_service(request.user) \
- .filter(id_rh__isnull=True)
- copies = dae.Poste.objects.ma_region_ou_service(request.user) \
- .exclude(id_rh__isnull=True)
+ def _poste_dae_choices(self, request):
+ """ Menu déroulant pour les postes."""
+ postes_dae = dae.Poste.objects.ma_region_ou_service(request.user) \
+ .exclude(etat__in=(POSTE_ETAT_FINALISE, )) \
+ .annotate(num_dae=Count('dae_dossiers')) \
+ .filter(num_dae=0) \
+ .order_by('implantation', '-date_debut', )
return [('', '----------')] + \
- sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies],
- key=lambda t: t[1])
+ [('dae-%s' % p.id, label_poste_display(p)) for p in postes_dae]
+ def _poste_rh_choices(self, request):
+ """ Menu déroulant pour les postes."""
+ postes_dae = dae.Poste.objects.exclude(etat__in=(POSTE_ETAT_FINALISE, ))
+ id_poste_dae_commences = [p.id_rh_id for p in postes_dae if p.id_rh is not None]
+ postes_rh = rh.Poste.objects.ma_region_ou_service(request.user) \
+ .exclude(id__in=id_poste_dae_commences) \
+ .order_by('implantation', '-date_debut', )
+
+ return [('', '----------')] + \
+ [('rh-%s' % p.id, label_poste_display(p)) for p in postes_rh]
+
+ def clean(self):
+ cleaned_data = super(ChoosePosteForm, self).clean()
+ postes_dae = cleaned_data.get("postes_dae")
+ postes_rh = cleaned_data.get("postes_rh")
+ if (postes_dae is u"" and postes_rh is u"") or \
+ (postes_dae is not u"" and postes_rh is not u""):
+ raise forms.ValidationError("Choisissez un poste DAE ou un poste RH")
+ return cleaned_data
+
+ def redirect(self):
+ poste_dae_key = self.cleaned_data.get("postes_dae")
+ if poste_dae_key is not u"":
+ return redirect(reverse('embauche', args=(poste_dae_key,)))
+ poste_rh_key = self.cleaned_data.get("postes_rh")
+ if poste_rh_key is not u"":
+ return redirect("%s?creer_dossier_dae='M'" % reverse('poste', args=(poste_rh_key,)))
class EmployeForm(forms.ModelForm):
""" Formulaire des employés. """
def save(self):
super(DossierWorkflowForm, self).save()
poste = self.instance.poste
- if poste.etat == self._etat_initial:
- poste.etat = self.instance.etat
- poste.save()
+
+ # créer le commentaire automatique pour le poste associé
+ commentaire = WorkflowCommentaire()
+ commentaire.content_object = poste
+ texte = u"Validation automatique à travers le dossier [%s] de %s\n%s" %(
+ self.instance.id,
+ self.instance,
+ self.data.get('commentaire', ''),
+ )
+ commentaire.texte = texte
+ commentaire.etat_initial = self.instance._etat_courant
+ commentaire.etat_final = self.instance.etat
+ commentaire.owner = self.request.user
+ commentaire.save()
+
+ # force l'état du poste
+ poste.etat = self.instance.etat
+ poste.save()
class ContratForm(forms.ModelForm):
dae_numerisee_rh = dossier_rh.rh_dossierpieces.create(
nom=u'DAE numérisée'
)
- dae_numerisee_rh.fichier.save(
- os.path.basename(self.dae_numerisee.name),
- self.dae_numerisee
- )
+ if not settings.DEBUG:
+ dae_numerisee_rh.fichier.save(
+ os.path.basename(self.dae_numerisee.name),
+ self.dae_numerisee
+ )
# Fermer les rémunérations qui commencent avant le début du contrat
dossier_rh.rh_remunerations.filter(
{% extends 'base.html' %}
-{% load adminmedia %}
+{% load adminmedia dae %}
{% block title %}RH - DAE - Embauche{% endblock %}
{% block titre %}Ressources humaines{% endblock %}
{% block extrahead %}
<script src="{{ STATIC_URL }}js/jquery-1.5.1.min.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/dae.css" />
- <script src="{{ STATIC_URL }}js/dae.js" type="text/javascript"></script>
- <script src="{{ STATIC_URL }}js/dae-embauche.js" type="text/javascript"></script>
+ <script src="{{ STATIC_URL }}js/dae-choisir-poste.js" type="text/javascript"></script>
{% endblock %}
{% block main %}
<h1>Demande d'autorisation d'engagement de personnel</h1>
+
+ <h2 class="section">SECTION 1 - POSTE</h2>
+
+<form action="{% url poste %}" method="get">
+ <ul>
+ <li>
+ <h3>Créer un nouveau poste pour cette DAE</h3>
+ <input type="hidden" value="N" name="creer_dossier_dae"/>
+ <p><input type="submit" value="Créer le poste, puis la DAE" /></p>
+ </li>
+ </ul>
+</form>
+
<form action="" method="post" enctype="multipart/form-data">
- <h2 class="section">SECTION 1 - POSTE</h2>
- <fieldset>
- <h2>Poste visé</h2>
-
- <table cellspacing="0">
- {{ form.as_table }}
- </table>
- </fieldset>
+<ul>
+ <li>
+ <h3>Poste existant, ayant fait l'objet d'une validation dans DAE</h3>
+ {{ form.non_field_errors }}
+ <div class="selectlist">
+ {% if request.user|test_membre_drh %}
+ <span class="info">Filter la liste selon une expression : </span><input type="text" />
+ <span class="info"> puis appuyer sur TAB</span>
+ {% endif %}
+ <div>{{ form.postes_dae }}</div>
+ </div>
+ <p><input type="submit" value="Créer la DAE" /></p>
+ </li>
+
+ <li>
+ <h3>Poste existant, déjà dans le SGRH</h3>
+ <div class="selectlist">
+ {% if request.user|test_membre_drh %}
+ <span class="info">Filter la liste selon une expression : </span><input type="text" />
+ <span class="info"> puis appuyer sur TAB</span>
+ {% endif %}
+ <div>{{ form.postes_rh }}</div>
+ </div>
+ <p><input type="submit" value="Créer la DAE" /></p>
+ </li>
+</ul>
</form>
+
{% endblock %}
<h1 class="gauche">Demande d'autorisation d'engagement de personnel</h1>
<a class="droite bouton-action" href="#" onclick="window.print(); return false;">Impression</a>
{% if dossier|est_editable:request.user %}
-<a class="droite bouton-action" href="{% url embauche dossier.poste.key dossier.id %}">Modifier</a>
+<a class="droite bouton-action" href="{% url embauche dossier.poste.key dossier.id %}">Modifier le dossier</a>
+{% endif %}
+{% if dossier.poste|est_editable:request.user %}
+<a class="droite bouton-action" href="{% url poste dossier.poste.key %}">Modifier le poste</a>
{% endif %}
{% if importer and not dossier.dossier_rh %}
<a class="droite bouton-action" href="{% url embauche_importer dossier.id %}">Importer</a>
{% endblock %}
{% block main %}
-<h1>Demande d'autorisation de création de poste</h1>
+
+{% if creer_dossier_dae %}
+ <h1>Demande d'autorisation d'engagement de personnel</h1>
+ <h2 class="section">SECTION 1 - POSTE</h2>
+{% else %}
+ <h1>Demande d'autorisation de création de poste</h1>
+{% endif %}
<form action="" method="post" enctype="multipart/form-data">
<tr>
<th>{{ form.responsable.label_tag }} :<br />{{ form.responsable.errors }}</th>
<td>
- <span class="info">Recherche intelligente : vous pouvez tapez le nom du poste, ou encore la dernière qui occupe celui-ci. Assurez-vous que le poste de responsable choisi dans la liste est reporté en dessous du champs de recherche, cela signifie qu'il est sélectionné.</span>
+ <span class="info">Recherche intelligente : vous pouvez tapez
+ le nom du poste, ou encore la personne qui occupe celui-ci. Assurez-vous que le poste de responsable choisi dans la liste est reporté en dessous du champs de recherche, cela signifie qu'il est sélectionné.</span>
{{ form.responsable }}
</td>
</tr>
</div>
</fieldset>
- <input type="submit" name="continue" value="Sauvegarder (et ajouter des lignes)" />
- <input type="submit" name="save" value="Sauvegarder" />
+ {% if creer_dossier_dae %}
+ <input type="submit" name="save" value="Créer ce poste et une embauche associée" />
+ {% else %}
+ <input type="submit" name="continue" value="Sauvegarder (et ajouter des lignes)" />
+ <input type="submit" name="save" value="Sauvegarder" />
+ {% endif %}
</form>
{% endfor %}
</table>
+{% if not poste.dae_dossiers.all %}
<form action="" method="post">
<h2>Votre validation</h2>
<p>Le poste est actuellement à l'état : <span class="note">{{ poste.get_etat_display }}</span>.</p>
</table>
{{ validationForm.get_input_etats_as_buttons|safe }}
</form>
+{% endif %}
+
</fieldset>
+
<div class="print-only">
<h2>Signatures</h2>
<p class="signature"> ____________________________________________________________</p>
from django.contrib.auth.decorators import login_required, user_passes_test
from django.contrib.contenttypes.models import ContentType
from django.core.paginator import Paginator, InvalidPage
-from django.db.models import Q
+from django.db.models import Q, Count
from django.http import Http404, HttpResponse, HttpResponseNotFound
from django.shortcuts import redirect, render, get_object_or_404
from sendfile import sendfile
il est automatiquement copié dans dae.
"""
+ if 'creer_dossier_dae' in request.GET:
+ creer_dossier_dae = True
+ else:
+ creer_dossier_dae = False
def _dupliquer_poste(poste_dae, poste_rh):
"""
# Type intervention
if 'type_intervention' in request.GET:
data['type_intervention'] = request.GET['type_intervention']
+ if creer_dossier_dae:
+ data['type_intervention'] = request.GET['creer_dossier_dae']
# Poste existant
poste_rh = None
request, messages.SUCCESS,
"Le poste %s a été sauvegardé." % poste
)
+ if creer_dossier_dae:
+ return redirect('embauche', key='dae-%s' % poste.id)
+
if 'save' in request.POST:
return redirect('poste_consulter', key='dae-%s' % poste.id)
else:
financementForm=financementForm,
comparaisons_formset=comparaisons_formset,
poste_rh=poste_rh,
+ creer_dossier_dae=creer_dossier_dae,
))
return render(request, 'dae/poste.html', vars)
content_type.id
)}
postes_a_traiter = dae.Poste.objects.mes_choses_a_faire(request.user) \
+ .annotate(num_dae=Count('dae_dossiers')) \
+ .filter(num_dae=0) \
.extra(select=extra_select).order_by('-id')
postes_en_cours = dae.Poste.objects.ma_region_ou_service(request.user) \
+ .annotate(num_dae=Count('dae_dossiers')) \
+ .filter(num_dae=0) \
.extra(select=extra_select) \
.filter(~Q(etat=POSTE_ETAT_FINALISE)) \
.order_by('-id')
@dae_groupe_requis
def embauche_choisir_poste(request):
+ if request.POST:
+ form = ChoosePosteForm(data=request.POST, request=request)
+ if form.is_valid():
+ return form.redirect()
+ else:
+ form = ChoosePosteForm(request=request)
c = {
- 'form': ChoosePosteForm(request=request),
+ 'form': form,
}
return render(request, 'dae/embauche-choisir-poste.html', c)