Compare commits

...

75 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
155 changed files with 3331 additions and 1019 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>
@ -43,4 +44,48 @@ export function filterNotes()
</tr>`; </tr>`;
}) })
}); });
} }
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

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

View File

@ -1,9 +1,9 @@
<?php <?php
namespace App\Controller; namespace App\Controller\Admin;
use App\Entity\Supervision; use App\Entity\Staff\Supervision;
use App\Entity\User; use App\Entity\System\User;
use App\Factory\MessageFactory; use App\Factory\MessageFactory;
use App\Form\EditUserFormType; use App\Form\EditUserFormType;
use App\Form\SupervisorFormType; use App\Form\SupervisorFormType;
@ -11,7 +11,6 @@ use App\Form\UserFormType;
use App\Libs\Breadcrumb; use App\Libs\Breadcrumb;
use App\Libs\NavList; use App\Libs\NavList;
use App\Libs\Libs; use App\Libs\Libs;
use App\Libs\PageParameters;
use App\Repository\UserRepository; use App\Repository\UserRepository;
use DateTime; use DateTime;
use DateTimeZone; use DateTimeZone;
@ -136,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()) {
@ -197,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();
@ -237,27 +253,32 @@ class AdminController extends AbstractController
/** @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();

View File

@ -1,16 +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\ReferralSource; 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\CaseDocumentFormType; use App\Form\CaseDocumentFormType;
use App\Form\LocationFormType; use App\Form\LocationFormType;
@ -24,6 +23,7 @@ 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
@ -39,6 +39,10 @@ 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'] = NavList::DEFAULT; $this->navLinks['case_list'] = NavList::DEFAULT;
@ -58,7 +62,7 @@ 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')
), ),
], ],
@ -101,8 +105,12 @@ 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()]); /** @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(); $sources = $this->entityManager->getRepository(ReferralSource::class)->findAll();
return $this->render( return $this->render(
@ -111,11 +119,9 @@ 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' => Libs::getMessages($user, $this->entityManager), 'notifications' => Libs::getMessages($user, $this->entityManager),
@ -129,9 +135,8 @@ class CaseController extends AbstractController
{ {
$this->denyAccessUnlessGranted('ROLE_ADMIN'); $this->denyAccessUnlessGranted('ROLE_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);
@ -159,7 +164,6 @@ class CaseController extends AbstractController
'notifications' => Libs::getMessages($admin, $this->entityManager), '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,
] ]
) )
); );
@ -227,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);
@ -409,51 +417,4 @@ class CaseController extends AbstractController
) )
); );
} }
#[Route('/assign-case-doc/{caseId}/{memberId}', name: 'app_assign_case_documents')]
public function assignCaseDocument(string $caseId, string $memberId, Request $request, #[CurrentUser()] User $user): Response
{
$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' => Libs::getMessages($user, $this->entityManager),
'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,
]
)
);
}
#[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();
}
} }

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,13 +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\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;
@ -17,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;

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;
@ -55,45 +57,48 @@ class MemberController extends AbstractController
{ {
/** @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'
@ -115,6 +120,7 @@ class MemberController extends AbstractController
'notifications' => Libs::getMessages($user, $this->entityManager), 'notifications' => Libs::getMessages($user, $this->entityManager),
'case' => $case, 'case' => $case,
'form' => $form->createView(), 'form' => $form->createView(),
'docs' => $docs,
] ]
) )
); );
@ -123,40 +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
{ {
/** @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(
@ -173,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' => Libs::getMessages($user, $this->entityManager), '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,26 +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\Referral; use App\Entity\Case\Referral;
use App\Entity\StandardNote; use App\Entity\Case\StandardNote;
use App\Entity\StandardNoteMember; use App\Entity\Case\StandardNoteMember;
use App\Entity\User; use App\Entity\System\User;
use App\Entity\UserCase; use App\Entity\System\UserCase;
use App\Entity\VisitNote; use App\Entity\Case\VisitNote;
use App\Entity\VisitNoteMembers; use App\Entity\Case\VisitNoteMembers;
use App\Enums\NoteLocation; use App\Enums\Case\NoteLocation;
use App\Enums\NoteMethod; use App\Enums\Case\NoteMethod;
use App\Enums\ReferralServiceType; use App\Enums\Case\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;
@ -80,11 +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);
$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]);
@ -113,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');
} }
@ -127,6 +150,7 @@ class NoteController extends AbstractController
'notifications' => Libs::getMessages($user, $this->entityManager), '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,
] ]
@ -138,16 +162,24 @@ class NoteController extends AbstractController
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
{ {
$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(
@ -162,7 +194,8 @@ class NoteController extends AbstractController
'note' => $note, 'note' => $note,
'referral' => $note->getReferral(), 'referral' => $note->getReferral(),
'form' => $form, 'form' => $form,
'noteType' => $noteType 'noteType' => $noteType,
'members' => $members,
] ]
) )
); );

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,14 +14,15 @@ 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
{ {
public function __construct( public function __construct(
@ -32,6 +33,7 @@ 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,
@ -81,7 +83,54 @@ class CompanyController extends AbstractController
); );
} }
#[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;
@ -102,6 +151,7 @@ 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;
@ -137,6 +187,7 @@ 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);

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\Entity\CaseDocument;
use App\Entity\CompanyDocument;
use App\Entity\MemberCase;
use App\Entity\User;
use App\Libs\NavList;
use App\Libs\Libs;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
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
{
$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' => Libs::getMessages($user, $this->entityManager),
'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;

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(
@ -129,9 +147,9 @@ class StaffController extends AbstractController
'cases' => $cases, 'cases' => $cases,
'breadcrumbs' => [ 'breadcrumbs' => [
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,14 +1,15 @@
<?php <?php
namespace App\Controller; namespace App\Controller\System;
use App\Entity\CaseItinerary; 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\Libs;
use App\Libs\NavList; use App\Libs\NavList;
use DateInterval; use DateInterval;
use DateTime; use DateTime;
use DateTimeInterface;
use DateTimeZone; use DateTimeZone;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@ -38,6 +39,19 @@ 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
{ {
@ -47,55 +61,19 @@ class DefaultController extends AbstractController
return $this->redirectToRoute('app_register_step', ['step' => RegistrationController::REGISTER_STEP_TWO]); return $this->redirectToRoute('app_register_step', ['step' => RegistrationController::REGISTER_STEP_TWO]);
} }
$ytdtravel = $this->entityManager->getRepository(CaseItinerary::class)->getYTDTravel($user); $oldPasswordDate = new DateTime('now', new DateTimeZone($_ENV['COMPANY_TIMEZONE']));
$last30days = $this->entityManager->getRepository(CaseItinerary::class)->getTravelLast30Days($user); $oldPasswordDate->sub(DateInterval::createFromDateString('120 days'));
$ytdMiles = 0;
$milesTravelled30Days = 0;
$caseMileageYTD = 0;
$caseMileage30Days = 0;
$totalTimeTravelledYTD = new DateInterval('PT0S');
$totalTimeTravelled30Days = new DateInterval('PT0S');
if ($ytdtravel) { if (is_a($user->getPasswordChanged(), DateTimeInterface::class) && $user->getPasswordChanged() < $oldPasswordDate) {
$timeTravelled = new DateTime('00:00:00'); $this->addFlash('danger', 'You must change your password');
$timeTravelYTDStart = new DateTime('00:00:00'); return $this->redirectToRoute('app_profile');
foreach ($ytdtravel as $travel) {
/** @var CaseItinerary $travel */
$ytdMiles += $travel->getDistance();
$timeTravelled->add($travel->getDuration());
if ($travel->isCaseMileage()) {
$caseMileageYTD += $travel->getDistance();
}
}
$totalTimeTravelledYTD = $timeTravelled->diff($timeTravelYTDStart);
} }
if ($last30days) { if(isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] == "{$_SERVER['HTTP_X_FORWARDED_PROTO']}://{$_SERVER['HTTP_HOST']}/") {
$timeTravelled30Days = new DateTime('00:00:00'); $this->entityManager->getRepository(User::class)->updateLastLogin($user);
$timeTravel30DaysStart = new DateTime('00:00:00');
foreach ($last30days as $travel) {
/** @var CaseItinerary $travel */
$milesTravelled30Days += $travel->getDistance();
$timeTravelled30Days->add($travel->getDuration());
if ($travel->isCaseMileage()) {
$caseMileage30Days += $travel->getDistance();
}
}
$totalTimeTravelled30Days = $timeTravelled30Days->diff($timeTravel30DaysStart);
} }
$activeCases = 0; $dashboard = new Dashboard($this->entityManager, $user);
$totalCases = 0;
foreach ($user->getUserCases() as $uc) {
$totalCases++;
if (!$uc->getMemberCase()->getCloseDate()) {
$activeCases++;
}
}
$this->navLinks['user_dashboard'] = NavList::PRESENT_LINK; $this->navLinks['user_dashboard'] = NavList::PRESENT_LINK;
@ -103,19 +81,12 @@ class DefaultController extends AbstractController
'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' => Libs::getMessages($user, $this->entityManager), 'notifications' => Libs::getMessages($user, $this->entityManager),
'milesTravelledYTD' => $ytdMiles,
'milesTravelled30Days' => $milesTravelled30Days,
'totalTimeTravelledYTD' => $totalTimeTravelledYTD,
'totalTimeTravelled30Days' => $totalTimeTravelled30Days,
'activeCases' => $activeCases,
'totalCases' => $totalCases,
'caseMileageYTD' => $caseMileageYTD,
'caseMileage30Days' => $caseMileage30Days,
] ]
) )
); );

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;

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;

View File

@ -1,9 +1,9 @@
<?php <?php
namespace App\Repository; namespace App\Repository\Case;
use App\Entity\Company; use App\Entity\Company\Company;
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;

View File

@ -0,0 +1,56 @@
<?php
namespace App\Repository\Case;
use App\Entity\Case\MemberDocument;
use App\Entity\Case\Member;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<CaseDocument>
*/
class MemberDocumentRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, MemberDocument::class);
}
public function removeUnsigned(Member $member)
{
$conn = $this->getEntityManager()->getConnection();
$sql = "DELETE FROM member_document WHERE client_id = :client_id AND client_signed IS NULL";
$stmt = $conn->prepare($sql);
$result = $stmt->executeQuery([
'client_id' => $member->getId()->toBinary()
]);
return $result;
}
// /**
// * @return CaseDocument[] Returns an array of CaseDocument objects
// */
// public function findByExampleField($value): array
// {
// return $this->createQueryBuilder('m')
// ->andWhere('m.exampleField = :val')
// ->setParameter('val', $value)
// ->orderBy('m.id', 'ASC')
// ->setMaxResults(10)
// ->getQuery()
// ->getResult()
// ;
// }
// public function findOneBySomeField($value): ?CaseDocument
// {
// return $this->createQueryBuilder('m')
// ->andWhere('m.exampleField = :val')
// ->setParameter('val', $value)
// ->getQuery()
// ->getOneOrNullResult()
// ;
// }
}

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