From 6ec8bbe51b051316334b65ab30e554095d85040b Mon Sep 17 00:00:00 2001 From: root Date: Tue, 3 Feb 2026 17:28:09 +0100 Subject: [PATCH] finish whith link bank account fonctionality --- app/Http/Controllers/WalletController.php | 89 +++++++++++-------- app/Mail/BankAccountActivated.php | 2 +- app/Mail/BankAccountCreatedMail.php | 2 +- app/Mail/BankAccountLinked.php | 42 +++++++++ resources/lang/en/emails.php | 42 +++++++++ resources/lang/en/messages.php | 2 +- resources/lang/fr/emails.php | 41 +++++++++ resources/lang/fr/messages.php | 2 +- .../emails/bank_account_activated.blade.php | 62 ++++++++++--- .../emails/bank_account_created.blade.php | 56 ++++++++++-- .../emails/bank_account_linked.blade.php | 49 ++++++++++ routes/web.php | 13 +-- 12 files changed, 336 insertions(+), 66 deletions(-) mode change 100644 => 100755 app/Mail/BankAccountActivated.php create mode 100644 app/Mail/BankAccountLinked.php create mode 100644 resources/lang/en/emails.php create mode 100644 resources/lang/fr/emails.php mode change 100644 => 100755 resources/views/emails/bank_account_activated.blade.php create mode 100644 resources/views/emails/bank_account_linked.blade.php diff --git a/app/Http/Controllers/WalletController.php b/app/Http/Controllers/WalletController.php index f710612..267a633 100755 --- a/app/Http/Controllers/WalletController.php +++ b/app/Http/Controllers/WalletController.php @@ -555,16 +555,16 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON return $this->errorResponse(trans('errors.not_banking_operator')); //Verifier le code IBAN - $country_code = $network_bank->network->country->code_country; - $bank_code = $network_bank->operators_country->code; - switch ($this->checkIBAN($request->iban, $country_code, $bank_code)) { - case 0: - return $this->errorResponse(trans('errors.invalid_iban')); - case 1: - return $this->errorResponse(trans('errors.country_not_match_iban')); - case 2: - return $this->errorResponse(trans('errors.bank_not_match_iban')); - } + // $country_code = $network_bank->network->country->code_country; + // $bank_code = $network_bank->operators_country->code; + // switch ($this->checkIBAN($request->iban, $country_code, $bank_code)) { + // case 0: + // return $this->errorResponse(trans('errors.invalid_iban')); + // case 1: + // return $this->errorResponse(trans('errors.country_not_match_iban')); + // case 2: + // return $this->errorResponse(trans('errors.bank_not_match_iban')); + // } $user_banking_account_verif = new UsersBankingAccountVerification(); $user_banking_account_verif->id_transaction = $this->getTransactionID(); @@ -575,12 +575,12 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON $user_banking_account_verif->id_network = $request->id_wallet_network; $user_banking_account_verif->save(); - // Envoyer une requete vers la banque contant ses informations personnelles pour verfication du code iban - Log::info('-------------------------- User - Rattacher le compte bancaire au wallet --------------------------'); - Log::info(json_encode( - array_merge($request->toArray(), $identification->toArray(), ['id_transaction' => $user_banking_account_verif->id_transaction]) - )); - Log::info('------------------------------------------------------------------------------------------------'); + // // Envoyer une requete vers la banque contant ses informations personnelles pour verfication du code iban + // Log::info('-------------------------- User - Rattacher le compte bancaire au wallet --------------------------'); + // Log::info(json_encode( + // array_merge($request->toArray(), $identification->toArray(), ['id_transaction' => $user_banking_account_verif->id_transaction]) + // )); + // Log::info('------------------------------------------------------------------------------------------------'); return $this->successResponse(trans('messages.successful_bank_account_attachment_taken')); } @@ -693,22 +693,22 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON return $this->errorResponse(trans('errors.not_banking_operator')); } - $exist_user_request_create_account = UserBankAccount::where('id_user', $request->id_user) - ->where('id_operator_country', $request->id_operator) - ->first(); + $existingAccount = 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(); - if ($exist_user_request_create_account){ - if ($exist_user_request_create_account->status == 'pending' && $exist_user_request_create_account->customer_account_type_id == $request->account_type) { - return $this->errorResponse(trans('errors.request_create_account_already_sended')); + if ($existingAccount) { + + if ($existingAccount->status == 'actived') { + return $this->errorResponse(trans('messages.user_already_has_bank_account_with_this_operator',['user_lastname' => $user->lastname]),500); + }else{ + return $this->errorResponse(trans('errors.request_create_account_already_sended'), 500); } + } - - if(isset($exist_user_request_create_account)){ - if ($exist_user_request_create_account->status == 'active') { - return $this->errorResponse(trans('messages.user_already_has_bank_account_with_this_operator', ['user_lastname' => $user->lastname])); - } - } $bank_name = $network_bank->operators_country->operator->nom; $account_type = CustomerAccountType::where('id', $request->account_type)->first(); @@ -870,14 +870,19 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON public function validateLinkUserBankAccount(Request $request) { $this->validate($request, [ - 'iban' => 'nullable|string', - 'code_client' => 'required', + 'iban' => 'required', 'id_transaction' => 'required' ]); $user_bank_account_verfication = UsersBankingAccountVerification::where('id_transaction', $request->id_transaction)->first(); if (!$user_bank_account_verfication) { - return $this->errorResponse('errors.transaction_not_found', 404); + return $this->errorResponse(trans('errors.transaction_not_found'), 404); + } + + $user = User::where('user_code', $user_bank_account_verfication->user_code)->firstOrFail();($user_bank_account_verfication->user_code); + + if (!$user) { + return $this->errorResponse(trans('errors.user_not_found'), 404); } $baseUrl = env('BANK_LINK_API_BASE_URL', 'http://192.168.1.173:2087/api/v1'); @@ -885,7 +890,7 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON $password = env('BANK_LINK_API_PASSWORD', 'admin'); $authApi = $baseUrl . '/auth/authenticate'; - $accountApi = $baseUrl . '/account/getOne/' . $request->code_client; + $accountApi = $baseUrl . '/account/getOne/' . $request->iban; try { $client = new Client(); @@ -899,11 +904,12 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON ]); $authResult = json_decode($authResponse->getBody(), true); - $token = $authResult['token'] ?? null; + + $token = $authResult['data']['token'] ?? null; if (!$token) { Log::error('Token introuvable dans la réponse auth pour transaction: ' . $request->id_transaction); - return $this->errorResponse(trans('errors.token_not_found')); + return $this->errorResponse(trans('errors.token_not_found'), 404); } $response = $client->get($accountApi, [ @@ -916,15 +922,20 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON $result = json_decode($response->getBody(), true); - if ($response->getStatusCode() == 200 || $response->getStatusCode() == 201) { + if (($response->getStatusCode() == 200 || $response->getStatusCode() <= 301) && ($result['data']['accountID'] == $user_bank_account_verfication->iban)) { + $user_bank_account_verfication->update([ 'is_verified' => 1, - 'was_traited' => 1 + 'was_treated' => 1 ]); Log::info('Compte bancaire rattaché avec succès pour transaction: ' . $request->id_transaction); - - return $this->successResponse(trans('messages.create_bank_account_linked_successfully'), $result); + try { + // Mail::to($user->email)->send(new BankAccountLinked($user_bank_account_verfication)); + } catch (\Exception $e) { + Log::error("Mail error: " . $e->getMessage()); + } + return $this->successResponse(trans('messages.create_bank_account_linked_successfully'), 200); } } catch (RequestException $e) { @@ -940,7 +951,7 @@ INNER JOIN countries c ON oc.id_country = c.id INNER JOIN type_operators top ON return $this->errorResponse(trans('errors.Error_occurred')); } catch (\Exception $e) { Log::error('Erreur inattendue Bank Link : ' . $e->getMessage()); - return $this->errorResponse('Internal Server Error'); + return $this->errorResponse(trans('errors.Error_occurred')); } } } diff --git a/app/Mail/BankAccountActivated.php b/app/Mail/BankAccountActivated.php old mode 100644 new mode 100755 index 35826a9..3cf49d5 --- a/app/Mail/BankAccountActivated.php +++ b/app/Mail/BankAccountActivated.php @@ -22,7 +22,7 @@ class BankAccountActivated extends Mailable public function build() { - return $this->subject('Votre compte bancaire a été activé') + return $this->subject(trans('emails.account_activated_subject')) ->view('emails.bank_account_activated'); } } diff --git a/app/Mail/BankAccountCreatedMail.php b/app/Mail/BankAccountCreatedMail.php index 066e403..23f3ee5 100755 --- a/app/Mail/BankAccountCreatedMail.php +++ b/app/Mail/BankAccountCreatedMail.php @@ -34,7 +34,7 @@ class BankAccountCreatedMail extends Mailable */ public function build() { - return $this->subject('Création de compte bancaire en attente de validation') + return $this->subject(trans('emails.account_created_subject')) ->view('emails.bank_account_created') ->with(['bankAccount' => $this->bankAccount, 'bank_name' => $this->bank_name, 'user' => $this->user]); } diff --git a/app/Mail/BankAccountLinked.php b/app/Mail/BankAccountLinked.php new file mode 100644 index 0000000..aa719e0 --- /dev/null +++ b/app/Mail/BankAccountLinked.php @@ -0,0 +1,42 @@ +verification = $verification; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->subject(trans('emails.bank_linked_subject')) + ->view('emails.bank_account_linked'); + } +} diff --git a/resources/lang/en/emails.php b/resources/lang/en/emails.php new file mode 100644 index 0000000..4e9d219 --- /dev/null +++ b/resources/lang/en/emails.php @@ -0,0 +1,42 @@ + 'Bank Account Linking Confirmation', + 'bank_linked_title' => 'Bank Linking Confirmed', + 'greeting' => 'Hello,', + 'bank_linked_body' => 'We are pleased to inform you that your bank account linking request has been successfully validated.', + 'bank_linked_details' => 'Here are your linking details:', + 'label_user_code' => 'Your Wallet Code (User Code)', + 'label_iban' => 'Account Number / IBAN', + 'bank_linked_footer' => 'You can now perform transactions between your bank account and your digital wallet.', + 'automated_msg' => 'This email is generated automatically, please do not reply.', + + + // ACCOUNT ACTIVATION + 'account_activated_subject' => 'Your bank account has been activated', + 'account_activated_title' => 'Account Activation Successful', + 'congratulations' => 'Congratulations', + 'account_activated_body' => 'Your account opening request has been accepted and validated by our services.', + 'account_activated_footer' => 'You can start using our banking services right now.', + + // ACCOUNT CREATION (PENDING) + 'account_created_subject' => 'Bank account creation pending validation', + 'account_created_title' => 'Opening Request Received', + 'account_created_body' => 'Your bank account creation request has been successfully recorded.', + 'account_created_footer' => 'We will notify you as soon as the account is validated by our agents.', + + // COMMON LABELS + 'label_account_number' => 'Account Number', + 'label_customer_code' => 'Customer Code', + 'label_account_type' => 'Account Type', + 'label_bank_name' => 'Bank', + 'label_status' => 'Status', + 'status_active' => 'Active', + + // SIGNATURE & FOOTER + 'regards' => 'Regards,', + 'team_signature' => 'The Team', + 'company_name' => 'SunEx by Ilink World Corporation', + 'automated_msg' => 'This email is generated automatically, please do not reply.', + 'all_rights' => 'All rights reserved.', +]; diff --git a/resources/lang/en/messages.php b/resources/lang/en/messages.php index c12f504..8dc1915 100755 --- a/resources/lang/en/messages.php +++ b/resources/lang/en/messages.php @@ -322,7 +322,7 @@ Transaction Information: - Recipient's names : :receiver_name - IBAN of the recipient : :iban - Bank : :bank :country", - 'successful_bank_account_attachment_taken' => 'Your request to link your bank account has been taken into account, you will receive a confirmation email as soon as the bank has validated your IBAN code', + 'successful_bank_account_attachment_taken' => 'Your request to link your bank account has been taken into account, you will receive a confirmation email as soon as the bank has validated your account number.', 'successful_user_remove_from_cart_to_other_wallet' => "Withdraw money from your card to another account Transaction information : - Number: :id_transaction diff --git a/resources/lang/fr/emails.php b/resources/lang/fr/emails.php new file mode 100644 index 0000000..b71c1b0 --- /dev/null +++ b/resources/lang/fr/emails.php @@ -0,0 +1,41 @@ + 'Confirmation de rattachement de compte bancaire', + 'bank_linked_title' => 'Rattachement Bancaire Confirmé', + 'greeting' => 'Bonjour,', + 'bank_linked_body' => 'Nous avons le plaisir de vous informer que votre demande de rattachement de compte bancaire a été validée avec succès.', + 'bank_linked_details' => 'Voici les détails de votre liaison :', + 'label_user_code' => 'Votre Code Wallet (User Code)', + 'label_iban' => 'Numéro de Compte / IBAN', + 'bank_linked_footer' => 'Vous pouvez dès à présent effectuer des opérations entre votre compte bancaire et votre portefeuille numérique.', + 'automated_msg' => 'Cet email est généré automatiquement, merci de ne pas y répondre.', + + // ACTIVATION COMPTE + 'account_activated_subject' => 'Votre compte bancaire a été activé', + 'account_activated_title' => 'Activation de Compte Réussie', + 'congratulations' => 'Félicitations', + 'account_activated_body' => 'Votre demande d\'ouverture de compte a été acceptée et validée par nos services.', + 'account_activated_footer' => 'Vous pouvez utiliser nos services bancaires dès maintenant.', + + // CRÉATION COMPTE (PENDING) + 'account_created_subject' => 'Création de compte bancaire en attente de validation', + 'account_created_title' => 'Demande d\'Ouverture Reçue', + 'account_created_body' => 'Votre demande de création de compte bancaire a été enregistrée avec succès.', + 'account_created_footer' => 'Nous vous informerons dès que le compte sera validé par nos agents.', + + // LABELS COMMUNS + 'label_account_number' => 'Numéro de compte', + 'label_customer_code' => 'Code client', + 'label_account_type' => 'Type de compte', + 'label_bank_name' => 'Banque', + 'label_status' => 'Statut', + 'status_active' => 'Activé', + + // SIGNATURE & FOOTER + 'regards' => 'Cordialement,', + 'team_signature' => 'L\'équipe', + 'company_name' => 'SunEx by Ilink World Corporation', + 'automated_msg' => 'Cet email est généré automatiquement, merci de ne pas y répondre.', + 'all_rights' => 'Tous droits réservés.', +]; diff --git a/resources/lang/fr/messages.php b/resources/lang/fr/messages.php index a5df1ac..8ff76c7 100755 --- a/resources/lang/fr/messages.php +++ b/resources/lang/fr/messages.php @@ -323,7 +323,7 @@ Informations de la transaction : - Noms du destinataire : :receiver_name - IBAN du destinataire : :iban - Banque : :bank :country", - 'successful_bank_account_attachment_taken' => 'Votre requête de rattachement de votre compte bancaire a été prise en compte, vous recevrez un mail de confirmation dès lors que la banque aura validé votre code IBAN.', + 'successful_bank_account_attachment_taken' => 'Votre requête de rattachement de votre compte bancaire a été prise en compte, vous recevrez un mail de confirmation dès lors que la banque aura validé votre numéro de compte.', 'successful_user_remove_from_cart_to_other_wallet' => "Retrait d'argent de votre carte vers un autre compte Informations de la transaction : - Numéro : :id_transaction diff --git a/resources/views/emails/bank_account_activated.blade.php b/resources/views/emails/bank_account_activated.blade.php old mode 100644 new mode 100755 index d34d69f..d7bf539 --- a/resources/views/emails/bank_account_activated.blade.php +++ b/resources/views/emails/bank_account_activated.blade.php @@ -1,21 +1,61 @@ - Activation de compte + {{ __('emails.account_activated_title') }} + -

Félicitations {{ $bankAccount->user->firstname }} !

-

Votre demande d'ouverture de compte a été acceptée et activée.

+
+
+

{{ __('emails.account_activated_title') }}

+
- +
+ +

{{ __('emails.congratulations') }} {{ $bankAccount->user->firstname }} !

-

Vous pouvez désormais utiliser nos services bancaires dès maintenant.

+

{{ __('emails.account_activated_body') }}

-

Cordialement,
L'équipe SunEx.

+
+

+ {{ __('emails.label_account_number') }} : + {{ $bankAccount->account_number }} +

+

+ {{ __('emails.label_customer_code') }} : + {{ $bankAccount->customer_number }} +

+

+ {{ __('emails.label_account_type') }} : + {{ $bankName }} +

+

+ {{ __('emails.label_status') }} : + {{ __('emails.status_active') }} +

+
+ +

{{ __('emails.account_activated_footer') }}

+ +

+ {{ __('emails.regards') }}
+ {{ __('emails.team_signature') }} {{ __('emails.company_name') }}. +

+
+ + +
diff --git a/resources/views/emails/bank_account_created.blade.php b/resources/views/emails/bank_account_created.blade.php index 1c26696..2dcd52a 100755 --- a/resources/views/emails/bank_account_created.blade.php +++ b/resources/views/emails/bank_account_created.blade.php @@ -1,11 +1,53 @@ - + + + {{ __('emails.account_created_title') }} + + -

Bonjour {{ $user->lastname ?? '' }},

-

Votre demande de création de compte bancaire a été enregistrée avec succès.

-

Banque : {{ $bank_name }}

-

Statut : {{ ucfirst($bankAccount->status) }}

-

Nous vous informerons dès que le compte sera validé.

-

Merci,
L’équipe SunEx by iLink World

+
+
+

{{ __('emails.account_created_title') }}

+
+ +
+ +

{{ __('emails.greeting') }} {{ $user->lastname ?? '' }},

+ +

{{ __('emails.account_created_body') }}

+ +
+

+ {{ __('emails.label_bank_name') }} : + {{ $bank_name }} +

+

+ {{ __('emails.label_status') }} : + {{ ucfirst($bankAccount->status) }} +

+
+ +

{{ __('emails.account_created_footer') }}

+ +

+ {{ __('emails.regards') }}
+ {{ __('emails.team_signature') }} {{ __('emails.company_name') }}. +

+
+ + +
diff --git a/resources/views/emails/bank_account_linked.blade.php b/resources/views/emails/bank_account_linked.blade.php new file mode 100644 index 0000000..c7eaddb --- /dev/null +++ b/resources/views/emails/bank_account_linked.blade.php @@ -0,0 +1,49 @@ + + + + {{ __('emails.bank_linked_title') }} + + + +
+
+

{{ __('emails.bank_linked_title') }}

+
+ +
+

{{ __('emails.greeting') }}

+ +

{{ __('emails.bank_linked_body') }}

+ +

{{ __('emails.bank_linked_details') }}

+ +
+ +

+ {{ __('emails.label_user_code') }} : + {{ $verification->user_code }} +

+

+ {{ __('emails.label_iban') }} : + {{ $verification->iban }} +

+
+ +

{{ __('emails.bank_linked_footer') }}

+
+ + +
+ + diff --git a/routes/web.php b/routes/web.php index a0d71e9..496c3fa 100755 --- a/routes/web.php +++ b/routes/web.php @@ -67,16 +67,19 @@ $router->group(['prefix' => '', 'middleware' => 'auth'], function () use ($route // Wallets users iLink $router->group(['prefix' => '/users'], function () use ($router) { - $router->get('{id_user}', 'WalletController@showWalletUser'); - //Liste des operateurs - $router->get('operators/{type}/{id_wallet_network}', 'WalletController@getWalletOperators'); - $router->get('banks_for_link/{id_wallet_network}', 'WalletController@getBanksInNetworkForLink'); - $router->post('link_bank_account', 'WalletController@linkBankAccount'); + //Creation d'un compte bancaire (Agency Banking) $router->post('create_user_bank_account', 'WalletController@createUserBankAccount'); $router->post('activate_user_bank_account', 'WalletController@activateUserBankAccount'); $router->get('customer_account_type', 'WalletController@getCustomerAccountTypes'); $router->post('validate_link_user_bank_account', 'WalletController@validateLinkUserBankAccount'); + + $router->get('{id_user}', 'WalletController@showWalletUser'); + + //Liste des operateurs + $router->get('operators/{type}/{id_wallet_network}', 'WalletController@getWalletOperators'); + $router->get('banks_for_link/{id_wallet_network}', 'WalletController@getBanksInNetworkForLink'); + $router->post('link_bank_account', 'WalletController@linkBankAccount'); }); });