validate($request, [ 'type_caution' => 'required|in:groupe,individuel', 'duree_mois' => 'required|integer|min:0|not_in:0', 'id_user' => 'required|integer|min:0|not_in:0', 'password' => 'required', 'montant' => 'required|numeric|min:0|not_in:0', ]); $user = User::findOrFail($request->id_user); if (!$this->checkPassword($request->password, $user->encrypted_password, $user->salt)) return $this->errorResponse(trans('messages.incorrect_user_password')); $this->checkMyIdentification($request->id_user); $init_country = $user->network->country->id; $result = ConfigWallet::join('networks', 'networks.id', '=', 'configWallet.id_network') ->where('networks.country_id', $init_country)->where('configWallet.type', 'ilink') ->select('configWallet.id')->first(); if ($result) { $config = ConfigWallet::findOrFail($result->id); } else { return $this->errorResponse(trans('errors.no_ilink_network')); } $taxes = array_values(array_filter($config->taxes->all(), function ($tax) { return $tax->categorie == 'nano_credit'; })); $paliers = array_values($config->paliers_config_nano_credits->all()); $demande_credit = new UsersDemandesCredit(); $demande_credit->fill($request->all()); if ($request->type_caution == 'groupe') { $group = UsersGroup::find($user->group_id); if (!$group) return $this->errorResponse(trans('errors.not_belongs_to_any_group')); if (!$group->actif) return $this->errorResponse(trans('errors.your_group_not_active')); if ($group->nombre_utilisateurs < 10) return $this->errorResponse(trans('errors.your_group_not_valid')); if ($request->montant < $group->limite_credit) return $this->errorResponse(trans('errors.nano_credit_amount_must_be_less_than_group_limit')); $walletUser = WalletsUser::where('idUser', $request->id_user)->firstOrFail(); $demande_credit->frais = $this->calculateFees($paliers, $request->montant, $request->duree_mois); $demande_credit->taxe = $this->calculateTax($taxes, $demande_credit->frais); $demande_credit->date_demande = new \DateTime(); $demande_credit->date_rembourssement = $demande_credit->date_demande->modify('+' . $request->duree_mois . ' month'); $demande_credit->etat = 'VALIDE'; $demande_credit->id_demande = $this->getNanoCreditDemandID(); $montant_total = $demande_credit->montant + $demande_credit->frais + $demande_credit->taxe; $user->balance_credit += $montant_total; $walletUser->balance += $demande_credit->montant; $user->save(); $walletUser->save(); $demande_credit->save(); $message = trans('messages.successful_user_group_nano_credit_demand', ['id_demand' => $demande_credit->id_demande, 'amount' => $this->toMoney($montant_total, $init_country), 'net' => $this->toMoney($demande_credit->montant, $init_country), 'fees' => $this->toMoney($demande_credit->frais + $demande_credit->taxe, $init_country), 'date' => $demande_credit->date_rembourssement]); $this->sendMail($user->email, trans('messages.successful_nano_credit_demand'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } if ($request->type_caution == 'individuel') { $demande_credit->frais = $this->calculateFees($paliers, $request->montant, $request->duree_mois); $demande_credit->taxe = $this->calculateTax($taxes, $demande_credit->frais); $demande_credit->etat = 'EN_ATTENTE_DE_VALIDATION'; $montant_total = $demande_credit->montant + $demande_credit->frais + $demande_credit->taxe; $demande_credit->id_demande = $this->getNanoCreditDemandID(); $demande_credit->save(); $message = trans('messages.successful_user_individual_nano_credit_demand', ['id_demand' => $demande_credit->id_demande, 'amount' => $this->toMoney($montant_total, $init_country), 'net' => $this->toMoney($demande_credit->montant, $init_country), 'fees' => $this->toMoney($demande_credit->frais + $demande_credit->taxe, $init_country),]); $this->sendMail($user->email, trans('messages.successful_nano_credit_demand'), $message); return $this->successResponse($message . trans('messages.sent_by_mail')); } } // Calculer les frais private function calculateFees(array $paliers, $montant, $duree) { $size = sizeof($paliers); if ($size > 0) { // $mois = array_map(function ($palier) { // return $palier->duree_mois; // },$paliers); $palier = null; foreach ($paliers as $p) { if ($p->duree_mois == $duree) { $palier = $p; break; } } if ($palier) { return $palier->taux * $montant / 100; } } return 0; } private function getNanoCreditDemandID() { do { $code = $this->generateGroupCode(); $result = collect(DB::select('SELECT * FROM users_demandes_credits WHERE id_demande = :code', ['code' => $code])); $codeCorrect = sizeof($result) < 0; } while ($codeCorrect); return $code; } }