$countryId]); foreach ($insurances as $insurance) { $months_prices = DB::select("SELECT id, number_of_months , min_amount FROM nh_months_prices_grid WHERE nh_network_config_id = :nhc_id", ['nhc_id' => $insurance->nhc_id]); foreach ($months_prices as $mp) { $mp->min_amount = $this->toMoneyWithCurrencyCode($mp->min_amount, $country->currency_code ?? 'XAF'); } $insurance->months_prices = $months_prices; unset($insurance->nhc_id); } return $this->successResponse($insurances); } /** * @OA\Post( * path="/insurances/bonus-amount", * summary="Calculer le montant de la prime", * tags={"Assurances"}, * security={{"api_key":{}}}, * @OA\RequestBody( * description="Corps de la requete", * required=true, * @OA\MediaType( * mediaType="application/json", * @OA\Schema( * @OA\Property(property="network_id", * type="integer", * example = 250, * description="ID du reseau de l'assureur" * ), * @OA\Property(property="month_price_id", * type="integer", * example=2, * description="ID de la grille de prix choisit lors de la souscription" * ), * @OA\Property( * property="beneficiaries", * description="Listes de quelques infos sur les beneficiaires ou ayants droit", * example = {{"birthdate":"1998-10-05","affiliation":"CHILD"}} * ), * ), * example = {"network_id":250,"month_price_id":3,"beneficiaries":{{"birthdate":"1998-10-05","affiliation":"CHILD"}}} * ) * ), * @OA\Response( * response=200, * description="OK", * @OA\JsonContent( * ref="#/components/schemas/ApiResponse", * example = {"status":200,"response":{"bonus_amount":75000,"bonus_amount_formatted":"75 000FCFA"},"error":null}, * ) * ) * ) */ public function calculateBonusAmount(Request $request) { $this->validate($request, [ 'network_id' => 'required|integer|exists:networks,id', 'month_price_id' => 'required|integer|exists:nh_months_prices_grid,id', 'beneficiaries' => 'required|array', 'beneficiaries.*.birthdate' => 'required|date_format:Y-m-d|before:today', 'beneficiaries.*.affiliation' => 'required|in:CHILD,SPOUSE' ]); $networkConfig = NhNetworksConfig::where('network_id', $request->input('network_id'))->first(); if (!isset($networkConfig) || $networkConfig->configWallet->type != 'ilink_sante') return $this->errorResponse(trans('errors.nano_health_not_activated')); $monthPrice = $networkConfig->monthsPricesGrid()->where('id', $request->input('month_price_id'))->first(); if (!isset($monthPrice)) return $this->errorResponse(trans('errors.incorrect_selected_amount')); $bonus = 0; foreach ($request->input('beneficiaries') as $b) { $age = date_diff(date_create($b['birthdate']), date_create('now'))->y; $levels = $networkConfig->yearsPricesGrid->filter(function ($level) use ($age) { return $level->min_age <= $age && $level->max_age >= $age; }); foreach ($levels as $level) { $bonus += $level->markup_percentage * $monthPrice->min_amount / 100; } } return $this->successResponse([ 'bonus_amount' => $bonus, 'bonus_amount_formatted' => $this->toMoneyWithNetwork($bonus, $request->input('network_id')) ]); } /** * @OA\Post( * path="/insurances/subscribe", * summary="Souscrire à une assurance", * tags={"Assurances"}, * security={{"api_key":{}}}, * @OA\RequestBody( * description="Corps de la requete", * required=true, * @OA\MediaType( * mediaType="application/json", * @OA\Schema(ref="#/components/schemas/subscribe_incurance"), * example = {"network_id":250,"user_id":20,"month_price_id":3,"bonus_amount":20000,"beneficiaries":{{"lastname":"Djery","firstname":"DI","gender":"M","birthdate":"2001-10-05", * "affiliation":"CHILD","birthdate_proof":"CERTIFIED_COPY","birthdate_proof_doc":"birth.jpg","justice_doc":"just.png","marriage_certificate_doc":"mariage.png", * "id_document_type":"CNI","id_document_front":"cni_front.jpg","id_document_back":"cni_front.jpg"}}} * ) * ), * @OA\Response( * response=200, * description="OK", * @OA\JsonContent( * ref="#/components/schemas/ApiResponse", * example = {"status":200,"response":"Transaction réussie","error":null} * ) * ) * ) */ public function subscribe(Request $request) { /** * @OA\Schema( * schema="subscribe_incurance", * title = "Souscription à une assurance", * required={"network_id", "user_id" , "month_price_id","bonus_amount" , "beneficiaries"}, * @OA\Property(property="network_id", * type="integer", * example = 250, * description="ID du reseau de l'assureur" * ), * @OA\Property(property="user_id", * type="integer", * example=300, * description="ID l'utilisateur identifié" * ), * @OA\Property(property="month_price_id", * type="integer", * example=2, * description="ID de la grille de prix choisit lors de la souscription" * ), * @OA\Property(property="bonus_amount", * type="double", * example=30000, * description="Montant de la prime" * ), * @OA\Property(property="beneficiaries", * type="array", * description="Listes des beneficiaires ou ayants droit", * @OA\Items(ref="#/components/schemas/beneficiaries") * ) * ) * * @OA\Schema( * schema="beneficiaries", * title = "Beneficiaires ou ayants droit", * required={"lastname","gender", "birthdate", "affiliation" }, * @OA\Property(property="lastname", * type="string", * example = "Djery", * description="Noms" * ), * @OA\Property(property="firstname", * type="string", * example="DI", * description="Prenoms" * ), * @OA\Property(property="gender", * type="string", * enum = {"M" ,"F"}, * example= "M", * description="Sexe" * ), * @OA\Property(property="birthdate", * type="string", * example= "2001-10-05", * description="Date de naissance" * ), * @OA\Property(property="affiliation", * type="string", * enum = {"CHILD" ,"SPOUSE"}, * example= "CHILD", * description="Affiliation" * ), * @OA\Property(property="birthdate_proof", * type="string", * enum = {"CERTIFIED_COPY" ,"CERTIFICATE"}, * example="CERTIFIED_COPY", * description="Copie légalisée acte de naissance ou certificat de naissance" * ), * @OA\Property(property="birthdate_proof_doc", * type="string", * example="birthdate_proof_doc.jpg", * description="Copie légalisée acte de naissance ou certificat de naissance" * ), * @OA\Property(property="justice_doc", * type="string", * example="justice_doc.jpg", * description="Une page document de justice si enfant adopté ou sous tutelle" * ), * @OA\Property(property="marriage_certificate_doc", * type="string", * example="marriage_certificate_doc.jpg", * description="Une page de l'acte de mariage" * ), * @OA\Property(property="id_document_type", * type="string", * example="CNI", * description="Type de piece d'identité cni , carte sejour, permis" * ), * @OA\Property(property="id_document_front", * type="string", * example="id_document_front.jpg", * description="Pièce identité recto" * ), * @OA\Property(property="id_document_back", * type="string", * example="id_document_back.jpg", * description="Pièce identité verso" * ), * ) */ $this->validate($request, [ 'network_id' => 'required|integer|exists:networks,id', 'user_id' => 'required|integer|exists:users,id', 'month_price_id' => 'required|integer|exists:nh_months_prices_grid,id', 'bonus_amount' => 'required|numeric|min:0', 'beneficiaries' => 'required|array', 'beneficiaries.*.lastname' => 'required|string', 'beneficiaries.*.gender' => 'required|in:M,F', 'beneficiaries.*.birthdate' => 'required|date_format:Y-m-d|before:today', 'beneficiaries.*.affiliation' => 'required|in:CHILD,SPOUSE', 'beneficiaries.*.birthdate_proof' => 'required_if:beneficiaries.*.affiliation,CHILD|in:CERTIFIED_COPY,CERTIFICATE', 'beneficiaries.*.birthdate_proof_doc' => 'required_if:beneficiaries.*.affiliation,CHILD|string', 'beneficiaries.*.justice_doc' => 'required_if:beneficiaries.*.affiliation,CHILD|string', 'beneficiaries.*.marriage_certificate_doc' => 'required_if:beneficiaries.*.affiliation,SPOUSE|string', 'beneficiaries.*.id_document_type' => 'required_if:beneficiaries.*.affiliation,SPOUSE|string', 'beneficiaries.*.id_document_front' => 'required_if:beneficiaries.*.affiliation,SPOUSE|string', 'beneficiaries.*.id_document_back' => 'required_if:beneficiaries.*.affiliation,SPOUSE|string', ]); $identification = Identification::where('id_user', $request->input('user_id'))->first(); if (!isset($identification)) return $this->errorResponse(trans('errors.user_identification_required')); $networkConfig = NhNetworksConfig::where('network_id', $request->input('network_id'))->first(); if (!isset($networkConfig) || $networkConfig->configWallet->type != 'ilink_sante') return $this->errorResponse(trans('errors.nano_health_not_activated')); $networkConfig = NhNetworksConfig::where('network_id', $request->input('network_id'))->first(); if (sizeof($request->input('beneficiaries')) > $networkConfig->max_number_of_beneficiaries) return $this->errorResponse(trans('errors.number_of_beneficiaries_exceeded')); $monthPrice = $networkConfig->monthsPricesGrid()->where('id', $request->input('month_price_id'))->first(); if (!isset($monthPrice)) return $this->errorResponse(trans('errors.incorrect_selected_amount')); try { DB::beginTransaction(); $subscription = new NhInsurancesSubscription($request->all()); $subscription->number_of_beneficiaries = sizeof($request->input('beneficiaries')); $subscription->insurance_subscription_id = $this->generateSubscriptionID(); $subscription->number_of_months = $monthPrice->number_of_months; $subscription->amount = $monthPrice->min_amount; $subscription->state = InsuranceSubscriptionState::UNDER_VALIDATION; $subscription->save(); foreach ($request->input('beneficiaries') as $b) { $beneficiary = new NhInsurancesHavingRight($b); $beneficiary->insurance_subscription_id = $subscription->insurance_subscription_id; $beneficiary->save(); } NhInsurancesSubscriptionsHistory::create([ 'action' => 'ADD', 'insurance_subscription_id' => $subscription->insurance_subscription_id, 'insurance_subscription_state' => $subscription->state, 'insurance_subscription' => json_encode($subscription) ]); Event::dispatch(new InsuranceSubscribed($subscription)); DB::commit(); return $this->successResponse(trans('messages.successful_transaction')); } catch (Throwable $e) { Log::error($e->getMessage() . '\n' . $e->getTraceAsString()); DB::rollBack(); return $this->errorResponse(trans('errors.unexpected_error'), 500); } } private function generateSubscriptionID(): string { do { $code = $this->generateTransactionCode(); $codeCorrect = NhInsurancesSubscription::where('insurance_subscription_id', $code)->count() < 0; } while ($codeCorrect); return $code; } }