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 4b43d6ec2..2c09520a5 100755 --- a/src/Repository/SignalementRepository.php +++ b/src/Repository/SignalementRepository.php @@ -1398,12 +1398,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') @@ -1414,9 +1415,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')