New-Thanasoft/thanasoft-back/app/Repositories/InterventionPractitionerRepository.php
2025-11-26 17:53:17 +03:00

152 lines
4.9 KiB
PHP

<?php
namespace App\Repositories;
use App\Models\InterventionPractitioner;
use Illuminate\Support\Facades\Log;
class InterventionPractitionerRepository implements InterventionPractitionerRepositoryInterface
{
/**
* Create a new intervention-practitioner assignment.
*/
public function createAssignment(int $interventionId, int $practitionerId, string $role, ?string $assignedAt = null): InterventionPractitioner
{
try {
// Check if assignment already exists
if ($this->isPractitionerAssigned($interventionId, $practitionerId)) {
// If exists, update the role
$this->updatePractitionerRole($interventionId, $practitionerId, $role);
// Return the updated record
return InterventionPractitioner::where('intervention_id', $interventionId)
->where('practitioner_id', $practitionerId)
->first();
}
$assignment = InterventionPractitioner::create([
'intervention_id' => $interventionId,
'practitioner_id' => $practitionerId,
'role' => $role,
'assigned_at' => $assignedAt ?: now()
]);
Log::info('Intervention-practitioner assignment created', [
'intervention_id' => $interventionId,
'practitioner_id' => $practitionerId,
'role' => $role,
'assignment_id' => $assignment->id
]);
return $assignment;
} catch (\Exception $e) {
Log::error('Error creating intervention-practitioner assignment', [
'intervention_id' => $interventionId,
'practitioner_id' => $practitionerId,
'role' => $role,
'error' => $e->getMessage()
]);
throw $e;
}
}
/**
* Remove all practitioner assignments for an intervention.
*/
public function removeAllAssignments(int $interventionId): int
{
$deleted = InterventionPractitioner::where('intervention_id', $interventionId)->delete();
Log::info('Removed all practitioner assignments for intervention', [
'intervention_id' => $interventionId,
'deleted_count' => $deleted
]);
return $deleted;
}
/**
* Remove specific practitioner assignment.
*/
public function removeAssignment(int $interventionId, int $practitionerId): int
{
$deleted = InterventionPractitioner::where('intervention_id', $interventionId)
->where('practitioner_id', $practitionerId)
->delete();
if ($deleted > 0) {
Log::info('Removed intervention-practitioner assignment', [
'intervention_id' => $interventionId,
'practitioner_id' => $practitionerId
]);
}
return $deleted;
}
/**
* Check if a practitioner is already assigned to an intervention.
*/
public function isPractitionerAssigned(int $interventionId, int $practitionerId): bool
{
return InterventionPractitioner::where('intervention_id', $interventionId)
->where('practitioner_id', $practitionerId)
->exists();
}
/**
* Get all practitioner assignments for an intervention.
*/
public function getAssignmentsForIntervention(int $interventionId)
{
return InterventionPractitioner::with('practitioner')
->where('intervention_id', $interventionId)
->get();
}
/**
* Get principal practitioners for an intervention.
*/
public function getPrincipalPractitioners(int $interventionId)
{
return InterventionPractitioner::with('practitioner')
->where('intervention_id', $interventionId)
->principal()
->get();
}
/**
* Get assistant practitioners for an intervention.
*/
public function getAssistantPractitioners(int $interventionId)
{
return InterventionPractitioner::with('practitioner')
->where('intervention_id', $interventionId)
->assistant()
->get();
}
/**
* Update practitioner role for an intervention.
*/
public function updatePractitionerRole(int $interventionId, int $practitionerId, string $role): bool
{
$updated = InterventionPractitioner::where('intervention_id', $interventionId)
->where('practitioner_id', $practitionerId)
->update([
'role' => $role,
'assigned_at' => now()
]);
if ($updated > 0) {
Log::info('Updated practitioner role for intervention', [
'intervention_id' => $interventionId,
'practitioner_id' => $practitionerId,
'new_role' => $role
]);
}
return $updated > 0;
}
}