finish with create bank account and create another bank account functionality
This commit is contained in:
parent
aa18ffceeb
commit
e5f5998d97
|
|
@ -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));
|
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 = [
|
$commonAccountData = [
|
||||||
'id_user' => $request->id_user,
|
'id_user' => (int)$request->id_user,
|
||||||
'id_operator_country' => $request->id_operator,
|
'customer_account_type_id' => (int)$request->account_type,
|
||||||
'customer_account_type_id' => $request->account_type,
|
'id_operator_country' => (int)$request->id_operator,
|
||||||
'firstname' => $request->firstname,
|
'firstname' => $request->firstname,
|
||||||
'lastname' => $request->lastname,
|
'lastname' => $request->lastname,
|
||||||
'nationality' => $request->nationality,
|
'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,
|
'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('id_operator_country', $request->id_operator)
|
||||||
->where('customer_account_type_id', $request->account_type)
|
->get();
|
||||||
->whereIn('status', ['pending', 'actived', 'rejected', 'closed'])
|
|
||||||
->first();
|
// 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) {
|
if ($sameTypeAccount) {
|
||||||
$statusMessages = [
|
$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);
|
return $this->errorResponse($statusMessages[$sameTypeAccount->status] ?? 'Error', 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. CAS B : Autre produit chez le même opérateur (Ouverture via API)
|
// 3. CAS B : Un AUTRE type de compte existe chez le même opérateur
|
||||||
$differentTypeAccount = UserBankAccount::where('id_user', $request->id_user)
|
$differentTypeAccount = $userAccountsAtThisBank->where('customer_account_type_id', '!=', $request->account_type)
|
||||||
->where('id_operator_country', $request->id_operator)
|
->whereIn('status', ['actived', 'pending', 'rejected', 'closed'])
|
||||||
->where('customer_account_type_id', '!=', $request->account_type)
|
|
||||||
->whereNotNull('account_number')
|
|
||||||
->whereIn('status', ['pending', 'actived', 'rejected', 'closed'])
|
|
||||||
->first();
|
->first();
|
||||||
|
|
||||||
if ($differentTypeAccount) {
|
if ($differentTypeAccount) {
|
||||||
$user = User::find($request->id_user);
|
// Sous-cas : Le compte existant est ACTIF -> On peut appeler l'API
|
||||||
if (!$user) return $this->errorResponse(trans('errors.user_not_found'));
|
if ($differentTypeAccount->status == 'actived' && !empty($differentTypeAccount->customer_number)) {
|
||||||
$customer_account_type = CustomerAccountType::find($request->account_type);
|
|
||||||
if (!$customer_account_type) return $this->errorResponse(trans('errors.account_type_not_found'));
|
|
||||||
|
|
||||||
try {
|
$customer_account_type = CustomerAccountType::find($request->account_type);
|
||||||
$client = new Client(['connect_timeout' => 60]);
|
if (!$customer_account_type) return $this->errorResponse(trans('errors.account_type_not_found'));
|
||||||
$baseUrl = env('BANK_API_BASE_URL');
|
|
||||||
|
|
||||||
// Auth API
|
try {
|
||||||
$authResponse = $client->post($baseUrl . '/auth/authenticate', [
|
$client = new Client(['connect_timeout' => 60]);
|
||||||
'json' => ['login' => env('BANK_API_LOGIN'), 'password' => env('BANK_API_PASSWORD')]
|
$baseUrl = env('BANK_API_BASE_URL');
|
||||||
]);
|
|
||||||
$authResult = json_decode($authResponse->getBody(), true);
|
|
||||||
$token = $authResult['data']['token'] ?? null;
|
|
||||||
|
|
||||||
if (!$token) {
|
// Authentification
|
||||||
Log::error('Token introuvable pour user: ' . $request->id_user);
|
$authResponse = $client->post($baseUrl . '/auth/authenticate', [
|
||||||
return $this->errorResponse(trans('errors.token_not_found'), 404);
|
'json' => ['login' => env('BANK_API_LOGIN'), 'password' => env('BANK_API_PASSWORD')]
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
]);
|
]);
|
||||||
|
$token = json_decode($authResponse->getBody(), true)['data']['token'] ?? null;
|
||||||
|
|
||||||
try {
|
if (!$token) {
|
||||||
Mail::to($user->email)->send(new BankAccountActivated($newAccount, $customer_account_type->name));
|
Log::error('Token introuvable pour user: ' . $request->id_user);
|
||||||
} catch (\Exception $e) {
|
return $this->errorResponse(trans('errors.token_not_found'), 404);
|
||||||
Log::error("Mail error: " . $e->getMessage());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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());
|
// Sous-cas : Le compte existant est en PENDING -> Bloquer
|
||||||
return $this->errorResponse(trans('errors.bank_api_exception'), 500);
|
// (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'])) {
|
||||||
} catch (\Exception $e) {
|
$statusMessages = [
|
||||||
Log::error('Exception API Banque User: ' . $request->id_user . ' Error: ' . $e->getMessage());
|
'actived' => trans('messages.user_already_has_bank_account_with_this_operator', ['user_lastname' => $user->lastname]),
|
||||||
return $this->errorResponse(trans('errors.bank_api_exception'), 500);
|
'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);
|
$account_type = CustomerAccountType::find($request->account_type);
|
||||||
if (!$account_type) return $this->errorResponse(trans('errors.account_type_not_found'));
|
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 {
|
try {
|
||||||
$bankAccount->update(['reason' => trans('messages.request_bank_account_pending_validation_by_administrator')]);
|
$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')]);
|
return $this->successResponse(['message' => trans('messages.successful_bank_account_creation')]);
|
||||||
|
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$bankAccount->update(['status' => 'rejected', 'reason' => $e->getMessage()]);
|
$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'));
|
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;
|
$name_of_account_type = $account_type->name;
|
||||||
|
|
||||||
$payload = [
|
$payload = [
|
||||||
'phoneNumber' => $bank_account->phone_number ?? ($user->phone ?? ''),
|
'phoneNumber' => $bank_account->phone_number ?? $user->phone ,
|
||||||
'email' => $user->email ?? '',
|
'email' => $user->email ?? '',
|
||||||
'fullname' => $bank_account->firstname . ' ' . $bank_account->lastname,
|
'fullname' => $bank_account->firstname . ' ' . $bank_account->lastname,
|
||||||
'branchCode' => env('BANK_API_BRANCH_CODE'),
|
'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,
|
'identificationNumber' => $bank_account->identification_number,
|
||||||
'paySlip' => $request->doc_front,
|
'paySlip' => $request->doc_front,
|
||||||
'signatureCard' => $request->doc_back,
|
'signatureCard' => $request->doc_back,
|
||||||
|
'custRelCode' => '399'
|
||||||
];
|
];
|
||||||
|
|
||||||
try {
|
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,
|
'id_bank_country' => $bank_account->id_operator_country,
|
||||||
'iban' => $result['accountNumber'] ?? null
|
'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 {
|
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) {
|
} catch (\Exception $e) {
|
||||||
Log::error("Mail error lors de l'activation: " . $e->getMessage());
|
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([
|
$bank_account->update([
|
||||||
'status' => 'rejected',
|
'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);
|
Log::error('Erreur Activation API pour ID ' . $bank_account->id . ' : ' . $errorBody);
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ class UserBankAccount extends Model
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'id_user',
|
'id_user',
|
||||||
'id_operator',
|
'id_operator_country',
|
||||||
'account_number',
|
'account_number',
|
||||||
'iban',
|
'iban',
|
||||||
'identification_number',
|
'identification_number',
|
||||||
|
|
|
||||||
|
|
@ -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',
|
'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_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',
|
'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',
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -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',
|
'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_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',
|
'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',
|
||||||
];
|
];
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue