<?php
namespace App\Service;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use App\Entity\User;
use App\Entity\Mine;
use App\Entity\UtilisateurMine;
use App\Entity\LogBatch;
use App\Service\UserService;
class MineService
{
private $repo_mine;
private $repo_utilisateur_mine;
private $user_Service;
private $entityManager;
private $session;
public function __construct(
SessionInterface $session,
EntityManagerInterface $entityManager,
UserService $user_Service
) {
$this->session = $session;
$this->entityManager = $entityManager;
$this->repo_mine = $this->entityManager->getRepository(Mine::class);
$this->repo_user = $this->entityManager->getRepository(User::class);
$this->repo_utilisateur_mine = $this->entityManager->getRepository(UtilisateurMine::class);
$this->repo_logbatch = $this->entityManager->getRepository(LogBatch::class);
$this->user_Service = $user_Service;
} // function
/**
*
*/
public function getMineContext($user)
{
if (!is_null($this->session->get("mine_id"))) {
return $this->repo_mine->find($this->session->get("mine_id"));
} else {
$mine = $this->user_Service->getMinePrincipale($user);
$this->session->set("mine_id", $mine->getId());
return $mine;
} // if
} // function
public function setMineContext($mine_id)
{
$mine = $this->repo_mine->find($mine_id);
$this->session->set("mine_id", $mine->getId());
} // function
/**
* 20220317 - LGA - Mise à jour des mines avec le flux JSON DTP
* 20221228 - LGA - Si nouvelle mine, ajout à tous les ROLES_ADMIN
*
* parametres : le flux JSon et la date de la derniere MAJ pour controle
*/
public function majMinesParFluxJSON($fluxJSON, $dateDernMAJBatch)
{
// Transformation flux JSON en tableau
$tableauJSON = json_decode($fluxJSON, true);
// Parcours du tableau pour MAJ base
foreach ($tableauJSON as $mine_data) {
// Test de la validité des données recues
if (isset($mine_data['id'])) {
// on teste d'abord si la mine existe en base
$mine = $this->repo_mine->findBy(['remote_id' => $mine_data['id']]);
if ($mine != []) {
echo "la mine existe\n";
$dateDernMAJRes = new \DateTime($mine_data['updatedAt']);
// On teste l'intervalle entre derniére MAJ DTP et derniére MAJ Batch
$intervalle = $dateDernMAJRes->diff($dateDernMAJBatch);
// Utilisation de intervalle->format('%R') pour vérifier l'écart entre les dates
// renvoie "+" si la derniére MAJ DTP est antérieure à la derniére MAJ Batch, pas de MAJ
// renvoie "-" si la derniére MAJ DTP est postérieure à la derniére MAJ Batch, MAJ locale nécessaire
if ($intervalle->format('%R') == "-") {
echo "MAJ nécessaire\n";
try {
print_r($mine_data);
$resMaj = $this->majMine($mine[0], $mine_data);
echo "MAJ effectuée\n";
} catch (\Exception $e) {
echo "MAJ non effectuée : ERREUR >> " . $e->getMessage() . "\n";
} // catch
} else {
echo "Pas de MAJ nécessaire\n";
} // if
} else {
echo "la mine n'existe pas. Création nécessaire\n";
$newMine = new Mine();
try {
print_r($mine_data);
$resMaj = $this->majMine($newMine, $mine_data);
echo "Création effectuée\n";
// 20221228 - LGA - Création de la jointure mine / users admin
/* $users = $this->repo_user->findAll();
foreach($users as $user) {
if (in_array('ROLE_ADMIN', $user->getRoles())) {
$obj = new UtilisateurMine();
$obj->setMine($newMine);
$obj->setUser($user);
$this->entityManager->persist($obj);
$this->entityManager->flush();
}// if
}// foreach*/
} catch (\Exception $e) {
echo "Création non effectuée : ERREUR >> " . $e->getMessage() . "\n";
} // catch
} // if
} else {
// Remontée d'un erreur
throw new \Exception("Une erreur s'est produite : " . $mine_data);
} // if
} // for
} // function
/**
* Sous fonction : remplissage et enregistrement BDD mine
*/
function majMine($mine, $data)
{
$mine->setRemoteId($data['id']);
$mine->setLibelle($data['nom']);
$mine->setAdresse($data['adresse']);
$mine->setCodePostal($data['codePostal']);
$mine->setVille($data['ville']);
$mine->setTelephone($data['telephone']);
$mine->setMail($data['mail']);
$this->entityManager->persist($mine);
$this->entityManager->flush();
return true;
} // function
// 20230710 - TOM - Appelé à chaque fois dans le cron pour affecter toutes les mines aux admins
function affectMinesToAdminUsers()
{
// 20221228 - LGA - Création de la jointure mine / users admin
$users = $this->repo_user->findAll();
$mines = $this->repo_mine->findAll();
foreach ($users as $user) {
if (in_array('ROLE_ADMIN', $user->getRoles())) {
foreach($mines as $mine) {
$utilisateurMine = $this->repo_utilisateur_mine->findOneBy(['user' => $user, 'mine' => $mine]);
if(is_null($utilisateurMine)) {
$obj = new UtilisateurMine();
$obj->setMine($mine);
$obj->setUser($user);
$this->entityManager->persist($obj);
$this->entityManager->flush();
}
}
} // if
} // foreach
}
}// class MineService