From c83feab3c08aed777eeb760d7df09dfadddbdc65 Mon Sep 17 00:00:00 2001 From: Djery-Tom Date: Fri, 29 Oct 2021 16:52:10 +0100 Subject: [PATCH] Improve insurance subscription --- app/Http/Controllers/InsuranceController.php | 61 +++++++++++++++++++- app/Listeners/NotifyUser.php | 8 +-- app/Models/NhInsurancesHavingRight.php | 6 ++ app/Models/NhInsurancesSubscription.php | 5 ++ app/Models/NhNetworksConfig.php | 5 ++ app/Traits/Helper.php | 1 + resources/lang/en/errors.php | 3 +- resources/lang/en/messages.php | 2 +- resources/lang/en/states.php | 15 ++--- resources/lang/fr/errors.php | 3 +- resources/lang/fr/messages.php | 2 +- resources/lang/fr/states.php | 15 ++--- routes/web.php | 1 + 13 files changed, 100 insertions(+), 27 deletions(-) diff --git a/app/Http/Controllers/InsuranceController.php b/app/Http/Controllers/InsuranceController.php index 9615ebf..2db17fe 100644 --- a/app/Http/Controllers/InsuranceController.php +++ b/app/Http/Controllers/InsuranceController.php @@ -346,6 +346,13 @@ class InsuranceController extends Controller if (!isset($networkConfig) || $networkConfig->configWallet->type != 'ilink_sante') return $this->errorResponse(trans('errors.nano_health_not_activated')); + $currentSubscription = NhInsurancesSubscription::where('network_id', $request->input('network_id'))->where('user_id', $request->input('user_id')) + ->whereNotIn('state', [InsuranceSubscriptionState::REJECTED, InsuranceSubscriptionState::STOPPED])->first(); + + if (isset($currentSubscription)) { + return $this->errorResponse(trans('errors.cannot_subscribe_again', ['state' => mb_strtolower(trans('states.' . $currentSubscription->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) { @@ -362,13 +369,13 @@ class InsuranceController extends Controller 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->state = InsuranceSubscriptionState::UNDER_VALIDATION; - $subscription->save(); $beneficiariesBonus = 0; foreach ($request->input('beneficiaries') as $b) { @@ -386,17 +393,20 @@ class InsuranceController extends Controller $beneficiary->birthdate_proof_doc = null; $beneficiary->birthdate_proof = null; } + $beneficiary->created_at = $beneficiary->updated_at = $datetime; $beneficiary->save(); } $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, - 'insurance_subscription' => json_encode($subscription) + 'insurance_subscription' => json_encode($subscription), + 'created_at' => $datetime, 'updated_at' => $datetime, ]); @@ -448,7 +458,7 @@ class InsuranceController extends Controller { $this->validate($request, [ 'files' => 'required', - 'files.*' => 'mimes:jpeg,png,jpg,jpeg|max:8192' + 'files.*' => 'mimes:jpeg,png,jpg,jpeg|max:10240' // 10 Mb ]); $files = []; @@ -528,6 +538,51 @@ class InsuranceController extends Controller } } + /** + * @OA\Get( + * path="/insurances/subscriptions", + * summary="Afficher la liste des souscriptions d'assurances ( par utilisateur )", + * tags={"Assurances"}, + * 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\Response( + * response=200, + * description="OK", + * @OA\JsonContent( + * ref="#/components/schemas/ApiResponse", + * example = { + * "status" : 200, + * "response" : {{"id":250,"name":"Cnamgs-pharmacies", "age_limit_of_insured_and_spouse" : 30 , + * "age_limit_of_child_beneficiary": 25 , "max_number_of_beneficiaries":"5", "months_prices":{{"id": 1,"number_of_months":"3","min_amount":"150000 XAF"}}}}, + * "error":null + * } + * ) + * ) + * ) + */ + public function getSubscriptions(Request $request) + { + $this->validate($request, [ + 'user_id' => 'nullable|integer|exists:users,id' + ]); + $subscriptions = NhInsurancesSubscription::with(['beneficiaries'])->where('user_id', $request->input('user_id'))->get(); + foreach ($subscriptions as $subscription) { + $subscription->state = trans('states.' . $subscription->state); + $subscription->bonus_amount = trans('states.' . $subscription->state); + } + return $this->successResponse($subscriptions); + } + private function generateSubscriptionID(): string { do { diff --git a/app/Listeners/NotifyUser.php b/app/Listeners/NotifyUser.php index e5e663c..8a33b04 100644 --- a/app/Listeners/NotifyUser.php +++ b/app/Listeners/NotifyUser.php @@ -55,18 +55,14 @@ class NotifyUser $body = new stdClass(); $body->user_code = $user->user_code; $body->message = $event->notification; + $body->date = $subscription->created_at ?? date('Y-m-d H:i:s'); + $data = new stdClass(); $data->screen = "notificationview"; $data->data = new stdClass(); $data->data->subscription_id = $data->data->id = $subscription->id; $body->data = $data; - try { - $body->date = $this->getCurrentTimeByCountryCode($user->network->country->code_country); - } catch (Throwable $t) { - Log::error($t->getMessage()); - $body->date = date('Y-m-d H:i:s'); - } $client->request('POST', '/onesignal/pushToUser', ['json' => $body, 'headers' => $headers]); } } catch (Throwable $t) { diff --git a/app/Models/NhInsurancesHavingRight.php b/app/Models/NhInsurancesHavingRight.php index a990955..6be7df1 100644 --- a/app/Models/NhInsurancesHavingRight.php +++ b/app/Models/NhInsurancesHavingRight.php @@ -39,6 +39,7 @@ class NhInsurancesHavingRight extends Model use SoftDeletes; protected $table = 'nh_insurances_having_rights'; + protected $appends = ['affiliation_tr']; protected $casts = [ 'bonus_amount' => 'float' @@ -64,4 +65,9 @@ class NhInsurancesHavingRight extends Model 'id_document_front', 'id_document_back' ]; + + public function getAffiliationTrAttribute() + { + return trans('states.' . $this->attributes['affiliation']); + } } diff --git a/app/Models/NhInsurancesSubscription.php b/app/Models/NhInsurancesSubscription.php index 84db8fe..52d45fa 100644 --- a/app/Models/NhInsurancesSubscription.php +++ b/app/Models/NhInsurancesSubscription.php @@ -55,4 +55,9 @@ class NhInsurancesSubscription extends Model return $this->belongsTo(User::class, 'user_id'); } + public function beneficiaries() + { + return $this->hasMany(NhInsurancesHavingRight::class, 'insurance_subscription_id', 'insurance_subscription_id'); + } + } diff --git a/app/Models/NhNetworksConfig.php b/app/Models/NhNetworksConfig.php index fe10c6e..731cbdc 100644 --- a/app/Models/NhNetworksConfig.php +++ b/app/Models/NhNetworksConfig.php @@ -68,6 +68,11 @@ class NhNetworksConfig extends Model return $this->hasOne(ConfigWallet::class, 'id_network', 'network_id'); } + public function network() + { + return $this->belongsTo(Network::class, 'network_id'); + } + public function monthsPricesGrid() { return $this->hasMany(NhMonthsPricesGrid::class, 'nh_network_config_id', 'id'); diff --git a/app/Traits/Helper.php b/app/Traits/Helper.php index 61bcabf..0349a5c 100644 --- a/app/Traits/Helper.php +++ b/app/Traits/Helper.php @@ -10,6 +10,7 @@ use Brick\Money\Context\AutoContext; use Brick\Money\Money; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; trait Helper diff --git a/resources/lang/en/errors.php b/resources/lang/en/errors.php index 267db08..f72fc96 100755 --- a/resources/lang/en/errors.php +++ b/resources/lang/en/errors.php @@ -25,5 +25,6 @@ return [ 'nano_health_not_activated' => "Nano health is not activated for this network", 'number_of_beneficiaries_exceeded' => 'The number of beneficiaries is greater than the authorized limit', 'incorrect_selected_amount' => 'The amount selected is incorrect', - 'minimal_age_required' => "Your age is above the age limit required to subscribe to this insurance" + 'minimal_age_required' => "Your age is above the age limit required to subscribe to this insurance", + 'cannot_subscribe_again' => "You can no longer subscribe to this insurance. You already have a request :state" ]; diff --git a/resources/lang/en/messages.php b/resources/lang/en/messages.php index ddc1926..66280cd 100755 --- a/resources/lang/en/messages.php +++ b/resources/lang/en/messages.php @@ -50,5 +50,5 @@ Your application has been rejected. Reason for rejection: :reason ", 'insurance_subscription_rejected_notification' => "Your :subscription_id application has been rejected", - "insurance_subscription_successful" => "Insurance subscription submitted" + "insurance_subscription_successful" => "Insurance subscription successful" ]; diff --git a/resources/lang/en/states.php b/resources/lang/en/states.php index f2e0af3..4675554 100755 --- a/resources/lang/en/states.php +++ b/resources/lang/en/states.php @@ -1,12 +1,13 @@ "CURRENT", - "CASSE" => "BROKEN", - "EN_ATTENTE_DE_VALIDATION" => "PENDING VALIDATION", - "REMBOURSE" => "REFUNDED", - "NON_VALIDE" => "INVALID", - "VALIDE" => "VALID", - "SIMPLE" => "SIMPLE", + "UNDER_VALIDATION" => "UNDER VALIDATION", + "ACCEPTED" => "ACCEPTED", + "REJECTED" => "REJECTED", + "CURRENT" => "CURRENT", + "UNDER_STOPPING" => "UNDER STOPPING", + "STOPPED" => "STOPPED", + "CHILD" => "CHILD", + "SPOUSE" => "SPOUSE", "BLOQUE" => "BLOCKED", "NON_TRAITEE" => "NOT TREATED", "TRAITEE" => "TREATED", diff --git a/resources/lang/fr/errors.php b/resources/lang/fr/errors.php index 2aed9f9..bd9bfe7 100755 --- a/resources/lang/fr/errors.php +++ b/resources/lang/fr/errors.php @@ -25,5 +25,6 @@ return [ 'nano_health_not_activated' => "Le nano santé n'est pas activé pour ce réseau", 'number_of_beneficiaries_exceeded' => "Le nombre d'ayant droit est superieur à la limite autorisée", 'incorrect_selected_amount' => 'Le montant choisi est incorrect', - 'minimal_age_required' => "Votre âge est supérieur à l'âge limite requis pour souscrire à cette assurance" + 'minimal_age_required' => "Votre âge est supérieur à l'âge limite requis pour souscrire à cette assurance", + 'cannot_subscribe_again' => "Vous ne pouvez plus souscrire à cette assurance. Vous avez déjà une demande :state" ]; diff --git a/resources/lang/fr/messages.php b/resources/lang/fr/messages.php index 0b1f4cd..1771ed8 100755 --- a/resources/lang/fr/messages.php +++ b/resources/lang/fr/messages.php @@ -50,5 +50,5 @@ Votre demande de souscription a été rejetée. Motif du rejet : :reason ", 'insurance_subscription_rejected_notification' => "Votre demande de souscription :subscription_id a été rejetée.", - "insurance_subscription_successful" => "Souscription à l'assurance envoyée" + "insurance_subscription_successful" => "Souscription à l'assurance réussie" ]; diff --git a/resources/lang/fr/states.php b/resources/lang/fr/states.php index a347adb..1c299bd 100755 --- a/resources/lang/fr/states.php +++ b/resources/lang/fr/states.php @@ -1,12 +1,13 @@ "EN COURS", - "CASSE" => "CASSÉE", - "EN_ATTENTE_DE_VALIDATION" => "EN ATTENTE DE VALIDATION", - "REMBOURSE" => "REMBOURSE", - "NON_VALIDE" => "NON VALIDE", - "VALIDE" => "VALIDE", - "SIMPLE" => "SIMPLE", + "UNDER_VALIDATION" => "EN COURS DE VALIDATION", + "ACCEPTED" => "ACCEPTÉE", + "REJECTED" => "REJETÉE", + "CURRENT" => "EN COURS", + "UNDER_STOPPING" => "EN COURS D'ARRÊT", + "STOPPED" => "ARRÊTÉE", + "CHILD" => "ENFANT", + "SPOUSE" => "CONJOINT", "BLOQUE" => "BLOQUÉE", "NON_TRAITEE" => "NON_TRAITÉE", "TRAITEE" => "TRAITÉE", diff --git a/routes/web.php b/routes/web.php index 598a7d8..4ac9585 100644 --- a/routes/web.php +++ b/routes/web.php @@ -22,6 +22,7 @@ $router->group(['prefix' => '', 'middleware' => 'auth'], function () use ($route $router->post('', 'InsuranceController@subscribe'); $router->put('{id}/validate', 'InsuranceController@validateSubscription'); $router->put('{id}/reject', 'InsuranceController@rejectSubscription'); + $router->get('', 'InsuranceController@getSubscriptions'); }); }); });