<?php
/**
* Created by PhpStorm.
*/
namespace App\Services;
use App\Entity\Entreprise;
use App\Entity\Fournisseur;
use App\Entity\FournisseurProject;
use App\Entity\Project;
use App\Entity\User;
use App\Entity\UserStripe;
use App\Form\FournisseurProjectType;
use App\Form\UserFournisseurProjectType;
use App\Form\UserIntervenantType;
use App\Form\UserProjectType;
use App\Form\UserSpvType;
use App\Form\UserType;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Twig\Environment;
use App\Entity\Centrale;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class UserService
{
private $em;
private $trans;
private $params;
private $security;
private $session;
private $twig;
private $notification;
public function __construct(
Environment $twig,
SessionInterface $session,
Security $security,
ParameterBagInterface $params,
EntityManagerInterface $em,
TranslatorInterface $trans,
ValidatorInterface $validator,
FlashBagInterface $flashBag,
UserPasswordEncoderInterface $passwordEncoder,
Notifications $notifications,
FormFactoryInterface $form
) {
$this->em = $em;
$this->trans = $trans;
$this->params = $params;
$this->security = $security;
$this->session = $session;
$this->twig = $twig;
$this->validator = $validator;
$this->form = $form;
$this->flashBag = $flashBag;
$this->passwordEncoder = $passwordEncoder;
$this->notification = $notifications;
}
public function paginate($request){
$length = $request->get('length');
$length = $length && ($length!=-1)?$length:0;
$start = $request->get('start');
$start = $length?($start && ($start!=-1)?$start:0)/$length:0;
$column = $search = $request->get('columns');
$order = $request->get('order')[0];
$columnOrder = $order['column'];
$dirOrder = $order['dir'];
$columNameOrder = $column[$columnOrder]['data'];
$search = $request->get('search');
$role = $request->get('role');
$isArchive = $request->get('isArchive');
$filters = [
'query' => trim(@$search['value']),
'isArchive' => $isArchive
];
$users= $this->em->getRepository(\App\Entity\User::class)->search($role,$filters, $start, $length, true,$columNameOrder, $dirOrder);
$recordsFiltered= $this->em->getRepository(\App\Entity\User::class)->search($role,$filters, $start, $length, true,$columNameOrder, $dirOrder,true);
$recordsTotal= $this->em->getRepository(\App\Entity\User::class)->search($role,array(), $start, $length, true,$columNameOrder, $dirOrder,true);
$output = array(
'data' => array(),
'recordsFiltered' => isset($recordsFiltered['result']) ? $recordsFiltered['result'] : 0,
'recordsTotal' => isset($recordsTotal['result']) ? $recordsTotal['result'] : 0,
);
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
$intl = new \IntlDateFormatter('fr', \IntlDateFormatter::LONG, \IntlDateFormatter::NONE, null, null, 'd MMMM YYYY');
foreach ($users as $user) {
if(in_array('ROLE_SUPER_ADMINISTRATOR',$user->getRoles())){
$acces = '-';
}else{
if($user->getAcces()== User::ACCES_LECTURE){
$acces = 'Lecture';
}else{
$acces = 'Écriture';
}
}
$action =
$this->twig->render(
'admin/user/default/bouton.html.twig', array(
'user' => $user
));
$checkbox =
$this->twig->render(
'admin/user/default/checkbox.html.twig', array(
'user' => $user
));
$statut =
$this->twig->render(
'admin/user/default/status.html.twig', array(
'status' => $user->getIsEnabled()
));
$role =
$this->twig->render(
'admin/user/default/role.html.twig', array(
'role' => strtoupper($user->getRoleString()),
'user' => $user
));
$output['data'][] = [
'responsive_id' => '',
'id' => $user->getId(),
'typeAcces' => $user->getTypeAccesStr(),
'firstname' => $user->getFirstname(),
'lastname' => $user->getLastname(),
'entreprise' => $user->getEntreprise() ? $user->getEntreprise()->getName() : '' ,
'email' => $user->getEmail(),
'role' => $role,
'derniereConnecxion' => $user->getDerniereConnecxion() ? $intl->format($user->getDerniereConnecxion()).' '.$user->getDerniereConnecxion()->format('H:i:s') :' - ',
'acces' => $acces,
'status' => $statut,
'isLoginSso' => $user->getIsLoginSso() ? '<span class="colorGreen">Oui</span>' : '<span class="colorRed">Non</span>',
'action' => $action,
'checkbox' => $checkbox,
];
}
return $output;
}
/**
* GENERATE RANDOM PASSWORD ON CREATE USER
* @return string
*/
function randomPassword() {
$alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
$pass = array(); //remember to declare $pass as an array
$alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
for ($i = 0; $i < 8; $i++) {
$n = rand(0, $alphaLength);
$pass[] = $alphabet[$n];
}
return implode($pass); //turn the array into a string
}
public function addUser($request) : array
{
$user = new \App\Entity\User();
$formUser = $this->form->create(UserType::class, $user);
$formUser->handleRequest($request);
if ($formUser->isSubmitted() && $formUser->isValid()) {
$role = $request->get('role');
$role = $request->get('role');
$typeFournissuer = 0;
if(!$role){
return [
'formUser' => $formUser->createView(),
'success' => false,
];
}
if(in_array($role,[User::fournisseur_type_EPC,User::fournisseur_type_Installateur,User::fournisseur_type_Charpentier,User::fournisseur_type_Notaire,User::fournisseur_type_Constructeur,User::fournisseur_type_Mainteneur,User::fournisseur_type_Conducteur,User::fournisseur_type_AMO])){
$typeFournissuer = $role;
$role = 'ROLE_FOURNISSEUR';
if(!$request->get('user')['fournisseur']){
return [
'formUser' => $formUser->createView(),
'msgErreur' => 'Veillez choisir le fournisseur',
'success' => false,
];
}
}
$password = $this->randomPassword();
$user->setPassword(
$this->passwordEncoder->encodePassword(
$user,
$password
)
);
$user->setFournisseurType($typeFournissuer);
$user->setRoles(array($role));
$this->em->persist($user);
$this->em->flush();
$this->notification->createUser($user, $password);
$this->flashBag->add(
'success',
$this->trans->trans('Vous avez ajouté un nouveau compte.')
);
return [
'formUser' => $formUser->createView(),
'success' => true
];
}
return [
'formUser' => $formUser->createView(),
'success' => false,
];
}
public function editUser($request,$id) : array
{
$user = $this->em->getRepository(User::class)->find($id);
$formUser = $this->form->create(UserType::class, $user,['userEntity'=>$user]);
$formUser->handleRequest($request);
if ($formUser->isSubmitted() && $formUser->isValid()) {
$role = $request->get('role');
$typeFournissuer = 0;
if(in_array($role,[User::fournisseur_type_EPC,User::fournisseur_type_Installateur,User::fournisseur_type_Charpentier,User::fournisseur_type_Notaire,User::fournisseur_type_Constructeur,User::fournisseur_type_Mainteneur,User::fournisseur_type_Conducteur,User::fournisseur_type_AMO])){
$typeFournissuer = $role;
$role = 'ROLE_FOURNISSEUR';
$user->setRoles(array($role));
if(!$request->get('user')['fournisseur']){
return [
'formUser' => $formUser->createView(),
'msgErreur' => 'Veillez choisir le fournisseur',
'success' => false,
];
}
}else{
if($role){
$user->setRoles(array($role));
}
}
$user->setFournisseurType($typeFournissuer);
$this->em->persist($user);
$this->em->flush();
$this->flashBag->add(
'success',
$this->trans->trans('Vous avez modifié le compte.')
);
return [
'formUser' => $formUser->createView(),
'success' => true,
'user' => $user
];
}
return [
'formUser' => $formUser->createView(),
'success' => false,
'user' => $user,
];
}
public function addUserIntervenant($request) : array
{
$user = new \App\Entity\User();
$formUserIntervenant = $this->form->create(UserIntervenantType::class, $user);
$formUserIntervenant->handleRequest($request);
if ($formUserIntervenant->isSubmitted() && $formUserIntervenant->isValid()) {
$role = $request->get('role');
$password = $this->randomPassword();
$user->setPassword(
$this->passwordEncoder->encodePassword(
$user,
$password
)
);
$user->setRoles(array($role));
$this->em->persist($user);
$this->em->flush();
$this->setIntervenantNum($user);
$this->notification->createUser($user, $password);
$this->flashBag->add(
'success',
$this->trans->trans('Vous avez ajouté un nouveau compte.')
);
return [
'formUserIntervenant' => $formUserIntervenant->createView(),
'success' => true
];
}
return [
'formUserIntervenant' => $formUserIntervenant->createView(),
'success' => false,
];
}
public function editUserIntervenant($request,$id) : array
{
$user = $this->em->getRepository(User::class)->find($id);
$formUserIntervenant = $this->form->create(UserIntervenantType::class, $user);
$formUserIntervenant->handleRequest($request);
if ($formUserIntervenant->isSubmitted() && $formUserIntervenant->isValid()) {
$role = $request->get('role');
if($role){
$user->setRoles(array($role));
}
$this->em->persist($user);
$this->em->flush();
$this->setIntervenantNum($user);
$this->flashBag->add(
'success',
$this->trans->trans('Vous avez modifié le compte.')
);
return [
'formUserIntervenant' => $formUserIntervenant->createView(),
'success' => true,
'user' => $user
];
}
return [
'formUserIntervenant' => $formUserIntervenant->createView(),
'success' => false,
'user' => $user,
];
}
public function extractXlsx($users){
$file= $this->params->get('zips_directory')."/extraire_users.xlsx";
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Head 2
$tableHead2 = [
'font'=>[
'color'=>[
'rgb'=>'0071c1'
],
'bold'=>true,
'size'=>12
],
'fill'=>[
'fillType' => Fill::FILL_SOLID,
'startColor' => [
'rgb' => 'dcebf4'
]
],
];
$sheet->setCellValue('A1',"Nom")
->setCellValue('B1',"Prénom")
->setCellValue('C1',"Entreprise")
->setCellValue('D1',"Adresse mail")
->setCellValue('E1',"Droits")
->setCellValue('F1',"Statut")
->setCellValue('G1',"DERNIÉRE CONNEXION");
// Borders a2 z2
$spreadsheet->getActiveSheet()->getStyle('A1')->getBorders()->getRight()->setBorderStyle(Border::BORDER_MEDIUM)->setColor(new Color('FFFFFF'));
$spreadsheet->getActiveSheet()->getStyle('B1')->getBorders()->getRight()->setBorderStyle(Border::BORDER_MEDIUM)->setColor(new Color('FFFFFF'));
$spreadsheet->getActiveSheet()->getStyle('C1')->getBorders()->getRight()->setBorderStyle(Border::BORDER_MEDIUM)->setColor(new Color('FFFFFF'));
$spreadsheet->getActiveSheet()->getStyle('D1')->getBorders()->getRight()->setBorderStyle(Border::BORDER_MEDIUM)->setColor(new Color('FFFFFF'));
$spreadsheet->getActiveSheet()->getStyle('E1')->getBorders()->getRight()->setBorderStyle(Border::BORDER_MEDIUM)->setColor(new Color('FFFFFF'));
$spreadsheet->getActiveSheet()->getStyle('F1')->getBorders()->getRight()->setBorderStyle(Border::BORDER_MEDIUM)->setColor(new Color('FFFFFF'));
$spreadsheet->getActiveSheet()->getStyle('G1')->getBorders()->getRight()->setBorderStyle(Border::BORDER_MEDIUM)->setColor(new Color('FFFFFF'));
//width
$spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(50);
$spreadsheet->getActiveSheet()->getColumnDimension('B')->setWidth(25);
$spreadsheet->getActiveSheet()->getColumnDimension('C')->setWidth(30);
$spreadsheet->getActiveSheet()->getColumnDimension('D')->setWidth(50);
$spreadsheet->getActiveSheet()->getColumnDimension('E')->setWidth(25);
$spreadsheet->getActiveSheet()->getColumnDimension('F')->setWidth(20);
$spreadsheet->getActiveSheet()->getColumnDimension('G')->setWidth(20);
$spreadsheet->getActiveSheet()->getStyle('A1:G1')->applyFromArray($tableHead2);
//loop through the data
//current row
$row=2;
foreach ($users as $user) {
$intl = new \IntlDateFormatter('fr', \IntlDateFormatter::LONG, \IntlDateFormatter::NONE, null, null, 'd MMMM YYYY');
$spreadsheet->getActiveSheet()
->setCellValue('A'.$row , $user->getLastname())
->setCellValue('B'.$row , $user->getFirstname())
->setCellValue('C'.$row , $user->getEntreprise() ? $user->getEntreprise()->getName() : '')
->setCellValue('D'.$row , $user->getEmail())
->setCellValue('E'.$row , $user->getTypeAccesStr())
->setCellValue('F'.$row , $user->getIsEnabled() ? 'Activé' : 'Desativé')
->setCellValue('G'.$row , $user->getDerniereConnecxion() ? $intl->format($user->getDerniereConnecxion()).' '.$user->getDerniereConnecxion()->format('H:i:s') :' - ')
;
//increment row
$row++;
}
$firstRow=1;
$lastRow=$row-1;
$spreadsheet->getActiveSheet()->setAutoFilter("A".$firstRow.":G".$lastRow);
$writer = new Xlsx($spreadsheet);
$writer->save($file);
return $file;
}
private function setIntervenantNum($user){
$intervenant = 0;
if($user){
if(in_array('ROLE_MAITRE_OEUVRE',$user->getRoles())){
$intervenant = User::INTERVENANT_MAITRE_OEUVRE;
}elseif (in_array('ROLE_AMO',$user->getRoles())){
$intervenant = User::INTERVENANT_AMO;
}elseif (in_array('ROLE_MACON',$user->getRoles())){
$intervenant = User::INTERVENANT_MACON;
}elseif (in_array('ROLE_CONSTRUCTEUR',$user->getRoles())){
$intervenant = User::INTERVENANT_CONSTRUCTEUR;
}elseif (in_array('ROLE_CHARPENTIER',$user->getRoles())){
$intervenant = User::INTERVENANT_CHARPENTIER;
}elseif (in_array('ROLE_ELECTRICIEN',$user->getRoles())){
$intervenant = User::INTERVENANT_ELECTRICIEN;
}elseif (in_array('ROLE_COUVREUR',$user->getRoles())){
$intervenant = User::INTERVENANT_COUVREUR;
}elseif (in_array('ROLE_POSEUR',$user->getRoles())){
$intervenant = User::INTERVENANT_POSEUR;
}elseif (in_array('ROLE_AUTRE',$user->getRoles())){
$intervenant = User::INTERVENANT_AUTRE;
}
$user->setIntervenantNum($intervenant);
$this->em->persist($user);
$this->em->flush();
}
}
public function addSpvUser($request,$id) : array
{
$user = $this->em->getRepository(User::class)->find($id);
$formUser = $this->form->create(UserSpvType::class, $user);
$formUser->handleRequest($request);
if ($formUser->isSubmitted() && $formUser->isValid()) {
$this->em->persist($user);
$this->em->flush();
$this->flashBag->add(
'success',
$this->trans->trans('Vous avez modifié le compte.')
);
return [
'formSpvUser' => $formUser->createView(),
'success' => true,
'user' => $user
];
}
return [
'formSpvUser' => $formUser->createView(),
'success' => false,
'user' => $user,
];
}
public function addProjectUser($request,$id) : array
{
$user = $this->em->getRepository(User::class)->find($id);
$fournisseur = $this->em->getRepository(Fournisseur::class)->findOneBy(['user'=>$id]);
$projects = $this->em->getRepository(Project::class)->findAllProjectActive();
if($user) {
$fournisseurNotaires = $this->em->getRepository(FournisseurProject::class)->findBy(['user'=>$user->getId()]);
if(!$fournisseurNotaires && $fournisseur){
$fournisseurNotaires = $this->em->getRepository(FournisseurProject::class)->findBy(['fournisseur'=>$fournisseur->getId()]);
}
if ($request->isMethod('POST')) {
$projectsIds = $request->get('projectFournisseur');
if($fournisseurNotaires){
foreach ($fournisseurNotaires as $fournisseurNotaire){
$this->em->remove($fournisseurNotaire);
$this->em->flush();
}
}
if($projectsIds){
foreach ($projectsIds as $projectId){
$project = $this->em->getRepository(Project::class)->find($projectId);
$fournisseurNotaireEntity = new FournisseurProject();
$fournisseurNotaireEntity->setProject($project);
if($fournisseur){
$fournisseurNotaireEntity->setFournisseur($fournisseur);
}else{
$fournisseurNotaireEntity->setUser($user);
}
if($user->getFournisseurType()){
$fournisseurNotaireEntity->setTitre($user->getFournisseurTypeStr());
}
$this->em->persist($fournisseurNotaireEntity);
$this->em->flush();
}
}
$this->flashBag->add(
'success',
$this->trans->trans('Vous avez modifié le compte.')
);
return [
'success' => true,
'user' => $user
];
}
$fournisseurNotairesIdProject = [];
foreach ($fournisseurNotaires as $fournisseurNotaire){
$fournisseurNotairesIdProject[] = $fournisseurNotaire->getProject()->getId();
}
return [
'projects' => $projects,
'fournisseurNotairesIdProject' => $fournisseurNotairesIdProject,
'success' => false,
'user' => $user,
];
}else{
return [
'success' => false,
'user' => $user,
];
}
}
public function addUsersByArray($firstname,$lastname,$email,$tel)
{
if($email && $firstname && $lastname){
$role = 'ROLE_RESPONSABLE_DEVELOPPEMENT';
$entreprise = $this->em->getRepository(Entreprise::class)->findOneBy(['isAlteria'=>true]);
$user = $this->em->getRepository(User::class)->findOneBy(['email'=>$email]);
if(!$user){
$user = new User();
$user->setLastname($lastname);
$user->setFirstname($firstname);
$user->setEmail($email);
$user->setTel($tel);
$user->setEntreprise($entreprise);
$user->setRoles(array($role));
$user->setIsEnabled(1);
$user->setAcces(User::ACCES_ECRETURE);
$user->setTypeAcces(User::ACCES_interne_prejeance);
$password = $this->randomPassword();
$user->setPassword(
$this->passwordEncoder->encodePassword(
$user,
$password
)
);
$this->em->persist($user);
$this->em->flush();
$this->notification->createUser($user, $password);
}
}
}
}