Explorar o código

feat(unit-payable): endpoints /me de listagem, criação, baixa e reabertura

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ebagabee hai 4 semanas
pai
achega
49719e8f52

+ 95 - 0
app/Http/Controllers/UnitAccountPayableController.php

@@ -0,0 +1,95 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Controllers\Concerns\ResolvesActiveUnit;
+use App\Http\Requests\SettlePayableRequest;
+use App\Http\Requests\StoreUnitPayableRequest;
+use App\Http\Resources\UnitAccountPayableResource;
+use App\Services\UnitAccountPayableService;
+use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Request;
+
+class UnitAccountPayableController extends Controller
+{
+    use ResolvesActiveUnit;
+
+    public function __construct(
+        protected UnitAccountPayableService $service,
+    ) {}
+
+    public function indexMe(Request $request): JsonResponse
+    {
+        $unitId = $this->activeUnitId();
+
+        if (!$unitId) {
+            return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
+        }
+
+        $filters = array_filter($request->only(['status', 'origin']), fn ($v) => $v !== null);
+        $items   = $this->service->list($unitId, $filters);
+
+        return $this->successResponse(payload: UnitAccountPayableResource::collection($items));
+    }
+
+    public function storeMe(StoreUnitPayableRequest $request): JsonResponse
+    {
+        $unitId = $this->activeUnitId();
+
+        if (!$unitId) {
+            return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
+        }
+
+        $item = $this->service->createManual($unitId, $request->validated());
+
+        return $this->successResponse(
+            payload: new UnitAccountPayableResource($item),
+            message: __('messages.created'),
+            code: 201,
+        );
+    }
+
+    public function settleMe(SettlePayableRequest $request, int $id): JsonResponse
+    {
+        $unitId = $this->activeUnitId();
+
+        if (!$unitId) {
+            return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
+        }
+
+        $payable = $this->service->findForUnit($id, $unitId);
+
+        if (!$payable) {
+            return $this->errorResponse(message: 'Conta a pagar não encontrada', code: 404);
+        }
+
+        $item = $this->service->settle($payable, $request->validated());
+
+        return $this->successResponse(
+            payload: new UnitAccountPayableResource($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);
+        }
+
+        $payable = $this->service->findForUnit($id, $unitId);
+
+        if (!$payable) {
+            return $this->errorResponse(message: 'Conta a pagar não encontrada', code: 404);
+        }
+
+        $item = $this->service->reopen($payable);
+
+        return $this->successResponse(
+            payload: new UnitAccountPayableResource($item),
+            message: 'Conta reaberta',
+        );
+    }
+}

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

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class SettlePayableRequest 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',
+        ];
+    }
+}

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

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class StoreUnitPayableRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        return [
+            'history'  => 'required|string|max:255',
+            'value'    => 'required|numeric|min:0.01',
+            'due_date' => 'required|date',
+            'obs'      => 'nullable|string|max:1000',
+        ];
+    }
+}

+ 27 - 0
app/Http/Resources/UnitAccountPayableResource.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class UnitAccountPayableResource extends JsonResource
+{
+    public function toArray(Request $request): array
+    {
+        return [
+            'id'                            => $this->id,
+            'origin'                        => $this->origin,
+            'franchisee_account_receive_id' => $this->franchisee_account_receive_id,
+            'history'                       => $this->history,
+            '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,
+            'obs'                           => $this->obs,
+        ];
+    }
+}

+ 11 - 0
routes/authRoutes/unit_payable.php

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