SelectController.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. $items = Unit::orderByRaw("COALESCE(NULLIF(name, ''), fantasy_name)")->get();
  56. return $this->items(UnitSelectResource::collection($items));
  57. }
  58. public function groups(): JsonResponse
  59. {
  60. return $this->items(GroupSelectResource::collection(Group::with('units:id')->orderBy('name')->get()));
  61. }
  62. public function products(): JsonResponse
  63. {
  64. $items = Product::query()
  65. ->when(request()->boolean('visible_franchisee'), fn ($query) => $query->where('visible_franchisee', true))
  66. ->orderBy('name')->get();
  67. return $this->items(ProductSelectResource::collection($items));
  68. }
  69. public function franchiseePackages(): JsonResponse
  70. {
  71. $unitId = $this->activeUnitId();
  72. $items = $unitId
  73. ? ClassPackageUnit::with(['pavaoProposalUnit', 'irrecusableProposalUnit'])
  74. ->where('unit_id', $unitId)
  75. ->where('visible', true)
  76. ->orderBy('name')
  77. ->get()
  78. : collect();
  79. return $this->items(PackageSelectResource::collection($items));
  80. }
  81. public function franchiseeUsers(): JsonResponse
  82. {
  83. $unitId = $this->activeUnitId();
  84. $items = $unitId
  85. ? User::query()
  86. ->join('unit_users', fn ($join) => $join->on('unit_users.user_id', 'users.id')->where('unit_users.unit_id', $unitId))
  87. ->leftJoin('user_types', 'user_types.id', 'unit_users.user_type_id')
  88. ->orderBy('users.name')
  89. ->get([
  90. 'users.id',
  91. 'users.name',
  92. 'user_types.slug as user_type',
  93. 'user_types.label as user_type_label',
  94. 'user_types.system_key as user_type_system_key',
  95. ])
  96. : collect();
  97. return $this->items(UserSelectResource::collection($items));
  98. }
  99. public function franchiseeStudents(): JsonResponse
  100. {
  101. $unitId = $this->activeUnitId();
  102. $items = $unitId
  103. ? Student::where('unit_id', $unitId)->orderBy('name')->get()
  104. : collect();
  105. return $this->items(StudentSelectResource::collection($items));
  106. }
  107. public function userTypes(): JsonResponse
  108. {
  109. $scope = request()->input('access_scope', auth()->user()?->access_scope);
  110. $unitId = request()->integer('unit_id') ?: $this->activeUnitId();
  111. $isFranchisorAssignment = request()->boolean('include_system_admin');
  112. $items = UserType::query()
  113. ->when($scope === 'unit' && $unitId, fn ($query) => $query->where('unit_id', $unitId))
  114. ->when($scope === 'unit' && ! $unitId, fn ($query) => $query->where('system_key', 'ADMIN_FRANCHISEE'))
  115. ->when($scope === 'franchisor', fn ($query) => $query->whereNull('unit_id'))
  116. ->when(
  117. $scope === 'unit' && $isFranchisorAssignment,
  118. fn ($query) => $query->where(fn ($types) => $types->where('is_system', false)->orWhere('system_key', 'ADMIN_FRANCHISEE')),
  119. fn ($query) => $query->where('is_system', false),
  120. )
  121. ->orderBy('label')->get();
  122. return $this->items(UserTypeSelectResource::collection($items));
  123. }
  124. public function inhabitantClassifications(): JsonResponse
  125. {
  126. return $this->items(InhabitantClassificationSelectResource::collection(
  127. InhabitantClassification::with('municipalitySize')->orderBy('description')->get()
  128. ));
  129. }
  130. public function municipalitySizes(): JsonResponse
  131. {
  132. return $this->items(MunicipalitySizeSelectResource::collection(MunicipalitySize::orderBy('id')->get()));
  133. }
  134. public function financialPlanAccounts(): JsonResponse
  135. {
  136. $unitId = $this->activeUnitId();
  137. $items = FinancialPlanAccount::query()
  138. ->when(
  139. $unitId,
  140. fn ($query) => $query->where(fn ($scope) => $scope->where('unit_id', $unitId)->orWhereNull('unit_id')),
  141. fn ($query) => $query->whereNull('unit_id'),
  142. )
  143. ->orderBy('code')->get();
  144. return $this->items(FinancialPlanAccountSelectResource::collection($items));
  145. }
  146. private function items($items): JsonResponse
  147. {
  148. return $this->successResponse(payload: $items);
  149. }
  150. }