libertempo / web

Application web de gestion des congés en ligne
GNU General Public License v2.0
66 stars 63 forks source link

Dépassement de congés solde actuel et solde max - libertempo #311

Closed Roddy01 closed 7 years ago

Roddy01 commented 7 years ago

[Bug] Pour nous aider à corriger le bug dans les meilleures conditions, merci de prendre le temps de détailler ces quelques points

Système et application

Bonjour,

Dans le cadre de l'utilisation de Libertempo dans mon projet local actuellement , je souhaiterai envoyé un mail automatique à chaque utilisateur pour tout dépassement de congé actuel qui sera supérieur au congé maximal. En effet, un mail automatique sera à envoyer et à planifier tout le premier jour du mois pour chaque mois à chaque utilisateur. Le responsable ainsi que la RH sera mis en copie de ce mail d'envoi. La tâche d'envoi de mail est donc une automatisation à faire tout le 1er jour du mois précédent.

Si possible, la clôture d'exercice se fermera aussi automatiquement tous les 28ième jour du mois,

Comment faire cela côté codes sources et pouvez-vous me les montrer s'il-vous-plaît car ça fait plusieurs jours que je me suis focaliser sur ça mais en vain!!!! :-(

Rod

prytoegrian commented 7 years ago

Quel est le congé maximal dont tu parles ?

wouldsmina commented 7 years ago

il doit certainement parler de conges_solde_user.su_nb_an

wouldsmina commented 7 years ago

Salut @Roddy01 on va essayer d'avancer par étape. qu'as tu réussi à faire jusqu’à maintenant? étape 1 : créer un fichier et exécuter une requête SQL quelconque.

Roddy01 commented 7 years ago

Bonjour les gars!

Dsl pour ce mail retardé car pb de coupure connexion :-)

Comme je vous ai dis la dernière fois, je pense utiliser cron pour la tâche planifiée de l'envoi de mail. C'est-a-dire afin d'envoyer le mail tout le 1er jour de chaque moi, je pense creer un script php et de l'exécuter avec cron.

Jusk a maintenant, je pense creer un fichier nommé dépassement.php et de faire une requête qui va se communiquer avec la BDD db_conges de Libertempo. Et par la suite, l'intégrer dans cron

Mais comment faire? pouvez-m'aider? Est ce que cette méthode ça ira? ou faudra t-il faire autre méthode car selon Prytoegrian, utiliser cron n'est pas dans le cadre du déco de l'appi

Dans l'attente de votre retour

Pour votre info : 1- Quel est le congé maximal dont tu parles ? ==> c'est conges_solde_user.su_nb_an

2- Il faudra faire aussi une cloture automatik d'exercice tous les 28ième du mois!! Comment faire svp?

Rod

wouldsmina commented 7 years ago

ok, j'ai bien compris ton besoin. C'est faisable mais tu va devoir avancer par étape si tu veux t'en sortir.

je pense creer un fichier nommé dépassement.php et de faire une requête qui va se communiquer avec la BDD db_conges de Libertempo. Et par la suite, l'intégrer dans cron

très bien! donc, pour commencer, créé le fichier depassement.php et essaye d’exécuter une requête te retournant tout les utilisateurs avec u_is_resp=Y. inspire toi de ça par exemple.

Pour t'aider dans le débogage de ton code, tu peux utiliser kint :

Roddy01 commented 7 years ago

Bonjour wouldsmina,

Concernant la requête :

function gettousutilisateurs($login) { if (empty($login)) { return []; } $sql = \includes\SQL::singleton(); $req = 'SELECT * FROM conges_users WHERE u_login =' . $login; $tousutilisateurs = $sql->query($req)->fetch_array();

$tousutilisateurs['u_login'] = $login;

return $tousutilisateurs;

}

Est ce que c'est correct?

Remarques :

1- Où se trouve u_is_resp=Y ? 2- Dans la version libertempo 1.8.1, je n'arrive pas à trouver le fichier cfg/env.php dans ce répertoire cfg

Roddy01 commented 7 years ago

Pour correction car je sais où est u_is_resp :-)

function gettousutilisateurs($login) {

if (empty($login)) { return []; } $sql = \includes\SQL::singleton(); $req = 'SELECT * FROM conges_users WHERE u_is_resp = Y;

$tousutilisateurs = $sql->query($req)->fetch_array();

$tousutilisateurs['u_login'] = $login;

return $tousutilisateurs;

}

wouldsmina commented 7 years ago

$tousutilisateurs['u_login'] = $login; ne sert à rien. Tu as ton résultat dans $tousutilisateurs.

Dans la version libertempo 1.8.1, je n'arrive pas à trouver le fichier cfg/env.php

Autant pour moi, dans la 1.8.1, cette constante ce trouve dans define.php...

Maintenant que tu as tout les responsables, il faut que tu créer une fonction qui va te retourner tout les employés d'un responsable mais tu as de la chance, cette fonction existe dans la 1.9.

l'étape suivante sera d'identifier les employés avec conges_solde_user.su_nb_an < conges_solde_user.su_solde...

Roddy01 commented 7 years ago

Salut!

La requête serait :

//retourner tous les employés d'un responsable avec conges_solde_user.su_nb_an < conges_solde_user.su_solde... function getUsersRespDirect($resp) { $users = []; $sql = \includes\SQL::singleton(); $req = 'SELECT U.u_login FROM conges_solde_user S INNER JOIN conges_users U ON(S.su_login=U.u_login) WHERE S.su_nb_an < S.su_solde AND u_resp_login ="'. $resp . '"' ; $res = $sql->query($req); while ($data = $res->fetch_array()) { $users[] = $data['u_login']; } return $users; }

Dans l'attente de ton retour

Rod

wouldsmina commented 7 years ago

Ok, tu saute une étape mais c'est pas grave...

Avec cette requête, tu n'as que les responsables direct. Si tu veux aussi les responsables de groupe, tu devras chercher dans la table conges_groupe. regarde ce qui est fait ici...

Roddy01 commented 7 years ago

Comment devrais-je faire ou procéder pour la requête car il n'existe de relation de entre la table conges_groupe et conges_users afin d'obtenir les utilisateurs ou employés appartenant à un responsable?

Le 6 février 2017 à 18:53, wouldsmina notifications@github.com a écrit :

Ok, tu saute une étape mais c'est pas grave...

Avec cette requête, tu n'as que les responsables direct. Si tu veux aussi les responsables de groupe, tu devras chercher dans la table conges_groupe. regarde ce qui est fait ici https://github.com/wouldsmina/Libertempo/blob/topic/heure/App/ProtoControllers/Responsable.php#L104 ...

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wouldsmina/Libertempo/issues/311#issuecomment-277724212, or mute the thread https://github.com/notifications/unsubscribe-auth/AYKmaV35-r58UFKtLN6drNPS8U-xXIaIks5rZ0IHgaJpZM4L1LjV .

Roddy01 commented 7 years ago

Pourrais-tu me montrer cette requête stp? Et quelle est l'étape suivante?

Merci d'avance

Rod

Le 6 février 2017 à 19:11, Randrianarison Roddy < roddyrandrianarison@gmail.com> a écrit :

Comment devrais-je faire ou procéder pour la requête car il n'existe de relation de entre la table conges_groupe et conges_users afin d'obtenir les utilisateurs ou employés appartenant à un responsable?

Le 6 février 2017 à 18:53, wouldsmina notifications@github.com a écrit :

Ok, tu saute une étape mais c'est pas grave...

Avec cette requête, tu n'as que les responsables direct. Si tu veux aussi les responsables de groupe, tu devras chercher dans la table conges_groupe. regarde ce qui est fait ici https://github.com/wouldsmina/Libertempo/blob/topic/heure/App/ProtoControllers/Responsable.php#L104 ...

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wouldsmina/Libertempo/issues/311#issuecomment-277724212, or mute the thread https://github.com/notifications/unsubscribe-auth/AYKmaV35-r58UFKtLN6drNPS8U-xXIaIks5rZ0IHgaJpZM4L1LjV .

wouldsmina commented 7 years ago

cette fonction récupère les groupes d'un employé Celle-ci te permet d'avoir les responsables des groupes.

l'étape suivante, c'est de récupérer l'adresse mail du responsable, et enfin construire le mail et l'envoyer (pour cela, il te faudra quelques infos en plus, comme les noms et les prénoms des employés...).

Roddy01 commented 7 years ago

$query1 = "SELECT u_email, u_nom, u_prenom FROM conges_user WHERE u_is_rep = Y OR u_is_hr = Y"; $query2 = "SELECT u_email, u_nom, u_prenom FROM conges_user";

$stmt1 = \includes\SQL::query($query1); $stmt2 = \includes\SQL::query($query2);

while($res2 = $stmt2->fetch_object() AND $res2 = $stmt2->fetch_object() ) {

$object = 'Dépassement de congé.';
$sender_name = $res2->u_prenom . ' ' . $res2->u_nom;
$sender_addr = $res2->u_email;
$dest_name = $res1->u_prenom . ' ' . $res1->u_nom;
$dest_addr = $res1->u_email;

$contenu = "Bonjour \r\n";
$contenu .= "$sender_name, vous avez un depassement de congé de " .

$res->su_reliquat . ".\r\n"; $contenu .= "Vous devez partir en congé ou vous serez renvoyé immédiatement.\r\n\r\n\r\n"; $contenu .= "Les RH.";

mail_depassement($object, $contenu, $sender_name, $sender_addr,

$dest_name, $dest_addr); ==> en utilisant php mailer }

Comment vois tu ce type de programme?

Pourrais-tu stp m'éclaicir sur l'algorithme car tu me demandes de créer plusieurs fonctions et où est ce que je vais les appeler?

une vue globale de l'algo serait génial!!

Dans l'attente

Rod

wouldsmina commented 7 years ago

Une fois que tu aura toutes les fonctions qui vont bien, tu n'aura plus qu'a les appeler directement depuis le même fichier. Pour ce qui est de ta dernière fonction, je suis pas sur pour le while...

Il faut que tu test tes fonction pour voir si elles retournent bien ce que tu attends. C'est pour ça que je t'ai expliqué comment utiliser kint...

Roddy01 commented 7 years ago

j'essaie de tester le retour de mes fonctions :

1er test : function gettousutilisateurs($login)

// retourner tous les responsables function gettousutilisateurs($login) { if (empty($login)) { return []; } $sql = \includes\SQL::singleton(); $req = "SELECT * FROM conges_users WHERE u_is_resp = Y"; $tousutilisateurs = $sql->query($req)->fetch_array();

return $tousutilisateurs; }

d($tousutilisateurs);

Remarques :

1- Est ce que je dois faire d($tousutilisateurs) pour voir le retour cette fonction? 2- En tt cas j'ai une erreur du genre,

login : uri : /libertempo/custom/depassemet_conges_version2.php dump : C:\wamp\www\Libertempo\custom/../dump/sql_1486456027.dump

file : C:\wamp\www\Libertempo\includes\SQL.php line : 90 fx : $SQL->query error : Unknown column 'Y' in 'where clause' sql : SELECT * FROM conges_users WHERE u_is_resp = Y

Dans l'attente,

Rod

Roddy01 commented 7 years ago

Mon problème avec le While c que, je dois reccupérer la mail du responsable autant les infos des users donc selon moi je devrait faire deux requête pour avoir le mail du resp d'une part et les infos des users d'autre part!

As tu une idée?

Merci

Rod

wouldsmina commented 7 years ago
function gettousutilisateurs($login) { 
    if (empty($login)) { 
        return []; 
    } 
    $sql = \includes\SQL::singleton(); $req = "SELECT * FROM conges_users WHERE u_is_resp = Y"; 
    $tousutilisateurs = $sql->query($req)->fetch_array();

    return $tousutilisateurs; 
}

$login ne te sert a rien, retire le. le nom de ta fonction n'est pas clair (si tu reviens sur ton code dans 6 mois tu comprendra plus rien)...

1- Est ce que je dois faire d($tousutilisateurs); pour voir le retour cette fonction?

Dans la fonction, avant le return, oui. tu peux aussi faire d(gettousutilisateurs()) au début de ton fichier.

En tt cas j'ai une erreur du genre,

Unknown column 'Y' in 'where clause' ! Il manque les quotes...

Roddy01 commented 7 years ago

ça marche pour la 1ère.

2ième fonction : function getUsersRespDirect()

/retourner tous les employés d'un responsable avec conges_solde_user.su_nb_an < conges_solde_user.su_solde...

cette fonction ne retourne rien :-(

Pourrais tu m'aider?

Dans l'attente

Rod

2017-02-07 12:30 GMT+03:00 wouldsmina notifications@github.com:

function gettousutilisateurs($login) { if (empty($login)) { return []; } $sql = \includes\SQL::singleton(); $req = "SELECT * FROM conges_users WHERE u_is_resp = Y"; $tousutilisateurs = $sql->query($req)->fetch_array();

return $tousutilisateurs;

}

$login ne te sert a rien, retire le. le nom de ta fonction n'est pas clair (si tu reviens sur ton code dans 6 mois tu comprendra plus rien)...

1- Est ce que je dois faire d($tousutilisateurs); pour voir le retour cette fonction?

Dans la fonction, avant le return, oui. tu peux aussi faire d(gettousutilisateurs()) au début de ton fichier.

En tt cas j'ai une erreur du genre,

Unknown column 'Y' in 'where clause' ! Il manque les quotes...

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wouldsmina/Libertempo/issues/311#issuecomment-277945627, or mute the thread https://github.com/notifications/unsubscribe-auth/AYKmadPBEToUpsELlZBYbFm4WesclqmTks5raDmtgaJpZM4L1LjV .

prytoegrian commented 7 years ago

Tu veux bien mettre tes codes dans : ```php || js {monCode} ```

pour les prochains échanges ? C'est très difficile à lire sans ça.

Roddy01 commented 7 years ago

Dsl! pourrais tu me donner un lien stp car je n'arrive pas à me connecter directement dans github!!

Roddy01 commented 7 years ago

j'ai résolu le pb d'avant car la condition dans ma requête n'était pas présent!!

Mais à présent pour les 2 fonctions :

// Retourner les groupes d'un employés

function getGroupesId()
    {
        $ids = [];
        $sql = \includes\SQL::singleton();
        $req = 'SELECT gu_gid AS id
                    FROM conges_groupe_users
                    WHERE gu_login ="'.\includes\SQL::quote($user).'"';
        $res = $sql->query($req);
        while ($data = $res->fetch_array()) {
            $ids[] = (int) $data['id'];
        }
        return $ids;
    }

    d(getGroupesId());

//Retourner les responsables d'une liste de groupe

function getListResponsableByGroupeIds(array $groupeIds)
    {
        $sql = \includes\SQL::singleton();
        $req = 'SELECT gr_login,gr_gid
                FROM conges_groupe_resp
                WHERE gr_gid IN (\'' . implode(',', $groupeIds) . '\')';
        $query = $sql->query($req);

        while ($data = $query->fetch_array()) {
            $respLogin[$data['gr_gid']] = $data['gr_login'];
        }
        return $respLogin;
    }

comment devrais-je appeler leurs valeurs de retours et c quoi les paramètres à mettre dans les fonctions? ou devrais-je ne pas mettre de paramètre?

Dns l'attente

Rod

wouldsmina commented 7 years ago

getGroupesId() : il manque $user en paramètre...

getListResponsableByGroupeIds(array $groupeIds) $groupeIds correspond au résultat de getGroupesId()

Roddy01 commented 7 years ago

comment je dois appeler la fonction PHP getGroupesId($users) et getListResponsableByGroupeIds(array $groupeIds avec kint pour avoir les valeurs de retour des fonctions?

Ex : d(getGroupesId(?))=> c'est quoi le paramètre à mettre? même cas pour getListResponsableByGroupeId

2017-02-07 13:31 GMT+03:00 wouldsmina notifications@github.com:

getGroupesId() : il manque $user en paramètre...

getListResponsableByGroupeIds(array $groupeIds) $groupeIds correspond au résultat de getGroupesId()

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wouldsmina/Libertempo/issues/311#issuecomment-277959882, or mute the thread https://github.com/notifications/unsubscribe-auth/AYKmaXBpVVNCEIBrc1Ns82Cg4BZQl-x7ks5raEgHgaJpZM4L1LjV .

wouldsmina commented 7 years ago

Il faut vraiment que tu fasse un effort de rédaction...

wouldsmina commented 7 years ago

getGroupesId($users) : $users correspond à ce que t'as retourné la fonction getUsersRespDirect() (le nom de cette fonction n'est pas clair non plus!). Vu que getUsersRespDirect() te retourne un tableau, tu dois faire une boucle pour appeler getGroupesId($users) et getListResponsableByGroupeIds

Roddy01 commented 7 years ago

Wouldsmima!

si je souhaite clôturer automatiquement la clôture d'exercice de Libertempo dans la rubrique RH, pourrais-tu me donner une fonction qui va exécuter cette clôture sans passer par validation manuelle.

J'ai déjà regardé les fonctions dans le répertoire hr/ mais en voyant les fonctiond cloture globale et cloture par personne, il existe plusieurs appels de fonction dans ces fonctions donc c un peu difficile pour moi de l'adapter à mes besoins.

Donc si je résume, pourrais tu me donner directement une fonction qui va cloturer l'exercice sans passer par ces variables de SESSIONS, ces appels de fonctions à l'intérieur de cloture_globale et clôture_par_personnes?

Merci d'avance

Rod

Le 7 février 2017 à 13:49, wouldsmina notifications@github.com a écrit :

getGroupesId($users) : $users correspond à ce que t'as retourné la fonction getUsersRespDirect() (le nom de cette fonction n'est pas clair non plus!). Vu que getUsersRespDirect() te retourne un tableau, tu dois faire une boucle pour appeler getGroupesId($users) et getListResponsableByGroupeIds

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/wouldsmina/Libertempo/issues/311#issuecomment-277963821, or mute the thread https://github.com/notifications/unsubscribe-auth/AYKmaXpMmty4p5dec3miVzYWznvjIoBXks5raEw_gaJpZM4L1LjV .

wouldsmina commented 7 years ago

Tu es arrivé à finir l'envoi de mail en cas de solde trop élevé?

Roddy01 commented 7 years ago

oui mais sans les fonctions saul pour celui du mail

wouldsmina commented 7 years ago

ok. En ce qui concerne la clôture d'exercice, je maîtrise un peu moins. Je regarde comment ça marche dés que j'ai un peu de temps...

Roddy01 commented 7 years ago

Bjr,

As tu des infos sur la fonctionnalité de cette clôture?

Merci d'avance

Rod

wouldsmina commented 7 years ago

Salut @Roddy01, J'ai réfléchi à ton besoin hier soir. Finalement tu n'as pas forcément besoin d’exécuter un changement d'exercice. Ce que tu veux (dit moi si je me trompe), c'est incrémenter le solde des employés de 2,5 jours par mois. Si c'est bien cela, c'est très simple, tu as une seul requête à faire...

Roddy01 commented 7 years ago

Salut,

C'est exactement ce que je souhaite à faire!

Pourrais tu me monter cette requête stp? un exemple

Rod

wouldsmina commented 7 years ago

UPDATE conges_solde_user SET su_solde = su_solde+2.5 La tu ajoute 2,5 a tout le monde. Après, a toi de voir si tu as d'autres critères pour incrémenter le solde. Par exemple, ne prendre en compte que les utilisateurs activé conges_users.u_is_active = Y...

wouldsmina commented 7 years ago

@Roddy01 on peut clore le sujet? tu es arrivé à tes fins?