Browse Source

feat: add banks para reter informacao de codigos de bancos

Gustavo Mantovani 2 weeks ago
parent
commit
af9616b51f

+ 45 - 0
app/Http/Controllers/BankController.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Requests\BankRequest;
+use App\Http\Resources\BankResource;
+use App\Services\BankService;
+use Illuminate\Http\JsonResponse;
+
+class BankController extends Controller
+{
+    public function __construct(
+        protected BankService $service,
+    ) {}
+
+    public function index(): JsonResponse
+    {
+        $items = $this->service->getAll();
+        return $this->successResponse(payload: BankResource::collection($items));
+    }
+
+    public function store(BankRequest $request): JsonResponse
+    {
+        $item = $this->service->create($request->validated());
+        return $this->successResponse(payload: new BankResource($item), message: __('messages.created'), code: 201);
+    }
+
+    public function show(int $id): JsonResponse
+    {
+        $item = $this->service->findById($id);
+        return $this->successResponse(payload: new BankResource($item));
+    }
+
+    public function update(BankRequest $request, int $id): JsonResponse
+    {
+        $item = $this->service->update($id, $request->validated());
+        return $this->successResponse(payload: new BankResource($item), message: __('messages.updated'));
+    }
+
+    public function destroy(int $id): JsonResponse
+    {
+        $this->service->delete($id);
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+}

+ 39 - 0
app/Http/Requests/BankRequest.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Validation\Rule;
+
+class BankRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        $uniqueCode = Rule::unique('banks', 'code')
+            ->ignore($this->route('id'))
+            ->whereNull('deleted_at');
+
+        $rules = [
+            'name'   => ['sometimes', 'string', 'max:255'],
+            'code'   => ['sometimes', 'string', 'max:10', $uniqueCode],
+            'active' => ['sometimes', 'boolean'],
+        ];
+
+        if ($this->isMethod('POST')) {
+            $rules['name'] = ['required', 'string', 'max:255'];
+            $rules['code'] = ['required', 'string', 'max:10', $uniqueCode];
+        }
+
+        return $rules;
+    }
+
+    /**
+    * Add custom messages when needed
+    * public function messages(): array
+    * {
+    *   return [
+    *        'field.required' => __('message.algo'),
+    *    ];
+    * }
+    */
+}

+ 37 - 0
app/Http/Resources/BankResource.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Models\Bank;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
+
+class BankResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id'         => $this->id,
+            'name'       => $this->name,
+            'code'       => $this->code,
+            'active'     => $this->active,
+            'created_at' => $this->created_at?->format('d/m/Y H:i'),
+            'updated_at' => $this->updated_at?->format('d/m/Y H:i'),
+        ];
+    }
+
+    /**
+     * @param \Illuminate\Database\Eloquent\Collection<Bank> $resource
+     * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection<BankResource>
+     */
+    public static function collection($resource): AnonymousResourceCollection
+    {
+        return parent::collection($resource);
+    }
+}

+ 52 - 0
app/Models/Bank.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+/**
+ * @property int $id
+ * @property string $name
+ * @property string $code
+ * @property bool $active
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @property \Illuminate\Support\Carbon|null $deleted_at
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank onlyTrashed()
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank query()
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank whereActive($value)
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank whereCode($value)
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank whereDeletedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank whereName($value)
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank whereUpdatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank withTrashed(bool $withTrashed = true)
+ * @method static \Illuminate\Database\Eloquent\Builder<static>|Bank withoutTrashed()
+ * @mixin \Eloquent
+ */
+class Bank extends Model
+{
+    use HasFactory, SoftDeletes;
+
+    protected $table = 'banks';
+
+    protected $guarded = ['id'];
+
+    protected $fillable = [
+        'name',
+        'code',
+        'active',
+    ];
+
+    protected $casts = [
+        'created_at' => 'datetime',
+        'updated_at' => 'datetime',
+        'deleted_at' => 'datetime',
+        'active'     => 'boolean',
+    ];
+}

+ 2 - 2
app/Models/Payment.php

@@ -8,7 +8,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
 
 /**
  * @property int $id
- * @property int|null $schedule_id
+ * @property int $schedule_id
  * @property int $client_id
  * @property int|null $provider_id
  * @property int|null $client_payment_method_id
@@ -42,7 +42,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
  * @property-read \App\Models\Client $client
  * @property-read \App\Models\ClientPaymentMethod|null $clientPaymentMethod
  * @property-read \App\Models\Provider|null $provider
- * @property-read \App\Models\Schedule|null $schedule
+ * @property-read \App\Models\Schedule $schedule
  * @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\PaymentSplit> $splits
  * @property-read int|null $splits_count
  * @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Webhook> $webhooks

+ 52 - 0
app/Services/BankService.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\Bank;
+use Illuminate\Database\Eloquent\Collection;
+
+class BankService
+{
+    public function getAll(): Collection
+    {
+        return Bank::query()
+            ->orderBy('name')
+            ->get();
+    }
+
+    public function findById(int $id): ?Bank
+    {
+        return Bank::find($id);
+    }
+
+    public function create(array $data): Bank
+    {
+        return Bank::create($data);
+    }
+
+    public function update(int $id, array $data): ?Bank
+    {
+        $model = $this->findById($id);
+
+        if (!$model) {
+            return null;
+        }
+
+        $model->update($data);
+
+        return $model->fresh();
+    }
+
+    public function delete(int $id): bool
+    {
+        $model = $this->findById($id);
+
+        if (!$model) {
+            return false;
+        }
+
+        return $model->delete();
+    }
+
+    // Add custom business logic methods here
+}

+ 28 - 0
database/migrations/2026_07_15_115200_create_banks_table.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    public function up(): void
+    {
+        Schema::create('banks', function (Blueprint $table) {
+            $table->id();
+            $table->string('name');
+            $table->string('code', 10)->unique();
+            $table->boolean('active')->default(true);
+
+            $table->timestamps();
+            $table->softDeletes();
+
+            $table->index('name');
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::dropIfExists('banks');
+    }
+};

+ 76 - 0
database/seeders/BankSeeder.php

@@ -0,0 +1,76 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\Bank;
+use Illuminate\Database\Seeder;
+
+class BankSeeder extends Seeder
+{
+    /**
+     * Seed the application's database.
+     *
+     * Lista baseada nos códigos de compensação (COMPE) da FEBRABAN.
+     */
+    public function run(): void
+    {
+        $banks = [
+            ['code' => '001', 'name' => 'Banco do Brasil S.A.'],
+            ['code' => '003', 'name' => 'Banco da Amazônia S.A.'],
+            ['code' => '004', 'name' => 'Banco do Nordeste do Brasil S.A.'],
+            ['code' => '021', 'name' => 'Banestes S.A. Banco do Estado do Espírito Santo'],
+            ['code' => '025', 'name' => 'Banco Alfa S.A.'],
+            ['code' => '033', 'name' => 'Banco Santander (Brasil) S.A.'],
+            ['code' => '036', 'name' => 'Banco Bradesco BBI S.A.'],
+            ['code' => '037', 'name' => 'Banco do Estado do Pará S.A. (Banpará)'],
+            ['code' => '041', 'name' => 'Banco do Estado do Rio Grande do Sul S.A. (Banrisul)'],
+            ['code' => '047', 'name' => 'Banco do Estado de Sergipe S.A. (Banese)'],
+            ['code' => '070', 'name' => 'BRB - Banco de Brasília S.A.'],
+            ['code' => '077', 'name' => 'Banco Inter S.A.'],
+            ['code' => '082', 'name' => 'Banco Topázio S.A.'],
+            ['code' => '085', 'name' => 'Cooperativa Central de Crédito Ailos'],
+            ['code' => '102', 'name' => 'XP Investimentos CCTVM S.A.'],
+            ['code' => '104', 'name' => 'Caixa Econômica Federal'],
+            ['code' => '121', 'name' => 'Banco Agibank S.A.'],
+            ['code' => '133', 'name' => 'Cresol Confederação'],
+            ['code' => '136', 'name' => 'Unicred do Brasil'],
+            ['code' => '197', 'name' => 'Stone Pagamentos S.A.'],
+            ['code' => '208', 'name' => 'Banco BTG Pactual S.A.'],
+            ['code' => '212', 'name' => 'Banco Original S.A.'],
+            ['code' => '218', 'name' => 'Banco BS2 S.A.'],
+            ['code' => '237', 'name' => 'Banco Bradesco S.A.'],
+            ['code' => '246', 'name' => 'Banco ABC Brasil S.A.'],
+            ['code' => '260', 'name' => 'Nu Pagamentos S.A. (Nubank)'],
+            ['code' => '290', 'name' => 'PagSeguro Internet S.A. (PagBank)'],
+            ['code' => '318', 'name' => 'Banco BMG S.A.'],
+            ['code' => '323', 'name' => 'Mercado Pago Instituição de Pagamento Ltda.'],
+            ['code' => '336', 'name' => 'Banco C6 S.A.'],
+            ['code' => '341', 'name' => 'Itaú Unibanco S.A.'],
+            ['code' => '348', 'name' => 'Banco XP S.A.'],
+            ['code' => '380', 'name' => 'PicPay Instituição de Pagamento S.A.'],
+            ['code' => '389', 'name' => 'Banco Mercantil do Brasil S.A.'],
+            ['code' => '422', 'name' => 'Banco Safra S.A.'],
+            ['code' => '473', 'name' => 'Banco Caixa Geral - Brasil S.A.'],
+            ['code' => '536', 'name' => 'Neon Pagamentos S.A.'],
+            ['code' => '623', 'name' => 'Banco PAN S.A.'],
+            ['code' => '655', 'name' => 'Banco BV S.A. (Votorantim)'],
+            ['code' => '707', 'name' => 'Banco Daycoval S.A.'],
+            ['code' => '739', 'name' => 'Banco Cetelem S.A.'],
+            ['code' => '743', 'name' => 'Banco Semear S.A.'],
+            ['code' => '745', 'name' => 'Banco Citibank S.A.'],
+            ['code' => '746', 'name' => 'Banco Modal S.A.'],
+            ['code' => '748', 'name' => 'Banco Cooperativo Sicredi S.A.'],
+            ['code' => '756', 'name' => 'Banco Cooperativo Sicoob S.A.'],
+        ];
+
+        foreach ($banks as $bank) {
+            Bank::updateOrCreate(
+                ['code' => $bank['code']],
+                [
+                    'name'   => $bank['name'],
+                    'active' => true,
+                ]
+            );
+        }
+    }
+}

+ 1 - 0
database/seeders/DatabaseSeeder.php

@@ -16,6 +16,7 @@ class DatabaseSeeder extends Seeder
             PermissionSeeder::class,
             UserTypePermissionSeeder::class,
             BrazilCitiesSeeder::class,
+            BankSeeder::class,
             ServiceTypeSeeder::class,
             SpecialitySeeder::class,
             ImprovementTypeSeeder::class,

+ 6 - 0
database/seeders/PermissionSeeder.php

@@ -40,6 +40,12 @@ class PermissionSeeder extends Seeder
                         'bits'        => 271,
                         'children'    => [],
                     ],
+                    [
+                        'scope'       => 'config.bank',
+                        'description' => 'Configurações de Bancos',
+                        'bits'        => 271,
+                        'children'    => [],
+                    ],
                     [
                         'scope'       => 'config.city',
                         'description' => 'Configurações de Cidades',

+ 11 - 0
routes/authRoutes/bank.php

@@ -0,0 +1,11 @@
+<?php
+
+use App\Http\Controllers\BankController;
+use Illuminate\Support\Facades\Route;
+
+Route::get('/banks',     [BankController::class, 'index']);
+Route::get('/bank/{id}', [BankController::class, 'show']);
+
+Route::post('/bank',        [BankController::class, 'store'])->middleware('permission:config.bank,add');
+Route::put('/bank/{id}',    [BankController::class, 'update'])->middleware('permission:config.bank,edit');
+Route::delete('/bank/{id}', [BankController::class, 'destroy'])->middleware('permission:config.bank,delete');