<?php
namespace App\Controller;
// begin token-guard ---------------------------------------------------------------------------------
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
use Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator;
// end token-guard ---------------------------------------------------------------------------------
// begin mochel meyer products --------------------------------------------------------------
use App\Service\MeylerService;
use App\Service\USRService;
use App\Service\LOGDEFService;
use App\Service\DIVService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface; // contrôleur de contraintes
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; // l'encodeur ofcourse
use App\Entity\usr;
use App\Entity\cat;
use App\Entity\prf;
use App\Entity\ppi;
use App\Entity\CFEMP;
class USRController extends AbstractController
{
// some services, begin token-guard ---------------------------------------------------------------------------------
private $csrfTokenManager;
private $parambag;
private $meylerservice;
private $usrservice;
private $divservice;
public function __construct(
CsrfTokenManagerInterface $csrfTokenManager,
ParameterBagInterface $parambag,
MeylerService $meylerservice,
USRService $usrservice,
DIVService $divservice
)
{
$this->csrfTokenManager = $csrfTokenManager;
$this->parambag = $parambag;
$this->meylerservice = $meylerservice;
$this->usrservice = $usrservice;
$this->divservice = $divservice;
}
// end some services, token-guard ---------------------------------------------------------------------------------
// recherche usr réservé aux admins
#[Route(path: '/admin/usr/rec', name: 'admin_usr_rec')]
public function rec
(
Request $request,
ManagerRegistry $doctrine,
UserPasswordHasherInterface $passwordHasher
): Response
{
$em = $doctrine->getManager();
$user = $this->getUser();
// test vérif mapping tbl CDC TODO à supprimer plus tard
// $query = $em->getRepository(CFEMP::class)->createQueryBuilder('cfemp');
// $query
// ->select('cfemp')
// ->join('cfemp.PRJID','cfprj')
// ->join('cfprj.CFPPIID','cfppi')
// ->join('cfprj.TFIIDS','cftfi')
// ->join('cftfi.TIRIDS','cftir')
// ->join('cfprj.TBFIDS','cftbf')
// ->join('cftbf.CROIDS','cfcro')
// ->join('cfemp.TYEID','cftye')
// ->join('cfemp.ERBID','cferb')
// ->where('cfemp.EMPANN IS NULL')
// ->orderBy('cfemp.TYEID', 'DESC')
// ;
// $aga = $query->getQuery()->getResult();
// vérif si admin
$lstadmin = $this->divservice->getIdAdmin();
if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){
// formulaire recherche
$listCAT = $em->getRepository(cat::class)->findAllOrderedByLib(array(),'array');
$form_rec = $this->createForm('App\Form\USR_rec', null, array(
'listCAT'=>$listCAT,
));
$form_rec->add(
'Rechercher', 'Symfony\Component\Form\Extension\Core\Type\SubmitType', array(
'label'=>"Rechercher",
'attr'=>array('class'=>'btn btn-primary'),
)
);
$form_rec->add('Reset','Symfony\Component\Form\Extension\Core\Type\ResetType',
array(
'label'=>'Réinitialiser',
'attr'=>array('class'=>'btn btn-default'),
)
);
$form_rec->handleRequest($request);
// Récupération des données POST et construction de la requete de recherche
$postData = $request->request->get('usr_rec');
// Requete de recherche
$rec_limit = 300;
$query = $em->getRepository(usr::class)->createQueryBuilder('usr');
$query
->select('usr.usrid, usr.usrorg, usr.usrnom, usr.usrpre, usr.usrstatut, usr.usremail, usr.usrdatlog, usr.usrdatcre, usr.usrdatenvchgpwd, usr.usrcodpos, cat.catlib')
->join('usr.catid','cat')
->where('usr.usrid <> 32') // en prod, commenter
;
if(($form_rec->isSubmitted())&&($form_rec->isValid())){
// recherche par Nom ou Prénom
if($postData['usrnom']!=''){
$query
->andwhere('usr.usrnom LIKE :usrnom OR usr.usrpre LIKE :usrnom')
->setParameter('usrnom' , '%'.$postData['usrnom'].'%')
;
}
if($postData['usremail']!=''){
$query
->andwhere('usr.usremail LIKE :usremail')
->setParameter('usremail' , '%'.$postData['usremail'].'%')
;
}
if($postData['usrcodpos']!=''){
$query
->andwhere('usr.usrcodpos LIKE :usrcodpos')
->setParameter('usrcodpos' , '%'.$postData['usrcodpos'].'%')
;
}
if($postData['usrorg']!=''){
$query
->andwhere('usr.usrorg LIKE :usrorg')
->setParameter('usrorg' , '%'.$postData['usrorg'].'%')
;
}
// recherche par Catégorie
if($postData['catid']!=''){
$query
->andwhere('usr.catid = :catid')
->setParameter('catid' , $postData['catid'])
;
}
// recherche par Statut
if($postData['usrstatut']!='5'){
$query
->andwhere('usr.usrstatut = :usrstatut')
->setParameter('usrstatut' , $postData['usrstatut'])
;
}
// recherche par date création
$creation_fSPeriod = $postData['creation_fSPeriod'];
if(($postData['creation_period']!='')&&($creation_fSPeriod=='checked')){ // si switch on
list($creatfrom,$creatto) = explode(' - ',$postData['creation_period']);
$query
->andwhere('usr.usrdatcre BETWEEN :creatfrom AND :creatto')
->setParameter('creatfrom', $this->divservice->DateFR2EN($creatfrom))
->setParameter('creatto', $this->divservice->DateFR2EN($creatto))
;
}
}else{
$creation_fSPeriod = ""; // exclusion période création par défo (voir form)
$query
->where('usr.usrstatut = :usrstatut')
->setParameter('usrstatut' , '0') // par défaut les en attente seuls
;
}
$query
->orderBy('usr.usrnom','ASC');
$utilisateurs = $query->getQuery()->getArrayResult();
$nb_usr = count($utilisateurs);
if($nb_usr > $rec_limit){
$utilisateurs = $query->getQuery()->setMaxResults($rec_limit)->getArrayResult();
}
// vérif pour chaque utilisateur si ID présent dans une table liée (possibilité de noms de champ différents)
$grp_tables = array(
'tbl_usrid' => array('PPI') // lien modif/création/annulation (usrid)
// 'tbl_USRIDDERMOD' => array('BAD','DIS','INS','INTZ','MEC','MOB','MOV','NOTZ','ORG','PER','PLA','QUA','SES'), // lien modf (USRIDDERMOD)
// 'tbl_USRIDCRE' => array('BAD_FIC','BAD_ZON','DIS','INTZ','INT_MOB','MCT','MEC','MEC_FIC','MOB','MOB_FIC','MOB_URL','MOV','MOV_FIC','MOV_URL','MPR','NOT_FIC','ORG','OWM','OWQ','QMO','QUA','QUA_FIC','SES_FIC','SES_URL','USR_BUL','USR_DEP','DIS_USR') // lien création (USRIDCRE)
);
foreach($utilisateurs as $key=>$utilisateur){
$utilisateurs[$key]['nboccur'] = 0;
foreach($grp_tables as $key2=>$ungrp){
$nomchamp = substr($key2, 4);
foreach($ungrp as $table){
$query = $em->getRepository(PPI::class)->createQueryBuilder($table);
$query
->select('count('.$table.'.'.$nomchamp.')')
->where($table.'.'.$nomchamp.' = :usrid')
->setParameter('usrid', $utilisateur['usrid'])
;
$sql = $query->getQuery();
$nboccur = $sql->getSingleScalarResult();
if($nboccur>0){
$utilisateurs[$key]['nboccur'] = $nboccur;
break;
}
}
}
}
// Affichage formulaire de recherche et de la liste des utilisateurs
return $this->render(
'usr\rec.html.twig',
array(
'help_dir' => $this->parambag->get('dochelp_web_path'), //forcreatmenu
'lstadmin' => implode(',',$lstadmin),
'form_rec' => $form_rec->createView(),
'usrs' => $utilisateurs,
'nb_usr' => $nb_usr,
'rec_limit' => $rec_limit,
'creation_fSPeriod' => $creation_fSPeriod,
)
);
}else{ // erreur réservé admin
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (adm)'
);
// Affichage page inexistante
return $this->render('default\noway.html.twig', array(
));
}
}
// Suppression d'un compte USR
#[Route(path: '/admin/usr/sup/{usrid}', name: 'admin_usr_sup')]
public function sup
(
$usrid,
Request $request,
ManagerRegistry $doctrine
): Response
{
$em = $doctrine->getManager();
$user = $this->getUser();
$sup = false;
$lstadmin = $this->divservice->getIdAdmin();
if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){ // seuls les admin peuvent éliminer
$usrid = ($usrid-17) / 2048; // transfo simple id dans rec.html.twig
$usr = $em->getRepository(usr::class)->findOneBy(array('usrid'=>$usrid));
if($usr!=null){
$em->remove($usr);
$em->flush();
$supp = true;
}
if($supp){
$this->get('session')->getFlashBag()->add(
'Succès',
"Compte supprimé avec succès"
);
}else{
$this->get('session')->getFlashBag()->add(
'Erreur',
"Le compte n'a pas pu être supprimé"
);
}
// Redirection vers la liste des usr
return $this->redirect($this->generateUrl('admin_usr_rec'));
}else{ // erreur réservé admin
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (adm)'
);
// Affichage page inexistante
return $this->render('default\noway.html.twig', array(
));
}
}
// modification d'un compte USR par admin
#[Route(path: '/admin/usr/maj/{usrid}', name: 'admin_usr_maj')]
public function maj
(
$usrid,
Request $request,
ManagerRegistry $doctrine,
UserPasswordHasherInterface $passwordHasher,
ValidatorInterface $validator
): Response
{
$em = $doctrine->getManager();
$user = $this->getUser();
$maj = false;
$lstadmin = $this->divservice->getIdAdmin();
if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){ // seuls les admin peuvent modifier
$usrid = ($usrid-103) / 4096; // transfo simple id dans rec.html.twig
$usr = $em->getRepository(usr::class)->findOneBy(array('usrid'=>$usrid));
if($usr!=null){
$statut_avant = $usr->getusrstatut(); // récup statut avant modif
$listCAT = $em->getRepository(CAT::class)->findAllOrderedByLib(array(),'array');
// formulaire màj admin
$form_majadm= $this->createForm('App\Form\USR_majadm', $usr, array(
'listCAT' => $listCAT,
));
$form_majadm->add('Annuler', 'Symfony\Component\Form\Extension\Core\Type\ButtonType', array(
'label'=>"Annuler",
'attr'=>array('class'=>'btn btn-primary', 'data-url'=>$this->generateUrl('admin_usr_rec'))
));
$form_majadm->add('Enregistrer','Symfony\Component\Form\Extension\Core\Type\SubmitType',array(
'label'=>"Enregistrer",
'attr'=>array('class'=>'btn btn-primary')
));
$form_majadm->handleRequest($request);
// vérif saisie form_majadm via validator annotations niveau Entity (après validation formulaire)
if($request->request->get('usr_majadm')){
// dd($request->request->get('usr_maj'));
$errors = $validator->validate($usr);
if(count($errors) > 0) {
// dd($errors);
foreach($errors as $error){
$this->get('session')->getFlashBag()->add(
'Erreur',
$error->getmessage()
);
}
}
}else{
$errors = array();
}
if($request->request->get('usr_majadm')){ // maj utilisateur
if(($form_majadm->isSubmitted())&&($form_majadm->isValid())){
$postData = $request->request->get('usr_majadm');
// begin token-guard --------------------------------------------------------------------------------------------------------------
$csrfToken = $postData['_token'];
if(false === $this->csrfTokenManager->isTokenValid(new CsrfToken('usrmajadgarg88', $csrfToken))){
$this->get('session')->getFlashBag()->add(
'Erreur',
"Impossible d'accéder à la fonction demandée. (toua)" // bad token user admin
);
return $this->redirect($this->generateUrl('pageaccueil')); // renvoi caval
// end token-guard --------------------------------------------------------------------------------------------------------------
}else{
if($postData['usrpwdmaj'] != ''){ // redéfinition du mot de passe
// vérif pwd ok
$pwdok = $this->usrservice->verif_pwd_usr($postData['usrpwdmaj']);
if($pwdok==false){
$this->get('session')->getFlashBag()->add(
'Erreur',
'Ce mot de passe ne répond pas aux conditions de sécurité requises'
);
// re-affichage formulaire
return $this->render('usr\majadm.html.twig',
array(
'help_dir' => $this->parambag->get('dochelp_web_path'), //forcreatmenu
'form_majadm' => $form_majadm->createView(),
'usr' => $usr,
'errors' => $errors,
)
);
}else{
$hashedPassword = $passwordHasher->hashPassword(
$usr,
$postData['usrpwdmaj']
);
$usr->setPassword($hashedPassword);
}
}
// Enregistrement en bdd
$em = $doctrine->getManager();
$em->persist($usr);
$em->flush();
$activation = false; // ===========================================
if(($statut_avant==0)&&($postData['usrstatut']==1)){ // si (ré)activation du compte
$activation = true;
$mailaenv = array();
$mailaenv['sujet'] = "Activation de votre compte Collectiv'Finance";
$mailaenv['titre'] = "[Rural Consult] Activation de votre compte d'accès à Collectiv'Finance";
$mailaenv['expediteur_nom'] = "Assistance technique Rural Consult";
$mailaenv['expediteur_email'] = "assistance.technique@solidaires.com";
$mailaenv['destinataire_nom'] = $usr->getUsrpre().' '.$usr->getUsrnom();
$mailaenv['destinataire_email'] = $usr->getUsremail();
$mailaenv['fichiers'] = array(); // les fichiers joints
//$mailaenv['fichiers'][0] = array(); // 1° fichier à joindre => pas de documents joints
//$mailaenv['fichiers'][0]['chemin_fichier'] = "";
//$mailaenv['fichiers'][0]['nom_fichier'] = "";
//$mailaenv['fichiers'][0]['nom_orig'] = "";
$mailaenv['cc'] = ''; // pas de copie ici
$destinataire_nom_bcc = "Assistance technique Rural Consult";
$destinataire_email_bcc = "assistance.technique@solidaires.com";
$mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
$urllogo = $this->parambag->get('img_path')."entet_email_cf.webp";
// texte du mail
$bodymail = "<div style='width:680px;margin:0 auto;'>";
$bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
$bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
$bodymail.= "<p style='padding:30px 10px;'>Bonjour <b>".$usr->getUsrpre().' '.$usr->getUsrnom()."</b><br /> <br />";
$bodymail.= "Votre demande d'accès aux outils d'analyse financière Collectiv'Finance vient d'être validée.<br /> <br />";
$bodymail.= "Vous pouvez dès maintenant <a href=".$this->parambag->get('web_path')."><b>vous connecter</b></a> et ";
$bodymail.= "utiliser ces outils d'analyse financière mis à la disposition des intercommunalités et des communes.<br /> <br />";
$bodymail.= "En cas de difficulté technique, vous pourrez contacter l'assistance technique de Rural Consult :<br />";
$bodymail.= "- par courriel : <a href='mailto:assistance.technique@solidaires.com' title='Assistance technique Rural Consult'>assistance.technique@solidaires.com</a><br />";
$bodymail.= "- par téléphone : <b>01 58 50 75 75</b>.<br/> <br />";
$bodymail.= "Pour toute question concernant les outils eux-mêmes, contacter par courriel : <a href='mailto:territoiresconseils@caissedesdepots.fr' title='Rural Consult'>territoiresconseils@caissedesdepots.fr</a><br /> <br />";
$bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
$bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br /> <br />";
$bodymail.= "</p></div>";
$bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
$bodymail.= "Rural Consult © Tous droits réservés</div>";
$bodymail.= "</div>";
$mailaenv['body'] = $bodymail;
$unmess = $this->meylerservice->envoidunmail('activation compte',$mailaenv); // envoi
}
$message = 'Compte modifié avec succès.';
if($activation){
$message.= ' Ce compte est activé, un courriel a été expédié pour prévenir '.$usr->getUsrpre().' '.$usr->getUsrnom().' de cette activation.';
}
// Message d'information
$this->get('session')->getFlashBag()->add(
'Succès',
$message
);
// Redirection vers la liste des Utilisateurs
return $this->redirect($this->generateUrl('admin_usr_rec'));
}
}
}
// (ré)Affichage formulaire
return $this->render('usr\majadm.html.twig',
array(
'help_dir' => $this->parambag->get('dochelp_web_path'), //forcreatmenu
'form_majadm' => $form_majadm->createView(),
'usr' => $usr,
'errors' => $errors
)
);
}else{
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (nouadm)'
);
// Affichage page inexistante
return $this->render('default\noway.html.twig', array(
));
}
}else{ // erreur réservé admin
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (notadm)'
);
// Affichage page inexistante
return $this->render('default\noway.html.twig', array(
));
}
}
// Màj compte USR par l'utilisateur lui-même
#[Route(path: '/musr/{usrid}', name: 'modifcpte')]
public function majcpte
(
$usrid,
Request $request,
ManagerRegistry $doctrine,
UserPasswordHasherInterface $passwordHasher,
ValidatorInterface $validator
): Response
{
$em = $doctrine->getManager();
$user = $this->getUser();
$usr = $em->getRepository(usr::class)->findOneBy(array('usrid'=>$usrid));
$lstadmin = $this->divservice->getIdAdmin();
if(($user->getusrid()==$usr->getusrid())||(in_array($user->getUsrid(), $lstadmin))){ // vérif si adéquat usr/user ou DPF
// formulaire màj
$listCAT = $em->getRepository(cat::class)->findAllOrderedByLib(array(),'array');
// formulaire màj
$form_maj= $this->createForm('App\Form\USR_maj',$usr,array(
'listCAT' => $listCAT,
));
$form_maj->add('Annuler', 'Symfony\Component\Form\Extension\Core\Type\ButtonType', array(
'label'=>"Annuler",
'attr'=>array('class'=>'btn btn-primary', 'data-url'=>$this->generateUrl('pageaccueil'))
));
$form_maj->add('Enregistrer','Symfony\Component\Form\Extension\Core\Type\SubmitType',array(
'label'=>"Enregistrer",
'attr'=>array('class'=>'btn btn-primary')
));
$form_maj->handleRequest($request);
// vérif saisie form_maj via validator annotations niveau Entity (après validation formulaire)
if($request->request->get('usr_maj')){
// dd($request->request->get('usr_maj'));
$errors = $validator->validate($usr);
if(count($errors) > 0) {
// dd($errors);
foreach($errors as $error){
$this->get('session')->getFlashBag()->add(
'Erreur',
$error->getmessage()
);
}
}
}else{
$errors = array();
}
if($request->request->get('usr_maj')){ // maj utilisateur
if(($form_maj->isSubmitted())&&($form_maj->isValid())){
$postData = $request->request->get('usr_maj');
// begin token-guard --------------------------------------------------------------------------------------------------------------
$csrfToken = $postData['_token'];
if (false === $this->csrfTokenManager->isTokenValid(new CsrfToken('usrmajgarg188', $csrfToken))) {
$this->get('session')->getFlashBag()->add(
'Erreur',
"Impossible d'accéder à la fonction demandée. (tou)" // bad token user
);
return $this->redirect($this->generateUrl('pageaccueil')); // renvoi caval
// end token-guard --------------------------------------------------------------------------------------------------------------
}else{
if($postData['usrpwdmaj'] != ''){ // redéfinition du mot de passe
// vérif pwd ok
$pwdok = $this->usrservice->verif_pwd_usr($postData['usrpwdmaj']);
if($pwdok==false){
$this->get('session')->getFlashBag()->add(
'Erreur',
'Votre mot de passe ne répond pas aux conditions de sécurité requises ! Veuillez y remédier.'
);
// re-affichage formulaire
return $this->render('usr\maj.html.twig',
array(
'help_dir' => $this->parambag->get('dochelp_web_path'), //forcreatmenu
'form_maj' => $form_maj->createView(),
'usr' => $usr,
'errors' => $errors,
)
);
}else{
$hashedPassword = $passwordHasher->hashPassword(
$usr,
$postData['usrpwdmaj']
);
$usr->setPassword($hashedPassword);
}
}
// Enregistrement en bdd
$em = $doctrine->getManager();
$em->persist($usr);
$em->flush();
// Message d'information
$this->get('session')->getFlashBag()->add(
'Succès',
'Compte modifié avec succès'
);
return $this->redirect($this->generateUrl('pageaccueil')); // redir accueil lambda
}
}
}
// Affichage formulaire
return $this->render('usr\maj.html.twig',
array(
'help_dir' => $this->parambag->get('dochelp_web_path'), //forcreatmenu
'form_maj' => $form_maj->createView(),
'usr' => $usr,
'errors' => $errors,
)
);
}else{ // erreur de ID usr
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (id)'
);
// Affichage page inexistante
return $this->render('default\noway.html.twig', array(
));
}
}
// Ouverture d'un nouveau compte, vérification préalable de l'e-mail
// Envoi d'un mail avec un lien de validation de l'e-mail
#[Route(path: '/nusr', name: 'nouvcpte')]
public function ajoutcpte
(
Request $request,
ManagerRegistry $doctrine,
UserPasswordHasherInterface $passwordHasher,
ValidatorInterface $validator
): Response
{
$em = $doctrine->getManager();
// formulaire ajout
$params = array();
$listCAT = $em->getRepository(cat::class)->findAllOrderedByLib($params,'array');
$usr = new usr();
$form_ajo = $this->createForm('App\Form\USR_ajo',$usr, array(
'listCAT'=>$listCAT,
));
$form_ajo->add('Enregistrer','Symfony\Component\Form\Extension\Core\Type\SubmitType',
array(
'label'=>"Valider",
'attr'=>array('class'=>'btn btn-primary')
)
);
$form_ajo->handleRequest($request);
// vérif saisie form_ajo via validator annotations niveau Entity (après validation formulaire)
if($request->request->get('usr_ajo')){
// dd($request->request->get('usr_ajo'));
$errors = $validator->validate($usr);
if(count($errors) > 0) {
// dd($errors);
foreach($errors as $error){
$this->get('session')->getFlashBag()->add(
'Erreur',
$error->getmessage()
);
}
}
}else{
$errors = array();
}
if($request->request->get('usr_ajo')){ // ajout utilisateur
if(($form_ajo->isSubmitted())&&($form_ajo->isValid())){ // si tout OK selon validator
$postData = $request->request->get('usr_ajo');
// begin token-guard --------------------------------------------------------------------------------------------------------------
$csrfToken = $postData['_token'];
if (false === $this->csrfTokenManager->isTokenValid(new CsrfToken('usrajogarg;d44d', $csrfToken))) {
$this->get('session')->getFlashBag()->add(
'Erreur',
"Impossible d'accéder à la fonction demandée. (tok-u)"
);
return $this->redirect($this->generateUrl('pageaccueil')); // renvoi caval
// end token-guard --------------------------------------------------------------------------------------------------------------
}else{
if($postData['usrpwdajo'] != ''){ // saisie du mot de passe, vérif pwd ok
$pwdok = $this->usrservice->verif_pwd_usr($postData['usrpwdajo']);
if($pwdok==false){
$this->get('session')->getFlashBag()->add(
'Erreur',
'Votre mot de passe ne répond pas aux conditions de sécurité requises'
);
// re-affichage formulaire
return $this->render('usr\ajo.html.twig', array(
'form_ajo' => $form_ajo->createView(),
'errors' => $errors
));
}else{ // vérif si pas existe déjà username et usremail
// traitement des chaînes retournées transmises
$enlever = array("<", ">", "script"); // contre pirates
$mettre = array("", "", "");
$usremail = str_replace($enlever, $mettre, $postData['usremail']);
$username = str_replace($enlever, $mettre, $postData['username']);
$usr_exist = $em->getRepository(usr::class)->findOneBy(array('usremail'=>$postData['usremail']));
if($usr_exist==null){
$usr_exist = $em->getRepository(usr::class)->findOneBy(array('username'=>$postData['username']));
if($usr_exist!=null){
$this->get('session')->getFlashBag()->add(
'Erreur',
'Cet identifiant (login) ne peut pas être accepté (dbl)'
);
}
}else{
$this->get('session')->getFlashBag()->add(
'Erreur',
'Cet E-mail ne peut pas être accepté (red)'
);
}
if($usr_exist!=null){
// re-affichage formulaire
return $this->render('usr\ajo.html.twig', array(
'form_ajo' => $form_ajo->createView(),
'errors' => $errors
));
}else{ // création du compte ok
$prf = $em->getRepository(prf::class)->findOneBy(array('prfid'=>3)); // Collectiv' Finance
$cat = $em->getRepository(cat::class)->findOneBy(array('catid'=>$postData['catid']));
$usrdatcre = new \DateTime();
$usrdatcre->createFromFormat("Y-m-d H:i:s", time());
$usr->setUsername($postData['username']);
$hashedPassword = $passwordHasher->hashPassword(
$usr,
$postData['usrpwdajo']
);
$usr->setPassword($hashedPassword);
// précaution excessive contre py rat, activée pour le moment
$usr->setUsrorg(str_replace($enlever, $mettre, $postData['usrorg']));
$usr->setUsrnom(str_replace($enlever, $mettre, $postData['usrnom']));
$usr->setUsrpre(str_replace($enlever, $mettre, $postData['usrpre']));
$usr->setUsrdatcre($usrdatcre);
$usr->setUsrdatchgpwd($usrdatcre);
// limiter à 24h la durée du lien de vérification de la validité d'un e-mail suite ouverture compte
$letemps = time();
$demain = time()+(3600*24);
$usr->setUsrmaictltok(uniqid('cftok_',true));
$usr->setUsrmaictllim($demain);
$usr->setUsrstatut(0); // 0 = Attente de validation - 1 = Validé - 2 = suspendu
$usr->setcatid($cat);
$usr->setprfid($prf);
$em->persist($usr);
$em->flush();
// ===================== envoi d'un mail pour vérif e-mail saisi,
// ===================== contenu de l'e-mail : lien de confirm
$mailaenv = array();
$mailaenv['sujet'] = "Demande d'ouverture de compte : Collectiv'Finances";
$mailaenv['titre'] = "[Rural Consult] Accès aux outils d'analyse financière'";
$mailaenv['expediteur_nom'] = "Collectiv'Finances";
$mailaenv['expediteur_email'] = "assistance.technique@solidaires.com"; // TODO à modifier
$mailaenv['fichiers'] = array(); // les fichiers joints
$mailaenv['cc'] = ''; // pas de copie ici
// pour préveni admin de l'intention d'ouverture de compte
$destinataire_nom_bcc = "Assistance technique Rural Consult";
$destinataire_email_bcc = "assistance.technique@solidaires.com";
$mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
$urllogo = $this->parambag->get('img_path')."entet_email_cf.webp";
// texte du mail
$bodymail = "<div style='width:680px;margin:0 auto;'>";
$bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
$bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
$bodymail.= "<p style='padding:30px 10px;'>Bonjour ".$usr->getUsrpre()." ".$usr->getUsrnom().",<br /> <br />";
$bodymail.= "Nous avons reçu une demande d'ouverture de compte pour un accès aux outils d'analyse financière mis à disposition par Rural Consult [".date('d-m-Y H:i:s')."]<br /> <br />";
$bodymail.= "Si vous êtes à l'origine de cette demande, veuillez suivre les instructions ci-dessous :<br />";
$bodymail.= " - Cliquez sur le lien afin de confirmer votre demande : <a href='";
$bodymail.= $this->parambag->get('web_path')."vemail?ie=UTF8&tok=".$usr->getUsrmaictltok()."'>Lien de confirmation</a><br /> <br />";
$bodymail.= "Si vous rencontrez des difficultés pour valider votre demande d'ouverture de compte, veuillez nous envoyer un courriel en cliquant sur : <a href='mailto:assistance.technique@solidaires.com' title='Collectiv'Finances'>Assistance Collectiv'Finance.</a><br / >";
$bodymail.= "Si vous n'avez pas demandé d'ouverture de compte, ignorez ce courriel, nous effacerons cette demande.<br /> <br />";
$bodymail.= "<i><span style='font-weight: 600;color:#0ea210;'>Important</span> : Rural Consult ne vous enverra jamais un courriel vous demandant d'indiquer votre mot de passe.</i><br /> <br />";
$bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
$bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br /> <br />";
$bodymail.= "</p></div>";
$bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
$bodymail.= "Rural Consult © Tous droits réservés</div>";
$bodymail.= "</div>";
$mailaenv['body'] = $bodymail;
// 1° mail vers assistance.technique@solidaires.com
$mailaenv['destinataire_nom'] = "Administrateur Rural Consult";
$mailaenv['destinataire_email'] = "assistance.technique@solidaires.com"; // TODO à modifier
$unmess = $this->meylerservice->envoidunmail('demande ouverture compte',$mailaenv); // envoi
// 2° mail vers utilisateur demandeur
$mailaenv['destinataire_nom'] = $usr->getUsrpre().' '.$usr->getUsrnom();
$mailaenv['destinataire_email'] = $usr->getUsremail();
$unmess = $this->meylerservice->envoidunmail('demande ouverture compte',$mailaenv); // envoi
$this->get('session')->getFlashBag()->add(
'Succès',
'Votre compte a été créé. Un mail de vérification de votre demande vous a été envoyé. Il contient des instructions pour la transmission de votre demande à Rural Consult'
);
return $this->redirect($this->generateUrl('pageaccueil'));
}
}
}else{
$this->get('session')->getFlashBag()->add(
'Erreur',
'Votre mot de passe doit être obligatoirement indiqué'
);
// re-affichage formulaire
return $this->render('usr\ajo.html.twig', array(
'form_ajo' => $form_ajo->createView(),
'errors' => $errors
));
}
}
}
}
// Affichage form nouv usr
return $this->render('usr\ajo.html.twig', array(
'form_ajo' => $form_ajo->createView(),
'errors' => $errors
));
}
// Provenance : lien contenu dans e-mail "Demande d'ouverture de compte : Collectiv'Finances"
// - vérif du lien cliqué contenu dans l'e-mail envoyé
// - vérif du délai max autorisé (24h)
#[Route(path: '/vemail', name: 'verifemail')]
public function emailverif
(
Request $request,
ManagerRegistry $doctrine
): Response
{
if(!isset($_GET['tok'])){ // no token
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (nto)'
);
// Affichage page inexistante
return $this->render('default\noway.html.twig', array());
}else{ // ya1token
$em = $doctrine->getManager();
$usr = $em->getRepository(usr::class)->findOneBy(array('usrmaictltok'=>$_GET['tok']));
if($usr==null){ // bad token
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (bdt)'
);
// Affichage page inexistante
return $this->render('default\noway.html.twig', array());
}else{ // tok ok, vérif délai
$usrmaictllim = $usr->getUsrmaictllim(); // date limite de vérif validité e-mail suite ouverture de compte
$maintenant = time();
if($usrmaictllim < $maintenant){ // trop tard : chgt avant 24h max
$this->get('session')->getFlashBag()->add(
'Erreur',
'Le délai de vérification de l\'e-mail (24h) est dépassé (date limite : '.date('d/m/Y H:i',$usrmaictllim).'. Veuillez refaire une demande de création de compte (tim)'
);
// inactivation compte : modif e-mail pour permettre nouv dde avec même e-mail
$usremail = $usr->getUsremail().'.outlim'.rand(1, 999);
$usr->setUsremail($usremail);
$usr->setUsrmaictltok(null); // token lien vérif validité d'un e-mail suite ouverture compte
$usr->setUsrmaictllim(null); // ràz durée du lien de vérification de la validité d'un e-mail suite ouverture compte
$em->persist($usr);
$em->flush();
// Affichage page inexistante
return $this->render('default\noway.html.twig', array());
}else{ // délai OK, validation ouverture de compte, expédition mail aux admin's
// affichage confirmation d'ouverture du compte, envoi avis aux administrateurs de la demande
// ============================= envoi d'un mail aux ADMIN
$mailaenv = array();
$mailaenv['sujet'] = "Demande d'ouverture de compte : Collectiv'Finance";
$mailaenv['titre'] = "[Rural Consult] Création de compte d'accès aux outils d'analyse financière'";
$mailaenv['expediteur_nom'] = "Assistance technique Rural Consult";
$mailaenv['expediteur_email'] = "assistance.technique@solidaires.com"; // TODO à modifier
$mailaenv['fichiers'] = array(); // les fichiers joints
$mailaenv['cc'] = ''; // pas de copie ici
$mailaenv['bcc'] = ''; // pas de copi cach
$urllogo = $this->parambag->get('img_path')."entet_email_cf.webp";
// texte du mail
$bodymail = "<div style='width:680px;margin:0 auto;'>";
$bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
$bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
$bodymail.= "<p style='padding:30px 10px;'>Bonjour,<br /> <br />";
$bodymail.= "En tant qu'administrateur des outils d'analyse financière de Rural Consult, vous recevez ce courriel pour vous informer d'une demande d'ouverture de compte.<br /> <br />";
$bodymail.= "La demande est faite par : <b>".$usr->getUsrnom()." ".$usr->getUsrpre()." - ".$usr->getusrorg()."</b><br /> <br />";
$bodymail.= "Vous pouvez consulter et valider cette demande en vous connectant sur le site Collectiv'Finance : <a href=";
$bodymail.= $this->parambag->get('web_path')."><b>Vous connecter</b></a><br /> <br />";
$bodymail.= "Si vous validez cette demande, le demandeur recevra un courriel pour l'informer de l'activation de son compte lui permettant d'accéder aux outils d'analyse financière.<br /> <br />";
$bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
$bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br /> <br />";
$bodymail.= "</p></div>";
$bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
$bodymail.= "Rural Consult © Tous droits réservés</div>";
$bodymail.= "</div>";
$mailaenv['body'] = $bodymail;
// 1° mail vers assistance.technique@solidaires.com
$mailaenv['destinataire_nom'] = "Administrateur Rural Consult";
$mailaenv['destinataire_email'] = "assistance.technique@solidaires.com"; // TODO à modifier
$unmess = $this->meylerservice->envoidunmail('Demande ouverture compte',$mailaenv); // envoi
// 2° mail vers damien.christiany@caissedesdepots.fr (06/23...))
// $mailaenv['destinataire_nom'] = "Administrateur Rural Consult";
// $mailaenv['destinataire_email'] = "damien.christiany@caissedesdepots.fr";
// $unmess = $this->meylerservice->envoidunmail('Demande ouverture compte',$mailaenv); // envoi
$usr->setUsrmaictltok(null); // token lien vérif validité d'un e-mail suite ouverture compte
$usr->setUsrmaictllim(null); // ràz durée du lien de vérification de la validité d'un e-mail suite ouverture compte
$em->persist($usr);
$em->flush();
$this->get('session')->getFlashBag()->add(
'Succès',
"Votre demande d'ouverture de compte a été confirmée. Rural Consult en a été informé et donnera rapidement suite à votre demande."
);
return $this->redirect($this->generateUrl('pageaccueil'));
}
}
}
}
// Identifiant oublié : envoi d'un mail de renvoi du login
#[Route(path: '/flogin', name: 'identifoubli')]
public function loginoubli
(
Request $request,
ManagerRegistry $doctrine,
LOGDEFService $logdefservice,
): Response
{
$msgcplt=''; $loginchgoblig = 0; $floginemail = '';
if(isset($_POST['floginemail'])){
// begin token-guard --------------------------------------------------------------------------------------------------------------
$csrfToken = $_POST['_csrf_token'];
if (false === $this->csrfTokenManager->isTokenValid(new CsrfToken('identifoubliadm48', $csrfToken))) {
$txtmsg = "Une erreur a eu lieu ! Veuillez reprendre votre saisie (fat)"; // false token
$this->get('session')->getFlashBag()->add(
'Erreur',
$txtmsg
);
return $this->render('usr\loginoubli.html.twig', array(
'msgcplt' => $msgcplt,
'loginchgoblig' => $loginchgoblig,
'floginemail' => $floginemail,
));
//throw new InvalidCsrfTokenException('Invalid CSRF token.'); //non utilisé ici -> ajax
// end token-guard --------------------------------------------------------------------------------------------------------------
}else{ // vérif e-mail saisi, rech compte etc..
$floginemail = $_POST['floginemail'];
$em = $doctrine->getManager();
$usr = $em->getRepository(usr::class)->findOneBy(array('usremail'=>$floginemail));
if($usr==null){
$txtmsg = "Une erreur a eu lieu ! Veuillez reprendre votre saisie. (not)"; // non trouvé
$msgcplt = "Si vous ne vous souvenez pas de l'e-mail ou de l'identifiant associé à votre compte, contactez notre support technique";
$this->get('session')->getFlashBag()->add(
'Erreur',
$txtmsg
//'L\'E-mail saisi n\'est associé à aucun compte !' trop explicite :-(
);
// ré-Affichage loginoubli (affiché soit à la dde, soit chgt login oblig)
if(isset($_POST['loginchgoblig'])){
$loginchgoblig = $_POST['loginchgoblig'];
}
return $this->render('usr\loginoubli.html.twig', array(
'msgcplt' => $msgcplt,
'loginchgoblig' => $loginchgoblig,
'floginemail' => $floginemail,
));
}else{ // vérif statut du compte, si pas ok renvoi vers login
// dans tous les cas suivants, renvoi vers login
// a) les infobulles fusion de la page
$lesdefs = array('ppi','mod','pro','pli');
$deflog = array();
foreach($lesdefs as $ladef){
$deflog[$ladef] = $logdefservice->get_unedef($ladef);
}
if($usr->getUsrstatut()!=1){
if($usr->getUsrstatut()==0){
$txtmsg = "Votre compte n'est pas actif. Veuillez refaire une demande de renvoi d'identifiant lorsque votre compte sera activé. (noa)"; // non activé
}else{
$txtmsg = "Votre compte est bloqué. Veuillez contacter notre assistance technique en nous envoyant un courriel à l'adresse assistance.technique@solidaires.com (cbl)"; // compte bloqué
}
$this->get('session')->getFlashBag()->add(
'Erreur',
$txtmsg
);
return $this->render('security/login.html.twig',
array(
'last_username' => '',
'error' => '',
'deflog' => $deflog
)
);
}else{ // compte OK, vérif dat der envoi login et nb ddes (si >5 en moins d'un jour => blocage)
$datenvlog = new \DateTime();
$hier = date('Y-m-d H:i:s', time()-(3600*24));
if($usr->getUsrdatenvlog()==null){ // cas de la 1° dde envoi log
$datenvlog->createFromFormat("Y m d ", time());
$usr->setUsrdatenvlog($datenvlog);
$usr->setUsrnbenvlog(0); // idem envoi log / pwd
$em->persist($usr);
$em->flush();
}else{ // si antérieur à hier, raz
$usrdatenvlog = $usr->getUsrdatenvlog()->format('Y-m-d H:i:s');
if($usrdatenvlog < $hier){ // dernière dde antérieure à hier, raz
$usr->setUsrdatenvlog($datenvlog); // attrib date du jour
$usr->setUsrnbenvlog(0); // 1° envoi log en 24h
$em->persist($usr);
$em->flush();
}
}
$usrdatenvlog = $usr->getUsrdatenvlog()->format('Y-m-d H:i:s');
if(($usrdatenvlog >= $hier)&&($usr->getUsrnbenvlog()>=5)){ // si plus de 5 ddes depuis hier
$txtmsg = 'Une erreur a eu lieu ! Veuillez reprendre votre saisie (ab)'; // abus
$this->get('session')->getFlashBag()->add(
'Erreur',
$txtmsg
);
return $this->render('security/login.html.twig',
array(
'last_username' => '',
'error' => '',
'deflog' => $deflog
)
);
}else{ // tout ok envoi du mail de renvoi de l'identifiant
$usr_login = $usr->getUsername();
$nbenvlog = $usr->getUsrnbenvlog() + 1;
$usr->setUsrnbenvlog($nbenvlog); // nième envoi log
$em->persist($usr);
$em->flush();
$mailaenv = array();
$mailaenv['titre'] = '[rural Consult] Renvoi de votre identifiant';
$mailaenv['expediteur_nom'] = "Assistance technique Rural Consult";
$mailaenv['expediteur_email'] = "assistance.technique@solidaires.com";
$mailaenv['destinataire_nom'] = $usr->getUsrpre().' '.$usr->getUsrnom();
$mailaenv['destinataire_email'] = $_POST['floginemail'];
$mailaenv['cc'] = ''; // pas de copie ici
$destinataire_nom_bcc = "Assistance technique Rural Consult";
$destinataire_email_bcc = "assistance.technique@solidaires.com";
$mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
$mailaenv['fichiers'] = array(); // pas de fichier joint ici
$mailaenv['sujet'] = "Renvoi de votre identifiant Collectiv'Finance";
$urllogo = $this->parambag->get('img_path')."entet_email_cf.webp";
// texte du mail
$bodymail = "<div style='width:680px;margin:0 auto;'>";
$bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
$bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
$bodymail.= "<p style='padding:30px 10px;'>Bonjour ".$mailaenv['destinataire_nom'].",<br /> <br />";
$bodymail.= "Nous avons reçu une demande de renvoi de votre identifiant le ".$datenvlog->format("d-m-Y H:i").".<br />";
$bodymail.= "Votre identifiant : <b style='color:#ff0000';>".$usr_login."</b><br /> <br />";
$bodymail.= "Si vous n'êtes pas à l'origine de cette demande, ignorez ce courriel.<br /> <br />";
$bodymail.= "<i><span style='font-weight: 600;color:#0ea210;'>Important</span> : Rural Consult ne vous enverra jamais un courriel vous demandant d'indiquer votre mot de passe.</i><br /> <br />";
$bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
$bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br /> <br />";
$bodymail.= "</p></div>";
$bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
$bodymail.= "Rural Consult © Tous droits réservés</div>";
$bodymail.= "</div>";
$mailaenv['body'] = $bodymail;
$unmess = $this->meylerservice->envoidunmail('loginoubli',$mailaenv); // envoi
$this->get('session')->getFlashBag()->add(
'Succès',
"Un e-mail vous a été envoyé. Il contient votre identifiant de connexion."
);
return $this->render('security/login.html.twig',
array(
'last_username' => '',
'error' => '',
'deflog' => $deflog
)
);
}
}
}
}
}else{
// Affichage loginoubli
return $this->render('usr\loginoubli.html.twig', array(
'msgcplt' => $msgcplt,
'loginchgoblig' => $loginchgoblig,
'floginemail' => $floginemail,
));
}
}
// PWD oublié : envoi d'un mail pour réinitialiser le pwd
#[Route(path: '/fpwd', name: 'motdpasseoubli')]
public function pwdoubli
(
Request $request,
ManagerRegistry $doctrine,
LOGDEFService $logdefservice,
): Response
{
//var_dump($request);
$msgcplt='';
$pwdchgoblig = 0;
if(isset($_POST['fpwdemail'])){
$em = $doctrine->getManager();
$usr = $em->getRepository(usr::class)->findOneBy(array('usremail'=>$_POST['fpwdemail']));
if($usr == null){
// Message d'information
$this->get('session')->getFlashBag()->add(
'Erreur',
'Une erreur de saisie ne nous permet pas d\'identifier votre compte'
);
$msgcplt = "Si vous ne vous souvenez pas de l'e-mail associé à votre compte, veuillez nous écrire à l'adresse ci-dessous.";
// ré-Affichage pwdoubli (affiché soit à la dde, soit chgt pwd oblig)
if(isset($_POST['pwdchgoblig'])){
$pwdchgoblig = $_POST['pwdchgoblig'];
}
return $this->render('usr/pwdoubli.html.twig', array(
'msgcplt' => $msgcplt,
'pwdchgoblig' => $pwdchgoblig,
'fpwdemail' => $_POST['fpwdemail']
));
}else{ // ok, envoi du mail
$token = $_POST['_csrf_token'];
$datddechgpdw = new \DateTime();
$datddechgpdw->createFromFormat("Y m d ", time());
$usr->setUsrchgpwdtok($token); // CSRF token dde chgt PWD
$usr->setUsrdatddechgpwd(time()); // Timestamp dde chgt PWD
$cpteurdde = $usr->getUsrnbenvpwd() + 1;
$usr->setUsrnbenvpwd($cpteurdde); // à titre indicatif, nb dde changement de pwd
$em->persist($usr);
$em->flush();
// préparation du mèl
$mailaenv = array();
$mailaenv['sujet'] = "Demande de changement de mot de passe : Collectiv'Finance";
$mailaenv['titre'] = "[Rural Consult] Demande de changement de mot de passe";
$mailaenv['expediteur_nom'] = "Assistance technique Rural Consult";
$mailaenv['expediteur_email'] = "assistance.technique@solidaires.com"; // TODO à modifier
$mailaenv['destinataire_nom'] = $usr->getUsrpre().' '.$usr->getUsrnom();
$mailaenv['destinataire_email'] = $_POST['fpwdemail'];
$mailaenv['fichiers'] = array(); // les fichiers joints
//$mailaenv['fichiers'][0] = array(); // 1° fichier à joindre => pas de documents joints
//$mailaenv['fichiers'][0]['chemin_fichier'] = "";
//$mailaenv['fichiers'][0]['nom_fichier'] = "";
//$mailaenv['fichiers'][0]['nom_orig'] = "";
$mailaenv['cc'] = ''; // pas de copie ici
$destinataire_nom_bcc = "Assistance technique Rural Consult";
$destinataire_email_bcc = "assistance.technique@solidaires.com";
$mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
$urllogo = $this->parambag->get('img_path')."entet_email_cf.webp";
// texte du mail
$bodymail = "<div style='width:680px;margin:0 auto;'>";
$bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
$bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
$bodymail.= "<p style='padding:30px 10px;'>Bonjour,<br /> <br />";
$bodymail.= "Nous avons reçu une demande de changement du mot de passe associé à votre E-mail à cette date : ".$datddechgpdw->format("d-m-Y H:i").". ";
$bodymail.= "Si vous êtes à l'origine de cette demande, suivez les instructions ci-dessous.<br /> <br />";
$bodymail.= "Cliquez sur le lien ci-après pour réinitialiser votre mot de passe : <a href=";
$bodymail.= $this->parambag->get('web_path')."mpwd?ie=UTF8&tok=".$token.">Lien pour la réinitialisation de votre mot de passe</a><br /> <br />";
$bodymail.= "Si vous n'avez pas demandé de changement de votre mot de passe, ignorez ce courriel.<br />";
$bodymail.= "Si vous rencontrez des difficultés pour changer de mot de passe, veuillez nous envoyer un courriel à l'adresse suivante : <a href='mailto:assistance.technique@solidaires.com' title='Aide Rural Consult'>assistance.technique@solidaires.com.</a><br / > <br />";
$bodymail.= "<i><span style='font-weight: 600;color:#0ea210;'>Important</span> : Rural Consult ne vous enverra jamais un courriel vous demandant d'indiquer votre mot de passe.</i><br /> <br />";
$bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
$bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br /> <br />";
$bodymail.= "</p></div>";
$bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
$bodymail.= "Rural Consult © Tous droits réservés</div>";
$bodymail.= "</div>";
$mailaenv['body'] = $bodymail;
$unmess = $this->meylerservice->envoidunmail('reinitialisation mot de passe',$mailaenv); // envoi
$this->get('session')->getFlashBag()->add(
'Succès',
'Un courriel vous a été envoyé. Vous y trouverez un lien pour réinitialiser votre mot de passe'
);
// a) les infobulles fusion de la page
// $lesdefs = array('ppi','mod','pro','eau','pfi','lis','mev');
$lesdefs = array('ppi','mod','pro','pli');
$deflog = array();
foreach($lesdefs as $ladef){
$deflog[$ladef] = $logdefservice->get_unedef($ladef);
}
return $this->render('security/login.html.twig',
array(
'last_username' => '',
'error' => '',
'deflog' => $deflog
)
);
}
}else{
// Affichage pwdoubli
return $this->render('usr\pwdoubli.html.twig', array(
'msgcplt' => $msgcplt,
'pwdchgoblig' => $pwdchgoblig,
'fpwdemail' => ''
));
}
}
// Provenance :lien contenu dans un mail de réponse à une demande de changement de mot de passe
#[Route(path: '/mpwd', name: 'motdpassemodif')]
public function pwdmodif
(
Request $request,
ManagerRegistry $doctrine,
UserPasswordHasherInterface $passwordHasher,
): Response
{
// pwd à modifier
//var_dump($request);
if(!isset($_GET['tok'])){ // no token
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (nt)'
);
return $this->render('default\noway.html.twig', array(
));
}else{ // ya1token
$em = $doctrine->getManager();
$usr = $em->getRepository(usr::class)->findOneBy(array('usrchgpwdtok'=>$_GET['tok']));
if($usr == null){ // bad token
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (bdt)'
);
return $this->render('default\noway.html.twig', array(
));
}else{ // tok ok, vérif délai
$usrid = $usr->getUsrid();
$usrdatddechg = $usr->getUsrdatddechgpwd(); // int contenant la date/heure de demande
$letemps = time();
$hier = time()-(3600*24);
if($usrdatddechg < $hier){ // after time : chgt avant 24h max
$this->get('session')->getFlashBag()->add(
'Erreur',
'Le délai de validité de votre demande de changement de mot de passe (24h) est dépassé depuis le '.date('d/m/Y H:i',$usrdatddechg).'. Veuillez refaire une demande de changement de mot de passe. (tim)'
);
return $this->render('default\noway.html.twig', array(
));
}else{ // tout ok, affichage page saisie / modif pwd
return $this->render('usr\pwdmodif.html.twig',
array(
'tok' => $_GET['tok'],
'missens' => ($usrid * 117), // brouiller
'msgcplt' => '',
)
);
}
}
}
}
// confirmation changement mot de passe, vérifications diverses
#[Route(path: '/cpwd', name: 'motdpasseconf')]
public function pwdconf
(
Request $request,
ManagerRegistry $doctrine,
LOGDEFService $logdefservice,
UserPasswordHasherInterface $passwordHasher
): Response
{
// modif pwd confirmée
$flagok = true;
//var_dump($request);
// vérifs diverses : token ok, missens ok, pwd a et b ok
if( (!isset($_POST['_csrf_token'])) || (!isset($_POST['_missens'])) || (!is_numeric($_POST['_missens'])) || ($_POST['_mpwdb']!=$_POST['_mpwda']) ){
$flagok = false;
}
if($flagok == false){ // problème
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (pb)'
);
return $this->render('default\noway.html.twig', array());
}else{ // ok à priori
// var_dump($_POST);
$em = $doctrine->getManager();
$usrid = ($_POST['_missens'] / 117); // voir unptipeupluo
$usr = $em->getRepository(usr::class)->findOneBy(array('usrchgpwdtok'=>$_POST['_csrf_token'], 'usrid'=>$usrid));
if($usr == null){ // bad couple token/usrid
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (bdt)'
);
return $this->render('default\noway.html.twig', array());
}else{ // tok + usrid ok, vérif longueur des pwd et contenus retour login après màj ou non
$pwdok = $this->usrservice->verif_pwd_usr($_POST['_mpwda']);
if(($_POST['_mpwda'] != $_POST['_mpwdb']) || ($pwdok==false)){
$this->get('session')->getFlashBag()->add(
'Erreur',
'Votre mot de passe ne répond pas aux conditions de sécurité requises (ab)'
);
return $this->render('security/login.html.twig',
array(
'last_username' => '',
'error' => ''
)
);
}else{ // tout ok, validation nouv pwd
$usrdatchgpwd = new \DateTime();
$usrdatchgpwd->createFromFormat("Y-m-d H:i:s", time());
$hashedPassword = $passwordHasher->hashPassword(
$usr,
$_POST['_mpwda']
);
$usr->setPassword($hashedPassword);
$usr->setUsrchgpwdtok(null);
$usr->setUsrdatddechgpwd(null);
$usr->setUsrdatchgpwd($usrdatchgpwd);
$em->persist($usr);
$em->flush();
$this->get('session')->getFlashBag()->add(
'Succès',
'Votre mot de passe a été modifié avec succès'
);
// a) les infobulles fusion de la page
// $lesdefs = array('ppi','mod','pro','eau','pfi','lis','mev');
$lesdefs = array('ppi','mod','pro','pli');
$deflog = array();
foreach($lesdefs as $ladef){
$deflog[$ladef] = $logdefservice->get_unedef($ladef);
}
return $this->render('security/login.html.twig',
array(
'last_username' => '',
'error' => '',
'deflog' => $deflog
)
);
}
}
}
}
// EMAILING'S ============================================
// TODO : Vérifier fonctionnement (31/07/24)
// Expédition d'un mailing pour changement de pwd obligatoire
// envoi à tous les usr dont usrdatchgpwd < date jour -1 an ou vide
#[Route(path: '/mailchgpwd', name: 'envmailddechgpwd')]
public function pwdchgoblig
(
Request $request,
ManagerRegistry $doctrine
): Response
{
$em = $doctrine->getManager();
$user = $this->getUser();
$lstadmin = $this->divservice->getIdAdmin();
if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){ // seuls les admin
$search_now = time();
$datchglimit = date('Y-m-d', mktime(0,0,0,date('m', $search_now),date('d', $search_now),date('Y', $search_now)-1));
$nbmailenvoyes = 0;
// préparation du mèl
$mailaenv = array();
$mailaenv['sujet'] = "[Rural Consult] Renouvellement de votre mot de passe Collectiv'Finances";
$mailaenv['titre'] = "[Rural Consult] Renouvellement de votre mot de passe";
$mailaenv['expediteur_nom'] = "Assistance technique Rural Consult";
$mailaenv['expediteur_email'] = "assistance.technique@solidaires.com"; // TODO à modifier
$mailaenv['destinataire_nom'] = "";
$mailaenv['destinataire_email'] = "";
$mailaenv['fichiers'] = array(); // les fichiers joints
//$mailaenv['fichiers'][0] = array(); // 1° fichier à joindre => pas de documents joints
//$mailaenv['fichiers'][0]['chemin_fichier'] = "";
//$mailaenv['fichiers'][0]['nom_fichier'] = "";
//$mailaenv['fichiers'][0]['nom_orig'] = "";
$mailaenv['cc'] = ''; // pas de copie ici
$destinataire_nom_bcc = "Assistance technique Rural Consult";
$destinataire_email_bcc = "assistance.technique@solidaires.com";
$mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
$urllogo = $this->parambag->get('img_path')."entet_email_cf.webp";
$web_path = $this->parambag->get('web_path');
// à effectuer en N fois
// requête préalable : UPDATE `cdc`.`usr` SET `usrdatenvchgpwd` = NULL, `usrchgpwdtok` = NULL
$query = $em->getRepository(usr::class)->createQueryBuilder('usr');
$query
->select('usr')
->where($query->expr()->orX(
$query->expr()->lte('usr.usrchgpwdtok', ':datchglimit'), // pwd pas changé depuis limit
$query->expr()->isNull('usr.usrchgpwdtok'),
$query->expr()->eq('usr.usrchgpwdtok', ':valzero')
))
->setParameter('datchglimit' , $datchglimit)
->setParameter('valzero' , null)
// ->andwhere('usr.usrid >= :usrid_mini')
// ->andwhere('usr.usrid <= :usrid_maxi')
// ->setParameter('usrid_mini' , 3051) // 3246 limite max, éviter 3150 lhostis
// ->setParameter('usrid_maxi' , 3149) // 3149 16/10 - 3050 08/10 - 2950 30/08 23:04 - 2800 30/08 11:45 - 2600 27/08 13:22
// ->andwhere('usr.usrdatlog IS NULL') // A SUPPRIMER une fois les mails envoyés
//->andwhere('usr.usrdatenvchgpwd IS NULL') // A REACTIVER une fois les mails envoyés
//->andwhere('usr.USRCHGPWDTOK IS NULL') // A REACTIVER une fois les mails envoyés
->orderBy('usr.usrdatcre', 'ASC')
;
$utilisateurs = $query->getQuery()->getResult();
$nb_usr = count($utilisateurs);
if(count($utilisateurs)>0){
foreach($utilisateurs as $usr){
$nombr_alea = rand().'cdc'.rand().'fc';
$mailaenv['destinataire_nom'] = "";
$mailaenv['destinataire_email'] = $usr->getUsremail();
// texte du mail
$bodymail = "<div style='width:680px;margin:0 auto;'>";
$bodymail.= "<img style='width:680px;height:58px;border:none' src='".$urllogo."'>";
$bodymail.= "<div style='width:677px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #ff0000;overflow:hidden;'>";
$bodymail.= "<p style='padding:20px 10px;'>Bonjour <b>".$usr->getUsrpre()." ".$usr->getUsrnom()."</b>,<br /> <br />";
$bodymail.= "Vous avez ouvert un compte « Solidaires » le ".$usr->getUsrdatcre()->format("d/m/Y").".<br />";
$bodymail.= "Nous réinstallons désormais cette application dans un nouvel environnement, intégrant le nouveau règlement européen sur la protection des données (RGPD) en vigueur.<br />";
$bodymail.= "Ces nouvelles règles modifient directement la gestion des mots de passe : ainsi, lors de votre prochaine connexion, l’application vous guidera à travers une procédure automatique de changement de votre mot de passe.<br />";
$bodymail.= "En l'absence de renouvellement de votre mot de passe dans les 30 jours, nous procéderons à la suppression de votre compte utilisateur et de vos données saisies d'une antériorité supérieure à 3 ans.<br />";
$bodymail.= "Cliquez sur le lien ci-après pour modifier votre mot de passe dès maintenant : <a href=";
$bodymail.= $web_path."mpwd?ie=UTF8&tok=".$nombr_alea.">Lien pour la réinitialisation de votre mot de passe valable 24 heures</a><br /> <br />";
$bodymail.= "Si vous rencontrez des difficultés pour changer de mot de passe, veuillez nous envoyer un courriel à l'adresse suivante : <a href='mailto:assistance.technique@solidaires.com' title='Assistance technique Rural Consult'>assistance.technique@solidaires.com.</a><br / > <br />";
$bodymail.= "<br /> <br />";
$bodymail.= "Collectiv'Finances vous propose des outils d'analyse financière dédiés aux communes et collectivités locales.<br />";
$bodymail.= "Nous vous informons que Collectiv'Finances s’est enrichi d’un nouvel outil : la modélisation financière de projet.<br />";
$bodymail.= "Espérant que ce nouvel outil vous sera utile, nous restons à votre disposition pour toute information supplémentaire.<br /> <br />";
$bodymail.= "<i><span style='font-weight: 600;color:#0ea210;'>Important</span> : Rural Consult ne vous enverra jamais un courriel vous demandant d'indiquer votre mot de passe.</i><br /> <br />";
$bodymail.= "<span style='font-weight: 600;'>Rural Consult</strong><br />";
$bodymail.= "<span style='font-weight: 600;color:#ff0000;'>Banque des Territoires - Caisse des Dépôts</span><br /> <br />";
$bodymail.= "</p></div>";
$bodymail.= "<div style='width:679px;height:20px;text-align:center;background:#ff0000;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
$bodymail.= "Rural Consult © Tous droits réservés</div>";
$bodymail.= "</div>";
$mailaenv['body'] = $bodymail;
$unmess = $this->meylerservice->envoidunmail('reinitialisation mot de passe',$mailaenv); // envoi
$nbmailenvoyes++;
$usrdatenvchgpwd = new \DateTime();
$usrdatenvchgpwd->createFromFormat("Y-m-d H:i:s", time());
// Enregistrement en bdd
$usr->setUsrchgpwdtok($nombr_alea);
$usr->setUsrdatddechgpwd(time());
$usr->setUsrdatenvchgpwd($usrdatenvchgpwd);
$em->persist($usr); // TODO à activer en PROD
$em->flush(); // TODO à activer en PROD
}
$this->get('session')->getFlashBag()->add(
'Succès',
$nbmailenvoyes.' mails envoyés. Nb utilisateurs sélect : '.$nb_usr
);
}else{
$this->get('session')->getFlashBag()->add(
'Succès',
'Aucun utilisateur sélectionné, aucun courriel à envoyer.'
);
}
return $this->redirect($this->generateUrl('pageaccueil'));
}else{ // erreur réservé admin
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (adm)'
);
// Affichage page inexistante
return $this->render('default\noway.html.twig', array(
));
}
}
// TODO : à revoir, vérifier fonctionnement (31/07/24)
// Envoi mailing à tous les usr => info EXCEL dans PROSPER et MODELICO
#[Route(path: '/mailgraph', name: 'envmailgraph')]
public function mailgraph(Request $request, ManagerRegistry $doctrine): Response
{
$em = $doctrine->getManager();
$user = $this->getUser();
$lstadmin = $this->divservice->getIdAdmin();
if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){ // seuls les admin
$nbmailenvoyes = 0;
$mailaenv = array();
$mailaenv['sujet'] = "[Rural Consult] Collectiv'Finance : Les outils financiers";
$mailaenv['titre'] = "[Rural Consult] Collectiv'Finance : Les outils financiers";
$mailaenv['expediteur_nom'] = "Collectiv'Finance Infos";
$mailaenv['expediteur_email'] = "solidaires@solidaires.com"; // TODO à modifier
$mailaenv['destinataire_nom'] = "";
$mailaenv['destinataire_email'] = "";
$mailaenv['fichiers'] = array(); // les fichiers joints
$mailaenv['fichiers'][0] = array(); // 1 fichier à joindre
$mailaenv['fichiers'][0]['chemin_fichier'] = $this->get('kernel')->getRootDir(). "/../web/doc/help/";
$mailaenv['fichiers'][0]['nom_fichier'] = "guide-tableau-financier.pdf";
$mailaenv['fichiers'][0]['nom_orig'] = "guide-tableau-financier.pdf";
$mailaenv['cc'] = ''; // pas de copie ici
$destinataire_nom_bcc = "Assistance technique Rural Consult";
$destinataire_email_bcc = "assistance.technique@solidaires.com";
$mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
$graph_b = $this->parambag->get('img_path')."graph_b.jpg";
$graph_c = $this->parambag->get('img_path')."graph_c.jpg";
$urllogo = $this->parambag->get('img_path')."entet_email_cf.webp";
$web_path = $this->parambag->get('web_path');
$search_now = time();
$datcremax = date('Y-m-d', mktime(0,0,0,date('m', $search_now),date('d', $search_now)-8,date('Y', $search_now)));
// à effectuer en N fois
$query = $em->getRepository(usr::class)->createQueryBuilder('usr');
$query
->select('usr')
->where('usr.usrdatenvchgpwd IS NULL')
->andwhere('usr.usrdatcre < :datcremax')
->setParameter('datcremax' ,$datcremax)
->andwhere('usr.usrid IN (11)') // pour se limiter un peu...
->orderBy('usr.usrid', 'DESC')
;
$utilisateurs = $query->getQuery()->getResult();
$nb_usr = count($utilisateurs);
if($nb_usr>0){
$k=0;
foreach($utilisateurs as $usr){
$k++;
if($k<=30){ // par paquet
$mailaenv['destinataire_nom'] = "";
$mailaenv['destinataire_email'] = $usr->getUsremail();
// texte du mail
$bodymail = "<div style='width:750px;margin:0 auto;'>";
$bodymail.= "<img style='width:750;height:64px;border:none' src='".$urllogo."'>";
$bodymail.= "<div style='width:747px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #4f8eaf;overflow:hidden;'>";
$bodymail.= "<p style='padding:20px 10px;'>Bonjour <b>".$usr->getUsrpre()." ".$usr->getUsrnom()."</b>,<br /> <br />";
$bodymail.= "notre site « <a href=".$this->parambag->get('web_path')."><b>Solidaires</b></a> » met à la disposition des communes et intercommunalités des outils simplifiés d'analyse financière permettant de simuler le calcul des indicateurs retenus pour la contractualisation (loi de programmation des finances publiques du 22/01/2018).";
$bodymail.= "<br /> <br />";
$bodymail.= "Il vous est proposé : <br />";
$bodymail.= " - un tableau d'analyse rétro/prospective <b>« PROSPER »</b> qui reprend de façon détaillée (fonctionnement et investissement) l'ensemble des agrégats financiers utiles à l'analyse,<br />";
$bodymail.= " - un tableau plus synthétique <b>« MODELICO »</b> mesurant l'impact prospectif d'un nouvel emprunt sur les indicateurs de solvabilité de la collectivité (épargne de gestion, épargne brute, épargne nette, autofinancement, capacité de désendettement - CAPDES…).";
$bodymail.= "<br /> <br />";
$bodymail.= "A partir de vos données, « <a href=".$this->parambag->get('web_path')."><b>Solidaires</b></a> » vous permet désormais d'obtenir instantanément la représentation graphique des indicateurs principaux .";
$bodymail.= "<br /> <br />";
$bodymail.= "<img style='width:550px;height:240px;' src='".$graph_b."'>";
$bodymail.= "<br /> <br />";
$bodymail.= "<img style='width:550px;height:240px;' src='".$graph_c."'>";
$bodymail.= "<br /> <br />";
$bodymail.= "« <a href=".$this->parambag->get('web_path')."><b>Solidaires</b></a> » vous proposera progressivement d'autres graphiques. <b>Faites-nous part de vos suggestions.</b>";
$bodymail.= "<br /> <br />";
$bodymail.= "Vous pouvez dès maintenant les utiliser en vous connectant à « <a href=".$this->parambag->get('web_path')."><b>Solidaires</b></a> ».<br / > <br />";
$bodymail.= "Votre identifiant est : <span style='color:#ff0000;font-weight: 600;'>".$usr->getUsername()."</span><br /> Avec votre identifiant, vous retrouverez vos simulations saisies précédemment.<br / > <br />";
$bodymail.= "Si vous rencontrez des difficultés pour vous connecter, veuillez nous envoyer un courriel à l'adresse suivante : <a href='mailto:assistance.technique@solidaires.com' title='Assistance technique Rural Consult'>assistance.technique@solidaires.com</a>.<br />";
$bodymail.= "Nous restons à votre disposition pour toute information complémentaire.";
$bodymail.= "<br /> <br />";
$bodymail.= "<strong>Caisse des Dépôts<br />";
$bodymail.= "Service Rural Consult</strong><br />";
$bodymail.= "<div style='font-size:11px;'>";
$bodymail.= " Vous avez ouvert un compte « Solidaires » le ".$usr->getUsrdatcre()->format("d/m/Y").".<br />";
$bodymail.= "</div>";
$bodymail.= "</p></div>";
$bodymail.= "<div style='width:750px;height:20px;text-align:center;background:#4f8eaf;font-size:12px Arial, Helvetica, sans-serif;color:#fff;'>";
$bodymail.= "Rural Consult © Tous droits réservés</div>";
$bodymail.= "</div>";
$bodymail.= "<br /> <br />";
$mailaenv['body'] = $bodymail;
/* inactiv19
$unmess = $this->meylerservice->envoidunmail('solidaires infos',$mailaenv); // envoi
$nbmailenvoyes++;
$usrdatenvchgpwd = new \DateTime();
$usrdatenvchgpwd->createFromFormat("Y-m-d H:i:s", time());
// Enregistrement en bdd
$usr->setUsrchgpwdtok(null);
$usr->setUsrdatddechgpwd(null);
$usr->setUsrdatenvchgpwd($usrdatenvchgpwd);
$em->persist($usr); // TODO à activer en PROD
$em->flush(); // TODO à activer en PROD
*/
}
}
$this->get('session')->getFlashBag()->add(
'Succès',
$nbmailenvoyes.' mails envoyés. Nb utilisateurs sélect : '.$nb_usr
);
}else{
$this->get('session')->getFlashBag()->add(
'Succès',
'Aucun utilisateur sélectionné, aucun courriel à envoyer.'
);
}
return $this->redirect($this->generateUrl('pageaccueil'));
}else{ // erreur réservé admin
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (adm)'
);
// Affichage page inexistante
return $this->render('default\noway.html.twig', array(
));
}
}
// TODO : à revoir, vérifier fonctionnement (31/07/24)
// Annonce ISBA, envoi à tous les usr
#[Route(path: '/mailisba', name: 'envmailisba')]
public function mailisba
(
Request $request,
ManagerRegistry $doctrine
): Response
{
$em = $doctrine->getManager();
$user = $this->getUser();
$lstadmin = $this->divservice->getIdAdmin();
if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){ // seuls les admin
$nbmailenvoyes = 0;
$mailaenv = array();
$mailaenv['sujet'] = "[Rural Consult] Solidaires : les outils financiers";
$mailaenv['titre'] = "[Rural Consult] Solidaires : les outils financiers";
$mailaenv['expediteur_nom'] = "Solidaires Infos";
$mailaenv['expediteur_email'] = "solidaires@solidaires.com";
$mailaenv['destinataire_nom'] = "";
$mailaenv['destinataire_email'] = "";
$mailaenv['fichiers'] = array(); // les fichiers joints
$mailaenv['cc'] = ''; // pas de copie ici
$destinataire_nom_bcc = "Assistance technique Rural Consult";
$destinataire_email_bcc = "assistance.technique@solidaires.com";
$mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
//$mailaenv['bcc'] = ''; // test, alors inutile
$urllogo = $this->parambag->get('img_path')."entet_email_cf.webp";
$logotc = $this->parambag->get('img_path')."logo_tc.jpg";
$logoisba = $this->parambag->get('img_path')."isba_elen_mel.png";
$logomodelico = $this->parambag->get('img_path')."modelico.png";
$logoprosper = $this->parambag->get('img_path')."prosper_mel.png";
$logomeven = $this->parambag->get('img_path')."mev_m_mel.png";
$web_path = $this->parambag->get('web_path');
$search_now = time();
$datcremax = date('Y-m-d', mktime(0,0,0,date('m', $search_now),date('d', $search_now)-4,date('Y', $search_now)));
// à effectuer en N fois
$query = $em->getRepository(usr::class)->createQueryBuilder('usr');
$query
->select('usr')
->where('usr.usrdatisb IS NULL')
->andwhere('usr.usrdatcre < :datcremax')
->setParameter('datcremax' ,$datcremax)
//->andwhere('usr.usrid <= 347') // pour se limiter un peu... 179 SJA
->orderBy('usr.usrid', 'ASC')
;
$utilisateurs = $query->getQuery()->getResult();
$nb_usr = count($utilisateurs);
if($nb_usr>0){
$k=0;
foreach($utilisateurs as $usr){
$k++;
if($k<=100){ // par paquet
$mailaenv['destinataire_nom'] = "";
$mailaenv['destinataire_email'] = $usr->getUsremail(); // TODO à activer en PROD
//$mailaenv['destinataire_email'] = "didier.pfennig@free.fr"; // TODO à désactiver en PROD
//style="color:#0075ae; padding-top:150px; padding-bottom:0px; padding-left:0px; padding-right:0px;">
//mailisba
// texte du mail
$bodymail = '<div style="width:750px;margin:0 auto;">';
$bodymail.= '<img style="width:750;height:64px;border:none" src="'.$urllogo.'">';
$bodymail.= '<div style="width:747px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #4f8eaf;overflow:hidden;">';
$bodymail.= '<p style="padding-left:10px; padding-right:10px;"><b>Madame, Monsieur,</b></p>';
$bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
$bodymail.= 'vous êtes utilisatrice / utilisateur des outils d’analyse financière, sur le site de « <a href='.$this->parambag->get("web_path").'><b>Solidaires</b></a>», développés par Rural Consult, un service de la Banque des Territoires de la Caisse des dépôts.';
$bodymail.= '</p>';
$bodymail.= '<br />';
$bodymail.= '<table width="100%">';
$bodymail.= '<tr>';
$bodymail.= '<td width="5%">';
$bodymail.= '<img style="width:45px;height:45px;" src="'.$logoisba.'">';
$bodymail.= '<br /> <br />';
$bodymail.= '<br /> <br />';
$bodymail.= '</td>';
$bodymail.= '<td width="95%">';
$bodymail.= '<p style="font-size:15px;padding-left:10px; padding-right:10px;text-align: justify;">';
$bodymail.= 'Nous mettons en ligne <span style="color:#ff0000;font-weight: 600;">une nouvelle application « ISBA - Impact Simplifié d\'un investissement sur le Budget annexe Eau / Assainissement »</span> pour :<br />';
$bodymail.= '</p>';
$bodymail.= '<ul>';
$bodymail.= '<li>Simuler l\'impact théorique d\'un investissement (PPI) sur le prix de l\'eau et la redevance d\'assainissement<l/i>';
$bodymail.= '<li>Déterminer le montant d\'emprunts nécessaires à l\'équilibre des comptes,</li>';
$bodymail.= '<li>Calculer la nouvelle annuité de dette,</li>';
$bodymail.= '<li>Moduler l\'augmentation théorique des tarifs dans l\'onglet « impact choisi » pour en voir les conséquences sur 6 années de prospective financière,</li>';
$bodymail.= '<li>Visualiser les principaux résultats sous forme de graphiques</li>';
$bodymail.= '</ul>';
$bodymail.= '<p style="font-size:15px;padding-left:10px; padding-right:10px;text-align: justify;">';
$bodymail.= 'L\'application <b>« ISBA »</b> contient également <span style="color:#ff0000;font-weight: 600;">un guide utilisateur détaillant les formules de calcul, un bouton « Nous écrire » et un jeu de graphiques exportables (avec leurs données chiffrées) en format Excel</span>.';
$bodymail.= '<br /> <br />';
$bodymail.= 'La saisie de données est souvent une étape difficile à franchir ... ! Nous vous donnons accès à une <i><b>simulation exemple</b></i> modifiable permettant de visualiser et tester immédiatement les possibilités offertes par <b>« ISBA »</b>.';
$bodymail.= '<br /> <br />';
$bodymail.= '</p>';
$bodymail.= '</td>';
$bodymail.= '</tr>';
$bodymail.= '<tr>';
$bodymail.= '<td width="5%">';
$bodymail.= '<img style="width:35px;height:35px;padding-left:5px;" src="'.$logomodelico.'"><br /> <br />';
$bodymail.= '<img style="width:35px;height:35px;padding-left:5px;" src="'.$logoprosper.'">';
$bodymail.= '<br /> <br />';
$bodymail.= '</td>';
$bodymail.= '<td width="95%">';
$bodymail.= '<p style="font-size:15px;padding-left:10px; padding-right:10px;text-align: justify;">';
$bodymail.= 'Ces <i><b>simulations exemple</b></i> existent aussi pour les tableaux financiers, ainsi que les graphiques exportables pour « <b>MODELICO »</b> et des éditions (pdf) pour <b>« PROSPER »</b>. Il est également possible d’obtenir sur simple demande un tableau de calcul sous Excel.';
$bodymail.= '</p>';
$bodymail.= '</td>';
$bodymail.= '</tr>';
$bodymail.= '<tr>';
$bodymail.= '<td width="5%">';
$bodymail.= '<img style="width:35px;height:35px;padding-left:5px;" src="'.$logomeven.'">';
$bodymail.= '</td>';
$bodymail.= '<td width="95%">';
$bodymail.= '<p style="font-size:15px;padding-left:10px; padding-right:10px;text-align: justify;">';
$bodymail.= '« <b>Solidaires</b> » vous permet également d\'accéder à l\'application <span style="color:#247aa1;font-weight: 600;">« Manifestations Evénementiels » réalisée par la ville de ERAGNY sur OISE</span> pour évaluer <span style="color:#247aa1;font-weight: 600;">le coût d\'une manifestation (culturelle, sportive...) ou d\'un dispositif mis en place par les collectivités</span>.<br />';
$bodymail.= 'En page d\'accueil de « <a href='.$this->parambag->get("web_path").'><b>Solidaires</b></a>» vous pourrez faire une demande de téléchargement de cet outil (tableur Excel) et entrer en contact avec les créateurs de cet outil.';
$bodymail.= '</p>';
$bodymail.= '</td>';
$bodymail.= '</tr>';
$bodymail.= '</table>';
$bodymail.= '<br />';
$bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
$bodymail.= 'Vous pouvez dès maintenant utiliser ces outils en vous connectant à « <a href='.$this->parambag->get("web_path").'><b>Solidaires</b></a> ».<br / >';
$bodymail.= 'Votre identifiant est : <span style="color:#ff0000;font-weight: 600;">'.$usr->getUsername().'</span>';
$bodymail.= ' Avec votre identifiant, vous retrouverez vos simulations saisies précédemment.';
$bodymail.= '<br /> <br />';
$bodymail.= 'Si vous rencontrez des difficultés pour vous connecter, veuillez nous envoyer un courriel à l\'adresse suivante : <a href="mailto:assistance.technique@solidaires.com" title="Assistance technique Rural Consult">assistance.technique@solidaires.com</a>.';
$bodymail.= '<br /> <br />';
$bodymail.= 'Nous restons à votre disposition pour toute autre information.';
$bodymail.= '<br /> <br />';
$bodymail.= '<span style="color:#ff0000;font-weight: 600;">Damien CHRISTIANY</span><br />';
$bodymail.= '<span style="color:#6c6c6c;font-weight: 600;">Direction du Réseau et des Territoires</span><br />';
$bodymail.= 'Rural Consult<br />';
$bodymail.= '72 av. Pierre Mendès France Paris 75914 cedex 13<br />';
$bodymail.= '<br /> <br />';
$bodymail.= '</p>';
$bodymail.= '<div style="font-size:11px;">';
$bodymail.= ' Vous avez ouvert un compte « Solidaires » le '.$usr->getUsrdatcre()->format('d/m/Y').'.<br />';
$bodymail.= '</div>';
$bodymail.= '</div>';
$bodymail.= '<div style="width:750px;height:20px;text-align:center;background:#4f8eaf;font-size:12px Arial, Helvetica, sans-serif;color:#fff;">';
$bodymail.= 'Rural Consult © Tous droits réservés';
$bodymail.= '</div>';
$bodymail.= '<br /> <br />';
$bodymail.= '</div>';
$mailaenv['body'] = $bodymail;
// $unmess = $this->meylerservice->envoidunmail('solidaires infos',$mailaenv); // envoi
$nbmailenvoyes++;
$usrdatisb = new \DateTime();
$usrdatisb->createFromFormat("Y-m-d H:i:s", time());
// Enregistrement en bdd
$usr->setusrdatisb($usrdatisb);
// $em->persist($usr); // TODO à activer en PROD
// $em->flush(); // TODO à activer en PROD
}
}
$this->get('session')->getFlashBag()->add(
'Succès',
$nbmailenvoyes.' mails envoyés. Nb utilisateurs sélect : '.$nb_usr
);
}else{
$this->get('session')->getFlashBag()->add(
'Succès',
'Aucun utilisateur sélectionné, aucun courriel à envoyer.'
);
}
return $this->redirect($this->generateUrl('pageaccueil'));
}else{ // erreur réservé admin
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (adm)'
);
// Affichage page inexistante
return $this->render('default\noway.html.twig', array(
));
}
}
// TODO : à revoir, vérifier fonctionnement (31/07/24)
// Annonce PPI, envoi à tous les usr (mailing 07/2022)
#[Route(path: '/mailppi', name: 'envmailppi')]
public function mailppi
(
Request $request,
ManagerRegistry $doctrine
): Response
{
$em = $doctrine->getManager();
$user = $this->getUser();
$lstadmin = $this->divservice->getIdAdmin();
if(($user != null)&&(in_array($user->getUsrid(), $lstadmin))){ // seuls les admin
$nbmailaexpedier = 10;
$nbmailenvoyes = 0;
$mailaenv = array();
$mailaenv['sujet'] = "[Rural Consult] Solidaires : les nouveaux outils d'analyse financière";
$mailaenv['titre'] = "[Rural Consult] Solidaires : les nouveaux outils d'analyse financière";
$mailaenv['expediteur_nom'] = "Solidaires Infos";
$mailaenv['expediteur_email'] = "solidaires@solidaires.com";
$mailaenv['destinataire_nom'] = "";
$mailaenv['destinataire_email'] = "";
$mailaenv['fichiers'] = array(); // les fichiers joints
$mailaenv['cc'] = ''; // pas de copie ici
$destinataire_nom_bcc = "Assistance technique Rural Consult";
$destinataire_email_bcc = "assistance.technique@solidaires.com";
$mailaenv['bcc'] = array($destinataire_email_bcc => $destinataire_nom_bcc);
//$mailaenv['bcc'] = ''; // test, alors inutile
$urllogo = $this->parambag->get('img_path')."entet_email_cf.webp";
$logotc = $this->parambag->get('img_path')."logo_tc.jpg";
$iconppi = $this->parambag->get('img_path')."ppi.png";
$iconmod = $this->parambag->get('img_path')."mod.png";
$iconpro = $this->parambag->get('img_path')."pro.png";
$iconisb = $this->parambag->get('img_path')."isb.png";
$iconpfi = $this->parambag->get('img_path')."pfi.png";
$iconlis = $this->parambag->get('img_path')."lis.png";
$iconmev = $this->parambag->get('img_path')."mev.png";
$web_path = $this->parambag->get('web_path');
$search_now = time();
$datcremax = date('Y-m-d', mktime(0,0,0,date('m', $search_now),date('d', $search_now)-4,date('Y', $search_now)));
// à effectuer en N fois
$query = $em->getRepository(usr::class)->createQueryBuilder('usr');
$query
->select('usr')
->where('usr.usrdatppi IS NULL')
// ->andwhere('usr.usrdatcre < :datcremax') bof...
// ->setParameter('datcremax' ,$datcremax)
->orderBy('usr.usrnom', 'ASC')
;
$utilisateurs = $query->getQuery()->getResult();
$nb_usr = count($utilisateurs);
if($nb_usr>0){
$k=0;
foreach($utilisateurs as $usr){
$k++;
if($k <= $nbmailaexpedier){ // par paquet
$mailaenv['destinataire_nom'] = "";
$mailaenv['destinataire_email'] = $usr->getUsremail(); // TODO à activer en PROD
// $mailaenv['destinataire_email'] = "didier.pfennig@free.fr"; // TODO à désactiver en PROD
// texte du mail
$bodymail = '<div style="width:750px;margin:0 auto;">';
$bodymail.= '<img style="width:750;height:64px;border:none" src="'.$urllogo.'">';
$bodymail.= '<div style="width:747px;text-align:left;font-size:12px Arial, Helvetica, sans-serif;color:#414141;border:1px solid #4f8eaf;overflow:hidden;">';
$bodymail.= '<p style="padding-left:10px; padding-right:10px;"><b>Madame, Monsieur,</b></p>';
$bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
$bodymail.= 'vous recevez ce courriel car vous avez déjà utilisé les outils d’analyse financière du site « <a href='.$this->parambag->get("web_path").'><b>Solidaires</b></a> » développés par Rural Consult, un service de la Banque des Territoires de la Caisse des Dépôts.';
$bodymail.= '</p>';
$bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
$bodymail.= 'Aujourd\'hui, nous vous annonçons la mise en ligne de 3 nouveaux outils à visée pédagogique qui répondront, nous l\'espérons, à vos attentes.<br /> <br />';
$bodymail.= '<table width="100%">';
$bodymail.= '<tr>';
$bodymail.= '<td width="5%">';
$bodymail.= '<img src="'.$iconppi.'" style="vertical-align:middle;border:0;" height="50" width="50">';
$bodymail.= '</td>';
$bodymail.= '<td width="95%" style="font-size:14px;">';
$bodymail.= '<b>Plan Pluriannuel d\'Investissement</b> : construire un tableau de PPI, consolider les coûts d\'un ensemble de projets et mesurer le poids des emprunts nécessaires à l\'équilibre.';
$bodymail.= '</td>';
$bodymail.= '</tr>';
$bodymail.= '<tr>';
$bodymail.= '<td width="5%">';
$bodymail.= '<img src="'.$iconpfi.'" style="vertical-align:middle;border:0;" height="50" width="50">';
$bodymail.= '</td>';
$bodymail.= '<td width="95%" style="font-size:14px;">';
$bodymail.= '<b>Potentiel Fiscal</b> : Comprendre le calcul du potentiel fiscal 2021 d\'une commune et simuler son évolution à partir des nombreuses variables qui le composent.';
$bodymail.= '</td>';
$bodymail.= '</tr>';
$bodymail.= '<tr>';
$bodymail.= '<td width="5%">';
$bodymail.= '<img src="'.$iconlis.'" style="vertical-align:middle;border:0;" height="50" width="50">';
$bodymail.= '</td>';
$bodymail.= '<td width="95%" style="font-size:14px;">';
$bodymail.= '<b>Lissage de taux</b> : Réaliser l\'harmonisation progressive de taux multiples sur une période variable (maximum 20 ans) vers un taux unique choisi.';
$bodymail.= '</td>';
$bodymail.= '</tr>';
$bodymail.= '</table>';
$bodymail.= '</p>';
$bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
$bodymail.= 'Nous avons aussi mis à jour les outils suivants :<br />';
$bodymail.= '<table width="100%">';
$bodymail.= '<tr>';
$bodymail.= '<td width="5%">';
$bodymail.= '<img src="'.$iconmod.'" style="vertical-align:middle;border:0;" height="50" width="50">';
$bodymail.= '</td>';
$bodymail.= '<td width="95%" style="font-size:14px;">';
$bodymail.= '<b>MODELICO</b> : pour mesurer l\'impact simplifié d\'un nouvel emprunt sur les principaux indicateurs financiers (soldes de gestion) d\'une collectivité locale.';
$bodymail.= '</td>';
$bodymail.= '</tr>';
$bodymail.= '<tr>';
$bodymail.= '<td width="5%">';
$bodymail.= '<img src="'.$iconpro.'" style="vertical-align:middle;border:0;" height="50" width="50">';
$bodymail.= '</td>';
$bodymail.= '<td width="95%" style="font-size:14px;">';
$bodymail.= '<b>PROSPER</b> : pour calculer les principaux indicateurs financiers d\'une collectivité locale : autofinancement brut et net, besoin de financement, capacité de désendettement.';
$bodymail.= '</td>';
$bodymail.= '</tr>';
$bodymail.= '<tr>';
$bodymail.= '<td width="5%">';
$bodymail.= '<img src="'.$iconisb.'" style="vertical-align:middle;border:0;" height="50" width="50">';
$bodymail.= '</td>';
$bodymail.= '<td width="95%" style="font-size:14px;">';
$bodymail.= '<b>ISBA</b> : pour une aide à la décision en matière de financement des infrastructures d\'eau et d\'assainissement. Calcul de l\'impact simplifié d\'un nouvel investissement sur les tarifs et les redevances.';
$bodymail.= '</td>';
$bodymail.= '</tr>';
$bodymail.= '<tr>';
$bodymail.= '<td width="5%">';
$bodymail.= '<img src="'.$iconmev.'" style="vertical-align:middle;border:0;" height="50" width="50">';
$bodymail.= '</td>';
$bodymail.= '<td width="95%" style="font-size:14px;">';
$bodymail.= '<b>MEVEN</b> : vous pourrez télécharger le tableur MEVEN pour calculer les coûts générés par l\'organisation d\'un évènement local.';
$bodymail.= '</td>';
$bodymail.= '</tr>';
$bodymail.= '</table>';
$bodymail.= '</p>';
$bodymail.= '<p style="padding-left:10px; padding-right:10px;text-align: justify;">';
$bodymail.= 'L\'ensemble de ces outils est à votre disposition sur le site web « <a href='.$this->parambag->get("web_path").'><b>Solidaires</b></a> ».<br / >';
$bodymail.= 'Avec votre identifiant, vous retrouverez toutes vos simulations saisies précédemment.<br />';
$bodymail.= 'Votre identifiant est : <span style="color:#ff0000;font-weight: 600;">'.$usr->getUsername().'</span><br />';
$bodymail.= 'Si vous ne vous souvenez pas de votre mot de passe, vous pourrez le modifier.';
$bodymail.= '<br /> <br />';
$bodymail.= 'Si vous rencontrez des difficultés pour vous connecter, veuillez nous envoyer un courriel à l\'adresse suivante : <a href="mailto:assistance.technique@solidaires.com" title="Assistance technique Rural Consult">assistance.technique@solidaires.com</a>.';
$bodymail.= '<br /> <br />';
$bodymail.= 'Nous restons à votre disposition pour toute autre information.';
$bodymail.= '<br /> <br />';
$bodymail.= '<span style="color:#6c6c6c;font-weight: 600;">Direction du Réseau et des Territoires</span><br />';
$bodymail.= 'Rural Consult<br />';
$bodymail.= '72 av. Pierre Mendès France Paris 75914 cedex 13<br />';
$bodymail.= '<br /> <br />';
$bodymail.= '</p>';
$bodymail.= '<div style="font-size:11px;">';
$bodymail.= ' Vous avez ouvert un compte « Solidaires » le '.$usr->getUsrdatcre()->format('d/m/Y').'.<br />';
$bodymail.= '</div>';
$bodymail.= '</div>';
$bodymail.= '<div style="width:750px;height:20px;text-align:center;background:#4f8eaf;font-size:12px Arial, Helvetica, sans-serif;color:#fff;">';
$bodymail.= 'Rural Consult © Tous droits réservés';
$bodymail.= '</div>';
$bodymail.= '<br /> <br />';
$bodymail.= '</div>';
$mailaenv['body'] = $bodymail;
$unmess = $this->meylerservice->envoidunmail('solidaires infos 2022',$mailaenv); // envoi
$nbmailenvoyes++;
$usrdatppi = new \DateTime();
$usrdatppi->createFromFormat("Y-m-d H:i:s", time());
// Enregistrement en bdd
$usr->setUSRDATPPI($usrdatppi);
$em->persist($usr); // TODO à activer en PROD
$em->flush(); // TODO à activer en PROD
}
}
$this->get('session')->getFlashBag()->add(
'Succès',
$nbmailenvoyes.' mails envoyés. Nb utilisateurs sélect : '.$nb_usr
);
}else{
$this->get('session')->getFlashBag()->add(
'Succès',
'Aucun utilisateur sélectionné, aucun courriel à envoyer.'
);
}
return $this->redirect($this->generateUrl('pageaccueil'));
}else{ // erreur réservé admin
$this->get('session')->getFlashBag()->add(
'Erreur',
'La page demandée n\'existe pas ! (adm)'
);
// Affichage page inexistante
return $this->render('default\noway.html.twig', array(
));
}
}
}