finish with create bank account and create another bank account functionality

This commit is contained in:
root 2026-02-19 17:27:18 +01:00
parent aa18ffceeb
commit e5f5998d97
4 changed files with 80 additions and 74 deletions

View File

@ -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);

View File

@ -14,7 +14,7 @@ class UserBankAccount extends Model
protected $fillable = [
'id_user',
'id_operator',
'id_operator_country',
'account_number',
'iban',
'identification_number',

View File

@ -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',
];

View File

@ -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',
];