From 13aaaae34c7ae43c3c35e6d7afe81b44fc671b02 Mon Sep 17 00:00:00 2001 From: Ryan Prather Date: Tue, 28 Jan 2025 20:43:23 -0500 Subject: [PATCH] mv: All Controllers * Move all controllers to sub-directories for organization --- .../{ => Admin}/AdminController.php | 7 +- src/Controller/{ => Case}/CaseController.php | 21 +- src/Controller/Case/GeoapifyController.php | 31 ++ .../{ => Case}/ItineraryController.php | 10 +- .../{ => Case}/MemberController.php | 15 +- src/Controller/{ => Case}/NoteController.php | 28 +- .../{ => Case}/ReferralController.php | 11 +- .../{ => Company}/CompanyController.php | 8 +- .../{ => Company}/DocumentController.php | 19 +- .../CommunityResourceController.php | 7 +- .../{ => Staff}/StaffController.php | 46 ++- src/Controller/System/AjaxController.php | 268 ++++++++++++++++++ .../{ => System}/DefaultController.php | 67 +---- .../{ => System}/MessageController.php | 9 +- .../{ => System}/ReferralSourceController.php | 7 +- .../{ => System}/RegistrationController.php | 15 +- .../{ => System}/SecurityController.php | 2 +- 17 files changed, 412 insertions(+), 159 deletions(-) rename src/Controller/{ => Admin}/AdminController.php (99%) rename src/Controller/{ => Case}/CaseController.php (97%) create mode 100644 src/Controller/Case/GeoapifyController.php rename src/Controller/{ => Case}/ItineraryController.php (97%) rename src/Controller/{ => Case}/MemberController.php (97%) rename src/Controller/{ => Case}/NoteController.php (94%) rename src/Controller/{ => Case}/ReferralController.php (97%) rename src/Controller/{ => Company}/CompanyController.php (98%) rename src/Controller/{ => Company}/DocumentController.php (84%) rename src/Controller/{ => Resources}/CommunityResourceController.php (98%) rename src/Controller/{ => Staff}/StaffController.php (91%) create mode 100644 src/Controller/System/AjaxController.php rename src/Controller/{ => System}/DefaultController.php (76%) rename src/Controller/{ => System}/MessageController.php (93%) rename src/Controller/{ => System}/ReferralSourceController.php (97%) rename src/Controller/{ => System}/RegistrationController.php (93%) rename src/Controller/{ => System}/SecurityController.php (97%) diff --git a/src/Controller/AdminController.php b/src/Controller/Admin/AdminController.php similarity index 99% rename from src/Controller/AdminController.php rename to src/Controller/Admin/AdminController.php index 40be5e7..4527217 100644 --- a/src/Controller/AdminController.php +++ b/src/Controller/Admin/AdminController.php @@ -1,9 +1,9 @@ $searchText, + 'format' => 'json', + 'apiKey' => $_ENV['GEOAPIFY_API_KEY'] + ]; + + $url = "https://api.geoapify.com/v1/autocomplete?".http_build_query($params); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + $result = curl_exec($ch); + curl_close($ch); + + return $this->json($result); + } +} \ No newline at end of file diff --git a/src/Controller/ItineraryController.php b/src/Controller/Case/ItineraryController.php similarity index 97% rename from src/Controller/ItineraryController.php rename to src/Controller/Case/ItineraryController.php index fc6182b..c937171 100644 --- a/src/Controller/ItineraryController.php +++ b/src/Controller/Case/ItineraryController.php @@ -1,11 +1,11 @@ entityManager->getRepository(Member::class)->find($memberId); + /** @var CompanyDocument $doc */ $doc = $this->entityManager->getRepository(CompanyDocument::class)->find($docId); + /** @var MemberDocument $memDoc */ $memDoc = $this->entityManager->getRepository(MemberDocument::class)->findOneBy([ 'document' => $doc, 'client' => $member, @@ -65,6 +68,10 @@ class DocumentController extends AbstractController throw new NotFoundHttpException('Document not found'); } + //$form = $this->createForm(MemberDocument::class); + /** @todo add form data */ + //$form->add(); + return $this->render( 'internal/cases/members/documents/sign-member-doc.html.twig', [ 'doc' => $memDoc, diff --git a/src/Controller/CommunityResourceController.php b/src/Controller/Resources/CommunityResourceController.php similarity index 98% rename from src/Controller/CommunityResourceController.php rename to src/Controller/Resources/CommunityResourceController.php index 2b94703..00085c2 100644 --- a/src/Controller/CommunityResourceController.php +++ b/src/Controller/Resources/CommunityResourceController.php @@ -1,10 +1,9 @@ navLinks['staff_notes'] = NavList::PRESENT_LINK; foreach ($ucs as $uc) { - $cases[] = $uc->getMemberCase(); + $case = $uc->getMemberCase(); + $lastNote = $this->entityManager->getRepository(StaffNote::class)->findOneBy(['memberCase' => $case], ['date' => 'DESC']); + if ($lastNote) { + $case->emptyStaffNotes(); + $case->addStaffNote($lastNote); + } + + $cases[] = $case; } return $this->render( @@ -109,15 +116,26 @@ class StaffController extends AbstractController if (!$this->isGranted('IS_AUTHENTICATED_FULLY')) { return $this->redirectToRoute('app_login'); } - $this->msgs = Libs::getMessages($user, $this->entityManager); $staff = $this->entityManager->getRepository(User::class)->find($staffId); + + $sup = $this->entityManager->getRepository(Supervision::class)->findOneBy(['worker' => $staff, 'supervisor' => $user]); + if (!$sup) { + throw new NotFoundResourceException("It does not appear you are the supervisor to this case worker"); + } + $ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $staff]); $cases = []; - foreach ($ucs as $case) { - /** @var UserCase $case */ - $cases[] = $case->getMemberCase(); + foreach ($ucs as $uc) { + /** @var MemberCase $case */ + $case = $uc->getMemberCase(); + $lastNote = $this->entityManager->getRepository(StaffNote::class)->findOneBy(['memberCase' => $case], ['date' => 'DESC']); + if ($lastNote) { + $case->emptyStaffNotes(); + $case->addStaffNote($lastNote); + } + $cases[] = $case; } return $this->render( @@ -129,9 +147,9 @@ class StaffController extends AbstractController 'cases' => $cases, 'breadcrumbs' => [ new Breadcrumb($this->generateUrl('app_staff_dashboard'), 'Staff Dashboard'), - new Breadcrumb('', 'Staff Cases') + new Breadcrumb('', 'Staff Cases') ], - 'notifications' => $this->msgs, + 'notifications' => Libs::getMessages($user, $this->entityManager), ] ) ); diff --git a/src/Controller/System/AjaxController.php b/src/Controller/System/AjaxController.php new file mode 100644 index 0000000..f3bec8e --- /dev/null +++ b/src/Controller/System/AjaxController.php @@ -0,0 +1,268 @@ +entityManager->getRepository(UserCase::class)->find($id); + $data = json_decode($request->getContent()); + $location = new Location(); + //$location->setItinerary($itinerary) + ; + + return $this->json($location); + } + + #[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, #[CurrentUser()] User $admin) : Response + { + $ret = true; + + $user = $this->entityManager->getRepository(User::class)->find($userId); + $case = $this->entityManager->getRepository(MemberCase::class)->find($caseId); + + if (!Libs::checkPermissions($user, $case, $this->entityManager)) { + throw new AccessDeniedHttpException ('You do not have permission to access this resource.'); + } + + $res = UserCase::checkLevel($admin, $case); + + if (!$res) { + $ret = [ + 'userLevel' => ucwords(str_replace('_', ' ', strtolower($user->getLevel()->name))), + 'caseLevel' => ucwords(str_replace('_', ' ', strtolower($case->getLevel()->name))), + ]; + } + + return $this->json($ret); + } + + #[Route('/api/filter-cases-by-user', name: 'ajax_filter_cases_by_user')] + public function filterCasesByUser(Request $request): Response + { + /** @var User $user */ + $user = $this->entityManager->getRepository(User::class)->find($request->query->get('userId')); + /** @var UserCase[] $ucs */ + $ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]); + + $ret = []; + foreach ($ucs as $uc) { + $ret[] = $uc->getMemberCase(); + } + + return $this->json($ret); + } + + #[Route('/api/filter-resource-by-county', name: 'app_api_filter_resource_by_county')] + public function filterResourceByCounty(Request $request): Response + { + $data = json_decode($request->getContent(), true); + $county = $data['county']; + if ($county) { + $resources = $this->entityManager->getRepository(CommunityResource::class)->findBy(['county' => $county]); + } else { + $resources = $this->entityManager->getRepository(CommunityResource::class)->findAll(); + } + return $this->json($resources); + } + + #[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); + $crs = $this->entityManager->getRepository(CommunityResource::class)->findAll(); + + $locations = []; + foreach ($cls as $cl) { + /** @var CaseLocation $cl */ + $locations[] = $cl->getLocation(); + } + + foreach ($crs as $cr) { + $locations[] = $cr->toLocation(); + } + + 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'); + $caseMileage = (bool) $request->getPayload()->get('caseMileage'); + $date = new DateTime($request->getPayload()->get('date'), new DateTimeZone($_ENV['COMPANY_TIMEZONE'])); + + $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)) + ->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']); + } + + #[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'), new DateTimeZone($_ENV['COMPANY_TIMEZONE'])); + } + + if ($request->getPayload()->get('endDate')) { + $endDate = new DateTime($request->getPayload()->get('endDate'), new DateTimeZone($_ENV['COMPANY_TIMEZONE'])); + } + + $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); + } + + #[Route('/api/filter-notes', name: 'api_filter_notes')] + public function filterNotes(#[CurrentUser()] User $user, Request $request): Response + { + $startDate = null; + $endDate = null; + $referral = null; + $case = null; + + if ($request->getPayload()->get('startDate')) { + $startDate = new DateTime($request->getPayload()->get('startDate'), new DateTimeZone($_ENV['COMPANY_TIMEZONE'])); + } + + if ($request->getPayload()->get('endDate')) { + $endDate = new DateTime($request->getPayload()->get('endDate'), new DateTimeZone($_ENV['COMPANY_TIMEZONE'])); + } + + if ($request->getPayload()->get('referral')) { + $referral = $this->entityManager->getRepository(Referral::class)->find($request->getPayload()->get('referral')); + } + + if ($request->getPayload()->get('case')) { + $case = $this->entityManager->getRepository(MemberCase::class)->find($request->getPayload()->get('case')); + } + + $params = [ + 'startDate' => $startDate, + 'endDate' => $endDate, + 'referral' => $referral, + 'case' => $case, + ]; + + $notes = array_merge( + $this->entityManager->getRepository(VisitNote::class)->filterNotes($user, $params), + $this->entityManager->getRepository(StandardNote::class)->filterNotes($user, $params), + ); + + foreach ($notes as $idx => $note) { + /** @var VisitNote|StandardNote $note */ + + /** @var VisitNoteMember[]|StandardNoteMember[] $members */ + if ($note instanceof VisitNote) { + $members = $this->entityManager->getRepository(VisitNoteMembers::class)->findBy(['note' => $note]); + } elseif ($note instanceof StandardNote) { + $members = $this->entityManager->getRepository(StandardNoteMember::class)->findBy(['note' => $note]); + } else { + continue; + } + + $notes[$idx]->setMembers($members); + } + + return new Response(json_encode($notes, 0, 3)); + } +} diff --git a/src/Controller/DefaultController.php b/src/Controller/System/DefaultController.php similarity index 76% rename from src/Controller/DefaultController.php rename to src/Controller/System/DefaultController.php index 91899eb..cb63b41 100644 --- a/src/Controller/DefaultController.php +++ b/src/Controller/System/DefaultController.php @@ -1,10 +1,10 @@ redirectToRoute('app_profile'); } - if($_SERVER['HTTP_REFERER'] == "{$_SERVER['HTTP_X_FORWARDED_PROTO']}://{$_SERVER['HTTP_HOST']}/") { + if(isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] == "{$_SERVER['HTTP_X_FORWARDED_PROTO']}://{$_SERVER['HTTP_HOST']}/") { $this->entityManager->getRepository(User::class)->updateLastLogin($user); } - $ytdtravel = $this->entityManager->getRepository(CaseItinerary::class)->getYTDTravel($user); - $last30days = $this->entityManager->getRepository(CaseItinerary::class)->getTravelLast30Days($user); - $ytdMiles = 0; - $milesTravelled30Days = 0; - $caseMileageYTD = 0; - $caseMileage30Days = 0; - $totalTimeTravelledYTD = new DateInterval('PT0S'); - $totalTimeTravelled30Days = new DateInterval('PT0S'); - - if ($ytdtravel) { - $timeTravelled = new DateTime('00:00:00'); - $timeTravelYTDStart = new DateTime('00:00:00'); - foreach ($ytdtravel as $travel) { - /** @var CaseItinerary $travel */ - $ytdMiles += $travel->getDistance(); - $timeTravelled->add($travel->getDuration()); - - if ($travel->isCaseMileage()) { - $caseMileageYTD += $travel->getDistance(); - } - } - - $totalTimeTravelledYTD = $timeTravelled->diff($timeTravelYTDStart); - } - - if ($last30days) { - $timeTravelled30Days = new DateTime('00:00:00'); - $timeTravel30DaysStart = new DateTime('00:00:00'); - foreach ($last30days as $travel) { - /** @var CaseItinerary $travel */ - $milesTravelled30Days += $travel->getDistance(); - $timeTravelled30Days->add($travel->getDuration()); - - if ($travel->isCaseMileage()) { - $caseMileage30Days += $travel->getDistance(); - } - } - - $totalTimeTravelled30Days = $timeTravelled30Days->diff($timeTravel30DaysStart); - } - - $activeCases = 0; - $totalCases = 0; - foreach ($user->getUserCases() as $uc) { - $totalCases++; - if (!$uc->getMemberCase()->getCloseDate()) { - $activeCases++; - } - } + $dashboard = new Dashboard($this->entityManager, $user); $this->navLinks['user_dashboard'] = NavList::PRESENT_LINK; @@ -116,19 +68,12 @@ class DefaultController extends AbstractController 'internal/dashboard.html.twig', array_merge( $this->navLinks, + $dashboard->toArray(), [ 'breadcrumbs' => [ new Breadcrumb('', 'Dashboard') ], 'notifications' => Libs::getMessages($user, $this->entityManager), - 'milesTravelledYTD' => $ytdMiles, - 'milesTravelled30Days' => $milesTravelled30Days, - 'totalTimeTravelledYTD' => $totalTimeTravelledYTD, - 'totalTimeTravelled30Days' => $totalTimeTravelled30Days, - 'activeCases' => $activeCases, - 'totalCases' => $totalCases, - 'caseMileageYTD' => $caseMileageYTD, - 'caseMileage30Days' => $caseMileage30Days, ] ) ); diff --git a/src/Controller/MessageController.php b/src/Controller/System/MessageController.php similarity index 93% rename from src/Controller/MessageController.php rename to src/Controller/System/MessageController.php index 1d32a3f..a97cb21 100644 --- a/src/Controller/MessageController.php +++ b/src/Controller/System/MessageController.php @@ -2,11 +2,10 @@ namespace App\Controller; -use App\Entity\Messages; -use App\Entity\Supervision; -use App\Entity\User; -use App\Enums\MessageType; -use App\Libs\Libs; +use App\Entity\System\Messages; +use App\Entity\Staff\Supervision; +use App\Entity\System\User; +use App\Enums\System\MessageType; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; diff --git a/src/Controller/ReferralSourceController.php b/src/Controller/System/ReferralSourceController.php similarity index 97% rename from src/Controller/ReferralSourceController.php rename to src/Controller/System/ReferralSourceController.php index 3ee00cd..ebc9c12 100644 --- a/src/Controller/ReferralSourceController.php +++ b/src/Controller/System/ReferralSourceController.php @@ -1,10 +1,9 @@ setCaseWorker(true) - ->setCaseManager(true) - ->setTherapist(true) - ->setSu(true) - ->setRateType(RateType::FIXED) + $user->setRateType(RateType::FIXED) ->setRate('0.00') ->setRoles(['ROLE_ADMIN']) ->setLevel(CaseLevel::ADMIN); diff --git a/src/Controller/SecurityController.php b/src/Controller/System/SecurityController.php similarity index 97% rename from src/Controller/SecurityController.php rename to src/Controller/System/SecurityController.php index f4a790a..a575e2a 100644 --- a/src/Controller/SecurityController.php +++ b/src/Controller/System/SecurityController.php @@ -1,6 +1,6 @@