Improve messages and global parameter for insurance invoice reminder and fix insurance invoice pay

This commit is contained in:
Djery-Tom 2022-04-01 17:10:44 +01:00
parent c4b833a59f
commit acf323e799
14 changed files with 105 additions and 44 deletions

View File

@ -176,9 +176,9 @@ class Kernel extends ConsoleKernel
DB::beginTransaction();
$datetime = new DateTime();
$insurances = NhInfosInsurances::with(['network:id,name', 'user.identification', 'monthsGrid'])->where('state', InsuranceState::PAID)->where('end_at', '<=', $datetime)->get();
$insurances = NhInfosInsurances::with(['network:id,name', 'user.identification', 'monthsGrid'])->whereIn('state', [InsuranceState::PAID, InsuranceState::PARTIALLY_PAID])->where('end_at', '<=', $datetime)->get();
NhInsurance::where('state', InsuranceState::PAID)->where('end_at', '<=', $datetime)->update([
NhInsurance::whereIn('state', [InsuranceState::PAID, InsuranceState::PARTIALLY_PAID])->where('end_at', '<=', $datetime)->update([
'state' => InsuranceState::EXPIRED
]);

View File

@ -109,7 +109,7 @@ class AuthorizationCareRequestController extends Controller
$act_id = $request->input('act_id');
$insurance = NhInsurance::find($request->input('insurance_id'));
if ($insurance->state != InsuranceState::PAID) {
if (!in_array($insurance->state, [InsuranceState::PAID, InsuranceState::PARTIALLY_PAID])) {
return $this->errorResponse(__('errors.insurance_not_in_order'));
}

View File

@ -622,7 +622,7 @@ class HealthCareSheetController extends Controller
'exams.*.quantity' => 'required|integer',
]);
$insurance = NhInsurance::where('insured_id', $request->input('insured_id'))->where('state', InsuranceState::PAID)->first();
$insurance = NhInsurance::where('insured_id', $request->input('insured_id'))->whereIn('state', [InsuranceState::PAID, InsuranceState::PARTIALLY_PAID])->first();
if (!isset($insurance)) {
return $this->errorResponse(trans('errors.not_insured'));
}

View File

@ -101,7 +101,8 @@ class InsuranceController extends Controller
ON nhc.network_id = n.id WHERE n.country_id = :countryId AND cw.type = 'ilink_sante' AND n.status = 1", ['countryId' => $request->input('country_id')]);
foreach ($insurances as $insurance) {
$months_prices = DB::select("SELECT number_of_months , min_amount , max_insurance_coverage_amount, waiting_period_days, payment_period , number_of_fractions FROM nh_months_prices_grid WHERE nh_network_config_id = :nhc_id",
$months_prices = DB::select("SELECT id , number_of_months , min_amount , max_insurance_coverage_amount, waiting_period_days, payment_period , number_of_fractions FROM nh_months_prices_grid
WHERE nh_network_config_id = :nhc_id ORDER BY number_of_fractions ASC",
['nhc_id' => $insurance->nhc_id]);
$years_prices = DB::select("SELECT min_age , max_age , markup_percentage FROM nh_years_prices_grid WHERE nh_network_config_id = :nhc_id",
@ -115,8 +116,6 @@ class InsuranceController extends Controller
$mp->min_amount = $this->toMoneyWithCurrencyCode($mp->min_amount, $country->currency_code ?? 'XAF');
$mp->max_insurance_coverage_amount = $this->toMoneyWithCurrencyCode($mp->max_insurance_coverage_amount, $country->currency_code ?? 'XAF');
$mp->payment_period = trans('states.' . $mp->payment_period);
$mp->child_prices = $years_prices;
}
@ -234,7 +233,7 @@ class InsuranceController extends Controller
if (!empty($type)) {
if ($type == 'EDITABLE') {
$query = $query->whereIn('state', [InsuranceState::PAID]);
$query = $query->whereIn('state', [InsuranceState::PAID, InsuranceState::PARTIALLY_PAID]);
}
if ($type == 'STOPPED') {
$query = $query->whereIn('state', [InsuranceState::STOPPED, InsuranceState::EXPIRED]);
@ -721,7 +720,7 @@ class InsuranceController extends Controller
if (empty($monthPrice->waiting_period_days)) {
$start_at = $datetime;
} else {
$start_at = $this->addDaysToDateTime($datetime, $monthPrice->waiting_period_days);
$start_at = $this->addDaysToDateTime($datetime, $monthPrice->waiting_period_days)->format('Y-m-d H:i:s');
}
$end_at = $this->addMonthsToDateTime($start_at, $monthPrice->number_of_months);
@ -749,8 +748,8 @@ class InsuranceController extends Controller
'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),
'payment_deadline' => $this->addDaysToDateTime($datetime, $networkConfig->reminder_delay_days + $networkConfig->suspension_delay_days_after_reminder),
'payment_reminder' => $this->addDaysToDateTime($datetime, $networkConfig->reminder_delay_days),
'state' => InsuranceInvoiceState::PAID,
'reason' => InsuranceAction::RENEWAL,
'created_at' => $datetime, 'updated_at' => $datetime,

View File

@ -61,7 +61,7 @@ class InsuranceInvoiceController extends Controller
* required=false,
* @OA\Schema(
* type="string",
* enum={"PAID","UNPAID","TO_PAID"}
* enum={"PAID","UNPAID"}
* )
* ),
* @OA\Parameter(
@ -117,7 +117,7 @@ class InsuranceInvoiceController extends Controller
{
$this->validate($request, [
'user_id' => 'required|integer|exists:users,id',
'state' => 'nullable|in:PAID,UNPAID,TO_PAID',
'state' => 'nullable|in:PAID,UNPAID',
'pagination' => 'nullable|boolean'
]);
$user_id = $request->input('user_id');
@ -133,12 +133,12 @@ class InsuranceInvoiceController extends Controller
});
if (!empty($state)) {
if ($state == 'TO_PAID') {
$query = $query->where('state', InsuranceInvoiceState::UNPAID)
->where('payment_deadline', '>=', $datetime);
} else {
$query = $query->where('state', $state);
}
// if ($state == 'TO_PAID') {
// $query = $query->where('state', InsuranceInvoiceState::UNPAID)
// ->where('payment_deadline', '>=', $datetime);
// } else {
$query = $query->where('state', $state);
// }
}
if ($pagination) {
@ -212,9 +212,9 @@ class InsuranceInvoiceController extends Controller
return $this->errorResponse(trans('errors.invoice_already_paid'));
}
if ($invoice->payment_deadline < $datetime) {
return $this->errorResponse(trans('errors.payment_deadline_reached'));
}
// if ($invoice->payment_deadline < $datetime) {
// return $this->errorResponse(trans('errors.payment_deadline_reached'));
// }
$user = $invoice->insurance->user;
$this->userCredentialsVerification($user, $request->input('password'));
@ -247,7 +247,10 @@ class InsuranceInvoiceController extends Controller
$invoice->insurance->state = InsuranceState::PAID;
$isPartialPayment = false;
} else {
$invoice->insurance->state = InsuranceState::PARTIALLY_PAID;
$countUnpaidInvoices = NhInsurancesInvoice::where('insurance_id', $invoice->insurance->id)->where('state', InsuranceInvoiceState::UNPAID)->count();
if ($countUnpaidInvoices == 0) {
$invoice->insurance->state = InsuranceState::PARTIALLY_PAID;
}
$isPartialPayment = true;
}
@ -321,7 +324,7 @@ class InsuranceInvoiceController extends Controller
{
try {
$this->reminderInsurancesInvoices();
return $this->errorResponse("Success");
return $this->successResponse("Success");
} catch (\Throwable $t) {
DB::rollBack();
Log::error('-------- Insurances Invoices expired insurance-----------');

View File

@ -443,6 +443,10 @@ class InsuranceSubscriptionController extends Controller
$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));
$networkConfig = NhNetworksConfig::where('network_id', $subscription->network_id)->first();
if (!isset($networkConfig) || $networkConfig->configWallet->type != 'ilink_sante')
return $this->errorResponse(trans('errors.nano_health_not_activated'));
if ($subscription->insurance_action == InsuranceAction::ACTIVATION) {
$insurance = NhInsurance::create([
'network_id' => $subscription->network_id,
@ -491,8 +495,8 @@ class InsuranceSubscriptionController extends Controller
'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),
'payment_deadline' => $this->addDaysToDateTime($datetime, $networkConfig->reminder_delay_days + $networkConfig->suspension_delay_days_after_reminder),
'payment_reminder' => $this->addDaysToDateTime($datetime, $networkConfig->reminder_delay_days),
'state' => InsuranceInvoiceState::UNPAID,
'reason' => $subscription->insurance_action,
'created_at' => $datetime, 'updated_at' => $datetime,

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)
->whereIn('state', [InsuranceState::PAID, InsuranceState::PARTIALLY_PAID])->where('start_at', '<=', $datetime);
->whereIn('state', [InsuranceState::PAID, InsuranceState::PARTIALLY_PAID, InsuranceState::SUSPENDED])->where('start_at', '<=', $datetime);
if (!empty($insured_id)) {
$q = $q->where('insured_id', $insured_id);

View File

@ -20,6 +20,8 @@ use Illuminate\Database\Eloquent\Model;
* @property int $age_limit_of_insured_and_spouse
* @property float $coverage_limit_per_insured_per_year
* @property boolean $family_coverage_sharing
* @property int $reminder_delay_days
* @property int $suspension_delay_days_after_reminder
* @property float $current_affection_percentage_insurer
* @property float $current_affection_percentage_insured
* @property float $long_term_affection_percentage_insurer
@ -42,6 +44,8 @@ class NhNetworksConfig extends Model
'age_limit_of_child_beneficiary' => 'int',
// 'coverage_limit_per_insured_per_year' => 'float',
'family_coverage_sharing' => 'boolean',
'reminder_delay_days' => 'int',
'suspension_delay_days_after_reminder' => 'int',
'current_affection_percentage_insurer' => 'float',
'current_affection_percentage_insured' => 'float',
'long_term_affection_percentage_insurer' => 'float',
@ -58,6 +62,8 @@ class NhNetworksConfig extends Model
'age_limit_of_child_beneficiary',
// 'coverage_limit_per_insured_per_year',
'family_coverage_sharing',
'reminder_delay_days',
'suspension_delay_days_after_reminder',
'current_affection_percentage_insurer',
'current_affection_percentage_insured',
'long_term_affection_percentage_insurer',

View File

@ -361,7 +361,7 @@ trait Helper
public function generateInsuranceInvoiceID(): string
{
do {
$code = generateTransactionCode();
$code = generateTransactionCode(8);
$codeCorrect = NhInsurancesInvoice::where('invoice_id', $code)->count() < 0;
} while ($codeCorrect);
return $code;
@ -382,6 +382,13 @@ trait Helper
if ($i->monthsGrid->payment_period == 'MONTHLY' && $lastInvoice->created_at->diff(date('Y-m-d'))->m < 1) {
continue;
}
$networkConfig = NhNetworksConfig::where('network_id', $i->network_id)->first();
if (!isset($networkConfig) || $networkConfig->configWallet->type != 'ilink_sante') {
Log::error("Insurance Invoice generated " . trans('errors.nano_health_not_activated'));
continue;
}
$current_deadline_number = $lastInvoice->deadline_number + 1;
$invoice = NhInsurancesInvoice::create([
'invoice_id' => $this->generateInsuranceInvoiceID(),
@ -400,8 +407,8 @@ trait Helper
trans('messages.insurance_invoice_generated_mail', ['name' => $invoice->insurance->user->lastname, 'insured_id' => $invoice->insurance->insured_id,
'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), 'deadline' => $current_deadline_number, 'remains_deadlines' => $invoice->insurance->deadlines - $invoice->insurance->paid_deadlines - 1,
'payment_period' => trans('states.' . $invoice->insurance->monthsGrid->payment_period), 'reason' => trans('states.' . $invoice->reason),
'amount' => $this->toMoneyWithCurrencyCode($invoice->amount, $currency), 'remains_deadlines' => $invoice->insurance->deadlines - $invoice->insurance->paid_deadlines - 1,
'payment_period' => trans('states.' . $invoice->insurance->monthsGrid->payment_period), 'reason' => trans('states.' . $invoice->reason), 'title' => trans('messages.insurance_invoice_generated_mail_title', ['deadline' => $current_deadline_number]), 'object' => trans('messages.the_invoice'),
'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
@ -420,11 +427,11 @@ trait Helper
// Reminders
$currency = $this->getNetworkCurrency($invoice->insurance->network_id);
Event::dispatch(new InsuranceEvent($invoice->insurance, trans('messages.insurance_payment_reminder'),
trans('messages.insurance_paid_mail', ['name' => $invoice->insurance->user->lastname, 'insured_id' => $invoice->insurance->insured_id,
trans('messages.insurance_invoice_generated_mail', ['name' => $invoice->insurance->user->lastname, 'insured_id' => $invoice->insurance->insured_id,
'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,
'payment_period' => trans('states.' . $invoice->insurance->monthsGrid->payment_period), 'reason' => trans('states.' . $invoice->reason), 'title' => trans('messages.insurance_payment_reminder_title'),
'amount' => $this->toMoneyWithCurrencyCode($invoice->amount, $currency), 'deadline' => $invoice->deadline_number, 'remains_deadlines' => $invoice->insurance->deadlines - $invoice->insurance->paid_deadlines, 'object' => trans('messages.the_payment'),
'payment_period' => trans('states.' . $invoice->insurance->monthsGrid->payment_period), 'reason' => trans('states.' . $invoice->reason), 'title' => trans('messages.insurance_payment_reminder_title', ['invoice_id' => $invoice->invoice_id, 'n_reminder' => 7, 'n_suspension' => 3]),
'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

@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddReminderDelayDaysAndSuspensionDelayDaysAfterReminderToNhNetworksConfigs extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('nh_networks_configs', function (Blueprint $table) {
$table->unsignedInteger('reminder_delay_days')->default(7)->comment("Delai de relance de paiement d'une facture en jours")
->after('family_coverage_sharing');
$table->unsignedInteger('suspension_delay_days_after_reminder')->default(3)->comment("Delai de suspension apres le delai de relance en jours")
->after('reminder_delay_days');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('nh_networks_configs', function (Blueprint $table) {
$table->dropColumn(['reminder_delay_days', 'suspension_delay_days_after_reminder']);
});
}
}

View File

@ -218,7 +218,7 @@ Your insurance has expired.
'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_reminder_title' => "Your invoice number :invoice_id has not been paid for :n_reminder days .in :n_suspension days your insurance will be suspended",
'insurance_payment_suspended' => "Insurance suspended",
'insurance_payment_suspended_title' => 'You have an outstanding payment',
'insurance_invoice_paid' => "Insurance invoice paid",
@ -227,9 +227,9 @@ Your insurance has expired.
'insurance_invoice_generated_title' => "Your insurance invoice issued",
'insurance_invoice_generated_mail' => ":gender :name ,
Your :deadline insurance invoice has been issued.
:title
Invoice information :
:object information :
- ID: :invoice_id
- Amount: :amount
- Due : :deadline
@ -250,4 +250,7 @@ Your insurance has expired.
- Waiting period: :waiting_days
- Start date of the insurance: :start_at
",
'insurance_invoice_generated_mail_title' => "Your :deadline insurance invoice has been issued",
'the_invoice' => "the invoice",
'the_payment' => "the payment"
];

View File

@ -33,6 +33,6 @@ return [
"PARTIALLY_PAID" => "PARTIALLY PAID",
"SUSPENDED" => "SUSPENDED",
"ONE_TIME" => "ONCE",
"DAILY" => "JOURNELLEMENT",
"MONTHLY" => "MONTHLY"
"DAILY" => "DAY",
"MONTHLY" => "MONTH"
];

View File

@ -235,7 +235,7 @@ Votre assurance est arrivée à échéance.
'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_reminder_title' => "Votre facture numéro :invoice_id n'est pas réglée depuis :n_reminder jours .\nDans :n_suspension jours votre assurance sera suspendue",
'insurance_payment_suspended' => "Assurance suspendue",
'insurance_payment_suspended_title' => 'Vous avez un paiement non effectué',
'insurance_invoice_paid' => "Facture de l'assurance payée",
@ -244,9 +244,9 @@ Votre assurance est arrivée à échéance.
'insurance_invoice_generated_title' => "Facture de votre assurance émise",
'insurance_invoice_generated_mail' => ":gender :name ,
La facture de votre assurance d'échéance :deadline a été émise.
:title
Informations sur la facture :
Informations sur :object :
- ID : :invoice_id
- Montant : :amount
- Echéance : :deadline
@ -267,4 +267,7 @@ Votre assurance est arrivée à échéance.
- Délai de carence : :waiting_days
- Date de debut de l'assurance : :start_at
",
'insurance_invoice_generated_mail_title' => "La facture de votre assurance d'échéance :deadline a été émise.",
'the_invoice' => "la facture",
'the_payment' => "le paiement"
];

View File

@ -32,7 +32,7 @@ return [
"UNPAID" => "NON PAYÉE",
"PARTIALLY_PAID" => "PARTIELLEMENT PAYÉE",
"SUSPENDED" => "SUSPENDUE",
"ONE_TIME" => "UNE SEULE FOIS",
"DAILY" => "JOURNALIER",
"MONTHLY" => "MENSUEL"
"ONE_TIME" => "1 FOIS",
"DAILY" => "JOUR",
"MONTHLY" => "MOIS"
];