$request->get('search'), 'practitioner_id' => $request->get('practitioner_id'), 'doc_type' => $request->get('doc_type'), 'valid_only' => $request->get('valid_only'), 'sort_by' => $request->get('sort_by', 'created_at'), 'sort_direction' => $request->get('sort_direction', 'desc'), ]; // Remove null filters $filters = array_filter($filters, function ($value) { return $value !== null && $value !== ''; }); $documents = $this->practitionerDocumentRepository->getAll($filters); return new PractitionerDocumentCollection($documents); } catch (\Exception $e) { Log::error('Error fetching practitioner documents: ' . $e->getMessage(), [ 'exception' => $e, 'trace' => $e->getTraceAsString(), ]); return response()->json([ 'message' => 'Une erreur est survenue lors de la récupération des documents des praticiens.', 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } /** * Display paginated practitioner documents. */ public function paginated(Request $request): JsonResponse { try { $perPage = $request->get('per_page', 15); $result = $this->practitionerDocumentRepository->getPaginated($perPage); return response()->json([ 'data' => new PractitionerDocumentCollection($result['documents']), 'pagination' => $result['pagination'], 'message' => 'Documents des praticiens récupérés avec succès.', ], 200); } catch (\Exception $e) { Log::error('Error fetching paginated practitioner documents: ' . $e->getMessage(), [ 'exception' => $e, 'trace' => $e->getTraceAsString(), ]); return response()->json([ 'message' => 'Une erreur est survenue lors de la récupération des documents des praticiens.', 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } /** * Get documents by practitioner ID. */ public function byPractitioner(string $practitionerId): PractitionerDocumentCollection|JsonResponse { try { $documents = $this->practitionerDocumentRepository->getByPractitionerId((int) $practitionerId); return new PractitionerDocumentCollection($documents); } catch (\Exception $e) { Log::error('Error fetching documents by practitioner: ' . $e->getMessage(), [ 'exception' => $e, 'trace' => $e->getTraceAsString(), 'practitioner_id' => $practitionerId, ]); return response()->json([ 'message' => 'Une erreur est survenue lors de la récupération des documents du praticien.', 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } /** * Get documents by type. */ public function byType(Request $request): PractitionerDocumentCollection|JsonResponse { try { $docType = $request->get('doc_type'); if (!$docType) { return response()->json([ 'message' => 'Le paramètre doc_type est requis.', ], 400); } $documents = $this->practitionerDocumentRepository->getByDocumentType($docType); return new PractitionerDocumentCollection($documents); } catch (\Exception $e) { Log::error('Error fetching documents by type: ' . $e->getMessage(), [ 'exception' => $e, 'trace' => $e->getTraceAsString(), 'doc_type' => $docType, ]); return response()->json([ 'message' => 'Une erreur est survenue lors de la récupération des documents par type.', 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } /** * Get valid documents (not expired). */ public function valid(): PractitionerDocumentCollection|JsonResponse { try { $documents = $this->practitionerDocumentRepository->getValid(); return new PractitionerDocumentCollection($documents); } catch (\Exception $e) { Log::error('Error fetching valid documents: ' . $e->getMessage(), [ 'exception' => $e, 'trace' => $e->getTraceAsString(), ]); return response()->json([ 'message' => 'Une erreur est survenue lors de la récupération des documents valides.', 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } /** * Get expired documents. */ public function expired(): PractitionerDocumentCollection|JsonResponse { try { $documents = $this->practitionerDocumentRepository->getExpired(); return new PractitionerDocumentCollection($documents); } catch (\Exception $e) { Log::error('Error fetching expired documents: ' . $e->getMessage(), [ 'exception' => $e, 'trace' => $e->getTraceAsString(), ]); return response()->json([ 'message' => 'Une erreur est survenue lors de la récupération des documents expirés.', 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } /** * Get practitioner document statistics. */ public function statistics(): JsonResponse { try { $statistics = $this->practitionerDocumentRepository->getStatistics(); return response()->json([ 'data' => $statistics, 'message' => 'Statistiques des documents des praticiens récupérées avec succès.', ], 200); } catch (\Exception $e) { Log::error('Error fetching practitioner document statistics: ' . $e->getMessage(), [ 'exception' => $e, 'trace' => $e->getTraceAsString(), ]); return response()->json([ 'message' => 'Une erreur est survenue lors de la récupération des statistiques.', 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } /** * Store a newly created practitioner document. */ public function store(StorePractitionerDocumentRequest $request): PractitionerDocumentResource|JsonResponse { try { $document = $this->practitionerDocumentRepository->create($request->validated()); return new PractitionerDocumentResource($document); } catch (\Exception $e) { Log::error('Error creating practitioner document: ' . $e->getMessage(), [ 'exception' => $e, 'trace' => $e->getTraceAsString(), 'data' => $request->validated(), ]); return response()->json([ 'message' => 'Une erreur est survenue lors de la création du document du praticien.', 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } /** * Display the specified practitioner document. */ public function show(string $id): PractitionerDocumentResource|JsonResponse { try { $document = $this->practitionerDocumentRepository->find($id); if (!$document) { return response()->json([ 'message' => 'Document du praticien non trouvé.', ], 404); } return new PractitionerDocumentResource($document); } catch (\Exception $e) { Log::error('Error fetching practitioner document: ' . $e->getMessage(), [ 'exception' => $e, 'trace' => $e->getTraceAsString(), 'document_id' => $id, ]); return response()->json([ 'message' => 'Une erreur est survenue lors de la récupération du document du praticien.', 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } /** * Update the specified practitioner document. */ public function update(UpdatePractitionerDocumentRequest $request, string $id): PractitionerDocumentResource|JsonResponse { try { $updated = $this->practitionerDocumentRepository->update($id, $request->validated()); if (!$updated) { return response()->json([ 'message' => 'Document du praticien non trouvé ou échec de la mise à jour.', ], 404); } $document = $this->practitionerDocumentRepository->find($id); return new PractitionerDocumentResource($document); } catch (\Exception $e) { Log::error('Error updating practitioner document: ' . $e->getMessage(), [ 'exception' => $e, 'trace' => $e->getTraceAsString(), 'document_id' => $id, 'data' => $request->validated(), ]); return response()->json([ 'message' => 'Une erreur est survenue lors de la mise à jour du document du praticien.', 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } /** * Remove the specified practitioner document. */ public function destroy(string $id): JsonResponse { try { $deleted = $this->practitionerDocumentRepository->delete($id); if (!$deleted) { return response()->json([ 'message' => 'Document du praticien non trouvé ou échec de la suppression.', ], 404); } return response()->json([ 'message' => 'Document du praticien supprimé avec succès.', ], 200); } catch (\Exception $e) { Log::error('Error deleting practitioner document: ' . $e->getMessage(), [ 'exception' => $e, 'trace' => $e->getTraceAsString(), 'document_id' => $id, ]); return response()->json([ 'message' => 'Une erreur est survenue lors de la suppression du document du praticien.', 'error' => config('app.debug') ? $e->getMessage() : null, ], 500); } } }