From 0d4c6a4492a472e5f38650c98dc067a32a8356ad Mon Sep 17 00:00:00 2001 From: ncoronel Date: Fri, 3 Jul 2026 13:58:21 -0300 Subject: [PATCH] feat: implement BankAccount management with CRUD operations and routes for tenant selection --- .../Controllers/BankAccountController.php | 16 +++---- .../Models/BankAccount.php | 3 +- .../Requests/StoreBankAccountRequest.php | 47 +++++++++++++++++++ .../Requests/UpdateBankAccountRequest.php | 43 +++++++++++++++++ .../Resources/BankAccountResource.php | 4 +- app/Domains/BankAccount/routes/api.php | 13 +++++ .../Requests/StoreBankAccountRequest.php | 26 ---------- .../Requests/UpdateBankAccountRequest.php | 26 ---------- .../Tenant/Resources/TenantResource.php | 1 - app/Domains/Tenant/routes/api.php | 9 ---- database/seeders/TenantSeeder.php | 6 +-- routes/api.php | 1 + .../Tenant/BankAccountControllerTest.php | 2 +- 13 files changed, 120 insertions(+), 77 deletions(-) rename app/Domains/{Tenant => BankAccount}/Controllers/BankAccountController.php (81%) rename app/Domains/{Tenant => BankAccount}/Models/BankAccount.php (86%) create mode 100644 app/Domains/BankAccount/Requests/StoreBankAccountRequest.php create mode 100644 app/Domains/BankAccount/Requests/UpdateBankAccountRequest.php rename app/Domains/{Tenant => BankAccount}/Resources/BankAccountResource.php (84%) create mode 100644 app/Domains/BankAccount/routes/api.php delete mode 100644 app/Domains/Tenant/Requests/StoreBankAccountRequest.php delete mode 100644 app/Domains/Tenant/Requests/UpdateBankAccountRequest.php diff --git a/app/Domains/Tenant/Controllers/BankAccountController.php b/app/Domains/BankAccount/Controllers/BankAccountController.php similarity index 81% rename from app/Domains/Tenant/Controllers/BankAccountController.php rename to app/Domains/BankAccount/Controllers/BankAccountController.php index 30c67d4..2f2934a 100644 --- a/app/Domains/Tenant/Controllers/BankAccountController.php +++ b/app/Domains/BankAccount/Controllers/BankAccountController.php @@ -1,12 +1,12 @@ tenant_code !== $tenant->codigo, 400, 'Bank account does not belong to this tenant.'); + abort_if($bankAccount->tenant_code !== $tenant->codigo, 400, 'La cuenta bancaria no pertenece a este tenant.'); $tenant->selected_bank_account_id = $bankAccount->id; $tenant->save(); - return TenantResource::make($tenant->loadMissing(['headerLogo', 'footerLogo', 'selectedBankAccount'])); + return TenantResource::make($tenant->loadMissing(['headerLogo', 'footerLogo'])); } public function selected(Tenant $tenant): JsonResponse { $account = $tenant->selectedBankAccount; - abort_if(!$account, 404, 'No bank account is currently selected for this tenant.'); + abort_if(!$account, 404, 'No hay ninguna cuenta bancaria seleccionada para este tenant.'); return BankAccountResource::make($account)->response(); } diff --git a/app/Domains/Tenant/Models/BankAccount.php b/app/Domains/BankAccount/Models/BankAccount.php similarity index 86% rename from app/Domains/Tenant/Models/BankAccount.php rename to app/Domains/BankAccount/Models/BankAccount.php index e8d2be5..1b48baf 100644 --- a/app/Domains/Tenant/Models/BankAccount.php +++ b/app/Domains/BankAccount/Models/BankAccount.php @@ -1,7 +1,8 @@ + */ + public function rules(): array + { + return [ + 'titular' => ['required', 'string', 'max:255'], + 'entidad' => ['required', 'string', 'max:255'], + 'alias' => ['required', 'string', 'max:255'], + 'cvu' => ['required', 'string', 'max:255'], + ]; + } + + /** + * @return array + */ + public function messages(): array + { + return [ + 'titular.required' => 'El campo titular es obligatorio.', + 'titular.string' => 'El campo titular debe ser una cadena de texto.', + 'titular.max' => 'El campo titular no debe superar los 255 caracteres.', + 'entidad.required' => 'El campo entidad es obligatorio.', + 'entidad.string' => 'El campo entidad debe ser una cadena de texto.', + 'entidad.max' => 'El campo entidad no debe superar los 255 caracteres.', + 'alias.required' => 'El campo alias es obligatorio.', + 'alias.string' => 'El campo alias debe ser una cadena de texto.', + 'alias.max' => 'El campo alias no debe superar los 255 caracteres.', + 'cvu.required' => 'El campo cvu es obligatorio.', + 'cvu.string' => 'El campo cvu debe ser una cadena de texto.', + 'cvu.max' => 'El campo cvu no debe superar los 255 caracteres.', + ]; + } +} diff --git a/app/Domains/BankAccount/Requests/UpdateBankAccountRequest.php b/app/Domains/BankAccount/Requests/UpdateBankAccountRequest.php new file mode 100644 index 0000000..3c95772 --- /dev/null +++ b/app/Domains/BankAccount/Requests/UpdateBankAccountRequest.php @@ -0,0 +1,43 @@ + + */ + public function rules(): array + { + return [ + 'titular' => ['sometimes', 'string', 'max:255'], + 'entidad' => ['sometimes', 'string', 'max:255'], + 'alias' => ['sometimes', 'string', 'max:255'], + 'cvu' => ['sometimes', 'string', 'max:255'], + ]; + } + + /** + * @return array + */ + public function messages(): array + { + return [ + 'titular.string' => 'El campo titular debe ser una cadena de texto.', + 'titular.max' => 'El campo titular no debe superar los 255 caracteres.', + 'entidad.string' => 'El campo entidad debe ser una cadena de texto.', + 'entidad.max' => 'El campo entidad no debe superar los 255 caracteres.', + 'alias.string' => 'El campo alias debe ser una cadena de texto.', + 'alias.max' => 'El campo alias no debe superar los 255 caracteres.', + 'cvu.string' => 'El campo cvu debe ser una cadena de texto.', + 'cvu.max' => 'El campo cvu no debe superar los 255 caracteres.', + ]; + } +} diff --git a/app/Domains/Tenant/Resources/BankAccountResource.php b/app/Domains/BankAccount/Resources/BankAccountResource.php similarity index 84% rename from app/Domains/Tenant/Resources/BankAccountResource.php rename to app/Domains/BankAccount/Resources/BankAccountResource.php index 15ae7fa..98fb33d 100644 --- a/app/Domains/Tenant/Resources/BankAccountResource.php +++ b/app/Domains/BankAccount/Resources/BankAccountResource.php @@ -1,12 +1,12 @@ group(function (): void { + Route::middleware('auth:sanctum')->group(function (): void { + Route::get('bank-accounts/selected', [BankAccountController::class, 'selected']); + Route::post('bank-accounts/{bank_account}/select', [BankAccountController::class, 'select']); + Route::apiResource('bank-accounts', BankAccountController::class) + ->parameters(['bank-accounts' => 'bank_account']); + }); +}); diff --git a/app/Domains/Tenant/Requests/StoreBankAccountRequest.php b/app/Domains/Tenant/Requests/StoreBankAccountRequest.php deleted file mode 100644 index 8ed40fc..0000000 --- a/app/Domains/Tenant/Requests/StoreBankAccountRequest.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - public function rules(): array - { - return [ - 'titular' => ['required', 'string', 'max:255'], - 'entidad' => ['required', 'string', 'max:255'], - 'alias' => ['required', 'string', 'max:255'], - 'cvu' => ['required', 'string', 'max:255'], - ]; - } -} diff --git a/app/Domains/Tenant/Requests/UpdateBankAccountRequest.php b/app/Domains/Tenant/Requests/UpdateBankAccountRequest.php deleted file mode 100644 index ead00b8..0000000 --- a/app/Domains/Tenant/Requests/UpdateBankAccountRequest.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - public function rules(): array - { - return [ - 'titular' => ['sometimes', 'string', 'max:255'], - 'entidad' => ['sometimes', 'string', 'max:255'], - 'alias' => ['sometimes', 'string', 'max:255'], - 'cvu' => ['sometimes', 'string', 'max:255'], - ]; - } -} diff --git a/app/Domains/Tenant/Resources/TenantResource.php b/app/Domains/Tenant/Resources/TenantResource.php index 280bab9..908a9ef 100644 --- a/app/Domains/Tenant/Resources/TenantResource.php +++ b/app/Domains/Tenant/Resources/TenantResource.php @@ -29,7 +29,6 @@ class TenantResource extends JsonResource // 1 day 'header_logo' => $this->headerLogo?->getTemporaryUrl(1440), 'footer_logo' => $this->footerLogo?->getTemporaryUrl(1440 ), - 'selected_bank_account_id' => $this->selected_bank_account_id, ]; } } diff --git a/app/Domains/Tenant/routes/api.php b/app/Domains/Tenant/routes/api.php index 88e4d8c..69464a8 100644 --- a/app/Domains/Tenant/routes/api.php +++ b/app/Domains/Tenant/routes/api.php @@ -8,12 +8,3 @@ Route::get('tenants/bootstrap/{dominio}', BootstrapTenantController::class) ->where('dominio', '.*'); Route::apiResource('tenants', TenantController::class); - -Route::prefix('tenants/{tenant:codigo}')->group(function (): void { - Route::middleware('auth:sanctum')->group(function (): void { - Route::get('bank-accounts/selected', [\App\Domains\Tenant\Controllers\BankAccountController::class, 'selected']); - Route::post('bank-accounts/{bank_account}/select', [\App\Domains\Tenant\Controllers\BankAccountController::class, 'select']); - Route::apiResource('bank-accounts', \App\Domains\Tenant\Controllers\BankAccountController::class) - ->parameters(['bank-accounts' => 'bank_account']); - }); -}); diff --git a/database/seeders/TenantSeeder.php b/database/seeders/TenantSeeder.php index 2f86644..076bb8d 100644 --- a/database/seeders/TenantSeeder.php +++ b/database/seeders/TenantSeeder.php @@ -86,7 +86,7 @@ class TenantSeeder extends Seeder 'footer_logo' => $footerLogo, ]); - $bankAccount1 = \App\Domains\Tenant\Models\BankAccount::query()->create([ + $bankAccount1 = \App\Domains\BankAccount\Models\BankAccount::query()->create([ 'tenant_code' => $tenant->codigo, 'titular' => 'Sonder S.A. (Principal)', 'entidad' => 'Banco de la Nación Argentina', @@ -94,7 +94,7 @@ class TenantSeeder extends Seeder 'cvu' => '0110065420006540987654', ]); - \App\Domains\Tenant\Models\BankAccount::query()->create([ + \App\Domains\BankAccount\Models\BankAccount::query()->create([ 'tenant_code' => $tenant->codigo, 'titular' => 'Sonder S.A. (Secundaria)', 'entidad' => 'Banco de Galicia y Buenos Aires', @@ -102,7 +102,7 @@ class TenantSeeder extends Seeder 'cvu' => '0070012345678901234567', ]); - \App\Domains\Tenant\Models\BankAccount::query()->create([ + \App\Domains\BankAccount\Models\BankAccount::query()->create([ 'tenant_code' => $tenant->codigo, 'titular' => 'Sonder S.A. (Mercado Pago)', 'entidad' => 'Mercado Pago', diff --git a/routes/api.php b/routes/api.php index d97732e..9f9ed3b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -9,3 +9,4 @@ require __DIR__.'/../app/Domains/Cart/routes/api.php'; require __DIR__.'/../app/Domains/StorageTest/routes/api.php'; require __DIR__.'/../app/Domains/Purchase/routes/api.php'; require __DIR__.'/../app/Domains/Tenant/routes/api.php'; +require __DIR__.'/../app/Domains/BankAccount/routes/api.php'; diff --git a/tests/Feature/Tenant/BankAccountControllerTest.php b/tests/Feature/Tenant/BankAccountControllerTest.php index ea5a9d7..422c4a7 100644 --- a/tests/Feature/Tenant/BankAccountControllerTest.php +++ b/tests/Feature/Tenant/BankAccountControllerTest.php @@ -2,7 +2,7 @@ namespace Tests\Feature\Tenant; -use App\Domains\Tenant\Models\BankAccount; +use App\Domains\BankAccount\Models\BankAccount; use App\Domains\Tenant\Models\Tenant; use App\Domains\Auth\Models\User; use Illuminate\Foundation\Testing\RefreshDatabase;