From a363b7c2041054986e9db28d74cbdaf980426291 Mon Sep 17 00:00:00 2001 From: numew Date: Tue, 26 Nov 2024 10:32:56 +0100 Subject: [PATCH 1/4] bases routes GET API #3307 --- src/Controller/Api/SignalementController.php | 119 +++++++ src/DataFixtures/Files/User.yml | 2 +- src/Dto/Api/Response/AffectationResponse.php | 26 ++ src/Dto/Api/Response/DesordreResponse.php | 31 ++ src/Dto/Api/Response/FileResponse.php | 25 ++ .../Api/Response/GeolocalisationResponse.php | 10 + src/Dto/Api/Response/InterventionResponse.php | 31 ++ src/Dto/Api/Response/PartnerResponse.php | 21 ++ src/Dto/Api/Response/SignalementResponse.php | 316 ++++++++++++++++++ src/Dto/Api/Response/SuiviResponse.php | 25 ++ src/Entity/ApiUserToken.php | 2 +- src/Repository/SignalementRepository.php | 33 ++ 12 files changed, 639 insertions(+), 2 deletions(-) create mode 100644 src/Controller/Api/SignalementController.php create mode 100644 src/Dto/Api/Response/AffectationResponse.php create mode 100644 src/Dto/Api/Response/DesordreResponse.php create mode 100644 src/Dto/Api/Response/FileResponse.php create mode 100644 src/Dto/Api/Response/GeolocalisationResponse.php create mode 100644 src/Dto/Api/Response/InterventionResponse.php create mode 100644 src/Dto/Api/Response/PartnerResponse.php create mode 100644 src/Dto/Api/Response/SignalementResponse.php create mode 100644 src/Dto/Api/Response/SuiviResponse.php diff --git a/src/Controller/Api/SignalementController.php b/src/Controller/Api/SignalementController.php new file mode 100644 index 000000000..ffdf2eca9 --- /dev/null +++ b/src/Controller/Api/SignalementController.php @@ -0,0 +1,119 @@ + []]], + tags: ['Signalements'], + )] + #[OA\Parameter( + name: 'limit', + description: 'Nombre de signalements à retourner (défaut : 20, max : 100)', + in: 'query', + required: false, + schema: new OA\Schema(type: 'limit', example: '10') + )] + #[OA\Response( + response: Response::HTTP_OK, + description: 'Une liste de signalements', + content: new OA\JsonContent( + type: 'array', + items: new OA\Items(ref: new Model(type: SignalementResponse::class)) + ) + )] + public function getSignalementList( + SignalementRepository $signalementRepository, + SignalementDesordresProcessor $signalementDesordresProcessor, + UrlGeneratorInterface $urlGenerator, + #[MapQueryParameter] int $limit = 20, + ): JsonResponse { + if ($limit > 100) { + $limit = 100; + } + $signalements = $signalementRepository->findForAPI(user: $this->getUser(), limit: $limit); + $resources = []; + foreach ($signalements as $signalement) { + $resources[] = new SignalementResponse($signalement, $signalementDesordresProcessor, $urlGenerator); // sinon comment acceder à ses services pour generer les responses ? + } + + return new JsonResponse($resources, Response::HTTP_OK); + } + + #[Route('/signalements/{uuid}', name: 'api_signalement_uuid', methods: ['GET'])] + #[OA\Get( + path: '/api/signalements/{uuid}', + description: 'Retourne un signalement récupéré par son UUID', + summary: 'Signalement par UUID', + security: [['bearerAuth' => []]], + tags: ['Signalements'] + )] + #[OA\Response( + response: Response::HTTP_OK, + description: 'Un signalement', + content: new OA\JsonContent(ref: '#/components/schemas/SignalementResponse') + )] + public function getSignalementByUuid( + SignalementRepository $signalementRepository, + SignalementDesordresProcessor $signalementDesordresProcessor, + UrlGeneratorInterface $urlGenerator, + string $uuid, + ): JsonResponse { + $signalements = $signalementRepository->findForAPI(user : $this->getUser(), uuid : $uuid); + if (!count($signalements)) { + return new JsonResponse(['message' => 'Signalement introuvable'], Response::HTTP_NOT_FOUND); + } + $resource = new SignalementResponse($signalements[0], $signalementDesordresProcessor, $urlGenerator); + + return new JsonResponse($resource, Response::HTTP_OK); + } + + #[Route('/signalements/reference/{reference}', name: 'api_signalement_reference', methods: ['GET'])] + #[OA\Get( + path: '/api/signalements/reference/{reference}', + description: 'Retourne un signalement récupéré par sa reference', + summary: 'Signalement par référence', + security: [['bearerAuth' => []]], + tags: ['Signalements'] + )] + #[OA\Response( + response: Response::HTTP_OK, + description: 'Un signalement', + content: new OA\JsonContent(ref: '#/components/schemas/SignalementResponse') + )] + public function getSignalementByReference( + SignalementRepository $signalementRepository, + SignalementDesordresProcessor $signalementDesordresProcessor, + UrlGeneratorInterface $urlGenerator, + string $reference, + ): JsonResponse { + $signalements = $signalementRepository->findForAPI(user : $this->getUser(), reference : $reference); + if (!count($signalements)) { + return new JsonResponse(['message' => 'Signalement introuvable'], Response::HTTP_NOT_FOUND); + } + $resource = new SignalementResponse($signalements[0], $signalementDesordresProcessor, $urlGenerator); + + return new JsonResponse($resource, Response::HTTP_OK); + } +} diff --git a/src/DataFixtures/Files/User.yml b/src/DataFixtures/Files/User.yml index 3cf75dd84..8a2546cc0 100644 --- a/src/DataFixtures/Files/User.yml +++ b/src/DataFixtures/Files/User.yml @@ -2,7 +2,7 @@ users: - email: api-01@histologe.fr roles: "[\"ROLE_API_USER\"]" - partner: "Administrateurs Histologe ALL" + partner: "Partenaire 13-01" statut: 1 is_generique: 0 is_mailing_active: 0 diff --git a/src/Dto/Api/Response/AffectationResponse.php b/src/Dto/Api/Response/AffectationResponse.php new file mode 100644 index 000000000..47f6f2ec7 --- /dev/null +++ b/src/Dto/Api/Response/AffectationResponse.php @@ -0,0 +1,26 @@ +dateCreation = $affectation->getCreatedAt()->format(\DATE_ATOM); + $this->dateReponse = $affectation->getAnsweredAt()?->format(\DATE_ATOM); + $this->statut = $affectation->getStatut(); // envoyer un libellé ? + $this->partnerResponse = new PartnerResponse($affectation->getPartner()); + $this->motifCloture = $affectation->getMotifCloture()?->label(); + $this->motifRefus = $affectation->getMotifRefus()?->label(); + } +} diff --git a/src/Dto/Api/Response/DesordreResponse.php b/src/Dto/Api/Response/DesordreResponse.php new file mode 100644 index 000000000..e29e2232d --- /dev/null +++ b/src/Dto/Api/Response/DesordreResponse.php @@ -0,0 +1,31 @@ +categorie = $categorie; + $this->zone = $zone; + foreach ($data as $label => $unused) { + $details = $label; + if ($unused instanceof DesordrePrecision && $unused->getLabel()) { + $details .= ' : '.$unused->getLabel(); + } elseif ($unused instanceof Criticite && $unused->getLabel()) { + $details .= ' : '.$unused->getLabel(); + } + $this->details[] = $details; + } + } +} diff --git a/src/Dto/Api/Response/FileResponse.php b/src/Dto/Api/Response/FileResponse.php new file mode 100644 index 000000000..4aff00030 --- /dev/null +++ b/src/Dto/Api/Response/FileResponse.php @@ -0,0 +1,25 @@ +uuid = $file->getUuid(); + $this->titre = $file->getTitle(); + $this->documentType = $file->getDocumentType()->value; + $this->url = $urlGenerator->generate('show_file', ['uuid' => $file->getUuid()], UrlGeneratorInterface::ABSOLUTE_URL); + // besoin d'exposer plus d'élements ? + } +} diff --git a/src/Dto/Api/Response/GeolocalisationResponse.php b/src/Dto/Api/Response/GeolocalisationResponse.php new file mode 100644 index 000000000..2602ad939 --- /dev/null +++ b/src/Dto/Api/Response/GeolocalisationResponse.php @@ -0,0 +1,10 @@ +dateIntervention = $intervention->getScheduledAt()->format(\DATE_ATOM); + $this->type = $intervention->getType()?->label(); + $this->statut = $intervention->getStatus(); + $this->partner = $intervention->getPartner() ? new PartnerResponse($intervention->getPartner()) : null; + $this->details = $intervention->getDetails(); // traitement de suppression du html + $this->conclusions = $intervention->getConcludeProcedure() ?? []; + $this->occupantPresent = $intervention->isOccupantPresent(); + $this->proprietairePresent = $intervention->isProprietairePresent(); + // besoin d'exposer plus d'élements ? + } +} diff --git a/src/Dto/Api/Response/PartnerResponse.php b/src/Dto/Api/Response/PartnerResponse.php new file mode 100644 index 000000000..cab5963a9 --- /dev/null +++ b/src/Dto/Api/Response/PartnerResponse.php @@ -0,0 +1,21 @@ +nom = $partner->getNom(); + $this->type = $partner->getType()?->label(); + $this->competences = $partner->getCompetence() ?? []; + // besoin d'exposer plus d'élements ? + } +} diff --git a/src/Dto/Api/Response/SignalementResponse.php b/src/Dto/Api/Response/SignalementResponse.php new file mode 100644 index 000000000..2c54c527a --- /dev/null +++ b/src/Dto/Api/Response/SignalementResponse.php @@ -0,0 +1,316 @@ +uuid = $signalement->getUuid(); + $this->reference = $signalement->getReference(); + $this->dateCreation = $signalement->getCreatedAt()->format(\DATE_ATOM); + $this->statut = $signalement->getStatut(); // envoyer un libellé ? + $this->dateValidation = $signalement->getValidatedAt()?->format(\DATE_ATOM); + $this->dateCloture = $signalement->getClosedAt()?->format(\DATE_ATOM); + $this->motifCloture = $signalement->getMotifCloture()?->label(); + $this->motifRefus = $signalement->getMotifRefus()?->label(); + $this->abandonProcedureUsager = $signalement->getIsUsagerAbandonProcedure(); + // type declarant et details + $this->typeDeclarant = $signalement->getProfileDeclarant()?->label(); + $this->precisionTypeSiBailleur = $signalement->getTypeProprio()?->label(); + $this->lienDeclarantOccupantSiTiers = $signalement->getLienDeclarantOccupant(); + $this->details = $signalement->getDetails(); // renomer ? + // infos logement + $this->natureLogement = $signalement->getNatureLogement(); + $this->precisionNatureLogement = $signalement->getTypeCompositionLogement()?->getTypeLogementNatureAutrePrecision(); + $this->logementSocial = $signalement->getIsLogementSocial(); + $this->superficie = $signalement->getSuperficie(); + $this->pieceUnique = $this->stringToBool($signalement->getTypeCompositionLogement()?->getCompositionLogementPieceUnique()); + $this->nbPieces = $signalement->getTypeCompositionLogement()?->getCompositionLogementNbPieces() ?? $signalement->getNbPiecesLogement(); + $this->anneeConstruction = $signalement->getInformationComplementaire()?->getInformationsComplementairesLogementAnneeConstruction() ?? $signalement->getAnneeConstruction(); + $this->constructionAvant1949 = $signalement->getIsConstructionAvant1949(); + $this->nbNiveaux = $signalement->getInformationComplementaire()?->getInformationsComplementairesLogementNombreEtages() ?? $signalement->getNbNiveauxLogement(); + $this->rezDeChaussee = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementRdc()); + $this->dernierEtage = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementDernierEtage()); + $this->sousSolSansFenetre = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementSousSolSansFenetre()); + $this->sousCombleSansFenetre = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementSousCombleSansFenetre()); + $this->pieceAVivreSuperieureA9m = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesPieceAVivre9m()); + $this->cuisine = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesCuisine()); + $this->cuisineCollective = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesCuisineCollective()); + $this->salleDeBain = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesSalleDeBain()); + $this->salleDeBainCollective = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesSalleDeBainCollective()); + $this->wc = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesWc()); + $this->wcDansCuisine = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesWcCuisine()); + $this->wcCollectif = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesWcCollective()); + $this->hauteurSuperieureA2metres = $this->stringToBool($signalement->getTypeCompositionLogement()?->getCompositionLogementHauteur()); + $this->dpeExistant = $this->stringToBool($signalement->getTypeCompositionLogement()?->getBailDpeDpe()); + $this->geoLocalisation = new GeolocalisationResponse($signalement->getGeoloc()['lat'] ?? null, $signalement->getGeoloc()['lng'] ?? null); + // infos declarant + $this->structureDeclarant = $signalement->getStructureDeclarant(); + $this->nomDeclarant = $signalement->getNomDeclarant(); + $this->prenomDeclarant = $signalement->getPrenomDeclarant(); + $this->telephoneDeclarant = $signalement->getTelDeclarantDecoded(); + $this->telephoneSecondaireDeclarant = $signalement->getTelDeclarantSecondaireDecoded(); + $this->mailDeclarant = $signalement->getMailDeclarant(); + $this->estTravailleurSocialPourOccupant = $this->stringToBool($signalement->getSituationFoyer()?->getTravailleurSocialAccompagnementDeclarant()); + // infos occupants + $this->civiliteOccupant = $signalement->getCiviliteOccupant(); + $this->nomOccupant = $signalement->getNomOccupant(); + $this->prenomOccupant = $signalement->getPrenomOccupant(); + $this->telephoneOccupant = $signalement->getTelOccupantDecoded(); + $this->telephoneSecondaireOccupant = $signalement->getTelOccupantBisDecoded(); + $this->mailOccupant = $signalement->getMailOccupant(); + $this->adresseOccupant = $signalement->getAdresseOccupant(); + $this->codePostalOccupant = $signalement->getCpOccupant(); + $this->villeOccupant = $signalement->getVilleOccupant(); + $this->codeInseeOccupant = $signalement->getInseeOccupant(); + $this->etageOccupant = $signalement->getEtageOccupant(); + $this->escalierOccupant = $signalement->getEscalierOccupant(); + $this->numAppartOccupant = $signalement->getNumAppartOccupant(); + $this->adresseAutreOccupant = $signalement->getAdresseAutreOccupant(); + $this->dateNaissanceOccupant = $signalement->getDateNaissanceOccupant()?->format('Y-m-d') ?? $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsDateNaissance(); + $this->dateEntreeLogement = $signalement->getDateEntree()?->format('Y-m-d'); + $this->nbOccupantsLogement = $signalement->getNbOccupantsLogement(); + $this->enfantsDansLogement = $this->stringToBool($signalement->getTypeCompositionLogement()?->getCompositionLogementEnfants()); + $this->assuranceContactee = $this->stringToBool($signalement->getInformationProcedure()?->getInfoProcedureAssuranceContactee()); + $this->reponseAssurance = $signalement->getInformationProcedure()?->getInfoProcedureReponseAssurance(); + $this->souhaiteQuitterLogement = $this->stringToBool($signalement->getSituationFoyer()?->getTravailleurSocialQuitteLogement()); + $this->souhaiteQuitterLogementApresTravaux = $this->stringToBool($signalement->getInformationProcedure()?->getInfoProcedureDepartApresTravaux()); + $this->suiviParTravailleurSocial = $this->stringToBool($signalement->getSituationFoyer()?->getTravailleurSocialAccompagnement()); + $this->revenuFiscalOccupant = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsRevenuFiscal(); + // infos proprietaire + $this->nomProprietaire = $signalement->getNomProprio(); + $this->prenomProprietaire = $signalement->getPrenomProprio(); + $this->adresseProprietaire = $signalement->getAdresseProprio(); + $this->codePostalProprietaire = $signalement->getCodePostalProprio(); + $this->villeProprietaire = $signalement->getVilleProprio(); + $this->telephoneProprietaire = $signalement->getTelProprioDecoded(); + $this->telephoneSecondaireProprietaire = $signalement->getTelProprioSecondaireDecoded(); + $this->mailProprietaire = $signalement->getMailProprio(); + $this->proprietaireDateNaissance = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurDateNaissance(); + $this->proprietaireRevenuFiscal = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurRevenuFiscal() ?: null; + $this->proprietaireBeneficiaireRsa = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurBeneficiaireRsa()); + $this->proprietaireBeneficiaireFsl = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurBeneficiaireFsl()); + // infos location + $this->proprietaireAverti = $signalement->getIsProprioAverti(); + $this->loyer = $signalement->getLoyer(); + $this->bailEnCours = $signalement->getIsBailEnCours(); + $this->bailExistant = $this->stringToBool($signalement->getTypeCompositionLogement()?->getBailDpeBail()); + $this->etatDesLieuxExistant = $this->stringToBool($signalement->getTypeCompositionLogement()?->getBailDpeEtatDesLieux()); + $this->preavisDepartTransmis = $signalement->getisPreavisDepart(); + $this->demandeRelogementEffectuee = $signalement->getIsRelogement(); + $this->loyersPayes = $this->stringToBool($signalement->getInformationComplementaire()?->getinformationsComplementairesSituationOccupantsLoyersPayes()); + $this->dateEffetBail = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurDateEffetBail() ?? $this->dateEntreeLogement; + // infos allocataire + $this->allocataire = in_array($signalement->getIsAllocataire(), [null, '']) ? null : (bool) $signalement->getIsAllocataire(); // valeurs possibles : null, '', 0, 1, 'CAF', 'MSA' + $this->typeAllocataire = in_array($signalement->getIsAllocataire(), ['MSA', 'CAF']) ? $signalement->getIsAllocataire() : null; + $this->numAllocataire = $signalement->getNumAllocataire(); + $this->montantAllocation = $signalement->getSituationFoyer()?->getLogementSocialMontantAllocation() ?? $signalement->getMontantAllocation(); + $this->beneficiaireRSA = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsBeneficiaireRsa()) ?? $signalement->getIsRsa(); + $this->beneficiaireFSL = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsBeneficiaireFsl()) ?? $signalement->getIsFondSolidariteLogement(); + // désordres + $desordresInfos = $signalementDesordresProcessor->process($signalement); + if (!$signalement->getCreatedFrom()) { + foreach ($desordresInfos['criticitesArranged'] as $label => $data) { + $this->desordres[] = new DesordreResponse($label, $data); + } + } else { + foreach (DesordreCritereZone::getLabelList() as $zone => $unused) { + if (isset($desordresInfos['criticitesArranged'][$zone])) { + foreach ($desordresInfos['criticitesArranged'][$zone] as $label => $data) { + $this->desordres[] = new DesordreResponse($label, $data, $zone); + } + } + } + } + $this->score = $signalement->getScore(); + $this->scoreBatiment = $signalement->getScoreBatiment(); + $this->scoreLogement = $signalement->getScoreLogement(); + // tags, qualifications, suivis, affectations, visites, files + foreach ($signalement->getTags() as $tag) { + $this->tags[] = $tag->getLabel(); + } + foreach ($signalement->getSignalementQualifications() as $qualification) { + if (!$qualification->isPostVisite()) { + $this->qualifications[] = $qualification->getStatus()->label(); + } + } + foreach ($signalement->getSuivis() as $suivi) { + $this->suivis[] = new SuiviResponse($suivi); + } + foreach ($signalement->getAffectations() as $affectation) { + $this->affectations[] = new AffectationResponse($affectation); + } + foreach ($signalement->getInterventions() as $visite) { + $this->interventions[] = new InterventionResponse($visite); + } + foreach ($signalement->getFiles() as $file) { + $this->files[] = new FileResponse($file, $urlGenerator); + } + // divers + $this->territoire = $signalement->getTerritory()?->getName(); // retirer car ce sera toujours le même pour un utilisateur ? + $this->signalementImporte = $signalement->getIsImported(); + } + + private function stringToBool(?string $value): ?bool + { + if (in_array($value, ['oui', 'piece_unique'])) { + return true; + } + if (in_array($value, ['non', 'plusieurs_pieces'])) { + return false; + } + + return null; + } +} diff --git a/src/Dto/Api/Response/SuiviResponse.php b/src/Dto/Api/Response/SuiviResponse.php new file mode 100644 index 000000000..b5841ad65 --- /dev/null +++ b/src/Dto/Api/Response/SuiviResponse.php @@ -0,0 +1,25 @@ +id = $suivi->getId(); + $this->dateCreation = $suivi->getCreatedAt()->format(\DATE_ATOM); + $this->description = $suivi->getDescription(); // traitement de suppression du html ? comment gérer les bouton/doc qui sont présent en dur dans le contenu ? + $this->public = $suivi->getIsPublic(); + $this->type = $suivi->getType(); // envoyer un libellé ? + // exposer "createdBy" sous quelle forme ? + } +} diff --git a/src/Entity/ApiUserToken.php b/src/Entity/ApiUserToken.php index f13c91fab..943a17ce8 100644 --- a/src/Entity/ApiUserToken.php +++ b/src/Entity/ApiUserToken.php @@ -12,7 +12,7 @@ class ApiUserToken implements EntityHistoryInterface { // Constant values to update later - public const string EXPIRATION_TIME = '+2 minutes'; + public const string EXPIRATION_TIME = '+200 minutes'; public const string CLEAN_EXPIRATION_PERIOD = '-3 minutes'; #[ORM\Id] diff --git a/src/Repository/SignalementRepository.php b/src/Repository/SignalementRepository.php index 13303f816..941c63fc1 100755 --- a/src/Repository/SignalementRepository.php +++ b/src/Repository/SignalementRepository.php @@ -1388,6 +1388,39 @@ public function findSignalementsBetweenDates(\DateTimeImmutable $startDate, \Dat ->getResult(); } + public function findForAPI(User $user, int $limit = 1, ?string $uuid = null, ?string $reference = null): array + { + $territory = $user->getPartner()->getTerritory(); // TODO : impact multi territoire + $qb = $this->createQueryBuilder('s') + ->select('s', 'desordrePrecisions', 'desordreCategories', 'desordreCriteres', 'signalementQualifications', + 'files', 'tags', 'suivi', 'affectations', 'interventions', 'territory') + ->leftJoin('s.desordrePrecisions', 'desordrePrecisions') + ->leftJoin('s.desordreCategories', 'desordreCategories') + ->leftJoin('s.desordreCriteres', 'desordreCriteres') + ->leftJoin('s.signalementQualifications', 'signalementQualifications') + ->leftJoin('s.files', 'files') + ->leftJoin('s.tags', 'tags') + ->leftJoin('s.suivis', 'suivi') + ->leftJoin('s.affectations', 'affectations') + ->leftJoin('s.interventions', 'interventions') + ->leftJoin('s.territory', 'territory') + ->where('s.territory = :territory') + ->setParameter('territory', $territory) + ->orderBy('s.createdAt', 'DESC') + ->setMaxResults($limit); + if ($uuid) { + $qb->andWhere('s.uuid = :uuid') + ->setParameter('uuid', $uuid); + } + if ($reference) { + $qb->andWhere('s.reference = :reference') + ->setParameter('reference', $reference); + } + + return $qb->getQuery() + ->getResult(); + } + public function findSignalementsLastSuiviWithSuiviAuto(Territory $territory, int $limit): array { $connexion = $this->getEntityManager()->getConnection(); From 213759acc6c1100e7166044f5411161f4d4fb7ee Mon Sep 17 00:00:00 2001 From: numew Date: Thu, 5 Dec 2024 10:44:52 +0100 Subject: [PATCH 2/4] changes based on comments #3307 --- src/Controller/Api/SignalementController.php | 57 ++--- .../Desordre.php} | 12 +- src/Dto/Api/Model/File.php | 10 + .../Geolocalisation.php} | 4 +- .../Intervention.php} | 13 +- .../PartnerResponse.php => Model/Partner.php} | 9 +- .../SuiviResponse.php => Model/Suivi.php} | 10 +- src/Dto/Api/Response/AffectationResponse.php | 26 --- src/Dto/Api/Response/FileResponse.php | 25 --- src/Dto/Api/Response/SignalementResponse.php | 195 ++---------------- src/Factory/Api/FileFactory.php | 26 +++ .../Api/SignalementResponseFactory.php | 185 +++++++++++++++++ src/Repository/SignalementRepository.php | 12 +- 13 files changed, 285 insertions(+), 299 deletions(-) rename src/Dto/Api/{Response/DesordreResponse.php => Model/Desordre.php} (55%) create mode 100644 src/Dto/Api/Model/File.php rename src/Dto/Api/{Response/GeolocalisationResponse.php => Model/Geolocalisation.php} (63%) rename src/Dto/Api/{Response/InterventionResponse.php => Model/Intervention.php} (77%) rename src/Dto/Api/{Response/PartnerResponse.php => Model/Partner.php} (66%) rename src/Dto/Api/{Response/SuiviResponse.php => Model/Suivi.php} (74%) delete mode 100644 src/Dto/Api/Response/AffectationResponse.php delete mode 100644 src/Dto/Api/Response/FileResponse.php create mode 100644 src/Factory/Api/FileFactory.php create mode 100644 src/Factory/Api/SignalementResponseFactory.php diff --git a/src/Controller/Api/SignalementController.php b/src/Controller/Api/SignalementController.php index ffdf2eca9..4221b5806 100644 --- a/src/Controller/Api/SignalementController.php +++ b/src/Controller/Api/SignalementController.php @@ -3,8 +3,8 @@ namespace App\Controller\Api; use App\Dto\Api\Response\SignalementResponse; +use App\Factory\Api\SignalementResponseFactory; use App\Repository\SignalementRepository; -use App\Service\Signalement\SignalementDesordresProcessor; use Nelmio\ApiDocBundle\Annotation\Model; use OpenApi\Attributes as OA; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; @@ -13,7 +13,6 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Attribute\MapQueryParameter; use Symfony\Component\Routing\Attribute\Route; -use Symfony\Component\Routing\Generator\UrlGeneratorInterface; #[When('dev')] #[When('test')] @@ -35,6 +34,13 @@ class SignalementController extends AbstractController required: false, schema: new OA\Schema(type: 'limit', example: '10') )] + #[OA\Parameter( + name: 'page', + description: 'Numéro de la page de signalement à retourner (défaut : 1)', + in: 'query', + required: false, + schema: new OA\Schema(type: 'page', example: '2') + )] #[OA\Response( response: Response::HTTP_OK, description: 'Une liste de signalements', @@ -45,17 +51,23 @@ class SignalementController extends AbstractController )] public function getSignalementList( SignalementRepository $signalementRepository, - SignalementDesordresProcessor $signalementDesordresProcessor, - UrlGeneratorInterface $urlGenerator, + SignalementResponseFactory $signalementResponseFactory, #[MapQueryParameter] int $limit = 20, + #[MapQueryParameter] int $page = 1, ): JsonResponse { + if ($limit < 1) { + $limit = 1; + } if ($limit > 100) { $limit = 100; } - $signalements = $signalementRepository->findForAPI(user: $this->getUser(), limit: $limit); + if ($page < 1) { + $page = 1; + } + $signalements = $signalementRepository->findForAPI(user: $this->getUser(), limit: $limit, page: $page); $resources = []; foreach ($signalements as $signalement) { - $resources[] = new SignalementResponse($signalement, $signalementDesordresProcessor, $urlGenerator); // sinon comment acceder à ses services pour generer les responses ? + $resources[] = $signalementResponseFactory->createFromSignalement($signalement); } return new JsonResponse($resources, Response::HTTP_OK); @@ -76,43 +88,14 @@ public function getSignalementList( )] public function getSignalementByUuid( SignalementRepository $signalementRepository, - SignalementDesordresProcessor $signalementDesordresProcessor, - UrlGeneratorInterface $urlGenerator, + SignalementResponseFactory $signalementResponseFactory, string $uuid, ): JsonResponse { $signalements = $signalementRepository->findForAPI(user : $this->getUser(), uuid : $uuid); if (!count($signalements)) { return new JsonResponse(['message' => 'Signalement introuvable'], Response::HTTP_NOT_FOUND); } - $resource = new SignalementResponse($signalements[0], $signalementDesordresProcessor, $urlGenerator); - - return new JsonResponse($resource, Response::HTTP_OK); - } - - #[Route('/signalements/reference/{reference}', name: 'api_signalement_reference', methods: ['GET'])] - #[OA\Get( - path: '/api/signalements/reference/{reference}', - description: 'Retourne un signalement récupéré par sa reference', - summary: 'Signalement par référence', - security: [['bearerAuth' => []]], - tags: ['Signalements'] - )] - #[OA\Response( - response: Response::HTTP_OK, - description: 'Un signalement', - content: new OA\JsonContent(ref: '#/components/schemas/SignalementResponse') - )] - public function getSignalementByReference( - SignalementRepository $signalementRepository, - SignalementDesordresProcessor $signalementDesordresProcessor, - UrlGeneratorInterface $urlGenerator, - string $reference, - ): JsonResponse { - $signalements = $signalementRepository->findForAPI(user : $this->getUser(), reference : $reference); - if (!count($signalements)) { - return new JsonResponse(['message' => 'Signalement introuvable'], Response::HTTP_NOT_FOUND); - } - $resource = new SignalementResponse($signalements[0], $signalementDesordresProcessor, $urlGenerator); + $resource = $signalementResponseFactory->createFromSignalement($signalements[0]); return new JsonResponse($resource, Response::HTTP_OK); } diff --git a/src/Dto/Api/Response/DesordreResponse.php b/src/Dto/Api/Model/Desordre.php similarity index 55% rename from src/Dto/Api/Response/DesordreResponse.php rename to src/Dto/Api/Model/Desordre.php index e29e2232d..0b02bc0fb 100644 --- a/src/Dto/Api/Response/DesordreResponse.php +++ b/src/Dto/Api/Model/Desordre.php @@ -1,11 +1,11 @@ categorie = $categorie; $this->zone = $zone; - foreach ($data as $label => $unused) { + foreach ($data as $label => $detail) { $details = $label; - if ($unused instanceof DesordrePrecision && $unused->getLabel()) { - $details .= ' : '.$unused->getLabel(); - } elseif ($unused instanceof Criticite && $unused->getLabel()) { - $details .= ' : '.$unused->getLabel(); + if ($detail->getLabel() && ($detail instanceof DesordrePrecision || $detail instanceof Criticite)) { + $details .= ' : '.$detail->getLabel(); } $this->details[] = $details; } diff --git a/src/Dto/Api/Model/File.php b/src/Dto/Api/Model/File.php new file mode 100644 index 000000000..3c6d0e25e --- /dev/null +++ b/src/Dto/Api/Model/File.php @@ -0,0 +1,10 @@ +dateIntervention = $intervention->getScheduledAt()->format(\DATE_ATOM); $this->type = $intervention->getType()?->label(); $this->statut = $intervention->getStatus(); - $this->partner = $intervention->getPartner() ? new PartnerResponse($intervention->getPartner()) : null; + $this->partner = $intervention->getPartner() ? new Partner($intervention->getPartner()) : null; $this->details = $intervention->getDetails(); // traitement de suppression du html $this->conclusions = $intervention->getConcludeProcedure() ?? []; $this->occupantPresent = $intervention->isOccupantPresent(); $this->proprietairePresent = $intervention->isProprietairePresent(); - // besoin d'exposer plus d'élements ? } } diff --git a/src/Dto/Api/Response/PartnerResponse.php b/src/Dto/Api/Model/Partner.php similarity index 66% rename from src/Dto/Api/Response/PartnerResponse.php rename to src/Dto/Api/Model/Partner.php index cab5963a9..b2ff569ce 100644 --- a/src/Dto/Api/Response/PartnerResponse.php +++ b/src/Dto/Api/Model/Partner.php @@ -1,21 +1,20 @@ nom = $partner->getNom(); $this->type = $partner->getType()?->label(); $this->competences = $partner->getCompetence() ?? []; - // besoin d'exposer plus d'élements ? } } diff --git a/src/Dto/Api/Response/SuiviResponse.php b/src/Dto/Api/Model/Suivi.php similarity index 74% rename from src/Dto/Api/Response/SuiviResponse.php rename to src/Dto/Api/Model/Suivi.php index b5841ad65..7b2669687 100644 --- a/src/Dto/Api/Response/SuiviResponse.php +++ b/src/Dto/Api/Model/Suivi.php @@ -1,10 +1,10 @@ id = $suivi->getId(); $this->dateCreation = $suivi->getCreatedAt()->format(\DATE_ATOM); $this->description = $suivi->getDescription(); // traitement de suppression du html ? comment gérer les bouton/doc qui sont présent en dur dans le contenu ? $this->public = $suivi->getIsPublic(); $this->type = $suivi->getType(); // envoyer un libellé ? - // exposer "createdBy" sous quelle forme ? + // TODO : exposer "createdBy" attendre merge multi ter. et essayer de faire propre } } diff --git a/src/Dto/Api/Response/AffectationResponse.php b/src/Dto/Api/Response/AffectationResponse.php deleted file mode 100644 index 47f6f2ec7..000000000 --- a/src/Dto/Api/Response/AffectationResponse.php +++ /dev/null @@ -1,26 +0,0 @@ -dateCreation = $affectation->getCreatedAt()->format(\DATE_ATOM); - $this->dateReponse = $affectation->getAnsweredAt()?->format(\DATE_ATOM); - $this->statut = $affectation->getStatut(); // envoyer un libellé ? - $this->partnerResponse = new PartnerResponse($affectation->getPartner()); - $this->motifCloture = $affectation->getMotifCloture()?->label(); - $this->motifRefus = $affectation->getMotifRefus()?->label(); - } -} diff --git a/src/Dto/Api/Response/FileResponse.php b/src/Dto/Api/Response/FileResponse.php deleted file mode 100644 index 4aff00030..000000000 --- a/src/Dto/Api/Response/FileResponse.php +++ /dev/null @@ -1,25 +0,0 @@ -uuid = $file->getUuid(); - $this->titre = $file->getTitle(); - $this->documentType = $file->getDocumentType()->value; - $this->url = $urlGenerator->generate('show_file', ['uuid' => $file->getUuid()], UrlGeneratorInterface::ABSOLUTE_URL); - // besoin d'exposer plus d'élements ? - } -} diff --git a/src/Dto/Api/Response/SignalementResponse.php b/src/Dto/Api/Response/SignalementResponse.php index 2c54c527a..38c3482e3 100644 --- a/src/Dto/Api/Response/SignalementResponse.php +++ b/src/Dto/Api/Response/SignalementResponse.php @@ -2,11 +2,12 @@ namespace App\Dto\Api\Response; -use App\Entity\Enum\DesordreCritereZone; -use App\Entity\Signalement; -use App\Service\Signalement\SignalementDesordresProcessor; +use App\Dto\Api\Model\Desordre; +use App\Dto\Api\Model\File; +use App\Dto\Api\Model\Geolocalisation; +use App\Dto\Api\Model\Intervention; +use App\Dto\Api\Model\Suivi; use OpenApi\Attributes as OA; -use Symfony\Component\Routing\Generator\UrlGeneratorInterface; class SignalementResponse { @@ -49,7 +50,8 @@ class SignalementResponse public ?bool $wcCollectif; public ?bool $hauteurSuperieureA2metres; public ?bool $dpeExistant; - public GeolocalisationResponse $geoLocalisation; + public ?string $dpeClasseEnergetique; + public Geolocalisation $geoLocalisation; // infos declarant public ?string $structureDeclarant; public ?string $nomDeclarant; @@ -68,10 +70,11 @@ class SignalementResponse public ?string $adresseOccupant; public ?string $codePostalOccupant; public ?string $villeOccupant; - public ?string $codeInseeOccupant; public ?string $etageOccupant; public ?string $escalierOccupant; public ?string $numAppartOccupant; + public ?string $codeInseeOccupant; + public ?string $cleBanAdresseOccupant; public ?string $adresseAutreOccupant; public ?string $dateNaissanceOccupant; public ?string $dateEntreeLogement; @@ -117,7 +120,7 @@ class SignalementResponse // désordres #[OA\Property( type: 'array', - items: new OA\Items(ref: DesordreResponse::class) + items: new OA\Items(ref: Desordre::class) )] public array $desordres = []; public ?float $score; @@ -128,189 +131,21 @@ class SignalementResponse public array $qualifications = []; #[OA\Property( type: 'array', - items: new OA\Items(ref: SuiviResponse::class) + items: new OA\Items(ref: Suivi::class) )] public array $suivis = []; #[OA\Property( type: 'array', - items: new OA\Items(ref: AffectationResponse::class) - )] - public array $affectations = []; - #[OA\Property( - type: 'array', - items: new OA\Items(ref: InterventionResponse::class) + items: new OA\Items(ref: Intervention::class) )] public array $interventions = []; #[OA\Property( type: 'array', - items: new OA\Items(ref: FileResponse::class) + items: new OA\Items(ref: File::class) )] public array $files = []; // divers - public ?string $territoire; + public ?string $territoireNom; + public ?string $territoireCode; public bool $signalementImporte; - - public function __construct( - Signalement $signalement, - SignalementDesordresProcessor $signalementDesordresProcessor, - UrlGeneratorInterface $urlGenerator, - ) { - // references, dates et statut - $this->uuid = $signalement->getUuid(); - $this->reference = $signalement->getReference(); - $this->dateCreation = $signalement->getCreatedAt()->format(\DATE_ATOM); - $this->statut = $signalement->getStatut(); // envoyer un libellé ? - $this->dateValidation = $signalement->getValidatedAt()?->format(\DATE_ATOM); - $this->dateCloture = $signalement->getClosedAt()?->format(\DATE_ATOM); - $this->motifCloture = $signalement->getMotifCloture()?->label(); - $this->motifRefus = $signalement->getMotifRefus()?->label(); - $this->abandonProcedureUsager = $signalement->getIsUsagerAbandonProcedure(); - // type declarant et details - $this->typeDeclarant = $signalement->getProfileDeclarant()?->label(); - $this->precisionTypeSiBailleur = $signalement->getTypeProprio()?->label(); - $this->lienDeclarantOccupantSiTiers = $signalement->getLienDeclarantOccupant(); - $this->details = $signalement->getDetails(); // renomer ? - // infos logement - $this->natureLogement = $signalement->getNatureLogement(); - $this->precisionNatureLogement = $signalement->getTypeCompositionLogement()?->getTypeLogementNatureAutrePrecision(); - $this->logementSocial = $signalement->getIsLogementSocial(); - $this->superficie = $signalement->getSuperficie(); - $this->pieceUnique = $this->stringToBool($signalement->getTypeCompositionLogement()?->getCompositionLogementPieceUnique()); - $this->nbPieces = $signalement->getTypeCompositionLogement()?->getCompositionLogementNbPieces() ?? $signalement->getNbPiecesLogement(); - $this->anneeConstruction = $signalement->getInformationComplementaire()?->getInformationsComplementairesLogementAnneeConstruction() ?? $signalement->getAnneeConstruction(); - $this->constructionAvant1949 = $signalement->getIsConstructionAvant1949(); - $this->nbNiveaux = $signalement->getInformationComplementaire()?->getInformationsComplementairesLogementNombreEtages() ?? $signalement->getNbNiveauxLogement(); - $this->rezDeChaussee = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementRdc()); - $this->dernierEtage = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementDernierEtage()); - $this->sousSolSansFenetre = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementSousSolSansFenetre()); - $this->sousCombleSansFenetre = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementSousCombleSansFenetre()); - $this->pieceAVivreSuperieureA9m = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesPieceAVivre9m()); - $this->cuisine = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesCuisine()); - $this->cuisineCollective = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesCuisineCollective()); - $this->salleDeBain = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesSalleDeBain()); - $this->salleDeBainCollective = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesSalleDeBainCollective()); - $this->wc = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesWc()); - $this->wcDansCuisine = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesWcCuisine()); - $this->wcCollectif = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesWcCollective()); - $this->hauteurSuperieureA2metres = $this->stringToBool($signalement->getTypeCompositionLogement()?->getCompositionLogementHauteur()); - $this->dpeExistant = $this->stringToBool($signalement->getTypeCompositionLogement()?->getBailDpeDpe()); - $this->geoLocalisation = new GeolocalisationResponse($signalement->getGeoloc()['lat'] ?? null, $signalement->getGeoloc()['lng'] ?? null); - // infos declarant - $this->structureDeclarant = $signalement->getStructureDeclarant(); - $this->nomDeclarant = $signalement->getNomDeclarant(); - $this->prenomDeclarant = $signalement->getPrenomDeclarant(); - $this->telephoneDeclarant = $signalement->getTelDeclarantDecoded(); - $this->telephoneSecondaireDeclarant = $signalement->getTelDeclarantSecondaireDecoded(); - $this->mailDeclarant = $signalement->getMailDeclarant(); - $this->estTravailleurSocialPourOccupant = $this->stringToBool($signalement->getSituationFoyer()?->getTravailleurSocialAccompagnementDeclarant()); - // infos occupants - $this->civiliteOccupant = $signalement->getCiviliteOccupant(); - $this->nomOccupant = $signalement->getNomOccupant(); - $this->prenomOccupant = $signalement->getPrenomOccupant(); - $this->telephoneOccupant = $signalement->getTelOccupantDecoded(); - $this->telephoneSecondaireOccupant = $signalement->getTelOccupantBisDecoded(); - $this->mailOccupant = $signalement->getMailOccupant(); - $this->adresseOccupant = $signalement->getAdresseOccupant(); - $this->codePostalOccupant = $signalement->getCpOccupant(); - $this->villeOccupant = $signalement->getVilleOccupant(); - $this->codeInseeOccupant = $signalement->getInseeOccupant(); - $this->etageOccupant = $signalement->getEtageOccupant(); - $this->escalierOccupant = $signalement->getEscalierOccupant(); - $this->numAppartOccupant = $signalement->getNumAppartOccupant(); - $this->adresseAutreOccupant = $signalement->getAdresseAutreOccupant(); - $this->dateNaissanceOccupant = $signalement->getDateNaissanceOccupant()?->format('Y-m-d') ?? $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsDateNaissance(); - $this->dateEntreeLogement = $signalement->getDateEntree()?->format('Y-m-d'); - $this->nbOccupantsLogement = $signalement->getNbOccupantsLogement(); - $this->enfantsDansLogement = $this->stringToBool($signalement->getTypeCompositionLogement()?->getCompositionLogementEnfants()); - $this->assuranceContactee = $this->stringToBool($signalement->getInformationProcedure()?->getInfoProcedureAssuranceContactee()); - $this->reponseAssurance = $signalement->getInformationProcedure()?->getInfoProcedureReponseAssurance(); - $this->souhaiteQuitterLogement = $this->stringToBool($signalement->getSituationFoyer()?->getTravailleurSocialQuitteLogement()); - $this->souhaiteQuitterLogementApresTravaux = $this->stringToBool($signalement->getInformationProcedure()?->getInfoProcedureDepartApresTravaux()); - $this->suiviParTravailleurSocial = $this->stringToBool($signalement->getSituationFoyer()?->getTravailleurSocialAccompagnement()); - $this->revenuFiscalOccupant = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsRevenuFiscal(); - // infos proprietaire - $this->nomProprietaire = $signalement->getNomProprio(); - $this->prenomProprietaire = $signalement->getPrenomProprio(); - $this->adresseProprietaire = $signalement->getAdresseProprio(); - $this->codePostalProprietaire = $signalement->getCodePostalProprio(); - $this->villeProprietaire = $signalement->getVilleProprio(); - $this->telephoneProprietaire = $signalement->getTelProprioDecoded(); - $this->telephoneSecondaireProprietaire = $signalement->getTelProprioSecondaireDecoded(); - $this->mailProprietaire = $signalement->getMailProprio(); - $this->proprietaireDateNaissance = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurDateNaissance(); - $this->proprietaireRevenuFiscal = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurRevenuFiscal() ?: null; - $this->proprietaireBeneficiaireRsa = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurBeneficiaireRsa()); - $this->proprietaireBeneficiaireFsl = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurBeneficiaireFsl()); - // infos location - $this->proprietaireAverti = $signalement->getIsProprioAverti(); - $this->loyer = $signalement->getLoyer(); - $this->bailEnCours = $signalement->getIsBailEnCours(); - $this->bailExistant = $this->stringToBool($signalement->getTypeCompositionLogement()?->getBailDpeBail()); - $this->etatDesLieuxExistant = $this->stringToBool($signalement->getTypeCompositionLogement()?->getBailDpeEtatDesLieux()); - $this->preavisDepartTransmis = $signalement->getisPreavisDepart(); - $this->demandeRelogementEffectuee = $signalement->getIsRelogement(); - $this->loyersPayes = $this->stringToBool($signalement->getInformationComplementaire()?->getinformationsComplementairesSituationOccupantsLoyersPayes()); - $this->dateEffetBail = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurDateEffetBail() ?? $this->dateEntreeLogement; - // infos allocataire - $this->allocataire = in_array($signalement->getIsAllocataire(), [null, '']) ? null : (bool) $signalement->getIsAllocataire(); // valeurs possibles : null, '', 0, 1, 'CAF', 'MSA' - $this->typeAllocataire = in_array($signalement->getIsAllocataire(), ['MSA', 'CAF']) ? $signalement->getIsAllocataire() : null; - $this->numAllocataire = $signalement->getNumAllocataire(); - $this->montantAllocation = $signalement->getSituationFoyer()?->getLogementSocialMontantAllocation() ?? $signalement->getMontantAllocation(); - $this->beneficiaireRSA = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsBeneficiaireRsa()) ?? $signalement->getIsRsa(); - $this->beneficiaireFSL = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsBeneficiaireFsl()) ?? $signalement->getIsFondSolidariteLogement(); - // désordres - $desordresInfos = $signalementDesordresProcessor->process($signalement); - if (!$signalement->getCreatedFrom()) { - foreach ($desordresInfos['criticitesArranged'] as $label => $data) { - $this->desordres[] = new DesordreResponse($label, $data); - } - } else { - foreach (DesordreCritereZone::getLabelList() as $zone => $unused) { - if (isset($desordresInfos['criticitesArranged'][$zone])) { - foreach ($desordresInfos['criticitesArranged'][$zone] as $label => $data) { - $this->desordres[] = new DesordreResponse($label, $data, $zone); - } - } - } - } - $this->score = $signalement->getScore(); - $this->scoreBatiment = $signalement->getScoreBatiment(); - $this->scoreLogement = $signalement->getScoreLogement(); - // tags, qualifications, suivis, affectations, visites, files - foreach ($signalement->getTags() as $tag) { - $this->tags[] = $tag->getLabel(); - } - foreach ($signalement->getSignalementQualifications() as $qualification) { - if (!$qualification->isPostVisite()) { - $this->qualifications[] = $qualification->getStatus()->label(); - } - } - foreach ($signalement->getSuivis() as $suivi) { - $this->suivis[] = new SuiviResponse($suivi); - } - foreach ($signalement->getAffectations() as $affectation) { - $this->affectations[] = new AffectationResponse($affectation); - } - foreach ($signalement->getInterventions() as $visite) { - $this->interventions[] = new InterventionResponse($visite); - } - foreach ($signalement->getFiles() as $file) { - $this->files[] = new FileResponse($file, $urlGenerator); - } - // divers - $this->territoire = $signalement->getTerritory()?->getName(); // retirer car ce sera toujours le même pour un utilisateur ? - $this->signalementImporte = $signalement->getIsImported(); - } - - private function stringToBool(?string $value): ?bool - { - if (in_array($value, ['oui', 'piece_unique'])) { - return true; - } - if (in_array($value, ['non', 'plusieurs_pieces'])) { - return false; - } - - return null; - } } diff --git a/src/Factory/Api/FileFactory.php b/src/Factory/Api/FileFactory.php new file mode 100644 index 000000000..ea56aa30a --- /dev/null +++ b/src/Factory/Api/FileFactory.php @@ -0,0 +1,26 @@ +titre = $fileEntity->getTitle(); + $file->documentType = $fileEntity->getDocumentType()->value; + $file->url = $this->urlGenerator->generate('show_file', ['uuid' => $fileEntity->getUuid()], UrlGeneratorInterface::ABSOLUTE_URL); + + return $file; + } +} diff --git a/src/Factory/Api/SignalementResponseFactory.php b/src/Factory/Api/SignalementResponseFactory.php new file mode 100644 index 000000000..76b8a978b --- /dev/null +++ b/src/Factory/Api/SignalementResponseFactory.php @@ -0,0 +1,185 @@ +uuid = $signalement->getUuid(); + $signalementResponse->reference = $signalement->getReference(); + $signalementResponse->dateCreation = $signalement->getCreatedAt()->format(\DATE_ATOM); + $signalementResponse->statut = $signalement->getStatut(); // envoyer un libellé ? + $signalementResponse->dateValidation = $signalement->getValidatedAt()?->format(\DATE_ATOM); + $signalementResponse->dateCloture = $signalement->getClosedAt()?->format(\DATE_ATOM); + $signalementResponse->motifCloture = $signalement->getMotifCloture()?->value; + $signalementResponse->motifRefus = $signalement->getMotifRefus()?->value; + $signalementResponse->abandonProcedureUsager = $signalement->getIsUsagerAbandonProcedure(); + // type declarant et details + $signalementResponse->typeDeclarant = $signalement->getProfileDeclarant()?->value; + $signalementResponse->precisionTypeSiBailleur = $signalement->getTypeProprio()?->value; + $signalementResponse->lienDeclarantOccupantSiTiers = $signalement->getLienDeclarantOccupant(); + $signalementResponse->details = $signalement->getDetails(); // renomer ? + // infos logement + $signalementResponse->natureLogement = $signalement->getNatureLogement(); + $signalementResponse->precisionNatureLogement = $signalement->getTypeCompositionLogement()?->getTypeLogementNatureAutrePrecision(); + $signalementResponse->logementSocial = $signalement->getIsLogementSocial(); + $signalementResponse->superficie = $signalement->getSuperficie(); + $signalementResponse->pieceUnique = $this->stringToBool($signalement->getTypeCompositionLogement()?->getCompositionLogementPieceUnique()); + $signalementResponse->nbPieces = $signalement->getTypeCompositionLogement()?->getCompositionLogementNbPieces() ?? $signalement->getNbPiecesLogement(); + $signalementResponse->anneeConstruction = $signalement->getInformationComplementaire()?->getInformationsComplementairesLogementAnneeConstruction() ?? $signalement->getAnneeConstruction(); + $signalementResponse->constructionAvant1949 = $signalement->getIsConstructionAvant1949(); + $signalementResponse->nbNiveaux = $signalement->getInformationComplementaire()?->getInformationsComplementairesLogementNombreEtages() ?? $signalement->getNbNiveauxLogement(); + $signalementResponse->rezDeChaussee = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementRdc()); + $signalementResponse->dernierEtage = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementDernierEtage()); + $signalementResponse->sousSolSansFenetre = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementSousSolSansFenetre()); + $signalementResponse->sousCombleSansFenetre = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementSousCombleSansFenetre()); + $signalementResponse->pieceAVivreSuperieureA9m = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesPieceAVivre9m()); + $signalementResponse->cuisine = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesCuisine()); + $signalementResponse->cuisineCollective = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesCuisineCollective()); + $signalementResponse->salleDeBain = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesSalleDeBain()); + $signalementResponse->salleDeBainCollective = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesSalleDeBainCollective()); + $signalementResponse->wc = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesWc()); + $signalementResponse->wcDansCuisine = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesWcCuisine()); + $signalementResponse->wcCollectif = $this->stringToBool($signalement->getTypeCompositionLogement()?->getTypeLogementCommoditesWcCollective()); + $signalementResponse->hauteurSuperieureA2metres = $this->stringToBool($signalement->getTypeCompositionLogement()?->getCompositionLogementHauteur()); + $signalementResponse->dpeExistant = $this->stringToBool($signalement->getTypeCompositionLogement()?->getBailDpeDpe()); + $signalementResponse->dpeClasseEnergetique = $signalement->getTypeCompositionLogement()?->getBailDpeClasseEnergetique(); + $signalementResponse->geoLocalisation = new Geolocalisation($signalement->getGeoloc()['lat'] ?? null, $signalement->getGeoloc()['lng'] ?? null); + // infos declarant + $signalementResponse->structureDeclarant = $signalement->getStructureDeclarant(); + $signalementResponse->nomDeclarant = $signalement->getNomDeclarant(); + $signalementResponse->prenomDeclarant = $signalement->getPrenomDeclarant(); + $signalementResponse->telephoneDeclarant = $signalement->getTelDeclarantDecoded(); + $signalementResponse->telephoneSecondaireDeclarant = $signalement->getTelDeclarantSecondaireDecoded(); + $signalementResponse->mailDeclarant = $signalement->getMailDeclarant(); + $signalementResponse->estTravailleurSocialPourOccupant = $this->stringToBool($signalement->getSituationFoyer()?->getTravailleurSocialAccompagnementDeclarant()); + // infos occupants + $signalementResponse->civiliteOccupant = $signalement->getCiviliteOccupant(); + $signalementResponse->nomOccupant = $signalement->getNomOccupant(); + $signalementResponse->prenomOccupant = $signalement->getPrenomOccupant(); + $signalementResponse->telephoneOccupant = $signalement->getTelOccupantDecoded(); + $signalementResponse->telephoneSecondaireOccupant = $signalement->getTelOccupantBisDecoded(); + $signalementResponse->mailOccupant = $signalement->getMailOccupant(); + $signalementResponse->adresseOccupant = $signalement->getAdresseOccupant(); + $signalementResponse->codePostalOccupant = $signalement->getCpOccupant(); + $signalementResponse->villeOccupant = $signalement->getVilleOccupant(); + $signalementResponse->etageOccupant = $signalement->getEtageOccupant(); + $signalementResponse->escalierOccupant = $signalement->getEscalierOccupant(); + $signalementResponse->numAppartOccupant = $signalement->getNumAppartOccupant(); + $signalementResponse->adresseAutreOccupant = $signalement->getAdresseAutreOccupant(); + $signalementResponse->codeInseeOccupant = $signalement->getInseeOccupant(); + $signalementResponse->cleBanAdresseOccupant = $signalement->getBanIdOccupant(); + $signalementResponse->dateNaissanceOccupant = $signalement->getDateNaissanceOccupant()?->format('Y-m-d') ?? $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsDateNaissance(); + $signalementResponse->dateEntreeLogement = $signalement->getDateEntree()?->format('Y-m-d'); + $signalementResponse->nbOccupantsLogement = $signalement->getNbOccupantsLogement(); + $signalementResponse->enfantsDansLogement = $this->stringToBool($signalement->getTypeCompositionLogement()?->getCompositionLogementEnfants()); + $signalementResponse->assuranceContactee = $this->stringToBool($signalement->getInformationProcedure()?->getInfoProcedureAssuranceContactee()); + $signalementResponse->reponseAssurance = $signalement->getInformationProcedure()?->getInfoProcedureReponseAssurance(); + $signalementResponse->souhaiteQuitterLogement = $this->stringToBool($signalement->getSituationFoyer()?->getTravailleurSocialQuitteLogement()); + $signalementResponse->souhaiteQuitterLogementApresTravaux = $this->stringToBool($signalement->getInformationProcedure()?->getInfoProcedureDepartApresTravaux()); + $signalementResponse->suiviParTravailleurSocial = $this->stringToBool($signalement->getSituationFoyer()?->getTravailleurSocialAccompagnement()); + $signalementResponse->revenuFiscalOccupant = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsRevenuFiscal(); + // infos proprietaire + $signalementResponse->nomProprietaire = $signalement->getNomProprio(); + $signalementResponse->prenomProprietaire = $signalement->getPrenomProprio(); + $signalementResponse->adresseProprietaire = $signalement->getAdresseProprio(); + $signalementResponse->codePostalProprietaire = $signalement->getCodePostalProprio(); + $signalementResponse->villeProprietaire = $signalement->getVilleProprio(); + $signalementResponse->telephoneProprietaire = $signalement->getTelProprioDecoded(); + $signalementResponse->telephoneSecondaireProprietaire = $signalement->getTelProprioSecondaireDecoded(); + $signalementResponse->mailProprietaire = $signalement->getMailProprio(); + $signalementResponse->proprietaireDateNaissance = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurDateNaissance(); + $signalementResponse->proprietaireRevenuFiscal = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurRevenuFiscal() ?: null; + $signalementResponse->proprietaireBeneficiaireRsa = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurBeneficiaireRsa()); + $signalementResponse->proprietaireBeneficiaireFsl = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurBeneficiaireFsl()); + // infos location + $signalementResponse->proprietaireAverti = $signalement->getIsProprioAverti(); + $signalementResponse->loyer = $signalement->getLoyer(); + $signalementResponse->bailEnCours = $signalement->getIsBailEnCours(); + $signalementResponse->bailExistant = $this->stringToBool($signalement->getTypeCompositionLogement()?->getBailDpeBail()); + $signalementResponse->etatDesLieuxExistant = $this->stringToBool($signalement->getTypeCompositionLogement()?->getBailDpeEtatDesLieux()); + $signalementResponse->preavisDepartTransmis = $signalement->getisPreavisDepart(); + $signalementResponse->demandeRelogementEffectuee = $signalement->getIsRelogement(); + $signalementResponse->loyersPayes = $this->stringToBool($signalement->getInformationComplementaire()?->getinformationsComplementairesSituationOccupantsLoyersPayes()); + $signalementResponse->dateEffetBail = $signalement->getInformationComplementaire()?->getInformationsComplementairesSituationBailleurDateEffetBail() ?? $signalementResponse->dateEntreeLogement; + // infos allocataire + $signalementResponse->allocataire = in_array($signalement->getIsAllocataire(), [null, '']) ? null : (bool) $signalement->getIsAllocataire(); // valeurs possibles : null, '', 0, 1, 'CAF', 'MSA' + $signalementResponse->typeAllocataire = in_array($signalement->getIsAllocataire(), ['MSA', 'CAF']) ? $signalement->getIsAllocataire() : null; + $signalementResponse->numAllocataire = $signalement->getNumAllocataire(); + $signalementResponse->montantAllocation = $signalement->getSituationFoyer()?->getLogementSocialMontantAllocation() ?? $signalement->getMontantAllocation(); + $signalementResponse->beneficiaireRSA = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsBeneficiaireRsa()) ?? $signalement->getIsRsa(); + $signalementResponse->beneficiaireFSL = $this->stringToBool($signalement->getInformationComplementaire()?->getInformationsComplementairesSituationOccupantsBeneficiaireFsl()) ?? $signalement->getIsFondSolidariteLogement(); + // désordres + $desordresInfos = $this->signalementDesordresProcessor->process($signalement); + if (!$signalement->getCreatedFrom()) { + foreach ($desordresInfos['criticitesArranged'] as $label => $data) { + $signalementResponse->desordres[] = new Desordre($label, $data); + } + } else { + foreach (DesordreCritereZone::getLabelList() as $zone => $unused) { + if (isset($desordresInfos['criticitesArranged'][$zone])) { + foreach ($desordresInfos['criticitesArranged'][$zone] as $label => $data) { + $signalementResponse->desordres[] = new Desordre($label, $data, $zone); + } + } + } + } + $signalementResponse->score = $signalement->getScore(); + $signalementResponse->scoreBatiment = $signalement->getScoreBatiment(); + $signalementResponse->scoreLogement = $signalement->getScoreLogement(); + // tags, qualifications, suivis, affectations, visites, files + foreach ($signalement->getTags() as $tag) { + $signalementResponse->tags[] = $tag->getLabel(); + } + foreach ($signalement->getSignalementQualifications() as $qualification) { + if (!$qualification->isPostVisite()) { + $signalementResponse->qualifications[] = $qualification->getStatus()?->value; + } + } + foreach ($signalement->getSuivis() as $suivi) { + $signalementResponse->suivis[] = new Suivi($suivi); + } + foreach ($signalement->getInterventions() as $intervention) { + $signalementResponse->interventions[] = new Intervention($intervention); + } + foreach ($signalement->getFiles() as $file) { + $signalementResponse->files[] = $this->fileFactory->createFromSignalement($file); + } + // divers + $signalementResponse->territoireNom = $signalement->getTerritory()?->getName(); + $signalementResponse->territoireCode = $signalement->getTerritory()?->getZip(); + $signalementResponse->signalementImporte = $signalement->getIsImported(); + + return $signalementResponse; + } + + private function stringToBool(?string $value): ?bool + { + if (in_array($value, ['oui', 'piece_unique'])) { + return true; + } + if (in_array($value, ['non', 'plusieurs_pieces'])) { + return false; + } + + return null; + } +} diff --git a/src/Repository/SignalementRepository.php b/src/Repository/SignalementRepository.php index 941c63fc1..0b72d82e8 100755 --- a/src/Repository/SignalementRepository.php +++ b/src/Repository/SignalementRepository.php @@ -1388,12 +1388,13 @@ public function findSignalementsBetweenDates(\DateTimeImmutable $startDate, \Dat ->getResult(); } - public function findForAPI(User $user, int $limit = 1, ?string $uuid = null, ?string $reference = null): array + public function findForAPI(User $user, int $limit = 1, int $page = 1, ?string $uuid = null, ?string $reference = null): array { - $territory = $user->getPartner()->getTerritory(); // TODO : impact multi territoire + $partner = $user->getPartner(); // TODO : impact multi territoire + $offset = ($page - 1) * $limit; $qb = $this->createQueryBuilder('s') ->select('s', 'desordrePrecisions', 'desordreCategories', 'desordreCriteres', 'signalementQualifications', - 'files', 'tags', 'suivi', 'affectations', 'interventions', 'territory') + 'files', 'tags', 'suivi', 'interventions', 'territory') ->leftJoin('s.desordrePrecisions', 'desordrePrecisions') ->leftJoin('s.desordreCategories', 'desordreCategories') ->leftJoin('s.desordreCriteres', 'desordreCriteres') @@ -1404,9 +1405,10 @@ public function findForAPI(User $user, int $limit = 1, ?string $uuid = null, ?st ->leftJoin('s.affectations', 'affectations') ->leftJoin('s.interventions', 'interventions') ->leftJoin('s.territory', 'territory') - ->where('s.territory = :territory') - ->setParameter('territory', $territory) + ->where('affectations.partner = :partner') + ->setParameter('partner', $partner) ->orderBy('s.createdAt', 'DESC') + ->setFirstResult($offset) ->setMaxResults($limit); if ($uuid) { $qb->andWhere('s.uuid = :uuid') From 164cc6bd60802b453d44d9f4436bfcfaffd0a368 Mon Sep 17 00:00:00 2001 From: numew Date: Mon, 9 Dec 2024 17:04:52 +0100 Subject: [PATCH 3/4] impact multi ter #3307 --- src/Repository/SignalementRepository.php | 6 +++--- .../Controller/Back/BackUserControllerTest.php | 12 ++++++------ .../Service/Signalement/VisiteNotifierTest.php | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Repository/SignalementRepository.php b/src/Repository/SignalementRepository.php index 0b72d82e8..6bcabd963 100755 --- a/src/Repository/SignalementRepository.php +++ b/src/Repository/SignalementRepository.php @@ -1390,7 +1390,7 @@ public function findSignalementsBetweenDates(\DateTimeImmutable $startDate, \Dat public function findForAPI(User $user, int $limit = 1, int $page = 1, ?string $uuid = null, ?string $reference = null): array { - $partner = $user->getPartner(); // TODO : impact multi territoire + $partners = $user->getPartners(); $offset = ($page - 1) * $limit; $qb = $this->createQueryBuilder('s') ->select('s', 'desordrePrecisions', 'desordreCategories', 'desordreCriteres', 'signalementQualifications', @@ -1405,8 +1405,8 @@ public function findForAPI(User $user, int $limit = 1, int $page = 1, ?string $u ->leftJoin('s.affectations', 'affectations') ->leftJoin('s.interventions', 'interventions') ->leftJoin('s.territory', 'territory') - ->where('affectations.partner = :partner') - ->setParameter('partner', $partner) + ->where('affectations.partner IN (:partners)') + ->setParameter('partners', $partners) ->orderBy('s.createdAt', 'DESC') ->setFirstResult($offset) ->setMaxResults($limit); diff --git a/tests/Functional/Controller/Back/BackUserControllerTest.php b/tests/Functional/Controller/Back/BackUserControllerTest.php index 73e32cb8d..231d96614 100644 --- a/tests/Functional/Controller/Back/BackUserControllerTest.php +++ b/tests/Functional/Controller/Back/BackUserControllerTest.php @@ -36,12 +36,12 @@ public function provideParamsUserList(): iterable { yield 'Search without params' => [[], 57]; yield 'Search with queryUser admin' => [['queryUser' => 'admin'], 21]; - yield 'Search with territory 13' => [['territory' => 13], 10]; + yield 'Search with territory 13' => [['territory' => 13], 11]; yield 'Search with territory 13 and partner 6 and 7' => [['territory' => 13, 'partners' => [6, 7]], 2]; yield 'Search with status 0' => [['statut' => 0], 8]; yield 'Search with role ROLE_ADMIN' => [['role' => 'ROLE_ADMIN'], 3]; yield 'Search with role ROLE_ADMIN and territory 13' => [['role' => 'ROLE_ADMIN', 'territory' => 13], 0]; - yield 'Search with territory 13 and partnerType Autre' => [['territory' => 13, 'partnerType' => 'AUTRE'], 8]; + yield 'Search with territory 13 and partnerType Autre' => [['territory' => 13, 'partnerType' => 'AUTRE'], 9]; yield 'Search with territory 13 and partnerType Ars' => [['territory' => 13, 'partnerType' => 'ARS'], 1]; } @@ -67,13 +67,13 @@ public function testUserExport(array $params, int $nb): void public function provideParamsUserExport(): iterable { - yield 'Search without params' => [[], 10]; + yield 'Search without params' => [[], 11]; yield 'Search with queryUser user' => [['queryUser' => 'user'], 6]; - yield 'Search with partner 6 and 7' => [['partners' => [2]], 4]; - yield 'Search with status 1' => [['statut' => 1], 8]; + yield 'Search with partner 6 and 7' => [['partners' => [2]], 5]; + yield 'Search with status 1' => [['statut' => 1], 9]; yield 'Search with role ROLE_USER_PARTNER' => [['role' => 'ROLE_USER_PARTNER'], 6]; yield 'Search with role ROLE_USER_PARTNER and status 1' => [['role' => 'ROLE_USER_PARTNER', 'statut' => 1], 4]; - yield 'Search with territory 13 and partnerType Autre' => [['territory' => 13, 'partnerType' => 'AUTRE'], 10]; + yield 'Search with territory 13 and partnerType Autre' => [['territory' => 13, 'partnerType' => 'AUTRE'], 11]; yield 'Search with partnerType Ars' => [['partnerType' => 'ARS'], 1]; } } diff --git a/tests/Functional/Service/Signalement/VisiteNotifierTest.php b/tests/Functional/Service/Signalement/VisiteNotifierTest.php index 0d5e919ec..785ff9d71 100644 --- a/tests/Functional/Service/Signalement/VisiteNotifierTest.php +++ b/tests/Functional/Service/Signalement/VisiteNotifierTest.php @@ -44,7 +44,7 @@ public function testNotifyVisiteToConclude() $intervention = $signalement->getInterventions()[0]; $nbNotified = $this->visiteNotifier->notifyVisiteToConclude($intervention); - $this->assertEquals($nbNotified, 4); + $this->assertEquals($nbNotified, 5); } public function testNotifyVisiteToConclude69() From 542325a389506a7b9b0a8dd601638cb23af3a85a Mon Sep 17 00:00:00 2001 From: numew Date: Tue, 10 Dec 2024 15:11:40 +0100 Subject: [PATCH 4/4] add createBy in suivi #3307 --- src/Dto/Api/Model/Suivi.php | 5 +++-- src/Entity/Suivi.php | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/Dto/Api/Model/Suivi.php b/src/Dto/Api/Model/Suivi.php index 7b2669687..01b6cb209 100644 --- a/src/Dto/Api/Model/Suivi.php +++ b/src/Dto/Api/Model/Suivi.php @@ -11,6 +11,7 @@ class Suivi public string $description; public bool $public; public int $type; + public string $createdBy; public function __construct( SuiviEntity $suivi, @@ -19,7 +20,7 @@ public function __construct( $this->dateCreation = $suivi->getCreatedAt()->format(\DATE_ATOM); $this->description = $suivi->getDescription(); // traitement de suppression du html ? comment gérer les bouton/doc qui sont présent en dur dans le contenu ? $this->public = $suivi->getIsPublic(); - $this->type = $suivi->getType(); // envoyer un libellé ? - // TODO : exposer "createdBy" attendre merge multi ter. et essayer de faire propre + $this->type = $suivi->getType(); + $this->createdBy = $suivi->getCreatedByLabel(); } } diff --git a/src/Entity/Suivi.php b/src/Entity/Suivi.php index 2315cdce0..91fb10977 100644 --- a/src/Entity/Suivi.php +++ b/src/Entity/Suivi.php @@ -108,6 +108,40 @@ public function setCreatedBy(?User $createdBy): self return $this; } + public function getCreatedByLabel(): ?string + { + if (self::TYPE_TECHNICAL === $this->type) { + return 'Suivi automatique'; + } + if ($this->getCreatedBy()) { + if (in_array('ROLE_USAGER', $this->getCreatedBy()->getRoles())) { + if ($this->getCreatedBy()->getEmail() === $this->getSignalement()->getMailOccupant()) { + return 'OCCUPANT : '.ucfirst($this->getCreatedBy()->getNomComplet()); + } + + return 'DECLARANT : '.ucfirst($this->getCreatedBy()->getNomComplet()); + } + if ($this->getCreatedBy()->getPartnerInTerritoryOrFirstOne($this->getSignalement()->getTerritory())) { + $partner = $this->getCreatedBy()->getPartnerInTerritoryOrFirstOne($this->getSignalement()->getTerritory()); + if ($partner->getIsArchive()) { + return 'Partenaire supprimé'; + } + + return $partner->getNom().' : '.$this->getCreatedBy()->getPrenom().' '.$this->getCreatedBy()->getNom(); + } + + return 'Aucun'; + } + if ($this->getCreatedAt()->format('Y') >= 2024) { + return 'Occupant ou déclarant'; + } + if ($this->getSignalement()->getIsNotOccupant()) { + return 'DECLARANT : '.strtoupper($this->getSignalement()->getNomDeclarant()).' '.ucfirst($this->getSignalement()->getPrenomDeclarant()); + } + + return 'OCCUPANT : '.strtoupper($this->getSignalement()->getNomOccupant()).' '.ucfirst($this->getSignalement()->getPrenomOccupant()); + } + public function getDescription($transformHtml = true): ?string { if (null !== $this->deletedAt) {