Ejemplo n.º 1
0
    def init_dtab(self, _req, *args, **kwargs):

        # Imports
        from app.functions import transform_bool
        from app.models import TUtilisateur
        from django.core.urlresolvers import reverse

        # Stockage des données du formulaire
        val_type_util = self.fields[
            'zl_type_util'].initial if _req.method == 'GET' else _req.POST.get(
                'zl_type_util')

        # Définition du jeu de données
        qs_util = TUtilisateur.objects.filter(
            en_act=val_type_util
        ) if val_type_util else TUtilisateur.objects.all()

        # Initialisation des données de la datatable
        tab = [[
            u.get_username(),
            u.get_last_name(),
            u.get_first_name(),
            transform_bool(u.get_en_act()),
            transform_bool(u.get_is_active()),
            '<a href="{}" class="inform-icon pull-right" title="Consulter l\'agent"></a>'
            .format(reverse('consult_agent', args=[u.get_pk()]))
        ] for u in qs_util.order_by('username')]

        return '''
		<div class="custom-table" id="dtab_chois_agent">
			<table border="1" bordercolor="#DDD">
				<thead>
					<tr>
						<th>Nom d'utilisateur</th>
						<th>Nom de famille</th>
						<th>Prénom</th>
						<th>L'agent est-il en activité ?</th>
						<th>Le compte est-il actif ?</th>
						<th></th>
					</tr>
				</thead>
				<tbody>{}</tbody>
			</table>
		</div>
		'''.format(''.join([
            '<tr>{}</tr>'.format(''.join(
                ['<td>{}</td>'.format(td) for td in tr])) for tr in tab
        ]))
Ejemplo n.º 2
0
def consult_compte(_req):

    # Imports
    from app.forms.gest_agents import TrierTransactionsCetAgent
    from app.functions import init_consult
    from app.functions import init_fm
    from app.functions import init_form
    from app.functions import prep_dtab
    from app.functions import transform_bool
    from app.models import TUtilisateur
    from datetime import date
    from django.http import HttpResponse
    from django.shortcuts import render
    import json

    output = None

    # Obtention d'une instance TUtilisateur
    obj_util = TUtilisateur.objects.get(pk=_req.user.pk)

    if _req.method == 'GET':
        if 'action' in _req.GET:

            # Téléchargement de la fiche CET d'un agent
            if _req.GET['action'] == 'telecharger-cet-agent' and 'mode-de-tri' in _req.GET and \
            'historique' in _req.GET :
                hist_trans_cet_util = _req.GET['historique']
                if hist_trans_cet_util:
                    hist_trans_cet_util = int(hist_trans_cet_util)
                output = obj_util.get_fiche_cet(_req.GET['mode-de-tri'],
                                                hist_trans_cet_util)

            # Affichage des absences autorisées ou en attente
            if _req.GET[
                    'action'] == 'consulter-absences' and 'annee' in _req.GET:
                output = prep_dtab(obj_util.get_tabl_abs(_req.GET['annee']), {
                    'modal_id': '#fm_consult_abs',
                    'modal_id_action': 'show'
                })

        else:

            # Préparation des attributs disponibles en consultation
            tab_attrs_util = {
                'courr_second_util': {
                    'label': 'Courriel secondaire',
                    'value': obj_util.get_courr_second_util()
                },
                'email': {
                    'label': 'Courriel principal',
                    'value': obj_util.get_email()
                },
                'email_auto_courr_princ': {
                    'label':
                    'Les notifications sont-elles envoyées sur le courriel principal ?',
                    'value':
                    transform_bool(obj_util.get_email_auto_courr_princ())
                },
                'email_auto_courr_second': {
                    'label':
                    'Les notifications sont-elles envoyées sur le courriel secondaire ?',
                    'value':
                    transform_bool(obj_util.get_email_auto_courr_second())
                },
                'en_act': {
                    'label': 'Êtes-vous en activité ?',
                    'value': transform_bool(obj_util.get_en_act())
                },
                'first_name': {
                    'label': 'Prénom',
                    'value': obj_util.get_first_name()
                },
                'gpe_util': {
                    'label':
                    'Groupes d\'utilisateur',
                    'value':
                    ', '.join(
                        [str(gu) for gu in obj_util.get_gpe_util().all()])
                },
                'last_name': {
                    'label': 'Nom de famille',
                    'value': obj_util.get_last_name()
                },
                'solde_cet_util': {
                    'label': 'Solde restant sur le compte épargne temps (CET)',
                    'value': obj_util.get_solde_cet_restant_util__str()
                },
                'type_util': {
                    'label':
                    'Quels sont les rôles assignés au compte ?',
                    'value':
                    ', '.join(
                        [str(tu) for tu in obj_util.get_type_util().all()])
                },
                'username': {
                    'label': 'Nom d\'utilisateur',
                    'value': obj_util.get_username()
                }
            }

            # Initialisation des statuts agent
            tab_statut_util = []
            for su in obj_util.get_statut_util_set().all():

                # Détermination du statut agent actuel
                statut_util_actuel = False
                if date.today() > date(su.get_annee().get_pk(),
                                       su.get_mois_deb_statut_util(), 1):
                    statut_util_actuel = True
                    for elem in tab_statut_util:
                        if elem['class']: elem['class'] = None

                tab_statut_util.append({
                    'class':
                    'to-highlight' if statut_util_actuel == True else None,
                    'period_deb_statut_util':
                    su.get_period_deb_statut_util(),
                    'pk':
                    su.get_pk(),
                    'statut_util':
                    su.get_statut_util__str()
                })

            # Initialisation des décomptes agent
            tab_decompt_util = [{
                'annee':
                du.get_annee(),
                'nbre_j_cp_autor':
                du.get_util().get_nbre_j_autor__str(True,
                                                    du.get_annee().get_pk()),
                'nbre_j_cp_base':
                du.get_nbre_j_cp_base__str(),
                'nbre_j_cp_rest':
                du.get_util().get_nbre_j_rest__str(True,
                                                   du.get_annee().get_pk()),
                'nbre_j_cp_transf':
                du.get_util().get_nbre_j_transf__str(True,
                                                     du.get_annee().get_pk()),
                'nbre_j_rtt_autor':
                du.get_util().get_nbre_j_autor__str(False,
                                                    du.get_annee().get_pk()),
                'nbre_j_rtt_base':
                du.get_nbre_j_rtt_base__str(),
                'nbre_j_rtt_rest':
                du.get_util().get_nbre_j_rest__str(False,
                                                   du.get_annee().get_pk()),
                'nbre_j_rtt_transf':
                du.get_util().get_nbre_j_transf__str(False,
                                                     du.get_annee().get_pk()),
            } for du in obj_util.get_decompt_util_set().reverse()]

            # Initialisation du formulaire de tri des transactions d'un CET
            form_tri_trans_cet_util = TrierTransactionsCetAgent(
                kw_consult=True, kw_util=obj_util)

            # Affichage du template
            output = render(
                _req, './gest_compte/consult_compte.html', {
                    'dtab_tri_trans_cet_util':
                    form_tri_trans_cet_util.init_dtab(_req),
                    'form_tri_trans_cet_util':
                    init_form(form_tri_trans_cet_util),
                    'tab_attrs_util':
                    init_consult(tab_attrs_util),
                    'tab_decompt_util':
                    tab_decompt_util,
                    'tab_fm': [
                        init_fm(
                            'consult_abs',
                            'Consulter les absences autorisées ou en attente',
                            obj_util.get_tabl_abs())
                    ],
                    'tab_statut_util':
                    tab_statut_util,
                    'title':
                    'Consulter mon compte',
                })

    else:

        # Traitement du cas où je dois rafraîchir la fiche CET d'un agent (altération du mode de tri)
        if _req.GET['action'] == 'trier-transactions-cet-agent':

            # Soumission du formulaire
            form_tri_trans_cet_util = TrierTransactionsCetAgent(
                _req.POST, kw_consult=True, kw_util=obj_util)

            # Rafraîchissement de la datatable ou affichage des erreurs
            if form_tri_trans_cet_util.is_valid():
                output = prep_dtab(form_tri_trans_cet_util.init_dtab(_req))
            else:
                output = HttpResponse(json.dumps(
                    form_tri_trans_cet_util.errors),
                                      content_type='application/json')

    return output
Ejemplo n.º 3
0
def filtr_abs(_req, _gby) :

	# Imports
	from app.forms.real_etats import FiltrerAbsences
	from app.functions import gener_cdc
	from app.functions import init_fm
	from app.functions import init_form
	from app.functions import prep_dtab
	from app.functions import transform_bool
	from app.models import TAbsence
	from app.models import TUtilisateur
	from django.http import HttpResponse
	from django.shortcuts import render
	from django.template.context_processors import csrf
	import csv
	import json

	output = None

	# Initialisation du préfixe de chaque formulaire
	pref_filtr_abs = 'FiltrerAbsences'

	# Obtention d'une instance TUtilisateur
	obj_util = TUtilisateur.objects.get(pk = _req.user.pk)

	if _req.method == 'GET' :
		if 'action' in _req.GET :
			if _req.GET['action'] == 'exporter-csv' and 'group-by' in _req.GET \
			and _req.GET['group-by'] in ['off', 'on'] :

				# Génération d'un fichier au format CSV
				output = HttpResponse(content_type = 'text/csv', charset = 'cp1252')
				output['Content-Disposition'] = 'attachment; filename="{0}.csv"'.format(gener_cdc())

				# Accès en écriture
				writer = csv.writer(output, delimiter = ';')

				# Initialisation des données
				tab_lg = _req.session['filtr_abs'] if 'filtr_abs' in _req.session else []

				# Définition de l'en-tête
				if _gby == False :
					header = [
						'Agent ayant émis l\'absence',
						'Date d\'émission de l\'absence',
						'Agent concerné',
						'Type de l\'absence',
						'Année',
						'Date de l\'absence',
						'Justificatif d\'absence',
						'Commentaire (phase de pré-validation)',
						'Agent ayant vérifié l\'absence',
						'Date de vérification de l\'absence',
						'L\'absence est-elle autorisée ?',
						'Type final de l\'absence',
						'Commentaire (phase de post-validation)'
					]
				else :
					header = [
						'Nom complet de l\'agent/des agents',
						'Type de l\'absence',
						'Année de l\'absence',
						'État de l\'absence',
						'Nombre d\'absences',
						'Nombre de jours d\'absence'
					]

				# Ajout de l'en-tête
				writer.writerow(header)

				for elem in tab_lg :

					# Définition des données de la nouvelle ligne
					if _gby == False :

						# Obtention d'une instance TAbsence
						obj_abs = TAbsence.objects.get(pk = elem[0])

						# Ajout des données "pré-validation"
						body = [
							obj_abs.get_util_connect().get_nom_complet() if obj_abs.get_util_connect() else None,
							obj_abs.get_dt_emiss_abs__str(),
							obj_abs.get_util_emett().get_nom_complet(),
							obj_abs.get_type_abs(),
							obj_abs.get_annee(),
							obj_abs.get_dt_abs__fr_str(),
							_req.build_absolute_uri(str(obj_abs.get_pj_abs())) if obj_abs.get_pj_abs() else None,
							obj_abs.get_comm_abs()
						]

						# Ajout des données "post-validation" si définies
						if obj_abs.get_verif_abs() :
							body += [
								obj_abs.get_verif_abs().get_util_verif().get_nom_complet() \
								if obj_abs.get_verif_abs().get_util_verif() else None,
								obj_abs.get_verif_abs().get_dt_verif_abs__str(),
								transform_bool(obj_abs.get_verif_abs().get_est_autor()),
								obj_abs.get_verif_abs().get_type_abs_final(),
								obj_abs.get_verif_abs().get_comm_verif_abs()
							]

					else :
						body = elem

					# Ajout d'une nouvelle ligne
					writer.writerow(body)

		else :

			# Initialisation du formulaire et de ses attributs
			form_filtr_abs = FiltrerAbsences(prefix = pref_filtr_abs, kw_gby = _gby, kw_util = obj_util)
			_form_filtr_abs = init_form(form_filtr_abs)

			# Définition de l'attribut <title/>
			if _gby == False :
				title = 'Réalisation d\'états en sélectionnant des absences'
			else :
				title = 'Réalisation d\'états en regroupant des absences'

			# Initialisation des fenêtres modales
			tab_fm = [init_fm(
				'filtr_abs',
				'Filtrer les absences par',
				'''
				<form action="" method="post" name="form_select_abs" onsubmit="trait_post(event);">
					<input name="csrfmiddlewaretoken" type="hidden" value="{0}">
					{1}
					<div class="row">
						<div class="col-sm-6">{2}</div>
						<div class="col-sm-6">{3}</div>
					</div>
					<span class="theme-color">Période de début d'absence</span>
					<div class="row">
						<div class="col-sm-6">{4}</div>
						<div class="col-sm-6">{5}</div>
					</div>
					{6}
					{7}
					{8}
					<button class="center-block custom-btn green-btn" type="submit">Valider</button>
				</form>
				'''.format(
					csrf(_req)['csrf_token'],
					_form_filtr_abs['zcc_util'],
					_form_filtr_abs['zl_type_abs'],
					_form_filtr_abs['zl_annee'],
					_form_filtr_abs['zd_dt_deb_abs'],
					_form_filtr_abs['zd_dt_fin_abs'],
					_form_filtr_abs['zl_etat_abs'],
					_form_filtr_abs['rb_gby'] if 'rb_gby' in _form_filtr_abs else '',
					_form_filtr_abs['zcc_ajout_select_exist']
				)
			)]

			# Affichage du template
			output = render(_req, './real_etats/filtr_abs.html', {
				'dtab_filtr_abs' : form_filtr_abs.init_dtab(_req),
				'form_filtr_abs' : init_form(form_filtr_abs),
				'gby' : 'off' if _gby == False else 'on',
				'tab_fm' : tab_fm,
				'title' : title
			})

	else :

		# Soumission du formulaire
		form_filtr_abs = FiltrerAbsences(_req.POST, prefix = pref_filtr_abs, kw_gby = _gby, kw_util = obj_util)

		# Rafraîchissement de la datatable ou affichage des erreurs
		if form_filtr_abs.is_valid() :
			output = prep_dtab(form_filtr_abs.init_dtab(_req), {
				'modal_id' : '#fm_filtr_abs', 'modal_id_action' : 'hide'
			})
		else :
			tab_errs = { '{0}-{1}'.format(pref_filtr_abs, cle) : val for cle, val in form_filtr_abs.errors.items() }
			output = HttpResponse(json.dumps(tab_errs), content_type = 'application/json')

	return output
Ejemplo n.º 4
0
def consult_agent(_req, _a):

    # Imports
    from app.forms.gest_agents import TrierTransactionsCetAgent
    from app.form_templates import get_ft_ger_statut_util
    from app.form_templates import get_ft_ger_trans_cet_util
    from app.forms.gest_agents import GererStatutAgent
    from app.forms.gest_agents import GererTransactionCetAgent
    from app.functions import affich_dem_suppr
    from app.functions import init_consult
    from app.functions import init_fm
    from app.functions import init_form
    from app.functions import prep_dtab
    from app.functions import transform_bool
    from app.models import TStatutsUtilisateur
    from app.models import TTransactionsCetUtilisateur
    from app.models import TUtilisateur
    from datetime import date
    from django.core.urlresolvers import reverse
    from django.http import HttpResponse
    from django.shortcuts import get_object_or_404
    from django.shortcuts import render
    from django.template.context_processors import csrf
    import json

    output = None

    # Initialisation du préfixe de chaque formulaire
    pref_ajout_statut_agent = 'AjouterStatutAgent'
    pref_ajout_trans_cet_agent = 'AjouterTransactionCetAgent'
    pref_modif_statut_agent = 'ModifierStatutAgent'
    pref_modif_trans_cet_agent = 'ModifierTransactionCetAgent'

    # Tentative d'obtention d'une instance TUtilisateur
    obj_util = get_object_or_404(TUtilisateur, pk=_a)

    # Obtention d'une instance TUtilisateur
    obj_util_connect = TUtilisateur.objects.get(pk=_req.user.pk)

    if _req.method == 'GET':
        if 'action' in _req.GET:

            # Initialisation du formulaire de mise à jour d'un statut agent
            if _req.GET[
                    'action'] == 'initialiser-formulaire-modification-statut-agent' and 'id' in _req.GET:

                # Initialisation du formulaire
                form_ger_statut_util = GererStatutAgent(
                    prefix=pref_modif_statut_agent,
                    instance=TStatutsUtilisateur.objects.get(
                        pk=_req.GET['id']),
                    kw_util=obj_util)

                # Affichage du formulaire
                output = HttpResponse(json.dumps({
                    'success': {
                        'content':
                        get_ft_ger_statut_util(_req, form_ger_statut_util)
                    }
                }),
                                      content_type='application/json')

            # Affichage d'une demande de suppression d'un statut agent
            if _req.GET[
                    'action'] == 'supprimer-statut-agent-etape-1' and 'id' in _req.GET:

                # Stockage en session du statut agent à supprimer
                _req.session['statut_util__pk'] = _req.GET['id']

                # Affichage de la demande de suppression du statut agent
                output = HttpResponse(json.dumps({
                    'success': {
                        'content':
                        affich_dem_suppr(
                            '?action=supprimer-statut-agent-etape-2',
                            'suppr_statut_util')
                    }
                }),
                                      content_type='application/json')

            # Suppression d'un statut agent
            if _req.GET[
                    'action'] == 'supprimer-statut-agent-etape-2' and 'statut_util__pk' in _req.session:

                # Suppression d'une instance TStatutsUtilisateur
                obj_util.get_statut_util_set().get(
                    pk=_req.session['statut_util__pk']).delete()

                # Affichage du message de succès
                output = HttpResponse(json.dumps({
                    'success': {
                        'message':
                        'L\'agent {} a été modifié avec succès.'.format(
                            obj_util),
                        'redirect':
                        reverse('consult_agent', args=[obj_util.get_pk()])
                    }
                }),
                                      content_type='application/json')

            # Initialisation du formulaire de mise à jour d'une transaction sur un CET
            if _req.GET['action'] == 'initialiser-formulaire-modification-transaction-entrante-cet-agent' and \
            'id' in _req.GET :

                # Initialisation du formulaire
                form_ger_trans_cet_util = GererTransactionCetAgent(
                    prefix=pref_modif_trans_cet_agent,
                    instance=TTransactionsCetUtilisateur.objects.get(
                        pk=_req.GET['id']),
                    kw_util=obj_util,
                    kw_util_connect=obj_util_connect)

                # Affichage du formulaire
                output = HttpResponse(json.dumps({
                    'success': {
                        'content':
                        get_ft_ger_trans_cet_util(_req,
                                                  form_ger_trans_cet_util)
                    }
                }),
                                      content_type='application/json')

            # Affichage d'une demande de suppression d'une transaction entrante sur le CET
            if _req.GET[
                    'action'] == 'supprimer-transaction-entrante-cet-agent-etape-1' and 'id' in _req.GET:

                # Stockage en session du statut agent à supprimer
                _req.session['trans_cet_util__pk'] = _req.GET['id']

                # Affichage de la demande de suppression d'une transaction entrante sur le CET
                output = HttpResponse(json.dumps({
                    'success': {
                        'content':
                        affich_dem_suppr(
                            '?action=supprimer-transaction-entrante-cet-agent-etape-2',
                            'suppr_trans_cet_util')
                    }
                }),
                                      content_type='application/json')

            # Suppression d'une transaction entrante sur le CET
            if _req.GET['action'] == 'supprimer-transaction-entrante-cet-agent-etape-2' and \
            'trans_cet_util__pk' in _req.session :

                # Suppression d'une instance TTransactionsCetUtilisateur
                obj_util.get_trans_cet_util_set().get(
                    pk=_req.session['trans_cet_util__pk']).delete()

                # Affichage du message de succès
                output = HttpResponse(json.dumps({
                    'success': {
                        'message':
                        '''
						Le compte épargne temps de l'agent {} a été modifié avec succès.
						'''.format(obj_util),
                        'redirect':
                        reverse('consult_agent', args=[obj_util.get_pk()])
                    }
                }),
                                      content_type='application/json')

            # Téléchargement de la fiche CET d'un agent
            if _req.GET['action'] == 'telecharger-cet-agent' and 'mode-de-tri' in _req.GET and \
            'historique' in _req.GET :
                hist_trans_cet_util = _req.GET['historique']
                if hist_trans_cet_util:
                    hist_trans_cet_util = int(hist_trans_cet_util)
                output = obj_util.get_fiche_cet(_req.GET['mode-de-tri'],
                                                hist_trans_cet_util)

            # Affichage des absences autorisées ou en attente
            if _req.GET[
                    'action'] == 'consulter-absences' and 'annee' in _req.GET:
                output = prep_dtab(obj_util.get_tabl_abs(_req.GET['annee']), {
                    'modal_id': '#fm_consult_abs',
                    'modal_id_action': 'show'
                })

        else:

            # Préparation des attributs disponibles en consultation
            tab_attrs_util = {
                'courr_second_util': {
                    'label': 'Courriel secondaire',
                    'value': obj_util.get_courr_second_util()
                },
                'email': {
                    'label': 'Courriel principal',
                    'value': obj_util.get_email()
                },
                'email_auto_courr_princ': {
                    'label':
                    'Les notifications sont-elles envoyées sur le courriel principal ?',
                    'value':
                    transform_bool(obj_util.get_email_auto_courr_princ())
                },
                'email_auto_courr_second': {
                    'label':
                    'Les notifications sont-elles envoyées sur le courriel secondaire ?',
                    'value':
                    transform_bool(obj_util.get_email_auto_courr_second())
                },
                'en_act': {
                    'label': 'L\'agent est-il en activité ?',
                    'value': transform_bool(obj_util.get_en_act())
                },
                'first_name': {
                    'label': 'Prénom',
                    'value': obj_util.get_first_name()
                },
                'gpe_util': {
                    'label':
                    'Groupes d\'utilisateur',
                    'value':
                    ', '.join(
                        [str(gu) for gu in obj_util.get_gpe_util().all()])
                },
                'is_active': {
                    'label': 'Le compte est-il actif ?',
                    'last_child': True,
                    'value': transform_bool(obj_util.get_is_active())
                },
                'last_name': {
                    'label': 'Nom de famille',
                    'value': obj_util.get_last_name()
                },
                'solde_cet_util': {
                    'label': 'Solde restant sur le compte épargne temps (CET)',
                    'value': obj_util.get_solde_cet_restant_util__str()
                },
                'type_util': {
                    'label':
                    'Quels sont les rôles assignés au compte ?',
                    'value':
                    ', '.join(
                        [str(tu) for tu in obj_util.get_type_util().all()])
                },
                'username': {
                    'label': 'Nom d\'utilisateur',
                    'value': obj_util.get_username()
                }
            }

            # Initialisation des statuts agent
            tab_statut_util = []
            for su in obj_util.get_statut_util_set().all():

                # Détermination du statut agent actuel
                statut_util_actuel = False
                if date.today() > date(su.get_annee().get_pk(),
                                       su.get_mois_deb_statut_util(), 1):
                    statut_util_actuel = True
                    for elem in tab_statut_util:
                        if elem['class']: elem['class'] = None

                tab_statut_util.append({
                    'class':
                    'to-highlight' if statut_util_actuel == True else None,
                    'period_deb_statut_util':
                    su.get_period_deb_statut_util(),
                    'pk':
                    su.get_pk(),
                    'statut_util':
                    su.get_statut_util__str()
                })

            # Initialisation des décomptes agent
            tab_decompt_util = [{
                'annee':
                du.get_annee(),
                'nbre_j_cp_autor':
                du.get_util().get_nbre_j_autor__str(True,
                                                    du.get_annee().get_pk()),
                'nbre_j_cp_base':
                du.get_nbre_j_cp_base__str(),
                'nbre_j_cp_rest':
                du.get_util().get_nbre_j_rest__str(True,
                                                   du.get_annee().get_pk()),
                'nbre_j_cp_transf':
                du.get_util().get_nbre_j_transf__str(True,
                                                     du.get_annee().get_pk()),
                'nbre_j_rtt_autor':
                du.get_util().get_nbre_j_autor__str(False,
                                                    du.get_annee().get_pk()),
                'nbre_j_rtt_base':
                du.get_nbre_j_rtt_base__str(),
                'nbre_j_rtt_rest':
                du.get_util().get_nbre_j_rest__str(False,
                                                   du.get_annee().get_pk()),
                'nbre_j_rtt_transf':
                du.get_util().get_nbre_j_transf__str(False,
                                                     du.get_annee().get_pk()),
            } for du in obj_util.get_decompt_util_set().reverse()]

            # Initialisation du formulaire de tri des transactions d'un CET
            form_tri_trans_cet_util = TrierTransactionsCetAgent(
                kw_util=obj_util)

            # Initialisation des fenêtres modales
            tab_fm = [
                init_fm(
                    'ajout_trans_cet_util', 'Ajouter une transaction entrante',
                    get_ft_ger_trans_cet_util(
                        _req,
                        GererTransactionCetAgent(
                            prefix=pref_ajout_trans_cet_agent,
                            kw_util=obj_util,
                            kw_util_connect=obj_util_connect))),
                init_fm(
                    'ajout_statut_util', 'Ajouter un statut agent',
                    get_ft_ger_statut_util(
                        _req,
                        GererStatutAgent(prefix=pref_ajout_statut_agent,
                                         kw_util=obj_util))),
                init_fm('consult_abs',
                        'Consulter les absences autorisées ou en attente',
                        obj_util.get_tabl_abs()),
                init_fm('modif_statut_util', 'Modifier un statut agent'),
                init_fm('modif_trans_cet_util',
                        'Modifier une transaction entrante'),
                init_fm(
                    'suppr_statut_util',
                    'Êtes-vous sûr de vouloir supprimer définitivement le statut agent ?'
                ),
                init_fm(
                    'suppr_trans_cet_util',
                    'Êtes-vous sûr de vouloir supprimer définitivement la transaction entrante ?'
                )
            ]

            # Affichage du template
            output = render(
                _req, './gest_agents/consult_agent.html', {
                    'a':
                    obj_util,
                    'dtab_tri_trans_cet_util':
                    form_tri_trans_cet_util.init_dtab(_req),
                    'form_tri_trans_cet_util':
                    init_form(form_tri_trans_cet_util),
                    'tab_attrs_util':
                    init_consult(tab_attrs_util),
                    'tab_decompt_util':
                    tab_decompt_util,
                    'tab_fm':
                    tab_fm,
                    'tab_statut_util':
                    tab_statut_util,
                    'title':
                    'Consulter un agent'
                })

    else:
        if 'action' in _req.GET:

            # Définition du préfixe du formulaire de gestion des statuts agent
            if _req.GET['action'] == 'ajouter-statut-agent':
                prefix = pref_ajout_statut_agent
            elif _req.GET['action'] == 'modifier-statut-agent':
                prefix = pref_modif_statut_agent
            else:
                prefix = None

            if prefix:

                # Stockage des données du formulaire
                val_pk = _req.POST.get('{}-zsc_pk'.format(prefix))

                # Soumission du formulaire
                form_ger_statut_util = GererStatutAgent(
                    _req.POST,
                    instance=TStatutsUtilisateur.objects.get(
                        pk=val_pk) if val_pk else None,
                    prefix=prefix,
                    kw_util=obj_util)

                if form_ger_statut_util.is_valid():

                    # Création/modification d'une instance TStatutsUtilisateur
                    obj_statut_util_valid = form_ger_statut_util.save()

                    # Affichage du message de succès
                    output = HttpResponse(json.dumps({
                        'success': {
                            'message':
                            '''
							L'agent {} a été modifié avec succès.
							'''.format(obj_statut_util_valid.get_util()),
                            'redirect':
                            reverse(
                                'consult_agent',
                                args=[
                                    obj_statut_util_valid.get_util().get_pk()
                                ])
                        }
                    }),
                                          content_type='application/json')

                else:

                    # Affichage des erreurs
                    tab_errs = {
                        '{0}-{1}'.format(prefix, cle): val
                        for cle, val in form_ger_statut_util.errors.items()
                    }
                    output = HttpResponse(json.dumps(tab_errs),
                                          content_type='application/json')

            # Définition du préfixe du formulaire de gestion des transactions entrantes sur le CET agent
            if _req.GET['action'] == 'ajouter-transaction-entrante-cet-agent':
                prefix = pref_ajout_trans_cet_agent
            elif _req.GET[
                    'action'] == 'modifier-transaction-entrante-cet-agent':
                prefix = pref_modif_trans_cet_agent
            else:
                prefix = None

            if prefix:

                # Stockage des données du formulaire
                val_pk = _req.POST.get('{}-zsc_pk'.format(prefix))

                # Soumission du formulaire
                form_ger_trans_cet_util = GererTransactionCetAgent(
                    _req.POST,
                    instance=TTransactionsCetUtilisateur.objects.get(
                        pk=val_pk) if val_pk else None,
                    prefix=prefix,
                    kw_util=obj_util,
                    kw_util_connect=obj_util_connect)

                if form_ger_trans_cet_util.is_valid():

                    # Création/modification d'une instance TTransactionsCetUtilisateur
                    obj_trans_cet_util_valid = form_ger_trans_cet_util.save()

                    # Affichage du message de succès
                    output = HttpResponse(json.dumps({
                        'success': {
                            'message':
                            '''
							Le compte épargne temps de l'agent {} a été modifié avec succès.
							'''.format(obj_trans_cet_util_valid.get_util()),
                            'redirect':
                            reverse('consult_agent',
                                    args=[
                                        obj_trans_cet_util_valid.get_util().
                                        get_pk()
                                    ])
                        }
                    }),
                                          content_type='application/json')

                else:

                    # Affichage des erreurs
                    tab_errs = {
                        '{0}-{1}'.format(prefix, cle): val
                        for cle, val in form_ger_trans_cet_util.errors.items()
                    }
                    output = HttpResponse(json.dumps(tab_errs),
                                          content_type='application/json')

            # Traitement du cas où je dois rafraîchir la fiche CET d'un agent (altération du mode de tri)
            if _req.GET['action'] == 'trier-transactions-cet-agent':

                # Soumission du formulaire
                form_tri_trans_cet_util = TrierTransactionsCetAgent(
                    _req.POST, kw_util=obj_util)

                # Rafraîchissement de la datatable ou affichage des erreurs
                if form_tri_trans_cet_util.is_valid():
                    output = prep_dtab(form_tri_trans_cet_util.init_dtab(_req))
                else:
                    output = HttpResponse(json.dumps(
                        form_tri_trans_cet_util.errors),
                                          content_type='application/json')

    return output
Ejemplo n.º 5
0
def verif_abs(_req, _a):

    # Imports
    from app.forms.gest_abs import VerifierAbsence
    from app.functions import get_obj_dt
    from app.functions import init_consult
    from app.functions import init_fm
    from app.functions import init_form
    from app.functions import transform_bool
    from app.models import TAbsence
    from app.models import TDatesAbsence
    from app.models import TUtilisateur
    from django.conf import settings
    from django.core.exceptions import PermissionDenied
    from django.core.urlresolvers import reverse
    from django.http import HttpResponse
    from django.shortcuts import get_object_or_404
    from django.shortcuts import render
    import json

    output = None

    # Initialisation du préfixe de chaque formulaire
    pref_verif_abs = 'VerifierAbsence'

    # Tentative d'obtention d'une instance TAbsence
    obj_abs = get_object_or_404(TAbsence, pk=_a)

    # Obtention d'une instance TUtilisateur
    obj_util = TUtilisateur.objects.get(pk=_req.user.pk)

    # Vérification des droits d'accès
    if obj_abs not in obj_util.get_abs_a_verif__list(): raise PermissionDenied
    '''
	Obtention du nombre de jours d'absence déjà autorisés pour le type d'absence lié à une absence
	_obj : Instance TAbsence
	_code : Par mois ou par année ?
	Retourne un tableau associatif
	'''
    def calc_nbre_j(_obj, _code):

        # Import
        from app.models import TDatesAbsence

        output = {}

        # Initialisation du tableau des dates d'absence
        tab_dt_abs = [[da.get_dt_abs(),
                       da.get_indisp_dt_abs()]
                      for da in _obj.get_dt_abs_set().all()]

        # Groupement d'objets "date"
        if _code == 'MOIS':
            tab_dt_abs__group_by = [[
                j for j in tab_dt_abs
                if '{0}_{1}'.format(j[0].month, j[0].year) == i
            ] for i in set(
                map(lambda l: '{0}_{1}'.format(l[0].month, l[0].year),
                    tab_dt_abs))]
        elif _code == 'ANNEE':
            tab_dt_abs__group_by = [[
                j for j in tab_dt_abs if j[0].year == i
            ] for i in set(map(lambda l: l[0].year, tab_dt_abs))]
        else:
            tab_dt_abs__group_by = []

        for elem in tab_dt_abs__group_by:

            # Stockage du mois et de l'année
            mois = elem[0][0].month
            annee = elem[0][0].year

            # Définition des conditions de la requête
            if _code == 'MOIS':
                tab_filter = {
                    'dt_abs__month': mois,
                    'dt_abs__year': annee,
                    'id_abs__id_util_emett': _obj.get_util_emett()
                }
            else:
                tab_filter = {
                    'id_abs__num_annee': annee,
                    'id_abs__id_util_emett': _obj.get_util_emett()
                }

            # Initialisation du nombre de jours déjà autorisés
            nbre_j = 0

            # Cumul du nombre de jours déjà autorisés
            for da in TDatesAbsence.objects.filter(**tab_filter):
                obj_verif_abs = da.get_abs().get_verif_abs()
                if obj_verif_abs:
                    if obj_verif_abs.get_type_abs_final() == _obj.get_type_abs(
                    ):
                        if da.get_abs().get_etat_abs() == 1:
                            if da.get_indisp_dt_abs() == 'WD':
                                nbre_j += 1
                            else:
                                nbre_j += 0.5

            # Empilement du tableau de sortie
            output['{0}_{1}'.format(mois, annee) if _code ==
                   'MOIS' else str(annee)] = nbre_j

        return output

    if _req.method == 'GET':

        # Préparation des attributs disponibles en consultation (onglet 1)
        tab_attrs_abs = {
            'comm_abs': {
                'label': 'Commentaire',
                'last_child': True,
                'value': obj_abs.get_comm_abs()
            },
            'dt_abs': {
                'label': 'Date de l\'absence',
                'value': obj_abs.get_dt_abs__fr_str()
            },
            'pj_abs': {
                'label': 'Consulter le justificatif d\'absence',
                'value': obj_abs.get_pj_abs__path(),
                'pdf': True
            },
            'id_util_emett': {
                'label': 'Agent concerné',
                'value': obj_abs.get_util_emett().get_nom_complet()
            },
            'id_type_abs': {
                'label': 'Type de l\'absence',
                'value': obj_abs.get_type_abs()
            },
            'num_annee': {
                'label': 'Année',
                'value': obj_abs.get_annee()
            }
        }

        # Préparation des données relatives au nombre de jours d'absence déjà autorisés
        tab_nbre_j_abs_annee = [[
            int(cle), val
        ] for cle, val in calc_nbre_j(obj_abs, 'ANNEE').items()]
        tab_nbre_j_abs_mois = [[
            int(cle.split('_')[0]),
            get_obj_dt('MONTHS')[int(cle.split('_')[0]) - 1],
            int(cle.split('_')[1]), val
        ] for cle, val in calc_nbre_j(obj_abs, 'MOIS').items()]

        # Vérification d'un quelconque conflit entre plusieurs absences
        conflit = False
        for daa in obj_abs.get_dt_abs_set().all():
            for da in TDatesAbsence.objects.filter(
                    dt_abs=daa.get_dt_abs(),
                    id_abs__id_util_emett=obj_abs.get_util_emett()):
                if da.get_abs().get_etat_abs() == 1:
                    if da.get_indisp_dt_abs() == 'WD':
                        conflit = True
                    elif da.get_indisp_dt_abs() == 'AM':
                        if daa.get_indisp_dt_abs() != 'PM': conflit = True
                    elif da.get_indisp_dt_abs() == 'PM':
                        if daa.get_indisp_dt_abs() != 'AM': conflit = True

        # Préparation des attributs disponibles en consultation (onglet 2)
        tab_attrs_aide = {
            'conflit_abs': {
                'label':
                'Une absence est-elle déjà autorisée pendant cette absence ?',
                'last_child': True,
                'value': transform_bool(conflit)
            },
            'descr_nds_type_abs': {
                'label':
                '''
				Extrait de la note de service pour le type d'absence suivant : « {} »
				'''.format(obj_abs.get_type_abs()),
                'value':
                obj_abs.get_type_abs().get_descr_nds_type_abs()
            },
            'nbre_j_abs_annee': {
                'datatable':
                True,
                'datatable_header':
                'Année|Nombre de jours déjà autorisés',
                'label':
                '''
				Nombre de jours déjà autorisés par année pour le type d'absence suivant : « {} »
				'''.format(obj_abs.get_type_abs()),
                'value':
                list(sorted(tab_nbre_j_abs_annee, key=lambda l: l[0]))
            },
            'nbre_j_abs_mois': {
                'datatable':
                True,
                'datatable_header':
                'Mois|Année|Nombre de jours déjà autorisés',
                'label':
                '''
				Nombre de jours déjà autorisés par période pour le type d'absence suivant : « {} »
				'''.format(obj_abs.get_type_abs()),
                'value': [
                    elem[1:] for elem in list(
                        sorted(tab_nbre_j_abs_mois, key=lambda l:
                               (l[2], l[0])))
                ]
            }
        }

        # Ajout d'un attribut d'aide en cas de vérification d'une absence dont le groupe de type d'absence est "CET"
        if obj_abs.get_type_abs().get_gpe_type_abs().get_pk(
        ) == settings.DB_PK_DATAS['CET_PK']:
            tab_attrs_aide['solde_cet_restant_util'] = {
                'label':
                'Solde restant prévisionnel sur le compte épargne temps (CET)',
                'value':
                obj_abs.get_util_emett().get_solde_cet_restant_util__str(
                    obj_abs.get_util_emett().get_solde_cet_util() -
                    obj_abs.get_nbre_dt_abs())
            }

        # Initialisation du formulaire
        form_verif_abs = VerifierAbsence(prefix=pref_verif_abs)

        # Initialisation des fenêtres modales
        tab_fm = [init_fm('verif_abs', 'Vérifier une absence')]

        # Affichage du template
        output = render(
            _req, './gest_abs/verif_abs.html', {
                'form_verif_abs': init_form(form_verif_abs),
                'tab_attrs_abs': init_consult(tab_attrs_abs),
                'tab_attrs_aide': init_consult(tab_attrs_aide),
                'tab_fm': tab_fm,
                'title': 'Vérifier une absence'
            })

    else:

        # Soumission du formulaire
        form_verif_abs = VerifierAbsence(_req.POST,
                                         prefix=pref_verif_abs,
                                         kw_abs=obj_abs,
                                         kw_req=_req,
                                         kw_util_connect=obj_util)

        if form_verif_abs.is_valid():

            # Création d'une instance TVerificationAbsence
            obj_verif_abs_valid = form_verif_abs.save()

            # Affichage du message de succès
            output = HttpResponse(json.dumps({
                'success': {
                    'message':
                    'L\'absence a été vérifiée avec succès.',
                    'redirect':
                    reverse('consult_abs', args=[obj_verif_abs_valid.get_pk()])
                }
            }),
                                  content_type='application/json')

        else:

            # Affichage des erreurs
            tab_errs = {
                '{0}-{1}'.format(pref_verif_abs, cle): val
                for cle, val in form_verif_abs.errors.items()
            }
            output = HttpResponse(json.dumps(tab_errs),
                                  content_type='application/json')

    return output
Ejemplo n.º 6
0
def consult_abs(_req, _a):

    # Imports
    from app.forms.gest_abs import InsererPieceJustificativeAbsence
    from app.forms.gest_abs import ModifierTypeAbsenceFinal
    from app.functions import affich_dem_suppr
    from app.functions import init_consult
    from app.functions import init_fm
    from app.functions import init_form
    from app.functions import transform_bool
    from app.models import TAbsence
    from app.models import TUtilisateur
    from django.core.urlresolvers import reverse
    from django.http import HttpResponse
    from django.shortcuts import get_object_or_404
    from django.shortcuts import render
    from django.template.context_processors import csrf
    import json

    # Initialisation du préfixe de chaque formulaire
    pref_inser_pj_abs = 'InsererPieceJustificativeAbsence'
    pref_modif_type_abs_final = 'ModifierTypeAbsenceFinal'

    output = None

    # Tentative d'obtention d'une instance TUtilisateur
    obj_abs = get_object_or_404(TAbsence, pk=_a)

    # Obtention d'une instance TUtilisateur
    obj_util = TUtilisateur.objects.get(pk=_req.user.pk)

    # Vérification du droit d'accès
    obj_abs.can_read(obj_util, False)

    # Stockage de booléens
    can_update_type_abs_final = obj_abs.can_update_type_abs_final(
        obj_util, True)

    if _req.method == 'GET':
        if 'action' in _req.GET:

            # Affichage d'une demande de suppression d'une absence
            if _req.GET['action'] == 'supprimer-absence-etape-1':
                output = HttpResponse(json.dumps({
                    'success': {
                        'content':
                        affich_dem_suppr('?action=supprimer-absence-etape-2',
                                         'suppr_abs')
                    }
                }),
                                      content_type='application/json')

            # Suppression d'une absence
            if _req.GET['action'] == 'supprimer-absence-etape-2':

                # Vérification du droit de suppression
                obj_abs.can_delete(obj_util, False)

                # Suppression d'une instance TAbsence
                obj_abs.delete()

                # Affichage du message de succès
                output = HttpResponse(json.dumps({
                    'success': {
                        'message': 'L\'absence a été supprimée avec succès.',
                        'redirect': reverse('chois_abs')
                    }
                }),
                                      content_type='application/json')

        else:

            # Instance TVerificationAbsence
            o_verif_abs = obj_abs.get_verif_abs()

            # Préparation des attributs disponibles en consultation
            tab_attrs_abs = {
                'comm_abs': {
                    'label': 'Commentaire',
                    'value': obj_abs.get_comm_abs()
                },
                'comm_verif_abs': {
                    'label':
                    'Commentaire',
                    'last_child':
                    True,
                    'value':
                    o_verif_abs.get_comm_verif_abs() if o_verif_abs else None
                },
                'dt_abs': {
                    'label': 'Date de l\'absence',
                    'value': obj_abs.get_dt_abs__fr_str()
                },
                'dt_emiss_abs': {
                    'label': 'Date d\'émission de l\'absence',
                    'value': obj_abs.get_dt_emiss_abs__str()
                },
                'dt_verif_abs': {
                    'label':
                    'Date de vérification de l\'absence',
                    'value':
                    o_verif_abs.get_dt_verif_abs__str()
                    if o_verif_abs else None
                },
                'est_autor': {
                    'label':
                    'L\'absence est-elle autorisée ?',
                    'value':
                    transform_bool(o_verif_abs.get_est_autor())
                    if o_verif_abs else None
                },
                'pj_abs': {
                    'label': 'Consulter le justificatif d\'absence',
                    'value': obj_abs.get_pj_abs__path(),
                    'pdf': True
                },
                'id_util_connect': {
                    'label':
                    'Agent ayant émis l\'absence',
                    'value':
                    obj_abs.get_util_connect().get_nom_complet()
                    if obj_abs.get_util_connect() else None
                },
                'id_util_emett': {
                    'label': 'Agent concerné',
                    'value': obj_abs.get_util_emett().get_nom_complet()
                },
                'id_util_verif': {
                    'label':
                    'Agent ayant vérifié l\'absence',
                    'value':
                    o_verif_abs.get_util_verif().get_nom_complet()
                    if o_verif_abs and o_verif_abs.get_util_verif() else None
                },
                'id_type_abs': {
                    'label': 'Type de l\'absence',
                    'value': obj_abs.get_type_abs()
                },
                'id_type_abs_final': {
                    'label':
                    'Type final de l\'absence',
                    'value':
                    o_verif_abs.get_type_abs_final() if o_verif_abs else None
                },
                'num_annee': {
                    'label': 'Année',
                    'value': obj_abs.get_annee()
                }
            }

            # Initialisation des fenêtres modales
            tab_fm = [
                init_fm(
                    'suppr_abs',
                    'Êtes-vous sûr de vouloir supprimer définitivement l\'absence ?'
                )
            ]

            # Initialisation des actions supplémentaires
            tab_act = []

            if obj_abs.can_update_pj_abs(obj_util, True) == True:

                # Initialisation du formulaire
                form_inser_pj_abs = init_form(
                    InsererPieceJustificativeAbsence(prefix=pref_inser_pj_abs,
                                                     instance=obj_abs))

                # Empilement des actions supplémentaires
                tab_act.append('''
					<span class="icon-with-text iwt-c-white pdf-icon" data-target="#fm_inser_pj_abs" data-toggle="modal">
						Insérer le justificatif d'absence
					</span>
					''')

                # Agrandissement du tableau des fenêtres modales
                tab_fm += [
                    init_fm(
                        'inser_pj_abs', 'Insérer le justificatif d\'absence',
                        '''
					<form action="?action=inserer-piece-justificative-absence" enctype="multipart/form-data" 
					method="post" name="form_inser_pj_abs" onsubmit="trait_post(event);">
						<input name="csrfmiddlewaretoken" type="hidden" value="{0}">
						{1}
						<button class="center-block custom-btn green-btn" type="submit">Valider</button>
					</form>
					'''.format(csrf(_req)['csrf_token'], form_inser_pj_abs['zu_pj_abs']))
                ]

            if can_update_type_abs_final == True:

                # Initialisation du formulaire
                form_modif_type_abs_final = init_form(
                    ModifierTypeAbsenceFinal(prefix=pref_modif_type_abs_final,
                                             instance=o_verif_abs))

                # Agrandissement du tableau des fenêtres modales
                tab_fm += [
                    init_fm(
                        'modif_type_abs_final',
                        'Modifier le type final de l\'absence', '''
					<form action="?action=modifier-type-absence-final" method="post" name="form_modif_type_abs_final"
					onsubmit="trait_post(event);">
						<input name="csrfmiddlewaretoken" type="hidden" value="{0}">
						{1}
						<button class="center-block custom-btn green-btn" type="submit">Valider</button>
					</form>
					'''.format(
                            csrf(_req)['csrf_token'],
                            form_modif_type_abs_final['zl_type_abs_final']))
                ]

            if obj_abs.can_delete(obj_util, True) == True:

                # Empilement des actions supplémentaires
                tab_act.append('''
					<span action="?action=supprimer-absence-etape-1" class="delete-icon icon-with-text iwt-c-white"
					onclick="trait_get(event, 'suppr_abs');">
						Supprimer
					</span>
					''')

            # Affichage du template
            output = render(
                _req, './gest_abs/consult_abs.html', {
                    'a': obj_abs,
                    'can_update_type_abs_final': can_update_type_abs_final,
                    'tab_act': tab_act,
                    'tab_attrs_abs': init_consult(tab_attrs_abs),
                    'tab_fm': tab_fm,
                    'title': 'Consulter une absence'
                })

    else:
        if 'action' in _req.GET:

            # Insertion de la pièce justificative de l'absence
            if _req.GET['action'] == 'inserer-piece-justificative-absence':

                # Application du droit de modification
                obj_abs.can_update_pj_abs(obj_util, False)

                # Soumission du formulaire
                form_inser_pj_abs = InsererPieceJustificativeAbsence(
                    _req.POST,
                    _req.FILES,
                    prefix=pref_inser_pj_abs,
                    instance=obj_abs)

                if form_inser_pj_abs.is_valid():

                    # Mise à jour d'une instance TAbsence
                    obj_abs_valid = form_inser_pj_abs.save()

                    # Affichage du message de succès
                    output = HttpResponse(json.dumps({
                        'success': {
                            'message':
                            'L\'absence a été mise à jour avec succès.',
                            'redirect':
                            reverse('consult_abs',
                                    args=[obj_abs_valid.get_pk()])
                        }
                    }),
                                          content_type='application/json')

                else:

                    # Affichage des erreurs
                    tab_errs = {
                        '{0}-{1}'.format(pref_inser_pj_abs, cle): val
                        for cle, val in form_inser_pj_abs.errors.items()
                    }
                    output = HttpResponse(json.dumps(tab_errs),
                                          content_type='application/json')

            # Modification du type final d'une absence
            if _req.GET['action'] == 'modifier-type-absence-final':

                # Application du droit de modification
                obj_abs.can_update_type_abs_final(obj_util, False)

                # Soumission du formulaire
                form_modif_type_abs_final = ModifierTypeAbsenceFinal(
                    _req.POST,
                    prefix=pref_modif_type_abs_final,
                    instance=obj_abs.get_verif_abs())

                if form_modif_type_abs_final.is_valid():

                    # Mise à jour d'une instance TVerificationAbsence
                    obj_verif_abs_valid = form_modif_type_abs_final.save()

                    # Affichage du message de succès
                    output = HttpResponse(json.dumps({
                        'success': {
                            'message':
                            'L\'absence a été mise à jour avec succès.',
                            'redirect':
                            reverse('consult_abs',
                                    args=[obj_verif_abs_valid.get_pk()])
                        }
                    }),
                                          content_type='application/json')

                else:

                    # Affichage des erreurs
                    tab_errs = {
                        '{0}-{1}'.format(pref_modif_type_abs_final, cle): val
                        for cle, val in
                        form_modif_type_abs_final.errors.items()
                    }
                    output = HttpResponse(json.dumps(tab_errs),
                                          content_type='application/json')

    return output