Compare commits

...

6 Commits

Author SHA1 Message Date
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
6 changed files with 93 additions and 31 deletions

View File

@ -23,7 +23,6 @@ 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(

View File

@ -130,40 +130,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(
@ -180,14 +194,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

@ -34,6 +34,8 @@ class CompanyDocument
#[ORM\Column(type: Types::JSON, enumType: DocumentExtras::class, nullable: true)] #[ORM\Column(type: Types::JSON, enumType: DocumentExtras::class, nullable: true)]
private array $extras = []; private array $extras = [];
private bool $selected = false;
public function getId(): ?Uuid public function getId(): ?Uuid
{ {
return $this->id; return $this->id;
@ -87,6 +89,18 @@ class CompanyDocument
return $this; return $this;
} }
public function isSelected(): bool
{
return $this->selected;
}
public function setSelected(): static
{
$this->selected = true;
return $this;
}
public function getExtras(): array public function getExtras(): array
{ {
return $this->extras; return $this->extras;

View File

@ -418,6 +418,18 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
public function generateVCard(): string public function generateVCard(): string
{ {
list($fname, $lname) = explode(' ', $this->name, 2); 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' . return 'BEGIN:VCARD' .
"\nVERSION:3.0" . "\nVERSION:3.0" .
"\nN:{$lname};{$fname}" . "\nN:{$lname};{$fname}" .
@ -426,6 +438,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
($this->workPhone ? "\nTEL;TYPE=WORK,VOICE:$this->workPhone" : null) . ($this->workPhone ? "\nTEL;TYPE=WORK,VOICE:$this->workPhone" : null) .
($this->email ? "\nEMAIL;TYPE=WORK,INTERNET:$this->email" : null) . ($this->email ? "\nEMAIL;TYPE=WORK,INTERNET:$this->email" : null) .
"\nREV:" . date('c') . "\nREV:" . date('c') .
($this->imageName ? "\nPHOTO;TYPE={$fileExt};ENCODING=b:{$b64image}" : null) .
"\nEND:VCARD"; "\nEND:VCARD";
} }
} }

View File

@ -4,7 +4,6 @@ namespace App\Repository;
use App\Entity\MemberDocument; use App\Entity\MemberDocument;
use App\Entity\Member; use App\Entity\Member;
use App\Entity\MemberCase;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
@ -18,6 +17,18 @@ class MemberDocumentRepository extends ServiceEntityRepository
parent::__construct($registry, MemberDocument::class); 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 // * @return CaseDocument[] Returns an array of CaseDocument objects
// */ // */

View File

@ -78,6 +78,15 @@
<label for='member_form_school' class='form-label'>School</label> <label for='member_form_school' class='form-label'>School</label>
<input type='text' name='{{ field_name(form.school) }}' id='member_form_school' {% if member.school %} value='{{ member.school }}' {% endif %} class='form-control'/> <input type='text' name='{{ field_name(form.school) }}' id='member_form_school' {% if member.school %} value='{{ member.school }}' {% endif %} class='form-control'/>
</div> </div>
<div class='input-group input-group-outline mb-3'>
{% for d in docs %}
<span class='check'>
<input type='checkbox' name='{{ field_name(form.docs) }}[]' id='member_form_docs_{{ d.id }}' value='{{ d.id }}' {% if d.isSelected() %} checked='checked' {% endif %} />
<label for='member_form_docs_{{ d.id }}'>{{ d.title }}</label>
</span>
{% endfor %}
</div>
</div> </div>
<div class='col'> <div class='col'>
<div class='input-group input-group-outline mb-3{% if member.address %} is-filled{% endif %}'> <div class='input-group input-group-outline mb-3{% if member.address %} is-filled{% endif %}'>