TreasuryLaunchController.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Controllers\Concerns\ResolvesActiveUnit;
  4. use App\Http\Requests\TreasuryLaunchRequest;
  5. use App\Http\Resources\TreasuryLaunchResource;
  6. use App\Services\TreasuryAccountService;
  7. use App\Services\TreasuryLaunchService;
  8. use Illuminate\Http\JsonResponse;
  9. use Illuminate\Http\Request;
  10. class TreasuryLaunchController extends Controller
  11. {
  12. use ResolvesActiveUnit;
  13. public function __construct(
  14. protected TreasuryLaunchService $service,
  15. protected TreasuryAccountService $accountService,
  16. ) {}
  17. public function index(Request $request): JsonResponse
  18. {
  19. $accountId = $request->filled('account_id') ? (int) $request->input('account_id') : null;
  20. $items = $this->service->getAll($accountId);
  21. return $this->successResponse(payload: TreasuryLaunchResource::collection($items));
  22. }
  23. public function store(TreasuryLaunchRequest $request): JsonResponse
  24. {
  25. $item = $this->service->create($request->validated());
  26. return $this->successResponse(payload: new TreasuryLaunchResource($item), message: __('messages.created'), code: 201);
  27. }
  28. public function show(int $id): JsonResponse
  29. {
  30. $item = $this->service->findById($id);
  31. return $this->successResponse(payload: new TreasuryLaunchResource($item));
  32. }
  33. public function update(TreasuryLaunchRequest $request, int $id): JsonResponse
  34. {
  35. $item = $this->service->update($id, $request->validated());
  36. return $this->successResponse(payload: new TreasuryLaunchResource($item), message: __('messages.updated'));
  37. }
  38. public function destroy(int $id): JsonResponse
  39. {
  40. $this->service->delete($id);
  41. return $this->successResponse(message: __('messages.deleted'), code: 204);
  42. }
  43. // --- Unidade ativa (Franchisee): extrato e movimentação manual ---
  44. public function indexMe(Request $request): JsonResponse
  45. {
  46. $unitId = $this->activeUnitId();
  47. if (! $unitId) {
  48. return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
  49. }
  50. $accountId = $request->filled('account_id') ? (int) $request->input('account_id') : null;
  51. // Extrato só de uma conta da própria unidade.
  52. if ($accountId !== null && ! $this->accountService->findByIdForUnit($accountId, $unitId)) {
  53. return $this->errorResponse(message: 'Conta não encontrada', code: 404);
  54. }
  55. return $this->successResponse(
  56. payload: TreasuryLaunchResource::collection($this->service->getAll($accountId)),
  57. );
  58. }
  59. public function storeMe(TreasuryLaunchRequest $request): JsonResponse
  60. {
  61. $unitId = $this->activeUnitId();
  62. if (! $unitId) {
  63. return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
  64. }
  65. $data = $request->validated();
  66. // A conta movimentada precisa pertencer à unidade ativa.
  67. if (! $this->accountService->findByIdForUnit((int) $data['account_id'], $unitId)) {
  68. return $this->errorResponse(message: 'Conta não encontrada', code: 404);
  69. }
  70. $item = $this->service->create($data);
  71. return $this->successResponse(payload: new TreasuryLaunchResource($item), message: __('messages.created'), code: 201);
  72. }
  73. public function updateMe(TreasuryLaunchRequest $request, int $id): JsonResponse
  74. {
  75. $unitId = $this->activeUnitId();
  76. $item = $this->service->findById($id);
  77. $currentAccountId = $item?->transaction_type === 'entrada'
  78. ? $item?->to_account_id
  79. : $item?->from_account_id;
  80. $accountId = $request->integer('account_id') ?: $currentAccountId;
  81. if (! $unitId || ! $item || ! $currentAccountId
  82. || ! $this->accountService->findByIdForUnit($currentAccountId, $unitId)
  83. || ! $accountId || ! $this->accountService->findByIdForUnit($accountId, $unitId)) {
  84. return $this->errorResponse(message: 'Movimentação não encontrada', code: 404);
  85. }
  86. $updated = $this->service->update($id, $request->validated());
  87. return $this->successResponse(payload: new TreasuryLaunchResource($updated), message: __('messages.updated'));
  88. }
  89. public function destroyMe(int $id): JsonResponse
  90. {
  91. $unitId = $this->activeUnitId();
  92. $item = $this->service->findById($id);
  93. $accountId = $item?->transaction_type === 'entrada' ? $item?->to_account_id : $item?->from_account_id;
  94. if (! $unitId || ! $item || ! $accountId || ! $this->accountService->findByIdForUnit($accountId, $unitId)) {
  95. return $this->errorResponse(message: 'Movimentação não encontrada', code: 404);
  96. }
  97. $this->service->delete($id);
  98. return $this->successResponse(message: __('messages.deleted'), code: 204);
  99. }
  100. }