From af41590fd308e8b8bbc8535adf2229b443097425 Mon Sep 17 00:00:00 2001 From: Ryan Prather Date: Wed, 1 Jan 2025 05:57:42 +0000 Subject: [PATCH] add itinerary report page, update map page, add markers for origin and destination, add filter-itinerary-by-case method --- src/Controller/ItineraryController.php | 136 +++++++++++++++++++++++-- 1 file changed, 127 insertions(+), 9 deletions(-) diff --git a/src/Controller/ItineraryController.php b/src/Controller/ItineraryController.php index 12d5b4c..272c939 100644 --- a/src/Controller/ItineraryController.php +++ b/src/Controller/ItineraryController.php @@ -8,6 +8,7 @@ use App\Entity\Location; use App\Entity\MemberCase; use App\Entity\Messages; use App\Entity\User; +use App\Entity\UserCase; use App\Libs\Breadcrumb; use App\Libs\Libs; use App\Libs\NavList; @@ -38,15 +39,57 @@ class ItineraryController extends AbstractController $this->navLinks = NavList::LIST; } - #[Route('/itinerary/map', name: 'app_map_itinerary')] - public function mapItinerary(Request $request, #[CurrentUser()] ?User $user): Response + #[Route('/itinerary/report', name: 'app_report_itinerary')] + public function reportItinerary(Request $request, #[CurrentUser()] ?User $user): Response { $this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($user); $this->notificationCount = $this->entityManager->getRepository(Messages::class)->getUnreadMessageCount($user); - $itineraries = $this->entityManager->getRepository(CaseItinerary::class)->findBy([ - 'memberCase' => $request->getPayload()->get('caseId'), - 'date' => new DateTime($request->getPayload()->get('caseDate')) + $itineraries = $this->entityManager->getRepository(CaseItinerary::class)->getRecentTravel( + $user + ); + + $ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]); + $cases = []; + foreach ($ucs as $uc) { + /** @var UserCase $uc */ + $cases[] = $uc->getMemberCase(); + } + + return $this->render( + 'internal/cases/itinerary/report.html.twig', + array_merge( + $this->navLinks, + [ + 'breadcrumbs' => [ + new Breadcrumb($this->generateUrl('app_dashboard'), 'Dashboard'), + ], + 'notifications' => $this->msgs, + 'notificationCount' => $this->notificationCount, + 'itineraries' => $itineraries, + 'cases' => $cases + ] + ) + ); + } + + #[Route('/itinerary/map', name: 'app_map_itinerary')] + public function mapItinerary(Request $request, #[CurrentUser()] ?User $user): Response + { + $case = null; + if ($request->getPayload()->get('caseId')) { + $case = $this->entityManager->getRepository(MemberCase::class)->find($request->getPayload()->get('caseId')); + } + $startDate = ($request->getPayload()->get('startDate') ?new DateTime($request->getPayload()->get('startDate')) : null); + $endDate = ($request->getPayload()->get('endDate') ? new DateTime($request->getPayload()->get('endDate')) : null); + + $this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($user); + $this->notificationCount = $this->entityManager->getRepository(Messages::class)->getUnreadMessageCount($user); + + $itineraries = $this->entityManager->getRepository(CaseItinerary::class)->getRecentTravel($user, [ + 'case' => $case, + 'from' => $startDate, + 'to' => $endDate, ]); $map = new Map('default'); @@ -55,20 +98,48 @@ class ItineraryController extends AbstractController ; $total_distance = 0; - $total_duration = 0; + $total_duration = new DateTime('00:00:00'); foreach ($itineraries as $itinerary) { + /** @var CaseItinerary $itinerary */ + $map->addMarker(new Marker( + position: new Point( + $itinerary->getOriginLocation()->getLat(), + $itinerary->getOriginLocation()->getLon() + ), + title: $itinerary->getOriginLocation()->getName(), + infoWindow: new InfoWindow( + content: $itinerary->getOriginLocation()->getName(), + ) + )); + + $map->addMarker(new Marker( + position: new Point( + $itinerary->getDestLocation()->getLat(), + $itinerary->getDestLocation()->getLon() + ), + title: $itinerary->getDestLocation()->getName(), + infoWindow: new InfoWindow( + content: $itinerary->getDestLocation()->getName(), + ) + )); + /** @var CaseItinerary $itinerary */ $map->addPolyline(new Polyline( points: $itinerary->getGPSPolyLines(), infoWindow: new InfoWindow( content: $itinerary->getMemberCase()->getCaseName() - ) + ), + extra: ['color' => '#FF0000'] )); $total_distance += $itinerary->getDistance(); - $total_duration += $itinerary->getDuration()->s; + $total_duration->add($itinerary->getDuration()); } + $map->fitBoundsToMarkers(true); + + $diff = new DateTime('00:00:00'); + $di = $diff->diff($total_duration); return $this->render( 'internal/cases/itinerary/map.html.twig', @@ -77,12 +148,13 @@ class ItineraryController extends AbstractController [ 'breadcrumbs' => [ new Breadcrumb($this->generateUrl('app_my_cases'), 'My Cases'), + new Breadcrumb($this->generateUrl('app_itinerary_report'), 'Itinerary Report'), ], 'notifications' => $this->msgs, 'notificationCount' => $this->notificationCount, 'map' => $map, 'total_distance' => $total_distance, - 'total_duration' => $total_duration, + 'total_duration' => $di->format("%H:%i'%s''"), ] ) ); @@ -142,4 +214,50 @@ class ItineraryController extends AbstractController ); return $this->json(['success' => true, 'message' => 'Location added to itinerary']); } + + #[Route('/api/filter-itinerary-by-case', name: 'ajax_filter_itinerary_by_case')] + public function filterItineraryByCase(Request $request, #[CurrentUser()] ?User $user): Response + { + $case = null; + $startDate = null; + $endDate = null; + + //dd($request->getPayload()); + + if ($request->getPayload()->get('caseId')) { + $caseId = $request->getPayload()->get('caseId'); + $case = $this->entityManager->getRepository(MemberCase::class)->find($caseId); + } + + if ($request->getPayload()->get('startDate')) { + $startDate = new DateTime($request->getPayload()->get('startDate')); + } + + if ($request->getPayload()->get('endDate')) { + $endDate = new DateTime($request->getPayload()->get('endDate')); + } + + $itineraries = $this->entityManager->getRepository(CaseItinerary::class)->getRecentTravel($user, [ + 'case' => $case, + 'from' => $startDate, + 'to' => $endDate, + ]); + + $ret = []; + + foreach ($itineraries as $itinerary) { + /** @var CaseItinerary $itinerary */ + $ret[] = [ + 'id' => $itinerary->getId()->toString(), + 'date' => $itinerary->getDate()->format('F j, Y'), + 'origin' => $itinerary->getOriginLocation(), + 'destination' => $itinerary->getDestLocation(), + 'distance' => $itinerary->getDistance(), + 'duration' => $itinerary->getDuration()->format("%h:%i'%s''"), + 'case' => $itinerary->getMemberCase()->getCaseName(), + ]; + } + + return $this->json($ret); + } }