Activate user insurance while doing first payment

This commit is contained in:
Djery-Tom 2022-03-31 12:57:44 +01:00
parent 855cb3fc41
commit 1871103582
13 changed files with 132 additions and 38 deletions

View File

@ -4,12 +4,14 @@ namespace App\Http\Controllers;
use App\Events\InsuranceEvent;
use App\InsuranceAction;
use App\InsuranceInvoiceState;
use App\InsuranceState;
use App\InsuranceSubscriptionState;
use App\Models\AgentPlus;
use App\Models\CountriesCurrency;
use App\Models\NhInsurance;
use App\Models\NhInsurancesHavingRight;
use App\Models\NhInsurancesInvoice;
use App\Models\NhInsurancesPayment;
use App\Models\NhInsurancesSubscription;
use App\Models\NhInsurancesSubscriptionsHistory;
@ -672,8 +674,13 @@ class InsuranceController extends Controller
$beneficiary->bonus_amount = $amount;
$beneficiary->save();
}
$total_bonus_amount = $bonus_amount + $beneficiaries_bonus_amount;
$amountToPaid = $bonus_amount + $beneficiaries_bonus_amount;
$amount_per_split = ceil($total_bonus_amount / $monthPrice->number_of_fractions);
$amount_last_payment = $total_bonus_amount - ($amount_per_split * ($monthPrice->number_of_fractions - 1));
// Paiement de la 1ere facture
$amountToPaid = $amount_per_split;
if ($user->wallet->balance < $amountToPaid) {
$amount = $amountToPaid - $user->wallet->balance;
return $this->errorResponse(trans('errors.insufficient_balance', ['amount' => $this->toMoneyWithCurrencyCode($amount, $currency)]));
@ -700,22 +707,31 @@ class InsuranceController extends Controller
$insurance->update([
'number_of_beneficiaries' => sizeof($insurance->beneficiaries),
'total_bonus_amount' => $amountToPaid,
'total_bonus_amount' => $total_bonus_amount,
'bonus_amount' => $bonus_amount,
'insurance_coverage_amount' => 0,
'updated_at' => $datetime,
'state' => InsuranceState::PAID,
'state' => $monthPrice->number_of_fractions == 1 ? InsuranceState::PAID : InsuranceState::PARTIALLY_PAID,
'start_at' => $start_at,
'end_at' => $end_at
'end_at' => $end_at,
'deadlines' => $monthPrice->number_of_fractions,
'paid_deadlines' => 1,
'amount_per_split' => $amount_per_split,
'amount_last_payment' => $amount_last_payment
]);
// Reinitialiser les montants de couvertures de l'assurance
$insurance->beneficiaries->each->update([
'insurance_coverage_amount' => 0
]);
NhInsurancesPayment::create([
'insured_id' => $insurance->insured_id,
'amount' => $amountToPaid,
// Generer la 1ere facture
NhInsurancesInvoice::create([
'invoice_id' => $this->generateInsuranceInvoiceID(),
'insurance_id' => $insurance->id,
'amount' => $amount_per_split,
'payment_deadline' => $this->addDaysToDateTime($datetime, 10), // 1 semaine + 3 jours
'payment_reminder' => $this->addDaysToDateTime($datetime, 7),
'state' => InsuranceInvoiceState::PAID,
'reason' => InsuranceAction::RENEWAL,
'created_at' => $datetime, 'updated_at' => $datetime,
]);

View File

@ -135,7 +135,7 @@ class InsuranceInvoiceController extends Controller
if (!empty($state)) {
if ($state == 'TO_PAID') {
$query = $query->where('state', InsuranceInvoiceState::UNPAID)
->where('payment_deadline', '<', $datetime);
->where('payment_deadline', '>=', $datetime);
} else {
$query = $query->where('state', $state);
}
@ -243,13 +243,16 @@ class InsuranceInvoiceController extends Controller
$invoice->update(['state' => InsuranceInvoiceState::PAID, 'updated_at' => $datetime]);
$invoice->insurance->paid_deadlines++;
$isPartialPayment = true;
if ($invoice->insurance->paid_deadlines == $invoice->insurance->deadlines) {
$invoice->insurance->state = InsuranceState::PAID;
$isPartialPayment = false;
} else {
$invoice->insurance->state = InsuranceState::PARTIALLY_PAID;
$isPartialPayment = true;
}
if ($invoice->insurance->state == InsuranceState::PAID) {
// Si c'est le 1er paiement
if ($invoice->insurance->paid_deadlines == 1) {
if ($invoice->reason == InsuranceAction::ADDITION_OF_BENEFICIARY) {
$invoice->insurance->bonus_amount = $invoice->subscription->bonus_amount;
@ -270,9 +273,9 @@ class InsuranceInvoiceController extends Controller
if (empty($invoice->insurance->monthsGrid->waiting_period_days)) {
$start_at = $datetime;
} else {
$start_at = $this->addDaysToDateTime($datetime, $invoice->insurance->monthsGrid->waiting_period_days);
$start_at = $this->addDaysToDateTime($datetime, $invoice->insurance->monthsGrid->waiting_period_days)->format('Y-m-d H:i:s');
}
$end_at = $this->addMonthsToDateTime($start_at->format('Y-m-d H:i:s'), $invoice->insurance->monthsGrid->number_of_months);
$end_at = $this->addMonthsToDateTime($start_at, $invoice->insurance->monthsGrid->number_of_months);
$invoice->insurance->start_at = $start_at;
$invoice->insurance->end_at = $end_at;
}
@ -285,9 +288,13 @@ class InsuranceInvoiceController extends Controller
'bonus_amount' => $this->toMoneyWithCurrencyCode($invoice->insurance->bonus_amount, $currency), 'total_bonus_amount' => $this->toMoneyWithCurrencyCode($invoice->insurance->total_bonus_amount, $currency), 'number_of_beneficiaries' => $invoice->insurance->number_of_beneficiaries,
'gender' => trans('states.' . $invoice->insurance->user->identification->gender), 'insurance_name' => $invoice->insurance->network->name, 'months' => $invoice->insurance->monthsGrid->number_of_months, 'invoice_id' => $invoice->invoice_id,
'amount' => $this->toMoneyWithCurrencyCode($invoice->amount, $currency), 'paid_deadlines' => $invoice->insurance->paid_deadlines, 'remains_deadlines' => $invoice->insurance->deadlines - $invoice->insurance->paid_deadlines,
'reason' => trans('states.' . $invoice->reason), 'title' => $isPartialPayment ? trans('messages.insurance_partially_paid_title') : trans('messages.insurance_fully_paid_title')])));
'payment_period' => trans('states.' . $invoice->insurance->monthsGrid->payment_period), 'reason' => trans('states.' . $invoice->reason), 'title' => $isPartialPayment ? trans('messages.insurance_partially_paid_title') : trans('messages.insurance_fully_paid_title'),
'deadlines' => $invoice->insurance->deadlines, 'amount_per_split' => $this->toMoneyWithCurrencyCode($invoice->insurance->amount_per_split, $currency), 'amount_last_payment' => $this->toMoneyWithCurrencyCode($invoice->insurance->amount_last_payment, $currency),
'waiting_days' => empty($invoice->insurance->monthsGrid->waiting_period_days) ? trans('messages.none') : trans('messages.n_days', ['n' => $invoice->insurance->monthsGrid->waiting_period_days]),
'start_at' => $invoice->insurance->start_at
])));
DB::commit();
return $this->successResponse(trans('messages.insurance_subscription_paid'));
return $this->successResponse(trans('messages.insurance_invoice_paid'));
} catch (Throwable $e) {
Log::error($e->getMessage() . '\n' . $e->getTraceAsString());
DB::rollBack();

View File

@ -440,15 +440,14 @@ class InsuranceSubscriptionController extends Controller
$notification = trans('messages.insurance_stop_accepted_notification', ['subscription_id' => $subscription->insurance_subscription_id]);
$mail = trans('messages.insurance_stop_accepted_mail', $mail_data);
} else {
$amount_per_split = round($subscription->total_bonus_amount / $subscription->monthsGrid->number_of_fractions);
$amount_per_split = ceil($subscription->total_bonus_amount / $subscription->monthsGrid->number_of_fractions);
$amount_last_payment = $subscription->total_bonus_amount - ($amount_per_split * ($subscription->monthsGrid->number_of_fractions - 1));
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,
'insured_id' => $this->generateInsuredID(),
'months_grid_id' => $subscription->months_grid_id,
'total_bonus_amount' => $subscription->total_bonus_amount,
'number_of_beneficiaries' => $subscription->number_of_beneficiaries,
@ -466,17 +465,6 @@ class InsuranceSubscriptionController extends Controller
'having_right_id' => $b->id
]);
}
// Generer la 1ere facture
NhInsurancesInvoice::create([
'invoice_id' => $this->generateInsuranceInvoiceID(),
'insurance_id' => $insurance->id,
'subscription_id' => $subscription->id,
'amount' => $amount_per_split,
'payment_deadline' => $this->addDaysToDateTime($datetime, 10), // 1 semaine + 3 jours
'payment_reminder' => $this->addDaysToDateTime($datetime, 7),
'state' => InsuranceInvoiceState::UNPAID,
'reason' => $subscription->insurance_action
]);
}
if ($subscription->insurance_action == InsuranceAction::ADDITION_OF_BENEFICIARY) {
@ -494,7 +482,9 @@ class InsuranceSubscriptionController extends Controller
'amount_last_payment' => $amount_last_payment,
'updated_at' => $datetime,
]);
}
if (in_array($subscription->insurance_action, [InsuranceAction::ADDITION_OF_BENEFICIARY, InsuranceAction::ACTIVATION])) {
// Generer la 1ere facture
NhInsurancesInvoice::create([
'invoice_id' => $this->generateInsuranceInvoiceID(),
@ -504,7 +494,8 @@ class InsuranceSubscriptionController extends Controller
'payment_deadline' => $this->addDaysToDateTime($datetime, 10), // 1 semaine + 3 jours
'payment_reminder' => $this->addDaysToDateTime($datetime, 7),
'state' => InsuranceInvoiceState::UNPAID,
'reason' => $subscription->insurance_action
'reason' => $subscription->insurance_action,
'created_at' => $datetime, 'updated_at' => $datetime,
]);
}
$message = trans('messages.insurance_subscription_accepted');
@ -677,7 +668,7 @@ class InsuranceSubscriptionController extends Controller
if (empty($subscription->monthsGrid->waiting_period_days)) {
$start_at = $datetime;
} else {
$start_at = $this->addDaysToDateTime($datetime, $subscription->monthsGrid->waiting_period_days);
$start_at = $this->addDaysToDateTime($datetime, $subscription->monthsGrid->waiting_period_days)->format('Y-m-d H:i:s');
}
$end_at = $this->addMonthsToDateTime($start_at, $subscription->monthsGrid->number_of_months);
$insurance = NhInsurance::create([

View File

@ -98,7 +98,7 @@ class InsuredController extends Controller
$datetime = $this->getCurrentTimeByCountryCode($network->country->code_country);
$q = NhInsurance::with(['user:id,firstname,lastname,phone,email', 'network:id,name', 'beneficiaries', 'nhNetworkConfig', 'monthsGrid'])->where('network_id', $network_id)
->where('state', InsuranceState::PAID)->where('start_at', '<=', $datetime);
->whereIn('state', [InsuranceState::PAID, InsuranceState::PARTIALLY_PAID])->where('start_at', '<=', $datetime);
if (!empty($insured_id)) {
$q = $q->where('insured_id', $insured_id);

View File

@ -11,4 +11,6 @@ abstract class InsuranceState
const UNDER_ACTIVATION = 'UNDER_ACTIVATION';
const UNDER_RENEW = 'UNDER_RENEW';
const UNDER_ADDING_BENEFICIARY = 'UNDER_ADDING_BENEFICIARY';
const PARTIALLY_PAID = 'PARTIALLY_PAID';
const SUSPENDED = 'SUSPENDED';
}

View File

@ -377,7 +377,7 @@ trait Helper
$lastInvoice = NhInsurancesInvoice::where('insurance_id', $i->id)->orderBy('id', 'DESC')->first();
if (isset($lastInvoice) && $lastInvoice->deadline_number < $i->deadlines) {
if (in_array($i->monthsGrid->payment_period, ['DAILY', 'MONTHLY'])) {
// Si le paiment est mensuel, se rassurer que cela fait deja 1 mois
// Si le paiement est mensuel, se rassurer que cela fait deja 1 mois
if ($i->monthsGrid->payment_period == 'MONTHLY' && $lastInvoice->created_at->diff(date('Y-m-d'))->m < 1) {
continue;
}
@ -411,12 +411,22 @@ trait Helper
'bonus_amount' => $this->toMoneyWithCurrencyCode($invoice->insurance->bonus_amount, $currency), 'total_bonus_amount' => $this->toMoneyWithCurrencyCode($invoice->insurance->total_bonus_amount, $currency), 'number_of_beneficiaries' => $invoice->insurance->number_of_beneficiaries,
'gender' => trans('states.' . $invoice->insurance->user->identification->gender), 'insurance_name' => $invoice->insurance->network->name, 'months' => $invoice->insurance->monthsGrid->number_of_months, 'invoice_id' => $invoice->invoice_id,
'amount' => $this->toMoneyWithCurrencyCode($invoice->amount, $currency), 'paid_deadlines' => $invoice->insurance->paid_deadlines, 'remains_deadlines' => $invoice->insurance->deadlines - $invoice->insurance->paid_deadlines,
'reason' => trans('states.' . $invoice->reason), 'title' => trans('messages.insurance_payment_reminder_title')])));
'payment_period' => trans('states.' . $invoice->insurance->monthsGrid->payment_period), 'reason' => trans('states.' . $invoice->reason), 'title' => trans('messages.insurance_payment_reminder_title'),
'deadlines' => $invoice->insurance->deadlines, 'amount_per_split' => $this->toMoneyWithCurrencyCode($invoice->insurance->amount_per_split, $currency), 'amount_last_payment' => $this->toMoneyWithCurrencyCode($invoice->insurance->amount_last_payment, $currency),
'waiting_days' => empty($invoice->insurance->monthsGrid->waiting_period_days) ? trans('messages.none') : trans('messages.n_days', ['n' => $invoice->insurance->monthsGrid->waiting_period_days]),
'start_at' => $invoice->insurance->start_at
])));
}
$invoices = NhInsurancesInvoice::with(['insurance'])->where('state', InsuranceInvoiceState::UNPAID)
->whereDate('payment_deadline', Carbon::now()->subDay())->get();
foreach ($invoices as $invoice) {
$invoice->insurance->update([
'state' => InsuranceState::SUSPENDED
]);
}
foreach ($invoices as $invoice) {
// Reminders
$currency = $this->getNetworkCurrency($invoice->insurance->network_id);
@ -425,7 +435,11 @@ trait Helper
'bonus_amount' => $this->toMoneyWithCurrencyCode($invoice->insurance->bonus_amount, $currency), 'total_bonus_amount' => $this->toMoneyWithCurrencyCode($invoice->insurance->total_bonus_amount, $currency), 'number_of_beneficiaries' => $invoice->insurance->number_of_beneficiaries,
'gender' => trans('states.' . $invoice->insurance->user->identification->gender), 'insurance_name' => $invoice->insurance->network->name, 'months' => $invoice->insurance->monthsGrid->number_of_months, 'invoice_id' => $invoice->invoice_id,
'amount' => $this->toMoneyWithCurrencyCode($invoice->amount, $currency), 'paid_deadlines' => $invoice->insurance->paid_deadlines, 'remains_deadlines' => $invoice->insurance->deadlines - $invoice->insurance->paid_deadlines,
'reason' => trans('states.' . $invoice->reason), 'title' => trans('messages.insurance_payment_suspended_title')])));
'payment_period' => trans('states.' . $invoice->insurance->monthsGrid->payment_period), 'reason' => trans('states.' . $invoice->reason), 'title' => trans('messages.insurance_payment_suspended_title'),
'deadlines' => $invoice->insurance->deadlines, 'amount_per_split' => $this->toMoneyWithCurrencyCode($invoice->insurance->amount_per_split, $currency), 'amount_last_payment' => $this->toMoneyWithCurrencyCode($invoice->insurance->amount_last_payment, $currency),
'waiting_days' => empty($invoice->insurance->monthsGrid->waiting_period_days) ? trans('messages.none') : trans('messages.n_days', ['n' => $invoice->insurance->monthsGrid->waiting_period_days]),
'start_at' => $invoice->insurance->start_at
])));
}
}

View File

@ -15,7 +15,7 @@ class CreateNhInsurancesInvoicesTable extends Migration
{
Schema::create('nh_insurances_invoices', function (Blueprint $table) {
$table->id();
$table->string('invoice_id');
$table->string('invoice_id')->unique();
$table->integer('insurance_id');
$table->integer('subscription_id')->nullable();
$table->decimal('amount', 10);

View File

@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class AddAmountToNhActsAndUpdateNhInsurancesState extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('nh_acts', function (Blueprint $table) {
DB::statement("alter table nh_insurances modify state enum ('PAID', 'UNDER_STOPPING',
'STOPPED', 'EXPIRED', 'UNDER_ACTIVATION', 'UNDER_RENEW','UNDER_ADDING_BENEFICIARY', 'PARTIALLY_PAID', 'SUSPENDED') default 'PAID' not null;");
$table->decimal('amount', 10)->nullable()->after('billing_type');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('nh_acts', function (Blueprint $table) {
$table->dropColumn(['billing_type']);
});
}
}

View File

@ -208,11 +208,20 @@ Your insurance has expired.
- Total premium amount: :total_bonus_amount
- Number of beneficiaries : :number_of_beneficiaries
- Number of months: :months
- Payment period: :payment_period
- Total number of instalments: :deadlines
- Amount per due date: :amount_per_split
- Amount of the last payment: :amount_last_payment
- Waiting period: :waiting_days
- Start date of the insurance: :start_at
",
'insurance_partially_paid_title' => "Your insurance has been partially paid",
'insurance_fully_paid_title' => "Your insurance has been paid in full.",
'insurance_payment_reminder' => "Reminder to pay your insurance",
'insurance_payment_reminder_title' => 'The deadline for paying your bill is approaching',
'insurance_payment_suspended' => "Insurance suspended",
'insurance_payment_suspended_title' => 'You have an outstanding payment'
'insurance_payment_suspended_title' => 'You have an outstanding payment',
'insurance_invoice_paid' => "Insurance invoice paid",
'none' => "None",
'n_days' => ":n days"
];

View File

@ -30,4 +30,9 @@ return [
'USED' => 'USED',
'EXPIRED' => 'EXPIRED',
"UNPAID" => "UNPAID",
"PARTIALLY_PAID" => "PARTIALLY PAID",
"SUSPENDED" => "SUSPENDED",
"ONE_TIME" => "ONCE",
"DAILY" => "JOURNELLEMENT",
"MONTHLY" => "MONTHLY"
];

View File

@ -225,11 +225,20 @@ Votre assurance est arrivée à échéance.
- Montant total de la prime : :total_bonus_amount
- Nombre d'ayants droit : :number_of_beneficiaries
- Nombre de mois : :months
- Période de paiement : :payment_period
- Nombre d'échéances totales : :deadlines
- Montant par échéance : :amount_per_split
- Montant de la dernière échéance : :amount_last_payment
- Délai de carence : :waiting_days
- Date de debut de l'assurance : :start_at
",
'insurance_partially_paid_title' => "Votre assurance a été payée partiellement.",
'insurance_fully_paid_title' => "Votre assurance a été payée complétement.",
'insurance_payment_reminder' => "Rappel du paiement de votre assurance",
'insurance_payment_reminder_title' => 'Le délai du paiement de votre facture est proche',
'insurance_payment_suspended' => "Assurance suspendue",
'insurance_payment_suspended_title' => 'Vous avez un paiement non effectué'
'insurance_payment_suspended_title' => 'Vous avez un paiement non effectué',
'insurance_invoice_paid' => "Facture de l'assurance payée",
'none' => "Aucun",
'n_days' => ":n jours"
];

View File

@ -30,4 +30,9 @@ return [
'USED' => 'UTILISÉE',
'EXPIRED' => 'EXPIRÉE',
"UNPAID" => "NON PAYÉE",
"PARTIALLY_PAID" => "PARTIELLEMENT PAYÉE",
"SUSPENDED" => "SUSPENDUE",
"ONE_TIME" => "UNE SEULE FOIS",
"DAILY" => "JOURNELLEMENT",
"MONTHLY" => "MENSUELLEMENT"
];

View File

@ -41,7 +41,7 @@ $router->group(['prefix' => '', 'middleware' => 'auth'], function () use ($route
$router->get('', 'InsuranceInvoiceController@getInvoices');
$router->put('{id}/pay', 'InsuranceInvoiceController@payInvoice');
$router->get('generate', 'InsuranceInvoiceController@generateInvoices');
$router->get('reminder', 'InsuranceInvoiceController@generateReminder');
$router->get('reminder', 'InsuranceInvoiceController@reminderInvoices');
});
});