Bläddra i källkod

feat: add class_unit_variation

Gustavo Mantovani 3 veckor sedan
förälder
incheckning
6b49edf313
100 ändrade filer med 1174 tillägg och 766 borttagningar
  1. 67 65
      app/Http/Controllers/AuthController.php
  2. 3 1
      app/Http/Controllers/CityController.php
  3. 1 1
      app/Http/Controllers/ClassAttendanceController.php
  4. 8 2
      app/Http/Controllers/ClassController.php
  5. 16 11
      app/Http/Controllers/ClassPackageController.php
  6. 27 15
      app/Http/Controllers/ClassPackageUnitController.php
  7. 63 0
      app/Http/Controllers/ClassPackageUnitVariationController.php
  8. 8 6
      app/Http/Controllers/CompanyAccountPayableController.php
  9. 2 0
      app/Http/Controllers/Concerns/ResolvesActiveUnit.php
  10. 5 1
      app/Http/Controllers/CountryController.php
  11. 39 33
      app/Http/Controllers/FinancialPlanAccountController.php
  12. 14 9
      app/Http/Controllers/FranchiseeAccountReceiveController.php
  13. 3 1
      app/Http/Controllers/FranchiseeContractController.php
  14. 1 1
      app/Http/Controllers/FranchiseeController.php
  15. 7 3
      app/Http/Controllers/FranchiseeDashboardController.php
  16. 1 1
      app/Http/Controllers/FranchiseeUnitController.php
  17. 3 1
      app/Http/Controllers/GroupController.php
  18. 9 1
      app/Http/Controllers/HolidayController.php
  19. 1 1
      app/Http/Controllers/InhabitantClassificationController.php
  20. 43 33
      app/Http/Controllers/KanbanController.php
  21. 1 1
      app/Http/Controllers/KanbanMediaController.php
  22. 14 14
      app/Http/Controllers/KanbanReplyController.php
  23. 30 30
      app/Http/Controllers/NotificationController.php
  24. 16 14
      app/Http/Controllers/ProductController.php
  25. 58 58
      app/Http/Controllers/SelectController.php
  26. 3 1
      app/Http/Controllers/StateController.php
  27. 1 0
      app/Http/Controllers/StudentController.php
  28. 1 1
      app/Http/Controllers/StudentHistoryController.php
  29. 1 1
      app/Http/Controllers/StudentMediaController.php
  30. 1 1
      app/Http/Controllers/StudentResponsibleController.php
  31. 14 14
      app/Http/Controllers/SupportReplyController.php
  32. 18 7
      app/Http/Controllers/SupportTicketController.php
  33. 28 24
      app/Http/Controllers/TbrCalculationController.php
  34. 9 7
      app/Http/Controllers/TbrController.php
  35. 37 32
      app/Http/Controllers/TreasuryAccountController.php
  36. 38 36
      app/Http/Controllers/TreasuryLaunchController.php
  37. 6 6
      app/Http/Controllers/UnitAccountPayableController.php
  38. 1 1
      app/Http/Controllers/UnitContractController.php
  39. 1 1
      app/Http/Controllers/UnitController.php
  40. 16 13
      app/Http/Controllers/UnitFinancialController.php
  41. 1 1
      app/Http/Controllers/UnitHistoryController.php
  42. 1 1
      app/Http/Controllers/UnitMediaController.php
  43. 1 1
      app/Http/Controllers/UnitPartnerController.php
  44. 21 18
      app/Http/Controllers/UnitReceivableController.php
  45. 32 14
      app/Http/Controllers/UserController.php
  46. 10 7
      app/Http/Controllers/UserTypeController.php
  47. 2 0
      app/Http/Controllers/UserTypePermissionController.php
  48. 3 2
      app/Http/Controllers/Webhooks/AsaasWebhookController.php
  49. 1 1
      app/Http/Requests/CityRequest.php
  50. 24 7
      app/Http/Requests/ClassPackageUnitRequest.php
  51. 45 0
      app/Http/Requests/ClassPackageUnitVariationRequest.php
  52. 1 1
      app/Http/Requests/CountryRequest.php
  53. 1 1
      app/Http/Requests/StateRequest.php
  54. 66 26
      app/Http/Requests/StudentContractRequest.php
  55. 3 3
      app/Http/Resources/AuthResource.php
  56. 8 8
      app/Http/Resources/CityResource.php
  57. 5 4
      app/Http/Resources/ClassAttendanceResource.php
  58. 2 2
      app/Http/Resources/ClassPackageResource.php
  59. 2 3
      app/Http/Resources/ClassPackageUnitResource.php
  60. 59 0
      app/Http/Resources/ClassPackageUnitVariationResource.php
  61. 10 8
      app/Http/Resources/ClassResource.php
  62. 15 12
      app/Http/Resources/CompanyAccountPayableResource.php
  63. 5 3
      app/Http/Resources/CompanyPaymentAccountResource.php
  64. 7 5
      app/Http/Resources/CountryResource.php
  65. 11 9
      app/Http/Resources/FinancialPlanAccountResource.php
  66. 24 19
      app/Http/Resources/FranchiseeAccountReceiveResource.php
  67. 21 19
      app/Http/Resources/FranchiseeContractResource.php
  68. 10 8
      app/Http/Resources/FranchiseeContractTaxHistoryResource.php
  69. 5 4
      app/Http/Resources/FranchiseeResource.php
  70. 5 4
      app/Http/Resources/FranchiseeUnitResource.php
  71. 7 4
      app/Http/Resources/GroupResource.php
  72. 2 2
      app/Http/Resources/HolidayResource.php
  73. 2 2
      app/Http/Resources/InhabitantClassificationResource.php
  74. 2 2
      app/Http/Resources/KanbanResource.php
  75. 5 4
      app/Http/Resources/NotificationRecipientResource.php
  76. 6 4
      app/Http/Resources/NotificationResource.php
  77. 7 7
      app/Http/Resources/PermissionResource.php
  78. 2 2
      app/Http/Resources/ProductResource.php
  79. 4 4
      app/Http/Resources/Select/FinancialPlanAccountSelectResource.php
  80. 3 3
      app/Http/Resources/Select/InhabitantClassificationSelectResource.php
  81. 10 9
      app/Http/Resources/Select/PackageSelectResource.php
  82. 3 3
      app/Http/Resources/Select/StudentSelectResource.php
  83. 4 4
      app/Http/Resources/Select/UserSelectResource.php
  84. 9 7
      app/Http/Resources/StateResource.php
  85. 6 4
      app/Http/Resources/StudentContractInstallmentResource.php
  86. 12 1
      app/Http/Resources/StudentContractResource.php
  87. 5 4
      app/Http/Resources/StudentHistoryResource.php
  88. 8 8
      app/Http/Resources/StudentMediaResource.php
  89. 5 3
      app/Http/Resources/StudentResource.php
  90. 2 2
      app/Http/Resources/StudentResponsibleResource.php
  91. 2 2
      app/Http/Resources/SupportTicketResource.php
  92. 7 5
      app/Http/Resources/TbrCalculationResource.php
  93. 2 2
      app/Http/Resources/TbrResource.php
  94. 14 14
      app/Http/Resources/TreasuryAccountResource.php
  95. 20 16
      app/Http/Resources/TreasuryLaunchResource.php
  96. 2 2
      app/Http/Resources/UnitContractResource.php
  97. 1 1
      app/Http/Resources/UnitFinancialResource.php
  98. 2 2
      app/Http/Resources/UnitHistoryResource.php
  99. 2 2
      app/Http/Resources/UnitMediaResource.php
  100. 2 2
      app/Http/Resources/UnitPartnerResource.php

+ 67 - 65
app/Http/Controllers/AuthController.php

@@ -8,9 +8,9 @@
 use App\Http\Requests\RefreshTokenRequest;
 use App\Http\Requests\ResetPasswordRequest;
 use App\Http\Requests\VerifyPasswordCodeRequest;
-use Illuminate\Http\JsonResponse;
 use App\Http\Resources\AuthResource;
 use App\Services\AuthService;
+use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 
 class AuthController extends Controller
@@ -51,70 +51,6 @@ public function login(AuthRequest $request): JsonResponse
         );
     }
 
-    public function forgotPassword(ForgotPasswordRequest $request): JsonResponse
-    {
-        $validated = $request->validated();
-
-        $sent = $this->authService->forgotPassword(
-            email: $validated['email'],
-            portal: $validated['portal'] ?? 'franchisee',
-        );
-
-        if (!$sent) {
-            return $this->errorResponse(message: __('auth.email_not_found'), code: 422);
-        }
-
-        return $this->successResponse(message: __('auth.password_reset_sent'));
-    }
-
-    public function verifyPasswordCode(VerifyPasswordCodeRequest $request): JsonResponse
-    {
-        $validated = $request->validated();
-
-        $valid = $this->authService->verifyPasswordCode(
-            email: $validated['email'],
-            code: $validated['code'],
-        );
-
-        if (!$valid) {
-            return $this->errorResponse(message: __('auth.invalid_code'), code: 422);
-        }
-
-        return $this->successResponse(message: __('auth.code_verified'));
-    }
-
-    public function resetPassword(ResetPasswordRequest $request): JsonResponse
-    {
-        $validated = $request->validated();
-
-        $reset = $this->authService->resetPassword(
-            email: $validated['email'],
-            code: $validated['code'],
-            password: $validated['password'],
-        );
-
-        if (!$reset) {
-            return $this->errorResponse(message: __('auth.invalid_code'), code: 422);
-        }
-
-        return $this->successResponse(message: __('auth.password_reset_success'));
-    }
-
-    public function confirmPassword(ConfirmPasswordRequest $request): JsonResponse
-    {
-        $validated = $request->validated();
-
-        $confirmed = $this->authService->confirmPassword(
-            password: $validated["password"],
-        );
-
-        if (!$confirmed) {
-            return $this->errorResponse(message: __("auth.password"), code: 422);
-        }
-
-        return $this->successResponse(message: __("auth.password_confirmed"));
-    }
-
     public function logout(Request $request): JsonResponse
     {
         $this->authService->logout();
@@ -165,6 +101,72 @@ public function refresh(RefreshTokenRequest $request): JsonResponse
         );
     }
 
+    //
+
+    public function confirmPassword(ConfirmPasswordRequest $request): JsonResponse
+    {
+        $validated = $request->validated();
+
+        $confirmed = $this->authService->confirmPassword(
+            password: $validated["password"],
+        );
+
+        if (!$confirmed) {
+            return $this->errorResponse(message: __("auth.password"), code: 422);
+        }
+
+        return $this->successResponse(message: __("auth.password_confirmed"));
+    }
+
+    public function forgotPassword(ForgotPasswordRequest $request): JsonResponse
+    {
+        $validated = $request->validated();
+
+        $sent = $this->authService->forgotPassword(
+            email: $validated['email'],
+            portal: $validated['portal'] ?? 'franchisee',
+        );
+
+        if (!$sent) {
+            return $this->errorResponse(message: __('auth.email_not_found'), code: 422);
+        }
+
+        return $this->successResponse(message: __('auth.password_reset_sent'));
+    }
+
+    public function resetPassword(ResetPasswordRequest $request): JsonResponse
+    {
+        $validated = $request->validated();
+
+        $reset = $this->authService->resetPassword(
+            email: $validated['email'],
+            code: $validated['code'],
+            password: $validated['password'],
+        );
+
+        if (!$reset) {
+            return $this->errorResponse(message: __('auth.invalid_code'), code: 422);
+        }
+
+        return $this->successResponse(message: __('auth.password_reset_success'));
+    }
+
+    public function verifyPasswordCode(VerifyPasswordCodeRequest $request): JsonResponse
+    {
+        $validated = $request->validated();
+
+        $valid = $this->authService->verifyPasswordCode(
+            email: $validated['email'],
+            code: $validated['code'],
+        );
+
+        if (!$valid) {
+            return $this->errorResponse(message: __('auth.invalid_code'), code: 422);
+        }
+
+        return $this->successResponse(message: __('auth.code_verified'));
+    }
+
     /**
      * Resolves the dynamic cookie name based on the requesting application.
      */

+ 3 - 1
app/Http/Controllers/CityController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\CityService;
 use App\Http\Requests\CityRequest;
 use App\Http\Resources\CityResource;
+use App\Services\CityService;
 use Illuminate\Http\JsonResponse;
 
 class CityController extends Controller
@@ -22,6 +22,7 @@ public function index(): JsonResponse
     public function store(CityRequest $request): JsonResponse
     {
         $item = $this->service->create($request->validated());
+
         return $this->successResponse(
             payload: new CityResource($item),
             message: __("messages.created"),
@@ -38,6 +39,7 @@ public function show(int $id): JsonResponse
     public function update(CityRequest $request, int $id): JsonResponse
     {
         $item = $this->service->update($id, $request->validated());
+
         return $this->successResponse(
             payload: new CityResource($item),
             message: __("messages.updated"),

+ 1 - 1
app/Http/Controllers/ClassAttendanceController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\ClassAttendanceService;
 use App\Http\Requests\ClassAttendanceRequest;
 use App\Http\Resources\ClassAttendanceResource;
+use App\Services\ClassAttendanceService;
 use Illuminate\Http\JsonResponse;
 
 class ClassAttendanceController extends Controller

+ 8 - 2
app/Http/Controllers/ClassController.php

@@ -3,11 +3,11 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\ClassService;
 use App\Http\Requests\ClassRequest;
 use App\Http\Resources\ClassResource;
-use Illuminate\Http\Request;
+use App\Services\ClassService;
 use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Request;
 
 class ClassController extends Controller
 {
@@ -20,21 +20,25 @@ public function __construct(
     public function index(): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (!$unitId) {
             return $this->successResponse(payload: []);
         }
 
         $items = $this->service->getAllByUnit($unitId);
+
         return $this->successResponse(payload: ClassResource::collection($items));
     }
 
     public function store(ClassRequest $request): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         abort_unless($unitId, 403, 'Nenhuma unidade ativa foi selecionada.');
 
         $data = array_merge($request->validated(), ['unit_id' => $unitId]);
         $item = $this->service->create($data);
+
         return $this->successResponse(payload: new ClassResource($item), message: __('messages.created'), code: 201);
     }
 
@@ -79,12 +83,14 @@ public function saveAttendance(Request $request, int $id): JsonResponse
         ]);
 
         $this->service->saveAttendance($id, $this->requiredActiveUnitId(), $validated['attendances']);
+
         return $this->successResponse(message: __('messages.updated'));
     }
 
     private function requiredActiveUnitId(): int
     {
         $unitId = $this->activeUnitId();
+
         abort_unless($unitId, 403, 'Nenhuma unidade ativa foi selecionada.');
 
         return $unitId;

+ 16 - 11
app/Http/Controllers/ClassPackageController.php

@@ -3,9 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\ClassPackageService;
 use App\Http\Requests\ClassPackageRequest;
 use App\Http\Resources\ClassPackageResource;
+use App\Services\ClassPackageService;
 use Illuminate\Http\JsonResponse;
 
 class ClassPackageController extends Controller
@@ -22,16 +22,6 @@ public function index(): JsonResponse
         return $this->successResponse(payload: ClassPackageResource::collection($items));
     }
 
-    public function byUnit(): JsonResponse
-    {
-        $unitId = $this->activeUnitId();
-        if (!$unitId) {
-            return $this->successResponse(payload: []);
-        }
-        $items = $this->service->getByUnit($unitId);
-        return $this->successResponse(payload: ClassPackageResource::collection($items));
-    }
-
     public function store(ClassPackageRequest $request): JsonResponse
     {
         $item = $this->service->create($request->validated());
@@ -55,4 +45,19 @@ public function destroy(int $id): JsonResponse
         $this->service->delete($id);
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
+
+    //
+
+    public function byUnit(): JsonResponse
+    {
+        $unitId = $this->activeUnitId();
+
+        if (!$unitId) {
+            return $this->successResponse(payload: []);
+        }
+
+        $items = $this->service->getByUnit($unitId);
+
+        return $this->successResponse(payload: ClassPackageResource::collection($items));
+    }
 }

+ 27 - 15
app/Http/Controllers/ClassPackageUnitController.php

@@ -3,9 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\ClassPackageUnitService;
 use App\Http\Requests\ClassPackageUnitRequest;
 use App\Http\Resources\ClassPackageUnitResource;
+use App\Services\ClassPackageUnitService;
 use Illuminate\Http\JsonResponse;
 
 class ClassPackageUnitController extends Controller
@@ -19,21 +19,14 @@ public function __construct(
     public function index(): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (!$unitId) {
             return $this->successResponse(payload: []);
         }
+
         // Only return packages the franchisor made visible for this unit
         $items = $this->service->getByUnit($unitId);
-        return $this->successResponse(payload: ClassPackageUnitResource::collection($items));
-    }
 
-    public function byUnit(): JsonResponse
-    {
-        $unitId = $this->activeUnitId();
-        if (!$unitId) {
-            return $this->successResponse(payload: []);
-        }
-        $items = $this->service->getByUnit($unitId);
         return $this->successResponse(payload: ClassPackageUnitResource::collection($items));
     }
 
@@ -44,6 +37,7 @@ public function store(ClassPackageUnitRequest $request): JsonResponse
 
         $data   = array_merge($request->validated(), ['unit_id' => $unitId]);
         $item   = $this->service->create($data);
+
         return $this->successResponse(payload: new ClassPackageUnitResource($item), message: __('messages.created'), code: 201);
     }
 
@@ -59,21 +53,39 @@ public function update(ClassPackageUnitRequest $request, int $id): JsonResponse
         return $this->successResponse(payload: new ClassPackageUnitResource($item), message: __('messages.updated'));
     }
 
+    public function destroy(int $id): JsonResponse
+    {
+        $this->service->delete($id, $this->requiredActiveUnitId());
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+
+    //
+
+    public function byUnit(): JsonResponse
+    {
+        $unitId = $this->activeUnitId();
+
+        if (!$unitId) {
+            return $this->successResponse(payload: []);
+        }
+
+        $items = $this->service->getByUnit($unitId);
+
+        return $this->successResponse(payload: ClassPackageUnitResource::collection($items));
+    }
+
     public function toggleVisibility(int $id): JsonResponse
     {
         $item = $this->service->toggleVisibility($id, $this->requiredActiveUnitId());
         return $this->successResponse(payload: new ClassPackageUnitResource($item), message: __('messages.updated'));
     }
 
-    public function destroy(int $id): JsonResponse
-    {
-        $this->service->delete($id, $this->requiredActiveUnitId());
-        return $this->successResponse(message: __('messages.deleted'), code: 204);
-    }
+    //
 
     private function requiredActiveUnitId(): int
     {
         $unitId = $this->activeUnitId();
+
         abort_unless($unitId, 403, 'Nenhuma unidade ativa foi selecionada.');
 
         return $unitId;

+ 63 - 0
app/Http/Controllers/ClassPackageUnitVariationController.php

@@ -0,0 +1,63 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Controllers\Concerns\ResolvesActiveUnit;
+use App\Http\Requests\ClassPackageUnitVariationRequest;
+use App\Http\Resources\ClassPackageUnitVariationResource;
+use App\Services\ClassPackageUnitVariationService;
+use Illuminate\Http\JsonResponse;
+
+class ClassPackageUnitVariationController extends Controller
+{
+    use ResolvesActiveUnit;
+
+    public function __construct(
+        protected ClassPackageUnitVariationService $service,
+    ) {}
+
+    public function index(int $package): JsonResponse
+    {
+        $items = $this->service->getAll($package, $this->requiredActiveUnitId());
+
+        return $this->successResponse(payload: ClassPackageUnitVariationResource::collection($items));
+    }
+
+    public function store(ClassPackageUnitVariationRequest $request, int $package): JsonResponse
+    {
+        $item = $this->service->create($package, $this->requiredActiveUnitId(), $request->validated());
+
+        return $this->successResponse(payload: new ClassPackageUnitVariationResource($item), message: __('messages.created'), code: 201);
+    }
+
+    public function show(int $package, int $id): JsonResponse
+    {
+        $item = $this->service->findById($id, $package, $this->requiredActiveUnitId());
+
+        return $this->successResponse(payload: new ClassPackageUnitVariationResource($item));
+    }
+
+    public function update(ClassPackageUnitVariationRequest $request, int $package, int $id): JsonResponse
+    {
+        $item = $this->service->update($id, $package, $this->requiredActiveUnitId(), $request->validated());
+
+        return $this->successResponse(payload: new ClassPackageUnitVariationResource($item), message: __('messages.updated'));
+    }
+
+    public function destroy(int $package, int $id): JsonResponse
+    {
+        $this->service->delete($id, $package, $this->requiredActiveUnitId());
+
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+
+    //
+
+    private function requiredActiveUnitId(): int
+    {
+        $unitId = $this->activeUnitId();
+        abort_unless($unitId, 403, 'Nenhuma unidade ativa foi selecionada.');
+
+        return $unitId;
+    }
+}

+ 8 - 6
app/Http/Controllers/CompanyAccountPayableController.php

@@ -38,7 +38,9 @@ public function store(StoreCompanyPayableRequest $request): JsonResponse
         );
     }
 
-    public function settle(SettlePayableRequest $request, int $id): JsonResponse
+    //
+
+    public function reopen(int $id): JsonResponse
     {
         $payable = $this->service->findById($id);
 
@@ -46,15 +48,15 @@ public function settle(SettlePayableRequest $request, int $id): JsonResponse
             return $this->errorResponse(message: 'Conta a pagar não encontrada', code: 404);
         }
 
-        $item = $this->service->settle($payable, $request->validated());
+        $item = $this->service->reopen($payable);
 
         return $this->successResponse(
             payload: new CompanyAccountPayableResource($item),
-            message: 'Baixa realizada com sucesso',
+            message: 'Conta reaberta',
         );
     }
 
-    public function reopen(int $id): JsonResponse
+    public function settle(SettlePayableRequest $request, int $id): JsonResponse
     {
         $payable = $this->service->findById($id);
 
@@ -62,11 +64,11 @@ public function reopen(int $id): JsonResponse
             return $this->errorResponse(message: 'Conta a pagar não encontrada', code: 404);
         }
 
-        $item = $this->service->reopen($payable);
+        $item = $this->service->settle($payable, $request->validated());
 
         return $this->successResponse(
             payload: new CompanyAccountPayableResource($item),
-            message: 'Conta reaberta',
+            message: 'Baixa realizada com sucesso',
         );
     }
 }

+ 2 - 0
app/Http/Controllers/Concerns/ResolvesActiveUnit.php

@@ -18,11 +18,13 @@ trait ResolvesActiveUnit
     protected function activeUnitId(?User $user = null): ?int
     {
         $fromRequest = request()->input('active_unit_id');
+
         if ($fromRequest) {
             return (int) $fromRequest;
         }
 
         $user = $user ?? Auth::user()?->loadMissing('units');
+
         return $user?->units->first()?->id;
     }
 }

+ 5 - 1
app/Http/Controllers/CountryController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\CountryService;
 use App\Http\Requests\CountryRequest;
 use App\Http\Resources\CountryResource;
+use App\Services\CountryService;
 use Illuminate\Http\JsonResponse;
 
 class CountryController extends Controller
@@ -14,6 +14,7 @@ public function __construct(protected CountryService $service) {}
     public function index(): JsonResponse
     {
         $items = $this->service->getAll();
+
         return $this->successResponse(
             payload: CountryResource::collection($items),
         );
@@ -22,6 +23,7 @@ public function index(): JsonResponse
     public function store(CountryRequest $request): JsonResponse
     {
         $item = $this->service->create($request->validated());
+
         return $this->successResponse(
             payload: new CountryResource($item),
             message: __("messages.created"),
@@ -38,6 +40,7 @@ public function show(int $id): JsonResponse
     public function update(CountryRequest $request, int $id): JsonResponse
     {
         $item = $this->service->update($id, $request->validated());
+
         return $this->successResponse(
             payload: new CountryResource($item),
             message: __("messages.updated"),
@@ -47,6 +50,7 @@ public function update(CountryRequest $request, int $id): JsonResponse
     public function destroy(int $id): JsonResponse
     {
         $this->service->delete($id);
+
         return $this->successResponse(
             message: __("messages.deleted"),
             code: 204,

+ 39 - 33
app/Http/Controllers/FinancialPlanAccountController.php

@@ -3,9 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\FinancialPlanAccountService;
 use App\Http\Requests\FinancialPlanAccountRequest;
 use App\Http\Resources\FinancialPlanAccountResource;
+use App\Services\FinancialPlanAccountService;
 use Illuminate\Http\JsonResponse;
 
 class FinancialPlanAccountController extends Controller
@@ -16,11 +16,44 @@ public function __construct(
         protected FinancialPlanAccountService $service,
     ) {}
 
+    public function index(): JsonResponse
+    {
+        // Matriz enxerga apenas o próprio plano de contas (unit_id null);
+        // nunca os planos criados pelas unidades.
+        $items = $this->service->getAll(null);
+        return $this->successResponse(payload: FinancialPlanAccountResource::collection($items));
+    }
+
+    public function store(FinancialPlanAccountRequest $request): JsonResponse
+    {
+        $item = $this->service->create($request->validated());
+        return $this->successResponse(payload: new FinancialPlanAccountResource($item), message: __('messages.created'), code: 201);
+    }
+
+    public function show(int $id): JsonResponse
+    {
+        $item = $this->service->findById($id);
+        return $this->successResponse(payload: new FinancialPlanAccountResource($item));
+    }
+
+    public function update(FinancialPlanAccountRequest $request, int $id): JsonResponse
+    {
+        $item = $this->service->update($id, $request->validated());
+        return $this->successResponse(payload: new FinancialPlanAccountResource($item), message: __('messages.updated'));
+    }
+
+    public function destroy(int $id): JsonResponse
+    {
+        $this->service->delete($id);
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+
     // --- Endpoints da unidade ativa (Franchisee) ---
 
     public function indexMe(): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (!$unitId) {
             return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
         }
@@ -33,11 +66,13 @@ public function indexMe(): JsonResponse
     public function storeMe(FinancialPlanAccountRequest $request): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (!$unitId) {
             return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
         }
 
         $data = $request->validated();
+
         $data['unit_id'] = $unitId;
 
         $item = $this->service->create($data);
@@ -48,11 +83,13 @@ public function storeMe(FinancialPlanAccountRequest $request): JsonResponse
     public function updateMe(FinancialPlanAccountRequest $request, int $id): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (!$unitId || !$this->service->findByIdForUnit($id, $unitId)) {
             return $this->errorResponse(message: 'Conta não encontrada', code: 404);
         }
 
         $data = $request->validated();
+
         unset($data['unit_id']);
 
         $item = $this->service->update($id, $data);
@@ -63,6 +100,7 @@ public function updateMe(FinancialPlanAccountRequest $request, int $id): JsonRes
     public function destroyMe(int $id): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (!$unitId || !$this->service->findByIdForUnit($id, $unitId)) {
             return $this->errorResponse(message: 'Conta não encontrada', code: 404);
         }
@@ -71,36 +109,4 @@ public function destroyMe(int $id): JsonResponse
 
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
-
-    public function index(): JsonResponse
-    {
-        // Matriz enxerga apenas o próprio plano de contas (unit_id null);
-        // nunca os planos criados pelas unidades.
-        $items = $this->service->getAll(null);
-        return $this->successResponse(payload: FinancialPlanAccountResource::collection($items));
-    }
-
-    public function store(FinancialPlanAccountRequest $request): JsonResponse
-    {
-        $item = $this->service->create($request->validated());
-        return $this->successResponse(payload: new FinancialPlanAccountResource($item), message: __('messages.created'), code: 201);
-    }
-
-    public function show(int $id): JsonResponse
-    {
-        $item = $this->service->findById($id);
-        return $this->successResponse(payload: new FinancialPlanAccountResource($item));
-    }
-
-    public function update(FinancialPlanAccountRequest $request, int $id): JsonResponse
-    {
-        $item = $this->service->update($id, $request->validated());
-        return $this->successResponse(payload: new FinancialPlanAccountResource($item), message: __('messages.updated'));
-    }
-
-    public function destroy(int $id): JsonResponse
-    {
-        $this->service->delete($id);
-        return $this->successResponse(message: __('messages.deleted'), code: 204);
-    }
 }

+ 14 - 9
app/Http/Controllers/FranchiseeAccountReceiveController.php

@@ -51,42 +51,47 @@ public function store(StoreFranchisorReceivableRequest $request): JsonResponse
         );
     }
 
-    public function settle(SettlePayableRequest $request, int $id): JsonResponse
+    //
+
+    public function charge(int $id): JsonResponse
     {
         $item = FranchiseeAccountReceive::find($id);
+
         if (! $item) {
             return $this->errorResponse(message: 'Conta a receber não encontrada', code: 404);
         }
 
         return $this->successResponse(
-            payload: new FranchiseeAccountReceiveResource($this->service->settle($item, $request->validated())),
-            message: 'Baixa realizada com sucesso',
+            payload: new FranchiseeAccountReceiveResource($this->service->generateCharge($item)),
+            message: 'Cobrança gerada no Asaas',
         );
     }
 
-    public function charge(int $id): JsonResponse
+    public function reopen(int $id): JsonResponse
     {
         $item = FranchiseeAccountReceive::find($id);
+
         if (! $item) {
             return $this->errorResponse(message: 'Conta a receber não encontrada', code: 404);
         }
 
         return $this->successResponse(
-            payload: new FranchiseeAccountReceiveResource($this->service->generateCharge($item)),
-            message: 'Cobrança gerada no Asaas',
+            payload: new FranchiseeAccountReceiveResource($this->service->reopen($item)),
+            message: 'Conta reaberta',
         );
     }
 
-    public function reopen(int $id): JsonResponse
+    public function settle(SettlePayableRequest $request, int $id): JsonResponse
     {
         $item = FranchiseeAccountReceive::find($id);
+
         if (! $item) {
             return $this->errorResponse(message: 'Conta a receber não encontrada', code: 404);
         }
 
         return $this->successResponse(
-            payload: new FranchiseeAccountReceiveResource($this->service->reopen($item)),
-            message: 'Conta reaberta',
+            payload: new FranchiseeAccountReceiveResource($this->service->settle($item, $request->validated())),
+            message: 'Baixa realizada com sucesso',
         );
     }
 }

+ 3 - 1
app/Http/Controllers/FranchiseeContractController.php

@@ -3,10 +3,10 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\FranchiseeContractService;
 use App\Http\Requests\FranchiseeContractRequest;
 use App\Http\Resources\FranchiseeContractResource;
 use App\Http\Resources\FranchiseeContractTaxHistoryResource;
+use App\Services\FranchiseeContractService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 
@@ -57,6 +57,8 @@ public function destroy(int $id): JsonResponse
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
 
+    //
+
     public function taxHistory(int $id): JsonResponse
     {
         $items = $this->service->getTaxHistory($id);

+ 1 - 1
app/Http/Controllers/FranchiseeController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\FranchiseeService;
 use App\Http\Requests\FranchiseeRequest;
 use App\Http\Resources\FranchiseeResource;
+use App\Services\FranchiseeService;
 use Illuminate\Http\JsonResponse;
 
 class FranchiseeController extends Controller

+ 7 - 3
app/Http/Controllers/FranchiseeDashboardController.php

@@ -14,6 +14,7 @@ class FranchiseeDashboardController extends Controller
     public function summary(): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         abort_if(! $unitId, 404, 'Unidade não encontrada.');
 
         $students = Student::where('unit_id', $unitId)->get(['id', 'name', 'birth_date', 'created_at']);
@@ -21,19 +22,22 @@ public function summary(): JsonResponse
 
         return $this->successResponse(payload: [
             'students_count' => $students->count(),
+
             'contracts' => [
-                'active' => $contracts->where('status', 'active')->count(),
-                'frozen' => $contracts->where('status', 'frozen')->count(),
+                'active'   => $contracts->where('status', 'active')->count(),
+                'frozen'   => $contracts->where('status', 'frozen')->count(),
                 'cancelled' => $contracts->where('status', 'cancelled')->count(),
             ],
+
             'birthdays' => $students
                 ->filter(fn (Student $student) => $student->birth_date?->month === now()->month)
                 ->map(fn (Student $student) => [
-                    'day' => $student->birth_date->day,
+                    'day'  => $student->birth_date->day,
                     'name' => $student->name,
                 ])
                 ->sortBy('day')
                 ->values(),
+
             'enrollments' => $students->map(fn (Student $student) => [
                 'created_at' => $student->created_at?->toISOString(),
             ])->values(),

+ 1 - 1
app/Http/Controllers/FranchiseeUnitController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\FranchiseeUnitService;
 use App\Http\Requests\FranchiseeUnitRequest;
 use App\Http\Resources\FranchiseeUnitResource;
+use App\Services\FranchiseeUnitService;
 use Illuminate\Http\JsonResponse;
 
 class FranchiseeUnitController extends Controller

+ 3 - 1
app/Http/Controllers/GroupController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\GroupService;
 use App\Http\Requests\GroupRequest;
 use App\Http\Resources\GroupResource;
+use App\Services\GroupService;
 use Illuminate\Http\JsonResponse;
 
 class GroupController extends Controller
@@ -20,6 +20,7 @@ public function index(): JsonResponse
     public function store(GroupRequest $request): JsonResponse
     {
         $item = $this->service->create($request->validated());
+
         return $this->successResponse(
             payload: new GroupResource($item),
             message: __('messages.created'),
@@ -36,6 +37,7 @@ public function show(int $id): JsonResponse
     public function update(GroupRequest $request, int $id): JsonResponse
     {
         $item = $this->service->update($id, $request->validated());
+
         return $this->successResponse(
             payload: new GroupResource($item),
             message: __('messages.updated'),

+ 9 - 1
app/Http/Controllers/HolidayController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\HolidayService;
 use App\Http\Requests\HolidayRequest;
 use App\Http\Resources\HolidayResource;
+use App\Services\HolidayService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Support\Facades\Auth;
 
@@ -35,26 +35,34 @@ public function show(int $id): JsonResponse
     public function update(HolidayRequest $request, int $id): JsonResponse
     {
         $item = $this->service->findById($id);
+
         if (!$item) {
             return $this->errorResponse(message: 'Feriado não encontrado.', code: 404);
         }
+
         if ($item->base_holiday_id !== null) {
             return $this->errorResponse(message: 'Este feriado foi criado pela franqueadora e não pode ser editado.', code: 403);
         }
+
         $item = $this->service->update($id, $request->validated());
+
         return $this->successResponse(payload: new HolidayResource($item), message: __('messages.updated'));
     }
 
     public function destroy(int $id): JsonResponse
     {
         $item = $this->service->findById($id);
+
         if (!$item) {
             return $this->errorResponse(message: 'Feriado não encontrado.', code: 404);
         }
+
         if ($item->base_holiday_id !== null) {
             return $this->errorResponse(message: 'Este feriado foi criado pela franqueadora e não pode ser excluído.', code: 403);
         }
+
         $this->service->delete($id);
+
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
 }

+ 1 - 1
app/Http/Controllers/InhabitantClassificationController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\InhabitantClassificationService;
 use App\Http\Requests\InhabitantClassificationRequest;
 use App\Http\Resources\InhabitantClassificationResource;
+use App\Services\InhabitantClassificationService;
 use Illuminate\Http\JsonResponse;
 
 class InhabitantClassificationController extends Controller

+ 43 - 33
app/Http/Controllers/KanbanController.php

@@ -2,14 +2,14 @@
 
 namespace App\Http\Controllers;
 
-use App\Http\Controllers\Concerns\ResolvesActiveUnit;
 use App\Enums\NotificationType;
-use App\Services\KanbanService;
-use App\Services\NotificationService;
-use App\Http\Requests\KanbanRequest;
+use App\Http\Controllers\Concerns\ResolvesActiveUnit;
 use App\Http\Requests\KanbanReorderRequest;
+use App\Http\Requests\KanbanRequest;
 use App\Http\Resources\KanbanResource;
 use App\Models\Unit;
+use App\Services\KanbanService;
+use App\Services\NotificationService;
 use Illuminate\Http\JsonResponse;
 
 class KanbanController extends Controller
@@ -48,13 +48,17 @@ public function store(KanbanRequest $request): JsonResponse
         if ($isMatriz && ($data['scope'] ?? null) === 'all') {
             $unitIds = Unit::query()->pluck('id');
             $created = [];
+
             foreach ($unitIds as $unitId) {
                 $card = $this->service->create(array_merge($data, [
                     'target_unit_id' => $unitId,
                 ]));
+
                 $this->notifyKanbanCreated($card);
+
                 $created[] = $card;
             }
+
             return $this->successResponse(
                 payload: KanbanResource::collection($created),
                 message: __('messages.created'),
@@ -75,7 +79,9 @@ public function store(KanbanRequest $request): JsonResponse
         }
 
         $item = $this->service->create($data);
+
         $this->notifyKanbanCreated($item);
+
         return $this->successResponse(
             payload: new KanbanResource($item),
             message: __('messages.created'),
@@ -83,35 +89,6 @@ public function store(KanbanRequest $request): JsonResponse
         );
     }
 
-    /**
-     * Notifica o outro lado quando uma atividade é criada:
-     * franqueada → matriz; matriz → unidade alvo.
-     */
-    private function notifyKanbanCreated(\App\Models\Kanban $card): void
-    {
-        if ($card->origin === 'unit') {
-            $unitId     = $card->unit_id;
-            $recipients = $this->notifications->matrizUserIds();
-        } else {
-            $unitId     = $card->target_unit_id;
-            $recipients = $this->notifications->unitUserIds($unitId);
-        }
-
-        $this->notifications->dispatch([
-            'origin_table'       => 'kanbans',
-            'origin_id'          => $card->id,
-            'unit_id'            => $unitId,
-            'type'               => NotificationType::KANBAN_CREATED->value,
-            'title'              => 'Nova atividade',
-            'message'            => $card->title,
-            'url'                => '/kanban',
-            'action_text'        => 'Ver atividade',
-            'priority'           => $card->priority === 'alta' ? 'high' : 'normal',
-            'created_by_user_id' => $card->created_by_user_id,
-            'recipient_user_ids' => $recipients,
-        ]);
-    }
-
     public function show(int $id): JsonResponse
     {
         $item = $this->service->findById($id);
@@ -130,14 +107,47 @@ public function destroy(int $id): JsonResponse
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
 
+    //
+
     public function reorder(KanbanReorderRequest $request): JsonResponse
     {
         $this->service->reorder($request->validated()['items']);
         return $this->successResponse(message: __('messages.updated'));
     }
 
+    //
+
     private function isMatriz(\App\Models\User $user): bool
     {
         return $user->user_type === 'ADMIN';
     }
+
+    /**
+     * Notifica o outro lado quando uma atividade é criada:
+     * franqueada → matriz; matriz → unidade alvo.
+     */
+    private function notifyKanbanCreated(\App\Models\Kanban $card): void
+    {
+        if ($card->origin === 'unit') {
+            $unitId     = $card->unit_id;
+            $recipients = $this->notifications->matrizUserIds();
+        } else {
+            $unitId     = $card->target_unit_id;
+            $recipients = $this->notifications->unitUserIds($unitId);
+        }
+
+        $this->notifications->dispatch([
+            'origin_table'       => 'kanbans',
+            'origin_id'          => $card->id,
+            'unit_id'            => $unitId,
+            'type'               => NotificationType::KANBAN_CREATED->value,
+            'title'              => 'Nova atividade',
+            'message'            => $card->title,
+            'url'                => '/kanban',
+            'action_text'        => 'Ver atividade',
+            'priority'           => $card->priority === 'alta' ? 'high' : 'normal',
+            'created_by_user_id' => $card->created_by_user_id,
+            'recipient_user_ids' => $recipients,
+        ]);
+    }
 }

+ 1 - 1
app/Http/Controllers/KanbanMediaController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\KanbanMediaService;
 use App\Http\Requests\KanbanMediaRequest;
 use App\Http\Resources\KanbanMediaResource;
+use App\Services\KanbanMediaService;
 use Illuminate\Http\JsonResponse;
 
 class KanbanMediaController extends Controller

+ 14 - 14
app/Http/Controllers/KanbanReplyController.php

@@ -3,11 +3,11 @@
 namespace App\Http\Controllers;
 
 use App\Enums\NotificationType;
+use App\Http\Requests\KanbanReplyRequest;
+use App\Http\Resources\KanbanReplyResource;
 use App\Models\Kanban;
 use App\Services\KanbanReplyService;
 use App\Services\NotificationService;
-use App\Http\Requests\KanbanReplyRequest;
-use App\Http\Resources\KanbanReplyResource;
 use Illuminate\Http\JsonResponse;
 
 class KanbanReplyController extends Controller
@@ -30,6 +30,18 @@ public function store(KanbanReplyRequest $request, int $kanbanId): JsonResponse
         return $this->successResponse(payload: new KanbanReplyResource($reply), message: __('messages.created'), code: 201);
     }
 
+    public function update(KanbanReplyRequest $request, int $kanbanId, int $id): JsonResponse
+    {
+        $reply = $this->service->update($kanbanId, $id, $request->validated()['reply']);
+        return $this->successResponse(payload: new KanbanReplyResource($reply), message: __('messages.updated'));
+    }
+
+    public function destroy(int $kanbanId, int $id): JsonResponse
+    {
+        $this->service->delete($kanbanId, $id);
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+
     /**
      * Notifica o outro lado da atividade quando há um novo comentário.
      * Autor da matriz → unidade da atividade; autor da unidade → matriz.
@@ -65,16 +77,4 @@ private function notifyReplyCreated(int $kanbanId): void
             'recipient_user_ids' => $recipients,
         ]);
     }
-
-    public function update(KanbanReplyRequest $request, int $kanbanId, int $id): JsonResponse
-    {
-        $reply = $this->service->update($kanbanId, $id, $request->validated()['reply']);
-        return $this->successResponse(payload: new KanbanReplyResource($reply), message: __('messages.updated'));
-    }
-
-    public function destroy(int $kanbanId, int $id): JsonResponse
-    {
-        $this->service->delete($kanbanId, $id);
-        return $this->successResponse(message: __('messages.deleted'), code: 204);
-    }
 }

+ 30 - 30
app/Http/Controllers/NotificationController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\NotificationService;
 use App\Http\Requests\NotificationRequest;
 use App\Http\Resources\NotificationResource;
+use App\Services\NotificationService;
 use Illuminate\Http\JsonResponse;
 
 class NotificationController extends Controller
@@ -19,35 +19,6 @@ public function index(): JsonResponse
         return $this->successResponse(payload: NotificationResource::collection($items));
     }
 
-    /** Notificações do usuário logado (sino). */
-    public function me(): JsonResponse
-    {
-        $items = $this->service->forUser(auth()->id());
-        return $this->successResponse(payload: NotificationResource::collection($items));
-    }
-
-    /** Contador de não lidas do usuário logado. */
-    public function unreadCount(): JsonResponse
-    {
-        return $this->successResponse(
-            payload: ['count' => $this->service->unreadCount(auth()->id())]
-        );
-    }
-
-    /** Marca uma notificação como lida para o usuário logado. */
-    public function markRead(int $id): JsonResponse
-    {
-        $this->service->markRead($id, auth()->id());
-        return $this->successResponse(message: __('messages.updated'));
-    }
-
-    /** Marca todas as notificações do usuário logado como lidas. */
-    public function markAllRead(): JsonResponse
-    {
-        $this->service->markAllRead(auth()->id());
-        return $this->successResponse(message: __('messages.updated'));
-    }
-
     public function store(NotificationRequest $request): JsonResponse
     {
         $item = $this->service->create($request->validated());
@@ -71,4 +42,33 @@ public function destroy(int $id): JsonResponse
         $this->service->delete($id);
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
+
+    /** Notificações do usuário logado (sino). */
+    public function me(): JsonResponse
+    {
+        $items = $this->service->forUser(auth()->id());
+        return $this->successResponse(payload: NotificationResource::collection($items));
+    }
+
+    /** Marca uma notificação como lida para o usuário logado. */
+    public function markRead(int $id): JsonResponse
+    {
+        $this->service->markRead($id, auth()->id());
+        return $this->successResponse(message: __('messages.updated'));
+    }
+
+    /** Marca todas as notificações do usuário logado como lidas. */
+    public function markAllRead(): JsonResponse
+    {
+        $this->service->markAllRead(auth()->id());
+        return $this->successResponse(message: __('messages.updated'));
+    }
+
+    /** Contador de não lidas do usuário logado. */
+    public function unreadCount(): JsonResponse
+    {
+        return $this->successResponse(
+            payload: ['count' => $this->service->unreadCount(auth()->id())]
+        );
+    }
 }

+ 16 - 14
app/Http/Controllers/ProductController.php

@@ -2,13 +2,13 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\ProductService;
 use App\Http\Requests\ProductRequest;
 use App\Http\Requests\ProductStockRequest;
-use Illuminate\Http\Request;
-use PhpOffice\PhpSpreadsheet\IOFactory;
 use App\Http\Resources\ProductResource;
+use App\Services\ProductService;
 use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Request;
+use PhpOffice\PhpSpreadsheet\IOFactory;
 
 class ProductController extends Controller
 {
@@ -46,6 +46,19 @@ public function destroy(int $id): JsonResponse
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
 
+    //
+
+    public function adjustStock(ProductStockRequest $request, int $id): JsonResponse
+    {
+        $result = $this->service->adjustStock($id, $request->type, $request->quantity);
+
+        if (isset($result['error'])) {
+            return $this->errorResponse($result['error'], 422);
+        }
+
+        return $this->successResponse(payload: new ProductResource($result['product']), message: __('messages.updated'));
+    }
+
     public function import(Request $request): JsonResponse
     {
         $request->validate(['file' => 'required|file|mimes:xlsx,xls,csv']);
@@ -90,15 +103,4 @@ public function import(Request $request): JsonResponse
 
         return $this->successResponse(payload: $imported);
     }
-
-    public function adjustStock(ProductStockRequest $request, int $id): JsonResponse
-    {
-        $result = $this->service->adjustStock($id, $request->type, $request->quantity);
-
-        if (isset($result['error'])) {
-            return $this->errorResponse($result['error'], 422);
-        }
-
-        return $this->successResponse(payload: new ProductResource($result['product']), message: __('messages.updated'));
-    }
 }

+ 58 - 58
app/Http/Controllers/SelectController.php

@@ -35,20 +35,6 @@ class SelectController extends Controller
 {
     use ResolvesActiveUnit;
 
-    public function countries(): JsonResponse
-    {
-        return $this->items(CountrySelectResource::collection(Country::orderBy('name')->get()));
-    }
-
-    public function states(): JsonResponse
-    {
-        $items = State::query()
-            ->when(request()->integer('country_id'), fn ($query, $id) => $query->where('country_id', $id))
-            ->orderBy('name')->get();
-
-        return $this->items(StateSelectResource::collection($items));
-    }
-
     public function cities(): JsonResponse
     {
         $items = City::query()
@@ -59,33 +45,43 @@ public function cities(): JsonResponse
         return $this->items(CitySelectResource::collection($items));
     }
 
-    public function units(): JsonResponse
+    public function countries(): JsonResponse
     {
-        return $this->items(UnitSelectResource::collection(Unit::orderBy('fantasy_name')->get()));
+        return $this->items(CountrySelectResource::collection(Country::orderBy('name')->get()));
     }
 
-    public function groups(): JsonResponse
+    public function financialPlanAccounts(): JsonResponse
     {
-        return $this->items(GroupSelectResource::collection(Group::with('units:id')->orderBy('name')->get()));
+        $unitId = $this->activeUnitId();
+        $items = FinancialPlanAccount::query()
+            ->when(
+                $unitId,
+                fn ($query) => $query->where(fn ($scope) => $scope->where('unit_id', $unitId)->orWhereNull('unit_id')),
+                fn ($query) => $query->whereNull('unit_id'),
+            )
+            ->orderBy('code')->get();
+
+        return $this->items(FinancialPlanAccountSelectResource::collection($items));
     }
 
-    public function products(): JsonResponse
+    public function franchiseePackages(): JsonResponse
     {
-        $items = Product::query()
-            ->when(request()->boolean('visible_franchisee'), fn ($query) => $query->where('visible_franchisee', true))
-            ->orderBy('name')->get();
+        $unitId = $this->activeUnitId();
+        $items = $unitId
+            ? ClassPackageUnit::with('variations')->where('unit_id', $unitId)->where('visible', true)->orderBy('name')->get()
+            : collect();
 
-        return $this->items(ProductSelectResource::collection($items));
+        return $this->items(PackageSelectResource::collection($items));
     }
 
-    public function franchiseePackages(): JsonResponse
+    public function franchiseeStudents(): JsonResponse
     {
         $unitId = $this->activeUnitId();
         $items = $unitId
-            ? ClassPackageUnit::where('unit_id', $unitId)->where('visible', true)->orderBy('name')->get()
+            ? Student::where('unit_id', $unitId)->orderBy('name')->get()
             : collect();
 
-        return $this->items(PackageSelectResource::collection($items));
+        return $this->items(StudentSelectResource::collection($items));
     }
 
     public function franchiseeUsers(): JsonResponse
@@ -108,14 +104,44 @@ public function franchiseeUsers(): JsonResponse
         return $this->items(UserSelectResource::collection($items));
     }
 
-    public function franchiseeStudents(): JsonResponse
+    public function groups(): JsonResponse
     {
-        $unitId = $this->activeUnitId();
-        $items = $unitId
-            ? Student::where('unit_id', $unitId)->orderBy('name')->get()
-            : collect();
+        return $this->items(GroupSelectResource::collection(Group::with('units:id')->orderBy('name')->get()));
+    }
 
-        return $this->items(StudentSelectResource::collection($items));
+    public function inhabitantClassifications(): JsonResponse
+    {
+        return $this->items(InhabitantClassificationSelectResource::collection(
+            InhabitantClassification::with('municipalitySize')->orderBy('description')->get()
+        ));
+    }
+
+    public function municipalitySizes(): JsonResponse
+    {
+        return $this->items(MunicipalitySizeSelectResource::collection(MunicipalitySize::orderBy('id')->get()));
+    }
+
+    public function products(): JsonResponse
+    {
+        $items = Product::query()
+            ->when(request()->boolean('visible_franchisee'), fn ($query) => $query->where('visible_franchisee', true))
+            ->orderBy('name')->get();
+
+        return $this->items(ProductSelectResource::collection($items));
+    }
+
+    public function states(): JsonResponse
+    {
+        $items = State::query()
+            ->when(request()->integer('country_id'), fn ($query, $id) => $query->where('country_id', $id))
+            ->orderBy('name')->get();
+
+        return $this->items(StateSelectResource::collection($items));
+    }
+
+    public function units(): JsonResponse
+    {
+        return $this->items(UnitSelectResource::collection(Unit::orderBy('fantasy_name')->get()));
     }
 
     public function userTypes(): JsonResponse
@@ -138,32 +164,6 @@ public function userTypes(): JsonResponse
         return $this->items(UserTypeSelectResource::collection($items));
     }
 
-    public function inhabitantClassifications(): JsonResponse
-    {
-        return $this->items(InhabitantClassificationSelectResource::collection(
-            InhabitantClassification::with('municipalitySize')->orderBy('description')->get()
-        ));
-    }
-
-    public function municipalitySizes(): JsonResponse
-    {
-        return $this->items(MunicipalitySizeSelectResource::collection(MunicipalitySize::orderBy('id')->get()));
-    }
-
-    public function financialPlanAccounts(): JsonResponse
-    {
-        $unitId = $this->activeUnitId();
-        $items = FinancialPlanAccount::query()
-            ->when(
-                $unitId,
-                fn ($query) => $query->where(fn ($scope) => $scope->where('unit_id', $unitId)->orWhereNull('unit_id')),
-                fn ($query) => $query->whereNull('unit_id'),
-            )
-            ->orderBy('code')->get();
-
-        return $this->items(FinancialPlanAccountSelectResource::collection($items));
-    }
-
     private function items($items): JsonResponse
     {
         return $this->successResponse(payload: $items);

+ 3 - 1
app/Http/Controllers/StateController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\StateService;
 use App\Http\Requests\StateRequest;
 use App\Http\Resources\StateResource;
+use App\Services\StateService;
 use Illuminate\Http\JsonResponse;
 
 class StateController extends Controller
@@ -22,6 +22,7 @@ public function index(): JsonResponse
     public function store(StateRequest $request): JsonResponse
     {
         $item = $this->service->create($request->validated());
+
         return $this->successResponse(
             payload: new StateResource($item),
             message: __("messages.created"),
@@ -38,6 +39,7 @@ public function show(int $id): JsonResponse
     public function update(StateRequest $request, int $id): JsonResponse
     {
         $item = $this->service->update($id, $request->validated());
+
         return $this->successResponse(
             payload: new StateResource($item),
             message: __("messages.updated"),

+ 1 - 0
app/Http/Controllers/StudentController.php

@@ -73,6 +73,7 @@ public function show(int $id): JsonResponse
     public function update(StudentRequest $request, int $id): JsonResponse
     {
         $item = $this->service->update($id, $request->validated());
+
         return $this->successResponse(
             payload: new StudentResource($item),
             message: __('messages.updated'),

+ 1 - 1
app/Http/Controllers/StudentHistoryController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\StudentHistoryService;
 use App\Http\Requests\StudentHistoryRequest;
 use App\Http\Resources\StudentHistoryResource;
+use App\Services\StudentHistoryService;
 use Illuminate\Http\JsonResponse;
 
 class StudentHistoryController extends Controller

+ 1 - 1
app/Http/Controllers/StudentMediaController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\StudentMediaService;
 use App\Http\Requests\StudentMediaRequest;
 use App\Http\Resources\StudentMediaResource;
+use App\Services\StudentMediaService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 

+ 1 - 1
app/Http/Controllers/StudentResponsibleController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\StudentResponsibleService;
 use App\Http\Requests\StudentResponsibleRequest;
 use App\Http\Resources\StudentResponsibleResource;
+use App\Services\StudentResponsibleService;
 use Illuminate\Http\JsonResponse;
 
 class StudentResponsibleController extends Controller

+ 14 - 14
app/Http/Controllers/SupportReplyController.php

@@ -3,11 +3,11 @@
 namespace App\Http\Controllers;
 
 use App\Enums\NotificationType;
+use App\Http\Requests\SupportReplyRequest;
+use App\Http\Resources\SupportReplyResource;
 use App\Models\SupportTicket;
 use App\Services\NotificationService;
 use App\Services\SupportReplyService;
-use App\Http\Requests\SupportReplyRequest;
-use App\Http\Resources\SupportReplyResource;
 use Illuminate\Http\JsonResponse;
 
 class SupportReplyController extends Controller
@@ -30,6 +30,18 @@ public function store(SupportReplyRequest $request, int $ticketId): JsonResponse
         return $this->successResponse(payload: new SupportReplyResource($reply), message: __('messages.created'), code: 201);
     }
 
+    public function update(SupportReplyRequest $request, int $ticketId, int $id): JsonResponse
+    {
+        $reply = $this->service->update($ticketId, $id, $request->validated()['reply']);
+        return $this->successResponse(payload: new SupportReplyResource($reply), message: __('messages.updated'));
+    }
+
+    public function destroy(int $ticketId, int $id): JsonResponse
+    {
+        $this->service->delete($ticketId, $id);
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+
     /**
      * Notifica o outro lado do chamado quando há uma nova resposta.
      * Autor da matriz → unidade do chamado; autor da unidade → matriz.
@@ -65,16 +77,4 @@ private function notifyReplyCreated(int $ticketId): void
             'recipient_user_ids' => $recipients,
         ]);
     }
-
-    public function update(SupportReplyRequest $request, int $ticketId, int $id): JsonResponse
-    {
-        $reply = $this->service->update($ticketId, $id, $request->validated()['reply']);
-        return $this->successResponse(payload: new SupportReplyResource($reply), message: __('messages.updated'));
-    }
-
-    public function destroy(int $ticketId, int $id): JsonResponse
-    {
-        $this->service->delete($ticketId, $id);
-        return $this->successResponse(message: __('messages.deleted'), code: 204);
-    }
 }

+ 18 - 7
app/Http/Controllers/SupportTicketController.php

@@ -2,12 +2,12 @@
 
 namespace App\Http\Controllers;
 
-use App\Http\Controllers\Concerns\ResolvesActiveUnit;
 use App\Enums\NotificationType;
-use App\Services\NotificationService;
-use App\Services\SupportTicketService;
+use App\Http\Controllers\Concerns\ResolvesActiveUnit;
 use App\Http\Requests\SupportTicketRequest;
 use App\Http\Resources\SupportTicketResource;
+use App\Services\NotificationService;
+use App\Services\SupportTicketService;
 use Illuminate\Http\JsonResponse;
 
 class SupportTicketController extends Controller
@@ -22,6 +22,7 @@ public function __construct(
     public function index(): JsonResponse
     {
         $user = auth()->user();
+
         $query = \App\Models\SupportTicket::query()
             ->with(['applicantUnit', 'targetUnit'])
             ->orderBy('created_at', 'desc');
@@ -54,14 +55,18 @@ public function store(SupportTicketRequest $request): JsonResponse
             $batchId = (string) \Illuminate\Support\Str::uuid();
             $unitIds = \App\Models\Unit::query()->pluck('id');
             $created = [];
+
             foreach ($unitIds as $unitId) {
                 $ticket = $this->service->create(array_merge($data, [
                     'target_unit_id' => $unitId,
                     'batch_id' => $batchId,
                 ]));
+
                 $this->notifyTicketCreated($ticket);
+
                 $created[] = $ticket;
             }
+
             return $this->successResponse(
                 payload: SupportTicketResource::collection($created),
                 message: __('messages.created'),
@@ -83,7 +88,9 @@ public function store(SupportTicketRequest $request): JsonResponse
         }
 
         $item = $this->service->create($data);
+
         $this->notifyTicketCreated($item);
+
         return $this->successResponse(
             payload: new SupportTicketResource($item),
             message: __('messages.created'),
@@ -136,6 +143,7 @@ public function update(SupportTicketRequest $request, int $id): JsonResponse
         }
 
         $item = $this->service->update($id, $request->validated());
+
         return $this->successResponse(payload: new SupportTicketResource($item), message: __('messages.updated'));
     }
 
@@ -149,13 +157,11 @@ public function destroy(int $id): JsonResponse
         }
 
         $this->service->delete($id);
+
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
 
-    private function isMatriz(\App\Models\User $user): bool
-    {
-        return $user->user_type === 'ADMIN';
-    }
+    //
 
     private function canManage(\App\Models\User $user, \App\Models\SupportTicket $ticket): bool
     {
@@ -168,4 +174,9 @@ private function canManage(\App\Models\User $user, \App\Models\SupportTicket $ti
             && $ticket->scope === 'internal'
             && $ticket->applicant_unit_id === $this->activeUnitId($user);
     }
+
+    private function isMatriz(\App\Models\User $user): bool
+    {
+        return $user->user_type === 'ADMIN';
+    }
 }

+ 28 - 24
app/Http/Controllers/TbrCalculationController.php

@@ -22,21 +22,6 @@ public function index(Request $request): JsonResponse
         return $this->successResponse(payload: TbrCalculationResource::collection($items));
     }
 
-    public function preview(TbrCalculationRequest $request): JsonResponse
-    {
-        $payload = $this->service->preview($request->validated());
-        return $this->successResponse(payload: $payload);
-    }
-
-    public function previewBatch(TbrCalculationBatchRequest $request): JsonResponse
-    {
-        $payload = $this->service->previewBatch(
-            (int) $request->validated('reference_year'),
-            (int) $request->validated('reference_month'),
-        );
-        return $this->successResponse(payload: $payload);
-    }
-
     public function store(TbrCalculationRequest $request): JsonResponse
     {
         $item = $this->service->calculate($request->validated());
@@ -49,15 +34,7 @@ public function show(int $id): JsonResponse
         return $this->successResponse(payload: new TbrCalculationResource($item));
     }
 
-    public function generateReceivable(int $id): JsonResponse
-    {
-        $receive = $this->service->generateReceivable($id);
-        return $this->successResponse(
-            payload: new FranchiseeAccountReceiveResource($receive),
-            message: 'Conta a Receber gerada com sucesso.',
-            code: 201,
-        );
-    }
+    //
 
     public function generateBatch(TbrCalculationBatchRequest $request): JsonResponse
     {
@@ -78,4 +55,31 @@ public function generateBatch(TbrCalculationBatchRequest $request): JsonResponse
             code: 201,
         );
     }
+
+    public function generateReceivable(int $id): JsonResponse
+    {
+        $receive = $this->service->generateReceivable($id);
+
+        return $this->successResponse(
+            payload: new FranchiseeAccountReceiveResource($receive),
+            message: 'Conta a Receber gerada com sucesso.',
+            code: 201,
+        );
+    }
+
+    public function preview(TbrCalculationRequest $request): JsonResponse
+    {
+        $payload = $this->service->preview($request->validated());
+        return $this->successResponse(payload: $payload);
+    }
+
+    public function previewBatch(TbrCalculationBatchRequest $request): JsonResponse
+    {
+        $payload = $this->service->previewBatch(
+            (int) $request->validated('reference_year'),
+            (int) $request->validated('reference_month'),
+        );
+
+        return $this->successResponse(payload: $payload);
+    }
 }

+ 9 - 7
app/Http/Controllers/TbrController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\TbrService;
 use App\Http\Requests\TbrRequest;
 use App\Http\Resources\TbrResource;
+use App\Services\TbrService;
 use Illuminate\Http\JsonResponse;
 
 class TbrController extends Controller
@@ -13,12 +13,6 @@ public function __construct(
         protected TbrService $service,
     ) {}
 
-    public function current(): JsonResponse
-    {
-        $item = $this->service->getLatestCurrentYear();
-        return $this->successResponse(payload: $item ? new TbrResource($item) : null);
-    }
-
     public function index(): JsonResponse
     {
         $items = $this->service->getAll();
@@ -48,4 +42,12 @@ public function destroy(int $id): JsonResponse
         $this->service->delete($id);
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
+
+    //
+
+    public function current(): JsonResponse
+    {
+        $item = $this->service->getLatestCurrentYear();
+        return $this->successResponse(payload: $item ? new TbrResource($item) : null);
+    }
 }

+ 37 - 32
app/Http/Controllers/TreasuryAccountController.php

@@ -3,9 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\TreasuryAccountService;
 use App\Http\Requests\TreasuryAccountRequest;
 use App\Http\Resources\TreasuryAccountResource;
+use App\Services\TreasuryAccountService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 
@@ -17,11 +17,43 @@ public function __construct(
         protected TreasuryAccountService $service,
     ) {}
 
+    public function index(Request $request): JsonResponse
+    {
+        $unitId = $request->filled('unit_id') ? (int) $request->input('unit_id') : null;
+        $items = $this->service->getAll($unitId);
+        return $this->successResponse(payload: TreasuryAccountResource::collection($items));
+    }
+
+    public function store(TreasuryAccountRequest $request): JsonResponse
+    {
+        $item = $this->service->create($request->validated());
+        return $this->successResponse(payload: new TreasuryAccountResource($item), message: __('messages.created'), code: 201);
+    }
+
+    public function show(int $id): JsonResponse
+    {
+        $item = $this->service->findById($id);
+        return $this->successResponse(payload: new TreasuryAccountResource($item));
+    }
+
+    public function update(TreasuryAccountRequest $request, int $id): JsonResponse
+    {
+        $item = $this->service->update($id, $request->validated());
+        return $this->successResponse(payload: new TreasuryAccountResource($item), message: __('messages.updated'));
+    }
+
+    public function destroy(int $id): JsonResponse
+    {
+        $this->service->delete($id);
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+
     // --- Unidade ativa (Franchisee) ---
 
     public function indexMe(): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (!$unitId) {
             return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
         }
@@ -34,6 +66,7 @@ public function indexMe(): JsonResponse
     public function storeMe(TreasuryAccountRequest $request): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (!$unitId) {
             return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
         }
@@ -49,11 +82,13 @@ public function storeMe(TreasuryAccountRequest $request): JsonResponse
     public function updateMe(TreasuryAccountRequest $request, int $id): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (!$unitId || !$this->service->findByIdForUnit($id, $unitId)) {
             return $this->errorResponse(message: 'Conta não encontrada', code: 404);
         }
 
         $data = $request->validated();
+
         unset($data['unit_id']);
 
         $item = $this->service->update($id, $data);
@@ -64,6 +99,7 @@ public function updateMe(TreasuryAccountRequest $request, int $id): JsonResponse
     public function destroyMe(int $id): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (!$unitId || !$this->service->findByIdForUnit($id, $unitId)) {
             return $this->errorResponse(message: 'Conta não encontrada', code: 404);
         }
@@ -72,35 +108,4 @@ public function destroyMe(int $id): JsonResponse
 
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
-
-    public function index(Request $request): JsonResponse
-    {
-        $unitId = $request->filled('unit_id') ? (int) $request->input('unit_id') : null;
-        $items = $this->service->getAll($unitId);
-        return $this->successResponse(payload: TreasuryAccountResource::collection($items));
-    }
-
-    public function store(TreasuryAccountRequest $request): JsonResponse
-    {
-        $item = $this->service->create($request->validated());
-        return $this->successResponse(payload: new TreasuryAccountResource($item), message: __('messages.created'), code: 201);
-    }
-
-    public function show(int $id): JsonResponse
-    {
-        $item = $this->service->findById($id);
-        return $this->successResponse(payload: new TreasuryAccountResource($item));
-    }
-
-    public function update(TreasuryAccountRequest $request, int $id): JsonResponse
-    {
-        $item = $this->service->update($id, $request->validated());
-        return $this->successResponse(payload: new TreasuryAccountResource($item), message: __('messages.updated'));
-    }
-
-    public function destroy(int $id): JsonResponse
-    {
-        $this->service->delete($id);
-        return $this->successResponse(message: __('messages.deleted'), code: 204);
-    }
 }

+ 38 - 36
app/Http/Controllers/TreasuryLaunchController.php

@@ -19,11 +19,46 @@ public function __construct(
         protected TreasuryAccountService $accountService,
     ) {}
 
+    public function index(Request $request): JsonResponse
+    {
+        $accountId = $request->filled('account_id') ? (int) $request->input('account_id') : null;
+        $items = $this->service->getAll($accountId);
+
+        return $this->successResponse(payload: TreasuryLaunchResource::collection($items));
+    }
+
+    public function store(TreasuryLaunchRequest $request): JsonResponse
+    {
+        $item = $this->service->create($request->validated());
+        return $this->successResponse(payload: new TreasuryLaunchResource($item), message: __('messages.created'), code: 201);
+    }
+
+    public function show(int $id): JsonResponse
+    {
+        $item = $this->service->findById($id);
+
+        return $this->successResponse(payload: new TreasuryLaunchResource($item));
+    }
+
+    public function update(TreasuryLaunchRequest $request, int $id): JsonResponse
+    {
+        $item = $this->service->update($id, $request->validated());
+        return $this->successResponse(payload: new TreasuryLaunchResource($item), message: __('messages.updated'));
+    }
+
+    public function destroy(int $id): JsonResponse
+    {
+        $this->service->delete($id);
+
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+    
     // --- Unidade ativa (Franchisee): extrato e movimentação manual ---
 
     public function indexMe(Request $request): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (! $unitId) {
             return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
         }
@@ -43,6 +78,7 @@ public function indexMe(Request $request): JsonResponse
     public function storeMe(TreasuryLaunchRequest $request): JsonResponse
     {
         $unitId = $this->activeUnitId();
+
         if (! $unitId) {
             return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
         }
@@ -63,9 +99,11 @@ public function updateMe(TreasuryLaunchRequest $request, int $id): JsonResponse
     {
         $unitId = $this->activeUnitId();
         $item = $this->service->findById($id);
+
         $currentAccountId = $item?->transaction_type === 'entrada'
             ? $item?->to_account_id
             : $item?->from_account_id;
+
         $accountId = $request->integer('account_id') ?: $currentAccountId;
 
         if (! $unitId || ! $item || ! $currentAccountId
@@ -93,40 +131,4 @@ public function destroyMe(int $id): JsonResponse
 
         return $this->successResponse(message: __('messages.deleted'), code: 204);
     }
-
-    public function index(Request $request): JsonResponse
-    {
-        $accountId = $request->filled('account_id') ? (int) $request->input('account_id') : null;
-        $items = $this->service->getAll($accountId);
-
-        return $this->successResponse(payload: TreasuryLaunchResource::collection($items));
-    }
-
-    public function store(TreasuryLaunchRequest $request): JsonResponse
-    {
-        $item = $this->service->create($request->validated());
-
-        return $this->successResponse(payload: new TreasuryLaunchResource($item), message: __('messages.created'), code: 201);
-    }
-
-    public function show(int $id): JsonResponse
-    {
-        $item = $this->service->findById($id);
-
-        return $this->successResponse(payload: new TreasuryLaunchResource($item));
-    }
-
-    public function update(TreasuryLaunchRequest $request, int $id): JsonResponse
-    {
-        $item = $this->service->update($id, $request->validated());
-
-        return $this->successResponse(payload: new TreasuryLaunchResource($item), message: __('messages.updated'));
-    }
-
-    public function destroy(int $id): JsonResponse
-    {
-        $this->service->delete($id);
-
-        return $this->successResponse(message: __('messages.deleted'), code: 204);
-    }
 }

+ 6 - 6
app/Http/Controllers/UnitAccountPayableController.php

@@ -49,7 +49,7 @@ public function storeMe(StoreUnitPayableRequest $request): JsonResponse
         );
     }
 
-    public function settleMe(SettlePayableRequest $request, int $id): JsonResponse
+    public function reopenMe(int $id): JsonResponse
     {
         $unitId = $this->activeUnitId();
 
@@ -63,15 +63,15 @@ public function settleMe(SettlePayableRequest $request, int $id): JsonResponse
             return $this->errorResponse(message: 'Conta a pagar não encontrada', code: 404);
         }
 
-        $item = $this->service->settle($payable, $request->validated());
+        $item = $this->service->reopen($payable);
 
         return $this->successResponse(
             payload: new UnitAccountPayableResource($item),
-            message: 'Baixa realizada com sucesso',
+            message: 'Conta reaberta',
         );
     }
 
-    public function reopenMe(int $id): JsonResponse
+    public function settleMe(SettlePayableRequest $request, int $id): JsonResponse
     {
         $unitId = $this->activeUnitId();
 
@@ -85,11 +85,11 @@ public function reopenMe(int $id): JsonResponse
             return $this->errorResponse(message: 'Conta a pagar não encontrada', code: 404);
         }
 
-        $item = $this->service->reopen($payable);
+        $item = $this->service->settle($payable, $request->validated());
 
         return $this->successResponse(
             payload: new UnitAccountPayableResource($item),
-            message: 'Conta reaberta',
+            message: 'Baixa realizada com sucesso',
         );
     }
 }

+ 1 - 1
app/Http/Controllers/UnitContractController.php

@@ -2,9 +2,9 @@
 
 namespace App\Http\Controllers;
 
-use App\Services\UnitContractService;
 use App\Http\Requests\UnitContractRequest;
 use App\Http\Resources\UnitContractResource;
+use App\Services\UnitContractService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 

+ 1 - 1
app/Http/Controllers/UnitController.php

@@ -3,9 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\UnitService;
 use App\Http\Requests\UnitRequest;
 use App\Http\Resources\UnitResource;
+use App\Services\UnitService;
 use Illuminate\Http\JsonResponse;
 
 class UnitController extends Controller

+ 16 - 13
app/Http/Controllers/UnitFinancialController.php

@@ -3,9 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\UnitFinancialService;
 use App\Http\Requests\UnitFinancialRequest;
 use App\Http\Resources\UnitFinancialResource;
+use App\Services\UnitFinancialService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 
@@ -23,6 +23,20 @@ public function show(Request $request): JsonResponse
         return $this->successResponse(payload: $item ? new UnitFinancialResource($item) : null);
     }
 
+    public function upsert(UnitFinancialRequest $request): JsonResponse
+    {
+        $validated = $request->validated();
+        $unitId    = $validated['unit_id'];
+
+        unset($validated['unit_id']);
+
+        $item = $this->service->upsert($unitId, $validated);
+
+        return $this->successResponse(payload: new UnitFinancialResource($item), message: __('messages.updated'));
+    }
+
+    //
+
     public function showMe(): JsonResponse
     {
         $unitId = $this->activeUnitId();
@@ -36,18 +50,6 @@ public function showMe(): JsonResponse
         return $this->successResponse(payload: $item ? new UnitFinancialResource($item) : null);
     }
 
-    public function upsert(UnitFinancialRequest $request): JsonResponse
-    {
-        $validated = $request->validated();
-        $unitId    = $validated['unit_id'];
-
-        unset($validated['unit_id']);
-
-        $item = $this->service->upsert($unitId, $validated);
-
-        return $this->successResponse(payload: new UnitFinancialResource($item), message: __('messages.updated'));
-    }
-
     public function upsertMe(UnitFinancialRequest $request): JsonResponse
     {
         $unitId = $this->activeUnitId();
@@ -57,6 +59,7 @@ public function upsertMe(UnitFinancialRequest $request): JsonResponse
         }
 
         $validated = $request->validated();
+
         unset($validated['unit_id']);
 
         $item = $this->service->upsert($unitId, $validated);

+ 1 - 1
app/Http/Controllers/UnitHistoryController.php

@@ -3,9 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\UnitHistoryService;
 use App\Http\Requests\UnitHistoryRequest;
 use App\Http\Resources\UnitHistoryResource;
+use App\Services\UnitHistoryService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 

+ 1 - 1
app/Http/Controllers/UnitMediaController.php

@@ -3,9 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\UnitMediaService;
 use App\Http\Requests\UnitMediaRequest;
 use App\Http\Resources\UnitMediaResource;
+use App\Services\UnitMediaService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 

+ 1 - 1
app/Http/Controllers/UnitPartnerController.php

@@ -3,9 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\UnitPartnerService;
 use App\Http\Requests\UnitPartnerRequest;
 use App\Http\Resources\UnitPartnerResource;
+use App\Services\UnitPartnerService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 

+ 21 - 18
app/Http/Controllers/UnitReceivableController.php

@@ -33,6 +33,7 @@ public function indexMe(Request $request): JsonResponse
         // normalizados e ordenados por vencimento. 'source' distingue a origem.
         $installments = UnitReceivableResource::collection($this->service->list($unitId, $filters))
             ->toArray($request);
+
         $manual = UnitAccountReceivableResource::collection($this->service->listManual($unitId, $filters))
             ->toArray($request);
 
@@ -61,7 +62,9 @@ public function storeManualMe(StoreUnitReceivableRequest $request): JsonResponse
         );
     }
 
-    public function settleManualMe(SettleReceivableRequest $request, int $id): JsonResponse
+    //
+
+    public function chargeMe(int $id): JsonResponse
     {
         $unitId = $this->activeUnitId();
 
@@ -69,17 +72,17 @@ public function settleManualMe(SettleReceivableRequest $request, int $id): JsonR
             return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
         }
 
-        $receivable = $this->service->findManualForUnit($id, $unitId);
+        $installment = $this->service->findForUnit($id, $unitId);
 
-        if (!$receivable) {
+        if (!$installment) {
             return $this->errorResponse(message: 'Recebível não encontrado', code: 404);
         }
 
-        $item = $this->service->settleManual($receivable, $request->validated());
+        $item = $this->service->generateCharge($installment);
 
         return $this->successResponse(
-            payload: new UnitAccountReceivableResource($item),
-            message: 'Baixa realizada com sucesso',
+            payload: new UnitReceivableResource($item),
+            message: 'Cobrança gerada no Asaas',
         );
     }
 
@@ -105,7 +108,7 @@ public function reopenManualMe(int $id): JsonResponse
         );
     }
 
-    public function settleMe(SettleReceivableRequest $request, int $id): JsonResponse
+    public function reopenMe(int $id): JsonResponse
     {
         $unitId = $this->activeUnitId();
 
@@ -119,15 +122,15 @@ public function settleMe(SettleReceivableRequest $request, int $id): JsonRespons
             return $this->errorResponse(message: 'Recebível não encontrado', code: 404);
         }
 
-        $item = $this->service->settle($installment, $request->validated());
+        $item = $this->service->reopen($installment);
 
         return $this->successResponse(
             payload: new UnitReceivableResource($item),
-            message: 'Baixa realizada com sucesso',
+            message: 'Recebível reaberto',
         );
     }
 
-    public function chargeMe(int $id): JsonResponse
+    public function settleManualMe(SettleReceivableRequest $request, int $id): JsonResponse
     {
         $unitId = $this->activeUnitId();
 
@@ -135,21 +138,21 @@ public function chargeMe(int $id): JsonResponse
             return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
         }
 
-        $installment = $this->service->findForUnit($id, $unitId);
+        $receivable = $this->service->findManualForUnit($id, $unitId);
 
-        if (!$installment) {
+        if (!$receivable) {
             return $this->errorResponse(message: 'Recebível não encontrado', code: 404);
         }
 
-        $item = $this->service->generateCharge($installment);
+        $item = $this->service->settleManual($receivable, $request->validated());
 
         return $this->successResponse(
-            payload: new UnitReceivableResource($item),
-            message: 'Cobrança gerada no Asaas',
+            payload: new UnitAccountReceivableResource($item),
+            message: 'Baixa realizada com sucesso',
         );
     }
 
-    public function reopenMe(int $id): JsonResponse
+    public function settleMe(SettleReceivableRequest $request, int $id): JsonResponse
     {
         $unitId = $this->activeUnitId();
 
@@ -163,11 +166,11 @@ public function reopenMe(int $id): JsonResponse
             return $this->errorResponse(message: 'Recebível não encontrado', code: 404);
         }
 
-        $item = $this->service->reopen($installment);
+        $item = $this->service->settle($installment, $request->validated());
 
         return $this->successResponse(
             payload: new UnitReceivableResource($item),
-            message: 'Recebível reaberto',
+            message: 'Baixa realizada com sucesso',
         );
     }
 }

+ 32 - 14
app/Http/Controllers/UserController.php

@@ -3,9 +3,9 @@
 namespace App\Http\Controllers;
 
 use App\Http\Controllers\Concerns\ResolvesActiveUnit;
-use App\Services\UserService;
 use App\Http\Requests\UserRequest;
 use App\Http\Resources\UserResource;
+use App\Services\UserService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Support\Facades\Auth;
 
@@ -30,22 +30,15 @@ public function index(): JsonResponse
         );
     }
 
-    public function indexByUnit(): JsonResponse
-    {
-        $items = $this->service->getAllByUnit();
-
-        return $this->successResponse(
-            payload: UserResource::collection($items),
-        );
-    }
-
     public function store(UserRequest $request): JsonResponse
     {
         $data = $request->validated();
+
         if ($this->isFranchiseeUsersRequest()) {
             $data['unit_id'] = $this->activeUnitId();
             $data['access_scope'] = 'unit';
         }
+
         $item = $this->service->create($data);
 
         return $this->successResponse(
@@ -58,20 +51,27 @@ public function store(UserRequest $request): JsonResponse
     public function show(int $id): JsonResponse
     {
         $item = $this->service->findById($id);
+
         $this->authorizeFranchiseeUser($item);
+
         return $this->successResponse(payload: new UserResource($item));
     }
 
     public function update(UserRequest $request, int $id): JsonResponse
     {
         $current = $this->service->findById($id);
+
         $this->authorizeFranchiseeUser($current);
+
         $data = $request->validated();
+
         if ($this->isFranchiseeUsersRequest()) {
             $data['unit_id'] = $this->activeUnitId();
             $data['access_scope'] = 'unit';
         }
+
         $item = $this->service->update($id, $data);
+
         return $this->successResponse(
             payload: new UserResource($item),
             message: __("messages.updated"),
@@ -88,6 +88,19 @@ public function destroy(int $id): JsonResponse
         );
     }
 
+    //
+
+    public function indexByUnit(): JsonResponse
+    {
+        $items = $this->service->getAllByUnit();
+
+        return $this->successResponse(
+            payload: UserResource::collection($items),
+        );
+    }
+
+    //
+
     public function updateMe(UserRequest $request): JsonResponse
     {
         $user = Auth::user();
@@ -100,10 +113,7 @@ public function updateMe(UserRequest $request): JsonResponse
         );
     }
 
-    private function isFranchiseeUsersRequest(): bool
-    {
-        return request()->is('api/franchisee/users*');
-    }
+    //
 
     private function authorizeFranchiseeUser(?\App\Models\User $user): void
     {
@@ -112,7 +122,9 @@ private function authorizeFranchiseeUser(?\App\Models\User $user): void
         }
 
         abort_unless($user, 404);
+
         $unitId = request()->input('active_unit_id');
+
         abort_unless($unitId && $user->units()->where('units.id', $unitId)->exists(), 404);
 
         $role = \App\Models\UnitUser::query()
@@ -120,6 +132,12 @@ private function authorizeFranchiseeUser(?\App\Models\User $user): void
             ->where('user_id', $user->id)
             ->with('userType')
             ->first()?->userType;
+
         abort_if($role?->system_key === 'ADMIN_FRANCHISEE', 403, 'Administradores do sistema não podem ser editados.');
     }
+
+    private function isFranchiseeUsersRequest(): bool
+    {
+        return request()->is('api/franchisee/users*');
+    }
 }

+ 10 - 7
app/Http/Controllers/UserTypeController.php

@@ -2,13 +2,13 @@
 
 namespace App\Http\Controllers;
 
+use App\Models\Permission;
 use App\Services\PermissionService;
 use App\Services\UserTypePermissionService;
 use App\Services\UserTypeService;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 use Illuminate\Validation\Rule;
-use App\Models\Permission;
 
 class UserTypeController extends Controller
 {
@@ -156,6 +156,7 @@ public function updatePermissions(Request $request, int $id): JsonResponse
         abort_if($userType->is_system, 422, 'As permissões de administradores do sistema não podem ser alteradas.');
 
         $permissionIds = collect($data['permissions'])->pluck('permission_id')->unique();
+
         $validPermissionIds = Permission::query()
             ->whereIn('id', $permissionIds)
             ->when($this->isUnitContext(), fn ($query) => $query->where('scope', 'like', 'franchisee\_%'))
@@ -169,12 +170,7 @@ public function updatePermissions(Request $request, int $id): JsonResponse
         return $this->successResponse(message: __('messages.updated'));
     }
 
-    private function scopeKey(): string
-    {
-        $unitId = request()->input('active_unit_id');
-
-        return $unitId ? "unit:{$unitId}" : 'franchisor';
-    }
+    //
 
     private function isUnitContext(): bool
     {
@@ -186,4 +182,11 @@ private function isUnitContext(): bool
 
         return request()->filled('active_unit_id');
     }
+
+    private function scopeKey(): string
+    {
+        $unitId = request()->input('active_unit_id');
+
+        return $unitId ? "unit:{$unitId}" : 'franchisor';
+    }
 }

+ 2 - 0
app/Http/Controllers/UserTypePermissionController.php

@@ -23,9 +23,11 @@ public function allPermissionsByUserType(): JsonResponse
     {
         $user = Auth::user();
         $userType = $user->activeUserType();
+
         $userTypePermission = $userType
             ? $this->userTypePermissionService->allPermissionsByUserTypeId($userType->id)
             : collect();
+
         return $this->successResponse(payload: UserTypePermissionResource::collection($userTypePermission));
     }
 }

+ 3 - 2
app/Http/Controllers/Webhooks/AsaasWebhookController.php

@@ -16,6 +16,7 @@ public function handle(Request $request): JsonResponse
 
         if (empty($expectedToken)) {
             Log::warning('Asaas Webhook: ASAAS_WEBHOOK_TOKEN não está configurado no .env');
+
             return response()->json(['error' => 'Webhook não configurado'], 500);
         }
 
@@ -24,7 +25,7 @@ public function handle(Request $request): JsonResponse
         if ($receivedToken !== $expectedToken) {
             Log::warning('Asaas Webhook: token inválido recebido', [
                 'received' => substr($receivedToken ?? '', 0, 10) . '...',
-                'ip' => $request->ip(),
+                'ip'       => $request->ip(),
             ]);
 
             return response()->json(['error' => 'Unauthorized'], 401);
@@ -33,7 +34,7 @@ public function handle(Request $request): JsonResponse
         $payload = $request->all();
 
         Log::info('Asaas Webhook recebido', [
-            'event' => $payload['event'] ?? 'unknown',
+            'event'      => $payload['event'] ?? 'unknown',
             'payment_id' => $payload['payment']['id'] ?? null,
         ]);
 

+ 1 - 1
app/Http/Requests/CityRequest.php

@@ -2,8 +2,8 @@
 
 namespace App\Http\Requests;
 
-use Illuminate\Foundation\Http\FormRequest;
 use App\Enums\DefaultStatusEnum;
+use Illuminate\Foundation\Http\FormRequest;
 use Illuminate\Validation\Rule;
 
 class CityRequest extends FormRequest

+ 24 - 7
app/Http/Requests/ClassPackageUnitRequest.php

@@ -11,13 +11,10 @@ public function rules(): array
         $required = $this->isMethod('POST') ? 'required' : 'sometimes';
 
         return [
-            'name'                    => "$required|string|max:255",
-            'quantity_classes'        => "$required|integer|min:1",
-            'contract_value'          => 'nullable|numeric|min:0',
-            'contract_register_value' => 'nullable|numeric|min:0',
-            'contrat_discount_value'  => 'nullable|numeric|min:0',
-            'visible'                 => 'sometimes|boolean',
-            'class_duration_minutes'  => "$required|integer|min:1|max:1440",
+            'name'                   => "$required|string|max:255",
+            'quantity_classes'       => "$required|integer|min:1",
+            'visible'                => 'sometimes|boolean',
+            'class_duration_minutes' => "$required|integer|min:1|max:1440",
 
             // 'weekday'           => 'nullable|integer|min:0|max:6|required_with:start_time',
             // 'start_time'        => 'nullable|date_format:H:i|required_with:weekday',
@@ -28,6 +25,26 @@ public function rules(): array
             'materials.*.product_id' => 'required_with:materials|integer|exists:products,id',
             'materials.*.quantity'   => 'required_with:materials|integer|min:1',
             'materials.*.price'      => 'required_with:materials|numeric|min:0',
+
+            // propostas comerciais (pavao e irrecusavel), uma de cada tipo
+            // sem materials a proposta herda os materiais do pacote da unidade
+            // o material_value da proposta e sempre a soma da lista dela
+
+            'variations'                             => 'nullable|array',
+            'variations.*.type'                      => 'required_with:variations|string|in:pavao,irrecusavel|distinct',
+            'variations.*.register_value'            => 'required_with:variations|numeric|min:0',
+            'variations.*.register_installments_min' => 'required_with:variations|integer|min:1|max:60',
+            'variations.*.register_installments_max' => 'required_with:variations|integer|min:1|max:60|gte:variations.*.register_installments_min',
+            'variations.*.package_value'             => 'required_with:variations|numeric|min:0',
+            'variations.*.package_installments_min'  => 'required_with:variations|integer|min:1|max:60',
+            'variations.*.package_installments_max'  => 'required_with:variations|integer|min:1|max:60|gte:variations.*.package_installments_min',
+            'variations.*.discount_value'            => 'nullable|numeric|min:0',
+            'variations.*.material_installments_min' => 'required_with:variations|integer|min:1|max:60',
+            'variations.*.material_installments_max' => 'required_with:variations|integer|min:1|max:60|gte:variations.*.material_installments_min',
+            'variations.*.materials'                 => 'nullable|array',
+            'variations.*.materials.*.product_id'    => 'required_with:variations.*.materials|integer|exists:products,id',
+            'variations.*.materials.*.quantity'      => 'required_with:variations.*.materials|integer|min:1',
+            'variations.*.materials.*.price'         => 'required_with:variations.*.materials|numeric|min:0',
         ];
     }
 }

+ 45 - 0
app/Http/Requests/ClassPackageUnitVariationRequest.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Validation\Rule;
+
+class ClassPackageUnitVariationRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        $required = $this->isMethod('POST') ? 'required' : 'sometimes';
+
+        return [
+            // uma proposta de cada tipo por pacote da unidade
+
+            'type' => [
+                $required,
+                'string',
+                'in:pavao,irrecusavel',
+                Rule::unique('class_package_unit_variations')
+                    ->where('class_package_unit_id', $this->route('package'))
+                    ->ignore($this->route('id')),
+            ],
+
+            'register_value'            => "$required|numeric|min:0",
+            'register_installments_min' => "$required|integer|min:1|max:60",
+            'register_installments_max' => "$required|integer|min:1|max:60|gte:register_installments_min",
+            'package_value'             => "$required|numeric|min:0",
+            'package_installments_min'  => "$required|integer|min:1|max:60",
+            'package_installments_max'  => "$required|integer|min:1|max:60|gte:package_installments_min",
+            'discount_value'            => 'sometimes|nullable|numeric|min:0',
+            'material_installments_min' => "$required|integer|min:1|max:60",
+            'material_installments_max' => "$required|integer|min:1|max:60|gte:material_installments_min",
+
+            // sem materials na criacao a proposta herda os materiais do pacote
+            // o material_value e sempre a soma da lista, nunca vem na request
+
+            'materials'              => 'sometimes|nullable|array',
+            'materials.*.product_id' => 'required_with:materials|integer|exists:products,id',
+            'materials.*.quantity'   => 'required_with:materials|integer|min:1',
+            'materials.*.price'      => 'required_with:materials|numeric|min:0',
+        ];
+    }
+}

+ 1 - 1
app/Http/Requests/CountryRequest.php

@@ -2,8 +2,8 @@
 
 namespace App\Http\Requests;
 
-use Illuminate\Foundation\Http\FormRequest;
 use App\Enums\DefaultStatusEnum;
+use Illuminate\Foundation\Http\FormRequest;
 use Illuminate\Validation\Rule;
 
 class CountryRequest extends FormRequest

+ 1 - 1
app/Http/Requests/StateRequest.php

@@ -2,8 +2,8 @@
 
 namespace App\Http\Requests;
 
-use Illuminate\Foundation\Http\FormRequest;
 use App\Enums\DefaultStatusEnum;
+use Illuminate\Foundation\Http\FormRequest;
 use Illuminate\Validation\Rule;
 
 class StateRequest extends FormRequest

+ 66 - 26
app/Http/Requests/StudentContractRequest.php

@@ -3,6 +3,7 @@
 namespace App\Http\Requests;
 
 use App\Models\StudentContract;
+use App\Rules\StudentContractVariationConsistency;
 use Carbon\CarbonImmutable;
 use Illuminate\Foundation\Http\FormRequest;
 use Illuminate\Validation\Validator;
@@ -16,29 +17,33 @@ public function rules(): array
         $required = $this->isMethod('POST') ? 'required' : 'sometimes';
 
         return [
-            'student_id'             => "$required|exists:students,id",
-            'protocol'               => 'sometimes|nullable|string|max:255',
-            'signature_date'         => 'sometimes|nullable|date_format:Y-m-d',
-            'end_date'               => 'sometimes|nullable|date_format:Y-m-d',
-            'class_package_unit_id'  => "$required|exists:class_package_units,id",
-            'class_quantity'         => 'sometimes|nullable|integer|min:1',
-            'weekday'                => 'sometimes|nullable|integer|min:0|max:6',
-            'start_time'             => 'sometimes|nullable|date_format:H:i',
-            'end_time'               => 'sometimes|nullable|date_format:H:i',
-            'second_weekday'         => 'sometimes|nullable|integer|min:0|max:6',
-            'second_start_time'      => 'sometimes|nullable|date_format:H:i',
-            'second_end_time'        => 'sometimes|nullable|date_format:H:i',
-            'due_day'                => 'sometimes|nullable|integer|min:1|max:31',
-            'tax_register'           => 'sometimes|nullable|numeric|min:0',
-            'installments'           => 'sometimes|nullable|integer|min:1|max:12',
-            'enrollment_due_date'    => 'sometimes|nullable|date_format:Y-m-d',
-            'package_value'          => 'sometimes|nullable|numeric|min:0',
-            'package_installments'   => 'sometimes|nullable|integer|min:1|max:13',
-            'package_due_date'       => 'sometimes|nullable|date_format:Y-m-d',
-            'early_payment_discount' => 'sometimes|nullable|numeric|min:0|max:100',
-            'interest_rate'          => 'sometimes|nullable|numeric|min:0',
-            'payment_method'         => 'sometimes|nullable|string|in:pix,credit_card,debit_card',
-            'fine_cancelled'         => 'sometimes|nullable|numeric|min:0|max:100',
+            'student_id'                      => "$required|exists:students,id",
+            'protocol'                        => 'sometimes|nullable|string|max:255',
+            'signature_date'                  => 'sometimes|nullable|date_format:Y-m-d',
+            'end_date'                        => 'sometimes|nullable|date_format:Y-m-d',
+            'class_package_unit_id'           => "$required|exists:class_package_units,id",
+            'class_package_unit_variation_id' => 'sometimes|nullable|integer|min:1',
+            'class_quantity'                  => 'sometimes|nullable|integer|min:1',
+            'weekday'                         => 'sometimes|nullable|integer|min:0|max:6',
+            'start_time'                      => 'sometimes|nullable|date_format:H:i',
+            'end_time'                        => 'sometimes|nullable|date_format:H:i',
+            'second_weekday'                  => 'sometimes|nullable|integer|min:0|max:6',
+            'second_start_time'               => 'sometimes|nullable|date_format:H:i',
+            'second_end_time'                 => 'sometimes|nullable|date_format:H:i',
+            'due_day'                         => 'sometimes|nullable|integer|min:1|max:31',
+            'tax_register'                    => 'sometimes|nullable|numeric|min:0',
+            'installments'                    => 'sometimes|nullable|integer|min:1|max:60',
+            'enrollment_due_date'             => 'sometimes|nullable|date_format:Y-m-d',
+            'package_value'                   => 'sometimes|nullable|numeric|min:0',
+            'package_installments'            => 'sometimes|nullable|integer|min:1|max:60',
+            'package_due_date'                => 'sometimes|nullable|date_format:Y-m-d',
+            'material_value'                  => 'sometimes|nullable|numeric|min:0',
+            'material_installments'           => 'sometimes|nullable|integer|min:1|max:60',
+            'material_due_date'               => 'sometimes|nullable|date_format:Y-m-d',
+            'early_payment_discount'          => 'sometimes|nullable|numeric|min:0|max:100',
+            'interest_rate'                   => 'sometimes|nullable|numeric|min:0',
+            'payment_method'                  => 'sometimes|nullable|string|in:pix,credit_card,debit_card',
+            'fine_cancelled'                  => 'sometimes|nullable|numeric|min:0|max:100',
         ];
     }
 
@@ -50,11 +55,11 @@ function (Validator $validator): void {
 
                 if ($this->isMethod('POST')) {
                     $this->validateCreationPeriod($validator);
-
-                    return;
+                } else {
+                    $this->validateRenewalPeriod($validator);
                 }
 
-                $this->validateRenewalPeriod($validator);
+                $this->validateVariation($validator);
             },
         ];
     }
@@ -151,6 +156,41 @@ private function validateRenewalPeriod(Validator $validator): void
         }
     }
 
+    private function validateVariation(Validator $validator): void
+    {
+        // campos reprovados nas regras basicas nao entram na validacao cruzada
+
+        $fields = [
+            'class_package_unit_id', 'class_package_unit_variation_id',
+            'tax_register', 'installments',
+            'package_value', 'package_installments',
+            'material_value', 'material_installments',
+        ];
+
+        if ($validator->errors()->hasAny($fields)) {
+            return;
+        }
+
+        // na edicao os campos ausentes mantem o valor da versao atual
+
+        $contract = $this->isMethod('POST') ? null : $this->contractBeingUpdated();
+
+        $data = array_merge($contract?->getAttributes() ?? [], $this->all());
+
+        $errors = $this->variationConsistencyRule()->errors($data);
+
+        foreach ($errors as $field => $messages) {
+            foreach ($messages as $message) {
+                $validator->errors()->add($field, $message);
+            }
+        }
+    }
+
+    protected function variationConsistencyRule(): StudentContractVariationConsistency
+    {
+        return new StudentContractVariationConsistency;
+    }
+
     protected function contractBeingUpdated(): ?StudentContract
     {
         // o id da rota identifica a versao usada como base para a edicao

+ 3 - 3
app/Http/Resources/AuthResource.php

@@ -17,9 +17,9 @@ public function toArray(Request $request): array
     {
         return [
             'access_token' => $this['access_token'],
-            'token_type' => 'Bearer',
-            'expires_in' => 900,
-            'user' => new UserResource($this['user']),
+            'token_type'   => 'Bearer',
+            'expires_in'   => 900,
+            'user'         => new UserResource($this['user']),
         ];
     }
 

+ 8 - 8
app/Http/Resources/CityResource.php

@@ -2,24 +2,24 @@
 
 namespace App\Http\Resources;
 
+use App\Models\City;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\City;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class CityResource extends JsonResource
 {
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'name' => $this->name,
-            'state_id' => $this->state_id,
+            'id'         => $this->id,
+            'name'       => $this->name,
+            'state_id'   => $this->state_id,
             'country_id' => $this->country_id,
-            'state' => $this->state,
-            'country' => $this->country,
-            'status' => $this->status,
+            'state'      => $this->state,
+            'country'    => $this->country,
+            'status'     => $this->status,
             'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
             'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
         ];

+ 5 - 4
app/Http/Resources/ClassAttendanceResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\ClassAttendance;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\ClassAttendance;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class ClassAttendanceResource extends JsonResource
 {
@@ -18,10 +18,11 @@ class ClassAttendanceResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'name' => $this->name,
+            'id'         => $this->id,
+            'name'       => $this->name,
             'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
             'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+
             // Add your fields here
 
             // Conditional fields

+ 2 - 2
app/Http/Resources/ClassPackageResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\ClassPackage;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\ClassPackage;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class ClassPackageResource extends JsonResource
 {

+ 2 - 3
app/Http/Resources/ClassPackageUnitResource.php

@@ -16,10 +16,7 @@ public function toArray(Request $request): array
             'class_package_id'        => $this->class_package_id,
             'name'                    => $this->name,
             'quantity_classes'        => $this->quantity_classes,
-            'contract_value'          => $this->contract_value,
             'contract_material_value' => $this->contract_material_value,
-            'contract_register_value' => $this->contract_register_value,
-            'contrat_discount_value'  => $this->contrat_discount_value,
             'visible'                 => $this->visible,
             'class_duration_minutes'  => $this->class_duration_minutes,
             'weekday'                 => $this->weekday,
@@ -37,6 +34,8 @@ public function toArray(Request $request): array
                     'price'      => (float) $item->price,
                 ])
             ),
+
+            'variations' => ClassPackageUnitVariationResource::collection($this->whenLoaded('variations')),
         ];
     }
 }

+ 59 - 0
app/Http/Resources/ClassPackageUnitVariationResource.php

@@ -0,0 +1,59 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Models\ClassPackageUnitVariation;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class ClassPackageUnitVariationResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id'                        => $this->id,
+            'class_package_unit_id'     => $this->class_package_unit_id,
+            'type'                      => $this->type,
+            'register_value'            => (float) $this->register_value,
+            'register_installments_min' => $this->register_installments_min,
+            'register_installments_max' => $this->register_installments_max,
+            'package_value'             => (float) $this->package_value,
+            'package_installments_min'  => $this->package_installments_min,
+            'package_installments_max'  => $this->package_installments_max,
+            'discount_value'            => $this->discount_value !== null ? (float) $this->discount_value : null,
+            'material_value'            => (float) $this->material_value,
+            'material_installments_min' => $this->material_installments_min,
+            'material_installments_max' => $this->material_installments_max,
+            'total_value'               => $this->totalValue(),
+            'created_at'                => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
+            'updated_at'                => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+
+            // Relationships
+
+            'materials' => $this->whenLoaded('products', fn () =>
+                $this->products->map(fn ($material) => [
+                    'product_id' => $material->product_id,
+                    'name'       => $material->product?->name,
+                    'quantity'   => $material->quantity,
+                    'price'      => (float) $material->price,
+                ])->values()
+            ),
+        ];
+    }
+
+    /**
+     * @param \Illuminate\Database\Eloquent\Collection<ClassPackageUnitVariation> $resource
+     * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection<ClassPackageUnitVariationResource>
+     */
+    public static function collection($resource): AnonymousResourceCollection
+    {
+        return parent::collection($resource);
+    }
+}

+ 10 - 8
app/Http/Resources/ClassResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\SchoolClass;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\SchoolClass;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class ClassResource extends JsonResource
 {
@@ -26,19 +26,21 @@ public function toArray(Request $request): array
             'unit_id'               => $this->unit_id,
             'class_package_unit_id' => $this->class_package_unit_id,
             'package_name'          => $this->whenLoaded('packageUnit', fn () => $this->packageUnit?->name),
-            'date_time_start'       => $this->date_time_start
+
+            'date_time_start' => $this->date_time_start
                 ? Carbon::parse($this->date_time_start)->format('Y-m-d\TH:i:s')
                 : null,
-            'date_time_end'         => $this->date_time_end
+
+            'date_time_end' => $this->date_time_end
                 ? Carbon::parse($this->date_time_end)->format('Y-m-d\TH:i:s')
                 : null,
 
             // Contadores p/ exibir no card (presentes / total de alunos)
-            'students_count'        => $this->students_count,
-            'present_count'         => $this->present_count,
+            'students_count' => $this->students_count,
+            'present_count'  => $this->present_count,
 
-            'created_at'            => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
-            'updated_at'            => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+            'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
+            'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
         ];
     }
 

+ 15 - 12
app/Http/Resources/CompanyAccountPayableResource.php

@@ -10,23 +10,26 @@ class CompanyAccountPayableResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id'                        => $this->id,
-            'origin'                    => $this->origin,
+            'id'     => $this->id,
+            'origin' => $this->origin,
+
             'financial_plan_account_id' => $this->financial_plan_account_id,
-            'plan_account'              => $this->whenLoaded('planAccount', fn () => $this->planAccount ? [
+
+            'plan_account' => $this->whenLoaded('planAccount', fn () => $this->planAccount ? [
                 'id'          => $this->planAccount->id,
                 'code'        => $this->planAccount->code,
                 'description' => $this->planAccount->description,
             ] : null),
-            '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,
+
+            '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,
         ];
     }
 }

+ 5 - 3
app/Http/Resources/CompanyPaymentAccountResource.php

@@ -15,12 +15,14 @@ public function toArray(Request $request): array
         $key = $this->asaas_api_key;
 
         return [
-            'status'               => $this->status ?? 'pending',
-            'asaas_configured'     => filled($key),
+            'status'           => $this->status ?? 'pending',
+            'asaas_configured' => filled($key),
+
             'asaas_api_key_masked' => filled($key)
                 ? str_repeat('•', 8) . mb_substr($key, -4)
                 : null,
-            'onboarded_at'         => $this->onboarded_at?->format('Y-m-d H:i:s'),
+
+            'onboarded_at' => $this->onboarded_at?->format('Y-m-d H:i:s'),
         ];
     }
 }

+ 7 - 5
app/Http/Resources/CountryResource.php

@@ -2,24 +2,26 @@
 
 namespace App\Http\Resources;
 
+use App\Models\Country;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\Country;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class CountryResource extends JsonResource
 {
     public function toArray(Request $request): array
     {
         return [
-            "id" => $this->id,
-            "name" => $this->name,
-            "code" => $this->code,
+            "id"     => $this->id,
+            "name"   => $this->name,
+            "code"   => $this->code,
             "status" => $this->status,
+
             "created_at" => Carbon::parse($this->created_at)->format(
                 "Y-m-d H:i:s",
             ),
+
             "updated_at" => Carbon::parse($this->updated_at)->format(
                 "Y-m-d H:i:s",
             ),

+ 11 - 9
app/Http/Resources/FinancialPlanAccountResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\FinancialPlanAccount;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\FinancialPlanAccount;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class FinancialPlanAccountResource extends JsonResource
 {
@@ -18,21 +18,23 @@ class FinancialPlanAccountResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'unit_id' => $this->unit_id,
+            'id'        => $this->id,
+            'unit_id'   => $this->unit_id,
             'parent_id' => $this->parent_id,
+
             'parent' => $this->whenLoaded('parent', fn () => $this->parent ? [
                 'id'          => $this->parent->id,
                 'code'        => $this->parent->code,
                 'description' => $this->parent->description,
                 'chart_type'  => $this->parent->chart_type,
             ] : null),
-            'code' => $this->code,
-            'order' => $this->order,
+
+            'code'        => $this->code,
+            'order'       => $this->order,
             'description' => $this->description,
-            'chart_type' => $this->chart_type,
-            'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
-            'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+            'chart_type'  => $this->chart_type,
+            'created_at'  => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
+            'updated_at'  => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
         ];
     }
 

+ 24 - 19
app/Http/Resources/FranchiseeAccountReceiveResource.php

@@ -12,35 +12,40 @@ class FranchiseeAccountReceiveResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'unit_id' => $this->unit_id,
+            'id'        => $this->id,
+            'unit_id'   => $this->unit_id,
             'unit_name' => $this->whenLoaded('unit', fn () => $this->unit?->fantasy_name),
-            'tbr_calculation_id' => $this->tbr_calculation_id,
-            'origin' => $this->origin,
+
+            'tbr_calculation_id'        => $this->tbr_calculation_id,
+            'origin'                    => $this->origin,
             'financial_plan_account_id' => $this->financial_plan_account_id,
+
             'plan_account' => $this->whenLoaded('planAccount', fn () => $this->planAccount ? [
-                'id' => $this->planAccount->id,
-                'code' => $this->planAccount->code,
+                'id'          => $this->planAccount->id,
+                'code'        => $this->planAccount->code,
                 'description' => $this->planAccount->description,
             ] : null),
-            'order' => $this->order,
-            'history' => $this->history,
-            'value' => $this->value,
-            'paid_value' => $this->paid_value,
-            'due_date' => $this->due_date?->format('Y-m-d'),
-            'discount' => $this->discount,
-            'fees' => $this->fees,
-            'obs' => $this->obs,
-            'asaas_id' => $this->asaas_id,
-            'invoice_url' => $this->invoice_url,
+
+            'order'        => $this->order,
+            'history'      => $this->history,
+            'value'        => $this->value,
+            'paid_value'   => $this->paid_value,
+            'due_date'     => $this->due_date?->format('Y-m-d'),
+            'discount'     => $this->discount,
+            'fees'         => $this->fees,
+            'obs'          => $this->obs,
+            'asaas_id'     => $this->asaas_id,
+            'invoice_url'  => $this->invoice_url,
             'asaas_status' => $this->asaas_status,
-            'status' => $this->status,
+            'status'       => $this->status,
             'payment_date' => $this->payment_date?->format('Y-m-d'),
+
             'details' => $this->whenLoaded('details', fn () => $this->details->map(fn ($d) => [
-                'id' => $d->id,
-                'value' => $d->value,
+                'id'      => $d->id,
+                'value'   => $d->value,
                 'history' => $d->history,
             ])),
+
             'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
             'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
         ];

+ 21 - 19
app/Http/Resources/FranchiseeContractResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\FranchiseeContract;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\FranchiseeContract;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class FranchiseeContractResource extends JsonResource
 {
@@ -22,27 +22,29 @@ public function toArray(Request $request): array
             : null;
 
         return [
-            'id'                           => $this->id,
-            'unit_id'                      => $this->unit_id,
-            'unit_name'                    => $this->whenLoaded('unit', fn() => $this->unit->fantasy_name),
-            'protocol'                     => $this->protocol,
-            'start_date'                   => $this->start_date?->format('Y-m-d'),
-            'end_date'                     => $this->end_date?->format('Y-m-d'),
-            'invoice_due_date'             => $this->invoice_due_date,
-            'tbr_fixed_value'              => $this->tbr_fixed_value,
-            'tbr_fixed_value_percentage'   => $this->tbr_fixed_value_percentage,
-            'marketing_fund_percentage'    => $this->marketing_fund_percentage,
-            'maintance_tax_percentage'     => $this->maintance_tax_percentage,
-            'municipality_size_id'         => $this->municipality_size_id,
-            'municipality_size'            => $this->whenLoaded('municipalitySize', fn() => [
+            'id'                         => $this->id,
+            'unit_id'                    => $this->unit_id,
+            'unit_name'                  => $this->whenLoaded('unit', fn() => $this->unit->fantasy_name),
+            'protocol'                   => $this->protocol,
+            'start_date'                 => $this->start_date?->format('Y-m-d'),
+            'end_date'                   => $this->end_date?->format('Y-m-d'),
+            'invoice_due_date'           => $this->invoice_due_date,
+            'tbr_fixed_value'            => $this->tbr_fixed_value,
+            'tbr_fixed_value_percentage' => $this->tbr_fixed_value_percentage,
+            'marketing_fund_percentage'  => $this->marketing_fund_percentage,
+            'maintance_tax_percentage'   => $this->maintance_tax_percentage,
+            'municipality_size_id'       => $this->municipality_size_id,
+
+            'municipality_size' => $this->whenLoaded('municipalitySize', fn() => [
                 'id'          => $this->municipalitySize->id,
                 'acronym'     => $this->municipalitySize->acronym,
                 'description' => $this->municipalitySize->description,
             ]),
-            'validity_months'              => $this->validity_months,
-            'contract_month_current'       => $contractMonthCurrent,
-            'created_at'                   => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
-            'updated_at'                   => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+
+            'validity_months'        => $this->validity_months,
+            'contract_month_current' => $contractMonthCurrent,
+            'created_at'             => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
+            'updated_at'             => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
         ];
     }
 

+ 10 - 8
app/Http/Resources/FranchiseeContractTaxHistoryResource.php

@@ -10,17 +10,19 @@ class FranchiseeContractTaxHistoryResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id'                           => $this->id,
-            'municipality_size_id'         => $this->municipality_size_id,
-            'municipality_size'            => $this->whenLoaded('municipalitySize', fn() => [
+            'id'                   => $this->id,
+            'municipality_size_id' => $this->municipality_size_id,
+
+            'municipality_size' => $this->whenLoaded('municipalitySize', fn() => [
                 'id'          => $this->municipalitySize?->id,
                 'description' => $this->municipalitySize?->description,
             ]),
-            'tbr_fixed_value'              => $this->tbr_fixed_value,
-            'tbr_fixed_value_percentage'   => $this->tbr_fixed_value_percentage,
-            'marketing_fund_percentage'    => $this->marketing_fund_percentage,
-            'maintance_tax_percentage'     => $this->maintance_tax_percentage,
-            'created_at'                   => $this->created_at?->format('Y-m-d H:i:s'),
+
+            'tbr_fixed_value'            => $this->tbr_fixed_value,
+            'tbr_fixed_value_percentage' => $this->tbr_fixed_value_percentage,
+            'marketing_fund_percentage'  => $this->marketing_fund_percentage,
+            'maintance_tax_percentage'   => $this->maintance_tax_percentage,
+            'created_at'                 => $this->created_at?->format('Y-m-d H:i:s'),
         ];
     }
 }

+ 5 - 4
app/Http/Resources/FranchiseeResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\Franchisee;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\Franchisee;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class FranchiseeResource extends JsonResource
 {
@@ -18,10 +18,11 @@ class FranchiseeResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'name' => $this->name,
+            'id'         => $this->id,
+            'name'       => $this->name,
             'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
             'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+
             // Add your fields here
 
             // Conditional fields

+ 5 - 4
app/Http/Resources/FranchiseeUnitResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\FranchiseeUnit;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\FranchiseeUnit;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class FranchiseeUnitResource extends JsonResource
 {
@@ -18,10 +18,11 @@ class FranchiseeUnitResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'name' => $this->name,
+            'id'         => $this->id,
+            'name'       => $this->name,
             'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
             'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+
             // Add your fields here
 
             // Conditional fields

+ 7 - 4
app/Http/Resources/GroupResource.php

@@ -12,15 +12,18 @@ class GroupResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id'           => $this->id,
-            'name'         => $this->name,
-            'status'       => $this->status,
+            'id'     => $this->id,
+            'name'   => $this->name,
+            'status' => $this->status,
+
             'active_units' => $this->whenLoaded('units', fn() => $this->units->count()),
             'unit_ids'     => $this->whenLoaded('units', fn() => $this->units->pluck('id')),
-            'units'        => $this->whenLoaded('units', fn() => $this->units->map(fn($unit) => [
+
+            'units' => $this->whenLoaded('units', fn() => $this->units->map(fn($unit) => [
                 'id'           => $unit->id,
                 'fantasy_name' => $unit->fantasy_name,
             ])),
+
             'created_at' => Carbon::parse($this->created_at)->format('Y-m-d'),
             'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d'),
         ];

+ 2 - 2
app/Http/Resources/HolidayResource.php

@@ -2,10 +2,10 @@
 
 namespace App\Http\Resources;
 
+use App\Models\Holiday;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\Holiday;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class HolidayResource extends JsonResource
 {

+ 2 - 2
app/Http/Resources/InhabitantClassificationResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\InhabitantClassification;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\InhabitantClassification;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class InhabitantClassificationResource extends JsonResource
 {

+ 2 - 2
app/Http/Resources/KanbanResource.php

@@ -2,10 +2,10 @@
 
 namespace App\Http\Resources;
 
+use App\Models\Kanban;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\Kanban;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class KanbanResource extends JsonResource
 {

+ 5 - 4
app/Http/Resources/NotificationRecipientResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\NotificationRecipient;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\NotificationRecipient;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class NotificationRecipientResource extends JsonResource
 {
@@ -18,10 +18,11 @@ class NotificationRecipientResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'name' => $this->name,
+            'id'         => $this->id,
+            'name'       => $this->name,
             'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
             'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+
             // Add your fields here
 
             // Conditional fields

+ 6 - 4
app/Http/Resources/NotificationResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\Notification;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\Notification;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class NotificationResource extends JsonResource
 {
@@ -32,10 +32,12 @@ public function toArray(Request $request): array
             'unit_id'           => $this->unit_id,
             'franchisee_id'     => $this->franchisee_id,
             'is_read'           => $recipient ? (bool) $recipient->is_read : false,
-            'read_at'           => $recipient?->read_at
+
+            'read_at' => $recipient?->read_at
                 ? Carbon::parse($recipient->read_at)->format('Y-m-d H:i:s')
                 : null,
-            'created_at'        => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
+
+            'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
         ];
     }
 

+ 7 - 7
app/Http/Resources/PermissionResource.php

@@ -4,8 +4,8 @@
 
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class PermissionResource extends JsonResource
 {
@@ -17,13 +17,13 @@ class PermissionResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'scope' => $this->scope,
+            'id'          => $this->id,
+            'scope'       => $this->scope,
             'description' => $this->description,
-            'bits' => $this->bits,
-            'parent_id' => $this->parent_id,
-            'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
-            'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+            'bits'        => $this->bits,
+            'parent_id'   => $this->parent_id,
+            'created_at'  => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
+            'updated_at'  => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
         ];
     }
     public static function collection($resource): AnonymousResourceCollection

+ 2 - 2
app/Http/Resources/ProductResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\Product;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\Product;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class ProductResource extends JsonResource
 {

+ 4 - 4
app/Http/Resources/Select/FinancialPlanAccountSelectResource.php

@@ -10,11 +10,11 @@ class FinancialPlanAccountSelectResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'parent_id' => $this->parent_id,
-            'code' => $this->code,
+            'id'          => $this->id,
+            'parent_id'   => $this->parent_id,
+            'code'        => $this->code,
             'description' => $this->description,
-            'chart_type' => $this->chart_type,
+            'chart_type'  => $this->chart_type,
         ];
     }
 }

+ 3 - 3
app/Http/Resources/Select/InhabitantClassificationSelectResource.php

@@ -10,9 +10,9 @@ class InhabitantClassificationSelectResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'description' => $this->description,
-            'acronym' => $this->municipalitySize?->acronym,
+            'id'             => $this->id,
+            'description'    => $this->description,
+            'acronym'        => $this->municipalitySize?->acronym,
             'tbr_percentage' => $this->tbr_percentage,
         ];
     }

+ 10 - 9
app/Http/Resources/Select/PackageSelectResource.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Resources\Select;
 
+use App\Http\Resources\ClassPackageUnitVariationResource;
 use Illuminate\Http\Request;
 use Illuminate\Http\Resources\Json\JsonResource;
 
@@ -10,16 +11,16 @@ class PackageSelectResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'name' => $this->name,
-            'quantity_classes' => $this->quantity_classes,
-            'contract_value' => $this->contract_value,
-            'contract_register_value' => $this->contract_register_value,
+            'id'                     => $this->id,
+            'name'                   => $this->name,
+            'quantity_classes'       => $this->quantity_classes,
             'class_duration_minutes' => $this->class_duration_minutes,
-            'weekday' => $this->weekday,
-            'start_time' => $this->start_time,
-            'second_weekday' => $this->second_weekday,
-            'second_start_time' => $this->second_start_time,
+            'weekday'                => $this->weekday,
+            'start_time'             => $this->start_time,
+            'second_weekday'         => $this->second_weekday,
+            'second_start_time'      => $this->second_start_time,
+
+            'variations' => ClassPackageUnitVariationResource::collection($this->whenLoaded('variations')),
         ];
     }
 }

+ 3 - 3
app/Http/Resources/Select/StudentSelectResource.php

@@ -10,10 +10,10 @@ class StudentSelectResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'name' => $this->name,
+            'id'              => $this->id,
+            'name'            => $this->name,
             'document_number' => $this->document_number,
-            'birth_date' => $this->birth_date?->format('Y-m-d'),
+            'birth_date'      => $this->birth_date?->format('Y-m-d'),
         ];
     }
 }

+ 4 - 4
app/Http/Resources/Select/UserSelectResource.php

@@ -10,10 +10,10 @@ class UserSelectResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'name' => $this->name,
-            'user_type' => $this->user_type,
-            'user_type_label' => $this->user_type_label,
+            'id'                   => $this->id,
+            'name'                 => $this->name,
+            'user_type'            => $this->user_type,
+            'user_type_label'      => $this->user_type_label,
             'user_type_system_key' => $this->user_type_system_key,
         ];
     }

+ 9 - 7
app/Http/Resources/StateResource.php

@@ -2,26 +2,28 @@
 
 namespace App\Http\Resources;
 
+use App\Models\State;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\State;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class StateResource extends JsonResource
 {
     public function toArray(Request $request): array
     {
         return [
-            "id" => $this->id,
-            "name" => $this->name,
-            "code" => $this->code,
+            "id"         => $this->id,
+            "name"       => $this->name,
+            "code"       => $this->code,
             "country_id" => $this->country_id,
-            "country" => $this->country,
-            "status" => $this->status,
+            "country"    => $this->country,
+            "status"     => $this->status,
+
             "created_at" => Carbon::parse($this->created_at)->format(
                 "Y-m-d H:i:s",
             ),
+
             "updated_at" => Carbon::parse($this->updated_at)->format(
                 "Y-m-d H:i:s",
             ),

+ 6 - 4
app/Http/Resources/StudentContractInstallmentResource.php

@@ -21,10 +21,12 @@ public function toArray(Request $request): array
             'paid_value'         => (float) $this->paid_value,
             'discount'           => (float) $this->discount,
             'fine'               => (float) $this->fine,
-            'due_date'           => $this->due_date
-                                        ? Carbon::parse($this->due_date)->format('d/m/Y')
-                                        : null,
-            'status'             => $this->status,
+
+            'due_date' => $this->due_date
+                ? Carbon::parse($this->due_date)->format('d/m/Y')
+                : null,
+
+            'status' => $this->status,
         ];
     }
 }

+ 12 - 1
app/Http/Resources/StudentContractResource.php

@@ -22,7 +22,11 @@ public function toArray(Request $request): array
             'protocol'                 => $this->protocol,
             'student_id'               => $this->student_id,
             'unit_id'                  => $this->unit_id,
-            'class_package_unit_id'    => $this->class_package_unit_id,
+
+            'class_package_unit_id'           => $this->class_package_unit_id,
+            'class_package_unit_variation_id' => $this->class_package_unit_variation_id,
+            'variation_type'                  => $this->whenLoaded('classPackageUnitVariation', fn () => $this->classPackageUnitVariation?->type),
+
             'signature_date'           => $this->signature_date ? Carbon::parse($this->signature_date)->format('d/m/Y') : null,
             'end_date'                 => $this->end_date ? Carbon::parse($this->end_date)->format('d/m/Y') : null,
             'class_quantity'           => $this->class_quantity,
@@ -47,6 +51,13 @@ public function toArray(Request $request): array
                 ? Carbon::parse($this->package_due_date)->format('d/m/Y')
                 : null,
 
+            'material_value'        => $this->material_value,
+            'material_installments' => $this->material_installments,
+
+            'material_due_date' => $this->material_due_date
+                ? Carbon::parse($this->material_due_date)->format('d/m/Y')
+                : null,
+
             'early_payment_discount' => $this->early_payment_discount,
             'interest_rate'          => $this->interest_rate,
             'payment_method'         => $this->payment_method,

+ 5 - 4
app/Http/Resources/StudentHistoryResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\StudentHistory;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\StudentHistory;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class StudentHistoryResource extends JsonResource
 {
@@ -18,10 +18,11 @@ class StudentHistoryResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'name' => $this->name,
+            'id'         => $this->id,
+            'name'       => $this->name,
             'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
             'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+
             // Add your fields here
 
             // Conditional fields

+ 8 - 8
app/Http/Resources/StudentMediaResource.php

@@ -12,14 +12,14 @@ class StudentMediaResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id'                   => $this->id,
-            'name'                 => $this->name,
-            'student_id'           => $this->student_id,
-            'student_contract_id'  => $this->student_contract_id,
-            'file_url'             => $this->url ? Storage::url($this->url) : null,
-            'file_type'            => $this->file_type,
-            'type'                 => $this->type,
-            'created_at'           => Carbon::parse($this->created_at)->format('d/m/Y H:i'),
+            'id'                  => $this->id,
+            'name'                => $this->name,
+            'student_id'          => $this->student_id,
+            'student_contract_id' => $this->student_contract_id,
+            'file_url'            => $this->url ? Storage::url($this->url) : null,
+            'file_type'           => $this->file_type,
+            'type'                => $this->type,
+            'created_at'          => Carbon::parse($this->created_at)->format('d/m/Y H:i'),
         ];
     }
 }

+ 5 - 3
app/Http/Resources/StudentResource.php

@@ -33,12 +33,14 @@ public function toArray(Request $request): array
             'notes'               => $this->notes,
             'photo_url'           => $this->photo_url ? Storage::url($this->photo_url) : null,
             'status'              => $this->status,
-            'unit'                => $this->whenLoaded('unit', fn () => [
+
+            'unit' => $this->whenLoaded('unit', fn () => [
                 'id'           => $this->unit->id,
                 'fantasy_name' => $this->unit->fantasy_name,
             ]),
-            'created_at'          => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
-            'updated_at'          => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+
+            'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
+            'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
         ];
     }
 

+ 2 - 2
app/Http/Resources/StudentResponsibleResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\StudentResponsible;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\StudentResponsible;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class StudentResponsibleResource extends JsonResource
 {

+ 2 - 2
app/Http/Resources/SupportTicketResource.php

@@ -2,10 +2,10 @@
 
 namespace App\Http\Resources;
 
+use App\Models\SupportTicket;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\SupportTicket;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class SupportTicketResource extends JsonResource
 {

+ 7 - 5
app/Http/Resources/TbrCalculationResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\TbrCalculation;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\TbrCalculation;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class TbrCalculationResource extends JsonResource
 {
@@ -42,12 +42,14 @@ public function toArray(Request $request): array
             'user_id'                          => $this->user_id,
             'royalties_applied_criteria'       => $this->royalties_applied_criteria,
             'receivable_generated'             => $this->receivable_generated,
-            'unit'                             => $this->whenLoaded('unit', fn () => [
+
+            'unit' => $this->whenLoaded('unit', fn () => [
                 'id'           => $this->unit->id,
                 'fantasy_name' => $this->unit->fantasy_name,
             ]),
-            'created_at'                       => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
-            'updated_at'                       => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+
+            'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
+            'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
         ];
     }
 

+ 2 - 2
app/Http/Resources/TbrResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\Tbr;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\Tbr;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class TbrResource extends JsonResource
 {

+ 14 - 14
app/Http/Resources/TreasuryAccountResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\TreasuryAccount;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\TreasuryAccount;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class TreasuryAccountResource extends JsonResource
 {
@@ -18,19 +18,19 @@ class TreasuryAccountResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'unit_id' => $this->unit_id,
-            'name' => $this->name,
-            'treasury_type' => $this->treasury_type,
-            'bank_name' => $this->bank_name,
-            'bank_agency' => $this->bank_agency,
-            'bank_account' => $this->bank_account,
+            'id'                => $this->id,
+            'unit_id'           => $this->unit_id,
+            'name'              => $this->name,
+            'treasury_type'     => $this->treasury_type,
+            'bank_name'         => $this->bank_name,
+            'bank_agency'       => $this->bank_agency,
+            'bank_account'      => $this->bank_account,
             'bank_type_account' => $this->bank_type_account,
-            'active' => (bool) $this->active,
-            'balance' => (float) ($this->balance ?? 0),
-            'balance_previous' => (float) ($this->balance_previous ?? 0),
-            'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
-            'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+            'active'            => (bool) $this->active,
+            'balance'           => (float) ($this->balance ?? 0),
+            'balance_previous'  => (float) ($this->balance_previous ?? 0),
+            'created_at'        => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
+            'updated_at'        => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
         ];
     }
 

+ 20 - 16
app/Http/Resources/TreasuryLaunchResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\TreasuryLaunch;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\TreasuryLaunch;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class TreasuryLaunchResource extends JsonResource
 {
@@ -18,29 +18,33 @@ class TreasuryLaunchResource extends JsonResource
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'unit_id' => $this->unit_id,
+            'id'               => $this->id,
+            'unit_id'          => $this->unit_id,
             'transaction_type' => $this->transaction_type,
-            'from_account_id' => $this->from_account_id,
-            'to_account_id' => $this->to_account_id,
+            'from_account_id'  => $this->from_account_id,
+            'to_account_id'    => $this->to_account_id,
+
             // Banco da movimentação (destino na entrada, origem na saída).
-            'account_id' => $this->transaction_type === 'entrada' ? $this->to_account_id : $this->from_account_id,
-            'description' => $this->description,
+
+            'account_id'                => $this->transaction_type === 'entrada' ? $this->to_account_id : $this->from_account_id,
+            'description'               => $this->description,
             'financial_plan_account_id' => $this->financial_plan_account_id,
+
             'financial_plan_account' => $this->whenLoaded('financialPlanAccount', function () {
                 return $this->financialPlanAccount ? [
-                    'id' => $this->financialPlanAccount->id,
-                    'code' => $this->financialPlanAccount->code,
+                    'id'          => $this->financialPlanAccount->id,
+                    'code'        => $this->financialPlanAccount->code,
                     'description' => $this->financialPlanAccount->description,
-                    'label' => "{$this->financialPlanAccount->code} - {$this->financialPlanAccount->description}",
+                    'label'       => "{$this->financialPlanAccount->code} - {$this->financialPlanAccount->description}",
                 ] : null;
             }),
-            'amount' => (float) $this->amount,
-            'launch_date' => $this->launch_date,
-            'origin' => $this->origin,
+
+            'amount'        => (float) $this->amount,
+            'launch_date'   => $this->launch_date,
+            'origin'        => $this->origin,
             'is_reconciled' => (bool) $this->is_reconciled,
-            'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
-            'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
+            'created_at'    => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
+            'updated_at'    => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
         ];
     }
 

+ 2 - 2
app/Http/Resources/UnitContractResource.php

@@ -2,12 +2,12 @@
 
 namespace App\Http\Resources;
 
+use App\Models\UnitContract;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
+use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Support\Facades\Storage;
-use App\Models\UnitContract;
 
 class UnitContractResource extends JsonResource
 {

+ 1 - 1
app/Http/Resources/UnitFinancialResource.php

@@ -2,10 +2,10 @@
 
 namespace App\Http\Resources;
 
+use App\Models\UnitFinancial;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Http\Resources\Json\JsonResource;
-use App\Models\UnitFinancial;
 
 class UnitFinancialResource extends JsonResource
 {

+ 2 - 2
app/Http/Resources/UnitHistoryResource.php

@@ -2,11 +2,11 @@
 
 namespace App\Http\Resources;
 
+use App\Models\UnitHistory;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
-use App\Models\UnitHistory;
+use Illuminate\Http\Resources\Json\JsonResource;
 
 class UnitHistoryResource extends JsonResource
 {

+ 2 - 2
app/Http/Resources/UnitMediaResource.php

@@ -2,12 +2,12 @@
 
 namespace App\Http\Resources;
 
+use App\Models\UnitMedia;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
+use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Support\Facades\Storage;
-use App\Models\UnitMedia;
 
 class UnitMediaResource extends JsonResource
 {

+ 2 - 2
app/Http/Resources/UnitPartnerResource.php

@@ -2,12 +2,12 @@
 
 namespace App\Http\Resources;
 
+use App\Models\UnitPartner;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
+use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Support\Facades\Storage;
-use App\Models\UnitPartner;
 
 class UnitPartnerResource extends JsonResource
 {

Vissa filer visades inte eftersom för många filer har ändrats