From 1a998259c84cc442f2adc7b4a8567f16ea1e465c Mon Sep 17 00:00:00 2001 From: Djery-Tom Date: Mon, 3 Aug 2020 08:42:28 +0100 Subject: [PATCH] + Add CRUD of NanoCredit users groups --- app/Http/Controllers/NanoCreditController.php | 271 ++++++++++++++++++ app/Models/UsersGroup.php | 86 ++++++ app/Models/UsersGroupsDemandesValidation.php | 47 +++ resources/lang/en/messages.php | 1 + resources/lang/fr/messages.php | 1 + routes/web.php | 1 + 6 files changed, 407 insertions(+) create mode 100755 app/Http/Controllers/NanoCreditController.php create mode 100644 app/Models/UsersGroup.php create mode 100644 app/Models/UsersGroupsDemandesValidation.php diff --git a/app/Http/Controllers/NanoCreditController.php b/app/Http/Controllers/NanoCreditController.php new file mode 100755 index 0000000..6f706d9 --- /dev/null +++ b/app/Http/Controllers/NanoCreditController.php @@ -0,0 +1,271 @@ +validate($request, [ + 'id_user' => 'required|integer|min:0|not_in:0', + 'nom' => 'required', + 'code_sponsor1' => 'required', + 'code_sponsor2' => 'required', + 'code_sponsor3' => 'required', + 'password' => 'required', + 'limite_credit' => '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')); + + $group->fill($request->all()); + // Envoyer des codes sponsors differents + //Check sponsor 1 + $resp1 = $this->checkSponsorIdentification($request->code_sponsor1, 1); + if (is_numeric($resp1)) + $group->id_sponsor1 = $resp1; + else + return $resp1; + + //Check sponsor 2 + $resp2 = $this->checkSponsorIdentification($request->code_sponsor2, 2); + if (is_numeric($resp2)) + $group->id_sponsor2 = $resp2; + else + return $resp2; + + //Check sponsor 3 + $resp3 = $this->checkSponsorIdentification($request->code_sponsor3, 3); + if (is_numeric($resp3)) + $group->id_sponsor3 = $resp3; + else + return $resp3; + + $group->id_createur = $request->id_user; + $group->date_creation = new \DateTime(); + $group->nombre_validation = 0; + $group->actif = false; + $group->valide = false; + $group->save(); + + $this->sendNotificationToSponsor($group->id, $group->id_sponsor1); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor2); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor3); + + return $this->successResponse(trans('messages.successful_user_group_created')); + + } + + public function validateGroup(Request $request) + { + $this->validate($request, [ + 'id_demande' => 'required|integer|min:0|not_in:0', + 'id_user' => 'required|integer|min:0|not_in:0' + ]); + $demande = UsersGroupsDemandesValidation::findOrFail($request->id_demande); + if ($demande->statut == 1) + return $this->errorResponse(trans('errors.treated_group_demand')); + + if ($demande->id_sponsor != $request->id_user) + return $this->errorResponse(trans('errors.not_group_sponsor')); + + $group = UsersGroup::findOrFail($demande->id_group); + if (!in_array($demande->id_sponsor, [$group->id_sponsor1, $group->id_sponsor2, $group->id_sponsor3])) + return $this->errorResponse(trans('errors.not_group_sponsor')); + + if ($group->actif) + return $this->errorResponse(trans('errors.group_already_activated')); + + ++$group->nombre_validation; + if ($group->nombre_validation == 3) { + $group->actif = true; + $group->date_activation = new \DateTime(); + $group->code_groupe = $this->getGroupID(); + $group->createur->group_id = $group->id; + $group->sponsor1->group_id = $group->id; + $group->sponsor2->group_id = $group->id; + $group->sponsor3->group_id = $group->id; + $group->createur->save(); + $group->sponsor1->save(); + $group->sponsor2->save(); + $group->sponsor3->save(); + } + $group->save(); + $demande->statut = true; + $demande->date_validation = new \DateTime(); + $demande->save(); + // Create credit and epargne account + return $this->successResponse(trans_choice('messages.successful_group_validation', 3 - $group->nombre_validation, ['count' => (3 - $group->nombre_validation)])); + + } + + public function updateGroup(Request $request) + { + $this->validate($request, [ + 'code_groupe' => 'required', + 'code_sponsor1' => 'required', + 'code_sponsor2' => 'required', + 'code_sponsor3' => 'required', + 'password' => 'required', + 'limite_credit' => 'required|numeric|min:0|not_in:0', + ]); + $group = UsersGroup::where('code_groupe', $request->code_groupe)->firstOrFail(); + $user = User::findOrFail($group->id_createur); + if (!$this->checkPassword($request->password, $user->encrypted_password, $user->salt)) + return $this->errorResponse(trans('messages.incorrect_user_password')); + + $sponsor1 = User::where('user_code', $request->code_sponsor1)->firstOrFail(); + $sponsor2 = User::where('user_code', $request->code_sponsor2)->firstOrFail(); + $sponsor3 = User::where('user_code', $request->code_sponsor3)->firstOrFail(); + + if ($sponsor1->id != $group->id_sponsor1) { + $prevSponsor1 = $group->sponsor1; + //Check sponsor 1 + $resp1 = $this->checkSponsorIdentification($request->code_sponsor1, 1); + if (is_numeric($resp1)) + $group->id_sponsor1 = $resp1; + else + return $resp1; + + --$group->nombre_validation; + $prevSponsor1->group_id = null; + } + if ($sponsor2->id != $group->id_sponsor2) { + $prevSponsor2 = $group->sponsor2; + //Check sponsor 2 + $resp2 = $this->checkSponsorIdentification($request->code_sponsor2, 2); + if (is_numeric($resp2)) + $group->id_sponsor2 = $resp2; + else + return $resp2; + + --$group->nombre_validation; + $prevSponsor2->group_id = null; + } + if ($sponsor3->id != $group->id_sponsor3) { + $prevSponsor3 = $group->sponsor3; + //Check sponsor 3 + $resp3 = $this->checkSponsorIdentification($request->code_sponsor3, 3); + if (is_numeric($resp3)) + $group->id_sponsor3 = $resp3; + else + return $resp3; + + --$group->nombre_validation; + $prevSponsor3->group_id = null; + } + + $group->fill($request->all()); + $group->actif = false; + $group->date_activation = null; + if (isset($prevSponsor1)) { + $prevSponsor1->save(); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor1); + } + if (isset($prevSponsor2)) { + $prevSponsor2->save(); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor2); + } + if (isset($prevSponsor3)) { + $prevSponsor3->save(); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor3); + } + $group->save(); + + return $this->successResponse(trans('messages.successful_user_group_modificated')); + } + + + private function sendNotificationToSponsor($id_group, $id_sponsor) + { + $demande = new UsersGroupsDemandesValidation(); + $demande->id_group = $id_group; + $demande->id_sponsor = $id_sponsor; + $demande->date_creation = new \DateTime(); + $demande->statut = false; + $demande->save(); + } + + private function checkSponsorIdentification($code_sponsor, $id) + { + $sponsor = User::where('user_code', $code_sponsor)->first(); + //Verifier s'il appartient a un groupe + if (isset($sponsor->group_id)) + return $this->errorResponse(trans('errors.sponsor_belongs_to_group', ['id' => $id])); + if ($sponsor) { + return $this->checkUserIdentification($sponsor->id, $id); + } else { + return $this->errorResponse('Ce code sponsor' . $id . ' n\'existe pas '); + } + } + + private function checkUserIdentification($id_user, $id) + { + $identification = Identification::where('id_user', $id_user)->first(); + if (isset($identification)) { + if ($identification->status == 0) + return $this->errorResponse(trans('errors.validation_sponsor_identification_required', ['id' => $id])); + else + return $id_user; + } else { + return $this->errorResponse(trans('errors.sponsor_identification_required', ['id' => $id])); + } + } + + private function getGroupID() + { + do { + $code = $this->generateGroupCode(); + $result = collect(DB::select('SELECT * FROM users_groups WHERE code_groupe = :code', ['code' => $code])); + $codeCorrect = sizeof($result) < 0; + } while ($codeCorrect); + return $code; + } + + private function generateGroupCode($length = 8) + { + $characters = '23456789ABCDEFGHJKLMNOPQRSTUVWXYZ'; + $charactersLength = strlen($characters); + $randomString = ''; + for ($i = 0; $i < $length; $i++) { + $randomString .= $characters[rand(0, $charactersLength - 1)]; + } + return $randomString; + } + +} diff --git a/app/Models/UsersGroup.php b/app/Models/UsersGroup.php new file mode 100644 index 0000000..8096ac4 --- /dev/null +++ b/app/Models/UsersGroup.php @@ -0,0 +1,86 @@ + 'float', + 'id_sponsor1' => 'int', + 'id_sponsor2' => 'int', + 'id_sponsor3' => 'int', + 'nombre_validation' => 'int', + 'actif' => 'int', + 'valide' => 'int', + 'id_createur' => 'int' + ]; + + protected $dates = [ + 'date_creation', + 'date_activation' + ]; + + protected $fillable = [ + 'code_groupe', + 'nom', + 'limite_credit', + 'id_sponsor1', + 'id_sponsor2', + 'id_sponsor3', + 'nombre_validation', + 'actif', + 'valide', + 'id_createur', + 'date_creation', + 'date_activation' + ]; + + public function createur() + { + return $this->belongsTo(User::class, 'id_createur'); + } + + public function sponsor1() + { + return $this->belongsTo(User::class, 'id_sponsor1'); + } + + public function sponsor2() + { + return $this->belongsTo(User::class, 'id_sponsor2'); + } + + public function sponsor3() + { + return $this->belongsTo(User::class, 'id_sponsor3'); + } +} diff --git a/app/Models/UsersGroupsDemandesValidation.php b/app/Models/UsersGroupsDemandesValidation.php new file mode 100644 index 0000000..68adf2f --- /dev/null +++ b/app/Models/UsersGroupsDemandesValidation.php @@ -0,0 +1,47 @@ + 'int', + 'id_sponsor' => 'int', + 'statut' => 'int' + ]; + + protected $dates = [ + 'date_validation', + 'date_creation' + ]; + + protected $fillable = [ + 'id_group', + 'id_sponsor', + 'statut', + 'date_validation', + 'date_creation' + ]; +} diff --git a/resources/lang/en/messages.php b/resources/lang/en/messages.php index b5c20d7..3d64707 100755 --- a/resources/lang/en/messages.php +++ b/resources/lang/en/messages.php @@ -151,4 +151,5 @@ Your new identification has been taken into account. Contact an iLink World agen Regards, iLinkWorld team.', + 'successful_user_group_modificated' => 'The group has been modified successfully. Awaiting validation from new sponsors to activate it', ]; diff --git a/resources/lang/fr/messages.php b/resources/lang/fr/messages.php index a740c6d..664d8f0 100755 --- a/resources/lang/fr/messages.php +++ b/resources/lang/fr/messages.php @@ -151,4 +151,5 @@ Votre nouvelle identification a bien été bien prise en compte. Rapprochez vous Cordialement, Equipe iLinkWorld.', + 'successful_user_group_modificated' => 'Le groupe a été modifié avec succes. En attente de validation des nouveaux sponsors pour l\'activer', ]; diff --git a/routes/web.php b/routes/web.php index 39e72a3..14feaf7 100755 --- a/routes/web.php +++ b/routes/web.php @@ -73,4 +73,5 @@ $router->group(['prefix' => '/identifications'], function () use ($router) { $router->group(['prefix' => '/groups'], function () use ($router) { $router->post('', 'NanoCreditController@createGroup'); $router->put('', 'NanoCreditController@validateGroup'); + $router->post('update', 'NanoCreditController@updateGroup'); });