Gestion des congés d'un groupe d'entreprises

0/5 (1 avis)

Vue 675 fois - Téléchargée 113 fois

Description

Application complète en ASP.Net et C# de gestion des congés pour un groupe d'entreprises.
La solution/projet est sous Visual Studio Community 2019.
L'application repose sur une base SQLServer (SQLServer express), dont un exemple est fourni.
Cette base exemple dépassant les 2 Mo autorisés sur le site, vous devrez la télécharger
depuis ce lien : krantzy.free.fr/gestionconges/BDD_Conges.zip
Vous devrez modifier la chaîne de connexion dans le fichier Global.asax.cs en fonction
de votre système puis recompiler la solution.
Vous trouverez les infos login/password dans le fichier Web.Config. Il existe deux niveaux d'utilisateurs,
certaines fonctionnalités étant réservées au login "admin" (password : "bestadmin").
Un planning imprimable est généré, pour une des entreprises, un des départements dans l'entreprise ou un des services.
Une fonctionnalité avancée permet de paramétrer un pourcentage minimal requis de personnel par service, qui s'actualise au planning.
Dans la base exemple, testez cette fonctionnalité en demandant le planning du service "Encadrement" de
l'entreprise "Briconet" pour la période du 07 au 27/10/2019.
Bon amusement !

Codes Sources

A voir également

Ajouter un commentaire

Commentaire

Whismeril
Messages postés
13838
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 octobre 2019
311 -
Bonjour
je n'ai pas testé ta source, en effet on suppose toujours que le "déposeur" poste un code fonctionnel, et je n'ai rien à télécharger en ftp.
Et comme je n'y connais rien dans ce domaine, je ne suis pas capable de te juger s'il existe d'autres solutions à te conseiller.

Par contre, sur des petits bouts de ce code, voici quelques remarques.

Tout ce qui est dans la région Évènements est commenté, pourquoi?

Tu utilises une structure pour DirEntry. C'est un type valeur, ce qui implique qu'à chaque fois que tu le passes d'une méthode à une autre, ça copie tout dans un nouvel espace mémoire. Ça finit par être beaucoup plus gourmand en mémoire qu'une classe.
De plus, avec un constructeur c'est la classe qui s'initialise elle même à l'inverse de la structure.
Ici par exemple
                DirEntry Entry = new DirEntry();
                Entry.rights = values[0].Trim();
                Entry.number = values[1].Trim();
                Entry.user = values[2].Trim();
                Entry.group = values[3].Trim();
                Entry.isdir = Entry.rights[0] == 'd';

Pourrait être remplacé par
                DirEntry Entry = new DirEntry(values);

Dans l'idée, l'objet Entry sait à quoi correspondent les champs du tableau, car ça n'est pas le "problème" de la classe FTP.

J'ai l'impression que tu te compliques la vie avec le dictionnaire.
Un champ supplémentaire dans ta structure, et une List<T> aurait le même effet.
Avant toute création / mise à jour, on fait une recherche avec SingleOrDefaut, si le résultat est null alors on ajoute, sinon on met à jour.
Après, pour trier par exemple, il suffit d'un OrderBy()

A un moment, dans un foreach, tu initialises un tableau de mois.
Ce qui veut dire qu'à chaque boucle tu alloues un espace mémoire.
Ça remplit à chaque boucle, un peu de ram pour rien, jusqu'au passage du garbage collector.
Vu que ce tableau sert à chaque boucle de chaque appel de la méthode, le déclarer dans les variables privées de la classe serait plus judicieux.
D'ailleurs là pour le coup, ce tableau ne servant qu'à retourner l'index correspondant au mois, un dictionnaire serait tout aussi adapté.
            Dictionary<string, int> mois = new Dictionary<string, int>();
            mois.Add("Jan", 1);
            mois.Add("Feb", 2);
            mois.Add("Mar", 3);
            mois.Add("Apr", 4);
            mois.Add("May", 5);
            mois.Add("Jun", 5);
            mois.Add("Jul", 7);
            mois.Add("Aug", 8);
            mois.Add("Sep", 9);
            mois.Add("Oct", 10);
            mois.Add("Nov", 11);
            mois.Add("Dec", 12);

            int numeroMoi = mois["Jan"];
Par contre, c'est plus verbeux ;).

Je ne suis pas sûr d'avoir compris la façon dont tu construis Entry.date.
Peux tu poster les différents cas que tu rencontres?

Ici
            // On commence par vérifier que le répertoire supérieur existe
            int nPos = DirPath.LastIndexOf('/');
            string sParentPath;
            if (nPos > 0)
                sParentPath = DirPath.Substring(0, nPos);
            else
                sParentPath = "/";

Path.GetDirectoryName(DirPath) fait la même chose.

Une boucle while(true) présente toujours un risque de tourner à l'infini.
Tu peux remplacer par un timer, et un timer ça peut s'arrêter de l'extérieur.

C'est à peu près toutes les pistes "d'amélioration" que j'ai à te proposer.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.