diff --git a/app/Http/Controllers/WalletController.php b/app/Http/Controllers/WalletController.php index 95d9719..2f3594d 100755 --- a/app/Http/Controllers/WalletController.php +++ b/app/Http/Controllers/WalletController.php @@ -687,11 +687,11 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON return $this->errorResponse(trans($errorKey)); } - // Préparation des données communes pour éviter la répétition plus bas + // Préparation des données communes $commonAccountData = [ - 'id_user' => $request->id_user, - 'id_operator_country' => $request->id_operator, - 'customer_account_type_id' => $request->account_type, + 'id_user' => (int)$request->id_user, + 'customer_account_type_id' => (int)$request->account_type, + 'id_operator_country' => (int)$request->id_operator, 'firstname' => $request->firstname, 'lastname' => $request->lastname, 'nationality' => $request->nationality, @@ -710,12 +710,14 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON 'balance' => 0, ]; - // 2. CAS A : Même produit (Même opérateur ET même type) - $sameTypeAccount = UserBankAccount::where('id_user', $request->id_user) + + // Récupérer tous les comptes de l'user chez cet opérateur spécifique + $userAccountsAtThisBank = UserBankAccount::where('id_user', $request->id_user) ->where('id_operator_country', $request->id_operator) - ->where('customer_account_type_id', $request->account_type) - ->whereIn('status', ['pending', 'actived', 'rejected', 'closed']) - ->first(); + ->get(); + + // 2. CAS A : Le même type de compte existe déjà (doublon strict) + $sameTypeAccount = $userAccountsAtThisBank->where('customer_account_type_id', $request->account_type)->first(); if ($sameTypeAccount) { $statusMessages = [ @@ -727,76 +729,81 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON return $this->errorResponse($statusMessages[$sameTypeAccount->status] ?? 'Error', 500); } - // 3. CAS B : Autre produit chez le même opérateur (Ouverture via API) - $differentTypeAccount = UserBankAccount::where('id_user', $request->id_user) - ->where('id_operator_country', $request->id_operator) - ->where('customer_account_type_id', '!=', $request->account_type) - ->whereNotNull('account_number') - ->whereIn('status', ['pending', 'actived', 'rejected', 'closed']) + // 3. CAS B : Un AUTRE type de compte existe chez le même opérateur + $differentTypeAccount = $userAccountsAtThisBank->where('customer_account_type_id', '!=', $request->account_type) + ->whereIn('status', ['actived', 'pending', 'rejected', 'closed']) ->first(); if ($differentTypeAccount) { - $user = User::find($request->id_user); - if (!$user) return $this->errorResponse(trans('errors.user_not_found')); - $customer_account_type = CustomerAccountType::find($request->account_type); - if (!$customer_account_type) return $this->errorResponse(trans('errors.account_type_not_found')); + // Sous-cas : Le compte existant est ACTIF -> On peut appeler l'API + if ($differentTypeAccount->status == 'actived' && !empty($differentTypeAccount->customer_number)) { - try { - $client = new Client(['connect_timeout' => 60]); - $baseUrl = env('BANK_API_BASE_URL'); + $customer_account_type = CustomerAccountType::find($request->account_type); + if (!$customer_account_type) return $this->errorResponse(trans('errors.account_type_not_found')); - // Auth API - $authResponse = $client->post($baseUrl . '/auth/authenticate', [ - 'json' => ['login' => env('BANK_API_LOGIN'), 'password' => env('BANK_API_PASSWORD')] - ]); - $authResult = json_decode($authResponse->getBody(), true); - $token = $authResult['data']['token'] ?? null; + try { + $client = new Client(['connect_timeout' => 60]); + $baseUrl = env('BANK_API_BASE_URL'); - if (!$token) { - Log::error('Token introuvable pour user: ' . $request->id_user); - return $this->errorResponse(trans('errors.token_not_found'), 404); - } - - // Create Account API - $response = $client->post($baseUrl . '/clients/' . $differentTypeAccount->account_number . '/account', [ - 'headers' => ['Authorization' => 'Bearer ' . $token, 'Accept' => 'application/json'], - 'json' => ['productCode' => $customer_account_type->product] - ]); - - $result = json_decode($response->getBody(), true); - - if ($response->getStatusCode() <= 301 && ($result['success'] ?? true) != false) { - $newAccount = new UserBankAccount($commonAccountData); - $newAccount->account_number = $result['accountNumber'] ?? null; - $newAccount->customer_number = $result['clientMatricul'] ?? null; - $newAccount->reason = trans('messages.user_bank_account_activated_successfully'); - $newAccount->status = 'actived'; - $newAccount->save(); - - $user->update([ - 'id_bank_country' => $newAccount->id_operator_country, - 'iban' => $result['accountNumber'] ?? null + // Authentification + $authResponse = $client->post($baseUrl . '/auth/authenticate', [ + 'json' => ['login' => env('BANK_API_LOGIN'), 'password' => env('BANK_API_PASSWORD')] ]); + $token = json_decode($authResponse->getBody(), true)['data']['token'] ?? null; - try { - Mail::to($user->email)->send(new BankAccountActivated($newAccount, $customer_account_type->name)); - } catch (\Exception $e) { - Log::error("Mail error: " . $e->getMessage()); + if (!$token) { + Log::error('Token introuvable pour user: ' . $request->id_user); + return $this->errorResponse(trans('errors.token_not_found'), 404); } - return $this->successResponse(trans('messages.create_bank_account_linked_successfully'), 200); + // Ouverture du compte lié via API + $response = $client->post($baseUrl . '/clients/' . $differentTypeAccount->customer_number . '/account', [ + 'headers' => ['Authorization' => 'Bearer ' . $token, 'Accept' => 'application/json'], + 'json' => ['productCode' => $customer_account_type->product] + ]); + + $result = json_decode($response->getBody(), true); + + if ($response->getStatusCode() <= 301 && ($result['success'] ?? true) != false) { + $newAccount = new UserBankAccount($commonAccountData); + $newAccount->account_number = $result['accountNumber'] ?? null; + $newAccount->customer_number = $result['clientMatricul'] ?? null; + $newAccount->reason = trans('messages.user_bank_account_activated_successfully'); + $newAccount->status = 'actived'; + $newAccount->save(); + + $user->update([ + 'id_bank_country' => $newAccount->id_operator_country, + 'iban' => $result['accountNumber'] ?? null + ]); + LOG::info('Autre compte bancaire activé pour user: ' . $request->id_user . ' numero de compte: ' . $newAccount->account_number); + + return $this->successResponse(trans('messages.user_bank_account_activated_successfully'), 200); + } + + Log::error('Échec API Banque User: ' . $request->id_user . ' Response: ' . $response->getBody()); + return $this->errorResponse($result['message'] ?? trans('errors.bank_api_exception'), 500); + + } catch (\Exception $e) { + Log::error('Exception API Banque User: ' . $request->id_user . ' Error: ' . $e->getMessage()); + return $this->errorResponse(trans('errors.bank_api_exception'), 500); } + } - Log::error('Échec API Banque User: ' . $request->id_user . ' Res: ' . $response->getBody()); - return $this->errorResponse(trans('errors.bank_api_exception'), 500); - - } catch (\Exception $e) { - Log::error('Exception API Banque User: ' . $request->id_user . ' Error: ' . $e->getMessage()); - return $this->errorResponse(trans('errors.bank_api_exception'), 500); + // Sous-cas : Le compte existant est en PENDING -> Bloquer + // (On ne peut pas appeler l'API si on n'a pas encore de matricule client du 1er compte) + if (in_array($differentTypeAccount->status, ['pending', 'rejected', 'closed'])) { + $statusMessages = [ + 'actived' => trans('messages.user_already_has_bank_account_with_this_operator', ['user_lastname' => $user->lastname]), + 'pending' => trans('errors.you_already_have_request_in_progress_unvalidated'), + 'rejected' => trans('errors.your_previous_request_for_this_product_was_rejected'), + 'closed' => trans('errors.your_previous_request_for_this_product_was_closed'), + ]; + return $this->errorResponse($statusMessages[$differentTypeAccount->status] ?? 'Error', 500); } } - // 4. CAS STANDARD : Création d'une demande "Pending" + // 4. CAS STANDARD : Premier compte chez cet opérateur -> Création "Pending" $account_type = CustomerAccountType::find($request->account_type); if (!$account_type) return $this->errorResponse(trans('errors.account_type_not_found')); @@ -806,15 +813,11 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON try { $bankAccount->update(['reason' => trans('messages.request_bank_account_pending_validation_by_administrator')]); - - $bank_name = $network_bank->operators_country->operator->nom; - Mail::to($user->email)->send(new BankAccountCreatedMail($bankAccount, $bank_name, $user)); - return $this->successResponse(['message' => trans('messages.successful_bank_account_creation')]); } catch (\Exception $e) { $bankAccount->update(['status' => 'rejected', 'reason' => $e->getMessage()]); - Log::error('Erreur Mail/Creation: ' . $e->getMessage()); + Log::error('Erreur Creation Compte: ' . $e->getMessage()); return $this->errorResponse(trans('errors.bank_api_exception')); } } @@ -845,7 +848,7 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON $name_of_account_type = $account_type->name; $payload = [ - 'phoneNumber' => $bank_account->phone_number ?? ($user->phone ?? ''), + 'phoneNumber' => $bank_account->phone_number ?? $user->phone , 'email' => $user->email ?? '', 'fullname' => $bank_account->firstname . ' ' . $bank_account->lastname, 'branchCode' => env('BANK_API_BRANCH_CODE'), @@ -863,6 +866,7 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON 'identificationNumber' => $bank_account->identification_number, 'paySlip' => $request->doc_front, 'signatureCard' => $request->doc_back, + 'custRelCode' => '399' ]; try { @@ -905,10 +909,10 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON 'id_bank_country' => $bank_account->id_operator_country, 'iban' => $result['accountNumber'] ?? null ]); - LOG::info('Numero du compte bancaire du User : ' . $user->id . ' : ' . ($user->iban ?? 'N/A')); + LOG::info(' Compte activé avec succès ! Numero du compte bancaire du User : ' . $user->id . ' : ' . ($user->iban ?? 'N/A')); try { - Mail::to($user->email)->send(new BankAccountActivated($bank_account, $name_of_account_type)); + // Mail::to($user->email)->send(new BankAccountActivated($bank_account, $name_of_account_type)); } catch (\Exception $e) { Log::error("Mail error lors de l'activation: " . $e->getMessage()); } @@ -923,7 +927,7 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON $bank_account->update([ 'status' => 'rejected', - 'reason' => 'Erreur API externe : ' . $errorBody + 'reason' => 'Une Erreur est survenue lors de l\'activation de votre compte bancaire, veuillez réessayer plus tard ou contacter le support client.' ]); Log::error('Erreur Activation API pour ID ' . $bank_account->id . ' : ' . $errorBody); diff --git a/app/Models/UserBankAccount.php b/app/Models/UserBankAccount.php index 0895dff..3c4a65b 100755 --- a/app/Models/UserBankAccount.php +++ b/app/Models/UserBankAccount.php @@ -14,7 +14,7 @@ class UserBankAccount extends Model protected $fillable = [ 'id_user', - 'id_operator', + 'id_operator_country', 'account_number', 'iban', 'identification_number', diff --git a/resources/lang/en/errors.php b/resources/lang/en/errors.php index 92f819f..b03b693 100755 --- a/resources/lang/en/errors.php +++ b/resources/lang/en/errors.php @@ -103,5 +103,6 @@ Paying network : :network :country', 'you_already_have_request_in_progress_for_this_product ' => 'You already have a request in progress for this product', 'your_previous_request_for_this_product_was_rejected' => 'Your previous request for this product was rejected', 'your_previous_request_for_this_product_was_closed' => 'Your previous request for this product was closed', + 'you_already_have_request_in_progress_unvalidated' => 'You already have a request in progress that is not yet validated', ]; diff --git a/resources/lang/fr/errors.php b/resources/lang/fr/errors.php index aab4343..77adfde 100755 --- a/resources/lang/fr/errors.php +++ b/resources/lang/fr/errors.php @@ -103,4 +103,5 @@ Réseau payeur : :network :country', 'you_already_have_request_in_progress_for_this_product' => 'Vous avez déjà une demande en cours pour ce produit', 'your_previous_request_for_this_product_was_rejected' => 'Votre précédente demande pour ce produit a été rejetée', 'your_previous_request_for_this_product_was_closed' => 'Votre précédente demande pour ce produit a été clôturée', + 'you_already_have_request_in_progress_unvalidated' => 'Vous avez déjà une demande en cours qui n\'est pas encore validée', ];