Completed Referral functionality

This commit is contained in:
2024-12-08 18:37:45 -05:00
parent 6bde369bcd
commit 065b1ac403
11 changed files with 714 additions and 1 deletions

View File

@@ -0,0 +1,122 @@
<?php
namespace App\Controller;
use App\Entity\MemberCase;
use App\Entity\Referral;
use App\Entity\User;
use App\Form\ReferralFormType;
use App\Libs\NavList;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Attribute\CurrentUser;
class ReferralController extends AbstractController
{
public function __construct(
private EntityManagerInterface $entityManager,
private array $navLinks = []
) {
$this->navLinks = NavList::LIST;
}
#[Route('/list-referrals/{id}', name: 'app_list_referrals')]
public function listReferrals(Request $request, #[CurrentUser()] User $user, string $id): Response
{
$case = $this->entityManager->getRepository(MemberCase::class)->find($id);
$openReferrals = $this->entityManager->getRepository(Referral::class)->getActiveReferrals($case);
$closedReferrals = $this->entityManager->getRepository(Referral::class)->getClosedReferrals($case);
return $this->render(
'internal/cases/referrals/list-referrals.html.twig',
array_merge(
$this->navLinks,
[
'breadcrumbs' => [
'Case',
'Referrals'
],
'notifications' => $user->retrieveUnreadNotifications(),
'case' => $case,
'openReferrals' => $openReferrals,
'closedReferrals' => $closedReferrals,
]
)
);
}
#[Route('/add-referral/{id}', name: 'app_case_add_referral')]
public function addReferral(Request $request, #[CurrentUser()] User $user, string $id): Response
{
$case = $this->entityManager->getRepository(MemberCase::class)->find($id);
$referral = new Referral();
$form = $this->createForm(ReferralFormType::class, $referral);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$referral = $form->getData();
$referral->setMemberCase($case);
$this->entityManager->persist($referral);
$this->entityManager->flush();
return $this->redirectToRoute('app_list_referrals', ['id' => $case->getId()]);
}
return $this->render(
'internal/cases/referrals/add-referral.html.twig',
array_merge(
$this->navLinks,
[
'breadcrumbs' => [
'Case',
'Add Referral'
],
'notifications' => $user->retrieveUnreadNotifications(),
'case' => $case,
'form' => $form,
]
)
);
}
#[Route('/case/{caseId}/edit-referral/{referralId}', name: 'app_case_edit_referral')]
public function editReferral(Request $request, #[CurrentUser()] User $user, string $caseId, string $referralId): Response
{
$referral = $this->entityManager->getRepository(Referral::class)->find($referralId);
$case = $this->entityManager->getRepository(MemberCase::class)->find($caseId);
$form = $this->createForm(ReferralFormType::class, $referral);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$referral = $form->getData();
$this->entityManager->flush();
return $this->redirectToRoute('app_list_referrals', ['id' => $case->getId()]);
}
return $this->render(
'internal/cases/referrals/edit-referral.html.twig',
array_merge(
$this->navLinks,
[
'breadcrumbs' => [
'Case',
'Edit Referral'
],
'notifications' => $user->retrieveUnreadNotifications(),
'case' => $case,
'form' => $form,
'referral' => $referral,
]
)
);
}
}

View File

@@ -85,9 +85,16 @@ class MemberCase
#[ORM\OneToMany(targetEntity: UserCase::class, mappedBy: 'memberCase')]
private Collection $userCases;
/**
* @var Collection<int, Referral>
*/
#[ORM\OneToMany(targetEntity: Referral::class, mappedBy: 'memberCase', orphanRemoval: true)]
private Collection $referrals;
public function __construct()
{
$this->userCases = new ArrayCollection();
$this->referrals = new ArrayCollection();
}
public function getId(): ?Uuid
@@ -357,4 +364,34 @@ class MemberCase
return $this;
}
/**
* @return Collection<int, Referral>
*/
public function getReferrals(): Collection
{
return $this->referrals;
}
public function addReferral(Referral $referral): static
{
if (!$this->referrals->contains($referral)) {
$this->referrals->add($referral);
$referral->setMemberCase($this);
}
return $this;
}
public function removeReferral(Referral $referral): static
{
if ($this->referrals->removeElement($referral)) {
// set the owning side to null (unless already changed)
if ($referral->getMemberCase() === $this) {
$referral->setMemberCase(null);
}
}
return $this;
}
}

132
src/Entity/Referral.php Normal file
View File

@@ -0,0 +1,132 @@
<?php
namespace App\Entity;
use App\Enums\DischargeReason;
use App\Enums\ReferralServiceType;
use App\Repository\ReferralRepository;
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: ReferralRepository::class)]
class Referral
{
#[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: 'referrals')]
#[ORM\JoinColumn(nullable: false)]
private ?MemberCase $memberCase = null;
#[ORM\Column(length: 20)]
private ?string $referralId = null;
#[ORM\Column(enumType: ReferralServiceType::class)]
private ?ReferralServiceType $serviceCode = null;
#[ORM\Column]
private ?int $hours = null;
#[ORM\Column(type: Types::DATE_MUTABLE)]
private ?\DateTimeInterface $endDate = null;
#[ORM\Column(nullable: true, enumType: DischargeReason::class)]
private ?DischargeReason $dischargeReason = null;
#[ORM\Column(type: Types::DATE_MUTABLE, nullable: true)]
private ?\DateTimeInterface $dischargeDate = null;
public function getId(): ?Uuid
{
return $this->id;
}
public function getMemberCase(): ?MemberCase
{
return $this->memberCase;
}
public function setMemberCase(?MemberCase $memberCase): static
{
$this->memberCase = $memberCase;
return $this;
}
public function getReferralId(): ?string
{
return $this->referralId;
}
public function setReferralId(string $referralId): static
{
$this->referralId = $referralId;
return $this;
}
public function getServiceCode(): ?ReferralServiceType
{
return $this->serviceCode;
}
public function setServiceCode(ReferralServiceType $serviceCode): static
{
$this->serviceCode = $serviceCode;
return $this;
}
public function getHours(): ?int
{
return $this->hours;
}
public function setHours(int $hours): static
{
$this->hours = $hours;
return $this;
}
public function getEndDate(): ?\DateTimeInterface
{
return $this->endDate;
}
public function setEndDate(\DateTimeInterface $endDate): static
{
$this->endDate = $endDate;
return $this;
}
public function getDischargeReason(): ?DischargeReason
{
return $this->dischargeReason;
}
public function setDischargeReason(?DischargeReason $dischargeReason): static
{
$this->dischargeReason = $dischargeReason;
return $this;
}
public function getDischargeDate(): ?\DateTimeInterface
{
return $this->dischargeDate;
}
public function setDischargeDate(?\DateTimeInterface $dischargeDate): static
{
$this->dischargeDate = $dischargeDate;
return $this;
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Enums;
enum DischargeReason: string
{
case AGENCY_WITHDREW = 'Agency withdrew family';
case COMPLETED_PLANNED_SERVICES = 'Completed planned services';
case DCS_OR_PROBATION_WITHDREW = 'DCS or Probation withdrew services';
case CLIENT_MOVED = 'Client Moved';
case CLIENT_WITHDREW = 'Client/youth/family withdrew from service';
case FAMILY_REFUSED = 'Family refused services';
case OTHER = 'Other, Please Specify';
case CLIENT_REFUSED = 'Client refused to initiate services';
case CLIENT_REFERRED = 'Client referred to another service';
case ADMINISTRATIVE_TERMINATION = 'Administrative termination';
case REFERRAL_EXPIRED = 'Referral expired';
case SERVICE_ON_HOLD = 'Service on hold/intermittant';
case UNKNOWN = 'Unknown';
case TRANSFER_COUNTY = 'Transfer to another county';
case ASSIGNED_TO_DIFFERENT_IC = 'Assigned to different IC';
case SERVICES_NOT_NEEDED = 'Services not needed at this time, per FCM';
case CHANGE_IN_OBJECTIVE = 'Change in objective/referred person added';
case DCS_PROBATION_CASE_CLOSED = 'DCS/Probation case closed';
case TEMP_COVERAGE = 'Temporary coverage only for another IC';
case UPDATED_REFERRAL = 'Updated referral received';
}

View File

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

View File

@@ -0,0 +1,44 @@
<?php
namespace App\Form;
use App\Entity\MemberCase;
use App\Entity\Referral;
use App\Enums\DischargeReason;
use App\Enums\ReferralServiceType;
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 ReferralFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('referralId')
->add('serviceCode', EnumType::class, [
'class' => ReferralServiceType::class,
'label' => 'Service Type'
])
->add('hours')
->add('endDate', null, [
'widget' => 'single_text',
])
->add('dischargeReason', EnumType::class, [
'class' => DischargeReason::class
])
->add('dischargeDate', null, [
'widget' => 'single_text',
])
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Referral::class,
]);
}
}

View File

@@ -0,0 +1,68 @@
<?php
namespace App\Repository;
use App\Entity\MemberCase;
use App\Entity\Referral;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<Referral>
*/
class ReferralRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Referral::class);
}
public function getActiveReferrals(MemberCase $case): array
{
return $this->createQueryBuilder('r')
->andWhere('r.dischargeDate IS NULL')
->andWhere('r.memberCase = :case')
->setParameter('case', $case->getId()->toBinary())
->orderBy('r.hours', 'ASC')
->getQuery()
->getResult()
;
}
public function getClosedReferrals(MemberCase $case): array
{
return $this->createQueryBuilder('r')
->andWhere('r.dischargeDate IS NOT NULL')
->andWhere('r.memberCase = :case')
->setParameter('case', $case->getId()->toBinary())
->orderBy('r.dischargeDate', 'DESC')
->getQuery()
->getResult()
;
}
// /**
// * @return Referral[] Returns an array of Referral objects
// */
// public function findByExampleField($value): array
// {
// return $this->createQueryBuilder('r')
// ->andWhere('r.exampleField = :val')
// ->setParameter('val', $value)
// ->orderBy('r.id', 'ASC')
// ->setMaxResults(10)
// ->getQuery()
// ->getResult()
// ;
// }
// public function findOneBySomeField($value): ?Referral
// {
// return $this->createQueryBuilder('r')
// ->andWhere('r.exampleField = :val')
// ->setParameter('val', $value)
// ->getQuery()
// ->getOneOrNullResult()
// ;
// }
}