308 lines
12 KiB
PHP
Executable File
308 lines
12 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
use App\Events\InsuredConsultation;
|
|
use App\HealthCareSheetType;
|
|
use App\InsuranceState;
|
|
use App\InsuranceSubscriptionState;
|
|
use App\Models\AgentPlus;
|
|
use App\Models\NhAuthorizationOfCareRequest;
|
|
use App\Models\NhAct;
|
|
use App\Models\NhDrugsAndDevice;
|
|
use App\Models\NhExam;
|
|
use App\Models\NhHealthCareSheet;
|
|
use App\Models\NhHealthCareSheetsExam;
|
|
use App\Models\NhHealthCareSheetsHistory;
|
|
use App\Models\NhHealthCareSheetsPerformance;
|
|
use App\Models\NhHealthCareSheetsPrescription;
|
|
use App\Models\NhInfosAuthorizationOfCareRequest;
|
|
use App\Models\NhInfosHealthCareSheets;
|
|
use App\Models\NhInsurance;
|
|
use App\Models\NhInsurancesHavingRight;
|
|
use App\Models\NhMedicalPrescription;
|
|
use App\Models\NhNetworksConfig;
|
|
use App\Models\NhPerformance;
|
|
use App\Models\NhProviderClass;
|
|
use App\Models\NhValidatingAgent;
|
|
use App\Models\User;
|
|
use App\Traits\ApiResponser;
|
|
use App\Traits\Helper;
|
|
use GuzzleHttp\Client;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Event;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Support\Facades\Mail;
|
|
use stdClass;
|
|
use Throwable;
|
|
|
|
class AuthorizationCareRequestController extends Controller
|
|
{
|
|
/**
|
|
* @OA\Post(
|
|
* path="/authorizations-care-requests",
|
|
* summary="Demander une autorisation de soin",
|
|
* tags={"Demandes d'autorisation de soins"},
|
|
* security={{"api_key":{}}},
|
|
* @OA\RequestBody(
|
|
* description="Corps de la requete",
|
|
* required=true,
|
|
* @OA\MediaType(
|
|
* mediaType="application/json",
|
|
* @OA\Schema(
|
|
* schema="request_for_authorizations_of_care",
|
|
* title = "Demande autorisation de soins",
|
|
* required={"health_care_sheet_id", "network_agent_id", "password", "practitioner_lastname", "practitioner_provider_class_id",
|
|
* "prescriptions" , "exams"},
|
|
* @OA\Property(
|
|
* property="act_id",
|
|
* description = "ID de l'acte",
|
|
* type="integer",
|
|
* example= 5
|
|
* ),
|
|
* @OA\Property(
|
|
* property="beneficiary_id",
|
|
* description = "ID du beneficiaire , s'il s'agit d'une feuille de soins pour beneficiaire",
|
|
* type="integer",
|
|
* example= 4
|
|
* ),
|
|
* @OA\Property(
|
|
* property="insurance_id",
|
|
* description = "ID de l'assurance",
|
|
* type="integer",
|
|
* example= 301
|
|
* ),
|
|
* @OA\Property(
|
|
* property="password",
|
|
* description = "Mot de passe",
|
|
* type="string",
|
|
* example= "password"
|
|
* )
|
|
* ),
|
|
* ),
|
|
* ),
|
|
* @OA\Response(
|
|
* response=200,
|
|
* description="OK",
|
|
* @OA\JsonContent(
|
|
* ref="#/components/schemas/ApiResponse",
|
|
* example = {
|
|
* "status" : 200,
|
|
* "response" : "Demande autorisation soin envoyée",
|
|
* "error":null
|
|
* }
|
|
* )
|
|
* )
|
|
* )
|
|
* @throws \App\Exceptions\AppException
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
$this->validate($request, [
|
|
'act_id' => 'required|integer|exists:nh_acts,id',
|
|
'insurance_id' => 'required|integer|exists:nh_insurances,id',
|
|
'beneficiary_id' => 'nullable|int|exists:nh_having_rights,id',
|
|
'password' => 'required|string'
|
|
]);
|
|
|
|
$act_id = $request->input('act_id');
|
|
$insurance = NhInsurance::find($request->input('insurance_id'));
|
|
if ($insurance->state != InsuranceState::PAID) {
|
|
return $this->errorResponse(__('errors.insurance_not_in_order'));
|
|
}
|
|
|
|
$user = $insurance->user;
|
|
$this->userCredentialsVerification($user, $request->input('password'));
|
|
|
|
$beneficiary_id = $request->input('beneficiary_id');
|
|
if (!empty($beneficiary_id)) {
|
|
$beneficiary = NhInsurancesHavingRight::where('insurance_id', $insurance->id)->where('having_right_id', $beneficiary_id)->first();
|
|
if (!isset($beneficiary)) {
|
|
return $this->errorResponse(trans('errors.beneficiary_not_found'));
|
|
}
|
|
} else {
|
|
$beneficiary_id = null;
|
|
}
|
|
|
|
$currentRequest = NhAuthorizationOfCareRequest::where('insurance_id', $insurance->id)->where('act_id', $act_id)
|
|
->where('beneficiary_id', $beneficiary_id)->where('state', InsuranceSubscriptionState::UNDER_VALIDATION)->first();
|
|
if (isset($currentRequest)) {
|
|
return $this->errorResponse(__('errors.act_application_already_pending'));
|
|
}
|
|
|
|
|
|
$act = NhAct::find($act_id);
|
|
try {
|
|
$datetime = $this->getCurrentTimeByCountryCode($user->network->country->code_country);
|
|
|
|
DB::beginTransaction();
|
|
$authRequest = NhAuthorizationOfCareRequest::create([
|
|
'request_id' => $this->generateRequestID(),
|
|
'insurance_id' => $insurance->id,
|
|
'beneficiary_id' => $beneficiary_id,
|
|
'to' => isset($beneficiary) ? 'HAVING_RIGHT' : 'INSURED',
|
|
'act_id' => $act_id,
|
|
'state' => InsuranceSubscriptionState::UNDER_VALIDATION,
|
|
]);
|
|
$authRequest->created_at = $authRequest->updated_at = $datetime;
|
|
DB::commit();
|
|
|
|
$recipients = array_map(function ($email) {
|
|
return preg_replace("/\s+/", "", $email);
|
|
}, NhValidatingAgent::where('role', 'DOCTOR')->whereNotNull('password')->pluck('email')->toArray());
|
|
|
|
|
|
$title = __('messages.new_care_authorisation');
|
|
$insured = $user->lastname . ' ' . $user->firstname;
|
|
if (isset($beneficiary)) {
|
|
$insured = $beneficiary->beneficiary->lastname . ' ' . $beneficiary->beneficiary->firstname;
|
|
}
|
|
$message = __('messages.new_care_authorisation_email', ['insured' => $insured, 'act' => $act->name]);
|
|
|
|
Mail::mailer('smtp')->raw($message, function ($message) use ($recipients, $title) {
|
|
$message->subject($title)
|
|
->to($recipients);
|
|
});
|
|
|
|
} catch (Throwable $t) {
|
|
DB::rollBack();
|
|
Log::error('-------- Authorization of care error -----------');
|
|
Log::error($t->getMessage() . " :\n" . $t->getTraceAsString());
|
|
}
|
|
|
|
return $this->successResponse(__('messages.new_care_authorisation_sent'));
|
|
}
|
|
|
|
public function treatRequest(Request $request)
|
|
{
|
|
$this->validate($request, [
|
|
'request_id' => 'required|integer|exists:nh_authorization_of_care_requests,id',
|
|
'validating_agent_id' => 'required|integer|exists:nh_validating_agents,id',
|
|
'action' => 'required|in:ACCEPT,REJECT'
|
|
]);
|
|
|
|
$action = $request->input('action');
|
|
$validating_agent_id = $request->input('validating_agent_id');
|
|
$request = NhAuthorizationOfCareRequest::findOrFail($request->input('request_id'));
|
|
|
|
if ($request->state != InsuranceSubscriptionState::UNDER_VALIDATION) {
|
|
return $this->errorResponse(trans('errors.care_request_already_been_processed'));
|
|
}
|
|
|
|
$datetime = $this->getCurrentTimeByCountryCode($request->insurance->network->country->code_country);
|
|
|
|
if ($action == 'ACCEPT') {
|
|
$request->state = InsuranceSubscriptionState::ACCEPTED;
|
|
$message = trans('messages.care_request_accepted');
|
|
$notification = trans('messages.care_request_accepted_notification', ['request_id' => $request->request_id]);
|
|
} else {
|
|
$request->state = InsuranceSubscriptionState::REJECTED;
|
|
$message = trans('messages.care_request_rejected');
|
|
$notification = trans('messages.care_request_rejected_notification', ['request_id' => $request->request_id]);
|
|
|
|
}
|
|
$request->validating_agent_id = $validating_agent_id;
|
|
$request->updated_at = $datetime;
|
|
$request->save();
|
|
|
|
try {
|
|
$client = new Client([
|
|
'base_uri' => config('services.notification_service.base_uri'),
|
|
]);
|
|
$headers = [
|
|
'Authorization' => config('services.notification_service.key'),
|
|
];
|
|
$body = new stdClass();
|
|
$body->user_code = $request->user->user_code;
|
|
$body->message = $notification;
|
|
$body->date = $datetime;
|
|
|
|
$data = new stdClass();
|
|
$data->screen = "demandeAutorisationSoinScreen";
|
|
$data->data = new stdClass();
|
|
$data->data->id = $request->id;
|
|
$body->data = $data;
|
|
$client->request('POST', '/onesignal/pushToUser', ['json' => $body, 'headers' => $headers]);
|
|
} catch (Throwable $t) {
|
|
Log::error('-------- Treat Care Request notification not sent-----------');
|
|
Log::error($t->getMessage() . '\n' . $t->getTraceAsString());
|
|
}
|
|
return $this->successResponse($message);
|
|
}
|
|
|
|
/**
|
|
* @OA\Get(
|
|
* path="/authorizations-care-requests",
|
|
* summary="Lister toutes les demandes autorisation de soin",
|
|
* tags={"Demandes d'autorisation de soins"},
|
|
* security={{"api_key":{}}},
|
|
* @OA\Parameter(
|
|
* parameter="user_id",
|
|
* name="user_id",
|
|
* description="ID de l'utilisateur",
|
|
* in="query",
|
|
* required=true,
|
|
* @OA\Schema(
|
|
* type="integer",
|
|
* )
|
|
* ),
|
|
* @OA\Parameter(
|
|
* parameter="page",
|
|
* name="page",
|
|
* description="Page",
|
|
* in="query",
|
|
* required=false,
|
|
* @OA\Schema(
|
|
* type="integer"
|
|
* )
|
|
* ),
|
|
* @OA\Response(
|
|
* response=200,
|
|
* description="OK",
|
|
* @OA\JsonContent(
|
|
* ref="#/components/schemas/ApiResponse",
|
|
* example = {
|
|
* "status" : 200,
|
|
* "response" : {{"id":2,"request_id":"E7879YZMOFOE","user_id":349,"act_id":7,"state":"EN COURS DE VALIDATION","validating_agent_id":null,"created_at":"2022-02-01T10:00:02.000000Z","updated_at":"2022-02-01T10:00:02.000000Z","
|
|
* act_name":"Les analyses de biologie m\u00e9dicale","act_code":"CODE4","network_id":250,"user_lastname":"Tom Di","user_firstname":null,"user_phone":"+237690716648","user_email":"ddoubletom@gmail.com","validating_agent_lastname":null,
|
|
* "validating_agent_firstname":null,"validating_agent_phone":null,"validating_agent_email":null,"network":{"id":250,"name":"Cnamgs-pharmacies"}}},
|
|
* "error":null
|
|
* }
|
|
* )
|
|
* )
|
|
* )
|
|
*/
|
|
public function getAll(Request $request)
|
|
{
|
|
$this->validate($request, [
|
|
'user_id' => 'nullable|integer|exists:users,id'
|
|
]);
|
|
|
|
$requests = NhInfosAuthorizationOfCareRequest::with(['network:id,name'])->where('user_id', $request->input('user_id'))
|
|
->orderBy('created_at', 'DESC')->paginate($request->input('perPage', 10));
|
|
foreach ($requests->items() as $r) {
|
|
$r->state = trans('states.' . $r->state);
|
|
if ($r->to == 'HAVING_RIGHT') {
|
|
$r->user_lastname = $r->beneficiary_lastname;
|
|
$r->user_firstname = $r->beneficiary_firstname;
|
|
}
|
|
$r->to = trans('states.' . $r->to);
|
|
unset($r->beneficiary_lastname, $r->beneficiary_firstname);
|
|
}
|
|
return $this->successResponse($requests);
|
|
}
|
|
|
|
private function generateRequestID(): string
|
|
{
|
|
do {
|
|
$code = generateTransactionCode();
|
|
$codeCorrect = NhAuthorizationOfCareRequest::where('request_id', $code)->count() < 0;
|
|
} while ($codeCorrect);
|
|
return $code;
|
|
}
|
|
|
|
|
|
}
|