Improve insurance subscription

This commit is contained in:
Djery-Tom 2021-10-29 16:52:10 +01:00
parent 8ea7dbc255
commit c83feab3c0
13 changed files with 100 additions and 27 deletions

View File

@ -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 {

View File

@ -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) {

View File

@ -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']);
}
}

View File

@ -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');
}
}

View File

@ -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');

View File

@ -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

View File

@ -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"
];

View File

@ -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"
];

View File

@ -1,12 +1,13 @@
<?php
return [
"UNDER_VALIDATION" => "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",

View File

@ -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"
];

View File

@ -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"
];

View File

@ -1,12 +1,13 @@
<?php
return [
"EN_COURS" => "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",

View File

@ -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');
});
});
});