nanosanteservice/app/Http/Controllers/AuthorizationCareRequestCon...

150 lines
5.1 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\NhInfosHealthCareSheets;
use App\Models\NhInsurance;
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 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="user_id",
* description = "ID de l'utilisateur",
* 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
* }
* )
* )
* )
*/
public function store(Request $request)
{
$this->validate($request, [
'act_id' => 'required|integer|exists:nh_acts,id',
'user_id' => 'required|integer|exists:users,id',
'password' => 'required|string'
]);
$user = User::find($request->input('user_id'));
$act_id = $request->input('act_id');
$password = $request->input('password');
if (!checkPassword($password, $user->encrypted_password, $user->salt))
return $this->errorResponse(trans('messages.incorrect_user_password'));
$act = NhAct::find($act_id);
try {
DB::beginTransaction();
NhAuthorizationOfCareRequest::create([
'request_id' => $this->generateRequestID(),
'user_id' => $user->id,
'act_id' => $act_id,
'state' => InsuranceSubscriptionState::UNDER_VALIDATION
]);
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');
$message = __('messages.new_care_authorisation_email', ['insured' => $user->lastname . ' ' . $user->firstname, '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'));
}
private function generateRequestID(): string
{
do {
$code = generateTransactionCode();
$codeCorrect = NhAuthorizationOfCareRequest::where('request_id', $code)->count() < 0;
} while ($codeCorrect);
return $code;
}
}