validate($request, [ 'subscription_id' => 'nullable|integer|exists:nh_insurances_subscriptions,id', 'network_id' => 'required_without:subscription_id|integer|exists:networks,id', 'month_price_id' => 'required_without:subscription_id|integer|exists:nh_months_prices_grid,id', 'beneficiaries' => 'nullable|array', 'beneficiaries.*.birthdate' => 'required|date_format:Y-m-d|before:today', 'beneficiaries.*.affiliation' => 'required|in:CHILD,SPOUSE' ]); $subscription_id = $request->input('subscription_id'); if (isset($subscription_id)) { $subscription = NhInsurancesSubscription::findOrFail($request->input('subscription_id')); $networkConfig = $subscription->nhNetworkConfig; $monthPrice = $networkConfig->monthsPricesGrid()->where('number_of_months', $subscription->number_of_months)->first(); $beneficiaries = array_merge($subscription->beneficiaries->toArray(), $request->input('beneficiaries', [])); } else { $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(); $beneficiaries = $request->input('beneficiaries', []); } if (!isset($monthPrice)) return $this->errorResponse(trans('errors.incorrect_selected_amount')); $bonus = $monthPrice->min_amount; foreach ($beneficiaries as $b) { $bonus += $this->calculateBeneficiaryBonusAmount(new NhHavingRight($b), $networkConfig->yearsPricesGrid, $monthPrice); } return $this->successResponse([ 'bonus_amount' => $bonus, 'bonus_amount_formatted' => $this->toMoneyWithNetwork($bonus, $request->input('network_id')) ]); } /** * @OA\Post( * path="/insurances/subscriptions", * summary="Souscrire à une assurance", * tags={"Souscriptions à l'assurance"}, * 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,"password" : "1234", "month_price_id":3,"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" , "password", "month_price_id", "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="password", * type="string", * example="20214666", * description="Mot de passe de 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="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', 'password' => 'required|string', 'month_price_id' => 'required|integer|exists:nh_months_prices_grid,id', 'beneficiaries' => 'nullable|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' => 'nullable|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) || $identification->status == 0) return $this->errorResponse(trans('errors.user_identification_required')); if (!checkPassword($request->password, $identification->user->encrypted_password, $identification->user->salt)) return $this->errorResponse(trans('messages.incorrect_user_password')); $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')); $latestSubscription = NhInsurancesSubscription::where('network_id', $request->input('network_id'))->where('user_id', $request->input('user_id')) ->whereNotIn('state', [InsuranceSubscriptionState::REJECTED])->orderBy('created_at', 'DESC')->first(); if (isset($latestSubscription)) { return $this->errorResponse(trans('errors.cannot_subscribe_again', ['state' => mb_strtolower(trans('states.' . $latestSubscription->state), 'UTF-8')])); } // Verification de l'age du beneficiaire $insuredAge = date_diff(date_create($identification->birth_date), date_create('now'))->y; if ($insuredAge > $networkConfig->age_limit_of_insured_and_spouse) { return $this->errorResponse(trans('errors.minimal_age_required')); } $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(); $datetime = $this->getCurrentTimeByCountryCode($networkConfig->network->country->code_country); $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->bonus_amount = $monthPrice->min_amount; $subscription->insurance_action = InsuranceAction::ACTIVATION; $subscription->save(); $beneficiariesBonus = $this->storeBeneficiariesAndGetBonus($subscription, $request, $networkConfig, $monthPrice, $datetime); $subscription->total_bonus_amount = ($subscription->bonus_amount + $beneficiariesBonus); $subscription->created_at = $subscription->updated_at = $datetime; $subscription->save(); NhInsurancesSubscriptionsHistory::create([ 'action' => 'ADD', 'insurance_subscription_id' => $subscription->insurance_subscription_id, 'insurance_subscription_state' => $subscription->state, 'created_at' => $datetime, 'updated_at' => $datetime, ]); Event::dispatch(new InsuranceEvent($subscription, trans('messages.insurance_subscription'), trans('messages.insurance_subscription_mail', ['name' => $subscription->user->lastname, 'subscription_id' => $subscription->insurance_subscription_id, 'bonus_amount' => $this->toMoneyWithNetwork($subscription->total_bonus_amount, $subscription->network_id), 'number_of_beneficiaries' => $subscription->number_of_beneficiaries, 'gender' => trans('states.' . $identification->gender), 'insurance_name' => $networkConfig->network->name]))); DB::commit(); return $this->successResponse(trans('messages.insurance_subscription_successful')); } catch (Throwable $e) { Log::error($e->getMessage() . '\n' . $e->getTraceAsString()); DB::rollBack(); return $this->errorResponse(trans('errors.unexpected_error'), 500); } } /** * @OA\Post( * path="/insurances/subscriptions/upload-images", * summary="Uploader les images de la souscription à l'assurance", * tags={"Souscriptions à l'assurance"}, * security={{"api_key":{}}}, * @OA\RequestBody( * description="Corps de la requete", * required=true, * @OA\MediaType( * mediaType="multipart/form-data", * @OA\Schema( * @OA\Property( * property="files[]", * description = "Liste des documents à uploader", * type="array", * @OA\Items(type="string", format="binary") * ) * ), * ) * ), * @OA\Response( * response=200, * description="OK", * @OA\JsonContent( * ref="#/components/schemas/ApiResponse", * example = {"status":200,"response":"Transaction réussie","error":null} * ) * ) * ) */ public function uploadImages(Request $request) { $this->validate($request, [ 'files' => 'required', 'files.*' => 'mimes:jpeg,png,jpg,jpeg|max:10240' // 10 Mb ]); $files = []; if ($request->hasfile('files')) { foreach ($request->file('files') as $file) { $filename = $this->uploadImage($file, 'NH', 'insurances-subscriptions-docs'); array_push($files, $filename); } } return $this->successResponse($files); } public function validateSubscription($id, Request $request) { $this->validate($request, [ 'nh_validating_agent_id' => 'required_without:agent_id|nullable|integer|exists:nh_validating_agents,id', 'agent_id' => 'required_without:nh_validating_agent_id|nullable|integer|exists:agents,id', ]); try { DB::beginTransaction(); $subscription = NhInsurancesSubscription::findOrFail($id); $datetime = $this->getCurrentTimeByCountryCode($subscription->network->country->code_country); $subscription->state = InsuranceSubscriptionState::ACCEPTED; $subscription->updated_at = $datetime; $subscription->save(); $mail_data = ['name' => $subscription->user->lastname, 'subscription_id' => $subscription->insurance_subscription_id, 'bonus_amount' => $this->toMoneyWithNetwork($subscription->total_bonus_amount, $subscription->network_id), 'number_of_beneficiaries' => $subscription->number_of_beneficiaries, 'gender' => trans('states.' . $subscription->user->identification->gender), 'insurance_name' => $subscription->network->name]; if ($subscription->insurance_action == InsuranceAction::STOP_INSURANCE) { $insurance = NhInsurance::where('user_id', $subscription->user_id)->where('network_id', $subscription->network_id)->firstOrFail(); $insurance->state = InsuranceState::STOPPED; $insurance->updated_at = $datetime; $insurance->save(); $message = trans('messages.insurance_stop_accepted'); $notification = trans('messages.insurance_stop_accepted_notification', ['subscription_id' => $subscription->insurance_subscription_id]); $mail = trans('messages.insurance_stop_accepted_mail', $mail_data); } else { $message = trans('messages.insurance_subscription_accepted'); $notification = trans('messages.insurance_subscription_accepted_notification', ['subscription_id' => $subscription->insurance_subscription_id]); $mail = trans('messages.insurance_subscription_accepted_mail', $mail_data); } NhInsurancesSubscriptionsHistory::create([ 'action' => 'EDIT', 'insurance_subscription_id' => $subscription->insurance_subscription_id, 'insurance_subscription_state' => $subscription->state, 'agent_id' => $request->input('agent_id'), 'nh_validating_agent_id' => $request->input('nh_validating_agent_id'), 'created_at' => $datetime, 'updated_at' => $datetime, ]); Event::dispatch(new InsuranceEvent($subscription, $message, $mail, $notification)); 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); } } public function rejectSubscription($id, Request $request) { $this->validate($request, [ 'nh_validating_agent_id' => 'required_without:agent_id|nullable|integer|exists:nh_validating_agents,id', 'agent_id' => 'required_without:nh_validating_agent_id|nullable|integer|exists:agents,id', 'type' => 'required|in:NORMAL,MORE_INFORMATION', 'reason' => 'required' ]); try { DB::beginTransaction(); $subscription = NhInsurancesSubscription::findOrFail($id); $datetime = $this->getCurrentTimeByCountryCode($subscription->network->country->code_country); $type = $request->input('type'); $mailParams = ['name' => $subscription->user->lastname, 'subscription_id' => $subscription->insurance_subscription_id, 'bonus_amount' => $this->toMoneyWithNetwork($subscription->total_bonus_amount, $subscription->network_id), 'reason' => $request->input('reason'), 'number_of_beneficiaries' => $subscription->number_of_beneficiaries, 'gender' => trans('states.' . $subscription->user->identification->gender), 'insurance_name' => $subscription->network->name]; $notificationParams = ['subscription_id' => $subscription->insurance_subscription_id]; if ($type == 'NORMAL') { $subscription->state = InsuranceSubscriptionState::REJECTED; $mailTitle = trans('messages.insurance_subscription_rejected'); $mailMessage = trans('messages.insurance_subscription_rejected_mail', $mailParams); $notification = trans('messages.insurance_subscription_rejected_notification', $notificationParams); } else { $subscription->state = InsuranceSubscriptionState::AWAITING_FURTHER_INFORMATION; $mailTitle = trans('messages.insurance_subscription_awaiting_more_information_mail'); $mailMessage = trans('messages.insurance_subscription_awaiting_more_information_mail', $mailParams); $notification = trans('messages.insurance_subscription_awaiting_more_information_notification', $notificationParams); } $subscription->reason = $request->input('reason'); $subscription->updated_at = $datetime; $subscription->save(); NhInsurancesSubscriptionsHistory::create([ 'action' => 'EDIT', 'insurance_subscription_id' => $subscription->insurance_subscription_id, 'insurance_subscription_state' => $subscription->state, 'agent_id' => $request->input('agent_id'), 'nh_validating_agent_id' => $request->input('nh_validating_agent_id'), 'created_at' => $datetime, 'updated_at' => $datetime, ]); Event::dispatch(new InsuranceEvent($subscription, $mailTitle, $mailMessage, $notification)); 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); } } /** * @OA\Put( * path="/insurances/subscriptions/{id}/pay", * summary="Activer et payer son assurance", * tags={"Souscriptions à l'assurance"}, * security={{"api_key":{}}}, * @OA\Parameter( * parameter="id", * name="id", * description="ID de la souscription", * in="path", * required=true, * @OA\Schema( * type="integer", * default=12 * ) * ), * @OA\RequestBody( * description="Corps de la requete", * required=true, * @OA\MediaType( * mediaType="application/json", * @OA\Schema( * @OA\Property(property="password", * type="string", * example = "addfdf21", * description="Mot de passe de l'utilisateur" * ) * ), * example = {"password":"adbc1215448"} * ) * ), * @OA\Response( * response=200, * description="OK", * @OA\JsonContent( * ref="#/components/schemas/ApiResponse", * example = {"status":200,"response":"Transaction réussie","error":null} * ) * ) * ) */ public function paySubscription($id, Request $request) { $this->validate($request, [ 'password' => 'required|string', ]); $subscription = NhInsurancesSubscription::findOrFail($id); if ($subscription->state != InsuranceSubscriptionState::ACCEPTED) { return $this->errorResponse(trans('errors.subscription_cannot_be_paid')); } if (isset($subscription->payment)) { return $this->errorResponse(trans('errors.subscription_be_already_paid')); } $user = $subscription->user; if (!checkPassword($request->password, $user->encrypted_password, $user->salt)) { return $this->errorResponse(trans('messages.incorrect_user_password')); } $currency = $this->getNetworkCurrency($subscription->network_id); $amountToPaid = $subscription->total_bonus_amount; if ($user->wallet->balance < $amountToPaid) { $amount = $amountToPaid - $user->wallet->balance; return $this->errorResponse(trans('errors.insufficient_balance', ['amount' => $this->toMoneyWithCurrencyCode($amount, $currency)])); } try { DB::beginTransaction(); $datetime = $this->getCurrentTimeByCountryCode($subscription->network->country->code_country); $hyperviseur = AgentPlus::where('category', 'hyper')->where('network_id', $subscription->network_id)->firstOrFail(); $walletHyperviseur = Wallet::where('id_networkAgent', $hyperviseur->network_agent_id)->firstOrFail(); $walletHyperviseur->balance_princ += $amountToPaid; $walletHyperviseur->save(); $user->balance_nano_health += $amountToPaid; $user->wallet->balance -= $amountToPaid; $user->wallet->save(); $user->save(); if ($subscription->insurance_action == InsuranceAction::ACTIVATION) { $insuredId = $this->generateInsuredID(); $insurance = NhInsurance::create([ 'network_id' => $subscription->network_id, 'user_id' => $subscription->user_id, 'insured_id' => $insuredId, 'number_of_months' => $subscription->number_of_months, 'total_bonus_amount' => $subscription->total_bonus_amount, 'number_of_beneficiaries' => $subscription->number_of_beneficiaries, 'bonus_amount' => $subscription->bonus_amount, 'created_at' => $datetime, 'updated_at' => $datetime, 'state' => InsuranceState::PAID, 'start_at' => $datetime, 'end_at' => DateTime::createFromFormat('Y-m-d H:i:s', $datetime)->modify('+' . $subscription->number_of_months . 'months') ]); foreach ($subscription->beneficiaries as $b) { NhInsurancesHavingRight::create([ 'insurance_id' => $insurance->id, 'having_right_id' => $b->id ]); } } else { $insurance = NhInsurance::where('network_id', $subscription->network_id)->where('user_id', $subscription->user_id) ->where('state', InsuranceState::PAID)->first(); if (!isset($insurance)) { DB::rollBack(); return $this->errorResponse(trans('errors.not_insured'), 500); } if ($subscription->insurance_action == InsuranceAction::ADDITION_OF_BENEFICIARY) { $insurance->bonus_amount = $subscription->bonus_amount; $insurance->total_bonus_amount += $amountToPaid; $insurance->number_of_beneficiaries += $subscription->number_of_beneficiaries; $insurance->updated_at = $datetime; $insurance->save(); foreach ($subscription->beneficiaries as $b) { NhInsurancesHavingRight::create([ 'insurance_id' => $insurance->id, 'having_right_id' => $b->id ]); } } } NhInsurancesPayment::create([ 'insurance_subscription_id' => $subscription->insurance_subscription_id, 'insured_id' => $insurance->insured_id, 'amount' => $amountToPaid, 'reason' => $subscription->insurance_action, 'created_at' => $datetime, 'updated_at' => $datetime, ]); Event::dispatch(new InsuranceEvent($subscription, trans('messages.insurance_subscription_paid'), trans('messages.insurance_subscription_paid_mail', ['name' => $subscription->user->lastname, 'subscription_id' => $subscription->insurance_subscription_id, 'bonus_amount' => $this->toMoneyWithCurrencyCode($subscription->total_bonus_amount, $currency), 'insured_id' => $insurance->insured_id, 'number_of_beneficiaries' => $subscription->number_of_beneficiaries, 'gender' => trans('states.' . $subscription->user->identification->gender), 'insurance_name' => $subscription->network->name, 'months' => $subscription->number_of_months]))); DB::commit(); return $this->successResponse(trans('messages.insurance_subscription_paid')); } catch (Throwable $e) { Log::error($e->getMessage() . '\n' . $e->getTraceAsString()); DB::rollBack(); return $this->errorResponse(trans('errors.unexpected_error'), 500); } } private function generateInsuredID(): string { do { $code = generateTransactionCode(); $codeCorrect = NhInsurance::where('insured_id', $code)->count() < 0; } while ($codeCorrect); return $code; } /** * @OA\Get( * path="/insurances/subscriptions", * summary="Afficher la liste des souscriptions d'assurances ( par utilisateur , par type)", * tags={"Souscriptions à l'assurance"}, * security={{"api_key":{}}}, * @OA\Parameter( * parameter="user_id", * name="user_id", * description="ID de l'utilisateur", * in="query", * required=true, * @OA\Schema( * type="integer", * default=325 * ) * ), * @OA\Parameter( * parameter="type", * name="type", * description="Type de souscription", * in="query", * required=false, * @OA\Schema( * type="string", * enum={"ALL","ACCEPTED"} * ) * ), * @OA\Parameter( * parameter="page", * name="page", * description="Page", * in="query", * required=false, * @OA\Schema( * type="integer" * ) * ), * @OA\Parameter( * parameter="perPage", * name="perPage", * description="Pas de pagination", * in="query", * required=false, * @OA\Schema( * type="integer" * ) * ), * @OA\Parameter( * parameter="pagination", * name="pagination", * description="pagination", * in="query", * required=false, * @OA\Schema( * type="boolean", * ) * ), * @OA\Response( * response=200, * description="OK", * @OA\JsonContent( * ref="#/components/schemas/ApiResponse", * example = { * "status" : 200, * "response" : {{"id":1,"insurance_subscription_id":"BOKWRWZ245JX","network_id":250,"user_id":321,"number_of_months":3, * "bonus_amount":"150\u202f000\u00a0FCFA","number_of_beneficiaries":2,"total_bonus_amount":"495\u202f000\u00a0FCFA","state":"EN COURS DE VALIDATION", * "created_at":"2021-10-29T14:26:05.000000Z","updated_at":"2021-10-29T14:26:05.000000Z","start_at":null,"end_at":null,"reason":null,"network": { "id": 250, "name": "Cnamgs-pharmacies" }, * "beneficiaries":{{"id":1,"insurance_subscription_id":"BOKWRWZ245JX","lastname":"Djery","firstname":"DI","gender":"M","birthdate":"2001-10-05T00:00:00.000000Z", * "affiliation":"CHILD","bonus_amount":"195\u202f000\u00a0FCFA","birthdate_proof":"CERTIFIED_COPY","birthdate_proof_doc":"birth.jpg","justice_doc":"just.png", * "marriage_certificate_doc":null,"id_document_type":null,"id_document_front":null,"id_document_back":null,"deleted_at":null,"created_at":"2021-10-29T14:26:05.000000Z", * "updated_at":"2021-10-29T14:26:05.000000Z","affiliation_tr":"ENFANT"}}}}, * "error":null * } * ) * ) * ) */ public function getSubscriptions(Request $request) { $this->validate($request, [ 'user_id' => 'nullable|integer|exists:users,id', 'type' => 'nullable|in:ALL,ACCEPTED', 'pagination' => 'nullable|boolean' ]); $user = User::findOrFail($request->input('user_id')); $currency_code = $user->network->country->currency_code; $pagination = $request->input('pagination'); $query = NhInsurancesSubscription::with(['network:id,name', 'beneficiaries']); if ($request->has('user_id')) { $query = $query->where('user_id', $request->input('user_id')); } if ($request->has('type')) { $type = $request->input('type'); if ($type != 'ALL') { // Les souscriptions payables if ($type == 'ACCEPTED') { $query = $query->whereNotIn('insurance_action', [InsuranceAction::STOP_INSURANCE]); } $query = $query->where('state', $type)->whereDoesntHave('payment'); } } if ($pagination) { $subscriptions = $query->paginate($request->input('perPage', 10)); } else { $subscriptions = $query->get(); } $array = $pagination ? $subscriptions->items() : $subscriptions; foreach ($array as $subscription) { $subscription->state = trans('states.' . $subscription->state); $subscription->insurance_action = trans('states.' . $subscription->insurance_action); $subscription->bonus_amount = $this->toMoneyWithCurrencyCode($subscription->bonus_amount, $currency_code); $subscription->total_bonus_amount = $this->toMoneyWithCurrencyCode($subscription->total_bonus_amount, $currency_code); foreach ($subscription->beneficiaries as $b) { $b->bonus_amount = $this->toMoneyWithCurrencyCode($b->bonus_amount, $currency_code); } } return $this->successResponse($subscriptions); } }