<?php
namespace App\Controller\Fiche;
use App\Entity\Formation;
use App\Helper\ConstApp;
use App\Helper\Helper;
use App\Repository\StatutFicheRepository;
use App\Repository\UserRepository;
use App\Service\Fiche\SuiviPartenariaService;
use App\Service\FicheService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Fiche\SuiviPartenariat\Partenariat;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
/**
* @Route("/suivi/partenariat")
*/
class SuiviPartenariatController extends AbstractController
{
private SuiviPartenariaService $suiviPartenariaService;
private FicheService $ficheService;
private ParameterBagInterface $params;
private UserRepository $userRepo;
private Helper $helper;
private EntityManagerInterface $em;
private ConstApp $constApp;
public function __construct(
SuiviPartenariaService $suiviPartenariaService,
FicheService $ficheService,
ParameterBagInterface $params,
UserRepository $userRepo,
Helper $helper,
EntityManagerInterface $em,
ConstApp $constApp
)
{
$this->suiviPartenariaService = $suiviPartenariaService;
$this->ficheService = $ficheService;
$this->params = $params;
$this->userRepo = $userRepo;
$this->helper = $helper;
$this->em = $em;
$this->constApp = $constApp;
}
/**
* @Route("/", name="app_suivi_partenariat_index")
*/
public function index(): Response
{
return $this->render('fiche/suivi_partenariat/index.html.twig', []);
}
/**
* @Route("/api/suivi-partenariat-list", name="app_suivi_partenariat_list")
*/
public function getAllSuiviPartenariat(Request $request): JsonResponse {
$currentUser = $this->getUser();
$user = $this->userRepo->find($currentUser);
$profilUser = $user->getProfil()->getId();
$profilName = $user->getProfil()->getName();
$column = $request->query->get("column") ?? "";
$value = $request->query->get("value") ?? "";
$limit = $request->query->get("limit") ? intval($request->query->get("limit")) : 0;
$page = $request->query->get("page") ? intval($request->query->get("page")) : 0;
$offset = ($limit * $page) - $limit;
$totalRows = [];
$ceps = [];
//-------Beginning of filter data by Locality level-------------
$userLevelLocality = $user->getProfil()->getNiveauLocalite();
$userLocality = [];
$localityMethods = $this->constApp->localityMethods();
if (isset($localityMethods[$userLevelLocality])) {
$method = $localityMethods[$userLevelLocality];
foreach ($user->$method() as $locality) {
$userLocality[] = $locality->getId();
}
}
//-------End of filter data by Locality level-------------
//Récuperation des données à afficher si l'utilisateur connecté est admin
if ($user->getProfil()->getNiveauLocalite() == "nat_") {
$ceps = $this->suiviPartenariaService->getAllSuiviPartenariat(
$column,
$value,
$limit,
$offset,
null,
null,
null
);
$totalRows = $this->suiviPartenariaService->getAllSuiviPartenariat(
$column,
$value,
null,
null,
null,
null,
null
);
} else {
$ceps = $this->suiviPartenariaService->getAllSuiviPartenariat(
$column, $value, $limit, $offset,
$userLocality,
$userLevelLocality,
$profilName == 'CGEAF' ? $user->getId() : null
);
$totalRows = $this->suiviPartenariaService->getAllSuiviPartenariat(
$column, $value, null, null,
$userLocality,
$userLevelLocality,
$profilName == 'CGEAF' ? $user->getId() : null
);
}
return new JsonResponse(
[
'title' => 'Récuperation liste suivis partenariats',
'message' => 'Récuperation avec succès',
'status' => 'success',
'data' => [
'rows' => $ceps,
'dataInfo' => [
'totalRows' => count($totalRows),
'limit' => $limit,
'page' => $page,
]
]
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/{id}/show", name="app_suivi_partenariat_show", methods={"GET", "POST"})
*/
public function show(Partenariat $partenariat): Response
{
$fokontanyOP = $partenariat->getOrganisationPaysanne()->getFokontany();
$poleOP = $partenariat->getOrganisationPaysanne()->getPole();
$fokontanyOM = $partenariat->getOperateurMarche()->getFokontany();
$htmlViewFormFiche = $this->renderView('fiche/suivi_partenariat/show.html.twig', [
'partenariat' => $partenariat,
'fokontany' => $fokontanyOP,
'fokontanyOM' => $fokontanyOM,
'pole' => $poleOP
]);
return new JsonResponse(
[
'title' => 'Affichage suivi partenariat',
'message' => 'Affichage suivi partenariat avec succès',
'status' => 'success',
'htmlViewFormFiche' => $htmlViewFormFiche,
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/api/formation_partenariat/{id}", name="app_suivi_partenariat_formation", methods="GET")
*/
public function getListFormationPartenariat(Partenariat $partenariat, Request $request): JsonResponse
{
$column = $request->query->get("column") ?? "";
$value = $request->query->get("value") ?? "";
$limit = $request->query->get("limit") ? intval($request->query->get("limit")) : 0;
$page = $request->query->get("page") ? intval($request->query->get("page")) : 0;
$offset = ($limit * $page) - $limit;
$data = $this->helper->getAllFormation(
'partenariat_formation',
$partenariat->getId(),
'partenariat_id',
$this->em,
$column,
$value,
$limit,
$offset
);
$totalRows = $this->helper->getAllFormation(
'partenariat_formation',
$partenariat->getId(),
'partenariat_id',
$this->em,
$column,
$value,
null,
null
);
return new JsonResponse(
[
'title' => 'Récuperation liste formation',
'message' => 'Récuperation avec succès',
'status' => 'success',
'data' => [
'rows' => $data,
'dataInfo' => [
'totalRows' => count($totalRows),
'limit' => $limit,
'page' => $page,
]
]
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/api/formation_partenariat/{formationId}/beneficiaire", name="app_suivi_partenariat_formation_participant", methods="GET")
*/
public function getListParticipantFormationPartenariat(Formation $formationId, Request $request): JsonResponse
{
$column = $request->query->get("column") ?? "";
$value = $request->query->get("value") ?? "";
$limit = $request->query->get("limit") ? intval($request->query->get("limit")) : 0;
$page = $request->query->get("page") ? intval($request->query->get("page")) : 0;
$offset = ($limit * $page) - $limit;
$data = $this->helper->getAllBeneficiaryFormation(
$formationId,
$this->em,
$column,
$value,
$limit,
$offset
);
$totalRows = $this->helper->getAllBeneficiaryFormation(
$formationId,
$this->em,
$column,
$value,
null,
null
);
return new JsonResponse(
[
'title' => 'Récuperation liste des bénéficiaires formation',
'message' => 'Récuperation avec succès',
'status' => 'success',
'data' => [
'rows' => $data,
'dataInfo' => [
'totalRows' => count($totalRows),
'limit' => $limit,
'page' => $page,
]
]
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/api/visite-echange/partenariat/{id}", name="app_suivi_partenariat_visite-echange", methods="GET")
*/
public function getListVisiteEchangePartenariat(Partenariat $partenariat, Request $request): JsonResponse
{
$column = $request->query->get("column") ?? "";
$value = $request->query->get("value") ?? "";
$limit = $request->query->get("limit") ? intval($request->query->get("limit")) : 0;
$page = $request->query->get("page") ? intval($request->query->get("page")) : 0;
$offset = ($limit * $page) - $limit;
$formations = $this->suiviPartenariaService->getListVisteEchangePartenariat(
$partenariat,
$column,
$value,
$limit,
$offset
);
$totalRows = $this->suiviPartenariaService->getListVisteEchangePartenariat(
$partenariat,
$column,
$value,
null,
null
);
return new JsonResponse(
[
'title' => 'Récuperation liste formation',
'message' => 'Récuperation avec succès',
'status' => 'success',
'data' => [
'rows' => $formations,
'dataInfo' => [
'totalRows' => count($totalRows),
'limit' => $limit,
'page' => $page,
]
]
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/api/participant/visite-echange/partenariat/{id}", name="app_suivi_partenariat_visite-echange_participant", methods="GET")
*/
public function getListParticipantVisiteEchangePartenariat(Partenariat $partenariat, Request $request): JsonResponse
{
$column = $request->query->get("column") ?? "";
$value = $request->query->get("value") ?? "";
$limit = $request->query->get("limit") ? intval($request->query->get("limit")) : 0;
$page = $request->query->get("page") ? intval($request->query->get("page")) : 0;
$offset = ($limit * $page) - $limit;
$formations = $this->suiviPartenariaService->getListEafVisiteEchangePartenariatService(
$partenariat,
$column,
$value,
$limit,
$offset
);
$totalRows = $this->suiviPartenariaService->getListEafVisiteEchangePartenariatService(
$partenariat,
$column,
$value,
null,
null
);
return new JsonResponse(
[
'title' => 'Récuperation liste formation',
'message' => 'Récuperation avec succès',
'status' => 'success',
'data' => [
'rows' => $formations,
'dataInfo' => [
'totalRows' => count($totalRows),
'limit' => $limit,
'page' => $page,
]
]
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/api/autres/partenariat/{id}", name="app_suivi_partenariat_autres", methods="GET")
*/
public function getListAutresPartenariat(Partenariat $partenariat, Request $request): JsonResponse
{
$column = $request->query->get("column") ?? "";
$value = $request->query->get("value") ?? "";
$limit = $request->query->get("limit") ? intval($request->query->get("limit")) : 0;
$page = $request->query->get("page") ? intval($request->query->get("page")) : 0;
$offset = ($limit * $page) - $limit;
$autres = $this->suiviPartenariaService->getListAutrePartenariat(
$partenariat,
$column,
$value,
$limit,
$offset
);
$totalRows = $this->suiviPartenariaService->getListAutrePartenariat(
$partenariat,
$column,
$value,
null,
null
);
return new JsonResponse(
[
'title' => 'Récuperation liste formation',
'message' => 'Récuperation avec succès',
'status' => 'success',
'data' => [
'rows' => $autres,
'dataInfo' => [
'totalRows' => count($totalRows),
'limit' => $limit,
'page' => $page,
]
]
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/api/participant/autres/partenariat/{id}", name="app_suivi_partenariat_autres_participant", methods="GET")
*/
public function getListParticipantAutresPartenariat(Partenariat $partenariat, Request $request): JsonResponse
{
$column = $request->query->get("column") ?? "";
$value = $request->query->get("value") ?? "";
$limit = $request->query->get("limit") ? intval($request->query->get("limit")) : 0;
$page = $request->query->get("page") ? intval($request->query->get("page")) : 0;
$offset = ($limit * $page) - $limit;
$autreParticipant = $this->suiviPartenariaService->getListEafAutreService(
$partenariat,
$column,
$value,
$limit,
$offset
);
$totalRows = $this->suiviPartenariaService->getListEafAutreService(
$partenariat,
$column,
$value,
null,
null
);
return new JsonResponse(
[
'title' => 'Récuperation liste formation',
'message' => 'Récuperation avec succès',
'status' => 'success',
'data' => [
'rows' => $autreParticipant,
'dataInfo' => [
'totalRows' => count($totalRows),
'limit' => $limit,
'page' => $page,
]
]
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/api/resultat-obtenu/partenariat/{id}", name="app_suivi_partenariat_resultat_participant", methods="GET")
*/
public function getResultatObtenuPartenariat(Partenariat $partenariat, Request $request): JsonResponse
{
$column = $request->query->get("column") ?? "";
$value = $request->query->get("value") ?? "";
$limit = $request->query->get("limit") ? intval($request->query->get("limit")) : 0;
$page = $request->query->get("page") ? intval($request->query->get("page")) : 0;
$offset = ($limit * $page) - $limit;
$autreParticipant = $this->suiviPartenariaService->getResultatObtenuService(
$partenariat,
$column,
$value,
$limit,
$offset
);
$totalRows = $this->suiviPartenariaService->getResultatObtenuService(
$partenariat,
$column,
$value,
null,
null
);
return new JsonResponse(
[
'title' => 'Récuperation liste formation',
'message' => 'Récuperation avec succès',
'status' => 'success',
'data' => [
'rows' => $autreParticipant,
'dataInfo' => [
'totalRows' => count($totalRows),
'limit' => $limit,
'page' => $page,
]
]
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/{id}/api/pieces", name="app_suivi_partenariat_pieces_joint", methods={"GET", "POST"})
*/
public function getPiecesJointCep(Partenariat $partenariat, Request $request): JsonResponse
{
$result = [
'data' => [],
'alt' => '',
'baseUrl' => $_SERVER['API_PHOTO']
];
if (count($partenariat->getPartenariatPhotos()) > 0) {
foreach ($partenariat->getPartenariatPhotos() as $partenariatPhoto) {
if ($partenariatPhoto->getType() == intval($request->get('type'))) {
$dico = [
"type" => $partenariatPhoto->getType(),
"uuid" => $partenariatPhoto->getPhoto()->getUuid(),
"path" => $partenariatPhoto->getPhoto()->getPath(),
"filename" => $partenariatPhoto->getPhoto()->getFilename()
];
$result['data'][] = $dico;
}
}
} else {
$result['data'] = [];
$result['alt'] = $request->getSchemeAndHttpHost() . '/images/image.png';
}
if (count($result['data']) == 0) {
$result['alt'] = $request->getSchemeAndHttpHost() . '/images/image.png';
}
return new JsonResponse(
[
'title' => 'Affichage Cep Manico',
'message' => 'Affichage Cep Manico avec succès',
'status' => 'success',
'data' => $result
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/{id}/{id_statut}/{niveau}/valide", name="app_suivi_partenariat_valide", methods={"GET","POST"})
*/
public function valid(
StatutFicheRepository $statutFicheRepository,
Partenariat $partenariat,
Request $request
): Response
{
$statutFiche = $statutFicheRepository->find($request->attributes->get('id_statut'));
$niveau = $request->attributes->get('niveau');
$user = $this->getUser();
$message = " ";
$status = " ";
try {
//Mise à jour statut de la fiche s'il n'y pas d'erreur et appel au fonction valide dans ficheService
$this->ficheService->valide($partenariat, $statutFiche, $user, $niveau);
$message = "Validation de la fiche partenariat avec succès";
$status = "success";
} catch (\Throwable $th) {
$message = "Validation de la fiche partenariat avec erreur";
$status = "error";
}
return new JsonResponse(
[
'title' => 'Validation de la fiche cep',
'message' => $message,
'status' => $status,
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/{id}/{id_statut}/{niveau}/rejete", name="app_suivi_partenariat_rejete", methods={"POST"})
*/
public function rejete(
Request $request,
StatutFicheRepository $statutFicheRepository,
Partenariat $partenariat
): Response
{
$user = $this->getUser();
$statutFiche = $statutFicheRepository->find($request->attributes->get('id_statut'));
$niveau =$request->attributes->get('niveau');
$observation = $request->request->get("observation");
$validations = $partenariat->getValidation();
$recentValidateur = null;
//recuperation du validateur recent de la fiche --> niveau inferieur de l'user connecté
for ($i=count($validations); $i > 0; $i--) {
$niveauValidation = $validations[$i-1]->getNiveau();
$statutValidation = $validations[$i-1]->getStatut();
if ($niveauValidation == $niveau -1 && $statutValidation == $this->params->get("statut_valide")) {
$recentValidateur = $validations[$i-1]->getValidateur();
break;
}
}
//recuperation remplisseur initiale si la fiche est refusE au niveau cir (validation niveau 3)
if ($recentValidateur == null) {
$recentValidateur = $partenariat->getRemplisseur();
}
if (isset($recentValidateur)) {
//MAJ statut de la fiche
try {
$this->ficheService->rejete($partenariat, $statutFiche, $user, $observation, $niveau);
$message = "Refus de la fiche partinariat avec succès";
$status = "success";
} catch (TransportExceptionInterface $e) {
$message = "Refus de la fiche partenariat avec erreur";
$status = "error";
}
}else {
$message = "Validateur invalide";
$status = "error";
}
return new JsonResponse(
[
'title' => 'Refus de la fiche cep',
'message' => $message,
'status' => $status,
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/api/get_montant_total_partenariat", name="app_suivi_partenariat_get_montant_total_partenariat")
*/
public function getNbrTransformation(Request $request): JsonResponse
{
$year = (int) $request->query->get("year") ?? null;
$cirId = (int) $request->query->get("cir") ?? null;
$poles = $this->helper->getPolesCoordinationZone($cirId);
return new JsonResponse(
[
'title' => 'Récuperation partenariat data',
'message' => 'Récuperation avec succès',
'status' => 'success',
'data' => ['montant_total' => $this->suiviPartenariaService->getMontantPartenariatService($poles, $year)],
],
200,
['Content-Type' => 'application/json']
);
}
/**
* @Route("/api/get_nbr_type_contrat_partenariat", name="app_suivi_partenariat_get_nbr_type_contrat_partenariat")
*/
public function getNbrContratPartenariat(Request $request): JsonResponse
{
$year = (int) $request->query->get("year") ?? null;
$cirId = (int) $request->query->get("cir") ?? null;
$poles = $this->helper->getPolesCoordinationZone($cirId);
$typePartenariat = $this->params->get('type_partenariat_contrat');
return new JsonResponse(
[
'title' => 'Récuperation partenariat data',
'message' => 'Récuperation avec succès',
'status' => 'success',
'data' => ['total' => $this->suiviPartenariaService->getNbrPartenariatTypeContractService($poles, $year, $typePartenariat)],
],
200,
['Content-Type' => 'application/json']
);
}
}