feat(secretary): implement multi-doctor assignment for clinic secretaries
- Added functionality to assign a single secretary to multiple doctors within a clinic, allowing for scoped access to appointments. - Introduced `SecretaryService` to handle the logic for assigning and syncing doctors for a secretary. - Updated `SecretaryController` to support multi-doctor assignment via new endpoints and modified existing ones. - Enhanced `DoctorSecretary` entity to include secretary UUID in its serialized output. - Implemented repository methods to facilitate the retrieval and management of doctor-secretary relationships. - Adjusted appointment filtering in `MyAppointmentsController` to ensure secretaries only see appointments for assigned doctors. - Created tests to validate the new multi-doctor assignment functionality and appointment access restrictions. - Updated frontend components to support multi-select for doctors in the secretary management UI.
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
namespace App\Tests\Secretary;
|
||||
|
||||
use App\Appointment\Entity\Appointment;
|
||||
use App\Auth\Entity\UserActiveContext;
|
||||
use App\Clinic\Entity\Clinic;
|
||||
use App\Doctor\Entity\Doctor;
|
||||
use App\Secretary\Entity\DoctorSecretary;
|
||||
use App\Tests\ApiTestCase;
|
||||
|
||||
/**
|
||||
* A clinic-owned secretary must only see the appointments of the doctors they
|
||||
* are actually assigned to — not every doctor in the clinic.
|
||||
*/
|
||||
class SecretaryAppointmentScopeTest extends ApiTestCase
|
||||
{
|
||||
public function testSecretarySeesOnlyAssignedDoctorsAppointments(): void
|
||||
{
|
||||
$owner = $this->createUser(['ROLE_CLINIC']);
|
||||
$clinic = new Clinic($owner);
|
||||
$this->em->persist($clinic);
|
||||
|
||||
$doctorA = new Doctor($this->createUser(['ROLE_DOCTOR']), 'دکتر A');
|
||||
$doctorB = new Doctor($this->createUser(['ROLE_DOCTOR']), 'دکتر B');
|
||||
$this->em->persist($doctorA);
|
||||
$this->em->persist($doctorB);
|
||||
$clinic->getDoctors()->add($doctorA);
|
||||
$clinic->getDoctors()->add($doctorB);
|
||||
|
||||
// منشی فقط به دکتر A تخصیص داده شده
|
||||
$secretaryUser = $this->createUser(['ROLE_SECRETARY']);
|
||||
$rel = new DoctorSecretary($doctorA, $secretaryUser, DoctorSecretary::OWNER_CLINIC, $clinic);
|
||||
$this->em->persist($rel);
|
||||
|
||||
// scope فعالِ منشی = این کلینیک
|
||||
$this->em->persist(new UserActiveContext($secretaryUser, $clinic->getUuid()));
|
||||
|
||||
// یک نوبت برای هر پزشک
|
||||
$patient = $this->createUser(['ROLE_USER']);
|
||||
$start = time() + 3600;
|
||||
$this->em->persist(new Appointment($doctorA, $patient, $start, $start + 900));
|
||||
$this->em->persist(new Appointment($doctorB, $patient, $start + 1800, $start + 2700));
|
||||
$this->em->flush();
|
||||
|
||||
$body = $this->authJson('GET', '/api/v1/my/appointments', $secretaryUser);
|
||||
|
||||
$this->assertSame(200, $this->responseCode());
|
||||
// فقط نوبت دکتر A دیده میشود، نه دکتر B
|
||||
$this->assertSame(1, $body['meta']['totalRecords']);
|
||||
}
|
||||
|
||||
public function testSecretaryWithNoAssignmentSeesNothing(): void
|
||||
{
|
||||
$owner = $this->createUser(['ROLE_CLINIC']);
|
||||
$clinic = new Clinic($owner);
|
||||
$this->em->persist($clinic);
|
||||
|
||||
$doctor = new Doctor($this->createUser(['ROLE_DOCTOR']), 'دکتر تنها');
|
||||
$this->em->persist($doctor);
|
||||
$clinic->getDoctors()->add($doctor);
|
||||
|
||||
// منشی context کلینیک دارد ولی رابطهی فعال ندارد
|
||||
$secretaryUser = $this->createUser(['ROLE_SECRETARY']);
|
||||
$this->em->persist(new UserActiveContext($secretaryUser, $clinic->getUuid()));
|
||||
|
||||
$patient = $this->createUser(['ROLE_USER']);
|
||||
$start = time() + 3600;
|
||||
$this->em->persist(new Appointment($doctor, $patient, $start, $start + 900));
|
||||
$this->em->flush();
|
||||
|
||||
$body = $this->authJson('GET', '/api/v1/my/appointments', $secretaryUser);
|
||||
|
||||
// بدون رابطهی فعال → resolveSecretaryFilter=null → لیست خالی
|
||||
$this->assertSame(0, $body['meta']['totalRecords']);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user