Attestation Déplacement - Integration Jeedom PHP auto - creation fichier local et envoi telegram

Bonjour à tous,
Suite à la discussion Covid - générateur d'attestation de déplacements - #103 par seb821

je vous propose ma petite contribution pour mettre en place l’envoi d’une attestation pdf directement depuis jeedom ( vers telegram pour moi).

[edit] au format plugin : gitHub image
Dispo sur le market!
[/edit]

Je suis parti du principe qu’on peux écrire à la main une attestation, donc pas besoin d’avoir le script de validation du document du site du gouvernement qu’utilise GetLucko
.
J’utilise FPDF et FPDI plus phpqrcode (merci naboleo) avec une petit classe person pour rester en full php.

un petit include, quelque variables et le tour est joué.

Les fichiers en bas du post.
A décompresser dans un sous répertoire de jeedom, il faudra adapter l’include dans le bloc code (chez mois dans script/customs_scripts/)

La classe ATTESTGEN à appeler :

require_once dirname(__FILE__) . '/../../script/customs_scripts/PDF_Gen/AttestGen.class.php';
$ag = new ATTESTGEN();
// =génération du pdf, retourne l'url du document, va dans le sous répoertoire 'EXPORT' du dossier précédent
$pdfURL = $ag->generate_attest($nom, $prenom, $date_naissance,$lieu_naissance,$adresse,$code_postal,$ville, array($motif));  // les noms des variables me semblent explicites
// pour récupérer l'URL du qrcode généré, même endroit
$pngURL = $ag->getPNGURL();

les motifs sont tels que :

const TRAVAIL = 'travail';
const ENFANT = 'enfant';
const LOISIR = 'loisir';
const ACHAT = 'Achats';
const SANTE = 'Soins';
const FAMILLE = 'Famille';
const HANDI = 'handicap';
const JUDIC = 'judiciaire';
const MIG = 'mission';

a appeler par ATTESTGEN::TRAVAIL par exemple

Le constructeur du pdf demande un array pour les motifs => possibilité d’en cocher plusieurs!

[EDIT] ajout des fonction de suppression des fichiers :

$success_Delete = $ag->deletePDFFile(); // renvoie true/false
$success_Delete = $ag->deleteQRFile(); // renvoie true/false
$success_Delete = $ag->deleteAllFiles(); // renvoie true/false

et pour le passer à telegram

$strOption='file='.$pdfURL;// specifie le chemin du fichier
//ou encore
$strOption='file='.$pngURL.','.$pdfURL;// pour avoir le QR code + le pdf

$messCol= array('title'=>$strOption, 'message'=> 'Attestation COVID du '.$date_time.' / '.$motif);
$cmd=cmd::byString("#[OBJET][Equipement Telegram][user]#");
$cmd->execCmd($messCol, $cache=0);

// et on supprime les fichier s
$successDelete=$ag->deleteAllFiles();

perso, je passe par un ask télégram (et/ou une interaction pour lui demander directement) quand je sort de chez moi, en demandant le type d’attestation voulue et j’appelle un scénario avec le bloc code pour me remplir les données d’identification et de motif.


v

et dans mon scénario j’ai des array en fonction du motif et de la personne du type

$motifArray=array('Travail'=>ATTESTGEN::TRAVAIL,
                  'Ecole'=>ATTESTGEN::ENFANT,
                  'Sortie'=>ATTESTGEN::LOISIR,
                  'Achats'=>ATTESTGEN::ACHAT,
                  'Soins'=>ATTESTGEN::SANTE,
                  'Famille'=>ATTESTGEN::FAMILLE             
  
  );

$infosArray=array(
  'Ben'=>array('nom'=>'MON NOM','prenom'=>'Ben', 'ddn'=>'01/01/1970','lieu_naiss'=>'Trouduc','adresse'=>'25 rue pas loin','ville'=>'poilauc', 'code_postal'=>'00001'),
  'maFemme'=>array('nom'=>'SON NOM','prenom'=>'Jeluidemanderai', 'ddn'=>'çanesemdemandepas','lieu_naiss'=>'Pas ICI','adresse'=>'25 rue pas loin','ville'=>'poilauc', 'code_postal'=>'00001')
  );

et plus qu’à selectionner pour appeler la fonction de construction du pdf, envoi à telegram et hop!

Enjoy It!

Disclaimer : Je ne suis pas dev, y’a forcément des mauvaise pratiques, je prends toutes les remarques bienveillantes!

Les fichiers : Lien Github

[edit] ajout des fonctions de suppressions des fichiers histoire que ça ne traine pas pour rien dans les exports
[edit 2] avec un arborescence plus évidente, et sans le sfichier inutiles des lib (ceux que j’ai identifiés)
[edit 3] avec une vérif sur l’existence du dossier d’export

7 « J'aime »

ce serait bien d’en faire un plugin :slight_smile:

Je me méfie des plug ins qui contiennent des virus :upside_down_face:

1 « J'aime »

Bonjour @Bben,
pourrais tu détailler l’installation sur jeedom stp. Style pas à pas pour un newbie comme moi.
merci

1 « J'aime »

Bonjour Laguinch,

1/ télécharger le fichier PDF_Gen_1.02.zip.txt - edit nouveau fichier avec la bonne arbo et moins de fichiers…-
2/ le renommer en PDF_Gen_1.02.zip
3/ décompresser le fichier => Tu obtiens un dossier 'PDF_Gen'
4/ il faut mettre ce dossier dans un sous répertoire ou est ton jeedom
Usuellement, avec le plugIn JeeExplorer, j’ai créé les répertoires script/customs_scripts à la racine de jeedom (dans var/ww/html/)
J’y ai mis le dossier décompressé ci dessus

Dans Jeedom->outils->scénario
5/ créé un nouveau scénario, ajouter un bloc code :

//inclure la bibliothèque
// a adapter selon l'endroit ou tu à copié le dossier
require_once dirname(__FILE__) . '/../../script/customs_scripts/PDF_Gen/AttestGen.class.php';

//on créé u instance de la classe :
$ag = new ATTESTGEN();

//Génération du pdf 
//!! a toi de voir comment tu remplis les variables 
// perso je passe des tags à ce scénario (utilisateur et motif) pour selectionner automatiquement les variables
$pdfURL = $ag->generate_attest($nom, $prenom, $date_naissance,$lieu_naissance,$adresse,$code_postal,$ville, array($motif));  // les noms des variables me semblent explicites
// pour récupérer l'URL du qrcode généré, même endroit
$pngURL = $ag->getPNGURL();


// envoi à telegram
$strOption='file='.$pngURL.','.$pdfURL;// pour avoir le QR code + le pdf envoyé avec le message
$messCol= array('title'=>$strOption, 'message'=> 'Attestation COVID du '.$date_time.' / '.$motif);

$cmd=cmd::byString("#[OBJET][Equipement Telegram][user]#");// renseigner la commande telegram à utiliser
$cmd->execCmd($messCol, $cache=0);// on fait partir le télégram


// et on supprime les fichiers pour éviter d'accumuler les attestations dans le repertoire.
$successDelete=$ag->deleteAllFiles();

And voila

Mon scénario code en détail
require_once dirname(__FILE__) . '/../../script/customs_scripts/PDF_Gen/AttestGen.class.php';

// la liste des motif que j'utilise, 
//les nom des clé étant les valeurs de la variable retourné dans un ask telegram préalable transmis dans un tag 'motif'
$motifArray=array('Travail'=>ATTESTGEN::TRAVAIL,
                  'Ecole'=>ATTESTGEN::ENFANT,
                  'Sortie'=>ATTESTGEN::LOISIR,
                  'Achats'=>ATTESTGEN::ACHAT,
                  'Soins'=>ATTESTGEN::SANTE,
                  'Famille'=>ATTESTGEN::FAMILLE             
  
  );

// les renseignements des utilisateurs,
// les clés sont les valeurs du tag 'Qui' que je passe au scénario
$infosArray=array(
  'Ben'=>array('nom'=>'MON NOM','prenom'=>'Ben', 'ddn'=>'01/01/1970','lieu_naiss'=>'Trouduc','adresse'=>'25 rue pas loin','ville'=>'poilauc', 'code_postal'=>'00001'),
  'maFemme'=>array('nom'=>'SON NOM','prenom'=>'Jeluidemanderai', 'ddn'=>'çanesemdemandepas','lieu_naiss'=>'Pas ICI','adresse'=>'25 rue pas loin','ville'=>'poilauc', 'code_postal'=>'00001')
  );
  
$tags=$scenario->getTags();// récup des tag

if(!isset($tags['#qui#'])){// si le tag qui n'est pas renseigné, je me met moi, pour les tests principalement
  	$scenario->setLog('QUI non reconnu'.$tags['#qui#']);
	$tags['#qui#']='Ben';
}
if(!isset($tags['#motif#'])){// pour les motif, par défaut je met sortie, comme ça quand je ne répond pas au ask il m'envoi par défaut une attestation sortie
  	$scenario->setLog('motif non reconnu'.$tags['#motif#']);
	$tags['#motif#']='Sortie';
}
$qui=$tags['#qui#'];

// on valorise les variables selon les entrée des array au dessus
$nom=$infosArray[$qui]['nom'];
$prenom=$infosArray[$qui]['prenom'];
$date_naissance=$infosArray[$qui]['ddn'];
$lieu_naissance=$infosArray[$qui]['lieu_naiss'];
$adresse=$infosArray[$qui]['adresse'];
$code_postal=$infosArray[$qui]['code_postal'];
$ville=$infosArray[$qui]['ville'];

$motif=$motifArray[$tags['#motif#']];// selection du motif

$date_time=strftime("%d/%m/%G a %Hh%M");// récupération de la date+heure courante

// génération du pdf
$ag = new ATTESTGEN();
$pdfURL = $ag->generate_attest($nom, $prenom, $date_naissance,$lieu_naissance,$adresse,$code_postal,$ville, array($motif));
$pngURL = $ag->getPNGURL();

$scenario->setLog('PDF URL String : '.$pdfURL);
$scenario->setLog('PNG URL String : '.$pngURL);

//option fichier PNG pour le QR code et pdf
$strOption='file='.$pngURL.','.$pdfURL;
$scenario->setLog('Option String : '.$strOption);
$messCol= array('title'=>$strOption, 'message'=> 'Attestation COVID du '.$date_time.' / '.$motif);

if($qui=='Ben'){
	$cmd=cmd::byString("#[OBJET][TELEGRAM][User1]#");
}elseif($qui=='maFemme'){
  	$cmd=cmd::byString("#[OBJET][TELEGRAM][User2]#");
}
$cmd->execCmd($messCol, $cache=0);

//suppression des fichiers sur le serveur
$success=$ag->deleteAllFiles();
$scenario->setLog('success delete all file :'.$success);

Il est ‹ démarré › par un autre scénario qui gère les asks aux utilisateurs si il les détecte hors de la maison ou si ils demandent via telegram/interaction une attestation (cf screenshot 1er posts).

J’espère que tu auras tout, n’hésites pas au besoin.

2 « J'aime »

Fonctionne très bien merci :wink:
on a le droit d’avoir une attestation numérique sans signature, ou alors le qrcode est pour ce cas la ?

Si tu fais une maj, il peut-être intéressant de passer la date et heure en argument.

c’est une bonne question…
Je verrai avec le 1er policier que je croiserait !

On pourrais imaginer ajouter une signature (image de scan de signature) au bas du document. mais pas plus de valeur à vrai dire.

D’ailleurs, est ce qu’on ne pourrait pas utiliser le certificat ssl pour signer numériquement le pdf? si quelqu’un à la réponse!

merci pour le tuto @Bben, me je patoge encore :thinking:
J’ai crée le scenario avec le 1er code j’en suis donc à « And voila ».
Le 2eme code que dois je en faire ?
merci

Lut

A priori, il y a moyen d’insérer une image dans un pdf, en scannant sa signature manuelle, il y a peut-être un truc à faire.
En tout cas, à mon avis c’est plus « police friendly » qu’un pdf signé numériquement…

$pdf->Image('MyImage.jpg', $x, $y, $width, $height);

C’est la même chose, le premier donne la methode d’usage, le second est juste un cas d’usage, le mien, pour éventuellement donner des idées sur la génération des variables.

Oui, c’est ce que je fait avec le qrcode. Je génère le png puis je l’insére ds le pdf
C’est une possibilité, mais le pdf fait bien illusion. Le qr code donne à priori les mêmes infos, est ce que l’encodage est spécifique… ?

@Bben,
ok j’ai donc repris le meme que toi en modifiant les variables.
Comme j’ai telegram peux tu me donner ton scenario de declechement stp.
merci

je ne trouve pas var/ww/html

L’encode du qrcode ou de l’image ?
Le qrcode, c’est finalement qu’une bête sérialisation
Pour la signature on peut spécifier le format de l’image =>

pdf->Image($image, 183, 250, 25, 25, 'PNG' );

Regarde /var/www/html/

En fait je crée le png du QR code puis le pdf avec les infos, puis j’y insère le png .

Je trouvais ça sympa d’avoir le qr code en gros ds telegram pour le présenter directement ocazou, du coup je n’ai pas plus creuser la lib phpqrcode.

1 « J'aime »

J’essai de te faire ça qd les gremlins seront couchés

1 « J'aime »

Oui c’est exactement pour ça que j’avais ajouté le QRcode chez moi
A mon avis, faut pas ajouter la signature dans le QRcode. Juste la signature dans le PDF : Comme le QR Code ne contient que du texte (une fois décodé), ça donnerai rien

1 « J'aime »

@Bben,
j’en suis la :


si le scenario est ok, du coup dans telegram je vais sur mon bot et je fais quoi ?
quel declencheur as tu mis ? d’apres ce que j’ai compris c’est qd tu quitte la maison ou ?

Attention à la syntaxe : variable et pas varia l ble

1 « J'aime »