Improve add beneficiaries in insurance

This commit is contained in:
Djery-Tom 2021-11-12 07:11:42 +01:00
parent 70c01135e6
commit 56226453d4
6 changed files with 48 additions and 57 deletions

View File

@ -3,10 +3,12 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Events\InsuranceEvent; use App\Events\InsuranceEvent;
use App\InsuranceAction;
use App\InsuranceState; use App\InsuranceState;
use App\InsuranceSubscriptionState; use App\InsuranceSubscriptionState;
use App\Models\CountriesCurrency; use App\Models\CountriesCurrency;
use App\Models\NhInsurance; use App\Models\NhInsurance;
use App\Models\NhInsurancesSubscription;
use App\Models\NhInsurancesSubscriptionsHistory; use App\Models\NhInsurancesSubscriptionsHistory;
use App\Models\NhNetworksConfig; use App\Models\NhNetworksConfig;
use App\Traits\Helper; use App\Traits\Helper;
@ -124,15 +126,14 @@ class InsuranceController extends Controller
* ref="#/components/schemas/ApiResponse", * ref="#/components/schemas/ApiResponse",
* example = { * example = {
* "status" : 200, * "status" : 200,
* "response" : {{"id":3,"insurance_subscription_id":"3QM2DS9V4KEG","insured_id":"GJZF4VK69V6S","start_at":"2021-11-08T13:13:27.000000Z", * "response" : {{"id":3,"insured_id":"GJZF4VK69V6S","start_at":"2021-11-08T13:13:27.000000Z",
* "end_at":"2022-02-08T13:13:27.000000Z","state":"PAY\u00c9E","created_at":"2021-11-08T12:13:27.000000Z","updated_at":"2021-11-08T12:13:27.000000Z", * "end_at":"2022-02-08T13:13:27.000000Z","state":"PAY\u00c9E","created_at":"2021-11-08T12:13:27.000000Z","updated_at":"2021-11-08T12:13:27.000000Z",
* "subscription":{"id":2,"insurance_subscription_id":"3QM2DS9V4KEG","network_id":250,"user_id":349,"number_of_months":3,"bonus_amount":"150\u202f000\u00a0FCFA", * "network_id":250,"user_id":349,"number_of_months":3,"bonus_amount":"150\u202f000\u00a0FCFA",
* "number_of_beneficiaries":2,"total_bonus_amount":"495\u202f000\u00a0FCFA","state":"ACCEPT\u00c9E","created_at":"2021-11-01T15:18:34.000000Z", * "number_of_beneficiaries":2,"total_bonus_amount":"495\u202f000\u00a0FCFA","network": { "id": 250, "name": "Cnamgs-pharmacies", "age_limit_of_insured_and_spouse": 30,
* "updated_at":"2021-11-05T16:43:00.000000Z","reason":"Quel est ton vrai age ?","network": { "id": 250, "name": "Cnamgs-pharmacies", "age_limit_of_insured_and_spouse": 30,
* "age_limit_of_child_beneficiary": 25, "max_number_of_beneficiaries": 5 },"beneficiaries":{{"id":5,"insurance_subscription_id":"3QM2DS9V4KEG", * "age_limit_of_child_beneficiary": 25, "max_number_of_beneficiaries": 5 },"beneficiaries":{{"id":5,"insurance_subscription_id":"3QM2DS9V4KEG",
* "lastname":"Djery","firstname":"DI","gender":"M","birthdate":"2001-10-05T00:00:00.00000 0Z","affiliation":"CHILD","bonus_amount":"195\u202f000\u00a0FCFA", * "lastname":"Djery","firstname":"DI","gender":"M","birthdate":"2001-10-05T00:00:00.00000 0Z","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, * "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-11-01T15:18:34.000000Z","updated_at":"2021-11-01T15:18:34.000000Z","affiliation_tr":"ENFANT"}}}}}, * "id_document_front":null,"id_document_back":null,"deleted_at":null,"created_at":"2021-11-01T15:18:34.000000Z","updated_at":"2021-11-01T15:18:34.000000Z","affiliation_tr":"ENFANT"}}}},
* "error":null * "error":null
* } * }
* ) * )
@ -149,9 +150,7 @@ class InsuranceController extends Controller
$userId = $request->input('user_id'); $userId = $request->input('user_id');
$type = $request->input('type'); $type = $request->input('type');
$query = NhInsurance::with(['subscription', 'subscription.network:id,name', 'subscription.beneficiaries'])->whereHas('subscription', function ($query) use ($userId) { $query = NhInsurance::with(['network:id,name', 'beneficiaries'])->where('user_id', $userId);
return $query->where('user_id', $userId);
});
if ($request->has('type') && $type == 'EDITABLE') { if ($request->has('type') && $type == 'EDITABLE') {
$query = $query->whereIn('state', [InsuranceState::PAID]); $query = $query->whereIn('state', [InsuranceState::PAID]);
@ -164,17 +163,17 @@ class InsuranceController extends Controller
if ($type == 'EDITABLE') { if ($type == 'EDITABLE') {
// Nécessaire seulement lors de la modification ( ajout de ayant droit) // Nécessaire seulement lors de la modification ( ajout de ayant droit)
$config = NhNetworksConfig::where('network_id', $insurance->subscription->network->id)->firstOrFail(); $config = NhNetworksConfig::where('network_id', $insurance->network->id)->firstOrFail();
$insurance->subscription->network->age_limit_of_insured_and_spouse = $config->age_limit_of_insured_and_spouse; $insurance->network->age_limit_of_insured_and_spouse = $config->age_limit_of_insured_and_spouse;
$insurance->subscription->network->age_limit_of_child_beneficiary = $config->age_limit_of_child_beneficiary; $insurance->network->age_limit_of_child_beneficiary = $config->age_limit_of_child_beneficiary;
$insurance->subscription->network->max_number_of_beneficiaries = $config->max_number_of_beneficiaries; $insurance->network->max_number_of_beneficiaries = $config->max_number_of_beneficiaries;
} }
$currency_code = $this->getNetworkCurrency($insurance->subscription->network_id); $currency_code = $this->getNetworkCurrency($insurance->network_id);
$insurance->subscription->state = trans('states.' . $insurance->subscription->state); $insurance->state = trans($insurance->state);
$insurance->subscription->bonus_amount = $this->toMoneyWithCurrencyCode($insurance->subscription->bonus_amount, $currency_code); $insurance->bonus_amount = $this->toMoneyWithCurrencyCode($insurance->bonus_amount, $currency_code);
$insurance->subscription->total_bonus_amount = $this->toMoneyWithCurrencyCode($insurance->subscription->total_bonus_amount, $currency_code); $insurance->total_bonus_amount = $this->toMoneyWithCurrencyCode($insurance->total_bonus_amount, $currency_code);
foreach ($insurance->subscription->beneficiaries as $b) { foreach ($insurance->beneficiaries as $b) {
$b->bonus_amount = $this->toMoneyWithCurrencyCode($b->bonus_amount, $currency_code); $b->bonus_amount = $this->toMoneyWithCurrencyCode($b->bonus_amount, $currency_code);
} }
} }
@ -257,12 +256,14 @@ class InsuranceController extends Controller
]); ]);
$insurance = NhInsurance::findOrFail($id); $insurance = NhInsurance::findOrFail($id);
$subscription = $insurance->subscription; $latestSubscription = NhInsurancesSubscription::where('network_id', $request->input('network_id'))->where('user_id', $request->input('user_id'))
if ($subscription->state != InsuranceSubscriptionState::ACCEPTED) { ->whereNotIn('state', [InsuranceSubscriptionState::REJECTED])->orderBy('created_at', 'DESC')->first();
return $this->errorResponse(trans('errors.subscription_cannot_be_submitted'));
if (isset($latestSubscription)) {
return $this->errorResponse(trans('errors.subscription_cannot_be_submitted', ['state' => mb_strtolower(trans('states.' . $latestSubscription->state), 'UTF-8')]));
} }
$user = $subscription->user; $user = $insurance->user;
$identification = $subscription->user->identification; $identification = $insurance->user->identification;
if (!isset($identification) || $identification->status == 0) if (!isset($identification) || $identification->status == 0)
return $this->errorResponse(trans('errors.user_identification_required')); return $this->errorResponse(trans('errors.user_identification_required'));
@ -270,53 +271,40 @@ class InsuranceController extends Controller
if (!checkPassword($request->password, $user->encrypted_password, $user->salt)) if (!checkPassword($request->password, $user->encrypted_password, $user->salt))
return $this->errorResponse(trans('messages.incorrect_user_password')); return $this->errorResponse(trans('messages.incorrect_user_password'));
$nbOfBeneficiaries = $subscription->beneficiaries()->count(); $nbOfBeneficiaries = $insurance->beneficiaries()->count();
$networkConfig = NhNetworksConfig::where('network_id', $subscription->network_id)->first(); $networkConfig = NhNetworksConfig::where('network_id', $insurance->network_id)->first();
if ((sizeof($request->input('beneficiaries')) + $nbOfBeneficiaries) > $networkConfig->max_number_of_beneficiaries) if ((sizeof($request->input('beneficiaries')) + $nbOfBeneficiaries) > $networkConfig->max_number_of_beneficiaries)
return $this->errorResponse(trans('errors.number_of_beneficiaries_exceeded')); return $this->errorResponse(trans('errors.number_of_beneficiaries_exceeded'));
$monthPrice = $networkConfig->monthsPricesGrid()->where('number_of_months', $subscription->number_of_months)->first(); $monthPrice = $networkConfig->monthsPricesGrid()->where('number_of_months', $insurance->number_of_months)->first();
if (!isset($monthPrice)) if (!isset($monthPrice))
return $this->errorResponse(trans('errors.incorrect_selected_amount')); return $this->errorResponse(trans('errors.incorrect_selected_amount'));
try { try {
DB::beginTransaction(); DB::beginTransaction();
$datetime = $this->getCurrentTimeByCountryCode($networkConfig->network->country->code_country); $datetime = $this->getCurrentTimeByCountryCode($networkConfig->network->country->code_country);
// Creer une nouvelle subscription en clonant l'anciene // Creer une nouvelle subscription
$newSubscription = $subscription->replicate(); $newSubscription = NhInsurancesSubscription::create([
$newSubscription->insurance_subscription_id = $this->generateSubscriptionID(); 'network_id' => $insurance->network_id,
$newSubscription->number_of_beneficiaries += sizeof($request->input('beneficiaries')); 'user_id' => $insurance->user_id,
$newSubscription->push(); 'insurance_subscription_id' => $this->generateSubscriptionID(),
'number_of_beneficiaries' => sizeof($request->input('beneficiaries')),
//reset relations on EXISTING MODEL (this way you can control which ones will be loaded 'number_of_months' => $monthPrice->number_of_months,
$subscription->setRelations([]); 'bonus_amount' => $monthPrice->min_amount,
//load relations on EXISTING MODEL 'insurance_action' => InsuranceAction::ADDITION_OF_BENEFICIARY
$subscription->load('beneficiaries'); ]);
foreach ($subscription->getRelations() as $relation => $items) {
foreach ($items as $item) {
$item->insurance_subscription_id = $newSubscription->insurance_subscription_id;
unset($item->id);
$newSubscription->{$relation}()->create($item->toArray());
}
}
// Ajouter les nouveaux ayant droit // Ajouter les nouveaux ayant droit
$beneficiariesBonus = $this->storeBeneficiariesAndGetBonus($newSubscription, $request, $networkConfig, $monthPrice, $datetime); $beneficiariesBonus = $this->storeBeneficiariesAndGetBonus($newSubscription, $request, $networkConfig, $monthPrice, $datetime);
$newSubscription->total_bonus_amount += $beneficiariesBonus; $newSubscription->total_bonus_amount = $newSubscription->bonus_amount + $beneficiariesBonus;
$newSubscription->created_at = $newSubscription->updated_at = $datetime; $newSubscription->created_at = $newSubscription->updated_at = $datetime;
$newSubscription->save(); $newSubscription->save();
$insurance->insurance_subscription_id = $newSubscription->insurance_subscription_id;
$insurance->state = InsuranceState::ADDITION_OF_BENEFICIARY;
$insurance->remaining_amount = $beneficiariesBonus;
$insurance->save();
NhInsurancesSubscriptionsHistory::create([ NhInsurancesSubscriptionsHistory::create([
'action' => 'ADD', 'action' => 'ADD',
'insurance_subscription_id' => $newSubscription->insurance_subscription_id, 'insurance_subscription_id' => $newSubscription->insurance_subscription_id,
'insurance_subscription_state' => $newSubscription->state, 'insurance_subscription_state' => $newSubscription->state,
'insurance_subscription' => json_encode($newSubscription),
'created_at' => $datetime, 'updated_at' => $datetime, 'created_at' => $datetime, 'updated_at' => $datetime,
]); ]);

View File

@ -291,11 +291,11 @@ class InsuranceSubscriptionController extends Controller
if (!isset($networkConfig) || $networkConfig->configWallet->type != 'ilink_sante') if (!isset($networkConfig) || $networkConfig->configWallet->type != 'ilink_sante')
return $this->errorResponse(trans('errors.nano_health_not_activated')); 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')) $latestSubscription = NhInsurancesSubscription::where('network_id', $request->input('network_id'))->where('user_id', $request->input('user_id'))
->whereNotIn('state', [InsuranceSubscriptionState::REJECTED])->first(); ->whereNotIn('state', [InsuranceSubscriptionState::REJECTED])->orderBy('created_at', 'DESC')->first();
if (isset($currentSubscription)) { if (isset($latestSubscription)) {
return $this->errorResponse(trans('errors.cannot_subscribe_again', ['state' => mb_strtolower(trans('states.' . $currentSubscription->state), 'UTF-8')])); return $this->errorResponse(trans('errors.cannot_subscribe_again', ['state' => mb_strtolower(trans('states.' . $latestSubscription->state), 'UTF-8')]));
} }
// Verification de l'age du beneficiaire // Verification de l'age du beneficiaire
@ -610,6 +610,7 @@ class InsuranceSubscriptionController extends Controller
} }
if ($subscription->insurance_action == InsuranceAction::ADDITION_OF_BENEFICIARY) { if ($subscription->insurance_action == InsuranceAction::ADDITION_OF_BENEFICIARY) {
$insurance->bonus_amount = $subscription->bonus_amount;
$insurance->total_bonus_amount += $amountToPaid; $insurance->total_bonus_amount += $amountToPaid;
$insurance->number_of_beneficiaries += $subscription->number_of_beneficiaries; $insurance->number_of_beneficiaries += $subscription->number_of_beneficiaries;
$insurance->updated_at = $datetime; $insurance->updated_at = $datetime;

View File

@ -62,7 +62,8 @@ class NhInsurance extends Model
public function beneficiaries() public function beneficiaries()
{ {
return $this->hasManyThrough(NhHavingRight::class, NhInsurancesHavingRight::class, 'insurance_id', 'id'); return $this->hasManyThrough(NhHavingRight::class, NhInsurancesHavingRight::class,
'insurance_id', 'id', 'id', 'having_right_id');
} }
public function nhNetworkConfig() public function nhNetworkConfig()

View File

@ -55,7 +55,8 @@ class NhInsurancesSubscription extends Model
public function beneficiaries() public function beneficiaries()
{ {
return $this->hasManyThrough(NhHavingRight::class, NhInsurancesHavingRight::class, 'insurance_subscription_id', 'id'); return $this->hasManyThrough(NhHavingRight::class, NhInsurancesHavingRight::class,
'insurance_subscription_id', 'id', 'id', 'having_right_id');
} }
public function nhNetworkConfig() public function nhNetworkConfig()

View File

@ -30,6 +30,6 @@ return [
"subscription_cannot_be_updated" => "This subscription request cannot be modified", "subscription_cannot_be_updated" => "This subscription request cannot be modified",
"subscription_cannot_be_paid" => "This subscription request cannot be paid", "subscription_cannot_be_paid" => "This subscription request cannot be paid",
'subscription_be_already_paid' => "This subscription has already been paid", 'subscription_be_already_paid' => "This subscription has already been paid",
"subscription_cannot_be_submitted" => "Your previous application is being validated. You cannot submit another one at this time", "subscription_cannot_be_submitted" => "Your previous application :state . You cannot submit another one at this time",
"not_insured" => "You are not insured", "not_insured" => "You are not insured",
]; ];

View File

@ -30,6 +30,6 @@ return [
"subscription_cannot_be_updated" => "Cette demande de souscription ne peut etre modifiée", "subscription_cannot_be_updated" => "Cette demande de souscription ne peut etre modifiée",
"subscription_cannot_be_paid" => "Cette demande de souscription ne peut etre payée", "subscription_cannot_be_paid" => "Cette demande de souscription ne peut etre payée",
'subscription_be_already_paid' => "Cette souscription a déjà été payée", 'subscription_be_already_paid' => "Cette souscription a déjà été payée",
"subscription_cannot_be_submitted" => "Votre demande précedente est en cours de validation. Vous ne pouvez pas en soumettre une autre pour l'instant", "subscription_cannot_be_submitted" => "Votre demande précédente :state. Vous ne pouvez pas en soumettre une autre pour l'instant",
"not_insured" => "Vous n'êtes pas assuré", "not_insured" => "Vous n'êtes pas assuré",
]; ];