File manager - Edit - /var/www/html/spdc/api/app/Http/Services/OccurrencyService.php
Back
<?php namespace App\Http\Services; use App\Models\Form; use App\Models\Field; use App\Models\Phone; use App\Models\Address; use App\Models\Category; use App\Models\Occurrency; use Illuminate\Http\Request; use App\Models\CategoryOption; use App\Enums\OccurrencySection; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\DB; use App\Models\OccurrencyRequester; use App\Classes\BaseServiceResponse; use Illuminate\Support\Facades\Schema; use App\Http\Requests\OccurrencyRequest; use App\Http\Resources\OccurrenceMinimalCollection; use Illuminate\Support\Facades\Validator; use App\Http\Resources\OccurrencyResource; use App\Http\Resources\OccurrencyCollection; class OccurrencyService extends BaseService { public function index(Request $request): BaseServiceResponse { return $this->response( new OccurrenceMinimalCollection($this->filterData($request)) ); } public function store(OccurrencyRequest $request): BaseServiceResponse { DB::beginTransaction(); $inputs = $request->all(); $user = $request->user; // occurrency requester $occurrencyRequester = OccurrencyRequester::updateOrCreate( ['document' => $inputs['occurrency_requester']['document']], $inputs['occurrency_requester'] ); // phones $phonesInputs = isset($inputs['occurrency_requester']['phones']) ? $inputs['occurrency_requester']['phones'] : []; if (count($phonesInputs) > 0) { $phonesIds = []; foreach ($phonesInputs as $phone) { $phonesIds[] = Phone::create($phone)?->id; } $occurrencyRequester->phones()->attach($phonesIds); } // address $address = Address::create($inputs['address']); /** * saving category option */ $category = Category::findOrFail($inputs['category_id']); $categoryOption = CategoryOption::updateOrCreate( ['name' => strtoupper($category->name)], ['sections' => $category->sections] ); /** * saving occurrency */ $occurrency = Occurrency::create([ ...$inputs, 'auth_user_id' => $user['id'], 'user' => [ 'name' => $user['name'], 'document' => $user['document'], 'registration' => $user['registration'], 'email' => $user['email'] ], 'address_id' => $address->id, 'original_category_id' => $inputs['category_id'], 'category_option_id' => $categoryOption->id, 'occurrency_requester_id' => $occurrencyRequester->id, ]); /** * saving forms and fields and validations */ if (isset($inputs['forms'])) { $occurrencyFormService = new OccurrencyFormService(); $result = $occurrencyFormService->store($inputs['forms'], $occurrency); if (!$result->data['data']['success']) { DB::rollBack(); return $this->response($result->data['data']['errors'], $result->code, $result->data['message']); } } // occurrency type if (isset($request->occurrency_type)) { $occurrency->occurrencyTypes()->attach([$request->occurrency_type]); } DB::commit(); /** * move occurrency to next step */ $this->moveOccurrency($occurrency, $request->user); return $this->response( new OccurrencyResource($occurrency->load([ 'requester.phones', 'address', 'category', 'originalCategory', 'forms.fields.validations', 'inspection', 'execution' ])), JsonResponse::HTTP_CREATED ); } public function show(Request $request, Occurrency $occurrency): BaseServiceResponse { if ($request->has('section')) { $occurrency = $occurrency->load([ 'forms' => function ($query) use ($request) { $query->where('section', strtoupper($request->section)); $query->with(['fields.validations']); }, 'requester.phones', 'address', 'category', 'originalCategory', 'inspection', 'execution' ]); } else { $occurrency->load([ 'requester.phones', 'address', 'category', 'originalCategory', 'forms.fields.validations', 'inspection', 'execution' ]); } return $this->response( new OccurrencyResource($occurrency), JsonResponse::HTTP_OK ); } public function update(OccurrencyRequest $request, Occurrency $occurrency): BaseServiceResponse { // Update only REGISTRO section fields DB::beginTransaction(); $inputs = $request->all(); $user = $request->user; $currentSection = $inputs['current_section']; // occurrency $occurrency->fill($inputs)->save(); // occurrency requester $occurrencyRequester = OccurrencyRequester::updateOrCreate( ['document' => $inputs['occurrency_requester']['document']], $inputs['occurrency_requester'] ); if ($occurrency->requester->id !== $occurrencyRequester->id) { $occurrency->fill(['occurrency_requester_id' => $occurrencyRequester->id])->save(); } // phones $phonesInputs = isset($inputs['occurrency_requester']['phones']) ? $inputs['occurrency_requester']['phones'] : []; if (count($phonesInputs) > 0) { $phonesIds = []; foreach ($phonesInputs as $phone) { if (isset($phone['id'])) { $phonesIds[] = Phone::updateOrCreate( ['id' => $phone['id']], $phone )?->id; } else { $phonesIds[] = Phone::create($phone)?->id; } } $occurrencyRequester->phones()->sync($phonesIds); } //address $occurrency->address->fill($inputs['address'])->save(); // occurrency type if (isset($request->occurrency_type)) { $occurrency->occurrencyTypes()->sync([$request->occurrency_type]); } /** * saving forms and fields and validations */ if (isset($inputs['forms'])) { $occurrencyFormService = new OccurrencyFormService(); $result = $occurrencyFormService->update($inputs['forms'], $occurrency, 'REGISTRO'); if (!$result->data['data']['success']) { DB::rollBack(); return $this->response($result->data['data']['errors'], $result->code, $result->data['message']); } } DB::commit(); // $this->move($request, $occurrency); return $this->response( new OccurrencyResource($occurrency->load([ 'requester.phones', 'address', 'category', 'originalCategory', 'forms.fields.validations', 'inspection', 'execution' ])), JsonResponse::HTTP_OK ); } public function destroy(Occurrency $occurrency): BaseServiceResponse { $occurrency->delete(); return $this->response( null, JsonResponse::HTTP_NO_CONTENT ); } public function destroyMany(Request $request): BaseServiceResponse { Occurrency::destroy($request->occurrencies); return $this->response( null, JsonResponse::HTTP_NO_CONTENT ); } public function move(Request $request, Occurrency $occurrency): BaseServiceResponse { $occurrency->movements()->create([ 'user_id' => $request->user['id'], 'section' => $request->current_section ]); return $this->response( null, JsonResponse::HTTP_NO_CONTENT ); } private function filterData(Request $request) { $query = null; if ($request->has('code')) { $query = $this->incrementQuery($query, 'CONTAINS', Occurrency::class, 'code', $request->code); } if ($request->has('created_at_start') && $request->has('created_at_end')) { $query = $this->incrementQuery($query, 'BETWEEN', Occurrency::class, 'created_at', [$request->created_at_start, $request->created_at_end]); } elseif ($request->has('created_at_start') && !$request->has('created_at_end')) { $query = $this->incrementQuery($query, 'EQUAL OR GREATER THAN', Occurrency::class, 'created_at', $request->created_at_start); } elseif (!$request->has('created_at_start') && $request->has('created_at_end')) { $query = $this->incrementQuery($query, 'EQUAL OR LESS THAN', Occurrency::class, 'created_at', $request->created_at_end); } if ($request->has('category')) { $query = $this->incrementQuery($query, 'EQUAL', Occurrency::class, 'category_option_id', $request->category); } if (!isset($query)) { $query = Occurrency::query(); } if ($request->has('occurrency_type')) { $query = $query->whereRelation('occurrencyTypes', 'occurrency_occurrency_type.occurrency_type_id', $request->occurrency_type); } if ($request->has('postal_code')) { $query = $query->whereRelation('address', 'postal_code', $request->postal_code); } if ($request->has('street')) { $query = $query->whereRelation('address', 'street', $request->street); } if ($request->has('neighborhood')) { $query = $query->whereRelation('address', 'neighborhood', $request->neighborhood); } if ($request->has('city')) { $query = $query->whereRelation('address', 'city', $request->city); } if ($request->has('state')) { $query = $query->whereRelation('address', 'state', $request->state); } if ($request->has('complement')) { $query = $query->whereRelation('address', 'complement', $request->complement); } if ($request->has('reference_point')) { $query = $query->whereRelation('address', 'reference_point', $request->reference_point); } if ($request->has('number')) { $query = $query->whereRelation('address', 'number', $request->number); } if ($request->has('current_section')) { $sections = explode(',', $request->current_section); $query = $query->whereHas('movements', function ($subquery) use ($sections) { $subquery->whereIn('id', function ($subsubquery) { $subsubquery->selectRaw('MAX(id)') ->from('occurrency_movements') ->whereColumn('occurrency_id', 'occurrencies.id'); })->whereIn('section', $sections); }); } $result = $query->paginate(15); return $result; } // private function filteredData(Request $request) // { // $filters = treatArrayInput($request->query('filters')); // $query = null; // if(empty($filters)) { // return Occurrency::paginate(15); // } // foreach($filters as $queryType => $attributes) { // foreach($attributes as $column => $value) { // switch(strtoupper($queryType)) { // case 'BETWEEN': // if (is_array($value) && count($value) === 2) { // $query = $this->incrementQuery($query, $queryType, Occurrency::class, $column, $value); // } // break; // case 'EQUAL': // if (is_string($value) && !empty($value)) { // $query = $this->incrementQuery($query, $queryType, Occurrency::class, $column, $value); // } // break; // case 'CONTAINS': // if (is_string($value) && !empty($value)) { // $query = $this->incrementQuery($query, $queryType, Occurrency::class, $column, $value); // } // break; // case 'IN': // if (is_array($value) && !empty($value)) { // $query = $this->incrementQuery($query, $queryType, Occurrency::class, $column, $value); // } // break; // } // } // } // if(empty($query)) { // return Occurrency::paginate(15); // } // return $query->paginate(15); // } private function incrementQuery($query, $queryType, $model, $column, $value) { $table = (new $model())->getTable(); if (is_null($query)) { $query = $model::query(); } if(Schema::hasColumn($table, $column)) { switch(strtoupper($queryType)) { case 'BETWEEN': $query = $query->where(function ($query) use ($column, $value) { $query->whereBetween($column, $value); }); return $query; case 'EQUAL': $query = $query->where(function ($query) use ($column, $value) { $query = $query->where(DB::raw('lower(' . $column . ')'), '=', strtolower($value)); }); return $query; case 'CONTAINS': $query = $query->where(function ($query) use ($column, $value) { $query = $query->where(DB::raw('lower(' . $column . ')'), 'LIKE', '%'.strtolower($value).'%'); }); return $query; case 'IN': $query = $query->where(function ($query) use ($column, $value) { $query = $query->whereIn($column, $value); }); return $query; case 'EQUAL OR GREATER THAN': $query = $query->where(function ($query) use ($column, $value) { $query = $query->where($column, '>=', $value); }); return $query; case 'EQUAL OR LESS THAN': $query = $query->where(function ($query) use ($column, $value) { $query = $query->where($column, '<=', $value); }); return $query; } } return $query; } private function moveOccurrency(Occurrency $occurrency, $userData) { $occurrency->movements()->firstOrCreate([ 'user_id' => $userData['id'], 'section' => OccurrencySection::REGISTRO->value ]); $sections = isset($occurrency->originalCategory) ? $occurrency->originalCategory?->sections : $occurrency->category?->sections; // dd($sections); /* if (isset($sections)) { if (in_array(OccurrencySection::VISTORIA->value, $sections)) { $occurrency->movements()->create([ 'user_id' => $userData['id'], 'section' => OccurrencySection::VISTORIA->value ]); } elseif (in_array(OccurrencySection::EXECUÇÃO->value, $sections)) { $occurrency->movements()->create([ 'user_id' => $userData['id'], 'section' => OccurrencySection::EXECUÇÃO->value ]); } } */ } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings