Sfoglia il codice sorgente

feat(unit-receivable): endpoints /me de listagem, baixa e reabertura

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ebagabee 4 settimane fa
parent
commit
ddc12954e4

+ 77 - 0
app/Http/Controllers/UnitReceivableController.php

@@ -0,0 +1,77 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Controllers\Concerns\ResolvesActiveUnit;
+use App\Http\Requests\SettleReceivableRequest;
+use App\Http\Resources\UnitReceivableResource;
+use App\Services\UnitReceivableService;
+use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Request;
+
+class UnitReceivableController extends Controller
+{
+    use ResolvesActiveUnit;
+
+    public function __construct(
+        protected UnitReceivableService $service,
+    ) {}
+
+    public function indexMe(Request $request): JsonResponse
+    {
+        $unitId = $this->activeUnitId();
+
+        if (!$unitId) {
+            return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
+        }
+
+        $filters = $request->only(['status', 'student_id', 'type']);
+        $items   = $this->service->list($unitId, array_filter($filters, fn ($v) => $v !== null));
+
+        return $this->successResponse(payload: UnitReceivableResource::collection($items));
+    }
+
+    public function settleMe(SettleReceivableRequest $request, int $id): JsonResponse
+    {
+        $unitId = $this->activeUnitId();
+
+        if (!$unitId) {
+            return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
+        }
+
+        $installment = $this->service->findForUnit($id, $unitId);
+
+        if (!$installment) {
+            return $this->errorResponse(message: 'Recebível não encontrado', code: 404);
+        }
+
+        $item = $this->service->settle($installment, $request->validated());
+
+        return $this->successResponse(
+            payload: new UnitReceivableResource($item),
+            message: 'Baixa realizada com sucesso',
+        );
+    }
+
+    public function reopenMe(int $id): JsonResponse
+    {
+        $unitId = $this->activeUnitId();
+
+        if (!$unitId) {
+            return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
+        }
+
+        $installment = $this->service->findForUnit($id, $unitId);
+
+        if (!$installment) {
+            return $this->errorResponse(message: 'Recebível não encontrado', code: 404);
+        }
+
+        $item = $this->service->reopen($installment);
+
+        return $this->successResponse(
+            payload: new UnitReceivableResource($item),
+            message: 'Recebível reaberto',
+        );
+    }
+}

+ 18 - 0
app/Http/Requests/SettleReceivableRequest.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class SettleReceivableRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        return [
+            'payment_date' => 'nullable|date',
+            'paid_value'   => 'nullable|numeric|min:0',
+            'discount'     => 'nullable|numeric|min:0',
+            'fine'         => 'nullable|numeric|min:0',
+        ];
+    }
+}

+ 32 - 0
app/Http/Resources/UnitReceivableResource.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class UnitReceivableResource extends JsonResource
+{
+    public function toArray(Request $request): array
+    {
+        return [
+            'id'                  => $this->id,
+            'student_contract_id' => $this->student_contract_id,
+            'student_id'          => $this->student_id,
+            'student_name'        => $this->student?->name,
+            'type'                => $this->type,
+            'history'             => $this->history,
+            'installment_number'  => $this->installment_number,
+            'total_installments'  => $this->total_installments,
+            'order'               => $this->order,
+            'value'               => (float) $this->value,
+            'paid_value'          => (float) $this->paid_value,
+            'discount'            => (float) $this->discount,
+            'fine'                => (float) $this->fine,
+            'due_date'            => $this->due_date?->format('Y-m-d'),
+            'payment_date'        => $this->payment_date?->format('Y-m-d'),
+            'status'              => $this->status,
+            'asaas_id'            => $this->asaas_id,
+        ];
+    }
+}

+ 10 - 0
routes/authRoutes/unit_receivable.php

@@ -0,0 +1,10 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+use App\Http\Controllers\UnitReceivableController;
+
+Route::controller(UnitReceivableController::class)->prefix('unit-receivable')->group(function () {
+    Route::get('/me', 'indexMe');
+    Route::post('/me/{id}/settle', 'settleMe');
+    Route::post('/me/{id}/reopen', 'reopenMe');
+});