UnitReceivableController.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Controllers\Concerns\ResolvesActiveUnit;
  4. use App\Http\Requests\SettleReceivableRequest;
  5. use App\Http\Requests\StoreUnitReceivableRequest;
  6. use App\Http\Resources\UnitAccountReceivableResource;
  7. use App\Http\Resources\UnitReceivableResource;
  8. use App\Services\UnitReceivableService;
  9. use Illuminate\Http\JsonResponse;
  10. use Illuminate\Http\Request;
  11. class UnitReceivableController extends Controller
  12. {
  13. use ResolvesActiveUnit;
  14. public function __construct(
  15. protected UnitReceivableService $service,
  16. ) {}
  17. public function indexMe(Request $request): JsonResponse
  18. {
  19. $unitId = $this->activeUnitId();
  20. if (!$unitId) {
  21. return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
  22. }
  23. $filters = array_filter($request->only(['status', 'student_id', 'type']), fn ($v) => $v !== null);
  24. // Parcelas de aluno + recebíveis avulsos convivem na mesma listagem,
  25. // normalizados e ordenados por vencimento. 'source' distingue a origem.
  26. $installments = UnitReceivableResource::collection($this->service->list($unitId, $filters))
  27. ->toArray($request);
  28. $manual = UnitAccountReceivableResource::collection($this->service->listManual($unitId, $filters))
  29. ->toArray($request);
  30. $merged = collect(array_merge($installments, $manual))
  31. ->sortBy('due_date')
  32. ->values()
  33. ->all();
  34. return $this->successResponse(payload: $merged);
  35. }
  36. public function storeManualMe(StoreUnitReceivableRequest $request): JsonResponse
  37. {
  38. $unitId = $this->activeUnitId();
  39. if (!$unitId) {
  40. return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
  41. }
  42. $item = $this->service->createManual($unitId, $request->validated());
  43. return $this->successResponse(
  44. payload: new UnitAccountReceivableResource($item),
  45. message: __('messages.created'),
  46. code: 201,
  47. );
  48. }
  49. //
  50. public function chargeMe(int $id): JsonResponse
  51. {
  52. $unitId = $this->activeUnitId();
  53. if (!$unitId) {
  54. return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
  55. }
  56. $installment = $this->service->findForUnit($id, $unitId);
  57. if (!$installment) {
  58. return $this->errorResponse(message: 'Recebível não encontrado', code: 404);
  59. }
  60. $item = $this->service->generateCharge($installment);
  61. return $this->successResponse(
  62. payload: new UnitReceivableResource($item),
  63. message: 'Cobrança gerada no Asaas',
  64. );
  65. }
  66. public function reopenManualMe(int $id): JsonResponse
  67. {
  68. $unitId = $this->activeUnitId();
  69. if (!$unitId) {
  70. return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
  71. }
  72. $receivable = $this->service->findManualForUnit($id, $unitId);
  73. if (!$receivable) {
  74. return $this->errorResponse(message: 'Recebível não encontrado', code: 404);
  75. }
  76. $item = $this->service->reopenManual($receivable);
  77. return $this->successResponse(
  78. payload: new UnitAccountReceivableResource($item),
  79. message: 'Recebível reaberto',
  80. );
  81. }
  82. public function reopenMe(int $id): JsonResponse
  83. {
  84. $unitId = $this->activeUnitId();
  85. if (!$unitId) {
  86. return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
  87. }
  88. $installment = $this->service->findForUnit($id, $unitId);
  89. if (!$installment) {
  90. return $this->errorResponse(message: 'Recebível não encontrado', code: 404);
  91. }
  92. $item = $this->service->reopen($installment);
  93. return $this->successResponse(
  94. payload: new UnitReceivableResource($item),
  95. message: 'Recebível reaberto',
  96. );
  97. }
  98. public function settleManualMe(SettleReceivableRequest $request, int $id): JsonResponse
  99. {
  100. $unitId = $this->activeUnitId();
  101. if (!$unitId) {
  102. return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
  103. }
  104. $receivable = $this->service->findManualForUnit($id, $unitId);
  105. if (!$receivable) {
  106. return $this->errorResponse(message: 'Recebível não encontrado', code: 404);
  107. }
  108. $item = $this->service->settleManual($receivable, $request->validated());
  109. return $this->successResponse(
  110. payload: new UnitAccountReceivableResource($item),
  111. message: 'Baixa realizada com sucesso',
  112. );
  113. }
  114. public function settleMe(SettleReceivableRequest $request, int $id): JsonResponse
  115. {
  116. $unitId = $this->activeUnitId();
  117. if (!$unitId) {
  118. return $this->errorResponse(message: 'Unidade não encontrada', code: 404);
  119. }
  120. $installment = $this->service->findForUnit($id, $unitId);
  121. if (!$installment) {
  122. return $this->errorResponse(message: 'Recebível não encontrado', code: 404);
  123. }
  124. $item = $this->service->settle($installment, $request->validated());
  125. return $this->successResponse(
  126. payload: new UnitReceivableResource($item),
  127. message: 'Baixa realizada com sucesso',
  128. );
  129. }
  130. }