Compare commits

..

76 Commits

Author SHA1 Message Date
c9cf8d7e0a up: various twig templates
* various twig updates
2025-02-10 16:18:53 -05:00
b828333222 fix: twig note templates
* fix edit notes and and member present
* refactor enum moving process
2025-02-10 15:10:25 -05:00
607ca79c4d up: various
* various minor update
2025-02-10 15:08:28 -05:00
0ebd90a03b up: twig company-info
* add vendorId twig template form element
2025-02-10 15:05:56 -05:00
24784bb1bb add: twig case
* add case rate to twig template forms
2025-02-10 15:04:43 -05:00
e3380bab2f up: UserChecker
* Rename user class
2025-02-10 15:03:02 -05:00
2cd4c68baf fix: MemberRepository
* Fix getting selected members from a note
2025-02-10 15:00:10 -05:00
52f835bbda fix: *NoteFormType
* Fix member selection
2025-02-10 14:59:13 -05:00
680b7ab9bd up: MemberCaseFormType
* Add rate property form element
2025-02-10 14:58:11 -05:00
4f6a80eade up: MemberCaseFormType
* Add vendorId property
2025-02-10 14:57:33 -05:00
53d9350cb8 up: MemberCase
* Add rate integer property
2025-02-10 14:54:45 -05:00
428304e5af up: Company
* add vendorId property and methods, may need to add more for reporting data
2025-02-09 18:16:14 -05:00
c4d1a33272 up: VisitNote & StandardNote
* couple minor changes
2025-02-09 18:15:21 -05:00
4fd42970ac up: Member
* add checked property and setId method to support note editing and retrieval and display of form parameters
2025-02-09 18:14:53 -05:00
1fd72d95e0 ref: MessageController
* move message controller to new path, forgot to update namespace
2025-02-09 18:14:01 -05:00
74ad66496e add: DefaultController
* add up method for connection checking
2025-02-09 18:13:32 -05:00
8851c4f6e8 ref: AjaxController
* refactor for readability
2025-02-09 18:13:00 -05:00
51ea4e2311 up: ReferralController
* remove $this->msgs and just call Libs::getMessages method
2025-02-09 18:12:36 -05:00
4859aa23b8 up: NoteController
* add error if user doesn't select referral when trying to add new note
* Finalize note editing
2025-02-09 18:11:48 -05:00
e601727514 sec: AdminController
* set initial password change date to epoch when creating new account
2025-02-09 18:10:14 -05:00
b54e2a51f9 ref: security.yaml
* update entity path after moving entities around
2025-02-09 18:09:11 -05:00
d51c67db3d up: notes.js
* Convert duration to hours/units
* Move calcTime method here
2025-02-09 18:08:32 -05:00
1cfc4c7355 rm: itinerary.js
* remove arrival because it's unnecessary
2025-02-09 18:06:42 -05:00
8e85405426 upd: CaseController
* remove assignCaseDocument method in favor of Member Document assignment
2025-01-28 21:02:20 -05:00
9887889ecb ref: Repositories
* Refactor all files
2025-01-28 20:59:14 -05:00
593958cc68 ref: Libs
* Refactor files
* Move autocompleteAddress method to GeoapifyController
2025-01-28 20:58:47 -05:00
528827868b upd: Forms
* Move classes
2025-01-28 20:54:50 -05:00
af6ebbb1b2 mv: Factories
* move files
2025-01-28 20:48:41 -05:00
e08e23d647 mv: Enums
* Move enums
2025-01-28 20:48:00 -05:00
bcc32bf445 mv: Refactor
* Move entities for organization
2025-01-28 20:47:26 -05:00
ee2fce4c41 upd: DataFixtures
* Refactor after moving files
2025-01-28 20:46:38 -05:00
13aaaae34c mv: All Controllers
* Move all controllers to sub-directories for organization
2025-01-28 20:43:23 -05:00
fc9ebbd327 upd: importmap
* add moment library
2025-01-24 11:20:13 -05:00
4cddccdf6e upd: twig nav
* remove case notes nav in favor of navigating through case data
* rename Case Addresses to Addresses
2025-01-24 11:19:06 -05:00
3d786f1f16 upd: twig list-notes
* correct link for adding a new note
* remove display of present members
2025-01-24 11:16:25 -05:00
e5f09bd8cc upd: Libs
Permissions checking
* Add checkPermissions method to check the permissions of the user to the case to make sure they have permissions to add or edit.
2025-01-24 10:35:46 -05:00
77d90ed691 fix: NoteForms
* change members field to unmapped
2025-01-24 10:34:12 -05:00
0d69b51ff9 upd: CommunityResource
* Add method to convert class to Location object
2025-01-24 10:19:43 -05:00
df29fd0d99 fix: NoteController
Save members
* get note members working, still need to setup editing
2025-01-24 10:18:56 -05:00
09ae2756c2 upd: ItineraryController
* remove unnecessary use statements
2025-01-24 10:17:43 -05:00
520409b0b4 fix: CaseController
* add permission validation
2025-01-24 10:15:49 -05:00
fe622ef794 upd: twig edit-members
add member documents
2025-01-22 21:32:58 -05:00
0844b3fc58 upd: MemberDocumentRepository
Remove
* remove unsigned documents from repository for member to sign
2025-01-22 21:32:26 -05:00
6468e77445 upd: User
vCard profile
* Add profile image to vCard
2025-01-22 21:31:36 -05:00
2e41c1ed83 fix: CompanyDocument
Add Property
* add selected property to support edit-member functionality
2025-01-22 21:28:27 -05:00
6ecb76a829 fix: MemberController
member editting
* Add documents
* Cleanup
2025-01-22 21:20:24 -05:00
1fa3843b50 fix: remove class permission requirement 2025-01-22 21:02:30 -05:00
e376dadb4b add: composer
* add phpstan library and require extensions
2025-01-21 14:46:35 -05:00
b990ea55cb fix: twig
* couple display fixes
2025-01-21 14:46:03 -05:00
67d83a1f98 add: twig nav
* add company directory link
2025-01-21 14:44:39 -05:00
79db6b2ec9 fix: twig add-member
* add checkboxes for each company document
2025-01-21 14:43:55 -05:00
0c5fa617ad fix: twig list-users
* fix display of user profile
* add text muting if user is inactive
2025-01-21 14:43:20 -05:00
6effcba396 fix: twig edit-user
* fix background image display
* fix display for work and personal phone numbers
* add active checkbox
* fix displays for role checkboxes
2025-01-21 14:41:49 -05:00
43e6811928 fix: twig users
Fix user background image that displays left of the form
2025-01-21 14:40:01 -05:00
705d7330b0 add: twig company-info
Add new display
2025-01-21 14:38:49 -05:00
7bc73345b0 fix: twig couple files
* fix referralType display after converting to enum
2025-01-21 14:38:12 -05:00
610cccc191 fix: twig assign-case
* add number of cases to user list
2025-01-21 14:36:46 -05:00
a47a5e8adb fix: twig add-case
* fix display with admit and close dates
* convert referralType to use enum
* fix display for case level, referral source & 2, county
* remove case documents checkboxes
2025-01-21 14:35:53 -05:00
81838608b3 add: NavList
Add company_directory field
2025-01-21 14:32:32 -05:00
d39942eced fix: MemberCase
Migration for CaseDocuments to MemberDocuments
Convert referralType field to use ReferralType Enum
2025-01-21 14:32:04 -05:00
cdacfd918a fix: MessageFactory
Add link parameter to createNewCase method
2025-01-21 14:30:17 -05:00
922852f211 fix: User
various updates
* remove unnecessary caseWorker, caseManager, therapist, su properties
* Removed retrieveUnreadNotifications method that was just a stub
* convert "is..." methods to check for present roles
* update getJobs method with above logic
* add generateVCard method to support company directory
2025-01-21 14:29:31 -05:00
224a5cd243 add: MemberDocument
Add MemberDocument class and assoc repo
2025-01-21 14:25:00 -05:00
6d8fbd5bb8 fix: MemberCase
ReferralType
* Convert ReferralType in class to an Enum
2025-01-21 14:24:11 -05:00
82ee30a724 add: CompanyDocument
Add class
* Add CompanyDocument class, associated repo and twig files
2025-01-21 14:23:14 -05:00
e13dc0bf66 fix: MemberController
MemberDocument migration
* Migrate CaseDocument to MemberDocument
* Setup assigning a document to a case member when creating member
* Still need to fix member edit
2025-01-21 14:20:57 -05:00
844209d3e3 commit gitmessage template 2025-01-21 14:18:06 -05:00
001a674f6f fix: DocumentController
move case documents to member documents
first draft of signing
2025-01-21 14:13:19 -05:00
caeb15f05b add: CompanyController
Add company directory method
2025-01-21 14:11:40 -05:00
2af4b8e04e fix: CaseController
migrate documents to MemberController
add link to new case message
2025-01-21 14:09:21 -05:00
c04e255476 fix: AdminController
ensure new users are active
fix role assignments and remove unnecessary fields
fix supervision assignment to update the record instead of deleting
2025-01-21 14:08:12 -05:00
2e77baae1b Add UserChecker to check for expired passwords, ensure users have active accounts 2025-01-21 02:07:50 +00:00
d74e10803c Add UserChecker to check for expired passwords, ensure users have active accounts 2025-01-21 02:04:29 +00:00
3d67d74242 added active and lastLogin properties 2025-01-13 22:17:22 +00:00
c2608a17cf added method to update the lastlogin so we can track how long it's been since a user last logged in. 2025-01-13 22:12:12 +00:00
1cb6bedb5c add docs for the case 2025-01-11 22:30:54 -05:00
158 changed files with 3641 additions and 1353 deletions

5
.gitmessage Normal file
View File

@ -0,0 +1,5 @@
{commit-type}: {module}
{description}
### Changes
* {change1}

View File

@ -17,7 +17,6 @@ export function addLocationToItinerary() {
let origin = document.getElementById('origin').value; let origin = document.getElementById('origin').value;
let destination = document.getElementById('destination').value; let destination = document.getElementById('destination').value;
let departure = document.getElementById('departure').value; let departure = document.getElementById('departure').value;
let arrival = document.getElementById('arrival').value;
let caseMileage = document.getElementById('case-mileage').checked; let caseMileage = document.getElementById('case-mileage').checked;
let caseId = document.getElementById('case-filter').value; let caseId = document.getElementById('case-filter').value;
@ -32,7 +31,6 @@ export function addLocationToItinerary() {
origin: origin, origin: origin,
destination: destination, destination: destination,
departure: departure, departure: departure,
arrival: arrival,
caseMileage: caseMileage caseMileage: caseMileage
}) })
}) })

View File

@ -28,10 +28,11 @@ export function filterNotes()
noteList.innerHTML = ''; noteList.innerHTML = '';
data.forEach(i => { data.forEach(i => {
let duration = (parseInt(i.duration) / 60).toFixed(2);
noteList.innerHTML += ` noteList.innerHTML += `
<tr> <tr>
<td>${i.date}<br/> <td>${i.date}<br/>
${i.startTime}-${i.endTime} (${i.duration})</td> ${i.startTime}-${i.endTime} (${duration})</td>
<td class='text-center'>${i.location}</td> <td class='text-center'>${i.location}</td>
<td class='text-center'>${i.method}</td> <td class='text-center'>${i.method}</td>
<td'>${i.members}</td> <td'>${i.members}</td>
@ -44,3 +45,47 @@ export function filterNotes()
}) })
}); });
} }
export function calcTime(precision = 15) {
if (!document.getElementById('note_form_startTime').value || !document.getElementById('note_form_endTime').value) {
console.log('ending');
return;
}
let st = document.getElementById('note_form_startTime').value.split(':');
let et = document.getElementById('note_form_endTime').value.split(':');
let sd = new Date();
let ed = new Date();
sd.setHours(st[0]);
sd.setMinutes(st[1]);
sd.setSeconds(0);
ed.setHours(et[0]);
ed.setMinutes(et[1]);
ed.setSeconds(0);
let timediff = (ed.getTime() - sd.getTime()) / 1000;
let increments = (timediff / 60) / precision;
if (isFloat(increments)) {
let mod = (timediff / 60) % precision;
if (mod >= (precision / 2)) {
increments++;
}
increments = parseInt(increments);
}
document.getElementById('case-mins').value = (increments * precision)+' minutes';
document.getElementById('case-hours').value = ((increments * precision) / 60)+' hours';
}
export function autosaveNote()
{
}
export function checkNotes() {
}

View File

@ -102,8 +102,12 @@
} }
}, },
"require-dev": { "require-dev": {
"ext-dom": "*",
"ext-simplexml": "*",
"ext-xml": "*",
"doctrine/doctrine-fixtures-bundle": "^4.0", "doctrine/doctrine-fixtures-bundle": "^4.0",
"fakerphp/faker": "^1.24", "fakerphp/faker": "^1.24",
"phpstan/phpstan": "^2.1",
"phpunit/phpunit": "^9.5", "phpunit/phpunit": "^9.5",
"symfony/browser-kit": "7.2.*", "symfony/browser-kit": "7.2.*",
"symfony/css-selector": "7.2.*", "symfony/css-selector": "7.2.*",

View File

@ -7,7 +7,7 @@ security:
# used to reload user from session & other features (e.g. switch_user) # used to reload user from session & other features (e.g. switch_user)
app_user_provider: app_user_provider:
entity: entity:
class: App\Entity\User class: App\Entity\System\User
property: username property: username
# used to reload user from session & other features (e.g. switch_user) # used to reload user from session & other features (e.g. switch_user)
firewalls: firewalls:
@ -15,11 +15,19 @@ security:
pattern: ^/uploads/user_images/ pattern: ^/uploads/user_images/
security: false security: false
dev: dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/ pattern:
- ^/_profiler
- ^/_wdt
- ^/css
- ^/images
- ^/js
- ^/uploads
- ^/favicon.ico
security: false security: false
main: main:
lazy: true lazy: true
provider: app_user_provider provider: app_user_provider
user_checker: App\Security\UserChecker
form_login: form_login:
login_path: app_login login_path: app_login
check_path: app_login check_path: app_login

View File

@ -3,6 +3,8 @@ twig:
globals: globals:
mileage_rate: '%env(MILEAGE_RATE)%' mileage_rate: '%env(MILEAGE_RATE)%'
company_timezone: '%env(COMPANY_TIMEZONE)%' company_timezone: '%env(COMPANY_TIMEZONE)%'
company_image_path: '%env(COMPANY_IMAGE_PATH)%'
user_image_path: '%env(USER_IMAGE_PATH)%'
when@test: when@test:
twig: twig:

View File

@ -88,4 +88,7 @@ return [
'tinymce' => [ 'tinymce' => [
'version' => '7.6.0', 'version' => '7.6.0',
], ],
'moment' => [
'version' => '2.30.1',
],
]; ];

View File

@ -2,6 +2,16 @@
use App\Kernel; use App\Kernel;
if (preg_match("/theme\//", $_SERVER['REQUEST_URI'])) {
print file_get_contents(dirname(__FILE__).$_SERVER['REQUEST_URI']);
exit;
}
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;
}
require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
return function (array $context) { return function (array $context) {

View File

@ -1,13 +1,10 @@
<?php <?php
namespace App\Controller; namespace App\Controller\Admin;
use App\Entity\CompanyDocument; use App\Entity\Staff\Supervision;
use App\Entity\Messages; use App\Entity\System\User;
use App\Entity\Supervision;
use App\Entity\User;
use App\Factory\MessageFactory; use App\Factory\MessageFactory;
use App\Form\CompanyDocumentFormType;
use App\Form\EditUserFormType; use App\Form\EditUserFormType;
use App\Form\SupervisorFormType; use App\Form\SupervisorFormType;
use App\Form\UserFormType; use App\Form\UserFormType;
@ -30,12 +27,10 @@ use Symfony\Component\String\Slugger\SluggerInterface;
#[IsGranted('ROLE_ADMIN')] #[IsGranted('ROLE_ADMIN')]
class AdminController extends AbstractController class AdminController extends AbstractController
{ {
private array $msgs;
public function __construct( public function __construct(
private readonly EntityManagerInterface $entityManager, private readonly EntityManagerInterface $entityManager,
private readonly UserPasswordHasherInterface $userPasswordHasher, private readonly UserPasswordHasherInterface $userPasswordHasher,
private array $navLinks = [] private array $navLinks = [],
) { ) {
$this->navLinks = NavList::LIST; $this->navLinks = NavList::LIST;
} }
@ -45,7 +40,6 @@ class AdminController extends AbstractController
{ {
$this->denyAccessUnlessGranted('ROLE_ADMIN'); $this->denyAccessUnlessGranted('ROLE_ADMIN');
$this->navLinks['admin_dashboard'] = NavList::PRESENT_LINK; $this->navLinks['admin_dashboard'] = NavList::PRESENT_LINK;
$this->msgs = Libs::getMessages($user, $this->entityManager);
return $this->render( return $this->render(
'internal/admin/admin-dashboard.html.twig', 'internal/admin/admin-dashboard.html.twig',
@ -55,7 +49,7 @@ class AdminController extends AbstractController
'breadcrumbs' => [ 'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_admin_dashboard'), 'Admin Dashboard') new Breadcrumb($this->generateUrl('app_admin_dashboard'), 'Admin Dashboard')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
] ]
) )
); );
@ -65,7 +59,6 @@ class AdminController extends AbstractController
public function listUsers(#[CurrentUser()] User $user): Response public function listUsers(#[CurrentUser()] User $user): Response
{ {
$this->denyAccessUnlessGranted('ROLE_ADMIN'); $this->denyAccessUnlessGranted('ROLE_ADMIN');
$this->msgs = Libs::getMessages($user, $this->entityManager);
/** @var UserRepository $repo */ /** @var UserRepository $repo */
$repo = $this->entityManager->getRepository(User::class); $repo = $this->entityManager->getRepository(User::class);
@ -89,7 +82,7 @@ class AdminController extends AbstractController
new Breadcrumb($this->generateUrl('app_list_users'), 'List Users') new Breadcrumb($this->generateUrl('app_list_users'), 'List Users')
], ],
'users' => $users, 'users' => $users,
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
] ]
) )
); );
@ -102,7 +95,6 @@ class AdminController extends AbstractController
SluggerInterface $slugger SluggerInterface $slugger
): Response { ): Response {
$this->denyAccessUnlessGranted('ROLE_ADMIN'); $this->denyAccessUnlessGranted('ROLE_ADMIN');
$this->msgs = Libs::getMessages($admin, $this->entityManager);
$user = new User(); $user = new User();
$form = $this->createForm(UserFormType::class, $user); $form = $this->createForm(UserFormType::class, $user);
@ -143,7 +135,8 @@ class AdminController extends AbstractController
->setRate($form->get('rate')->getData()) ->setRate($form->get('rate')->getData())
->setLevel($form->get('level')->getData()) ->setLevel($form->get('level')->getData())
->setCompany($admin->getCompany()) ->setCompany($admin->getCompany())
->setPasswordChanged(new DateTime('now', new DateTimeZone($_ENV['COMPANY_TIMEZONE']))) ->setActive(true)
->setPasswordChanged(new DateTime('1970-01-01 00:00:00', new DateTimeZone($_ENV['COMPANY_TIMEZONE'])))
; ;
if ($form->get('imageName')->getData()) { if ($form->get('imageName')->getData()) {
@ -183,7 +176,7 @@ class AdminController extends AbstractController
new Breadcrumb($this->generateUrl('app_add_user'), 'Add User') new Breadcrumb($this->generateUrl('app_add_user'), 'Add User')
], ],
'form' => $form, 'form' => $form,
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($admin, $this->entityManager),
] ]
) )
); );
@ -194,7 +187,6 @@ class AdminController extends AbstractController
{ {
/** @var UserRepository $userRepo */ /** @var UserRepository $userRepo */
$userRepo = $this->entityManager->getRepository(User::class); $userRepo = $this->entityManager->getRepository(User::class);
$this->msgs = Libs::getMessages($admin, $this->entityManager);
/** @var User $user */ /** @var User $user */
$user = $userRepo->find($id); $user = $userRepo->find($id);
@ -205,15 +197,31 @@ class AdminController extends AbstractController
$this->navLinks['user_list'] = NavList::PRESENT_LINK; $this->navLinks['user_list'] = NavList::PRESENT_LINK;
if ($form->isSubmitted() && $form->isValid()) { if ($form->isSubmitted() && $form->isValid()) {
$roles = ['ROLE_USER'];
if ($form->get('caseWorker')->getData()) {
$roles[] = 'ROLE_CASE_WORKER';
}
if ($form->get('caseManager')->getData()) {
$roles[] = 'ROLE_CASE_MANAGER';
}
if ($form->get('therapist')->getData()) {
$roles[] = 'ROLE_THERAPIST';
}
if ($form->get('su')->getData()) {
$roles[] = 'ROLE_ADMIN';
}
$user->setName($form->get('name')->getData()) $user->setName($form->get('name')->getData())
->setEmail($form->get('email')->getData()) ->setEmail($form->get('email')->getData())
->setCaseWorker($form->get('caseWorker')->getData()) ->setRoles($roles)
->setCaseManager($form->get('caseManager')->getData()) ->setActive((bool) $form->get('active')->getData())
->setTherapist($form->get('therapist')->getData())
->setSu($form->get('su')->getData())
->setRateType($form->get('rateType')->getData()) ->setRateType($form->get('rateType')->getData())
->setRate($form->get('rate')->getData()) ->setRate($form->get('rate')->getData())
->setLevel($form->get('level')->getData()); ->setLevel($form->get('level')->getData())
;
$this->entityManager->flush(); $this->entityManager->flush();
@ -231,7 +239,7 @@ class AdminController extends AbstractController
], ],
'data' => $user, 'data' => $user,
'form' => $form, 'form' => $form,
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($admin, $this->entityManager),
] ]
) )
); );
@ -242,31 +250,35 @@ class AdminController extends AbstractController
{ {
/** @var UserRepository $userRepo */ /** @var UserRepository $userRepo */
$userRepo = $this->entityManager->getRepository(User::class); $userRepo = $this->entityManager->getRepository(User::class);
$this->msgs = Libs::getMessages($admin, $this->entityManager);
/** @var User $user */ /** @var User $user */
$user = $userRepo->find($id); $user = $userRepo->find($id);
$prevSup = $this->entityManager->getRepository(Supervision::class)->findBy(['worker' => $user]); $prevSup = $this->entityManager->getRepository(Supervision::class)->findOneBy(['worker' => $user]);
$form = $this->createForm(SupervisorFormType::class); $form = $this->createForm(SupervisorFormType::class);
$form->handleRequest($request); $form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) { if ($form->isSubmitted() && $form->isValid()) {
/** @var User $supervisor */
$supervisor = $form->get('supervisor')->getData(); $supervisor = $form->get('supervisor')->getData();
if ($prevSup) {
if (count($prevSup) > 0) { $prevSup->setSupervisor($supervisor);
$this->entityManager->remove($prevSup[0]); $this->entityManager->persist($prevSup);
$this->entityManager->flush(); $this->entityManager->flush();
} $this->addFlash('success', "Supervisor updated for {$user->getName()}");
} else {
$sup = new Supervision();
$sup->setWorker($user);
$sup->setSupervisor($supervisor);
$sup = new Supervision(); $this->entityManager->persist($sup);
$sup->setSupervisor($supervisor); $this->entityManager->flush();
$sup->setWorker($user); $this->addFlash('success', "Supervisor assigned to {$user->getName()}");
}
$supMsg = MessageFactory::createUser($admin, $supervisor, 'New Case Worker', "You've been assigned a new case worker, {$user->getName()}"); $supMsg = MessageFactory::createUser($admin, $supervisor, 'New Case Worker', "You've been assigned a new case worker, {$user->getName()}");
$userMsg = MessageFactory::createUser($admin, $user, 'New Staff Supervisor', "You've been assigned a new staff supervisor {$supervisor->getName()}"); $userMsg = MessageFactory::createUser($admin, $user, 'New Staff Supervisor', "You've been assigned a new staff supervisor {$supervisor->getName()}");
$this->entityManager->persist($sup);
$this->entityManager->persist($userMsg); $this->entityManager->persist($userMsg);
$this->entityManager->persist($supMsg); $this->entityManager->persist($supMsg);
$this->entityManager->flush(); $this->entityManager->flush();
@ -286,7 +298,7 @@ class AdminController extends AbstractController
'user' => $user, 'user' => $user,
'form' => $form, 'form' => $form,
'supervisors' => $userRepo->getCaseManagers($admin->getCompany()), 'supervisors' => $userRepo->getCaseManagers($admin->getCompany()),
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($admin, $this->entityManager),
] ]
) )
); );

View File

@ -1,17 +1,15 @@
<?php <?php
namespace App\Controller; namespace App\Controller\Case;
use App\Entity\CaseDocument; use App\Entity\Case\CaseLocation;
use App\Entity\CaseLocation; use App\Entity\Company\CompanyDocument;
use App\Entity\CompanyDocument; use App\Entity\Case\Member;
use App\Entity\Location; use App\Entity\Case\MemberCase;
use App\Entity\Member; use App\Entity\System\Location;
use App\Entity\MemberCase; use App\Entity\System\ReferralSource;
use App\Entity\Messages; use App\Entity\System\User;
use App\Entity\ReferralSource; use App\Entity\System\UserCase;
use App\Entity\User;
use App\Entity\UserCase;
use App\Factory\MessageFactory; use App\Factory\MessageFactory;
use App\Form\CaseDocumentFormType; use App\Form\CaseDocumentFormType;
use App\Form\LocationFormType; use App\Form\LocationFormType;
@ -25,17 +23,11 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Http\Attribute\CurrentUser; use Symfony\Component\Security\Http\Attribute\CurrentUser;
class CaseController extends AbstractController class CaseController extends AbstractController
{ {
/**
* Variable to store unread notification messages
*
* @var array
*/
private array $msgs;
public function __construct( public function __construct(
private EntityManagerInterface $entityManager, private EntityManagerInterface $entityManager,
private array $navLinks = [] private array $navLinks = []
@ -47,11 +39,14 @@ class CaseController extends AbstractController
#[Route('/my-cases', name: 'app_my_cases')] #[Route('/my-cases', name: 'app_my_cases')]
public function myCases(#[CurrentUser()] User $user, Request $request): Response public function myCases(#[CurrentUser()] User $user, Request $request): Response
{ {
if (!$this->isGranted('IS_AUTHENTICATED_FULLY')) {
return $this->redirectToRoute('app_login');
}
$this->navLinks['my_cases'] = NavList::PRESENT_LINK; $this->navLinks['my_cases'] = NavList::PRESENT_LINK;
$this->navLinks['case_list'] = 'nav-link text-dark'; $this->navLinks['case_list'] = NavList::DEFAULT;
$ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]); $ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]);
$this->msgs = Libs::getMessages($user, $this->entityManager);
$cases = []; $cases = [];
foreach ($ucs as $uc) { foreach ($ucs as $uc) {
@ -67,11 +62,11 @@ class CaseController extends AbstractController
'breadcrumbs' => [ 'breadcrumbs' => [
( (
strpos($request->server->get('HTTP_REFERER'), 'list-cases') !== false strpos($request->server->get('HTTP_REFERER'), 'list-cases') !== false
? new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases') ? new Breadcrumb($this->generateUrl('app_list_cases'), 'Cases')
: new Breadcrumb($this->generateUrl('app_my_cases'), 'My Cases') : new Breadcrumb($this->generateUrl('app_my_cases'), 'My Cases')
), ),
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'cases' => $cases, 'cases' => $cases,
] ]
) )
@ -85,7 +80,6 @@ class CaseController extends AbstractController
$cases = $this->entityManager->getRepository(MemberCase::class)->findAll(); $cases = $this->entityManager->getRepository(MemberCase::class)->findAll();
$workers = $this->entityManager->getRepository(User::class)->getCaseWorkers(); $workers = $this->entityManager->getRepository(User::class)->getCaseWorkers();
$this->msgs = Libs::getMessages($user, $this->entityManager);
return $this->render( return $this->render(
'internal/admin/cases/list-cases.html.twig', 'internal/admin/cases/list-cases.html.twig',
@ -95,7 +89,7 @@ class CaseController extends AbstractController
'breadcrumbs' => [ 'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases') new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'cases' => $cases, 'cases' => $cases,
'workers' => $workers, 'workers' => $workers,
] ]
@ -111,11 +105,13 @@ class CaseController extends AbstractController
} }
$case = $this->entityManager->getRepository(MemberCase::class)->find($caseId); $case = $this->entityManager->getRepository(MemberCase::class)->find($caseId);
$caseDocs = $this->entityManager->getRepository(CaseDocument::class)->getDocumentsByCase($case);
$compDocs = $this->entityManager->getRepository(CompanyDocument::class)->findBy(['company' => $user->getCompany()]);
$sources = $this->entityManager->getRepository(ReferralSource::class)->findAll();
$this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($this->getUser()); /** @todo validate user has access to case, check for admin, case manager of case worker */
if (!Libs::checkPermissions($user, $case, $this->entityManager)) {
throw new AccessDeniedException();
}
$sources = $this->entityManager->getRepository(ReferralSource::class)->findAll();
return $this->render( return $this->render(
'internal/cases/view-case.html.twig', 'internal/cases/view-case.html.twig',
@ -123,14 +119,12 @@ class CaseController extends AbstractController
$this->navLinks, $this->navLinks,
[ [
'case' => $case, 'case' => $case,
'caseDocs' => $caseDocs,
'compDocs' => $compDocs,
'sources' => $sources, 'sources' => $sources,
'breadcrumbs' => [ 'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases'), new Breadcrumb($this->generateUrl('app_list_cases'), 'Cases'),
new Breadcrumb($this->generateUrl('app_view_case', ['caseId' => $case->getId()]), 'View Case') new Breadcrumb($this->generateUrl('app_view_case', ['caseId' => $case->getId()]), 'View Case')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
] ]
) )
); );
@ -140,11 +134,9 @@ class CaseController extends AbstractController
public function addCase(Request $request, #[CurrentUser()] User $admin): Response public function addCase(Request $request, #[CurrentUser()] User $admin): Response
{ {
$this->denyAccessUnlessGranted('ROLE_ADMIN'); $this->denyAccessUnlessGranted('ROLE_ADMIN');
$this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($admin);
$companyDocs = $this->entityManager->getRepository(CompanyDocument::class)->findBy(['company' => $admin->getCompany()]);
$case = new MemberCase(); $case = new MemberCase();
$form = $this->createForm(MemberCaseFormType::class, $case, ['docs' => $companyDocs]); $form = $this->createForm(MemberCaseFormType::class);
$form->handleRequest($request); $form->handleRequest($request);
@ -169,10 +161,9 @@ class CaseController extends AbstractController
new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases'), new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases'),
new Breadcrumb($this->generateUrl('app_add_case'), 'Add Case') new Breadcrumb($this->generateUrl('app_add_case'), 'Add Case')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($admin, $this->entityManager),
'form' => $form, 'form' => $form,
'sources' => $this->entityManager->getRepository(ReferralSource::class)->retrieveOrderedList(), 'sources' => $this->entityManager->getRepository(ReferralSource::class)->retrieveOrderedList(),
'docs' => $companyDocs,
] ]
) )
); );
@ -182,7 +173,6 @@ class CaseController extends AbstractController
public function editCase(Request $request, #[CurrentUser()] User $admin, string $id): Response public function editCase(Request $request, #[CurrentUser()] User $admin, string $id): Response
{ {
$this->denyAccessUnlessGranted('ROLE_ADMIN'); $this->denyAccessUnlessGranted('ROLE_ADMIN');
$this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($admin);
$case = $this->entityManager->getRepository(MemberCase::class)->find($id); $case = $this->entityManager->getRepository(MemberCase::class)->find($id);
$form = $this->createForm(MemberCaseFormType::class, $case); $form = $this->createForm(MemberCaseFormType::class, $case);
@ -208,7 +198,7 @@ class CaseController extends AbstractController
new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases'), new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases'),
new Breadcrumb($this->generateUrl('app_edit_case', ['id' => $id]), 'Edit Case') new Breadcrumb($this->generateUrl('app_edit_case', ['id' => $id]), 'Edit Case')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($admin, $this->entityManager),
'form' => $form, 'form' => $form,
'case' => $case, 'case' => $case,
'sources' => $this->entityManager->getRepository(ReferralSource::class)->retrieveOrderedList(), 'sources' => $this->entityManager->getRepository(ReferralSource::class)->retrieveOrderedList(),
@ -221,7 +211,6 @@ class CaseController extends AbstractController
public function assignCase(string $id, Request $request, #[CurrentUser()] User $admin): Response public function assignCase(string $id, Request $request, #[CurrentUser()] User $admin): Response
{ {
$this->denyAccessUnlessGranted('ROLE_ADMIN'); $this->denyAccessUnlessGranted('ROLE_ADMIN');
$this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($admin);
$caseWorkers = $this->entityManager->getRepository(User::class)->getCaseWorkers(); $caseWorkers = $this->entityManager->getRepository(User::class)->getCaseWorkers();
$case = $this->entityManager->getRepository(MemberCase::class)->find($id); $case = $this->entityManager->getRepository(MemberCase::class)->find($id);
@ -242,7 +231,11 @@ class CaseController extends AbstractController
$this->entityManager->flush(); $this->entityManager->flush();
} }
$msg = MessageFactory::createNewCase($admin, $user); $msg = MessageFactory::createNewCase(
$admin,
$user,
$this->generateUrl('app_view_case', ['caseId' => $case->getId()->toString()])
);
$this->entityManager->persist($uc); $this->entityManager->persist($uc);
$this->entityManager->persist($msg); $this->entityManager->persist($msg);
@ -263,7 +256,7 @@ class CaseController extends AbstractController
new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases'), new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases'),
new Breadcrumb($this->generateUrl('app_assign_case', ['id' => $id]), 'Assign User') new Breadcrumb($this->generateUrl('app_assign_case', ['id' => $id]), 'Assign User')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($admin, $this->entityManager),
'case' => $case, 'case' => $case,
'form' => $form, 'form' => $form,
'id' => $id, 'id' => $id,
@ -281,7 +274,6 @@ class CaseController extends AbstractController
$this->navLinks['case_list'] = 'nav-link text-dark'; $this->navLinks['case_list'] = 'nav-link text-dark';
$addresses = $this->entityManager->getRepository(Location::class)->getUserLocations($user); $addresses = $this->entityManager->getRepository(Location::class)->getUserLocations($user);
$this->msgs = Libs::getMessages($user, $this->entityManager);
$ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]); $ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]);
$cases = []; $cases = [];
@ -300,7 +292,7 @@ class CaseController extends AbstractController
new Breadcrumb($this->generateUrl('app_my_cases'), 'My Cases'), new Breadcrumb($this->generateUrl('app_my_cases'), 'My Cases'),
new Breadcrumb($this->generateUrl('app_list_case_addresses'), 'List Case Addresses') new Breadcrumb($this->generateUrl('app_list_case_addresses'), 'List Case Addresses')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'addresses' => $addresses, 'addresses' => $addresses,
'cases' => $cases, 'cases' => $cases,
] ]
@ -314,8 +306,6 @@ class CaseController extends AbstractController
$this->navLinks['case_itinerary'] = NavList::PRESENT_LINK; $this->navLinks['case_itinerary'] = NavList::PRESENT_LINK;
$this->navLinks['case_list'] = 'nav-link text-dark'; $this->navLinks['case_list'] = 'nav-link text-dark';
$this->msgs = Libs::getMessages($user, $this->entityManager);
$ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]); $ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]);
$cases = []; $cases = [];
@ -365,7 +355,7 @@ class CaseController extends AbstractController
new Breadcrumb($this->generateUrl('app_list_case_addresses'), 'List Addresses'), new Breadcrumb($this->generateUrl('app_list_case_addresses'), 'List Addresses'),
new Breadcrumb($this->generateUrl('app_case_add_address'), 'Add Case Address') new Breadcrumb($this->generateUrl('app_case_add_address'), 'Add Case Address')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'form' => $form, 'form' => $form,
'cases' => $cases, 'cases' => $cases,
] ]
@ -374,13 +364,11 @@ class CaseController extends AbstractController
} }
#[Route('/addresses/edit/{id}', name: 'app_case_edit_address')] #[Route('/addresses/edit/{id}', name: 'app_case_edit_address')]
public function editCaseAddress(Request $request, string $id): Response public function editCaseAddress(Request $request, string $id, #[CurrentUser()] User $user): Response
{ {
$this->navLinks['case_itinerary'] = NavList::PRESENT_LINK; $this->navLinks['case_itinerary'] = NavList::PRESENT_LINK;
$this->navLinks['case_list'] = 'nav-link text-dark'; $this->navLinks['case_list'] = 'nav-link text-dark';
$this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($this->getUser());
$ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $this->getUser()]); $ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $this->getUser()]);
$lcs = $this->entityManager->getRepository(CaseLocation::class)->findBy(['location' => $id]); $lcs = $this->entityManager->getRepository(CaseLocation::class)->findBy(['location' => $id]);
@ -424,104 +412,9 @@ class CaseController extends AbstractController
'cases' => $cases, 'cases' => $cases,
'inCases' => $inCases, 'inCases' => $inCases,
'form' => $form, 'form' => $form,
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
] ]
) )
); );
} }
#[Route('/assign-case-doc/{caseId}/{memberId}', name: 'app_assign_case_documents')]
public function assignCaseDocument(string $caseId, string $memberId, Request $request, #[CurrentUser()] User $user): Response
{
$this->msgs = Libs::getMessages($user, $this->entityManager);
$case = $this->entityManager->getRepository(MemberCase::class)->find($caseId);
$member = $this->entityManager->getRepository(Member::class)->find($memberId);
$companyDocs = $this->entityManager->getRepository(CompanyDocument::class)->findBy(['company' => $user->getCompany()]);
$form = $this->createForm(CaseDocumentFormType::class, null, ['docs' => $companyDocs]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$docs = $form['document']->getData();
dd($docs);
$this->entityManager->persist($cd);
$this->entityManager->flush();
$this->redirectToRoute('app_case_members', ['id' => $caseId]);
}
return $this->render(
'internal/cases/members/assign-document.html.twig',
array_merge(
$this->navLinks,
[
'notifications' => $this->msgs,
'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_dashboard'), 'Dashboard'),
new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases'),
new Breadcrumb($this->generateUrl('app_case_members', ['id' => $caseId]), 'Case Members')
],
'form' => $form,
'case' => $case,
'member' => $member,
'docs' => $companyDocs,
]
)
);
return new Response();
}
#[Route('/sign-case-doc/{caseId}/{docId}/{memberId}', name: 'app_display_case_document')]
public function displayCaseDocument(string $caseId, string $docId, Request $request, #[CurrentUser()] User $user): Response
{
return new Response();
}
#[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
{
$ret = true;
$user = $this->entityManager->getRepository(User::class)->find($userId);
$case = $this->entityManager->getRepository(MemberCase::class)->find($caseId);
$res = UserCase::checkLevel($user, $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);
}
} }

View File

@ -0,0 +1,31 @@
<?php
namespace App\Controller\Case;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
class GeoapifyController extends AbstractController
{
#[Route('/api/autocomplete-address/{searchText}', name: 'app_api_autocomplete_address')]
public function autocompleteAddress(string $searchText): Response
{
$params = [
'text' => $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);
}
}

View File

@ -1,14 +1,11 @@
<?php <?php
namespace App\Controller; namespace App\Controller\Case;
use App\Entity\CaseItinerary; use App\Entity\Case\CaseItinerary;
use App\Entity\CaseLocation; use App\Entity\Case\MemberCase;;
use App\Entity\Location; use App\Entity\System\User;
use App\Entity\MemberCase; use App\Entity\System\UserCase;
use App\Entity\Messages;
use App\Entity\User;
use App\Entity\UserCase;
use App\Libs\Breadcrumb; use App\Libs\Breadcrumb;
use App\Libs\Libs; use App\Libs\Libs;
use App\Libs\NavList; use App\Libs\NavList;
@ -18,7 +15,6 @@ use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser; use Symfony\Component\Security\Http\Attribute\CurrentUser;
use Symfony\UX\Map\InfoWindow; use Symfony\UX\Map\InfoWindow;
@ -29,8 +25,6 @@ use Symfony\UX\Map\Polyline;
class ItineraryController extends AbstractController class ItineraryController extends AbstractController
{ {
private array $msgs = [];
public function __construct( public function __construct(
private EntityManagerInterface $entityManager, private EntityManagerInterface $entityManager,
private array $navLinks = [] private array $navLinks = []
@ -43,8 +37,6 @@ class ItineraryController extends AbstractController
{ {
$this->navLinks['case_itinerary'] = NavList::PRESENT_LINK; $this->navLinks['case_itinerary'] = NavList::PRESENT_LINK;
$this->msgs = Libs::getMessages($user, $this->entityManager);
$itineraries = $this->entityManager->getRepository(CaseItinerary::class)->getRecentTravel( $itineraries = $this->entityManager->getRepository(CaseItinerary::class)->getRecentTravel(
$user $user
); );
@ -64,7 +56,7 @@ class ItineraryController extends AbstractController
'breadcrumbs' => [ 'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_dashboard'), 'Dashboard'), new Breadcrumb($this->generateUrl('app_dashboard'), 'Dashboard'),
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'itineraries' => $itineraries, 'itineraries' => $itineraries,
'cases' => $cases 'cases' => $cases
] ]
@ -94,8 +86,6 @@ class ItineraryController extends AbstractController
: :
null); null);
$this->msgs = Libs::getMessages($user, $this->entityManager);
$itineraries = $this->entityManager->getRepository(CaseItinerary::class)->getRecentTravel($user, [ $itineraries = $this->entityManager->getRepository(CaseItinerary::class)->getRecentTravel($user, [
'case' => $case, 'case' => $case,
'from' => $startDate, 'from' => $startDate,
@ -160,7 +150,7 @@ class ItineraryController extends AbstractController
new Breadcrumb($this->generateUrl('app_my_cases'), 'My Cases'), new Breadcrumb($this->generateUrl('app_my_cases'), 'My Cases'),
new Breadcrumb($this->generateUrl('app_report_itinerary'), 'Itinerary Report'), new Breadcrumb($this->generateUrl('app_report_itinerary'), 'Itinerary Report'),
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'map' => $map, 'map' => $map,
'total_distance' => $total_distance, 'total_distance' => $total_distance,
'total_duration' => $di->format("%H:%i'%s''"), 'total_duration' => $di->format("%H:%i'%s''"),
@ -168,105 +158,4 @@ class ItineraryController extends AbstractController
) )
); );
} }
#[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'), 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))
->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']);
}
#[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);
}
} }

View File

@ -1,11 +1,13 @@
<?php <?php
namespace App\Controller; namespace App\Controller\Case;
use App\Entity\Member; use App\Entity\Company\CompanyDocument;
use App\Entity\User; use App\Entity\Case\Member;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use App\Entity\Messages; use App\Entity\Case\MemberDocument;
use App\Entity\System\User;
use App\Entity\System\UserCase;
use App\Form\MemberFormType; use App\Form\MemberFormType;
use App\Libs\Breadcrumb; use App\Libs\Breadcrumb;
use App\Libs\Libs; use App\Libs\Libs;
@ -19,13 +21,6 @@ use Symfony\Component\Security\Http\Attribute\CurrentUser;
class MemberController extends AbstractController class MemberController extends AbstractController
{ {
/**
* Variable to store unread notification messages
*
* @var array
*/
private array $msgs;
public function __construct( public function __construct(
private EntityManagerInterface $entityManager, private EntityManagerInterface $entityManager,
private array $navLinks = [], private array $navLinks = [],
@ -37,8 +32,6 @@ class MemberController extends AbstractController
#[Route('/list-members/{id}', name: 'app_case_members')] #[Route('/list-members/{id}', name: 'app_case_members')]
public function listMembers(Request $request, #[CurrentUser()] User $user, string $id): Response public function listMembers(Request $request, #[CurrentUser()] User $user, string $id): Response
{ {
$this->msgs = Libs::getMessages($user, $this->entityManager);
$case = $this->entityManager->getRepository(MemberCase::class)->find($id); $case = $this->entityManager->getRepository(MemberCase::class)->find($id);
$members = $this->entityManager->getRepository(Member::class)->getCaseMembersByName($case); $members = $this->entityManager->getRepository(Member::class)->getCaseMembersByName($case);
@ -51,7 +44,7 @@ class MemberController extends AbstractController
new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases'), new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases'),
new Breadcrumb($this->generateUrl('app_case_members', ['id' => $id]), 'List Members'), new Breadcrumb($this->generateUrl('app_case_members', ['id' => $id]), 'List Members'),
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'case' => $case, 'case' => $case,
'members' => $members, 'members' => $members,
] ]
@ -62,49 +55,50 @@ class MemberController extends AbstractController
#[Route('/add-member/{id}', name: 'app_case_add_member')] #[Route('/add-member/{id}', name: 'app_case_add_member')]
public function addMember(Request $request, #[CurrentUser()] User $user, string $id): Response public function addMember(Request $request, #[CurrentUser()] User $user, string $id): Response
{ {
$this->msgs = Libs::getMessages($user, $this->entityManager);
/** @var MemberCase $case */ /** @var MemberCase $case */
$case = $this->entityManager->getRepository(MemberCase::class)->find($id); $case = $this->entityManager->getRepository(MemberCase::class)->find($id);
/** @var UserCase $userCase */
$userCase = $this->entityManager->getRepository(UserCase::class)->findOneBy(['memberCase' => $case]);
/** @var User $caseWorker */
$caseWorker = $userCase->getUser();
/** @var array $docs<int, CompanyDocuments> */
$docs = $this->entityManager->getRepository(CompanyDocument::class)->findBy(['company' => $user->getCompany()], ['title' => 'ASC']);
$member = new Member(); $member = new Member();
$form = $this->createForm(MemberFormType::class, $member); $form = $this->createForm(MemberFormType::class, $member, ['docs' => $docs]);
$form->handleRequest($request); $form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) { if ($form->isSubmitted() && $form->isValid()) {
$member = $form->getData();
$member->setCaseId($case) $member->setCaseId($case)
->setFirstName($form->get('firstName')->getData()) ->setChild(($form->get('isChild') ? true : false))
->setLastName($form->get('lastName')->getData()) ->setParent(($form->get('isParent') ? true : false))
->setDob($form->get('dob')->getData()) ->setAdultChild(($form->get('isAdultChild') ? true : false))
->setGender($form->get('gender')->getData()) ->setLegalGuardian(($form->get('isLegalGuardian') ? true : false))
->setRace($form->get('race')->getData()) ->setParentsLiveTogether(($form->get('parentsLiveTogether') ? true : false))
->setLanguage($form->get('language')->getData()) ->setDcsApproved(($form->get('dcsApproved') ? true : false))
->setPersonalId($form->get('personalId')->getData())
->setEmergencyContact($form->get('emergencyContact')->getData())
->setEmail($form->get('email')->getData())
->setAddress($form->get('address')->getData())
->setCity($form->get('city')->getData())
->setState($form->get('state')->getData())
->setZip($form->get('zip')->getData())
->setPhone($form->get('phone')->getData())
->setRelationship($form->get('relationship')->getData())
->setDayPhone($form->get('dayPhone')->getData())
->setEveningPhone($form->get('eveningPhone')->getData())
->setCellPhone($form->get('cellPhone')->getData())
->setSchool($form->get('school')->getData())
->setMaritalStatus($form->get('maritalStatus')->getData())
->setChild($form->get('isChild')->getData())
->setParent($form->get('isParent')->getData())
->setAdultChild($form->get('isAdultChild')->getData())
->setLegalGuardian($form->get('isLegalGuardian')->getData())
->setParentsLiveTogether($form->get('parentsLiveTogether')->getData())
->setDcsApproved($form->get('dcsApproved')->getData())
; ;
$this->entityManager->persist($member); $this->entityManager->persist($member);
$this->entityManager->flush(); $this->entityManager->flush();
$selectedDocs = $form->get('docs');
foreach ($selectedDocs->getData() as $doc) {
$dbDoc = $this->entityManager->getRepository(CompanyDocument::class)->find($doc);
if (!$dbDoc) {
continue;
}
$md = new MemberDocument();
$md->setClient($member)
->setDocument($dbDoc)
->setCaseWorker($caseWorker)
;
$this->entityManager->persist($md);
$this->entityManager->flush();
}
$this->addFlash( $this->addFlash(
'success', 'success',
'Member added successfully' 'Member added successfully'
@ -123,9 +117,10 @@ class MemberController extends AbstractController
new Breadcrumb($this->generateUrl('app_case_members', ['id' => $id]), 'List Members'), new Breadcrumb($this->generateUrl('app_case_members', ['id' => $id]), 'List Members'),
new Breadcrumb($this->generateUrl('app_case_add_member', ['id' => $id]), 'Add Member'), new Breadcrumb($this->generateUrl('app_case_add_member', ['id' => $id]), 'Add Member'),
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'case' => $case, 'case' => $case,
'form' => $form->createView(), 'form' => $form->createView(),
'docs' => $docs,
] ]
) )
); );
@ -134,42 +129,54 @@ class MemberController extends AbstractController
#[Route('/case/{caseId}/edit-member/{memberId}', name: 'app_case_edit_member')] #[Route('/case/{caseId}/edit-member/{memberId}', name: 'app_case_edit_member')]
public function editMember(Request $request, #[CurrentUser()] User $user, string $caseId, string $memberId): Response public function editMember(Request $request, #[CurrentUser()] User $user, string $caseId, string $memberId): Response
{ {
$this->msgs = Libs::getMessages($user, $this->entityManager); /** @var Member $member */
$member = $this->entityManager->getRepository(Member::class)->find($memberId); $member = $this->entityManager->getRepository(Member::class)->find($memberId);
/** @var MemberCase $case */
$case = $this->entityManager->getRepository(MemberCase::class)->find($caseId);
$form = $this->createForm(MemberFormType::class, $member); /** @var array<int, CompanyDocuments> $docs */
$docs = $this->entityManager->getRepository(CompanyDocument::class)->findBy(['company' => $user->getCompany()], ['title' => 'ASC']);
/** @var array<int, MemberDocument> $memberDocs */
$memberDocs = $this->entityManager->getRepository(MemberDocument::class)->findBy(['client' => $member]);
$memberDbDocs = [];
foreach($memberDocs as $md) {
$memberDbDocs[] = $md->getDocument()->getId()->toString();
}
foreach ($docs as $idx => $d) {
if (in_array($d->getId()->toString(), $memberDbDocs)) {
$docs[$idx]->setSelected();
}
}
$form = $this->createForm(MemberFormType::class, $member, ['docs' => $docs]);
$form->handleRequest($request); $form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) { if ($form->isSubmitted() && $form->isValid()) {
$member->setFirstName($form->get('firstName')->getData()) $member = $form->getData();
->setLastName($form->get('lastName')->getData()) $member->setChild(($form->get('isChild') ? true : false))
->setDob($form->get('dob')->getData()) ->setParent(($form->get('isParent') ? true : false))
->setGender($form->get('gender')->getData()) ->setAdultChild(($form->get('isAdultChild') ? true : false))
->setRace($form->get('race')->getData()) ->setLegalGuardian(($form->get('isLegalGuardian') ? true : false))
->setLanguage($form->get('language')->getData()) ->setParentsLiveTogether(($form->get('parentsLiveTogether') ? true : false))
->setPersonalId($form->get('personalId')->getData()) ->setDcsApproved(($form->get('dcsApproved') ? true : false))
->setEmergencyContact($form->get('emergencyContact')->getData())
->setEmail($form->get('email')->getData())
->setAddress($form->get('address')->getData())
->setCity($form->get('city')->getData())
->setState($form->get('state')->getData())
->setZip($form->get('zip')->getData())
->setPhone($form->get('phone')->getData())
->setRelationship($form->get('relationship')->getData())
->setDayPhone($form->get('dayPhone')->getData())
->setEveningPhone($form->get('eveningPhone')->getData())
->setCellPhone($form->get('cellPhone')->getData())
->setSchool($form->get('school')->getData())
->setMaritalStatus($form->get('maritalStatus')->getData())
->setChild($form->get('isChild')->getData())
->setParent($form->get('isParent')->getData())
->setAdultChild($form->get('isAdultChild')->getData())
->setLegalGuardian($form->get('isLegalGuardian')->getData())
->setParentsLiveTogether($form->get('parentsLiveTogether')->getData())
->setDcsApproved($form->get('dcsApproved')->getData())
; ;
$this->entityManager->getRepository(MemberDocument::class)->removeUnsigned($member);
$selectedDocs = $form->get('docs')->getData();
foreach ($selectedDocs as $d) {
$md = new MemberDocument();
$md->setClient($member)
->setCaseWorker($user)
->setDocument($d)
;
$this->entityManager->persist($md);
$this->entityManager->flush();
}
$this->entityManager->flush(); $this->entityManager->flush();
$this->addFlash( $this->addFlash(
@ -186,14 +193,16 @@ class MemberController extends AbstractController
$this->navLinks, $this->navLinks,
[ [
'breadcrumbs' => [ 'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_list_cases'), 'List Cases'), new Breadcrumb($this->generateUrl('app_list_cases'), 'Cases'),
new Breadcrumb($this->generateUrl('app_case_members', ['id' => $caseId]), 'List Members'), new Breadcrumb($this->generateUrl('app_case_members', ['id' => $caseId]), 'Members'),
new Breadcrumb($this->generateUrl('app_case_edit_member', ['caseId' => $caseId, 'memberId' => $memberId]), 'Edit Member'), new Breadcrumb($this->generateUrl('app_case_edit_member', ['caseId' => $caseId, 'memberId' => $memberId]), 'Edit Member'),
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'member' => $member, 'member' => $member,
'form' => $form->createView(), 'form' => $form->createView(),
'caseId' => $caseId, 'caseId' => $caseId,
'docs' => $docs,
'selectedDocs' => $memberDbDocs,
] ]
) )
); );

View File

@ -1,27 +1,24 @@
<?php <?php
namespace App\Controller; namespace App\Controller\Case;
use App\Entity\Member; use App\Entity\Case\Member;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use App\Entity\Messages; use App\Entity\Case\Referral;
use App\Entity\Referral; use App\Entity\Case\StandardNote;
use App\Entity\StandardNote; use App\Entity\Case\StandardNoteMember;
use App\Entity\StandardNoteMember; use App\Entity\System\User;
use App\Entity\User; use App\Entity\System\UserCase;
use App\Entity\UserCase; use App\Entity\Case\VisitNote;
use App\Entity\VisitNote; use App\Entity\Case\VisitNoteMembers;
use App\Entity\VisitNoteMembers; use App\Enums\Case\NoteLocation;
use App\Enums\NoteLocation; use App\Enums\Case\NoteMethod;
use App\Enums\NoteMethod; use App\Enums\Case\ReferralServiceType;
use App\Enums\ReferralServiceType;
use App\Form\StandardNoteFormType; use App\Form\StandardNoteFormType;
use App\Form\VisitNoteFormType; use App\Form\VisitNoteFormType;
use App\Libs\Breadcrumb; use App\Libs\Breadcrumb;
use App\Libs\Libs; use App\Libs\Libs;
use App\Libs\NavList; use App\Libs\NavList;
use DateTime;
use DateTimeZone;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
@ -31,13 +28,6 @@ use Symfony\Component\Security\Http\Attribute\CurrentUser;
class NoteController extends AbstractController class NoteController extends AbstractController
{ {
/**
* Variable to store unread notification messages
*
* @var array
*/
private array $msgs;
public function __construct( public function __construct(
private EntityManagerInterface $entityManager, private EntityManagerInterface $entityManager,
private array $navLinks = [], private array $navLinks = [],
@ -49,8 +39,6 @@ class NoteController extends AbstractController
#[Route('/list-notes/{caseId?null}', name: 'app_list_notes')] #[Route('/list-notes/{caseId?null}', name: 'app_list_notes')]
public function listNotes(string $caseId = null, #[CurrentUser()] User $user, Request $request): Response public function listNotes(string $caseId = null, #[CurrentUser()] User $user, Request $request): Response
{ {
$this->msgs = Libs::getMessages($user, $this->entityManager);
/** @var UserCase[] $cases */ /** @var UserCase[] $cases */
$cases = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]); $cases = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $user]);
$caseNotes = null; $caseNotes = null;
@ -78,7 +66,7 @@ class NoteController extends AbstractController
'breadcrumbs' => [ 'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_list_notes'), 'List Notes') new Breadcrumb($this->generateUrl('app_list_notes'), 'List Notes')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'cases' => $cases, 'cases' => $cases,
'caseNotes' => $caseNotes, 'caseNotes' => $caseNotes,
'case' => $case, 'case' => $case,
@ -90,12 +78,15 @@ class NoteController extends AbstractController
#[Route('/add-note/{referralId}', name: 'app_add_note')] #[Route('/add-note/{referralId}', name: 'app_add_note')]
public function addNote(#[CurrentUser()] User $user, Request $request, ?string $referralId = null): Response public function addNote(#[CurrentUser()] User $user, Request $request, ?string $referralId = null): Response
{ {
if (substr($referralId, 0, 4) == 'case') {
throw $this->createNotFoundException('Select Referral from dropdown');
}
/** @var Referral $referral */ /** @var Referral $referral */
$referral = $this->entityManager->getRepository(Referral::class)->find($referralId); $referral = $this->entityManager->getRepository(Referral::class)->find($referralId);
$this->entityManager->getRepository(Referral::class)->populateNotes($referral); $this->entityManager->getRepository(Referral::class)->populateNotes($referral);
$this->msgs = Libs::getMessages($user, $this->entityManager);
$members = $this->entityManager->getRepository(Member::class)->findBy(['caseId' => $referral->getMemberCase()]); $members = $this->entityManager->getRepository(Member::class)->findBy(['memberCase' => $referral->getMemberCase()]);
$defaultMethod = NoteMethod::BILLABLE; $defaultMethod = NoteMethod::BILLABLE;
$defaultLocation = NoteLocation::COMMUNITY_OUTING; $defaultLocation = NoteLocation::COMMUNITY_OUTING;
$form = $this->createForm(StandardNoteFormType::class, null, ['members' => $members]); $form = $this->createForm(StandardNoteFormType::class, null, ['members' => $members]);
@ -124,6 +115,27 @@ class NoteController extends AbstractController
$this->entityManager->persist($note); $this->entityManager->persist($note);
$this->entityManager->flush(); $this->entityManager->flush();
if ($form->get('members')->getData()) {
foreach ($form->get('members')->getData() as $mem) {
if ($referral->getServiceCode() == ReferralServiceType::VS_THBB) {
$nm = new VisitNoteMembers();
$nm->setVisitNote($note)
->setPerson($mem)
;
} else {
$nm = new StandardNoteMember();
$nm->setStandardNote($note)
->setPerson($mem)
;
}
$this->entityManager->persist($nm);
$this->entityManager->flush();
}
}
$this->addFlash('success', 'Note added successfully');
return $this->redirectToRoute('app_list_notes'); return $this->redirectToRoute('app_list_notes');
} }
@ -135,9 +147,10 @@ class NoteController extends AbstractController
'breadcrumbs' => [ 'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_list_notes'), 'List Notes') new Breadcrumb($this->generateUrl('app_list_notes'), 'List Notes')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'referral' => $referral, 'referral' => $referral,
'form' => $form, 'form' => $form,
'members' => $members,
'default_method' => $defaultMethod, 'default_method' => $defaultMethod,
'default_location' => $defaultLocation, 'default_location' => $defaultLocation,
] ]
@ -148,19 +161,25 @@ class NoteController extends AbstractController
#[Route('/edit-note/{noteType}/{noteId}', name: 'app_edit_note')] #[Route('/edit-note/{noteType}/{noteId}', name: 'app_edit_note')]
public function editNote(string $noteId, string $noteType, #[CurrentUser()] User $user, Request $request): Response public function editNote(string $noteId, string $noteType, #[CurrentUser()] User $user, Request $request): Response
{ {
$this->msgs = Libs::getMessages($user, $this->entityManager);
$form = null; $form = null;
$members = [];
/** @var VisitNote|StandardNote $note */ /** @var VisitNote|StandardNote $note */
if ($noteType == 'visit') { if ($noteType == 'visit') {
/** @var VisitNote $note */
$note = $this->entityManager->getRepository(VisitNote::class)->find($noteId); $note = $this->entityManager->getRepository(VisitNote::class)->find($noteId);
$members = $this->entityManager->getRepository(Member::class)->findBy(['memberCase' => $note->getReferral()->getMemberCase()]); $members = $this->entityManager->getRepository(Member::class)->getMembersByCaseAndNote($note->getReferral()->getMemberCase(), $note);
$form = $this->createForm(VisitNoteFormType::class, $note, ['members' => $members]);
$form = $this->createForm(VisitNoteFormType::class, $note, [
'members' => $members,
//'members' => $this->entityManager->getRepository(Member::class)->findBy(['memberCase' => $note->getReferral()->getMemberCase()])
]);
} elseif ($noteType == 'standard') { } elseif ($noteType == 'standard') {
$note = $this->entityManager->getRepository(StandardNote::class)->find($noteId); $note = $this->entityManager->getRepository(StandardNote::class)->find($noteId);
$members = $this->entityManager->getRepository(Member::class)->findBy(['memberCase' => $note->getReferral()->getMemberCase()]);
$form = $this->createForm(StandardNoteFormType::class, $note, ['members' => $members]); $form = $this->createForm(StandardNoteFormType::class, $note, [
'members' => $members,
]);
} }
return $this->render( return $this->render(
@ -171,67 +190,14 @@ class NoteController extends AbstractController
'breadcrumbs' => [ 'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_list_notes'), 'List Notes') new Breadcrumb($this->generateUrl('app_list_notes'), 'List Notes')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'note' => $note, 'note' => $note,
'referral' => $note->getReferral(), 'referral' => $note->getReferral(),
'form' => $form, 'form' => $form,
'noteType' => $noteType 'noteType' => $noteType,
'members' => $members,
] ]
) )
); );
} }
#[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));
}
} }

View File

@ -1,12 +1,11 @@
<?php <?php
namespace App\Controller; namespace App\Controller\Case;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use App\Entity\Messages; use App\Entity\Case\Referral;
use App\Entity\Referral; use App\Entity\System\User;
use App\Entity\User; use App\Entity\System\UserCase;
use App\Entity\UserCase;
use App\Factory\MessageFactory; use App\Factory\MessageFactory;
use App\Form\ReferralFormType; use App\Form\ReferralFormType;
use App\Libs\Breadcrumb; use App\Libs\Breadcrumb;
@ -121,7 +120,6 @@ class ReferralController extends AbstractController
public function editReferral(Request $request, #[CurrentUser()] User $user, string $caseId, string $referralId): Response public function editReferral(Request $request, #[CurrentUser()] User $user, string $caseId, string $referralId): Response
{ {
$this->denyAccessUnlessGranted(['ROLE_ADMIN', 'ROLE_CASE_MANAGER']); $this->denyAccessUnlessGranted(['ROLE_ADMIN', 'ROLE_CASE_MANAGER']);
$this->msgs = Libs::getMessages($user, $this->entityManager);
$referral = $this->entityManager->getRepository(Referral::class)->find($referralId); $referral = $this->entityManager->getRepository(Referral::class)->find($referralId);
$case = $this->entityManager->getRepository(MemberCase::class)->find($caseId); $case = $this->entityManager->getRepository(MemberCase::class)->find($caseId);
@ -152,7 +150,7 @@ class ReferralController extends AbstractController
new Breadcrumb($this->generateUrl('app_list_referrals', ['id' => $case->getId()]), 'Referrals'), new Breadcrumb($this->generateUrl('app_list_referrals', ['id' => $case->getId()]), 'Referrals'),
new Breadcrumb($this->generateUrl('app_case_edit_referral', ['caseId' => $case->getId(), 'referralId' => $referral->getId()]), 'Edit Referral'), new Breadcrumb($this->generateUrl('app_case_edit_referral', ['caseId' => $case->getId(), 'referralId' => $referral->getId()]), 'Edit Referral'),
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'case' => $case, 'case' => $case,
'form' => $form, 'form' => $form,
'referral' => $referral, 'referral' => $referral,

View File

@ -1,10 +1,10 @@
<?php <?php
namespace App\Controller; namespace App\Controller\Company;
use App\Entity\Company; use App\Entity\Company\Company;
use App\Entity\CompanyDocument; use App\Entity\Company\CompanyDocument;
use App\Entity\User; use App\Entity\System\User;
use App\Form\CompanyDocumentFormType; use App\Form\CompanyDocumentFormType;
use App\Form\InternalCompanyFormType; use App\Form\InternalCompanyFormType;
use App\Libs\Breadcrumb; use App\Libs\Breadcrumb;
@ -14,18 +14,17 @@ use DateTime;
use DateTimeZone; use DateTimeZone;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser; use Symfony\Component\Security\Http\Attribute\CurrentUser;
use Symfony\Component\Security\Http\Attribute\IsGranted; use Symfony\Component\Security\Http\Attribute\IsGranted;
use Symfony\Component\String\Slugger\SluggerInterface; use Symfony\Component\String\Slugger\SluggerInterface;
#[IsGranted('ROLE_ADMIN')]
class CompanyController extends AbstractController class CompanyController extends AbstractController
{ {
private array $msgs;
public function __construct( public function __construct(
private EntityManagerInterface $entityManager, private EntityManagerInterface $entityManager,
private array $navLinks = [] private array $navLinks = []
@ -34,13 +33,13 @@ class CompanyController extends AbstractController
} }
#[Route('/company', name: 'app_company')] #[Route('/company', name: 'app_company')]
#[IsGranted(new Expression('is_granted("ROLE_ADMIN")'))]
public function editCompanyInfo( public function editCompanyInfo(
#[CurrentUser()] User $user, #[CurrentUser()] User $user,
Request $request, Request $request,
SluggerInterface $slugger SluggerInterface $slugger
): Response { ): Response {
$this->navLinks['company_nav'] = NavList::PRESENT_LINK; $this->navLinks['company_nav'] = NavList::PRESENT_LINK;
$this->msgs = Libs::getMessages($user, $this->entityManager);
$company = $user->getCompany(); $company = $user->getCompany();
$form = $this->createForm(InternalCompanyFormType::class, $company); $form = $this->createForm(InternalCompanyFormType::class, $company);
@ -78,18 +77,64 @@ class CompanyController extends AbstractController
'breadcrumbs' => [ 'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_admin_dashboard'), "Admin Dashboard"), new Breadcrumb($this->generateUrl('app_admin_dashboard'), "Admin Dashboard"),
], ],
'msgs' => $this->msgs, 'msgs' => Libs::getMessages($user, $this->entityManager),
] ]
) )
); );
} }
#[Route('/company/directory', name: 'app_company_directory')]
public function companyDirectory(#[CurrentUser()] User $user): Response
{
$this->navLinks['company_nav'] = NavList::PRESENT_LINK;
$users = $this->entityManager->getRepository(User::class)->findBy(['company' => $user->getCompany()], ['name' => 'ASC']);
return $this->render(
'internal/admin/company/directory.html.twig',
array_merge(
$this->navLinks,
[
'breadcrumbs' => [
new Breadcrumb(
($this->isGranted('ROLE_ADMIN') ? $this->generateUrl('app_admin_dashboard') : $this->generateUrl('app_dashboard')),
($this->isGranted('ROLE_ADMIN') ? "Admin Dashboard" : "Dashboard")
),
],
'users' => $users,
'notifications' => Libs::getMessages($user, $this->entityManager),
]
)
);
}
#[Route('/user/download-vcard/{id}', name: 'app_download_user_vcard')]
public function downloadUserVcard(#[CurrentUser()] User $user, string $id): Response
{
$coworker = $this->entityManager->getRepository(User::class)->find($id);
if (!$coworker) {
throw new NotFoundHttpException('Coworker not found');
}
if ($coworker->getCompany() !== $user->getCompany()) {
throw new NotFoundHttpException('Coworker not found');
}
return new Response($coworker->generateVCard(), 200, [
'Content-Type' => 'text/vcf',
'Content-Disposition' => 'attachment; filename="' . str_replace(' ', '', $coworker->getName()) . '.vcf"',
'Content-Length' => strlen($coworker->generateVCard()),
'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
'Expires' => '0',
'Pragma' => 'public',
'Content-Transfer-Encoding' => 'binary'
]);
}
#[Route('/docs/list', name: 'app_list_documents')] #[Route('/docs/list', name: 'app_list_documents')]
#[IsGranted(new Expression('is_granted("ROLE_ADMIN")'))]
public function listDocs(#[CurrentUser()] User $user): Response public function listDocs(#[CurrentUser()] User $user): Response
{ {
$this->navLinks['company_nav'] = NavList::PRESENT_LINK; $this->navLinks['company_nav'] = NavList::PRESENT_LINK;
$this->msgs = Libs::getMessages($user, $this->entityManager);
$companyDocs = $this->entityManager->getRepository(CompanyDocument::class)->findBy(['company' => $user->getCompany()], ['title' => 'ASC']); $companyDocs = $this->entityManager->getRepository(CompanyDocument::class)->findBy(['company' => $user->getCompany()], ['title' => 'ASC']);
return $this->render( return $this->render(
@ -98,7 +143,7 @@ class CompanyController extends AbstractController
$this->navLinks, $this->navLinks,
[ [
'breadcrumbs' => [], 'breadcrumbs' => [],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'docs' => $companyDocs, 'docs' => $companyDocs,
] ]
) )
@ -106,10 +151,10 @@ class CompanyController extends AbstractController
} }
#[Route('/docs/add', name: 'app_add_doc')] #[Route('/docs/add', name: 'app_add_doc')]
#[IsGranted(new Expression('is_granted("ROLE_ADMIN")'))]
public function addCompanyDocument(Request $request, #[CurrentUser()] User $user): Response public function addCompanyDocument(Request $request, #[CurrentUser()] User $user): Response
{ {
$this->navLinks['company_nav'] = NavList::PRESENT_LINK; $this->navLinks['company_nav'] = NavList::PRESENT_LINK;
$this->msgs = Libs::getMessages($user, $this->entityManager);
$form = $this->createForm(CompanyDocumentFormType::class); $form = $this->createForm(CompanyDocumentFormType::class);
@ -134,7 +179,7 @@ class CompanyController extends AbstractController
$this->navLinks, $this->navLinks,
[ [
'breadcrumbs' => [], 'breadcrumbs' => [],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'form' => $form, 'form' => $form,
] ]
) )
@ -142,13 +187,13 @@ class CompanyController extends AbstractController
} }
#[Route('/docs/edit/{docId}', name: 'app_edit_doc')] #[Route('/docs/edit/{docId}', name: 'app_edit_doc')]
#[IsGranted(new Expression('is_granted("ROLE_ADMIN")'))]
public function editCompanyDocument(string $docId, Request $request, #[CurrentUser()] User $user): Response public function editCompanyDocument(string $docId, Request $request, #[CurrentUser()] User $user): Response
{ {
$companyDoc = $this->entityManager->getRepository(CompanyDocument::class)->find($docId); $companyDoc = $this->entityManager->getRepository(CompanyDocument::class)->find($docId);
$this->navLinks['company_nav'] = NavList::PRESENT_LINK; $this->navLinks['company_nav'] = NavList::PRESENT_LINK;
$this->msgs = Libs::getMessages($user, $this->entityManager); checkdate(1, 1, 1);
$form = $this->createForm(CompanyDocumentFormType::class, $companyDoc); $form = $this->createForm(CompanyDocumentFormType::class, $companyDoc);
$form->handleRequest($request); $form->handleRequest($request);
@ -171,7 +216,7 @@ class CompanyController extends AbstractController
$this->navLinks, $this->navLinks,
[ [
'breadcrumbs' => [], 'breadcrumbs' => [],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'form' => $form, 'form' => $form,
'doc' => $companyDoc, 'doc' => $companyDoc,
'docText' => str_replace("\r\n", "", $companyDoc->getText()) 'docText' => str_replace("\r\n", "", $companyDoc->getText())

View File

@ -0,0 +1,82 @@
<?php
namespace App\Controller\Company;
use App\Entity\Company\CompanyDocument;
use App\Entity\Case\Member;
use App\Entity\Case\MemberDocument;
use App\Entity\System\User;
use App\Libs\Breadcrumb;
use App\Libs\NavList;
use App\Libs\Libs;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser;
class DocumentController extends AbstractController
{
public function __construct(
private EntityManagerInterface $entityManager,
private array $navLinks = []
) {
$this->navLinks = NavList::LIST;
}
#[Route('/member/{memberId}', name: 'app_display_case_doc')]
public function displayCaseDocument(string $memberId, #[CurrentUser()] User $user): Response
{
/** @var Member $member */
$member = $this->entityManager->getRepository(Member::class)->find($memberId);
$memberDocs = $this->entityManager->getRepository(MemberDocument::class)->findBy(['client' => $member]);
return $this->render(
'internal/cases/members/documents/list-member-docs.html.twig',
array_merge(
$this->navLinks,
[
'notifications' => Libs::getMessages($user, $this->entityManager),
'breadcrumbs' => [
new Breadcrumb($this->generateUrl('app_my_cases'), 'Cases'),
new Breadcrumb($this->generateUrl('app_case_members', ['id' => $member->getCaseId()->getId()->toString()]), 'Members'),
],
'docs' => $memberDocs,
]
)
);
}
#[Route('/member/{memberId}/document/{docId}/sign', name: 'app_member_sign_case_doc')]
public function signCaseDocument(string $memberId, string $docId, #[CurrentUser()] User $user, Request $request): Response
{
/** @var Member $member */
$member = $this->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,
'caseWorker' => $user
]);
if (!$memDoc) {
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,
'caseWorkerSignature' => $user->getSignature(),
]
);
}
}

View File

@ -1,44 +0,0 @@
<?php
namespace App\Controller;
use App\Libs\NavList;
use App\Libs\Libs;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser;
class DocumentController extends AbstractController
{
public function __construct(
private EntityManagerInterface $entityManager,
private array $navLinks = []
) {
$this->navLinks = NavList::LIST;
}
#[Route('/case/{caseId}/doc/{docId}', name: 'app_display_case_doc')]
public function displayCaseDocument(string $caseId, string $docId, #[CurrentUser()] User $user): Response
{
$msgs = Libs::getMessages($user, $this->entityManager);
$case = $this->entityManager->getRepository(MemberCase::class)->find($caseId);
$doc = $this->entityManager->getRepository(CompanyDocument::class)->find($docId);
$caseDoc = $this->entityManager->getRepository(CaseDocument::class)->getCaseDocument($case, $doc);
return $this->render(
'internal/cases/documents/display-case-doc.html.twig',
array_merge(
$this->navLinks,
[
'msgs' => $msgs,
'notificationCount' => count($msgs),
'breadcrumbs' => []
]
)
);
}
}

View File

@ -1,10 +1,9 @@
<?php <?php
namespace App\Controller; namespace App\Controller\Resources;
use App\Entity\CommunityResource; use App\Entity\Resources\CommunityResource;
use App\Entity\Messages; use App\Entity\System\User;
use App\Entity\User;
use App\Form\ResourceFormType; use App\Form\ResourceFormType;
use App\Libs\Breadcrumb; use App\Libs\Breadcrumb;
use App\Libs\Libs; use App\Libs\Libs;
@ -22,13 +21,6 @@ use Symfony\UX\Map\Point;
class CommunityResourceController extends AbstractController class CommunityResourceController extends AbstractController
{ {
/**
* Variable to store unread notification messages
*
* @var array
*/
private array $msgs;
public function __construct( public function __construct(
private readonly EntityManagerInterface $entityManager, private readonly EntityManagerInterface $entityManager,
private array $navLinks = [] private array $navLinks = []
@ -41,7 +33,6 @@ class CommunityResourceController extends AbstractController
public function list(#[CurrentUser()] User $user): Response public function list(#[CurrentUser()] User $user): Response
{ {
$rsc = $this->entityManager->getRepository(CommunityResource::class)->findAll(); $rsc = $this->entityManager->getRepository(CommunityResource::class)->findAll();
$this->msgs = Libs::getMessages($user, $this->entityManager);
return $this->render( return $this->render(
'internal/community_resource/list.html.twig', 'internal/community_resource/list.html.twig',
@ -52,7 +43,7 @@ class CommunityResourceController extends AbstractController
new Breadcrumb('#', 'Community Resources') new Breadcrumb('#', 'Community Resources')
], ],
'resources' => $rsc, 'resources' => $rsc,
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
] ]
) )
); );
@ -61,8 +52,6 @@ class CommunityResourceController extends AbstractController
#[Route('/resource/map', name: 'app_community_resource_map')] #[Route('/resource/map', name: 'app_community_resource_map')]
public function map(#[CurrentUser()] User $user): Response public function map(#[CurrentUser()] User $user): Response
{ {
$this->msgs = Libs::getMessages($user, $this->entityManager);
$rcs = $this->entityManager->getRepository(CommunityResource::class)->findAll(); $rcs = $this->entityManager->getRepository(CommunityResource::class)->findAll();
$map = new Map('default'); $map = new Map('default');
@ -94,7 +83,7 @@ class CommunityResourceController extends AbstractController
new Breadcrumb($this->generateUrl('app_community_resource'), 'List Resources'), new Breadcrumb($this->generateUrl('app_community_resource'), 'List Resources'),
new Breadcrumb('#', 'Community Resources') new Breadcrumb('#', 'Community Resources')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
] ]
) )
); );
@ -103,8 +92,6 @@ class CommunityResourceController extends AbstractController
#[Route('/resource/add', name: 'app_community_resource_add')] #[Route('/resource/add', name: 'app_community_resource_add')]
public function add(#[CurrentUser()] User $user, Request $request): Response public function add(#[CurrentUser()] User $user, Request $request): Response
{ {
$this->msgs = Libs::getMessages($user, $this->entityManager);
$form = $this->createForm(ResourceFormType::class); $form = $this->createForm(ResourceFormType::class);
$form->handleRequest($request); $form->handleRequest($request);
@ -142,7 +129,7 @@ class CommunityResourceController extends AbstractController
new Breadcrumb($this->generateUrl('app_community_resource'), 'List Resources'), new Breadcrumb($this->generateUrl('app_community_resource'), 'List Resources'),
new Breadcrumb('#', 'Add Resource') new Breadcrumb('#', 'Add Resource')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
] ]
) )
); );
@ -152,8 +139,6 @@ class CommunityResourceController extends AbstractController
#[Route('/resource/edit/{id}', name: 'app_community_resource_edit')] #[Route('/resource/edit/{id}', name: 'app_community_resource_edit')]
public function edit(string $id, #[CurrentUser()] User $user, Request $request): Response public function edit(string $id, #[CurrentUser()] User $user, Request $request): Response
{ {
$this->msgs = Libs::getMessages($user, $this->entityManager);
$rsc = $this->entityManager->getRepository(CommunityResource::class)->find($id); $rsc = $this->entityManager->getRepository(CommunityResource::class)->find($id);
$form = $this->createForm(ResourceFormType::class, $rsc); $form = $this->createForm(ResourceFormType::class, $rsc);
@ -189,7 +174,7 @@ class CommunityResourceController extends AbstractController
new Breadcrumb($this->generateUrl('app_community_resource'), 'List Resources'), new Breadcrumb($this->generateUrl('app_community_resource'), 'List Resources'),
new Breadcrumb('#', 'Edit Resource') new Breadcrumb('#', 'Edit Resource')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
] ]
) )
); );
@ -217,13 +202,4 @@ class CommunityResourceController extends AbstractController
'Content-Transfer-Encoding' => 'binary' 'Content-Transfer-Encoding' => 'binary'
]); ]);
} }
#[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'];
$resources = $this->entityManager->getRepository(CommunityResource::class)->findBy(['county' => $county]);
return $this->json($resources);
}
} }

View File

@ -1,13 +1,12 @@
<?php <?php
namespace App\Controller; namespace App\Controller\Staff;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use App\Entity\Messages; use App\Entity\Staff\StaffNote;
use App\Entity\StaffNote; use App\Entity\Staff\Supervision;
use App\Entity\Supervision; use App\Entity\System\User;
use App\Entity\User; use App\Entity\System\UserCase;
use App\Entity\UserCase;
use App\Factory\MessageFactory; use App\Factory\MessageFactory;
use App\Form\StaffNoteFormType; use App\Form\StaffNoteFormType;
use App\Form\SupervisorStaffNoteFormType; use App\Form\SupervisorStaffNoteFormType;
@ -20,6 +19,7 @@ use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser; use Symfony\Component\Security\Http\Attribute\CurrentUser;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
class StaffController extends AbstractController class StaffController extends AbstractController
{ {
@ -82,7 +82,14 @@ class StaffController extends AbstractController
$this->navLinks['staff_notes'] = NavList::PRESENT_LINK; $this->navLinks['staff_notes'] = NavList::PRESENT_LINK;
foreach ($ucs as $uc) { 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( return $this->render(
@ -109,15 +116,26 @@ class StaffController extends AbstractController
if (!$this->isGranted('IS_AUTHENTICATED_FULLY')) { if (!$this->isGranted('IS_AUTHENTICATED_FULLY')) {
return $this->redirectToRoute('app_login'); return $this->redirectToRoute('app_login');
} }
$this->msgs = Libs::getMessages($user, $this->entityManager);
$staff = $this->entityManager->getRepository(User::class)->find($staffId); $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]); $ucs = $this->entityManager->getRepository(UserCase::class)->findBy(['user' => $staff]);
$cases = []; $cases = [];
foreach ($ucs as $case) { foreach ($ucs as $uc) {
/** @var UserCase $case */ /** @var MemberCase $case */
$cases[] = $case->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( return $this->render(
@ -131,7 +149,7 @@ class StaffController extends AbstractController
new Breadcrumb($this->generateUrl('app_staff_dashboard'), 'Staff Dashboard'), 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),
] ]
) )
); );

View File

@ -0,0 +1,274 @@
<?php
namespace App\Controller\System;
use App\Entity\Case\CaseItinerary;
use App\Entity\Case\CaseLocation;
use App\Entity\Resources\CommunityResource;
use App\Entity\Case\MemberCase;;
use App\Entity\Case\Referral;
use App\Entity\Case\StandardNote;
use App\Entity\Case\StandardNoteMember;
use App\Entity\System\Location;
use App\Entity\System\User;
use App\Entity\System\UserCase;
use App\Entity\Case\VisitNote;
use App\Entity\Case\VisitNoteMembers;
use App\Libs\Libs;
use DateTime;
use DateTimeZone;
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\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser;
class AjaxController extends AbstractController
{
public function __construct(
private EntityManagerInterface $entityManager,
) {
}
#[Route('/api/itinerary/{id}/add', name: 'ajax_itinerary_add')]
public function addItinerary(string $id, Request $request): Response
{
$itinerary = $this->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));
}
}

View File

@ -1,19 +1,25 @@
<?php <?php
namespace App\Controller; namespace App\Controller\System;
use App\Entity\Messages; use App\Entity\System\User;
use App\Entity\User;
use App\Libs\Breadcrumb; use App\Libs\Breadcrumb;
use App\Libs\Dashboard;
use App\Libs\Libs;
use App\Libs\NavList; use App\Libs\NavList;
use DateInterval;
use DateTime; use DateTime;
use DateTimeInterface;
use DateTimeZone;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\FileType; use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType; use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType; use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
@ -22,19 +28,9 @@ use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Attribute\CurrentUser; use Symfony\Component\Security\Http\Attribute\CurrentUser;
use Symfony\Component\String\Slugger\SluggerInterface; use Symfony\Component\String\Slugger\SluggerInterface;
use Vich\UploaderBundle\Entity\File;
class DefaultController extends AbstractController class DefaultController extends AbstractController
{ {
/**
* Variable to store unread notification messages
*
* @var array
*/
private array $msgs;
private int $notificationCount = 0;
public function __construct( public function __construct(
private readonly EntityManagerInterface $entityManager, private readonly EntityManagerInterface $entityManager,
private readonly UserPasswordHasherInterface $userPasswordHasher, private readonly UserPasswordHasherInterface $userPasswordHasher,
@ -43,31 +39,54 @@ class DefaultController extends AbstractController
$this->navLinks = NavList::LIST; $this->navLinks = NavList::LIST;
} }
#[Route('/up', name: 'app_up')]
public function up(): Response
{
$cnx = $this->entityManager->getConnection();
$cnx->connect();
$connected = $cnx->isConnected();
if ($connected) {
return $this->json(true, Response::HTTP_OK);
} else {
return $this->json(false, Response::HTTP_SERVICE_UNAVAILABLE);
}
}
#[Route('/dashboard', name: 'app_dashboard')] #[Route('/dashboard', name: 'app_dashboard')]
public function dashboard(Request $request, #[CurrentUser()] ?User $user): Response public function dashboard(Request $request, #[CurrentUser()] ?User $user): Response
{ {
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY'); $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($user);
$this->notificationCount = $this->entityManager->getRepository(Messages::class)->getUnreadMessageCount($user);
if (!$user->getCompany()) { if (!$user->getCompany()) {
return $this->redirectToRoute('app_register_step', ['step' => RegistrationController::REGISTER_STEP_TWO]); return $this->redirectToRoute('app_register_step', ['step' => RegistrationController::REGISTER_STEP_TWO]);
} }
$oldPasswordDate = new DateTime('now', new DateTimeZone($_ENV['COMPANY_TIMEZONE']));
$oldPasswordDate->sub(DateInterval::createFromDateString('120 days'));
if (is_a($user->getPasswordChanged(), DateTimeInterface::class) && $user->getPasswordChanged() < $oldPasswordDate) {
$this->addFlash('danger', 'You must change your password');
return $this->redirectToRoute('app_profile');
}
if(isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] == "{$_SERVER['HTTP_X_FORWARDED_PROTO']}://{$_SERVER['HTTP_HOST']}/") {
$this->entityManager->getRepository(User::class)->updateLastLogin($user);
}
$dashboard = new Dashboard($this->entityManager, $user);
$this->navLinks['user_dashboard'] = NavList::PRESENT_LINK; $this->navLinks['user_dashboard'] = NavList::PRESENT_LINK;
return $this->render( return $this->render(
'internal/dashboard.html.twig', 'internal/dashboard.html.twig',
array_merge( array_merge(
$this->navLinks, $this->navLinks,
$dashboard->toArray(),
[ [
'breadcrumbs' => [ 'breadcrumbs' => [
new Breadcrumb('', 'Dashboard') new Breadcrumb('', 'Dashboard')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'notificationCount' => $this->notificationCount,
'milesTravelledYTD' => 0,
'milesTravelled30Days' => 0,
] ]
) )
); );
@ -80,8 +99,6 @@ class DefaultController extends AbstractController
SluggerInterface $slugger SluggerInterface $slugger
): Response { ): Response {
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY'); $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$this->msgs = $this->entityManager->getRepository(Messages::class)->getUnreadMessages($user);
$this->notificationCount = $this->entityManager->getRepository(Messages::class)->getUnreadMessageCount($user);
$this->navLinks['profile'] = NavList::PRESENT_LINK; $this->navLinks['profile'] = NavList::PRESENT_LINK;
@ -104,11 +121,18 @@ class DefaultController extends AbstractController
'first_options' => ['label' => 'Password', 'label_attr' => ['class' => 'form-label']], 'first_options' => ['label' => 'Password', 'label_attr' => ['class' => 'form-label']],
'second_options' => ['label' => 'Repeat Password', 'label_attr' => ['class' => 'form-label']], 'second_options' => ['label' => 'Repeat Password', 'label_attr' => ['class' => 'form-label']],
]) ])
->add('personalPhone', TelType::class, [
'label' => 'Personal Phone',
])
->add('workPhone', TelType::class, [
'label' => 'Work Phone',
])
->add('imageName', FileType::class, [ ->add('imageName', FileType::class, [
'label' => 'Profile Picture', 'label' => 'Profile Picture',
'required' => false, 'required' => false,
'mapped' => false 'mapped' => false
]) ])
->add('signature', HiddenType::class)
->add('submit', SubmitType::class, [ ->add('submit', SubmitType::class, [
'label' => 'Save Profile', 'label' => 'Save Profile',
'attr' => ['class' => 'btn btn-lg bg-gradient-dark btn-lg w-100 mt-4 mb-0'] 'attr' => ['class' => 'btn btn-lg bg-gradient-dark btn-lg w-100 mt-4 mb-0']
@ -119,6 +143,11 @@ class DefaultController extends AbstractController
$form->handleRequest($request); $form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) { if ($form->isSubmitted() && $form->isValid()) {
if ($form->get('signature')->getData()) {
$signature = $form->get('signature')->getData();
$user->setSignature($signature);
}
$firstPassword = $form->get('password')['first']->getData(); $firstPassword = $form->get('password')['first']->getData();
$secondPassword = $form->get('password')['second']->getData(); $secondPassword = $form->get('password')['second']->getData();
@ -136,7 +165,7 @@ class DefaultController extends AbstractController
$plainPassword $plainPassword
) )
); );
$user->setPasswordChanged(new DateTime()) $user->setPasswordChanged(new DateTime('now', new DateTimeZone($_ENV['COMPANY_TIMEZONE'])));
} }
if ($form['imageName']->getData()) { if ($form['imageName']->getData()) {
@ -158,6 +187,16 @@ class DefaultController extends AbstractController
$user->setImageName($newFilename); $user->setImageName($newFilename);
} }
if ($form['personalPhone']->getData()) {
$phone = Libs::Phone($form['personalPhone']->getData());
$user->setPersonalPhone($phone);
}
if ($form['workPhone']->getData()) {
$phone = Libs::Phone($form['workPhone']->getData());
$user->setWorkPhone($phone);
}
$this->entityManager->persist($user); $this->entityManager->persist($user);
$this->entityManager->flush(); $this->entityManager->flush();
@ -174,18 +213,25 @@ class DefaultController extends AbstractController
'breadcrumbs' => [ 'breadcrumbs' => [
new Breadcrumb('', 'Profile') new Breadcrumb('', 'Profile')
], ],
'notifications' => $this->msgs, 'notifications' => Libs::getMessages($user, $this->entityManager),
'notificationCount' => $this->notificationCount,
'currentUser' => $user, 'currentUser' => $user,
'signaturePresent' => ($user->getSignature() ? true : false),
'signature' => $user->getSignature(),
'form' => $form->createView(), 'form' => $form->createView(),
] ]
) )
); );
} }
#[Route('/uploads/user_images/{imageName}', name: 'app_user_image')] #[Route('/uploads/user_images/{imageName}', name: 'app_user_profile_image')]
public function displayUserImage(string $imageName): Response public function displayUserImage(string $imageName): Response
{ {
return new BinaryFileResponse($this->getParameter('kernel.project_dir')."/public/uploads/user_images/{$imageName}"); return new BinaryFileResponse("{$this->getParameter('kernel.project_dir')}/public/{$_ENV['USER_IMAGE_PATH']}/{$imageName}");
}
#[Route('/uploads/company_images/{companyLogo}', name: 'app_company_logo')]
public function displayCompanyLogo(string $companyLogo): Response
{
return new BinaryFileResponse("{$this->getParameter('kernel.project_dir')}/public/{$_ENV['COMPANY_IMAGE_PATH']}/{$companyLogo}");
} }
} }

View File

@ -1,12 +1,11 @@
<?php <?php
namespace App\Controller; namespace App\Controller\System;
use App\Entity\Messages; use App\Entity\System\Messages;
use App\Entity\Supervision; use App\Entity\Staff\Supervision;
use App\Entity\User; use App\Entity\System\User;
use App\Enums\MessageType; use App\Enums\System\MessageType;
use App\Libs\Libs;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@ -49,8 +48,6 @@ class MessageController extends AbstractController
$message->setMessage($data['message']); $message->setMessage($data['message']);
$message->setType(MessageType::GENERAL); $message->setType(MessageType::GENERAL);
//dd($message);
$this->entityManager->persist($message); $this->entityManager->persist($message);
$this->entityManager->flush(); $this->entityManager->flush();

View File

@ -1,10 +1,9 @@
<?php <?php
namespace App\Controller; namespace App\Controller\System;
use App\Entity\Messages; use App\Entity\System\ReferralSource;
use App\Entity\ReferralSource; use App\Entity\System\User;
use App\Entity\User;
use App\Form\ReferralSourceFormType; use App\Form\ReferralSourceFormType;
use App\Libs\Breadcrumb; use App\Libs\Breadcrumb;
use App\Libs\Libs; use App\Libs\Libs;

View File

@ -1,12 +1,11 @@
<?php <?php
namespace App\Controller; namespace App\Controller\System;
use App\DataTransferObject\CompanyDetailsDto; use App\DataTransferObject\CompanyDetailsDto;
use App\Entity\User; use App\Entity\System\User;
use App\Enums\CaseLevel; use App\Enums\Case\CaseLevel;
use App\Enums\JobType; use App\Enums\System\RateType;
use App\Enums\RateType;
use App\Factory\CompanyFactory; use App\Factory\CompanyFactory;
use App\Form\CompanyFormType; use App\Form\CompanyFormType;
use App\Form\RegistrationFormType; use App\Form\RegistrationFormType;
@ -80,11 +79,7 @@ class RegistrationController extends AbstractController
) )
); );
$user->setCaseWorker(true) $user->setRateType(RateType::FIXED)
->setCaseManager(true)
->setTherapist(true)
->setSu(true)
->setRateType(RateType::FIXED)
->setRate('0.00') ->setRate('0.00')
->setRoles(['ROLE_ADMIN']) ->setRoles(['ROLE_ADMIN'])
->setLevel(CaseLevel::ADMIN); ->setLevel(CaseLevel::ADMIN);

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Controller; namespace App\Controller\System;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;

View File

@ -2,12 +2,12 @@
namespace App\DataFixtures; namespace App\DataFixtures;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use App\Entity\ReferralSource; use App\Entity\System\ReferralSource;
use App\Entity\User; use App\Entity\System\User;
use App\Entity\UserCase; use App\Entity\System\UserCase;
use App\Enums\CaseLevel; use App\Enums\Case\CaseLevel;
use App\Enums\County; use App\Enums\System\County;
use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface; use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager; use Doctrine\Persistence\ObjectManager;

View File

@ -2,12 +2,12 @@
namespace App\DataFixtures; namespace App\DataFixtures;
use App\Entity\Member; use App\Entity\Case\Member;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use App\Enums\GenderType; use App\Enums\System\GenderType;
use App\Enums\RaceType; use App\Enums\Case\RaceType;
use App\Enums\RelationshipType; use App\Enums\Case\RelationshipType;
use App\Enums\State; use App\Enums\System\State;
use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface; use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager; use Doctrine\Persistence\ObjectManager;

View File

@ -2,15 +2,15 @@
namespace App\DataFixtures; namespace App\DataFixtures;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use App\Entity\Referral; use App\Entity\Case\Referral;
use App\Entity\StandardNote; use App\Entity\Case\StandardNote;
use App\Entity\VisitNote; use App\Entity\Case\VisitNote;
use App\Enums\NoteLocation; use App\Enums\Case\NoteLocation;
use App\Enums\NoteMethod; use App\Enums\Case\NoteMethod;
use App\Enums\NoteStatus; use App\Enums\Case\NoteStatus;
use App\Enums\ReferralServiceType; use App\Enums\Case\ReferralServiceType;
use App\Enums\VisitQualityLevel; use App\Enums\Case\VisitQualityLevel;
use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface; use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager; use Doctrine\Persistence\ObjectManager;

View File

@ -2,9 +2,9 @@
namespace App\DataFixtures; namespace App\DataFixtures;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use App\Entity\Referral; use App\Entity\Case\Referral;
use App\Enums\ReferralServiceType; use App\Enums\Case\ReferralServiceType;
use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface; use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager; use Doctrine\Persistence\ObjectManager;

View File

@ -2,8 +2,8 @@
namespace App\DataFixtures; namespace App\DataFixtures;
use App\Entity\ReferralSource; use App\Entity\System\ReferralSource;
use App\Enums\County; use App\Enums\System\County;
use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager; use Doctrine\Persistence\ObjectManager;
use Faker\Factory; use Faker\Factory;

View File

@ -2,9 +2,9 @@
namespace App\DataFixtures; namespace App\DataFixtures;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use App\Entity\StaffNote; use App\Entity\Staff\StaffNote;
use App\Enums\ReferralServiceType; use App\Enums\Case\ReferralServiceType;
use DateTime; use DateTime;
use DateTimeZone; use DateTimeZone;
use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Bundle\FixturesBundle\Fixture;

View File

@ -2,10 +2,10 @@
namespace App\DataFixtures; namespace App\DataFixtures;
use App\Entity\Company; use App\Entity\Company\Company;
use App\Entity\User; use App\Entity\System\User;
use App\Enums\CaseLevel; use App\Enums\Case\CaseLevel;
use App\Enums\RateType; use App\Enums\System\RateType;
use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager; use Doctrine\Persistence\ObjectManager;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
@ -47,10 +47,6 @@ class UserFixture extends Fixture
$user->setName($name) $user->setName($name)
->setUsername($username) ->setUsername($username)
->setEmail($username.'@counselingpartnersllc.com') ->setEmail($username.'@counselingpartnersllc.com')
->setCaseManager($cm)
->setCaseWorker($cw)
->setTherapist($t)
->setSu($su)
->setRoles($roles) ->setRoles($roles)
->setRateType($gen->randomElement(RateType::class)) ->setRateType($gen->randomElement(RateType::class))
->setRate($gen->numberBetween(0, 100)) ->setRate($gen->numberBetween(0, 100))

View File

@ -1,8 +1,10 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Case;
use App\Repository\CaseItineraryRepository; use App\Entity\System\Location;
use App\Repository\Case\CaseItineraryRepository;
use DateTime;
use DateInterval; use DateInterval;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
@ -19,6 +21,9 @@ class CaseItinerary
#[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')] #[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
private ?Uuid $id = null; private ?Uuid $id = null;
#[ORM\Column(type: Types::DATE_MUTABLE)]
private ?\DateTimeInterface $date = null;
#[ORM\Column(type: Types::TIME_MUTABLE, nullable: true)] #[ORM\Column(type: Types::TIME_MUTABLE, nullable: true)]
private ?\DateTimeInterface $departure = null; private ?\DateTimeInterface $departure = null;
@ -26,9 +31,6 @@ class CaseItinerary
#[ORM\JoinColumn(nullable: false)] #[ORM\JoinColumn(nullable: false)]
private ?Location $originLocation = null; private ?Location $originLocation = null;
#[ORM\Column(type: Types::TIME_MUTABLE, nullable: true)]
private ?\DateTimeInterface $arrival = null;
#[ORM\ManyToOne] #[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: false)] #[ORM\JoinColumn(nullable: false)]
private ?Location $destLocation = null; private ?Location $destLocation = null;
@ -43,9 +45,6 @@ class CaseItinerary
#[ORM\JoinColumn(nullable: false)] #[ORM\JoinColumn(nullable: false)]
private ?MemberCase $memberCase = null; private ?MemberCase $memberCase = null;
#[ORM\Column(type: Types::DATE_MUTABLE)]
private ?\DateTimeInterface $date = null;
#[ORM\Column(nullable: true)] #[ORM\Column(nullable: true)]
private ?float $distance = null; private ?float $distance = null;
@ -81,18 +80,6 @@ class CaseItinerary
return $this; return $this;
} }
public function getArrival(): ?\DateTimeInterface
{
return $this->arrival;
}
public function setArrival(?\DateTimeInterface $arrival): static
{
$this->arrival = $arrival;
return $this;
}
public function getDestLocation(): ?Location public function getDestLocation(): ?Location
{ {
return $this->destLocation; return $this->destLocation;
@ -132,7 +119,7 @@ class CaseItinerary
public function calcDuration() public function calcDuration()
{ {
$this->duration = $this->departure - $this->arrival; //$this->duration = $this->departure - $this->arrival;
} }
public function getMemberCase(): ?MemberCase public function getMemberCase(): ?MemberCase
@ -203,10 +190,13 @@ class CaseItinerary
public function destinationInfoWindow(): string public function destinationInfoWindow(): string
{ {
/** @var DateTime $arrival */
$arrival = $this->departure;
$arrival->add($this->duration);
return <<<EOL return <<<EOL
{$this->destLocation->getName()}<br/> {$this->destLocation->getName()}<br/>
<a href='http://maps.google.com/?q={$this->destLocation->getLat()},{$this->destLocation->getLon()}'>{$this->destLocation->getFormattedAddress()}</a><br/> <a href='http://maps.google.com/?q={$this->destLocation->getLat()},{$this->destLocation->getLon()}'>{$this->destLocation->getFormattedAddress()}</a><br/>
{$this->arrival->format("g:i a")} {$arrival->format("g:i a")}
EOL; EOL;
} }
} }

View File

@ -1,8 +1,9 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Case;
use App\Repository\CaseLocationRepository; use App\Entity\System\Location;
use App\Repository\Case\CaseLocationRepository;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\Uid\Uuid; use Symfony\Component\Uid\Uuid;

View File

@ -1,11 +1,11 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Case;
use App\Enums\GenderType; use App\Enums\System\GenderType;
use App\Enums\RaceType; use App\Enums\Case\RaceType;
use App\Enums\RelationshipType; use App\Enums\Case\RelationshipType;
use App\Repository\MemberRepository; use App\Repository\Case\MemberRepository;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;
@ -103,11 +103,19 @@ class Member
#[ORM\Column] #[ORM\Column]
private ?bool $dcsApproved = null; private ?bool $dcsApproved = null;
private ?bool $checked = false;
public function getId(): ?Uuid public function getId(): ?Uuid
{ {
return $this->id; return $this->id;
} }
public function setId(?Uuid $id): static
{
$this->id = $id;
return $this;
}
public function getCaseId(): ?MemberCase public function getCaseId(): ?MemberCase
{ {
return $this->memberCase; return $this->memberCase;
@ -451,4 +459,16 @@ class Member
return $this; return $this;
} }
public function isChecked(): bool
{
return $this->checked;
}
public function setChecked(bool $checked): static
{
$this->checked = $checked;
return $this;
}
} }

View File

@ -1,10 +1,14 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Case;
use App\Enums\CaseLevel; use App\Entity\Staff\StaffNote;
use App\Enums\County; use App\Entity\System\ReferralSource;
use App\Repository\MemberCaseRepository; use App\Entity\System\UserCase;
use App\Enums\Case\CaseLevel;
use App\Enums\System\County;
use App\Enums\Case\ReferralType;
use App\Repository\Case\MemberCaseRepository;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
@ -31,7 +35,7 @@ class MemberCase
private ?string $lastName = null; private ?string $lastName = null;
#[ORM\Column(length: 45)] #[ORM\Column(length: 45)]
private ?string $referralType = null; private ?ReferralType $referralType = null;
#[ORM\ManyToOne] #[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: false)] #[ORM\JoinColumn(nullable: false)]
@ -109,7 +113,8 @@ class MemberCase
#[ORM\OneToMany(targetEntity: StaffNote::class, mappedBy: 'memberCase')] #[ORM\OneToMany(targetEntity: StaffNote::class, mappedBy: 'memberCase')]
private Collection $staffNotes; private Collection $staffNotes;
private array $docs; #[ORM\Column]
private ?int $rate = null;
public function __construct() public function __construct()
{ {
@ -166,12 +171,12 @@ class MemberCase
return "{$this->lastName}, {$this->firstName}"; return "{$this->lastName}, {$this->firstName}";
} }
public function getReferralType(): ?string public function getReferralType(): ?ReferralType
{ {
return $this->referralType; return $this->referralType;
} }
public function setReferralType(string $referralType): static public function setReferralType(ReferralType $referralType): static
{ {
$this->referralType = $referralType; $this->referralType = $referralType;
@ -508,8 +513,21 @@ class MemberCase
return $this; return $this;
} }
public function getDocs(): array public function emptyStaffNotes(): static
{ {
return $this->docs; $this->staffNotes->clear();
return $this;
}
public function getRate(): ?int
{
return $this->rate;
}
public function setRate(int $rate): static
{
$this->rate = $rate;
return $this;
} }
} }

View File

@ -0,0 +1,149 @@
<?php
namespace App\Entity\Case;
use App\Entity\Company\CompanyDocument;
use App\Entity\System\User;
use App\Repository\Case\MemberDocumentRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\Uid\Uuid;
#[ORM\Entity(repositoryClass: MemberDocumentRepository::class)]
class MemberDocument
{
#[ORM\Id]
#[ORM\Column(type: UuidType::NAME, unique: true)]
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
#[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
private ?Uuid $id = null;
#[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: false)]
private ?Member $client = null;
#[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: false)]
private ?User $caseWorker = null;
#[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)]
private ?\DateTimeInterface $clientSigned = null;
#[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)]
private ?\DateTimeInterface $workerSigned = null;
#[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: false)]
private ?CompanyDocument $document = null;
#[ORM\Column(nullable: true)]
private ?array $clientSignature = null;
#[ORM\Column(nullable: true)]
private ?array $workerSignature = null;
#[ORM\Column(type: Types::TEXT, nullable: true)]
private ?string $docData = null;
public function getId(): ?Uuid
{
return $this->id;
}
public function getClient(): ?Member
{
return $this->client;
}
public function setClient(?Member $client): static
{
$this->client = $client;
return $this;
}
public function getCaseWorker(): ?User
{
return $this->caseWorker;
}
public function setCaseWorker(?User $caseWorker): static
{
$this->caseWorker = $caseWorker;
return $this;
}
public function getClientSigned(): ?\DateTimeInterface
{
return $this->clientSigned;
}
public function setClientSigned(?\DateTimeInterface $clientSigned): static
{
$this->clientSigned = $clientSigned;
return $this;
}
public function getWorkerSigned(): ?\DateTimeInterface
{
return $this->workerSigned;
}
public function setWorkerSigned(?\DateTimeInterface $workerSigned): static
{
$this->workerSigned = $workerSigned;
return $this;
}
public function getDocument(): ?CompanyDocument
{
return $this->document;
}
public function setDocument(?CompanyDocument $document): static
{
$this->document = $document;
return $this;
}
public function getClientSignature(): ?array
{
return $this->clientSignature;
}
public function setClientSignature(?array $clientSignature): static
{
$this->clientSignature = $clientSignature;
return $this;
}
public function getWorkerSignature(): ?array
{
return $this->workerSignature;
}
public function setWorkerSignature(?array $workerSignature): static
{
$this->workerSignature = $workerSignature;
return $this;
}
public function getDocData(): ?string
{
return $this->docData;
}
public function setDocData(?string $docData): static
{
$this->docData = $docData;
return $this;
}
}

View File

@ -0,0 +1,115 @@
<?php
namespace App\Entity\Case;
use App\Repository\Case\MonthlyCaseNoteRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\Uid\Uuid;
#[ORM\Entity(repositoryClass: MonthlyCaseNoteRepository::class)]
class MonthlyCaseNote
{
#[ORM\Id]
#[ORM\Column(type: UuidType::NAME, unique: true)]
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
#[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
private ?Uuid $id = null;
#[ORM\Column(type: Types::TEXT, nullable: true)]
private ?string $reason = null;
#[ORM\Column(type: Types::TEXT, nullable: true)]
private ?string $familyStrength = null;
#[ORM\Column(type: Types::TEXT, nullable: true)]
private ?string $recAndProgress = null;
#[ORM\ManyToOne(inversedBy: 'monthlyCaseNotes')]
#[ORM\JoinColumn(nullable: false)]
private ?MemberCase $memberCase = null;
#[ORM\Column(type: Types::DATE_MUTABLE)]
private ?\DateTimeInterface $date = null;
#[ORM\Column(type: Types::DATE_MUTABLE)]
private ?\DateTimeInterface $nextVisit = null;
public function getId(): ?Uuid
{
return $this->id;
}
public function getReason(): ?string
{
return $this->reason;
}
public function setReason(?string $reason): static
{
$this->reason = $reason;
return $this;
}
public function getFamilyStrength(): ?string
{
return $this->familyStrength;
}
public function setFamilyStrength(?string $familyStrength): static
{
$this->familyStrength = $familyStrength;
return $this;
}
public function getRecAndProgress(): ?string
{
return $this->recAndProgress;
}
public function setRecAndProgress(?string $recAndProgress): static
{
$this->recAndProgress = $recAndProgress;
return $this;
}
public function getMemberCase(): ?MemberCase
{
return $this->memberCase;
}
public function setMemberCase(?MemberCase $memberCase): static
{
$this->memberCase = $memberCase;
return $this;
}
public function getDate(): ?\DateTimeInterface
{
return $this->date;
}
public function setDate(\DateTimeInterface $date): static
{
$this->date = $date;
return $this;
}
public function getNextVisit(): ?\DateTimeInterface
{
return $this->nextVisit;
}
public function setNextVisit(\DateTimeInterface $nextVisit): static
{
$this->nextVisit = $nextVisit;
return $this;
}
}

View File

@ -1,11 +1,11 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Case;
use App\Enums\NoteLocation; use App\Enums\Case\NoteLocation;
use App\Enums\NoteMethod; use App\Enums\Case\NoteMethod;
use App\Enums\NoteStatus; use App\Enums\Case\NoteStatus;
use App\Repository\NoteRepository; use App\Repository\Case\NoteRepository;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\MappedSuperclass; use Doctrine\ORM\Mapping\MappedSuperclass;

View File

@ -1,12 +1,10 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Case;
use App\Enums\DischargeReason; use App\Enums\Case\DischargeReason;
use App\Enums\ReferralServiceType; use App\Enums\Case\ReferralServiceType;
use App\Repository\ReferralRepository; use App\Repository\Case\ReferralRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;

View File

@ -1,9 +1,9 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Case;
use App\Enums\ReferralServiceType; use App\Enums\Case\ReferralServiceType;
use App\Repository\StandardNoteRepository; use App\Repository\Case\StandardNoteRepository;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use JsonSerializable; use JsonSerializable;
@ -30,8 +30,8 @@ class StandardNote extends Note implements JsonSerializable
{ {
$members = []; $members = [];
foreach ($this->getMembers() as $member) { foreach ($this->getMembers() as $member) {
/** @var Member $member */ /** @var StandardNoteMember $member */
$members[] = $member->getName(); $members[] = $member->getPerson()->getName();
} }
return [ return [
'id' => $this->getId()->toString(), 'id' => $this->getId()->toString(),

View File

@ -1,8 +1,8 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Case;
use App\Repository\StandardNoteMemberRepository; use App\Repository\Case\StandardNoteMemberRepository;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\Uid\Uuid; use Symfony\Component\Uid\Uuid;

View File

@ -1,10 +1,10 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Case;
use App\Enums\ReferralServiceType; use App\Enums\Case\ReferralServiceType;
use App\Enums\VisitQualityLevel; use App\Enums\Case\VisitQualityLevel;
use App\Repository\VisitNoteRepository; use App\Repository\Case\VisitNoteRepository;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use JsonSerializable; use JsonSerializable;
@ -166,8 +166,8 @@ class VisitNote extends Note implements JsonSerializable
{ {
$members = []; $members = [];
foreach ($this->getMembers() as $member) { foreach ($this->getMembers() as $member) {
/** @var Member $member */ /** @var VisitNoteMembers $member */
$members[] = $member->getName(); $members[] = $member->getPerson()->getName();
} }
return [ return [
'id' => $this->getId()->toString(), 'id' => $this->getId()->toString(),

View File

@ -1,8 +1,8 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Case;
use App\Repository\VisitNoteMembersRepository; use App\Repository\Case\VisitNoteMembersRepository;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\Uid\Uuid; use Symfony\Component\Uid\Uuid;

View File

@ -1,8 +1,9 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Company;
use App\Repository\CompanyRepository; use App\Entity\System\User;
use App\Repository\Company\CompanyRepository;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
@ -51,6 +52,9 @@ class Company
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)] #[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
private ?string $companyLogo = null; private ?string $companyLogo = null;
#[ORM\Column(length: 64)]
private ?string $vendorId = null;
/** /**
* @var Collection<int, User> * @var Collection<int, User>
*/ */
@ -233,6 +237,18 @@ class Company
return $this; return $this;
} }
public function getVendorId(): ?string
{
return $this->vendorId;
}
public function setVendorId(string $vendorId): static
{
$this->vendorId = $vendorId;
return $this;
}
public function __toString(): string public function __toString(): string
{ {
$url = ($this->url ? "<br/><a href='$this->url' target='_blank'>$this->url</a>" : ''); $url = ($this->url ? "<br/><a href='$this->url' target='_blank'>$this->url</a>" : '');

View File

@ -0,0 +1,139 @@
<?php
namespace App\Entity\Company;
use App\Enums\Company\DocumentExtras;
use App\Repository\Company\CompanyDocumentRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\Uid\Uuid;
#[ORM\Entity(repositoryClass: CompanyDocumentRepository::class)]
class CompanyDocument
{
#[ORM\Id]
#[ORM\Column(type: UuidType::NAME, unique: true)]
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
#[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
private ?Uuid $id = null;
#[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: false)]
private ?Company $company = null;
#[ORM\Column(length: 255)]
private ?string $title = null;
#[ORM\Column(type: Types::TEXT, nullable: true)]
private ?string $text = null;
#[ORM\Column(type: Types::DATETIME_MUTABLE)]
private ?\DateTimeInterface $updated = null;
#[ORM\Column(type: Types::JSON, enumType: DocumentExtras::class, nullable: true)]
private array $extras = [];
private bool $selected = false;
public function getId(): ?Uuid
{
return $this->id;
}
public function getCompany(): ?Company
{
return $this->company;
}
public function setCompany(?Company $company): static
{
$this->company = $company;
return $this;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): static
{
$this->title = $title;
return $this;
}
public function getText(): ?string
{
return $this->text;
}
public function setText(?string $text): static
{
$this->text = $text;
return $this;
}
public function getUpdated(): ?\DateTimeInterface
{
return $this->updated;
}
public function setUpdated(\DateTimeInterface $updated): static
{
$this->updated = $updated;
return $this;
}
public function isSelected(): bool
{
return $this->selected;
}
public function setSelected(): static
{
$this->selected = true;
return $this;
}
public function getExtras(): array
{
return $this->extras;
}
public function setExtras(array $extras): static
{
$this->extras = $extras;
return $this;
}
public function inExtras(DocumentExtras $field): bool
{
return in_array($field, $this->extras);
}
public function renderHtml(): string
{
$text = $this->text;
if ($this->inExtras(DocumentExtras::EMAIL)) {
$text = str_replace('{{ email }}', "<input type='email' name='email' id='email' value='{{ doc.client.email }}'/>", $text);
$text = str_replace('{{ checkbox|email }}', "<input type='checkbox' name='emailClient' id='emailClient' value='1'/>", $text);
}
if ($this->inExtras(DocumentExtras::PHONE)) {
$text = str_replace('{{ phone }}', "<input type='tel' name='phone' id='phone' value='{{ doc.client.phone }}'/>", $text);
$text = str_replace('{{ checkbox|phone }}', "<input type='checkbox' name='callClient' id='callClient' value='1'/>", $text);
$text = str_replace('{{ checkbox|text }}', "<input type='checkbox' name='textClient' id='textClient' value='1'/>", $text);
}
return <<<HTML
$text
HTML;
}
}

View File

@ -1,12 +1,13 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Resources;
use App\Enums\County; use App\Entity\System\Location;
use App\Enums\ResourceType; use App\Enums\System\County;
use App\Enums\State; use App\Enums\Case\ResourceType;
use App\Enums\System\State;
use App\Libs\Libs; use App\Libs\Libs;
use App\Repository\CommunityResourceRepository; use App\Repository\Resources\CommunityResourceRepository;
use DateTime; use DateTime;
use DateTimeZone; use DateTimeZone;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
@ -683,4 +684,19 @@ class CommunityResource
{$this->getContactCard()} {$this->getContactCard()}
EOL; EOL;
} }
public function toLocation(): Location
{
$loc = new Location();
$loc->setName($this->name)
->setAddress($this->address)
->setCity($this->city)
->setState($this->state)
->setZip($this->zip)
->setLat($this->lat)
->setLon($this->lon)
;
return $loc;
}
} }

View File

@ -1,9 +1,10 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Staff;
use App\Enums\ReferralServiceType; use App\Entity\Case\MemberCase;
use App\Repository\StaffNoteRepository; use App\Enums\Case\ReferralServiceType;
use App\Repository\Staff\StaffNoteRepository;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;

View File

@ -1,8 +1,9 @@
<?php <?php
namespace App\Entity; namespace App\Entity\Staff;
use App\Repository\SupervisionRepository; use App\Entity\System\User;
use App\Repository\Staff\SupervisionRepository;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\Uid\Uuid; use Symfony\Component\Uid\Uuid;

View File

@ -1,9 +1,9 @@
<?php <?php
namespace App\Entity; namespace App\Entity\System;
use App\Enums\State; use App\Enums\System\State;
use App\Repository\LocationRepository; use App\Repository\System\LocationRepository;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;

View File

@ -1,9 +1,9 @@
<?php <?php
namespace App\Entity; namespace App\Entity\System;
use App\Enums\MessageType; use App\Enums\System\MessageType;
use App\Repository\MessagesRepository; use App\Repository\System\MessagesRepository;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;

View File

@ -1,8 +1,8 @@
<?php <?php
namespace App\Entity; namespace App\Entity\System;
use App\Repository\ReferralSourceRepository; use App\Repository\System\ReferralSourceRepository;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType; use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\Uid\Uuid; use Symfony\Component\Uid\Uuid;

View File

@ -0,0 +1,86 @@
<?php
namespace App\Entity\System;
use App\Enums\System\UserSubscriptions;
use App\Repository\System\SubscriptionRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Types\UuidType;
use Symfony\Component\Uid\Uuid;
#[ORM\Entity(repositoryClass: SubscriptionRepository::class)]
class Subscription
{
#[ORM\Id]
#[ORM\Column(type: UuidType::NAME, unique: true)]
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
#[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
private ?Uuid $id = null;
#[ORM\ManyToOne(inversedBy: 'subscriptions')]
#[ORM\JoinColumn(nullable: false)]
private ?User $user = null;
#[ORM\Column]
private ?bool $active = null;
#[ORM\Column(type: Types::DATE_MUTABLE)]
private ?\DateTimeInterface $expiration = null;
#[ORM\Column(enumType: UserSubscriptions::class)]
private ?UserSubscriptions $level = null;
public function getId(): ?Uuid
{
return $this->id;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): static
{
$this->user = $user;
return $this;
}
public function isActive(): ?bool
{
return $this->active;
}
public function setActive(bool $active): static
{
$this->active = $active;
return $this;
}
public function getExpiration(): ?\DateTimeInterface
{
return $this->expiration;
}
public function setExpiration(\DateTimeInterface $expiration): static
{
$this->expiration = $expiration;
return $this;
}
public function getLevel(): ?UserSubscriptions
{
return $this->level;
}
public function setLevel(UserSubscriptions $level): static
{
$this->level = $level;
return $this;
}
}

View File

@ -1,10 +1,11 @@
<?php <?php
namespace App\Entity; namespace App\Entity\System;
use App\Repository\UserRepository; use App\Entity\Company\Company;
use App\Enums\RateType; use App\Repository\System\UserRepository;
use App\Enums\CaseLevel; use App\Enums\System\RateType;
use App\Enums\Case\CaseLevel;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
@ -63,20 +64,6 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
#[ORM\Column(enumType: CaseLevel::class)] #[ORM\Column(enumType: CaseLevel::class)]
private ?CaseLevel $level = null; private ?CaseLevel $level = null;
private ?User $supervisor = null;
#[ORM\Column]
private ?bool $caseWorker = null;
#[ORM\Column]
private ?bool $caseManager = null;
#[ORM\Column]
private ?bool $therapist = null;
#[ORM\Column]
private ?bool $su = null;
/** /**
* @var Collection<int, UserCase> * @var Collection<int, UserCase>
*/ */
@ -101,9 +88,24 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
#[ORM\Column(type: Types::TEXT, nullable: true)] #[ORM\Column(type: Types::TEXT, nullable: true)]
private ?string $signature = null; private ?string $signature = null;
#[ORM\Column]
private ?bool $active = null;
#[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)]
private ?\DateTimeInterface $lastLogin = null;
private ?User $supervisor = null;
/**
* @var Collection<int, Subscription>
*/
#[ORM\OneToMany(targetEntity: Subscription::class, mappedBy: 'user', orphanRemoval: true)]
private Collection $subscriptions;
public function __construct() public function __construct()
{ {
$this->userCases = new ArrayCollection(); $this->userCases = new ArrayCollection();
$this->subscriptions = new ArrayCollection();
} }
public function getId(): ?Uuid public function getId(): ?Uuid
@ -261,36 +263,6 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
return $this; return $this;
} }
public function retrieveUnreadNotifications(): array
{
return [
[
'id' => 1,
'title' => 'Welcome',
'from' => 'Admin',
'type' => 'info',
'message' => 'Welcome to the dashboard.',
'timestamp' => new \DateTime('2024-11-12 10:00:00'),
],
[
'id' => 2,
'title' => 'New Case',
'from' => 'Admin',
'type' => 'info',
'message' => 'You have a new case.',
'timestamp' => new \DateTime('2024-11-13 10:19:56'),
],
[
'id' => 3,
'title' => 'New Message',
'from' => 'Admin',
'type' => 'warning',
'message' => 'You have a new message.',
'timestamp' => new \DateTime('2024-11-16 11:13:25'),
],
];
}
public function getSupervisor(): ?User public function getSupervisor(): ?User
{ {
return $this->supervisor; return $this->supervisor;
@ -305,68 +277,40 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
public function isCaseWorker(): ?bool public function isCaseWorker(): ?bool
{ {
return $this->caseWorker; return in_array('ROLE_CASE_WORKER', $this->roles);
}
public function setCaseWorker(bool $caseWorker): static
{
$this->caseWorker = $caseWorker;
return $this;
} }
public function isCaseManager(): ?bool public function isCaseManager(): ?bool
{ {
return $this->caseManager; return in_array('ROLE_CASE_MANAGER', $this->roles);
}
public function setCaseManager(bool $caseManager): static
{
$this->caseManager = $caseManager;
return $this;
} }
public function isTherapist(): ?bool public function isTherapist(): ?bool
{ {
return $this->therapist; return in_array('ROLE_THERAPIST', $this->roles);
} }
public function setTherapist(bool $therapist): static public function isAdmin(): ?bool
{ {
$this->therapist = $therapist; return in_array('ROLE_ADMIN', $this->roles);
return $this;
}
public function isSu(): ?bool
{
return $this->su;
}
public function setSu(bool $su): static
{
$this->su = $su;
return $this;
} }
public function getJobs(): array public function getJobs(): array
{ {
$jobs = []; $jobs = [];
if ($this->caseWorker) { if (in_array('ROLE_CASE_WORKER', $this->roles)) {
$jobs[] = 'Case Worker'; $jobs[] = 'Case Worker';
} }
if ($this->caseManager) { if (in_array('ROLE_CASE_MANAGER', $this->roles)) {
$jobs[] = 'Case Manager'; $jobs[] = 'Case Manager';
} }
if ($this->therapist) { if (in_array('ROLE_THERAPIST', $this->roles)) {
$jobs[] = 'Therapist'; $jobs[] = 'Therapist';
} }
if ($this->su) { if (in_array('ROLE_ADMIN', $this->roles)) {
$jobs[] = 'Admin'; $jobs[] = 'Admin';
} }
@ -454,4 +398,85 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
return $this; return $this;
} }
public function isActive(): ?bool
{
return $this->active;
}
public function setActive(bool $active): static
{
$this->active = $active;
return $this;
}
public function getLastLogin(): ?\DateTimeInterface
{
return $this->lastLogin;
}
public function setLastLogin(?\DateTimeInterface $lastLogin): static
{
$this->lastLogin = $lastLogin;
return $this;
}
public function generateVCard(): string
{
list($fname, $lname) = explode(' ', $this->name, 2);
$b64image = null;
$fileExt = null;
if ($this->imageName) {
$fullFileName = dirname(dirname(__DIR__))."/public/{$_ENV['USER_IMAGE_PATH']}/{$this->imageName}";
$fileExt = strtoupper(pathinfo($fullFileName, PATHINFO_EXTENSION));
$b64image = base64_encode(
file_get_contents($fullFileName)
);
}
return 'BEGIN:VCARD' .
"\nVERSION:3.0" .
"\nN:{$lname};{$fname}" .
"\nFN:$this->name" .
"\nORG:{$this->company->getName()}" .
($this->workPhone ? "\nTEL;TYPE=WORK,VOICE:$this->workPhone" : null) .
($this->email ? "\nEMAIL;TYPE=WORK,INTERNET:$this->email" : null) .
"\nREV:" . date('c') .
($this->imageName ? "\nPHOTO;TYPE={$fileExt};ENCODING=b:{$b64image}" : null) .
"\nEND:VCARD";
}
/**
* @return Collection<int, Subscription>
*/
public function getSubscriptions(): Collection
{
return $this->subscriptions;
}
public function addSubscription(Subscription $subscription): static
{
if (!$this->subscriptions->contains($subscription)) {
$this->subscriptions->add($subscription);
$subscription->setUser($this);
}
return $this;
}
public function removeSubscription(Subscription $subscription): static
{
if ($this->subscriptions->removeElement($subscription)) {
// set the owning side to null (unless already changed)
if ($subscription->getUser() === $this) {
$subscription->setUser(null);
}
}
return $this;
}
} }

View File

@ -1,9 +1,9 @@
<?php <?php
namespace App\Entity; namespace App\Entity\System;
use App\Enums\CaseLevel; use App\Entity\Case\MemberCase;
use App\Repository\UserCaseRepository; use App\Repository\System\UserCaseRepository;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: UserCaseRepository::class)] #[ORM\Entity(repositoryClass: UserCaseRepository::class)]

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\Case;
enum CaseLevel: int enum CaseLevel: int
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\Case;
enum DischargeReason: string enum DischargeReason: string
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\Case;
enum NoteLocation: string enum NoteLocation: string
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\Case;
enum NoteMethod: int enum NoteMethod: int
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\Case;
enum NoteStatus: string enum NoteStatus: string
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\Case;
enum RaceType: string enum RaceType: string
{ {

View File

@ -1,10 +1,11 @@
<?php <?php
namespace App\Enums; namespace App\Enums\Case;
enum ReferralServiceType: string enum ReferralServiceType: string
{ {
case FE_FF = 'FE-FF'; case FE_FF = 'FE-FF';
case VS_THBB = 'VS-THBB'; case VS_THBB = 'VS-THBB';
case VS_THBBT = 'VS-THBBT'; case VS_THBBT = 'VS-THBBT';
case VS_THBBCT = 'VS-THBBCT';
} }

View File

@ -0,0 +1,9 @@
<?php
namespace App\Enums\Case;
enum ReferralType: string
{
case DCS = 'DCS';
case PO = 'PO';
}

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\Case;
enum RelationshipType: string enum RelationshipType: string
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\Case;
enum ResourceType: int enum ResourceType: int
{ {
@ -9,4 +9,5 @@ enum ResourceType: int
case JOB_OPENINGS = 2; case JOB_OPENINGS = 2;
case HOUSING = 3; case HOUSING = 3;
case PARENT_SUPPORT = 4; case PARENT_SUPPORT = 4;
case PLAY_AREA = 5;
} }

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\Case;
enum VisitQualityLevel: int enum VisitQualityLevel: int
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\Company;
enum DocumentExtras: int enum DocumentExtras: int
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\System;
enum County: string enum County: string
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\System;
enum GenderType: string enum GenderType: string
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\System;
enum JobType: string enum JobType: string
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\System;
enum MessageType: int enum MessageType: int
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\System;
enum RateType: string enum RateType: string
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Enums; namespace App\Enums\System;
enum State: string enum State: string
{ {

View File

@ -0,0 +1,10 @@
<?php
namespace App\Enums\System;
enum UserSubscriptions: int
{
case Free = 0;
case Basic = 1;
case Pro = 2;
}

View File

@ -3,8 +3,8 @@
namespace App\Factory; namespace App\Factory;
use App\DataTransferObject\CompanyDetailsDto; use App\DataTransferObject\CompanyDetailsDto;
use App\Entity\Company; use App\Entity\Company\Company;
use App\Entity\User; use App\Entity\System\User;
final class CompanyFactory final class CompanyFactory
{ {

View File

@ -2,10 +2,10 @@
namespace App\Factory; namespace App\Factory;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use App\Entity\Messages; use App\Entity\System\Messages;
use App\Entity\User; use App\Entity\System\User;
use App\Enums\MessageType; use App\Enums\System\MessageType;
use DateTimeImmutable; use DateTimeImmutable;
class MessageFactory class MessageFactory
@ -38,7 +38,7 @@ class MessageFactory
return $msg; return $msg;
} }
public static function createNewCase(User $sender, User $recipient): Messages public static function createNewCase(User $sender, User $recipient, string $link): Messages
{ {
$msg = new Messages(); $msg = new Messages();
$msg->setSent(new DateTimeImmutable()) $msg->setSent(new DateTimeImmutable())
@ -46,6 +46,7 @@ class MessageFactory
->setSender($sender) ->setSender($sender)
->setRecipient($recipient) ->setRecipient($recipient)
->setTitle('New Case') ->setTitle('New Case')
->setLink($link)
->setMessage("You've been assigned a new case") ->setMessage("You've been assigned a new case")
; ;

View File

@ -1,38 +0,0 @@
<?php
namespace App\Form;
use App\Entity\CaseDocument;
use App\Entity\CompanyDocument;
use App\Entity\Member;
use App\Entity\User;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EnumType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CaseDocumentFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$docs = $options['docs'];
$builder
->add('document', EntityType::class, [
'class' => CompanyDocument::class,
'choices' => $docs,
'multiple' => true,
'expanded' => true,
'choice_label' => 'title',
])
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => CaseDocument::class,
'docs' => [],
]);
}
}

View File

@ -2,10 +2,8 @@
namespace App\Form; namespace App\Form;
use App\Enums\DocumentExtras; use App\Enums\Company\DocumentExtras;
use App\Entity\Company; use App\Entity\Company\CompanyDocument;
use App\Entity\CompanyDocument;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\EnumType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;

View File

@ -45,6 +45,7 @@ class CompanyFormType extends AbstractType
]) ])
->add('url', UrlType::class) ->add('url', UrlType::class)
->add('companyLogo', FileType::class) ->add('companyLogo', FileType::class)
->add('vendorId', TextType::class)
; ;
} }

View File

@ -2,10 +2,9 @@
namespace App\Form; namespace App\Form;
use App\Entity\User; use App\Entity\System\User;
use App\Enums\CaseLevel; use App\Enums\Case\CaseLevel;
use App\Enums\JobType; use App\Enums\System\RateType;
use App\Enums\RateType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\EmailType;
@ -38,10 +37,20 @@ class EditUserFormType extends AbstractType
]) ])
->add('workPhone', TextType::class) ->add('workPhone', TextType::class)
->add('personalPhone', TextType::class) ->add('personalPhone', TextType::class)
->add('caseWorker', CheckboxType::class) ->add('active', CheckboxType::class)
->add('caseManager', CheckboxType::class) ->add('caseWorker', CheckboxType::class, [
->add('therapist', CheckboxType::class) 'mapped' => false
->add('su', CheckboxType::class, ['label' => 'Admin']) ])
->add('caseManager', CheckboxType::class, [
'mapped' => false
])
->add('therapist', CheckboxType::class, [
'mapped' => false
])
->add('su', CheckboxType::class, [
'mapped' => false,
'label' => 'Admin'
])
->add('rateType', EnumType::class, [ ->add('rateType', EnumType::class, [
'class' => RateType::class 'class' => RateType::class
]) ])

View File

@ -2,7 +2,7 @@
namespace App\Form; namespace App\Form;
use App\Entity\Company; use App\Entity\Company\Company;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\FileType; use Symfony\Component\Form\Extension\Core\Type\FileType;

View File

@ -2,10 +2,8 @@
namespace App\Form; namespace App\Form;
use App\Entity\Location; use App\Entity\System\Location;
use App\Entity\MemberCase; use App\Enums\System\State;
use App\Enums\State;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\EnumType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;

View File

@ -2,16 +2,16 @@
namespace App\Form; namespace App\Form;
use App\Entity\CompanyDocument; use App\Entity\Case\MemberCase;;
use App\Entity\MemberCase; use App\Entity\System\ReferralSource;
use App\Entity\ReferralSource; use App\Enums\Case\CaseLevel;
use App\Enums\CaseLevel; use App\Enums\System\County;
use App\Enums\County; use App\Enums\Case\ReferralType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\EnumType;
use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
@ -19,6 +19,8 @@ class MemberCaseFormType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$docs = $options['docs'];
$builder $builder
->add('caseNumber', TextType::class, [ ->add('caseNumber', TextType::class, [
'required' => true 'required' => true
@ -29,7 +31,9 @@ class MemberCaseFormType extends AbstractType
->add('lastName', TextType::class, [ ->add('lastName', TextType::class, [
'required' => true 'required' => true
]) ])
->add('referralType') ->add('referralType', EnumType::class, [
'class' => ReferralType::class
])
->add('admitDate', null, [ ->add('admitDate', null, [
'widget' => 'single_text', 'widget' => 'single_text',
'required' => true, 'required' => true,
@ -62,10 +66,8 @@ class MemberCaseFormType extends AbstractType
->add('county', EnumType::class, [ ->add('county', EnumType::class, [
'class' => County::class, 'class' => County::class,
]) ])
->add('docs', ChoiceType::class, [ ->add('rate', NumberType::class, [
'data_class' => CompanyDocument::class, 'required' => true
'multiple' => true,
'expanded' => true,
]) ])
; ;
} }

View File

@ -2,10 +2,12 @@
namespace App\Form; namespace App\Form;
use App\Entity\Member; use App\Entity\Company\CompanyDocument;
use App\Enums\GenderType; use App\Entity\Case\Member;
use App\Enums\RaceType; use App\Enums\System\GenderType;
use App\Enums\RelationshipType; use App\Enums\Case\RaceType;
use App\Enums\Case\RelationshipType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\DateType; use Symfony\Component\Form\Extension\Core\Type\DateType;
@ -18,6 +20,7 @@ class MemberFormType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options): void public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
$docs = $options['docs'];
$builder $builder
->add('lastName', null, ['required' => true]) ->add('lastName', null, ['required' => true])
->add('firstName', null, ['required' => true]) ->add('firstName', null, ['required' => true])
@ -68,6 +71,14 @@ class MemberFormType extends AbstractType
->add('dcsApproved', CheckboxType::class, [ ->add('dcsApproved', CheckboxType::class, [
'mapped' => false 'mapped' => false
]) ])
->add('docs', EntityType::class, [
'class' => CompanyDocument::class,
'choices' => $docs,
'multiple' => true,
'expanded' => true,
'choice_label' => 'title',
'mapped' => false,
])
; ;
} }
@ -75,6 +86,7 @@ class MemberFormType extends AbstractType
{ {
$resolver->setDefaults([ $resolver->setDefaults([
'data_class' => Member::class, 'data_class' => Member::class,
'docs' => [],
'csrf_protection' => true, 'csrf_protection' => true,
'csrf_field_name' => '_token', 'csrf_field_name' => '_token',
'csrf_token_id' => 'member', 'csrf_token_id' => 'member',

View File

@ -2,11 +2,9 @@
namespace App\Form; namespace App\Form;
use App\Entity\MemberCase; use App\Entity\Case\Referral;
use App\Entity\Referral; use App\Enums\Case\DischargeReason;
use App\Enums\DischargeReason; use App\Enums\Case\ReferralServiceType;
use App\Enums\ReferralServiceType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\EnumType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;

View File

@ -2,7 +2,7 @@
namespace App\Form; namespace App\Form;
use App\Entity\ReferralSource; use App\Entity\System\ReferralSource;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;

View File

@ -2,7 +2,7 @@
namespace App\Form; namespace App\Form;
use App\Entity\User; use App\Entity\System\User;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType; use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType; use Symfony\Component\Form\Extension\Core\Type\RepeatedType;

View File

@ -2,10 +2,10 @@
namespace App\Form; namespace App\Form;
use App\Entity\CommunityResource; use App\Entity\Resources\CommunityResource;
use App\Enums\County; use App\Enums\Case\ResourceType;
use App\Enums\ResourceType; use App\Enums\System\County;
use App\Enums\State; use App\Enums\System\State;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\EnumType;

View File

@ -2,9 +2,8 @@
namespace App\Form; namespace App\Form;
use App\Entity\Member; use App\Entity\Staff\StaffNote;
use App\Entity\StaffNote; use App\Enums\Case\ReferralServiceType;
use App\Enums\ReferralServiceType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\EnumType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\Extension\Core\Type\TextareaType;

View File

@ -2,15 +2,13 @@
namespace App\Form; namespace App\Form;
use App\Entity\Member; use App\Entity\Case\StandardNote;
use App\Entity\Referral; use App\Enums\Case\NoteLocation;
use App\Entity\StandardNote; use App\Enums\Case\NoteMethod;
use App\Enums\NoteLocation; use App\Enums\Case\NoteStatus;
use App\Enums\NoteMethod;
use App\Enums\NoteStatus;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\EnumType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
@ -20,6 +18,11 @@ class StandardNoteFormType extends AbstractType
{ {
$members = $options['members']; $members = $options['members'];
$ids = [];
foreach ($members as $idx => $member) {
$ids[$idx] = $member->getId()->toString();
}
$builder $builder
->add('date', null, [ ->add('date', null, [
'widget' => 'single_text', 'widget' => 'single_text',
@ -43,12 +46,19 @@ class StandardNoteFormType extends AbstractType
'placeholder' => 'Note', 'placeholder' => 'Note',
], ],
]) ])
->add('members', EntityType::class, [ ->add('members', ChoiceType::class, [
'class' => Member::class, //'class' => Member::class,
'choices' => $members, 'choices' => $members,
'choice_attr' => function ($member) {
return [
'checked' => $member->isChecked(),
'value' => $member->getId()->toString()
];
},
'multiple' => true, 'multiple' => true,
'expanded' => true, 'expanded' => true,
'choice_label' => 'name', 'choice_label' => 'name',
'mapped' => false,
]) ])
->add('method', EnumType::class, [ ->add('method', EnumType::class, [
'class' => NoteMethod::class, 'class' => NoteMethod::class,

View File

@ -2,12 +2,10 @@
namespace App\Form; namespace App\Form;
use App\Entity\Supervision; use App\Entity\Staff\Supervision;
use App\Entity\User; use App\Entity\System\User;
use Doctrine\ORM\Mapping\Entity;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;

View File

@ -2,10 +2,8 @@
namespace App\Form; namespace App\Form;
use App\Entity\MemberCase; use App\Entity\Staff\StaffNote;
use App\Entity\StaffNote; use App\Enums\Case\ReferralServiceType;
use App\Enums\ReferralServiceType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\EnumType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\Extension\Core\Type\TextareaType;

View File

@ -2,8 +2,8 @@
namespace App\Form; namespace App\Form;
use App\Entity\User; use App\Entity\System\User;
use App\Entity\UserCase; use App\Entity\System\UserCase;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType;

View File

@ -2,10 +2,9 @@
namespace App\Form; namespace App\Form;
use App\Entity\User; use App\Entity\System\User;
use App\Enums\CaseLevel; use App\Enums\Case\CaseLevel;
use App\Enums\JobType; use App\Enums\System\RateType;
use App\Enums\RateType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\EmailType;
@ -61,11 +60,18 @@ class UserFormType extends AbstractType
]) ])
->add('workPhone', TextType::class) ->add('workPhone', TextType::class)
->add('personalPhone', TextType::class) ->add('personalPhone', TextType::class)
->add('caseWorker', CheckboxType::class) ->add('caseWorker', CheckboxType::class, [
->add('caseManager', CheckboxType::class) 'mapped' => false
->add('therapist', CheckboxType::class) ])
->add('caseManager', CheckboxType::class, [
'mapped' => false
])
->add('therapist', CheckboxType::class, [
'mapped' => false
])
->add('su', CheckboxType::class, [ ->add('su', CheckboxType::class, [
'label' => 'Admin', 'mapped' => false,
'label' => 'Admin',
]) ])
->add('level', EnumType::class, [ ->add('level', EnumType::class, [
'class' => CaseLevel::class, 'class' => CaseLevel::class,

View File

@ -2,14 +2,14 @@
namespace App\Form; namespace App\Form;
use App\Entity\Member; use App\Entity\Case\Member;
use App\Entity\VisitNote; use App\Entity\Case\VisitNote;
use App\Enums\NoteLocation; use App\Enums\Case\NoteLocation;
use App\Enums\NoteMethod; use App\Enums\Case\NoteMethod;
use App\Enums\NoteStatus; use App\Enums\Case\NoteStatus;
use App\Enums\VisitQualityLevel; use App\Enums\Case\VisitQualityLevel;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\Form\Extension\Core\Type\EnumType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
@ -20,6 +20,11 @@ class VisitNoteFormType extends AbstractType
{ {
$members = $options['members']; $members = $options['members'];
$ids = [];
foreach ($members as $idx => $member) {
$ids[$idx] = $member->getId()->toString();
}
$builder $builder
->add('date', null, [ ->add('date', null, [
'widget' => 'single_text', 'widget' => 'single_text',
@ -58,12 +63,19 @@ class VisitNoteFormType extends AbstractType
->add('childFocused', EnumType::class, [ ->add('childFocused', EnumType::class, [
'class' => VisitQualityLevel::class 'class' => VisitQualityLevel::class
]) ])
->add('members', EntityType::class, [ ->add('members', ChoiceType::class, [
'class' => Member::class, //'class' => Member::class,
'choices' => $members, 'choices' => $members,
'choice_attr' => function ($member) {
return [
'checked' => $member->isChecked(),
'value' => $member->getId()->toString()
];
},
'multiple' => true, 'multiple' => true,
'expanded' => true, 'expanded' => true,
'choice_label' => 'name', 'choice_label' => 'name',
'mapped' => false,
]) ])
->add('method', EnumType::class, [ ->add('method', EnumType::class, [
'class' => NoteMethod::class 'class' => NoteMethod::class

View File

@ -2,12 +2,14 @@
namespace App\Libs; namespace App\Libs;
use App\Entity\Location; use App\Entity\Case\MemberCase;
use App\Entity\Messages; use App\Entity\Staff\Supervision;
use App\Entity\User; use App\Entity\System\Location;
use App\Entity\System\Messages;
use App\Entity\System\User;
use App\Entity\System\UserCase;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class Libs extends AbstractController class Libs extends AbstractController
{ {
@ -66,27 +68,6 @@ class Libs extends AbstractController
return null; return null;
} }
#[Route('/api/autocomplete-address/{searchText}', name: 'app_api_autocomplete_address')]
public function autocompleteAddress(string $searchText): Response
{
$params = [
'text' => $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 AbstractController::json($result);
}
public static function Phone(string $phone): string public static function Phone(string $phone): string
{ {
$phone = preg_replace('/[^0-9]/', '', $phone); $phone = preg_replace('/[^0-9]/', '', $phone);
@ -108,4 +89,41 @@ class Libs extends AbstractController
return $msgs; return $msgs;
} }
/**
* Checks if the user has permission to access a case.
*
* @param User $user
* @param MemberCase $case
* @param EntityManagerInterface $em
*
* @return bool
*/
public static function checkPermissions(User $user, MemberCase $case, EntityManagerInterface $em): bool
{
// if user is an admin, allow the action
if (in_array('ROLE_ADMIN', $user->getRoles())) {
return true;
}
// if user is assigned to this case, allow the action
$uc = $em->getRepository(UserCase::class)->findOneBy(['user' => $user, 'memberCase' => $case]);
if ($uc) {
return true;
}
// get user of the case and check if user is a supervisor of the worker
/** @var ?UserCase $uc */
$uc = $em->getRepository(UserCase::class)->findOneBy(['memberCase' => $case]);
if ($uc) {
$sup = $em->getRepository(Supervision::class)->findOneBy(['supervisor' => $user, 'worker' => $uc->getUser()]);
if ($sup) {
return true;
}
}
// user does not have permissions to the case
return false;
}
} }

View File

@ -21,6 +21,7 @@ class NavList
'staff_notes' => self::DEFAULT, 'staff_notes' => self::DEFAULT,
'case_itinerary' => self::DEFAULT, 'case_itinerary' => self::DEFAULT,
'company_nav' => self::DEFAULT, 'company_nav' => self::DEFAULT,
'company_directory' => self::DEFAULT,
]; ];
public const PRESENT_LINK = 'nav-link text-white active bg-gradient-dark'; public const PRESENT_LINK = 'nav-link text-white active bg-gradient-dark';

View File

@ -1,11 +1,11 @@
<?php <?php
namespace App\Repository; namespace App\Repository\Case;
use App\Entity\CaseItinerary; use App\Entity\Case\CaseItinerary;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use App\Entity\User; use App\Entity\System\User;
use App\Entity\UserCase; use App\Entity\System\UserCase;
use DateTime; use DateTime;
use DateTimeZone; use DateTimeZone;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
@ -42,7 +42,7 @@ class CaseItineraryRepository extends ServiceEntityRepository
} }
$query->orderBy('ci.date', 'DESC') $query->orderBy('ci.date', 'DESC')
->addOrderBy('ci.arrival', 'DESC'); ->addOrderBy('ci.departure', 'DESC');
//dd($query->getQuery()); //dd($query->getQuery());
@ -60,7 +60,7 @@ class CaseItineraryRepository extends ServiceEntityRepository
->andWhere('ci.date >= :from') ->andWhere('ci.date >= :from')
->setParameter('from', $startDate->format('Y-01-01')) ->setParameter('from', $startDate->format('Y-01-01'))
->orderBy('ci.date', 'DESC') ->orderBy('ci.date', 'DESC')
->addOrderBy('ci.arrival', 'DESC') ->addOrderBy('ci.departure', 'DESC')
; ;
return $query->getQuery()->getResult(); return $query->getQuery()->getResult();
@ -77,7 +77,7 @@ class CaseItineraryRepository extends ServiceEntityRepository
->andWhere('ci.date >= :from') ->andWhere('ci.date >= :from')
->setParameter('from', $startDate->modify('-30 days')->format('Y-m-d')) ->setParameter('from', $startDate->modify('-30 days')->format('Y-m-d'))
->orderBy('ci.date', 'DESC') ->orderBy('ci.date', 'DESC')
->addOrderBy('ci.arrival', 'DESC') ->addOrderBy('ci.departure', 'DESC')
; ;
return $query->getQuery()->getResult(); return $query->getQuery()->getResult();

View File

@ -1,10 +1,10 @@
<?php <?php
namespace App\Repository; namespace App\Repository\Case;
use App\Entity\CaseLocation; use App\Entity\Case\CaseLocation;
use App\Entity\Location; use App\Entity\System\Location;
use App\Entity\MemberCase; use App\Entity\Case\MemberCase;;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;

Some files were not shown because too many files have changed in this diff Show More