patientsIndex(['per_page' => 10]); */ class ApiException extends \RuntimeException { public function __construct(public readonly int $status, string $message, public readonly ?string $requestId = null, public readonly array $errors = []) { parent::__construct($message, $status); } } class ApiClient { public function __construct( private readonly string $baseUrl, private readonly ?string $apiKey = null, private readonly ?string $token = null, private readonly ?int $clinicId = null, private readonly int $maxRetries = 2, ) {} private function request(string $method, string $path, array $query, ?array $body, ?string $idempotencyKey): array { $url = rtrim($this->baseUrl, '/').$path.($query ? '?'.http_build_query($query) : ''); $headers = ['Accept: application/json']; if ($this->apiKey) { $headers[] = 'X-API-Key: '.$this->apiKey; } if ($this->token) { $headers[] = 'Authorization: Bearer '.$this->token; } if ($this->clinicId) { $headers[] = 'X-Clinic-ID: '.$this->clinicId; } if ($idempotencyKey) { $headers[] = 'Idempotency-Key: '.$idempotencyKey; } if ($body !== null) { $headers[] = 'Content-Type: application/json'; } $retries = ($method === 'GET' || $idempotencyKey) ? $this->maxRetries : 0; for ($attempt = 0; ; $attempt++) { $responseHeaders = []; $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_POSTFIELDS => $body === null ? null : json_encode($body), CURLOPT_HEADERFUNCTION => function ($c, $line) use (&$responseHeaders) { $parts = explode(':', $line, 2); if (count($parts) === 2) { $responseHeaders[strtolower(trim($parts[0]))] = trim($parts[1]); } return strlen($line); }, ]); $raw = curl_exec($ch); $status = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE); curl_close($ch); if (in_array($status, [429, 502, 503, 504], true) && $attempt < $retries) { sleep((int) ($responseHeaders['retry-after'] ?? 2 ** $attempt)); continue; } $json = json_decode((string) $raw, true) ?: []; if ($status < 200 || $status >= 300) { throw new ApiException($status, $json['message'] ?? 'Error de la API', $responseHeaders['x-request-id'] ?? ($json['request_id'] ?? null), $json['errors'] ?? []); } return $json; } } /** Appointments — Appointments — GET /api/mobile/v1/appointments */ public function generated::PSt4xodrBeIxv0dt(?string $idempotencyKey = null): array { return $this->request('GET', "/api/mobile/v1/appointments", [], null, $idempotencyKey); } /** Iniciar sesión desde la app móvil y obtener un token — POST /api/mobile/v1/auth/login */ public function generated::DhN5gQmxjoybnQ1s(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/mobile/v1/auth/login", [], $body, $idempotencyKey); } /** Lab Results — Lab Results — GET /api/mobile/v1/clinical/lab-results */ public function generated::Ru7FqqH0MY3HTgd4(?string $idempotencyKey = null): array { return $this->request('GET', "/api/mobile/v1/clinical/lab-results", [], null, $idempotencyKey); } /** Prescriptions — Prescriptions — GET /api/mobile/v1/clinical/prescriptions */ public function generated::JG4wep8pb0TxpQ01(?string $idempotencyKey = null): array { return $this->request('GET', "/api/mobile/v1/clinical/prescriptions", [], null, $idempotencyKey); } /** Agenda — Agenda — GET /api/mobile/v1/doctor/agenda */ public function generated::tQyvUkam9A0fFIk9(?string $idempotencyKey = null): array { return $this->request('GET', "/api/mobile/v1/doctor/agenda", [], null, $idempotencyKey); } /** Catálogos clínicos para construir formularios en la app (CIE10, exámenes de laboratorio e imagenología). — GET /api/mobile/v1/doctor/catalogs */ public function generated::imOmHNPDzRt30twc(?string $idempotencyKey = null): array { return $this->request('GET', "/api/mobile/v1/doctor/catalogs", [], null, $idempotencyKey); } /** Crear una consulta de consulta externa (draft por defecto, o completed si se indica). — POST /api/mobile/v1/doctor/consultations */ public function generated::5LM69IzsiUxdBXtu(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/mobile/v1/doctor/consultations", [], $body, $idempotencyKey); } /** Detalle de una consulta (secciones + órdenes vinculadas). — GET /api/mobile/v1/doctor/consultations/{consultation} */ public function generated::EHmEOBAVBDIJbtae(string|int $consultation, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/mobile/v1/doctor/consultations/{rawurlencode((string) $consultation)}", [], null, $idempotencyKey); } /** Ordenar estudios de imagenología vinculados a la consulta. — POST /api/mobile/v1/doctor/consultations/{consultation}/imaging-orders */ public function generated::fq09MZKbHHl3LYct(string|int $consultation, array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/mobile/v1/doctor/consultations/{rawurlencode((string) $consultation)}/imaging-orders", [], $body, $idempotencyKey); } /** Ordenar exámenes de laboratorio vinculados a la consulta. — POST /api/mobile/v1/doctor/consultations/{consultation}/lab-orders */ public function generated::N0Yg9Bp0DTKWRktC(string|int $consultation, array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/mobile/v1/doctor/consultations/{rawurlencode((string) $consultation)}/lab-orders", [], $body, $idempotencyKey); } /** Agregar recetas a una consulta existente (solo borradores o del propio doctor). — POST /api/mobile/v1/doctor/consultations/{consultation}/prescriptions */ public function generated::vn2mx2Bv7rbegHjU(string|int $consultation, array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/mobile/v1/doctor/consultations/{rawurlencode((string) $consultation)}/prescriptions", [], $body, $idempotencyKey); } /** Patients Today — Patients Today — GET /api/mobile/v1/doctor/patients-today */ public function generated::F9n8ylMaeZJoyKLl(?string $idempotencyKey = null): array { return $this->request('GET', "/api/mobile/v1/doctor/patients-today", [], null, $idempotencyKey); } /** Get Current Patient I P S — Summary — GET /api/mobile/v1/ips/summary */ public function generated::yshScKMsabyFb0sw(?string $idempotencyKey = null): array { return $this->request('GET', "/api/mobile/v1/ips/summary", [], null, $idempotencyKey); } /** Revoke the current access token (HIPAA: supports rapid credential invalidation). — DELETE /api/mobile/v1/tokens/current */ public function generated::WHda1ZC5cpNy4RTJ(?string $idempotencyKey = null): array { return $this->request('DELETE', "/api/mobile/v1/tokens/current", [], null, $idempotencyKey); } /** Consultar user — GET /api/mobile/v1/user */ public function generated::qkRTbSoEx5VRF32B(?string $idempotencyKey = null): array { return $this->request('GET', "/api/mobile/v1/user", [], null, $idempotencyKey); } /** Obtener un token de acceso con permisos acotados — POST /api/tokens */ public function generated::rLBTkkY6JBTar8vD(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/tokens", [], $body, $idempotencyKey); } /** Revocar el token actual (cerrar sesión) — DELETE /api/tokens/current */ public function generated::ey0hMdpypYXfelto(?string $idempotencyKey = null): array { return $this->request('DELETE', "/api/tokens/current", [], null, $idempotencyKey); } /** Return SMART configuration JSON document. — GET /api/v1/.well-known/smart-configuration */ public function smartConfiguration(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/.well-known/smart-configuration", [], null, $idempotencyKey); } /** Expand — Expand — POST /api/v1/advancadimelco/expand */ public function advancadimelcoExpand(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/advancadimelco/expand", [], $body, $idempotencyKey); } /** Parse — Parse — POST /api/v1/advancadimelco/parse */ public function advancadimelcoParse(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/advancadimelco/parse", [], $body, $idempotencyKey); } /** Listar snippets — GET /api/v1/advancadimelco/snippets */ public function advancadimelcoSnippetsIndex(array $query = [], ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/advancadimelco/snippets", $query, null, $idempotencyKey); } /** Crear snippets — POST /api/v1/advancadimelco/snippets */ public function advancadimelcoSnippetsStore(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/advancadimelco/snippets", [], $body, $idempotencyKey); } /** Actualizar snippets — PATCH /api/v1/advancadimelco/snippets/{advancadimelcoSnippet} */ public function advancadimelcoSnippetsUpdate(string|int $advancadimelcoSnippet, array $body, ?string $idempotencyKey = null): array { return $this->request('PATCH', "/api/v1/advancadimelco/snippets/{rawurlencode((string) $advancadimelcoSnippet)}", [], $body, $idempotencyKey); } /** Eliminar snippets — DELETE /api/v1/advancadimelco/snippets/{advancadimelcoSnippet} */ public function advancadimelcoSnippetsDestroy(string|int $advancadimelcoSnippet, ?string $idempotencyKey = null): array { return $this->request('DELETE', "/api/v1/advancadimelco/snippets/{rawurlencode((string) $advancadimelcoSnippet)}", [], null, $idempotencyKey); } /** Suggest — Suggest — GET /api/v1/advancadimelco/suggest */ public function advancadimelcoSuggest(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/advancadimelco/suggest", [], null, $idempotencyKey); } /** Listar terms — GET /api/v1/advancadimelco/terms */ public function advancadimelcoTermsIndex(array $query = [], ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/advancadimelco/terms", $query, null, $idempotencyKey); } /** Crear terms — POST /api/v1/advancadimelco/terms */ public function advancadimelcoTermsStore(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/advancadimelco/terms", [], $body, $idempotencyKey); } /** Actualizar terms — PATCH /api/v1/advancadimelco/terms/{advancadimelcoTerm} */ public function advancadimelcoTermsUpdate(string|int $advancadimelcoTerm, array $body, ?string $idempotencyKey = null): array { return $this->request('PATCH', "/api/v1/advancadimelco/terms/{rawurlencode((string) $advancadimelcoTerm)}", [], $body, $idempotencyKey); } /** Eliminar terms — DELETE /api/v1/advancadimelco/terms/{advancadimelcoTerm} */ public function advancadimelcoTermsDestroy(string|int $advancadimelcoTerm, ?string $idempotencyKey = null): array { return $this->request('DELETE', "/api/v1/advancadimelco/terms/{rawurlencode((string) $advancadimelcoTerm)}", [], null, $idempotencyKey); } /** Generate Summary — Generate Summary — POST /api/v1/ai/generate-summary */ public function aiGenerateSummary(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/ai/generate-summary", [], $body, $idempotencyKey); } /** Suggest Diagnoses — Suggest Diagnoses — POST /api/v1/ai/suggest-diagnoses */ public function aiSuggestDiagnoses(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/ai/suggest-diagnoses", [], $body, $idempotencyKey); } /** Suggest Dosage — Suggest Dosage — POST /api/v1/ai/suggest-dosage */ public function aiSuggestDosage(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/ai/suggest-dosage", [], $body, $idempotencyKey); } /** Listar turnos de la agenda (filtros: practitioner_id, patient_id, status, date_from, date_to) — GET /api/v1/appointments */ public function integrationAppointmentsIndex(array $query = [], ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/appointments", $query, null, $idempotencyKey); } /** Agendar un turno para un paciente con un profesional (sin doble reserva) — POST /api/v1/appointments */ public function integrationAppointmentsStore(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/appointments", [], $body, $idempotencyKey); } /** Obtener un turno — GET /api/v1/appointments/{appointment} */ public function integrationAppointmentsShow(string|int $appointment, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/appointments/{rawurlencode((string) $appointment)}", [], null, $idempotencyKey); } /** Confirmar llegada, cancelar o marcar inasistencia — PATCH /api/v1/appointments/{appointment}/status */ public function integrationAppointmentsStatus(string|int $appointment, array $body, ?string $idempotencyKey = null): array { return $this->request('PATCH', "/api/v1/appointments/{rawurlencode((string) $appointment)}/status", [], $body, $idempotencyKey); } /** Obtener un token de acceso (iniciar sesión con usuario y contraseña) — POST /api/v1/auth/token */ public function authToken(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/auth/token", [], $body, $idempotencyKey); } /** Search — Search — GET /api/v1/catalogs/{catalog}/search */ public function catalogsSearch(string|int $catalog, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/catalogs/{rawurlencode((string) $catalog)}/search", [], null, $idempotencyKey); } /** Evaluate patient vital signs against NEWS2 and qSOFA predictive models. — POST /api/v1/clinical/prediction/sepsis-early-warning */ public function predictionSepsisEvaluate(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/clinical/prediction/sepsis-early-warning", [], $body, $idempotencyKey); } /** Listar diagnósticos CIE-10 (filtros: patient_id, code) — GET /api/v1/diagnoses */ public function integrationDiagnosesIndex(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/diagnoses", [], null, $idempotencyKey); } /** Listar form 008 — GET /api/v1/emergency/form-008 */ public function emergencyForm008Index(array $query = [], ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/emergency/form-008", $query, null, $idempotencyKey); } /** Crear form 008 — POST /api/v1/emergency/form-008 */ public function emergencyForm008Store(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/emergency/form-008", [], $body, $idempotencyKey); } /** Obtener form 008 — GET /api/v1/emergency/form-008/{emergencyForm008} */ public function emergencyForm008Show(string|int $emergencyForm008, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/emergency/form-008/{rawurlencode((string) $emergencyForm008)}", [], null, $idempotencyKey); } /** Actualizar form 008 — PATCH /api/v1/emergency/form-008/{emergencyForm008} */ public function emergencyForm008Update(string|int $emergencyForm008, array $body, ?string $idempotencyKey = null): array { return $this->request('PATCH', "/api/v1/emergency/form-008/{rawurlencode((string) $emergencyForm008)}", [], $body, $idempotencyKey); } /** Eliminar form 008 — DELETE /api/v1/emergency/form-008/{emergencyForm008} */ public function emergencyForm008Destroy(string|int $emergencyForm008, ?string $idempotencyKey = null): array { return $this->request('DELETE', "/api/v1/emergency/form-008/{rawurlencode((string) $emergencyForm008)}", [], null, $idempotencyKey); } /** Print — Print — GET /api/v1/emergency/form-008/{emergencyForm008}/print */ public function emergencyForm008Print(string|int $emergencyForm008, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/emergency/form-008/{rawurlencode((string) $emergencyForm008)}/print", [], null, $idempotencyKey); } /** Registrar una consulta completa (anamnesis, signos, diagnósticos, plan y prescripción) con un profesional responsable — POST /api/v1/encounters */ public function integrationEncountersStore(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/encounters", [], $body, $idempotencyKey); } /** Listar consultas (filtros: patient_id, date_from, date_to) — GET /api/v1/encounters */ public function integrationEncountersIndex(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/encounters", [], null, $idempotencyKey); } /** Obtener una consulta completa — GET /api/v1/encounters/{consultation} */ public function integrationEncountersShow(string|int $consultation, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/encounters/{rawurlencode((string) $consultation)}", [], null, $idempotencyKey); } /** Obtener la receta vigente de una consulta — GET /api/v1/encounters/{consultation}/recipe */ public function integrationEncountersRecipeShow(string|int $consultation, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/encounters/{rawurlencode((string) $consultation)}/recipe", [], null, $idempotencyKey); } /** Emitir la receta de una consulta (solo el médico tratante) — POST /api/v1/encounters/{consultation}/recipe */ public function integrationEncountersRecipeIssue(string|int $consultation, array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/encounters/{rawurlencode((string) $consultation)}/recipe", [], $body, $idempotencyKey); } /** Process a FHIR transaction or batch Bundle (POST /api/v1/fhir). — POST /api/v1/fhir */ public function fhirBundle(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/fhir", [], $body, $idempotencyKey); } /** Return SMART configuration JSON document. — GET /api/v1/fhir/.well-known/smart-configuration */ public function fhirSmartConfiguration(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/fhir/.well-known/smart-configuration", [], null, $idempotencyKey); } /** Obtener el CapabilityStatement del servidor FHIR — GET /api/v1/fhir/metadata */ public function fhirMetadata(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/fhir/metadata", [], null, $idempotencyKey); } /** Create — Fhir — POST /api/v1/fhir/{resourceType} */ public function fhirCreate(string|int $resourceType, array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/fhir/{rawurlencode((string) $resourceType)}", [], $body, $idempotencyKey); } /** Search or list resources by resource type. — GET /api/v1/fhir/{resourceType} */ public function fhirSearch(string|int $resourceType, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/fhir/{rawurlencode((string) $resourceType)}", [], null, $idempotencyKey); } /** Operación $validate: valida el recurso sin persistir (200 información o — POST /api/v1/fhir/{resourceType}/$validate */ public function fhirValidate(string|int $resourceType, array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/fhir/{rawurlencode((string) $resourceType)}/$validate", [], $body, $idempotencyKey); } /** Actualizar fhir — PUT /api/v1/fhir/{resourceType}/{id} */ public function fhirUpdate(string|int $resourceType, string|int $id, array $body, ?string $idempotencyKey = null): array { return $this->request('PUT', "/api/v1/fhir/{rawurlencode((string) $resourceType)}/{rawurlencode((string) $id)}", [], $body, $idempotencyKey); } /** Read a specific resource by ID. — GET /api/v1/fhir/{resourceType}/{id} */ public function fhirRead(string|int $resourceType, string|int $id, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/fhir/{rawurlencode((string) $resourceType)}/{rawurlencode((string) $id)}", [], null, $idempotencyKey); } /** List active hospitalizations for current clinic. — GET /api/v1/hospitalization/active */ public function hospActive(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/hospitalization/active", [], null, $idempotencyKey); } /** Admit a patient. — POST /api/v1/hospitalization/admit */ public function hospAdmit(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/hospitalization/admit", [], $body, $idempotencyKey); } /** Print Pre-Anesthetic (Form 018) — GET /api/v1/hospitalization/pre-anesthetic-018/{form}/print */ public function hospPreanesthetic018Print(string|int $form, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/hospitalization/pre-anesthetic-018/{rawurlencode((string) $form)}/print", [], null, $idempotencyKey); } /** Print Surgical Protocol (Form 017) — GET /api/v1/hospitalization/protocol-017/{protocol}/print */ public function hospProtocol017Print(string|int $protocol, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/hospitalization/protocol-017/{rawurlencode((string) $protocol)}/print", [], null, $idempotencyKey); } /** Record discharge. — POST /api/v1/hospitalization/{hospitalization}/discharge */ public function hospDischarge(string|int $hospitalization, array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/hospitalization/{rawurlencode((string) $hospitalization)}/discharge", [], $body, $idempotencyKey); } /** Add a medical evolution note. — POST /api/v1/hospitalization/{hospitalization}/evolution */ public function hospEvolution(string|int $hospitalization, array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/hospitalization/{rawurlencode((string) $hospitalization)}/evolution", [], $body, $idempotencyKey); } /** Generate PDF for the admission note. — GET /api/v1/hospitalization/{hospitalization}/print-admission */ public function hospPrintAdmission(string|int $hospitalization, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/hospitalization/{rawurlencode((string) $hospitalization)}/print-admission", [], null, $idempotencyKey); } /** Print Anamnesis — Print Anamnesis — GET /api/v1/hospitalization/{hospitalization}/print-anamnesis */ public function hospPrintAnamnesis(string|int $hospitalization, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/hospitalization/{rawurlencode((string) $hospitalization)}/print-anamnesis", [], null, $idempotencyKey); } /** Generate PDF for the Epicrisis. — GET /api/v1/hospitalization/{hospitalization}/print-epicrisis */ public function hospPrintEpicrisis(string|int $hospitalization, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/hospitalization/{rawurlencode((string) $hospitalization)}/print-epicrisis", [], null, $idempotencyKey); } /** PATCH /api/v1/infrastructure/beds/{bed} — PATCH /api/v1/infrastructure/beds/{bed} */ public function infraBedsUpdate(string|int $bed, array $body, ?string $idempotencyKey = null): array { return $this->request('PATCH', "/api/v1/infrastructure/beds/{rawurlencode((string) $bed)}", [], $body, $idempotencyKey); } /** Overview of all rooms and bed availability for the current clinic. — GET /api/v1/infrastructure/overview */ public function infraOverview(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/infrastructure/overview", [], null, $idempotencyKey); } /** GET /api/v1/infrastructure/rooms — GET /api/v1/infrastructure/rooms */ public function infraRoomsIndex(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/infrastructure/rooms", [], null, $idempotencyKey); } /** POST /api/v1/infrastructure/rooms — POST /api/v1/infrastructure/rooms */ public function infraRoomsStore(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/infrastructure/rooms", [], $body, $idempotencyKey); } /** PATCH /api/v1/infrastructure/rooms/{room} — PATCH /api/v1/infrastructure/rooms/{room} */ public function infraRoomsUpdate(string|int $room, array $body, ?string $idempotencyKey = null): array { return $this->request('PATCH', "/api/v1/infrastructure/rooms/{rawurlencode((string) $room)}", [], $body, $idempotencyKey); } /** DELETE /api/v1/infrastructure/rooms/{room} — DELETE /api/v1/infrastructure/rooms/{room} */ public function infraRoomsDestroy(string|int $room, ?string $idempotencyKey = null): array { return $this->request('DELETE', "/api/v1/infrastructure/rooms/{rawurlencode((string) $room)}", [], null, $idempotencyKey); } /** GET /api/v1/infrastructure/rooms/{room}/beds — GET /api/v1/infrastructure/rooms/{room}/beds */ public function infraBedsIndex(string|int $room, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/infrastructure/rooms/{rawurlencode((string) $room)}/beds", [], null, $idempotencyKey); } /** Send Fhir Patient — Patient — POST /api/v1/interoperability/fhir/patient */ public function interopFhirPatientSend(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/interoperability/fhir/patient", [], $body, $idempotencyKey); } /** Get Fhir Patient — Patient — GET /api/v1/interoperability/fhir/patient/{id} */ public function interopFhirPatientGet(string|int $id, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/interoperability/fhir/patient/{rawurlencode((string) $id)}", [], null, $idempotencyKey); } /** Ingest Hl7 — Ingest — POST /api/v1/interoperability/hl7/ingest */ public function interopHl7Ingest(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/interoperability/hl7/ingest", [], $body, $idempotencyKey); } /** Send Hl7 — Send — POST /api/v1/interoperability/hl7/send */ public function interopHl7Send(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/interoperability/hl7/send", [], $body, $idempotencyKey); } /** Map Fhir To Local — Patient — POST /api/v1/interoperability/map/fhir/patient */ public function interopMapFhirToLocal(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/interoperability/map/fhir/patient", [], $body, $idempotencyKey); } /** Map Local To Fhir — Patient — GET /api/v1/interoperability/map/fhir/patient/{id} */ public function interopMapLocalToFhir(string|int $id, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/interoperability/map/fhir/patient/{rawurlencode((string) $id)}", [], null, $idempotencyKey); } /** Test Fhir — Fhir — GET /api/v1/interoperability/test/fhir */ public function interopTestFhir(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/interoperability/test/fhir", [], null, $idempotencyKey); } /** Test Hl7 — Hl7 — GET /api/v1/interoperability/test/hl7 */ public function interopTestHl7(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/interoperability/test/hl7", [], null, $idempotencyKey); } /** Get Patient I P S — Patient — GET /api/v1/ips/patient/{id} */ public function ipsPatientSummary(string|int $id, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/ips/patient/{rawurlencode((string) $id)}", [], null, $idempotencyKey); } /** Consultar me — GET /api/v1/me */ public function me(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/me", [], null, $idempotencyKey); } /** Consultar history — GET /api/v1/notifications/history */ public function notificationsHistory(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/notifications/history", [], null, $idempotencyKey); } /** Registrar register token — POST /api/v1/notifications/register-token */ public function notificationsRegister(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/notifications/register-token", [], $body, $idempotencyKey); } /** Actualizar read — PATCH /api/v1/notifications/{notificationId}/read */ public function notificationsRead(string|int $notificationId, array $body, ?string $idempotencyKey = null): array { return $this->request('PATCH', "/api/v1/notifications/{rawurlencode((string) $notificationId)}/read", [], $body, $idempotencyKey); } /** Display a listing of consultations. — GET /api/v1/outpatient/consultations */ public function outpatientConsultationsIndex(array $query = [], ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/outpatient/consultations", $query, null, $idempotencyKey); } /** Display the specified consultation. — POST /api/v1/outpatient/consultations */ public function outpatientConsultationsStore(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/outpatient/consultations", [], $body, $idempotencyKey); } /** Display the specified consultation. — GET /api/v1/outpatient/consultations/{consultation} */ public function outpatientConsultationsShow(string|int $consultation, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/outpatient/consultations/{rawurlencode((string) $consultation)}", [], null, $idempotencyKey); } /** Update the specified consultation. — PUT /api/v1/outpatient/consultations/{consultation} */ public function outpatientConsultationsUpdate(string|int $consultation, array $body, ?string $idempotencyKey = null): array { return $this->request('PUT', "/api/v1/outpatient/consultations/{rawurlencode((string) $consultation)}", [], $body, $idempotencyKey); } /** Generate PDF for the consultation. — GET /api/v1/outpatient/consultations/{consultation}/print-anamnesis */ public function outpatientConsultationsPrintAnamnesis(string|int $consultation, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/outpatient/consultations/{rawurlencode((string) $consultation)}/print-anamnesis", [], null, $idempotencyKey); } /** List history for a patient. — GET /api/v1/outpatient/patients/{patient}/history */ public function outpatientPatientsHistory(string|int $patient, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/outpatient/patients/{rawurlencode((string) $patient)}/history", [], null, $idempotencyKey); } /** Listar y buscar pacientes (paginado) — GET /api/v1/patients */ public function patientsIndex(array $query = [], ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/patients", $query, null, $idempotencyKey); } /** Registrar un paciente (409 si el documento ya existe en la clínica) — POST /api/v1/patients */ public function integrationPatientsStore(array $body, array $query = [], ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/patients", $query, $body, $idempotencyKey); } /** Obtener la identificación de un paciente — GET /api/v1/patients/{patient} */ public function integrationPatientsShow(string|int $patient, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/patients/{rawurlencode((string) $patient)}", [], null, $idempotencyKey); } /** Consultar si el paciente tiene consentimiento vigente y si la clínica lo exige — GET /api/v1/patients/{patient}/consents */ public function integrationPatientsConsentsShow(string|int $patient, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/patients/{rawurlencode((string) $patient)}/consents", [], null, $idempotencyKey); } /** Registrar el consentimiento del paciente (solo personal de la clínica; una aplicación recibe 403) — POST /api/v1/patients/{patient}/consents */ public function integrationPatientsConsentsStore(string|int $patient, array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/patients/{rawurlencode((string) $patient)}/consents", [], $body, $idempotencyKey); } /** Retirar el consentimiento del paciente (rige desde la siguiente petición) — DELETE /api/v1/patients/{patient}/consents */ public function integrationPatientsConsentsDestroy(string|int $patient, ?string $idempotencyKey = null): array { return $this->request('DELETE', "/api/v1/patients/{rawurlencode((string) $patient)}/consents", [], null, $idempotencyKey); } /** Expediente del paciente: consultas con anamnesis, diagnóstico, tratamiento y prescripción, y recetas emitidas — GET /api/v1/patients/{patient}/medical-record */ public function integrationPatientsMedicalRecord(string|int $patient, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/patients/{rawurlencode((string) $patient)}/medical-record", [], null, $idempotencyKey); } /** Dispense medications to a patient. — POST /api/v1/pharmacy/dispense */ public function pharmacyDispense(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/pharmacy/dispense", [], $body, $idempotencyKey); } /** Display current inventory levels. — GET /api/v1/pharmacy/inventory */ public function pharmacyInventory(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/pharmacy/inventory", [], null, $idempotencyKey); } /** Comprobar que la API responde (no requiere credenciales) — GET /api/v1/ping */ public function ping(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/ping", [], null, $idempotencyKey); } /** Listar los profesionales de la clínica — GET /api/v1/practitioners */ public function integrationPractitionersIndex(array $query = [], ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/practitioners", $query, null, $idempotencyKey); } /** Obtener un profesional — GET /api/v1/practitioners/{practitioner} */ public function integrationPractitionersShow(string|int $practitioner, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/practitioners/{rawurlencode((string) $practitioner)}", [], null, $idempotencyKey); } /** Horarios libres de un profesional en una fecha — GET /api/v1/practitioners/{practitioner}/availability */ public function integrationPractitionersAvailability(string|int $practitioner, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/practitioners/{rawurlencode((string) $practitioner)}/availability", [], null, $idempotencyKey); } /** Listar prescripciones: medicamento, dosis, frecuencia, duración, vía e indicaciones — GET /api/v1/prescriptions */ public function integrationPrescriptionsIndex(array $query = [], ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/prescriptions", $query, null, $idempotencyKey); } /** Obtener una prescripción — GET /api/v1/prescriptions/{prescription} */ public function integrationPrescriptionsShow(string|int $prescription, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/prescriptions/{rawurlencode((string) $prescription)}", [], null, $idempotencyKey); } /** Listar recetas emitidas (filtros: folio, status, patient_id) — GET /api/v1/recipes */ public function integrationRecipesIndex(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/recipes", [], null, $idempotencyKey); } /** Obtener una receta con sus medicamentos — GET /api/v1/recipes/{recipe} */ public function integrationRecipesShow(string|int $recipe, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/recipes/{rawurlencode((string) $recipe)}", [], null, $idempotencyKey); } /** Registrar la dispensación de una receta (requiere el código de verificación impreso) — POST /api/v1/recipes/{recipe}/dispense */ public function integrationRecipesDispense(string|int $recipe, array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/recipes/{rawurlencode((string) $recipe)}/dispense", [], $body, $idempotencyKey); } /** Listar settings — GET /api/v1/settings */ public function settingsIndex(array $query = [], ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/settings", $query, null, $idempotencyKey); } /** Crear settings — POST /api/v1/settings */ public function settingsStore(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/settings", [], $body, $idempotencyKey); } /** Obtener settings — GET /api/v1/settings/{systemSetting} */ public function settingsShow(string|int $systemSetting, ?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/settings/{rawurlencode((string) $systemSetting)}", [], null, $idempotencyKey); } /** Actualizar settings — PATCH /api/v1/settings/{systemSetting} */ public function settingsUpdate(string|int $systemSetting, array $body, ?string $idempotencyKey = null): array { return $this->request('PATCH', "/api/v1/settings/{rawurlencode((string) $systemSetting)}", [], $body, $idempotencyKey); } /** Eliminar settings — DELETE /api/v1/settings/{systemSetting} */ public function settingsDestroy(string|int $systemSetting, ?string $idempotencyKey = null): array { return $this->request('DELETE', "/api/v1/settings/{rawurlencode((string) $systemSetting)}", [], null, $idempotencyKey); } /** Issue a scoped personal access token (HIPAA: restricts access to minimum necessary data). — POST /api/v1/tokens */ public function tokensStore(array $body, ?string $idempotencyKey = null): array { return $this->request('POST', "/api/v1/tokens", [], $body, $idempotencyKey); } /** Revoke the current access token (HIPAA: supports rapid credential invalidation). — DELETE /api/v1/tokens/current */ public function tokensDestroy(?string $idempotencyKey = null): array { return $this->request('DELETE', "/api/v1/tokens/current", [], null, $idempotencyKey); } /** Listar planes terapéuticos (filtro: patient_id) — GET /api/v1/treatments */ public function integrationTreatmentsIndex(?string $idempotencyKey = null): array { return $this->request('GET', "/api/v1/treatments", [], null, $idempotencyKey); } }