From be09ba1917bfa6e4e0ffe6f56451cd2adc3ce8cc Mon Sep 17 00:00:00 2001 From: Djery-Tom Date: Mon, 17 Aug 2020 13:22:40 +0100 Subject: [PATCH] + Fix bug on User groups demands --- app/Http/Controllers/NanoCreditController.php | 505 ----------------- app/Http/Controllers/UserGroupController.php | 529 ++++++++++++++++++ app/Traits/Helper.php | 23 + routes/web.php | 16 +- 4 files changed, 560 insertions(+), 513 deletions(-) create mode 100755 app/Http/Controllers/UserGroupController.php diff --git a/app/Http/Controllers/NanoCreditController.php b/app/Http/Controllers/NanoCreditController.php index 5277fe0..e06e5e2 100755 --- a/app/Http/Controllers/NanoCreditController.php +++ b/app/Http/Controllers/NanoCreditController.php @@ -37,511 +37,6 @@ class NanoCreditController extends Controller // } - // Gestion des groupes - - public function createGroup(Request $request) - { - $group = new UsersGroup(); - $this->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')); - - $this->checkMyIdentification($request->id_user); - - //Verifier s'il appartient a un groupe - if (isset($user->group_id)) - return $this->errorResponse(trans('errors.user_belongs_to_group')); - - //Verifier s'il n'est pas sponsor - if (in_array($user->user_code, [$request->code_sponsor1, $request->code_sponsor2, $request->code_sponsor3])) - return $this->errorResponse(trans('errors.cannot_be_sponsor')); - - //Verifier l'unicite de chacun des trois sponsors - if ($this->array_has_dupes([$request->code_sponsor1, $request->code_sponsor2, $request->code_sponsor3])) - return $this->errorResponse(trans('errors.sponsors_must_be_unique')); - - $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')); - } - - if (!$config->has_nano_credit) - return $this->errorResponse(trans('errors.nano_credit_not_available')); - if ($request->limite_credit > $config->limite_credit_max) - return $this->errorResponse(trans('errors.credit_limit_is_greater_than_max')); - if ($request->limite_credit < $config->limite_credit_min) - return $this->errorResponse(trans('errors.credit_limit_is_less_than_min')); - - $group->fill($request->all()); - // Envoyer des codes sponsors differents - //Check sponsor 1 - $resp1 = $this->checkSponsorIdentification($request->code_sponsor1, 1, $init_country); - - if ($resp1 instanceof Identification) - $group->id_sponsor1 = $resp1->id_user; - else - return $resp1; - - //Check sponsor 2 - $resp2 = $this->checkSponsorIdentification($request->code_sponsor2, 2, $init_country); - if ($resp2 instanceof Identification) - $group->id_sponsor2 = $resp2->id_user; - else - return $resp2; - - //Check sponsor 3 - $resp3 = $this->checkSponsorIdentification($request->code_sponsor3, 3, $init_country); - if ($resp3 instanceof Identification) - $group->id_sponsor3 = $resp3->id_user; - else - return $resp3; - - $group->id_createur = $request->id_user; - $group->date_creation = new \DateTime(); - $group->nombre_validation = 0; - $group->actif = false; - $group->nombre_utilisateurs = 1; - $group->code_groupe = $this->getGroupID(); - $group->save(); - $user->group_id = $group->id; - $user->date_adhesion = new \DateTime(); - $user->save(); - - $this->sendNotificationToSponsor($group->id, $group->id_sponsor1, $request->code_sponsor1, $user); - $this->sendNotificationToSponsor($group->id, $group->id_sponsor2, $request->code_sponsor2, $user); - $this->sendNotificationToSponsor($group->id, $group->id_sponsor3, $request->code_sponsor3, $user); - - return $this->successResponse(trans('messages.successful_user_group_created')); - - } - - public function validateGroupDemand(Request $request) - { - $this->validate($request, [ - 'type' => 'required|in:creation,suppression', - ]); - - if ($request->type == 'creation') - return $this->validateGroupCreationDemand($request); - if ($request->type == 'suppression') - return $this->validateDeletingGroupDemand($request); - } - - - private function validateGroupCreationDemand(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 != 0) - return $this->errorResponse(trans('errors.treated_group_demand')); - - if ($demande->id_sponsor != $request->id_user) - return $this->errorResponse(trans('errors.not_group_sponsor')); - - $sponsor = User::findOrFail($request->id_user); - $group = UsersGroup::findOrFail($demande->id_group); - - if ($group->actif) - return $this->errorResponse(trans('errors.group_already_active')); - - ++$group->nombre_validation; - ++$group->nombre_utilisateurs; - if ($group->nombre_validation == 3) { - $group->actif = true; - $group->date_activation = new \DateTime(); - } - - $sponsor->group_id = $group->id; - $sponsor->date_adhesion = new \DateTime(); - $sponsor->save(); - $group->save(); - $demande->statut = true; - $demande->date_validation = new \DateTime(); - $demande->save(); - // Notififier le createur - $data = new \stdClass(); - $data->screen = "notificationview"; - $data->data = new \stdClass();; - $data->data->id = $request->id_demande; - $this->sendPushNotificationToUser($group->createur->user_code, - trans('notifications.accepted_group_validation_request', ['name' => $sponsor->lastname . ' ' . $sponsor->firstname]), $data); - - return $this->successResponse(trans_choice('messages.successful_group_validation', 3 - $group->nombre_validation, ['count' => (3 - $group->nombre_validation)])); - - } - - public function cancelGroupDemand(Request $request) - { - $this->validate($request, [ - 'id_demande' => 'required|integer|min:0|not_in:0', - 'id_user' => 'required|integer|min:0|not_in:0', - 'type' => 'required|in:creation,suppression', - ]); - $demande = UsersGroupsDemandesValidation::findOrFail($request->id_demande); - if ($demande->statut != 0) - return $this->errorResponse(trans('errors.treated_group_demand')); - - if ($demande->id_sponsor != $request->id_user) - return $this->errorResponse(trans('errors.not_group_sponsor')); - - - $sponsor = User::findOrFail($request->id_user); - $group = UsersGroup::findOrFail($demande->id_group); - - $demande->statut = 2; - $demande->date_validation = new \DateTime(); - $demande->save(); - // Notififier le createur - $data = new \stdClass(); - $data->screen = "notificationview"; - $data->data = new \stdClass();; - $data->data->id = $request->id_demande; - - if ($request->type == 'creation') { - $this->sendPushNotificationToUser($group->createur->user_code, - trans('notifications.refused_group_validation_request', ['name' => $sponsor->lastname . ' ' . $sponsor->firstname]), $data); - - return $this->successResponse(trans('messages.successful_refused_group_validation')); - } - - if ($request->type == 'suppression') { - $this->sendPushNotificationToUser($group->createur->user_code, - trans('notifications.refused_group_deleting_request', ['name' => $sponsor->lastname . ' ' . $sponsor->firstname]), $data); - - return $this->successResponse(trans('messages.successful_refused_group_deleting')); - } - - } - - 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')); - - //Verifier s'il n'est pas sponsor - if (in_array($user->user_code, [$request->code_sponsor1, $request->code_sponsor2, $request->code_sponsor3])) - return $this->errorResponse(trans('errors.cannot_be_sponsor')); - - //Verifier l'unicite de chacun des trois sponsors - if ($this->array_has_dupes([$request->code_sponsor1, $request->code_sponsor2, $request->code_sponsor3])) - return $this->errorResponse(trans('errors.sponsors_must_be_unique')); - - $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(); - - $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')); - } - - if ($request->limite_credit > $config->limite_credit_max) - return $this->errorResponse(trans('errors.credit_limit_is_greater_than_max')); - if ($request->limite_credit < $config->limite_credit_min) - return $this->errorResponse(trans('errors.credit_limit_is_less_than_min')); - - if ($sponsor1->id != $group->id_sponsor1) { - $prevSponsor1 = $group->sponsor1; - //Check sponsor 1 - $resp1 = $this->checkSponsorIdentification($request->code_sponsor1, 1, $init_country); - if ($resp1 instanceof Identification) - $group->id_sponsor1 = $resp1->id_user; - 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, $init_country); - if ($resp2 instanceof Identification) - $group->id_sponsor2 = $resp2->id_user; - 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, $init_country); - if ($resp3 instanceof Identification) - $group->id_sponsor3 = $resp3->id_user; - 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, $request->code_sponsor1, $user); - } - if (isset($prevSponsor2)) { - $prevSponsor2->save(); - $this->sendNotificationToSponsor($group->id, $group->id_sponsor2, $request->code_sponsor2, $user); - } - if (isset($prevSponsor3)) { - $prevSponsor3->save(); - $this->sendNotificationToSponsor($group->id, $group->id_sponsor3, $request->code_sponsor3, $user); - } - $group->save(); - - return $this->successResponse(trans('messages.successful_user_group_modificated')); - } - - - public function sendNotificationToSponsor($id_group, $id_sponsor, $sponsor_code, User $sender, $type = 'creation') - { - $demande = new UsersGroupsDemandesValidation(); - $demande->id_group = $id_group; - $demande->id_sponsor = $id_sponsor; - $demande->date_creation = new \DateTime(); - $demande->statut = false; - $demande->type = $type; - $demande->save(); - - $data = new \stdClass(); - $data->screen = $type == 'creation' ? "demandeValidationGroupe" : "demandeSuppressionGroupe"; - $data->data = new \stdClass(); - $data->data->id = $demande->id; - - if ($type == 'creation') - $this->sendPushNotificationToUser($sponsor_code, - trans('notifications.group_validation_request', ['name' => $sender->lastname . ' ' . $sender->firstname]), $data); - else - $this->sendPushNotificationToUser($sponsor_code, - trans('notifications.group_deleting_request', ['name' => $sender->lastname . ' ' . $sender->firstname]), $data); - } - - public function getGroupDemand($id_demand) - { - - $demand = collect(DB::select('SELECT * FROM users_groups_demandes_validations ugd - INNER JOIN infos_users_groups ug ON ug.id = ugd.id_group WHERE ugd.id = :id;', ['id' => $id_demand]))->first(); - if ($demand) - return $this->successResponse($demand); - else - return $this->errorResponse(trans('errors.model_not_found', ['model' => 'groupValidationDemand']), Response::HTTP_BAD_REQUEST); - } - - public function getAllGroupDemand($id_user) - { - - $demands = DB::select('SELECT * FROM users_groups_demandes_validations ugd - INNER JOIN infos_users_groups ug ON ug.id = ugd.id_group WHERE ugd.id_sponsor = :id;', ['id' => $id_user]); - - return $this->successResponse($demands); - } - - public function joinGroup(Request $request) - { - $this->validate($request, [ - 'code_groupe' => 'required', - 'code_sponsor' => 'required', - 'id_user' => 'required|integer|min:0|not_in:0' - ]); - - $group = UsersGroup::where('code_groupe', $request->code_groupe)->firstOrFail(); - if (!$group->actif) - return $this->errorResponse(trans('errors.group_not_active')); - - $sponsor = User::where('user_code', $request->code_sponsor)->firstOrFail(); - if (!in_array($sponsor->id, [$group->id_sponsor1, $group->id_sponsor2, $group->id_sponsor3])) - return $this->errorResponse(trans('errors.not_group_sponsor')); - - $user = User::findOrFail($request->id_user); - if (isset($user->group_id)) - return $this->errorResponse(trans('errors.belongs_to_group')); - - //Check user identification - $country_sponsor = $sponsor->network->country->id; - $country_user = $user->network->country->id; - if ($country_user != $country_sponsor) - return $this->errorResponse(trans('errors.not_registered_in_same_country')); - - $this->checkMyIdentification($request->id_user); - - $user->group_id = $group->id; - $user->save(); - ++$group->nombre_utilisateurs; - $group->save(); - // Notifier les determinants - return $this->successResponse(trans('messages.successful_group_adhesion')); - - } - - public function deleteGroup(Request $request) - { - $this->validate($request, [ - 'code_groupe' => 'required', - 'id_user' => 'required|integer|min:0|not_in:0' - ]); - - $group = UsersGroup::where('code_groupe', $request->code_groupe)->firstOrFail(); - if ($group->id_createur != $request->id_user) - return $this->errorResponse(trans('errors.not_group_creator')); - - $this->sendNotificationToSponsor($group->id, $group->id_sponsor1, $group->sponsor1->user_code, $group->createur, 'suppression'); - $this->sendNotificationToSponsor($group->id, $group->id_sponsor2, $group->sponsor2->user_code, $group->createur, 'suppression'); - $this->sendNotificationToSponsor($group->id, $group->id_sponsor3, $group->sponsor3->user_code, $group->createur, 'suppression'); - - return $this->successResponse(trans('messages.successful_user_group_deleted')); - - } - - private function validateDeletingGroupDemand(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 != 0) - return $this->errorResponse(trans('errors.treated_group_demand')); - - if ($demande->id_sponsor != $request->id_user) - return $this->errorResponse(trans('errors.not_group_sponsor')); - - $sponsor = User::findOrFail($request->id_user); - $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')); - - - ++$group->nombre_suppression; - if ($group->nombre_suppression == 3) { - $group->actif = false; - $group->nombre_validation = 0; - $group->date_activation = null; - $users = User::where('group_id', $group->id)->get(); - foreach ($users as $user) { - $user->group_id = null; - $user->date_adhesion = null; - $user->save(); - } - $group->deleted = true; - } - $group->save(); - $demande->statut = true; - $demande->date_validation = new \DateTime(); - $demande->save(); - // Notififier le createur - $data = new \stdClass(); - $data->screen = "notificationview"; - $data->data = new \stdClass();; - $data->data->id = $request->id_demande; - $this->sendPushNotificationToUser($group->createur->user_code, - trans('notifications.accepted_group_deleting_request', ['name' => $sponsor->lastname . ' ' . $sponsor->firstname]), $data); - - return $this->successResponse(trans_choice('messages.successful_group_deleting', 3 - $group->nombre_validation, ['count' => (3 - $group->nombre_validation)])); - - } - - private function checkSponsorIdentification($code_sponsor, $id, $init_country) - { - $sponsor = User::where('user_code', $code_sponsor)->first(); - if ($sponsor) { - //Verifier s'il appartient a un groupe - if (isset($sponsor->group_id)) - return $this->errorResponse(trans('errors.sponsor_belongs_to_group', ['id' => $id])); - $sponsor_country = $sponsor->network->country->id; - if ($init_country != $sponsor_country) - return $this->errorResponse(trans('errors.sponsor_not_registered_in_same_country', ['id' => $id])); - - return $this->checkUserIdentification($sponsor->id, $id); - } else { - return $this->errorResponse(trans('errors.sponsor_not_found', ['id' => $id])); - } - } - - 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 $identification; - } 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; - } - - private function checkMyIdentification($id) - { - $identification = Identification::where('id_user', $id)->first(); - if (isset($identification)) { - if ($identification->status == 0) - return $this->errorResponse(trans('errors.validation_identification_required')); - } else { - return $this->errorResponse(trans('errors.identification_required')); - } - } - // Gestion du nano credit public function askNanoCredit(Request $request) diff --git a/app/Http/Controllers/UserGroupController.php b/app/Http/Controllers/UserGroupController.php new file mode 100755 index 0000000..c98fb10 --- /dev/null +++ b/app/Http/Controllers/UserGroupController.php @@ -0,0 +1,529 @@ +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')); + + $this->checkMyIdentification($request->id_user); + + //Verifier s'il appartient a un groupe + if (isset($user->group_id)) + return $this->errorResponse(trans('errors.user_belongs_to_group')); + + //Verifier s'il n'est pas sponsor + if (in_array($user->user_code, [$request->code_sponsor1, $request->code_sponsor2, $request->code_sponsor3])) + return $this->errorResponse(trans('errors.cannot_be_sponsor')); + + //Verifier l'unicite de chacun des trois sponsors + if ($this->array_has_dupes([$request->code_sponsor1, $request->code_sponsor2, $request->code_sponsor3])) + return $this->errorResponse(trans('errors.sponsors_must_be_unique')); + + $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')); + } + + if (!$config->has_nano_credit) + return $this->errorResponse(trans('errors.nano_credit_not_available')); + if ($request->limite_credit > $config->limite_credit_max) + return $this->errorResponse(trans('errors.credit_limit_is_greater_than_max')); + if ($request->limite_credit < $config->limite_credit_min) + return $this->errorResponse(trans('errors.credit_limit_is_less_than_min')); + + $group->fill($request->all()); + // Envoyer des codes sponsors differents + //Check sponsor 1 + $resp1 = $this->checkSponsorIdentification($request->code_sponsor1, 1, $init_country); + + if ($resp1 instanceof Identification) + $group->id_sponsor1 = $resp1->id_user; + else + return $resp1; + + //Check sponsor 2 + $resp2 = $this->checkSponsorIdentification($request->code_sponsor2, 2, $init_country); + if ($resp2 instanceof Identification) + $group->id_sponsor2 = $resp2->id_user; + else + return $resp2; + + //Check sponsor 3 + $resp3 = $this->checkSponsorIdentification($request->code_sponsor3, 3, $init_country); + if ($resp3 instanceof Identification) + $group->id_sponsor3 = $resp3->id_user; + else + return $resp3; + + $group->id_createur = $request->id_user; + $group->date_creation = new \DateTime(); + $group->nombre_validation = 0; + $group->actif = false; + $group->nombre_utilisateurs = 1; + $group->code_groupe = $this->getGroupID(); + $group->save(); + $user->group_id = $group->id; + $user->date_adhesion = new \DateTime(); + $user->save(); + + $this->sendNotificationToSponsor($group->id, $group->id_sponsor1, $request->code_sponsor1, $user); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor2, $request->code_sponsor2, $user); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor3, $request->code_sponsor3, $user); + + return $this->successResponse(trans('messages.successful_user_group_created')); + + } + + public function validateGroupDemand(Request $request) + { + $this->validate($request, [ + 'type' => 'required|in:creation,suppression', + ]); + + if ($request->type == 'creation') + return $this->validateGroupCreationDemand($request); + if ($request->type == 'suppression') + return $this->validateDeletingGroupDemand($request); + } + + + private function validateGroupCreationDemand(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 != 0) + return $this->errorResponse(trans('errors.treated_group_demand')); + + if ($demande->id_sponsor != $request->id_user) + return $this->errorResponse(trans('errors.not_group_sponsor')); + + $sponsor = User::findOrFail($request->id_user); + $group = UsersGroup::findOrFail($demande->id_group); + + if ($group->actif) + return $this->errorResponse(trans('errors.group_already_active')); + + ++$group->nombre_validation; + ++$group->nombre_utilisateurs; + if ($group->nombre_validation == 3) { + $group->actif = true; + $group->date_activation = new \DateTime(); + } + + $sponsor->group_id = $group->id; + $sponsor->date_adhesion = new \DateTime(); + $sponsor->save(); + $group->save(); + $demande->statut = true; + $demande->date_validation = new \DateTime(); + $demande->save(); + // Notififier le createur + $data = new \stdClass(); + $data->screen = "notificationview"; + $data->data = new \stdClass();; + $data->data->id = $request->id_demande; + $this->sendPushNotificationToUser($group->createur->user_code, + trans('notifications.accepted_group_validation_request', ['name' => $sponsor->lastname . ' ' . $sponsor->firstname]), $data); + + return $this->successResponse(trans_choice('messages.successful_group_validation', 3 - $group->nombre_validation, ['count' => (3 - $group->nombre_validation)])); + + } + + public function cancelGroupDemand(Request $request) + { + $this->validate($request, [ + 'id_demande' => 'required|integer|min:0|not_in:0', + 'id_user' => 'required|integer|min:0|not_in:0', + 'type' => 'required|in:creation,suppression', + ]); + $demande = UsersGroupsDemandesValidation::findOrFail($request->id_demande); + if ($demande->statut != 0) + return $this->errorResponse(trans('errors.treated_group_demand')); + + if ($demande->id_sponsor != $request->id_user) + return $this->errorResponse(trans('errors.not_group_sponsor')); + + + $sponsor = User::findOrFail($request->id_user); + $group = UsersGroup::findOrFail($demande->id_group); + + $demande->statut = 2; + $demande->date_validation = new \DateTime(); + $demande->save(); + // Notififier le createur + $data = new \stdClass(); + $data->screen = "notificationview"; + $data->data = new \stdClass();; + $data->data->id = $request->id_demande; + + if ($request->type == 'creation') { + $this->sendPushNotificationToUser($group->createur->user_code, + trans('notifications.refused_group_validation_request', ['name' => $sponsor->lastname . ' ' . $sponsor->firstname]), $data); + + return $this->successResponse(trans('messages.successful_refused_group_validation')); + } + + if ($request->type == 'suppression') { + $this->sendPushNotificationToUser($group->createur->user_code, + trans('notifications.refused_group_deleting_request', ['name' => $sponsor->lastname . ' ' . $sponsor->firstname]), $data); + + return $this->successResponse(trans('messages.successful_refused_group_deleting')); + } + + } + + 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')); + + //Verifier s'il n'est pas sponsor + if (in_array($user->user_code, [$request->code_sponsor1, $request->code_sponsor2, $request->code_sponsor3])) + return $this->errorResponse(trans('errors.cannot_be_sponsor')); + + //Verifier l'unicite de chacun des trois sponsors + if ($this->array_has_dupes([$request->code_sponsor1, $request->code_sponsor2, $request->code_sponsor3])) + return $this->errorResponse(trans('errors.sponsors_must_be_unique')); + + $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(); + + $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')); + } + + if ($request->limite_credit > $config->limite_credit_max) + return $this->errorResponse(trans('errors.credit_limit_is_greater_than_max')); + if ($request->limite_credit < $config->limite_credit_min) + return $this->errorResponse(trans('errors.credit_limit_is_less_than_min')); + + if ($sponsor1->id != $group->id_sponsor1) { + $prevSponsor1 = $group->sponsor1; + //Check sponsor 1 + $resp1 = $this->checkSponsorIdentification($request->code_sponsor1, 1, $init_country); + if ($resp1 instanceof Identification) + $group->id_sponsor1 = $resp1->id_user; + else + return $resp1; + + --$group->nombre_validation; + $prevSponsor1->group_id = null; + $prevSponsor1->date_adhesion = null; + } + if ($sponsor2->id != $group->id_sponsor2) { + $prevSponsor2 = $group->sponsor2; + //Check sponsor 2 + $resp2 = $this->checkSponsorIdentification($request->code_sponsor2, 2, $init_country); + if ($resp2 instanceof Identification) + $group->id_sponsor2 = $resp2->id_user; + else + return $resp2; + + --$group->nombre_validation; + $prevSponsor2->group_id = null; + $prevSponsor2->date_adhesion = null; + } + if ($sponsor3->id != $group->id_sponsor3) { + $prevSponsor3 = $group->sponsor3; + //Check sponsor 3 + $resp3 = $this->checkSponsorIdentification($request->code_sponsor3, 3, $init_country); + if ($resp3 instanceof Identification) + $group->id_sponsor3 = $resp3->id_user; + else + return $resp3; + + --$group->nombre_validation; + $prevSponsor3->group_id = null; + $prevSponsor3->date_adhesion = null; + } + + $group->fill($request->all()); + $group->actif = false; + $group->date_activation = null; + if (isset($prevSponsor1)) { + $prevSponsor1->save(); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor1, $request->code_sponsor1, $user); + } + if (isset($prevSponsor2)) { + $prevSponsor2->save(); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor2, $request->code_sponsor2, $user); + } + if (isset($prevSponsor3)) { + $prevSponsor3->save(); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor3, $request->code_sponsor3, $user); + } + $group->save(); + + return $this->successResponse(trans('messages.successful_user_group_modificated')); + } + + + public function sendNotificationToSponsor($id_group, $id_sponsor, $sponsor_code, User $sender, $type = 'creation') + { + $demande = new UsersGroupsDemandesValidation(); + $demande->id_group = $id_group; + $demande->id_sponsor = $id_sponsor; + $demande->date_creation = new \DateTime(); + $demande->statut = false; + $demande->type = $type; + $demande->save(); + + $data = new \stdClass(); + $data->screen = $type == 'creation' ? "demandeValidationGroupe" : "demandeSuppressionGroupe"; + $data->data = new \stdClass(); + $data->data->id = $demande->id; + + if ($type == 'creation') + $this->sendPushNotificationToUser($sponsor_code, + trans('notifications.group_validation_request', ['name' => $sender->lastname . ' ' . $sender->firstname]), $data); + else + $this->sendPushNotificationToUser($sponsor_code, + trans('notifications.group_deleting_request', ['name' => $sender->lastname . ' ' . $sender->firstname]), $data); + } + + public function getGroupDemand($id_demand) + { + + $demand = collect(DB::select('SELECT * FROM users_groups_demandes_validations ugd + INNER JOIN infos_users_groups ug ON ug.id = ugd.id_group WHERE ugd.id = :id;', ['id' => $id_demand]))->first(); + if ($demand) + return $this->successResponse($demand); + else + return $this->errorResponse(trans('errors.model_not_found', ['model' => 'groupValidationDemand']), Response::HTTP_BAD_REQUEST); + } + + public function getAllGroupDemand($id_user) + { + + $demands = DB::select('SELECT ugd.* , ug.code_groupe , ug.nom , ug.limite_credit , ug.nombre_validation, ug.actif, ug.nombre_utilisateurs, +ug.date_creation , ug.createur , ug.sponsor1 , ug.sponsor2 , ug.sponsor3, ug.country, ug.currency_code FROM users_groups_demandes_validations ugd + INNER JOIN infos_users_groups ug ON ug.id = ugd.id_group WHERE ugd.id_sponsor = :id;', ['id' => $id_user]); + + return $this->successResponse($demands); + } + + public function joinGroup(Request $request) + { + $this->validate($request, [ + 'code_groupe' => 'required', + 'code_sponsor' => 'required', + 'id_user' => 'required|integer|min:0|not_in:0' + ]); + + $group = UsersGroup::where('code_groupe', $request->code_groupe)->firstOrFail(); + if (!$group->actif) + return $this->errorResponse(trans('errors.group_not_active')); + + $sponsor = User::where('user_code', $request->code_sponsor)->firstOrFail(); + if (!in_array($sponsor->id, [$group->id_sponsor1, $group->id_sponsor2, $group->id_sponsor3])) + return $this->errorResponse(trans('errors.not_group_sponsor')); + + $user = User::findOrFail($request->id_user); + if (isset($user->group_id)) + return $this->errorResponse(trans('errors.belongs_to_group')); + + //Check user identification + $country_sponsor = $sponsor->network->country->id; + $country_user = $user->network->country->id; + if ($country_user != $country_sponsor) + return $this->errorResponse(trans('errors.not_registered_in_same_country')); + + $this->checkMyIdentification($request->id_user); + + $user->group_id = $group->id; + $user->date_adhesion = new \DateTime(); + $user->save(); + ++$group->nombre_utilisateurs; + $group->save(); + // Notifier les determinants + return $this->successResponse(trans('messages.successful_group_adhesion')); + + } + + public function deleteGroup(Request $request) + { + $this->validate($request, [ + 'code_groupe' => 'required', + 'id_user' => 'required|integer|min:0|not_in:0' + ]); + + $group = UsersGroup::where('code_groupe', $request->code_groupe)->firstOrFail(); + if ($group->id_createur != $request->id_user) + return $this->errorResponse(trans('errors.not_group_creator')); + + $this->sendNotificationToSponsor($group->id, $group->id_sponsor1, $group->sponsor1->user_code, $group->createur, 'suppression'); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor2, $group->sponsor2->user_code, $group->createur, 'suppression'); + $this->sendNotificationToSponsor($group->id, $group->id_sponsor3, $group->sponsor3->user_code, $group->createur, 'suppression'); + + return $this->successResponse(trans('messages.successful_user_group_deleted')); + + } + + private function validateDeletingGroupDemand(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 != 0) + return $this->errorResponse(trans('errors.treated_group_demand')); + + if ($demande->id_sponsor != $request->id_user) + return $this->errorResponse(trans('errors.not_group_sponsor')); + + $sponsor = User::findOrFail($request->id_user); + $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')); + + + ++$group->nombre_suppression; + if ($group->nombre_suppression == 3) { + $group->actif = false; + $group->nombre_validation = 0; + $group->date_activation = null; + $users = User::where('group_id', $group->id)->get(); + foreach ($users as $user) { + $user->group_id = null; + $user->date_adhesion = null; + $user->save(); + } + $group->deleted = true; + } + $group->save(); + $demande->statut = true; + $demande->date_validation = new \DateTime(); + $demande->save(); + // Notififier le createur + $data = new \stdClass(); + $data->screen = "notificationview"; + $data->data = new \stdClass();; + $data->data->id = $request->id_demande; + $this->sendPushNotificationToUser($group->createur->user_code, + trans('notifications.accepted_group_deleting_request', ['name' => $sponsor->lastname . ' ' . $sponsor->firstname]), $data); + + return $this->successResponse(trans_choice('messages.successful_group_deleting', 3 - $group->nombre_validation, ['count' => (3 - $group->nombre_validation)])); + + } + + private function checkSponsorIdentification($code_sponsor, $id, $init_country) + { + $sponsor = User::where('user_code', $code_sponsor)->first(); + if ($sponsor) { + //Verifier s'il appartient a un groupe + if (isset($sponsor->group_id)) + return $this->errorResponse(trans('errors.sponsor_belongs_to_group', ['id' => $id])); + $sponsor_country = $sponsor->network->country->id; + if ($init_country != $sponsor_country) + return $this->errorResponse(trans('errors.sponsor_not_registered_in_same_country', ['id' => $id])); + + return $this->checkUserIdentification($sponsor->id, $id); + } else { + return $this->errorResponse(trans('errors.sponsor_not_found', ['id' => $id])); + } + } + + 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 $identification; + } 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; + } + + +} diff --git a/app/Traits/Helper.php b/app/Traits/Helper.php index e73440d..4d1f21f 100644 --- a/app/Traits/Helper.php +++ b/app/Traits/Helper.php @@ -6,6 +6,7 @@ namespace App\Traits; use App\Models\CountriesCurrency; use App\Models\Country; +use App\Models\Identification; use App\Models\Network; use Brick\Money\Context\AutoContext; use Brick\Money\Context\CustomContext; @@ -204,4 +205,26 @@ trait Helper } return ($frais * $sommeTaux / 100) + $sommeFixe; } + + public function checkMyIdentification($id) + { + $identification = Identification::where('id_user', $id)->first(); + if (isset($identification)) { + if ($identification->status == 0) + return $this->errorResponse(trans('errors.validation_identification_required')); + } else { + return $this->errorResponse(trans('errors.identification_required')); + } + } + + public 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/routes/web.php b/routes/web.php index 8d72d9c..eec1d45 100755 --- a/routes/web.php +++ b/routes/web.php @@ -71,17 +71,17 @@ $router->group(['prefix' => '/identifications'], function () use ($router) { // Users groups routes $router->group(['prefix' => '/groups'], function () use ($router) { - $router->post('', 'NanoCreditController@createGroup'); - $router->put('', 'NanoCreditController@updateGroup'); - $router->post('join', 'NanoCreditController@joinGroup'); - $router->delete('', 'NanoCreditController@deleteGroup'); + $router->post('', 'UserGroupController@createGroup'); + $router->put('', 'UserGroupController@updateGroup'); + $router->post('join', 'UserGroupController@joinGroup'); + $router->delete('', 'UserGroupController@deleteGroup'); // Demandes de validation $router->group(['prefix' => '/demands'], function () use ($router) { - $router->get('{id_demand}', 'NanoCreditController@getGroupDemand'); - $router->get('all/{id_user}', 'NanoCreditController@getAllGroupDemand'); - $router->post('validate', 'NanoCreditController@validateGroupDemand'); - $router->post('cancel', 'NanoCreditController@cancelGroupDemand'); + $router->get('{id_demand}', 'UserGroupController@getGroupDemand'); + $router->get('all/{id_user}', 'UserGroupController@getAllGroupDemand'); + $router->post('validate', 'UserGroupController@validateGroupDemand'); + $router->post('cancel', 'UserGroupController@cancelGroupDemand'); $router->post('askNanoCredit', 'NanoCreditController@askNanoCredit'); }); });