diff --git a/app/Http/Controllers/InsuranceController.php b/app/Http/Controllers/InsuranceController.php index 6258ae2..2084e49 100644 --- a/app/Http/Controllers/InsuranceController.php +++ b/app/Http/Controllers/InsuranceController.php @@ -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, ]); diff --git a/app/Http/Controllers/InsuranceInvoiceController.php b/app/Http/Controllers/InsuranceInvoiceController.php index 217a2f3..ba29dc6 100644 --- a/app/Http/Controllers/InsuranceInvoiceController.php +++ b/app/Http/Controllers/InsuranceInvoiceController.php @@ -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(); diff --git a/app/Http/Controllers/InsuranceSubscriptionController.php b/app/Http/Controllers/InsuranceSubscriptionController.php index b828861..16a7bbb 100644 --- a/app/Http/Controllers/InsuranceSubscriptionController.php +++ b/app/Http/Controllers/InsuranceSubscriptionController.php @@ -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([ diff --git a/app/Http/Controllers/InsuredController.php b/app/Http/Controllers/InsuredController.php index 8d3f01d..131b614 100755 --- a/app/Http/Controllers/InsuredController.php +++ b/app/Http/Controllers/InsuredController.php @@ -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); diff --git a/app/InsuranceState.php b/app/InsuranceState.php index 71156a2..b1d16b0 100644 --- a/app/InsuranceState.php +++ b/app/InsuranceState.php @@ -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'; } diff --git a/app/Traits/Helper.php b/app/Traits/Helper.php index a261104..b52b226 100644 --- a/app/Traits/Helper.php +++ b/app/Traits/Helper.php @@ -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 + ]))); } } diff --git a/database/migrations/2022_03_29_085551_create_nh_insurances_invoices_table.php b/database/migrations/2022_03_29_085551_create_nh_insurances_invoices_table.php index dcd0daa..4260d7b 100644 --- a/database/migrations/2022_03_29_085551_create_nh_insurances_invoices_table.php +++ b/database/migrations/2022_03_29_085551_create_nh_insurances_invoices_table.php @@ -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); diff --git a/database/migrations/2022_03_31_092838_add_amount_to_nh_acts_and_update_nh_insurances_state.php b/database/migrations/2022_03_31_092838_add_amount_to_nh_acts_and_update_nh_insurances_state.php new file mode 100644 index 0000000..641497a --- /dev/null +++ b/database/migrations/2022_03_31_092838_add_amount_to_nh_acts_and_update_nh_insurances_state.php @@ -0,0 +1,36 @@ +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']); + }); + } +} diff --git a/resources/lang/en/messages.php b/resources/lang/en/messages.php index bc2a64f..1fc2a74 100755 --- a/resources/lang/en/messages.php +++ b/resources/lang/en/messages.php @@ -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" ]; diff --git a/resources/lang/en/states.php b/resources/lang/en/states.php index 2631091..ad0976a 100755 --- a/resources/lang/en/states.php +++ b/resources/lang/en/states.php @@ -30,4 +30,9 @@ return [ 'USED' => 'USED', 'EXPIRED' => 'EXPIRED', "UNPAID" => "UNPAID", + "PARTIALLY_PAID" => "PARTIALLY PAID", + "SUSPENDED" => "SUSPENDED", + "ONE_TIME" => "ONCE", + "DAILY" => "JOURNELLEMENT", + "MONTHLY" => "MONTHLY" ]; diff --git a/resources/lang/fr/messages.php b/resources/lang/fr/messages.php index 6c317e5..fc3792b 100755 --- a/resources/lang/fr/messages.php +++ b/resources/lang/fr/messages.php @@ -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" ]; diff --git a/resources/lang/fr/states.php b/resources/lang/fr/states.php index 549e9b6..7bd3744 100755 --- a/resources/lang/fr/states.php +++ b/resources/lang/fr/states.php @@ -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" ]; diff --git a/routes/web.php b/routes/web.php index ee41ada..5942485 100644 --- a/routes/web.php +++ b/routes/web.php @@ -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'); }); });