SelectController.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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\GroupSelectResource;
  7. use App\Http\Resources\Select\FinancialPlanAccountSelectResource;
  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\Group;
  21. use App\Models\FinancialPlanAccount;
  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::where('unit_id', $unitId)->where('visible', true)->orderBy('name')->get()
  73. : collect();
  74. return $this->items(PackageSelectResource::collection($items));
  75. }
  76. public function franchiseeUsers(): JsonResponse
  77. {
  78. $unitId = $this->activeUnitId();
  79. $items = $unitId
  80. ? User::query()
  81. ->join('unit_users', fn ($join) => $join->on('unit_users.user_id', 'users.id')->where('unit_users.unit_id', $unitId))
  82. ->leftJoin('user_types', 'user_types.id', 'unit_users.user_type_id')
  83. ->orderBy('users.name')
  84. ->get(['users.id', 'users.name', 'user_types.system_key as user_type_system_key'])
  85. : collect();
  86. return $this->items(UserSelectResource::collection($items));
  87. }
  88. public function franchiseeStudents(): JsonResponse
  89. {
  90. $unitId = $this->activeUnitId();
  91. $items = $unitId
  92. ? Student::where('unit_id', $unitId)->orderBy('name')->get()
  93. : collect();
  94. return $this->items(StudentSelectResource::collection($items));
  95. }
  96. public function userTypes(): JsonResponse
  97. {
  98. $scope = request()->input('access_scope', auth()->user()?->access_scope);
  99. $unitId = request()->integer('unit_id') ?: $this->activeUnitId();
  100. $isFranchisorAssignment = request()->boolean('include_system_admin');
  101. $items = UserType::query()
  102. ->when($scope === 'unit' && $unitId, fn ($query) => $query->where('unit_id', $unitId))
  103. ->when($scope === 'unit' && !$unitId, fn ($query) => $query->where('system_key', 'ADMIN_FRANCHISEE'))
  104. ->when($scope === 'franchisor', fn ($query) => $query->whereNull('unit_id'))
  105. ->when(
  106. $scope === 'unit' && $isFranchisorAssignment,
  107. fn ($query) => $query->where(fn ($types) => $types->where('is_system', false)->orWhere('system_key', 'ADMIN_FRANCHISEE')),
  108. fn ($query) => $query->where('is_system', false),
  109. )
  110. ->orderBy('label')->get();
  111. return $this->items(UserTypeSelectResource::collection($items));
  112. }
  113. public function inhabitantClassifications(): JsonResponse
  114. {
  115. return $this->items(InhabitantClassificationSelectResource::collection(
  116. InhabitantClassification::with('municipalitySize')->orderBy('description')->get()
  117. ));
  118. }
  119. public function municipalitySizes(): JsonResponse
  120. {
  121. return $this->items(MunicipalitySizeSelectResource::collection(MunicipalitySize::orderBy('id')->get()));
  122. }
  123. public function financialPlanAccounts(): JsonResponse
  124. {
  125. $unitId = $this->activeUnitId();
  126. $items = FinancialPlanAccount::query()
  127. ->when(
  128. $unitId,
  129. fn ($query) => $query->where(fn ($scope) => $scope->where('unit_id', $unitId)->orWhereNull('unit_id')),
  130. fn ($query) => $query->whereNull('unit_id'),
  131. )
  132. ->orderBy('code')->get();
  133. return $this->items(FinancialPlanAccountSelectResource::collection($items));
  134. }
  135. private function items($items): JsonResponse
  136. {
  137. return $this->successResponse(payload: $items);
  138. }
  139. }