Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BO - Carto] Fix sur un bug de calcul de statut #815

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion assets/controllers/weekly_slider.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ $( function() {
$("#weekly-slider-selection").text(selectedDateString)
$("input[name=filter-date]").val(selectedDateString)
if (refreshHeatMap){
getMarkers(0)
getMarkers()
}
}
} );
91 changes: 63 additions & 28 deletions public/js/maps.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,37 +11,72 @@ var map = L.map('map-signalements-view', {
maxZoom: 18,
zoom: 6
});

map.on('zoomend', async function() {
const zoomLevel = map.getZoom();
await getMarkers();
});

map.on('moveend', async function() {
await getMarkers();
});

L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {crossOrigin: true}).addTo(map);
let abortController;
var heat;

async function getMarkers(offset) {
const response = await fetch('?load_markers=true&offset=' + offset, {
headers: {
'X-TOKEN': document.querySelector('#carto__js').getAttribute('data-token')
},
method: 'POST',
body: new FormData(document.querySelector('form#bo_carto_filter'))
});
const result = await response.json();
if (heat){
heat.remove();
async function getMarkers() {
if (abortController) {
abortController.abort();
}
if (result.signalements) {
const heatValues = [];
result.signalements.forEach(signalement => {
if (!isNaN(parseFloat(signalement.geoloc?.lng)) && !isNaN(parseFloat(signalement.geoloc?.lat))) {
// pour l'instant on ne prend pas en compte le niveauInfestation
// on n'affiche pas les signalements au statut resolved
if ('trace' === signalement.statut){
heatValues.push([signalement.geoloc.lat, signalement.geoloc.lng, 0.5]);
}
if ('en cours' === signalement.statut){
heatValues.push([signalement.geoloc.lat, signalement.geoloc.lng, 1]);
}
}
})
heat = L.heatLayer(heatValues, {maxZoom:15}).addTo(map);
} else {
alert('Erreur lors du chargement des signalements...')
abortController = new AbortController();

try {
const bounds = map.getBounds();
const southWest = bounds.getSouthWest();
const northEast = bounds.getNorthEast();
const formData = new FormData(document.querySelector('form#bo_carto_filter'));
formData.append('swLat', southWest.lat);
formData.append('swLng', southWest.lng);
formData.append('neLat', northEast.lat);
formData.append('neLng', northEast.lng);

const response = await fetch('?load_markers=true', {
headers: {
'X-TOKEN': document.querySelector('#carto__js').getAttribute('data-token')
},
method: 'POST',
body: formData,
signal: abortController.signal // Passer le signal d'annulation
});
const result = await response.json();
if (heat){
heat.remove();
}
if (result.signalements) {
const heatValues = [];
result.signalements.forEach(signalement => {
const geoloc = JSON.parse(signalement.geoloc);
if (!isNaN(parseFloat(geoloc?.lng)) && !isNaN(parseFloat(geoloc?.lat))) {
// pour l'instant on ne prend pas en compte le niveauInfestation
// on n'affiche pas les signalements au statut resolved
if ('trace' === signalement.statut){
heatValues.push([geoloc.lat, geoloc.lng, 0.5]);
}
if ('en cours' === signalement.statut){
heatValues.push([geoloc.lat, geoloc.lng, 1]);
}
}
})
heat = L.heatLayer(heatValues, {maxZoom:15}).addTo(map);
} else {
alert('Erreur lors du chargement des signalements...')
}
} catch (error) {
if (error.name === 'AbortError') {
console.log('Requête annulée');
} else {
console.error('Erreur lors de l\'analyse du JSON:', error);
}
}
}
10 changes: 9 additions & 1 deletion src/Controller/CartographieController.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,17 @@ public function index(
} else {
$date = new \DateTimeImmutable();
}
$swLat = $request->get('swLat');
$swLng = $request->get('swLng');
$neLat = $request->get('neLat');
$neLng = $request->get('neLng');
Comment on lines +26 to +29
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Faudrait mapper un DTO avec controles des données en entrée
https://symfony.com/blog/new-in-symfony-6-3-mapping-request-data-to-typed-objects

image


$signalements = $signalementRepository->findAllWithGeoData(
$date,
(int) $request->get('offset')
$swLat,
$swLng,
$neLat,
$neLng
);

return $this->json(
Expand Down
59 changes: 31 additions & 28 deletions src/Repository/SignalementRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class SignalementRepository extends ServiceEntityRepository
{
private const NB_DAYS_BEFORE_NOTIFYING = 45;
private const NB_DAYS_BEFORE_CLOSING_AUTOTRAITEMENT = 45;
public const MARKERS_PAGE_SIZE = 9000; // @todo: is high cause duplicate result, the query findAllWithGeoData should be reviewed
public const MARKERS_PAGE_SIZE = 6000; // @todo: is high cause duplicate result, the query findAllWithGeoData should be reviewed

public function __construct(ManagerRegistry $registry)
{
Expand Down Expand Up @@ -471,32 +471,35 @@ public function countCurrentlyOpenForEntreprise(Entreprise $entreprise): int
)->fetchOne();
}

public function findAllWithGeoData(\DateTimeImmutable $date, int $offset): array
{
$firstResult = $offset;
$qb = $this->createQueryBuilder('s');
$qb->select('
DISTINCT s.id,
s.uuid,
s.reference,
s.createdAt,
s.nomOccupant,
s.prenomOccupant,
s.adresse,
s.codePostal,
s.ville,
s.niveauInfestation,
s.resolvedAt,
s.closedAt,
s.geoloc,
t.active')
->leftJoin('s.territoire', 't')
->where('s.createdAt < :date')
->setParameter('date', $date);

$qb->setFirstResult($firstResult)
->setMaxResults(self::MARKERS_PAGE_SIZE);

return $qb->getQuery()->getArrayResult();
public function findAllWithGeoData(
\DateTimeImmutable $date,
float $swLat,
float $swLng,
float $neLat,
float $neLng,
): array {
$conn = $this->getEntityManager()->getConnection();
$limit = self::MARKERS_PAGE_SIZE;
$sql = "
SELECT DISTINCT s.created_at, s.niveau_infestation, s.resolved_at, s.closed_at, s.geoloc
FROM signalement s
WHERE s.created_at < :date
AND s.geoloc != 'null'
AND s.geoloc != '[]'
AND CAST(JSON_UNQUOTE(JSON_EXTRACT(s.geoloc, '$.lat')) AS DECIMAL(10, 6)) BETWEEN :swLat AND :neLat
AND CAST(JSON_UNQUOTE(JSON_EXTRACT(s.geoloc, '$.lng')) AS DECIMAL(10, 6)) BETWEEN :swLng AND :neLng
ORDER BY s.created_at DESC
LIMIT $limit;
";

$resultSet = $conn->executeQuery($sql, [
'date' => $date->format('Y-m-d H:i:s'),
'swLat' => $swLat,
'neLat' => $neLat,
'swLng' => $swLng,
'neLng' => $neLng,
]);

return $resultSet->fetchAllAssociative();
}
}
16 changes: 9 additions & 7 deletions src/Service/Signalement/CartoStatutCalculator.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,19 @@ public function calculate(array $signalements, \DateTimeImmutable $date): array
$signalementsStatues = [];
foreach ($signalements as $signalement) {
$date4monthsAgo = $date->modify('-4 month');
if (null !== $signalement['resolvedAt'] && $signalement['resolvedAt'] < $date) {
$dateResolvedAt = new \DateTimeImmutable($signalement['resolved_at']);
$dateClosedAt = new \DateTimeImmutable($signalement['closed_at']);
$dateCreatedAt = new \DateTimeImmutable($signalement['created_at']);
if (null !== $dateResolvedAt && $dateResolvedAt < $date) {
$statut = 'resolved';
} elseif (null !== $signalement['closedAt'] && $signalement['closedAt'] < $date4monthsAgo) {
} elseif (null !== $dateClosedAt && $dateClosedAt < $date4monthsAgo) {
$statut = 'resolved';
} elseif (false === $signalement['active'] && $signalement['createdAt'] < $date4monthsAgo) {
} elseif ($dateCreatedAt < $date4monthsAgo) {
$statut = 'resolved';
} elseif (null !== $signalement['closedAt']
&& $signalement['closedAt'] > $date4monthsAgo && $signalement['closedAt'] < $date) {
} elseif (null !== $dateClosedAt
&& $dateClosedAt > $date4monthsAgo && $dateClosedAt < $date) {
$statut = 'trace';
} elseif (false === $signalement['active']
&& $signalement['createdAt'] > $date4monthsAgo && $signalement['createdAt'] < $date) {
} elseif ($dateCreatedAt > $date4monthsAgo && $dateCreatedAt < $date) {
$statut = 'trace';
} else {
$statut = 'en cours';
Expand Down
Loading