first draft of case addresses and itineraries

This commit is contained in:
2024-12-31 23:01:37 +00:00
parent 1b5ca4bd34
commit 6c340b4229
14 changed files with 1272 additions and 8 deletions

View File

@@ -2,15 +2,19 @@
namespace App\Controller;
use App\Entity\CaseLocation;
use App\Entity\Location;
use App\Entity\MemberCase;
use App\Entity\Messages;
use App\Entity\ReferralSource;
use App\Entity\User;
use App\Entity\UserCase;
use App\Factory\MessageFactory;
use App\Form\LocationFormType;
use App\Form\MemberCaseFormType;
use App\Form\UserCaseFormType;
use App\Libs\Breadcrumb;
use App\Libs\Libs;
use App\Libs\NavList;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@@ -39,10 +43,11 @@ class CaseController extends AbstractController
}
#[Route('/my-cases', name: 'app_my_cases')]
public function myCases(#[CurrentUser()] User $user): Response
public function myCases(#[CurrentUser()] User $user, Request $request): Response
{
$this->navLinks['my_cases'] = NavList::PRESENT_LINK;
$this->navLinks['case_list'] = 'nav-link text-dark';
$ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]);
$this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($user);
$this->notificationCount = $this->entityManager->getRepository(Messages::class)->getUnreadMessageCount($user);
@@ -59,7 +64,11 @@ class CaseController extends AbstractController
$this->navLinks,
[
'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_my_cases'), 'List Cases')
(
strpos($request->server->get('HTTP_REFERER'), 'list-cases') !== false
? new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases')
: new Breadcrumb($this->generateUrl('app_my_cases'), 'My Cases')
),
],
'notifications' => $this->msgs,
'cases' => $cases,
@@ -276,6 +285,176 @@ class CaseController extends AbstractController
return new Response();
}
#[Route('/addresses/list', name: 'app_list_case_addresses')]
public function listCaseAddresses(Request $request, #[CurrentUser()] User $user): Response
{
$this->navLinks['case_itinerary'] = NavList::PRESENT_LINK;
$this->navLinks['case_list'] = 'nav-link text-dark';
$addresses = $this->entityManager->getRepository(Location::class)->getUserLocations($user);
$this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($user);
$this->notificationCount = $this->entityManager->getRepository(Messages::class)->getUnreadMessageCount($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/addresses/list-case-addresses.html.twig',
array_merge(
$this->navLinks,
[
'title' => 'List Case Addresses',
'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_my_cases'), 'My Cases'),
new Breadcrumb($this->generateUrl('app_list_case_addresses'), 'List Case Addresses')
],
'notifications' => $this->msgs,
'notificationCount' => $this->notificationCount,
'addresses' => $addresses,
'cases' => $cases,
]
)
);
}
#[Route('/addresses/add', name: 'app_case_add_address')]
public function addCaseAddress(Request $request, #[CurrentUser()] User $user): Response
{
$this->navLinks['case_itinerary'] = NavList::PRESENT_LINK;
$this->navLinks['case_list'] = 'nav-link text-dark';
$this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($user);
$this->notificationCount = $this->entityManager->getRepository(Messages::class)->getUnreadMessageCount($user);
$ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]);
$cases = [];
foreach ($ucs as $uc) {
/** @var UserCase $uc */
$cases[] = $uc->getMemberCase();
}
$address = new Location();
$form = $this->createForm(LocationFormType::class, $address);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var Location $address */
$address = $form->getData();
foreach ($request->get('cases') as $caseId) {
$case = $this->entityManager->getRepository(MemberCase::class)->find($caseId);
$cl = new CaseLocation();
$cl->setMemberCase($case)
->setLocation($address);
$this->entityManager->persist($cl);
}
list($lat, $lon) = Libs::getLatLonFromGeoapify((string) $address);
$address->setLat($lat)
->setLon($lon);
//dd($address);
$this->entityManager->persist($address);
$this->entityManager->flush();
$this->addFlash('success', 'Address added successfully');
return $this->redirectToRoute('app_list_case_addresses');
}
return $this->render(
'internal/cases/addresses/add-case-address.html.twig',
array_merge(
$this->navLinks,
[
'title' => 'Add Case Address',
'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_list_case_addresses'), 'List Addresses'),
new Breadcrumb($this->generateUrl('app_case_add_address'), 'Add Case Address')
],
'notifications' => $this->msgs,
'notificationCount' => $this->notificationCount,
'form' => $form,
'cases' => $cases,
]
)
);
}
#[Route('/addresses/edit/{id}', name: 'app_case_edit_address')]
public function editCaseAddress(Request $request, string $id): Response
{
$this->navLinks['case_itinerary'] = NavList::PRESENT_LINK;
$this->navLinks['case_list'] = 'nav-link text-dark';
$this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($this->getUser());
$this->notificationCount = $this->entityManager->getRepository(Messages::class)->getUnreadMessageCount($this->getUser());
$ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $this->getUser()]);
$lcs = $this->entityManager->getRepository(CaseLocation::class)->findBy(['location' => $id]);
$inCases = [];
foreach ($lcs as $lc) {
$inCases[] = $lc->getMemberCase()->getId()->toString();
}
$cases = [];
foreach ($ucs as $uc) {
/** @var UserCase $uc */
$cases[] = $uc->getMemberCase();
}
$location = $this->entityManager->getRepository(Location::class)->find($id);
$form = $this->createForm(LocationFormType::class, $location);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
list($lat, $lon) = Libs::getLatLonFromGeoapify((string) $location);
$location->setLat($lat)
->setLon($lon);
$this->entityManager->flush();
$this->addFlash('success', 'Address updated successfully');
return $this->redirectToRoute('app_list_case_addresses');
}
return $this->render(
'internal/cases/addresses/edit-case-address.html.twig',
array_merge(
$this->navLinks,
[
'title' => 'Edit Case Address',
'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_list_case_addresses'), 'List Case Addresses'),
new Breadcrumb($this->generateUrl('app_case_edit_address', ['id' => $id]), 'Edit Case Address')
],
'location' => $location,
'cases' => $cases,
'inCases' => $inCases,
'form' => $form,
'notifications' => $this->msgs,
'notificationCount' => $this->notificationCount,
]
)
);
}
#[Route('/api/filter-address-by-case/{caseId}', name: 'ajax_filter_address_by_case')]
public function filterAddressByCase(string $caseId, Request $request): Response
{
$case = $this->entityManager->getRepository(MemberCase::class)->find($caseId);
$addresses = $this->entityManager->getRepository(Location::class)->getLocationsByCase($case);
return $this->json($addresses);
}
#[Route('/api/case/{caseId}/user/{userId}', name: 'ajax_case_user_level_check')]
public function checkUserCaseLevel(string $caseId, string $userId) : Response
{

View File

@@ -0,0 +1,145 @@
<?php
namespace App\Controller;
use App\Entity\CaseItinerary;
use App\Entity\CaseLocation;
use App\Entity\Location;
use App\Entity\MemberCase;
use App\Entity\Messages;
use App\Entity\User;
use App\Libs\Breadcrumb;
use App\Libs\Libs;
use App\Libs\NavList;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser;
use Symfony\UX\Map\InfoWindow;
use Symfony\UX\Map\Map;
use Symfony\UX\Map\Marker;
use Symfony\UX\Map\Point;
use Symfony\UX\Map\Polyline;
class ItineraryController extends AbstractController
{
private array $msgs = [];
private int $notificationCount = 0;
public function __construct(
private EntityManagerInterface $entityManager,
private array $navLinks = []
) {
$this->navLinks = NavList::LIST;
}
#[Route('/itinerary/map', name: 'app_map_itinerary')]
public function mapItinerary(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'))
]);
$map = new Map('default');
$map->center(new Point(39.768502, -86.157918))
->zoom(9)
;
$total_distance = 0;
$total_duration = 0;
foreach ($itineraries as $itinerary) {
/** @var CaseItinerary $itinerary */
$map->addPolyline(new Polyline(
points: $itinerary->getGPSPolyLines(),
infoWindow: new InfoWindow(
content: $itinerary->getMemberCase()->getCaseName()
)
));
$total_distance += $itinerary->getDistance();
$total_duration += $itinerary->getDuration()->s;
}
return $this->render(
'internal/cases/itinerary/map.html.twig',
array_merge(
$this->navLinks,
[
'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_my_cases'), 'My Cases'),
],
'notifications' => $this->msgs,
'notificationCount' => $this->notificationCount,
'map' => $map,
'total_distance' => $total_distance,
'total_duration' => $total_duration,
]
)
);
}
#[Route('/api/get-case-locations/{caseId}', name: 'get_case_locations')]
public function createItinerary(string $caseId): Response
{
$case = $this->entityManager->getRepository(MemberCase::class)->find($caseId);
$cls = $this->entityManager->getRepository(CaseLocation::class)->getCaseLocations($case);
$locations = [];
foreach ($cls as $cl) {
/** @var CaseLocation $cl */
$locations[] = $cl->getLocation();
}
return $this->json($locations);
}
#[Route('/api/add-location-to-itinerary', name: 'add_location_to_itinerary')]
public function addLocationToItinerary(Request $request, Session $session): Response
{
$case = $this->entityManager->getRepository(MemberCase::class)->find($request->getPayload()->get('caseId'));
$origin = $this->entityManager->getRepository(Location::class)->find($request->getPayload()->get('origin'));
$destination = $this->entityManager->getRepository(Location::class)->find($request->getPayload()->get('destination'));
$departure = $request->getPayload()->get('departure');
$arrival = $request->getPayload()->get('arrival');
$caseMileage = (bool) $request->getPayload()->get('caseMileage');
$date = new DateTime($request->getPayload()->get('date'));
$route = Libs::getRouteDistance($origin, $destination);
if (!$route) {
return $this->json(['success' => false, 'message' => 'No route found']);
}
$ci = new CaseItinerary();
$ci->setMemberCase($case)
->setDate($date)
->setCaseMileage($caseMileage)
->setOriginLocation($origin)
->setDestLocation($destination)
->setDeparture(new \DateTimeImmutable($departure))
->setArrival(new \DateTimeImmutable($arrival))
->setDistance($route->getDistance())
->setDuration($route->getDuration())
->setGpsRoute($route->getGeometry())
;
$this->entityManager->persist($ci);
$this->entityManager->flush();
$session->getFlashBag()->add(
'success',
'Location added to itinerary'
);
return $this->json(['success' => true, 'message' => 'Location added to itinerary']);
}
}