[#2243] Contrats d'embauche
authorEric Mc Sween <eric.mcsween@auf.org>
Wed, 2 Nov 2011 19:31:14 +0000 (15:31 -0400)
committerEric Mc Sween <eric.mcsween@auf.org>
Wed, 2 Nov 2011 19:31:14 +0000 (15:31 -0400)
13 files changed:
project/dae/decorators.py
project/dae/forms.py
project/dae/migrations/0055_auto__add_contrat.py [new file with mode: 0644]
project/dae/models.py
project/dae/templates/dae/contrat-supprimer.html [new file with mode: 0644]
project/dae/templates/dae/contrats.html [new file with mode: 0644]
project/dae/templates/dae/embauche-ajouter-contrat.html [new file with mode: 0644]
project/dae/templates/dae/embauche.html
project/dae/templates/dae/embauche_consulter.html
project/dae/templatetags/dae.py
project/dae/urls.py
project/dae/views.py
project/dae/workflow.py

index 0e4b20b..ac36918 100644 (file)
@@ -5,7 +5,8 @@ from django.contrib import messages
 from django.contrib.auth.decorators import user_passes_test
 from django.core.urlresolvers import reverse
 from django.http import HttpResponseRedirect
-from workflow import dae_groupes, ETATS_EDITABLE, grp_drh
+from django.shortcuts import get_object_or_404
+from workflow import dae_groupes, ETATS_EDITABLE, ETATS_VALIDE, grp_drh
 from project.dae import models as dae
 from project.rh_v1 import models as rh
 from utils import get_employe_from_user
@@ -32,7 +33,6 @@ def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"):
   messages.add_message(request, messages.ERROR, "Votre compte ne permet pas d'accéder à cette partie de l'application.")
   return HttpResponseRedirect('%s?%s=%s' % tup)
 
-
 def dae_groupe_requis(fn):
     """
     L'accès à la plateforme nécessite d'appartenir au moins à un groupe,
@@ -49,7 +49,6 @@ def dae_groupe_requis(fn):
             return redirect_interdiction(request, msg)
     return inner
 
-
 def poste_dans_ma_region_ou_service(fn):
     """
     Test si le user connecté appartient bien à la même région ou service que le poste.
@@ -80,7 +79,6 @@ def poste_dans_ma_region_ou_service(fn):
             return redirect_interdiction(request, msg)
     return inner
 
-
 def dossier_dans_ma_region_ou_service(fn):
     """
     Test si le user connecté appartient bien à la même région ou service que le poste.
@@ -155,7 +153,7 @@ def employe_dans_ma_region_ou_service(fn):
         else :
             msg = u"Vous n'avez pas le droit de consulter cet employé."
             return redirect_interdiction(request, msg)
-        
+
     return inner
 
 def dossier_est_modifiable(fn):
@@ -163,8 +161,9 @@ def dossier_est_modifiable(fn):
         dossier_id = kwargs.get('dossier_id', None)
         if dossier_id is not None:
             dossier = dae.Dossier.objects.get(id=dossier_id)
-            if grp_drh not in request.user.groups.all() and \
-               (dossier.etat not in ETATS_EDITABLE or dossier not in dae.Dossier.objects.mes_choses_a_faire(request.user).all()):
+            if not (dossier.etat in ETATS_EDITABLE and
+                    (grp_drh in request.user.groups.all() or
+                     dossier in dae.Dossier.objects.mes_choses_a_faire(request.user).all())):
                 msg = u"Ce dossier d'embauche ne peut plus être modifié."
                 return redirect_interdiction(request, msg)
         return fn(request, *args, **kwargs)
@@ -183,3 +182,17 @@ def poste_est_modifiable(fn):
 
         return fn(request, *args, **kwargs)
     return inner
+
+def get_contrat(fn):
+    """Ce décorateur s'attend à ce que le premier argument de la vue décorée
+       soit l'ID d'un contrat. Il vérifie les permissions, puis transforme
+       l'ID en objet Contrat."""
+    def inner(request, contrat_id, *args, **kwargs):
+        contrat = get_object_or_404(dae.Contrat, pk=contrat_id)
+        dossier = contrat.dossier
+        if not (dossier.etat in ETATS_VALIDE and
+                (grp_drh in request.user.groups.all() or
+                 dossier in dae.Dossier.objects.mes_choses_a_faire(request.user).all())):
+            return redirect_interdiction(request)
+        return fn(request, contrat, *args, **kwargs)
+    return inner
index ee96d58..f677d0b 100644 (file)
@@ -3,7 +3,7 @@
 from django.db.models import Q, Max
 from django import forms
 from django.forms.models import inlineformset_factory
-from django.contrib.admin import widgets as admin_widgets 
+from django.contrib.admin import widgets as admin_widgets
 from ajax_select.fields import AutoCompleteSelectField
 from auf.django.workflow.forms import WorkflowFormMixin
 from datamaster_modeles import models as ref
@@ -312,7 +312,7 @@ class PosteWorkflowForm(WorkflowFormMixin):
     class Meta:
         fields = ('etat', )
         model = dae.Poste
-   
+
     def __init__(self, *args, **kwargs):
         super(PosteWorkflowForm, self).__init__(*args, **kwargs)
         self.fields['etat'].help_text = WF_HELP_TEXT
@@ -321,7 +321,7 @@ class PosteWorkflowForm(WorkflowFormMixin):
 class DossierWorkflowForm(WorkflowFormMixin):
     bouton_libelles = POSTE_ETATS_BOUTONS # meme workflow que poste...
     class Meta:
-        fields = ('etat', )
+        fields = ('etat', 'contrat')
         model = dae.Dossier
 
     def __init__(self, *args, **kwargs):
@@ -335,3 +335,10 @@ class DossierWorkflowForm(WorkflowFormMixin):
         if poste.etat == self._etat_initial:
             poste.etat = self.instance.etat
             poste.save()
+
+class ContratForm(forms.ModelForm):
+
+    class Meta:
+        fields = ('type', 'fichier')
+        model = dae.Contrat
+
diff --git a/project/dae/migrations/0055_auto__add_contrat.py b/project/dae/migrations/0055_auto__add_contrat.py
new file mode 100644 (file)
index 0000000..0092ba9
--- /dev/null
@@ -0,0 +1,436 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+    
+    def forwards(self, orm):
+        
+        # Adding model 'Contrat'
+        db.create_table('dae_contrat', (
+            ('dossier', self.gf('django.db.models.fields.related.ForeignKey')(related_name='contrats', to=orm['dae.Dossier'])),
+            ('fichier', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
+            ('type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['rh_v1.TypeContrat'])),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+        ))
+        db.send_create_signal('dae', ['Contrat'])
+    
+    
+    def backwards(self, orm):
+        
+        # Deleting model 'Contrat'
+        db.delete_table('dae_contrat')
+    
+    
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'dae.contrat': {
+            'Meta': {'object_name': 'Contrat'},
+            'dossier': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contrats'", 'to': "orm['dae.Dossier']"}),
+            'fichier': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['rh_v1.TypeContrat']"})
+        },
+        'dae.dossier': {
+            'Meta': {'object_name': 'Dossier'},
+            'classement': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Classement']"}),
+            'classement_anterieur': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Classement']"}),
+            'classement_titulaire_anterieur': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Classement']"}),
+            'compte_compta': ('django.db.models.fields.CharField', [], {'default': "'aucun'", 'max_length': '10'}),
+            'compte_courriel': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'contrat_date_debut': ('django.db.models.fields.DateField', [], {}),
+            'contrat_date_fin': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'devise': ('django.db.models.fields.related.ForeignKey', [], {'default': '5', 'related_name': "'+'", 'to': "orm['rh_v1.Devise']"}),
+            'devise_anterieur': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Devise']"}),
+            'devise_titulaire_anterieur': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Devise']"}),
+            'employe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['dae.Employe']"}),
+            'employe_anterieur': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Employe']"}),
+            'etat': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'justif_nouveau_commentaire': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'justif_nouveau_salaire': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'justif_nouveau_statut': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'justif_nouveau_tmp_remplacement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'justif_rempl_commentaire': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'justif_rempl_evaluation': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'justif_rempl_salaire': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'justif_rempl_statut_employe': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'justif_rempl_type_contrat': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'organisme_bstg': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.OrganismeBstg']"}),
+            'organisme_bstg_autre': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'poste': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dossiers'", 'to': "orm['dae.Poste']"}),
+            'regime_travail': ('django.db.models.fields.DecimalField', [], {'default': '100.0', 'max_digits': '12', 'decimal_places': '2'}),
+            'regime_travail_nb_heure_semaine': ('django.db.models.fields.DecimalField', [], {'default': '35.0', 'max_digits': '12', 'decimal_places': '2'}),
+            'remplacement': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'salaire': ('django.db.models.fields.DecimalField', [], {'default': 'None', 'null': 'True', 'max_digits': '12', 'decimal_places': '2'}),
+            'salaire_anterieur': ('django.db.models.fields.DecimalField', [], {'default': 'None', 'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'salaire_titulaire_anterieur': ('django.db.models.fields.DecimalField', [], {'default': 'None', 'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'statut': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['rh_v1.Statut']"}),
+            'statut_anterieur': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Statut']"}),
+            'statut_residence': ('django.db.models.fields.CharField', [], {'default': "'local'", 'max_length': '10'}),
+            'statut_titulaire_anterieur': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Statut']"}),
+            'type_contrat': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['rh_v1.TypeContrat']"}),
+            'type_contrat_anterieur': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.TypeContrat']"})
+        },
+        'dae.dossiercomparaison': {
+            'Meta': {'object_name': 'DossierComparaison'},
+            'classement': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Classement']"}),
+            'devise': ('django.db.models.fields.related.ForeignKey', [], {'default': '5', 'related_name': "'+'", 'null': 'True', 'blank': 'True', 'to': "orm['rh_v1.Devise']"}),
+            'dossier': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comparaisons'", 'to': "orm['dae.Dossier']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'implantation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Implantation']", 'null': 'True', 'blank': 'True'}),
+            'montant': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+            'personne': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'poste': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'statut': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Statut']"})
+        },
+        'dae.dossierpiece': {
+            'Meta': {'object_name': 'DossierPiece'},
+            'dossier': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dae.Dossier']"}),
+            'fichier': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'dae.employe': {
+            'Meta': {'object_name': 'Employe'},
+            'genre': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'id_rh': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Employe']"}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'prenom': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'dae.poste': {
+            'Meta': {'object_name': 'Poste'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'appel': ('django.db.models.fields.CharField', [], {'default': "'interne'", 'max_length': '10'}),
+            'autre_max': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
+            'autre_min': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
+            'charges_patronales_max': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
+            'charges_patronales_min': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
+            'classement_max': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Classement']"}),
+            'classement_min': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Classement']"}),
+            'comp_autre_max': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'comp_autre_min': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'comp_fonctionpub_max': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'comp_fonctionpub_min': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'comp_locale_max': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'comp_locale_min': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'comp_ong_max': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'comp_ong_min': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'comp_universite_max': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'comp_universite_min': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2', 'blank': 'True'}),
+            'date_creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'date_debut': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_fin': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'devise_comparaison': ('django.db.models.fields.related.ForeignKey', [], {'default': '5', 'related_name': "'+'", 'to': "orm['rh_v1.Devise']"}),
+            'devise_max': ('django.db.models.fields.related.ForeignKey', [], {'default': '5', 'related_name': "'+'", 'to': "orm['rh_v1.Devise']"}),
+            'devise_min': ('django.db.models.fields.related.ForeignKey', [], {'default': '5', 'related_name': "'+'", 'to': "orm['rh_v1.Devise']"}),
+            'etat': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'expatrie': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'id_rh': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Poste']"}),
+            'implantation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Implantation']"}),
+            'indemn_expat_max': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
+            'indemn_expat_min': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
+            'indemn_fct_max': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
+            'indemn_fct_min': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
+            'justification': ('django.db.models.fields.TextField', [], {}),
+            'local': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'mise_a_disposition': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'regime_travail': ('django.db.models.fields.DecimalField', [], {'default': '100.0', 'max_digits': '12', 'decimal_places': '2'}),
+            'regime_travail_nb_heure_semaine': ('django.db.models.fields.DecimalField', [], {'default': '35.0', 'max_digits': '12', 'decimal_places': '2'}),
+            'responsable': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['rh_v1.Poste']"}),
+            'salaire_max': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
+            'salaire_min': ('django.db.models.fields.DecimalField', [], {'default': '0', 'max_digits': '12', 'decimal_places': '2'}),
+            'service': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['rh_v1.Service']"}),
+            'type_intervention': ('django.db.models.fields.CharField', [], {'default': "'N'", 'max_length': '1'}),
+            'type_poste': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.TypePoste']"}),
+            'valeur_point_max': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.ValeurPoint']"}),
+            'valeur_point_min': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.ValeurPoint']"})
+        },
+        'dae.postecomparaison': {
+            'Meta': {'object_name': 'PosteComparaison'},
+            'classement': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Classement']"}),
+            'devise': ('django.db.models.fields.related.ForeignKey', [], {'default': '5', 'related_name': "'+'", 'null': 'True', 'blank': 'True', 'to': "orm['rh_v1.Devise']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'implantation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Implantation']", 'null': 'True', 'blank': 'True'}),
+            'montant': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'poste': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comparaisons_internes'", 'to': "orm['dae.Poste']"}),
+            'statut': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['rh_v1.Statut']"})
+        },
+        'dae.postefinancement': {
+            'Meta': {'object_name': 'PosteFinancement'},
+            'commentaire': ('django.db.models.fields.TextField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'poste': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'financements'", 'to': "orm['dae.Poste']"}),
+            'pourcentage': ('django.db.models.fields.DecimalField', [], {'max_digits': '12', 'decimal_places': '2'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'})
+        },
+        'dae.postepiece': {
+            'Meta': {'object_name': 'PostePiece'},
+            'fichier': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'poste': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dae.Poste']"})
+        },
+        'dae.remuneration': {
+            'Meta': {'object_name': 'Remuneration'},
+            'date_creation': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'devise': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to_field': "'code'", 'db_column': "'devise'", 'to': "orm['rh_v1.Devise']"}),
+            'dossier': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dae.Dossier']", 'db_column': "'dossier'"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'montant': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '12', 'decimal_places': '2'}),
+            'precision': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'db_column': "'type'", 'to': "orm['rh_v1.TypeRemuneration']"}),
+            'user_creation': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'})
+        },
+        'datamaster_modeles.bureau': {
+            'Meta': {'object_name': 'Bureau', 'db_table': "u'ref_bureau'"},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'implantation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Implantation']", 'db_column': "'implantation'"}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'nom_court': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'nom_long': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'region': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Region']", 'db_column': "'region'"})
+        },
+        'datamaster_modeles.implantation': {
+            'Meta': {'object_name': 'Implantation', 'db_table': "u'ref_implantation'"},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'adresse_physique_bureau': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'adresse_physique_code_postal': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'adresse_physique_code_postal_avant_ville': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'adresse_physique_no': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'adresse_physique_pays': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'impl_adresse_physique'", 'to_field': "'code'", 'db_column': "'adresse_physique_pays'", 'to': "orm['datamaster_modeles.Pays']"}),
+            'adresse_physique_precision': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'adresse_physique_precision_avant': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'adresse_physique_region': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'adresse_physique_rue': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'adresse_physique_ville': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'adresse_postale_boite_postale': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_bureau': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_code_postal': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_code_postal_avant_ville': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'adresse_postale_no': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_pays': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'impl_adresse_postale'", 'to_field': "'code'", 'db_column': "'adresse_postale_pays'", 'to': "orm['datamaster_modeles.Pays']"}),
+            'adresse_postale_precision': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_precision_avant': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_region': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_rue': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'adresse_postale_ville': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'bureau_rattachement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Implantation']", 'db_column': "'bureau_rattachement'"}),
+            'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'code_meteo': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'commentaire': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'courriel': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'courriel_interne': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'date_extension': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_fermeture': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_inauguration': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_ouverture': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'fax': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'fax_interne': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'fuseau_horaire': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'hebergement_convention': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+            'hebergement_convention_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'hebergement_etablissement': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'modif_date': ('django.db.models.fields.DateField', [], {}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'nom_court': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'nom_long': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'region': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Region']", 'db_column': "'region'"}),
+            'remarque': ('django.db.models.fields.TextField', [], {}),
+            'responsable_implantation': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'statut': ('django.db.models.fields.IntegerField', [], {}),
+            'telephone': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'telephone_interne': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'url': ('django.db.models.fields.URLField', [], {'max_length': '255', 'blank': 'True'})
+        },
+        'datamaster_modeles.pays': {
+            'Meta': {'object_name': 'Pays', 'db_table': "u'ref_pays'"},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '2'}),
+            'code_bureau': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Bureau']", 'to_field': "'code'", 'db_column': "'code_bureau'"}),
+            'code_iso3': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3', 'blank': 'True'}),
+            'developpement': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'monnaie': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'nord_sud': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'region': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['datamaster_modeles.Region']", 'db_column': "'region'"})
+        },
+        'datamaster_modeles.region': {
+            'Meta': {'object_name': 'Region', 'db_table': "u'ref_region'"},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'implantation_bureau': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'gere_region'", 'db_column': "'implantation_bureau'", 'to': "orm['datamaster_modeles.Implantation']"}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'rh_v1.classement': {
+            'Meta': {'object_name': 'Classement'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'coefficient': ('django.db.models.fields.FloatField', [], {}),
+            'commentaire': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'date_modification': ('django.db.models.fields.DateField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'degre': ('django.db.models.fields.IntegerField', [], {}),
+            'echelon': ('django.db.models.fields.IntegerField', [], {}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '10'})
+        },
+        'rh_v1.devise': {
+            'Meta': {'object_name': 'Devise'},
+            'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '10'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'rh_v1.employe': {
+            'Meta': {'object_name': 'Employe'},
+            'adresse': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'code_postal': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'commentaire': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'date_creation': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'date_entree': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'date_maj': ('django.db.models.fields.DateField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'date_naissance': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+            'genre': ('django.db.models.fields.CharField', [], {'max_length': '1', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'nationalite': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'nationalite'", 'to_field': "'code'", 'db_column': "'nationalite'", 'to': "orm['datamaster_modeles.Pays']"}),
+            'no_rue': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'pays': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pays'", 'db_column': "'pays'", 'to_field': "'code'", 'to': "orm['datamaster_modeles.Pays']", 'blank': 'True', 'null': 'True'}),
+            'prenom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'province': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'situation_famille': ('django.db.models.fields.CharField', [], {'max_length': '1', 'null': 'True', 'blank': 'True'}),
+            'tel_cellulaire': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'tel_domicile': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'ville': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
+        },
+        'rh_v1.familleemploi': {
+            'Meta': {'object_name': 'FamilleEmploi'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'rh_v1.organismebstg': {
+            'Meta': {'object_name': 'OrganismeBstg'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '10'})
+        },
+        'rh_v1.poste': {
+            'Meta': {'object_name': 'Poste'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'date_modification': ('django.db.models.fields.DateField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'implantation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'db_column': "'implantation'", 'to': "orm['datamaster_modeles.Implantation']"}),
+            'proportion': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
+            'type_poste': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rh_v1.TypePoste']", 'db_column': "'type_poste'"})
+        },
+        'rh_v1.service': {
+            'Meta': {'object_name': 'Service'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'rh_v1.statut': {
+            'Meta': {'object_name': 'Statut'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '25'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'type_contrat_categorie': ('django.db.models.fields.CharField', [], {'max_length': '10'})
+        },
+        'rh_v1.typecontrat': {
+            'Meta': {'object_name': 'TypeContrat'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'categorie': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'nom_long': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'rh_v1.typeposte': {
+            'Meta': {'object_name': 'TypePoste'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'date_modification': ('django.db.models.fields.DateField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'famille_emploi': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rh_v1.FamilleEmploi']", 'db_column': "'famille_emploi'"}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'is_responsable': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'nom_feminin': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'rh_v1.typeremuneration': {
+            'Meta': {'object_name': 'TypeRemuneration'},
+            'actif': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'nature_remuneration': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
+            'nom': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'type_paiement': ('django.db.models.fields.CharField', [], {'max_length': '30'})
+        },
+        'rh_v1.valeurpoint': {
+            'Meta': {'object_name': 'ValeurPoint'},
+            'annee': ('django.db.models.fields.IntegerField', [], {}),
+            'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'implantation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'valeurs_point'", 'db_column': "'implantation'", 'to': "orm['datamaster_modeles.Implantation']"}),
+            'valeur': ('django.db.models.fields.FloatField', [], {})
+        },
+        'workflow.workflowcommentaire': {
+            'Meta': {'object_name': 'WorkflowCommentaire'},
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'etat_final': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'etat_initial': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+            'texte': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
+        }
+    }
+    
+    complete_apps = ['dae']
index b5fb517..feae66d 100644 (file)
@@ -6,7 +6,8 @@ from django.core.files.storage import FileSystemStorage
 from django.db import models
 import reversion
 from workflow import PosteWorkflow, DossierWorkflow
-from workflow import DOSSIER_ETAT_DRH_FINALISATION
+from workflow import DOSSIER_ETAT_DRH_FINALISATION, DOSSIER_ETAT_REGION_FINALISATION, \
+                     DOSSIER_ETAT_FINALISE
 from managers import DossierManager, PosteManager
 import datamaster_modeles.models as ref
 from rh_v1 import models as rh
@@ -678,6 +679,11 @@ class Dossier(DossierWorkflow, models.Model):
             total += r.montant_euro()
         return total
 
+    def valide(self):
+        return self.etat in (DOSSIER_ETAT_REGION_FINALISATION,
+                             DOSSIER_ETAT_DRH_FINALISATION,
+                             DOSSIER_ETAT_FINALISE)
+
 
 # Tester l'enregistrement car les models.py sont importés au complet
 if not reversion.is_registered(Dossier):
@@ -758,7 +764,7 @@ class Remuneration(models.Model):
 ### CONTRATS
 
 class Contrat(models.Model):
-    dossier = models.ForeignKey(Dossier)
+    dossier = models.ForeignKey(Dossier, related_name='contrats')
     type = models.ForeignKey(rh.TypeContrat, related_name='+')
     fichier = models.FileField(upload_to='dae/contrats', storage=UPLOAD_STORAGE)
 
diff --git a/project/dae/templates/dae/contrat-supprimer.html b/project/dae/templates/dae/contrat-supprimer.html
new file mode 100644 (file)
index 0000000..7cc98c5
--- /dev/null
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+{% load adminmedia %}
+
+{% block title %}RH - DAE - Embauche{% endblock %}
+{% block titre %}Ressources humaines{% endblock %}
+{% block sous_titre %}Demande d'autorisation d'engagement{% endblock %}
+
+{% block main %}
+<h1>Supprimer un contrat</h1>
+
+<form action="" method="post">
+  <p>Voulez-vous vraiment supprimer le contrat "{{ contrat.fichier.name }}"?</p>
+  <input type="submit" name="oui" value="Oui" />
+  <input type="submit" name="non" value="Non" />
+</form>
+{% endblock %}
diff --git a/project/dae/templates/dae/contrats.html b/project/dae/templates/dae/contrats.html
new file mode 100644 (file)
index 0000000..f413c56
--- /dev/null
@@ -0,0 +1,36 @@
+{% extends 'base.html' %}
+{% load adminmedia %}
+
+{% block title %}RH - DAE - Embauche{% endblock %}
+{% block titre %}Ressources humaines{% endblock %}
+{% block sous_titre %}Demande d'autorisation d'engagement{% endblock %}
+
+{% block main %}
+
+<h1>Contrats</h1>
+
+<form action="" method="post" enctype="multipart/form-data">
+  {{ contrats_formset.management_form }}
+  <table>
+    <thead>
+      <tr>
+        <th>Type</th>
+        <th>Fichier</th>
+        <th>Supprimer</th>
+      </tr>
+    </thead>
+    <tbody>
+      {% for form in contrats_formset.forms %}
+      <tr>
+        <td>{{ form.id }}{{ form.type }}{{ form.type.errors }}</td>
+        <td>{{ form.fichier }}{{ form.fichier.errors }}</td>
+        <td>{{ form.DELETE }}</td>
+        <td>{{ form.non_field_errors }}</td>
+      </tr>
+      {% endfor %}
+    </tbody>
+  </table>
+<input type="submit" name="continue" value="Sauvegarder (et ajouter des lignes)" />
+<input type="submit" name="save" value="Sauvegarder" />
+</form>
+{% endblock %}
diff --git a/project/dae/templates/dae/embauche-ajouter-contrat.html b/project/dae/templates/dae/embauche-ajouter-contrat.html
new file mode 100644 (file)
index 0000000..a84e8e5
--- /dev/null
@@ -0,0 +1,17 @@
+{% extends 'base.html' %}
+{% load adminmedia %}
+
+{% block title %}RH - DAE - Embauche{% endblock %}
+{% block titre %}Ressources humaines{% endblock %}
+{% block sous_titre %}Demande d'autorisation d'engagement{% endblock %}
+
+{% block main %}
+<h1>Ajouter un contrat</h1>
+
+<form action="" method="post" enctype="multipart/form-data">
+  <table>
+    {{ form }}
+  </table>
+  <input type="submit" value="Enregistrer" />
+</form>
+{% endblock %}
index df4a3d6..f8e3da4 100644 (file)
@@ -38,7 +38,7 @@
 <form action="" method="post" enctype="multipart/form-data">
     <h2 class="section">SECTION 1 - POSTE</h2>
     {% include 'dae/poste_resume.html' %}
-    
+
     <h2 class="section">SECTION 2 - PERSONNEL ENGAGÉ</h2>
     <fieldset>
     <div>
@@ -84,7 +84,7 @@
         </tbody>
     </table>
 
-    <input type="hidden" id="poste" name="poste" 
+    <input type="hidden" id="poste" name="poste"
                                     value="dae-{{ poste.id }}" />
     <input type="hidden" id="implantation" name="implantation"
                                     value="{{ poste.implantation_id }}" />
@@ -98,7 +98,7 @@
     {% for f in dossiersComparaisonsForm.management_form %}
         {{ f }}
     {% endfor %}
-    
+
     {% for f in dossiersComparaisonsForm.forms %}
         <table>
         {% for field in f %}
           <p class="info">CV, lettre de motivation...</p>
           {% include "dae/pieces.html" %}
       </fieldset>
-      
+
       <h2 class="section">SECTION 3 - COÛT GLOBAL</h2>
 
       <fieldset>
         </td>
       </tr>
       </table>
+
       <input type="submit" name="continue" value="Sauvegarder (et ajouter des lignes)" />
       <input type="submit" name="save" value="Sauvegarder" />
     </form>
index d7c85d3..1d80492 100644 (file)
@@ -12,7 +12,9 @@
 {% block main %}
 <h1 class="gauche">Demande d'autorisation d'engagement de personnel</h1>
 <a class="droite bouton-action" target="_blank" href="?mode=vpdf">Format impression</a>
-{% if dossier|est_editable:request.user %}<a class="droite bouton-action" href="{% url embauche dossier.poste.key dossier.id %}">Modifier</a>{% endif %}
+{% if dossier|est_editable:request.user %}
+<a class="droite bouton-action" href="{% url embauche dossier.poste.key dossier.id %}">Modifier</a>
+{% endif %}
 <div class="visualClear"></div>
 
 <h2 class="section">SECTION 1 - POSTE</h2>
 </tr>
 </table>
 
-<fieldset>
-<h2>Validations</h2>
+{% if dossier.valide %}
+<h2 class="section">CONTRATS</h2>
+
+<a class="droite bouton-action" href="{% url embauche_ajouter_contrat dossier_id=dossier.id %}"
+  >Ajouter un contrat</a>
+
+<table>
+  <thead>
+    <tr>
+      <th>Type</th>
+      <th>Fichier</th>
+      <th></th>
+    </tr>
+  </thead>
+  <tbody>
+    {% for contrat in dossier.contrats.all %}
+    <tr>
+      <td>{{ contrat.type }}</td>
+      <td><a href="{% url contrat contrat.id %}">{{ contrat.fichier.name }}</a></td>
+      <td><a href="{% url contrat_supprimer contrat.id %}">Supprimer</a></td>
+    </tr>
+    {% empty %}
+    <tr>
+      <td colspan="0">Aucun contrat pour l'instant</td>
+    </tr>
+    {% endfor %}
+  </tbody>
+</table>
+{% endif %}
+
+<h2 class="section">VALIDATIONS</h2>
 
 <table>
 <tr>
 </table>
 {{ validationForm.get_input_etats_as_buttons|safe }}
 </form>
-</fieldset>
-    
-{% endblock %}
 
+{% endblock %}
index 4244e29..08e2655 100644 (file)
@@ -21,7 +21,8 @@ def peut_ajouter(user):
 def est_editable(obj, user):
     klass = obj.__class__
     groupes_users = user.groups.all()
-    if (obj.etat in ETATS_EDITABLE and obj in klass.objects.mes_choses_a_faire(user).all()) or grp_drh in groupes_users:
+    if obj.etat in ETATS_EDITABLE and \
+       (obj in klass.objects.mes_choses_a_faire(user).all() or grp_drh in groupes_users):
         return True
     else:
         return False
index c25c55e..9ca7ec9 100644 (file)
@@ -19,6 +19,12 @@ urlpatterns = patterns(
     url(r'^embauche/(?P<key>.*)/(?P<dossier_id>.*)$', 'embauche', name='embauche'),
     url(r'^embauche/(?P<key>.*)$', 'embauche', name='embauche'),
 
+    # contrats
+    url(r'^embauches/(?P<dossier_id>\d+)/contrats/ajouter$', 'embauche_ajouter_contrat',
+        name='embauche_ajouter_contrat'),
+    url(r'^contrats/(\d+)$', 'contrat', name='contrat'),
+    url(r'^contrats/(\d+)/supprimer$', 'contrat_supprimer', name='contrat_supprimer'),
+
     # ajax
     url(r'^employe$', 'employe', name='employe'),
     url(r'^employe/(?P<key>.*)$', 'employe', name='employe'),
index 5d4320e..2076255 100644 (file)
@@ -31,9 +31,9 @@ from decorators import dae_groupe_requis, \
                        vieux_dossier_dans_ma_region_ou_service, \
                        employe_dans_ma_region_ou_service, \
                        dossier_est_modifiable, \
-                       poste_est_modifiable
+                       poste_est_modifiable, get_contrat
 from forms import *
-from workflow import POSTE_ETAT_DRH_FINALISATION
+from workflow import POSTE_ETAT_DRH_FINALISATION, ETATS_VALIDE
 from decorators import redirect_interdiction
 
 def devises():
@@ -186,7 +186,10 @@ def poste_piece(request, id):
     """Téléchargement d'une pièce jointe à un poste."""
     piece = get_object_or_404(dae.PostePiece, pk=id)
     if dae.Poste.objects.ma_region_ou_service(request.user).filter(id=piece.poste_id).exists():
-        return sendfile(request, piece.fichier.path, attachment=True)
+        return sendfile(
+            request, piece.fichier.path, attachment=True,
+            attachment_filename=os.path.basename(piece.fichier.name).encode('ascii', 'replace')
+        )
     else:
         return redirect_interdiction(request)
 
@@ -210,7 +213,7 @@ def embauche_consulter(request, dossier_id):
             return redirect('dae_embauches_liste')
     else:
         validationForm = DossierWorkflowForm(instance=dossier, request=request)
-    
+
     vars = {
         'dossier' : dossier,
         'validationForm' : validationForm,
@@ -290,10 +293,10 @@ def embauche(request, key=None, dossier_id=None):
                 return redirect('embauche_consulter', dossier_id=dossier.id)
             else:
                 return redirect('embauche', key=dossier.poste.key, dossier_id=dossier.id)
-                
+
         else:
             messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
-            
+
     else:
         # Initialisation d'un formulaire vide
         if dossier_id:
@@ -354,6 +357,44 @@ def employe(request, key):
 
     return HttpResponse(EmployeForm(initial=data, instance=employe, request=request).as_table())
 
+### CONTRATS
+
+@dae_groupe_requis
+@get_contrat
+def contrat(request, contrat):
+    return sendfile(
+        request, contrat.fichier.path, attachment=True,
+        attachment_filename=os.path.basename(contrat.fichier.name).encode('ascii', 'replace')
+    )
+
+@dae_groupe_requis
+@get_contrat
+def contrat_supprimer(request, contrat):
+    if request.method == 'POST':
+        if 'oui' in request.POST:
+            contrat.delete()
+        return redirect('embauche_consulter', dossier_id=contrat.dossier.id)
+    return render_to_response('dae/contrat-supprimer.html', {
+        'contrat': contrat
+    }, RequestContext(request))
+
+@dae_groupe_requis
+@dossier_dans_ma_region_ou_service
+def embauche_ajouter_contrat(request, dossier_id=None):
+    dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
+    if request.method == 'POST':
+        form = ContratForm(request.POST, request.FILES)
+        if form.is_valid():
+            contrat = form.save(commit=False)
+            contrat.dossier = dossier
+            contrat.save()
+            return redirect('embauche_consulter', dossier_id=dossier.id)
+    else:
+        form = ContratForm()
+    return render_to_response('dae/embauche-ajouter-contrat.html', {
+        'form': form
+    }, RequestContext(request))
+
 ################################################################################
 # AJAX SECURISE
 ################################################################################
@@ -369,7 +410,7 @@ def dossier(request, poste_key, employe_key):
     # Récupérer la devise de l'implantation lié au poste
     implantation_devise = poste.get_default_devise()
     data.update({'devise' : implantation_devise.id})
+
     if poste.id_rh_id is not None:
         poste_rh = get_object_or_404(rh.Poste, pk=poste.id_rh_id)
     else:
@@ -540,7 +581,7 @@ def liste_postes(request):
         dae_ = dae_.filter(implantation__id=implantation_id)
         copies = copies.filter(implantation__id=implantation_id)
         rh_postes_actifs = rh_postes_actifs.filter(implantation__id=implantation_id)
-   
+
     id_copies = [p.id_rh_id for p in copies.all()]
     rhv1 = rh_postes_actifs.exclude(id__in=id_copies)
     rhv1 = rhv1.select_related(depth=1)
@@ -553,7 +594,10 @@ def dossier_piece(request, id):
     """Téléchargement d'une pièce jointe à un poste."""
     piece = get_object_or_404(dae.DossierPiece, pk=id)
     if dae.Dossier.objects.ma_region_ou_service(request.user).filter(id=piece.dossier_id).exists():
-        return sendfile(request, piece.fichier.path, attachment=True)
+        return sendfile(
+            request, piece.fichier.path, attachment=True,
+            attachment_filename=os.path.basename(piece.fichier.name).encode('ascii', 'replace')
+        )
     else:
         return redirect_interdiction(request)
 
@@ -562,7 +606,7 @@ def dossier_piece(request, id):
 # AJAX SECURITE non nécessaire
 ################################################################################
 def coefficient(request):
-    """ Appel AJAX : 
+    """ Appel AJAX :
     input : classement
     output : coefficient
     """
@@ -600,7 +644,7 @@ def devise(request):
     else:
         return HttpResponseGone("Vous devez choisir une valeur de point")
     return HttpResponse(dumps(data))
-    
+
 def devise_code(request):
     """ Appel AJAX : 
     input : devise
index c38e52f..be73d26 100644 (file)
@@ -48,7 +48,9 @@ POSTE_ETAT_ACCIOR = 'ACCIOR'
 POSTE_ETAT_ABF = 'ABF'
 POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
 POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
+POSTE_ETAT_REGION_FINALISATION = 'REGION_FINALISATION'
 POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
+POSTE_ETAT_FINALISE = 'FINALISE'
 
 #codes actions
 POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
@@ -63,7 +65,9 @@ POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
 POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
+POSTE_ACTION_ENVOYER_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
 POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
+POSTE_ACTION_FINALISER = 'FINALISER'
 
 #libellés états
 POSTE_ETATS = {
@@ -77,7 +81,9 @@ POSTE_ETATS = {
     POSTE_ETAT_ABF : u"ABF",
     POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
     POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
-    POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH et région',
+    POSTE_ETAT_REGION_FINALISATION : u'Retour à la région',
+    POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH',
+    POSTE_ETAT_FINALISE : u'Finalisée'
     }
 
 #libellés états pour boutons
@@ -91,7 +97,9 @@ POSTE_ETATS_BOUTONS = {
     POSTE_ETAT_ABF : u"Envoyer à l&#39;ABF",
     POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
     POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
-    POSTE_ETAT_DRH_FINALISATION : u'Envoyer à la DRH (traitement)',
+    POSTE_ETAT_REGION_FINALISATION : u"Retourner à la région pour finalisation",
+    POSTE_ETAT_DRH_FINALISATION : u'Retourner à la DRH pour finalisation',
+    POSTE_ETAT_FINALISE : u'Finaliser'
     }
 
 # définition du worflow séquentiel
@@ -156,11 +164,21 @@ POSTE_ACTIONS = {
         'etat_initial' : (POSTE_ETAT_DEMANDE_JUSTIF,),
         'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
     },
-    POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
+    POSTE_ACTION_ENVOYER_REGION_FINALISATION : {
         'nom' : u'Envoyer',
         'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
+        'etat_final' : POSTE_ETAT_REGION_FINALISATION
+    },
+    POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
+        'nom' : u'Envoyer',
+        'etat_initial' : (POSTE_ETAT_REGION_FINALISATION,),
         'etat_final' : POSTE_ETAT_DRH_FINALISATION,
     },
+    POSTE_ACTION_FINALISER : {
+        'nom' : u'Finaliser',
+        'etat_initial' : (POSTE_ETAT_DRH_FINALISATION,),
+        'etat_final' : POSTE_ETAT_FINALISE
+    },
 }
 
 
@@ -222,6 +240,9 @@ class PosteWorkflow(WorkflowMixin):
                 return True
         return False
 
+    def acces_region_finalisation(self, action, request):
+        return self.acces_administrateur(action, request)
+
     def acces_drh_finalisation(self, action, request):
         for g in request.user.groups.all():
             if g in (grp_haute_direction, grp_drh, ):
@@ -238,6 +259,9 @@ class PosteWorkflow(WorkflowMixin):
     def acces_retour_demande_justif(self, action, request):
         return self.acces_haute_direction(action, request)
 
+    def acces_finaliser(self, action, request):
+        return self.acces_drh_finalisation(action, request)
+
 
 #codes actions
 DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
@@ -250,7 +274,9 @@ DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
 DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
 DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
 DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
+DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
 DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
+DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE
 
 class DossierWorkflow(PosteWorkflow):
 
@@ -260,11 +286,18 @@ class DossierWorkflow(PosteWorkflow):
 
 MAP_GROUPE_ETATS_A_FAIRE = {
     grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON, ),
-    grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS, DOSSIER_ETAT_SERVICE_UTILISATEURS,),
-    grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR, POSTE_ETAT_DEMANDE_MODIF,
-                           DOSSIER_ETAT_DEMANDE_MODIF),
+    grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS,
+                                DOSSIER_ETAT_SERVICE_UTILISATEURS,),
+    grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR,
+                           DOSSIER_ETAT_ADMINISTRATEUR,
+                           POSTE_ETAT_DEMANDE_MODIF,
+                           DOSSIER_ETAT_DEMANDE_MODIF,
+                           POSTE_ETAT_REGION_FINALISATION,
+                           DOSSIER_ETAT_REGION_FINALISATION,
+                          ),
     grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
-    grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
+    grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION,
+               DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
                POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF),
     grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
     grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
@@ -285,3 +318,5 @@ ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR,
                   DOSSIER_ETAT_DEMANDE_JUSTIF,
 )
 
+ETATS_VALIDE = (DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION,
+                DOSSIER_ETAT_FINALISE)