SelectController.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Controllers\Concerns\ResolvesActiveUnit;
  4. use App\Http\Resources\Select\CitySelectResource;
  5. use App\Http\Resources\Select\CountrySelectResource;
  6. use App\Http\Resources\Select\FinancialPlanAccountSelectResource;
  7. use App\Http\Resources\Select\GroupSelectResource;
  8. use App\Http\Resources\Select\InhabitantClassificationSelectResource;
  9. use App\Http\Resources\Select\MunicipalitySizeSelectResource;
  10. use App\Http\Resources\Select\PackageSelectResource;
  11. use App\Http\Resources\Select\ProductSelectResource;
  12. use App\Http\Resources\Select\StateSelectResource;
  13. use App\Http\Resources\Select\StudentSelectResource;
  14. use App\Http\Resources\Select\UnitSelectResource;
  15. use App\Http\Resources\Select\UserSelectResource;
  16. use App\Http\Resources\Select\UserTypeSelectResource;
  17. use App\Models\City;
  18. use App\Models\ClassPackageUnit;
  19. use App\Models\Country;
  20. use App\Models\FinancialPlanAccount;
  21. use App\Models\Group;
  22. use App\Models\InhabitantClassification;
  23. use App\Models\MunicipalitySize;
  24. use App\Models\Product;
  25. use App\Models\State;
  26. use App\Models\Student;
  27. use App\Models\Unit;
  28. use App\Models\User;
  29. use App\Models\UserType;
  30. use Illuminate\Http\JsonResponse;
  31. class SelectController extends Controller
  32. {
  33. use ResolvesActiveUnit;
  34. public function countries(): JsonResponse
  35. {
  36. return $this->items(CountrySelectResource::collection(Country::orderBy('name')->get()));
  37. }
  38. public function states(): JsonResponse
  39. {
  40. $items = State::query()
  41. ->when(request()->integer('country_id'), fn ($query, $id) => $query->where('country_id', $id))
  42. ->orderBy('name')->get();
  43. return $this->items(StateSelectResource::collection($items));
  44. }
  45. public function cities(): JsonResponse
  46. {
  47. $items = City::query()
  48. ->when(request()->integer('state_id'), fn ($query, $id) => $query->where('state_id', $id))
  49. ->when(request()->integer('country_id'), fn ($query, $id) => $query->where('country_id', $id))
  50. ->orderBy('name')->get();
  51. return $this->items(CitySelectResource::collection($items));
  52. }
  53. public function units(): JsonResponse
  54. {
  55. return $this->items(UnitSelectResource::collection(Unit::orderBy('fantasy_name')->get()));
  56. }
  57. public function groups(): JsonResponse
  58. {
  59. return $this->items(GroupSelectResource::collection(Group::with('units:id')->orderBy('name')->get()));
  60. }
  61. public function products(): JsonResponse
  62. {
  63. $items = Product::query()
  64. ->when(request()->boolean('visible_franchisee'), fn ($query) => $query->where('visible_franchisee', true))
  65. ->orderBy('name')->get();
  66. return $this->items(ProductSelectResource::collection($items));
  67. }
  68. public function franchiseePackages(): JsonResponse
  69. {
  70. $unitId = $this->activeUnitId();
  71. $items = $unitId
  72. ? ClassPackageUnit::with(['pavaoProposalUnit', 'irrecusableProposalUnit'])
  73. ->where('unit_id', $unitId)
  74. ->where('visible', true)
  75. ->orderBy('name')
  76. ->get()
  77. : collect();
  78. return $this->items(PackageSelectResource::collection($items));
  79. }
  80. public function franchiseeUsers(): JsonResponse
  81. {
  82. $unitId = $this->activeUnitId();
  83. $items = $unitId
  84. ? User::query()
  85. ->join('unit_users', fn ($join) => $join->on('unit_users.user_id', 'users.id')->where('unit_users.unit_id', $unitId))
  86. ->leftJoin('user_types', 'user_types.id', 'unit_users.user_type_id')
  87. ->orderBy('users.name')
  88. ->get([
  89. 'users.id',
  90. 'users.name',
  91. 'user_types.slug as user_type',
  92. 'user_types.label as user_type_label',
  93. 'user_types.system_key as user_type_system_key',
  94. ])
  95. : collect();
  96. return $this->items(UserSelectResource::collection($items));
  97. }
  98. public function franchiseeStudents(): JsonResponse
  99. {
  100. $unitId = $this->activeUnitId();
  101. $items = $unitId
  102. ? Student::where('unit_id', $unitId)->orderBy('name')->get()
  103. : collect();
  104. return $this->items(StudentSelectResource::collection($items));
  105. }
  106. public function userTypes(): JsonResponse
  107. {
  108. $scope = request()->input('access_scope', auth()->user()?->access_scope);
  109. $unitId = request()->integer('unit_id') ?: $this->activeUnitId();
  110. $isFranchisorAssignment = request()->boolean('include_system_admin');
  111. $items = UserType::query()
  112. ->when($scope === 'unit' && $unitId, fn ($query) => $query->where('unit_id', $unitId))
  113. ->when($scope === 'unit' && ! $unitId, fn ($query) => $query->where('system_key', 'ADMIN_FRANCHISEE'))
  114. ->when($scope === 'franchisor', fn ($query) => $query->whereNull('unit_id'))
  115. ->when(
  116. $scope === 'unit' && $isFranchisorAssignment,
  117. fn ($query) => $query->where(fn ($types) => $types->where('is_system', false)->orWhere('system_key', 'ADMIN_FRANCHISEE')),
  118. fn ($query) => $query->where('is_system', false),
  119. )
  120. ->orderBy('label')->get();
  121. return $this->items(UserTypeSelectResource::collection($items));
  122. }
  123. public function inhabitantClassifications(): JsonResponse
  124. {
  125. return $this->items(InhabitantClassificationSelectResource::collection(
  126. InhabitantClassification::with('municipalitySize')->orderBy('description')->get()
  127. ));
  128. }
  129. public function municipalitySizes(): JsonResponse
  130. {
  131. return $this->items(MunicipalitySizeSelectResource::collection(MunicipalitySize::orderBy('id')->get()));
  132. }
  133. public function financialPlanAccounts(): JsonResponse
  134. {
  135. $unitId = $this->activeUnitId();
  136. $items = FinancialPlanAccount::query()
  137. ->when(
  138. $unitId,
  139. fn ($query) => $query->where(fn ($scope) => $scope->where('unit_id', $unitId)->orWhereNull('unit_id')),
  140. fn ($query) => $query->whereNull('unit_id'),
  141. )
  142. ->orderBy('code')->get();
  143. return $this->items(FinancialPlanAccountSelectResource::collection($items));
  144. }
  145. private function items($items): JsonResponse
  146. {
  147. return $this->successResponse(payload: $items);
  148. }
  149. }