![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/dceprojects.corals.io/Corals/modules/ProjectPlan/Services/ |
<?php namespace Corals\Modules\ProjectPlan\Services; use Corals\Foundation\Services\BaseServiceClass; use Corals\Media\Traits\MediaControllerTrait; use Corals\Modules\ProjectPlan\Jobs\NotifyProjectCrewsMembers; use Corals\Modules\ProjectPlan\Models\Project; use Corals\Modules\ProjectPlan\Models\ProjectAirfare; use Corals\Modules\ProjectPlan\Models\ProjectCrew; use Corals\Modules\ProjectPlan\Models\ProjectHotel; use Corals\Modules\ProjectPlan\Models\ProjectVendor; use Corals\Modules\ProjectPlan\Models\Schedule; use Corals\Modules\Utility\Facades\ListOfValue\ListOfValues; use Corals\Modules\Utility\Models\ListOfValue\ListOfValue; use Corals\User\Models\User; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Support\Arr; class ProjectService extends BaseServiceClass { use ValidatesRequests, MediaControllerTrait; public function preStoreUpdate($request, &$additionalData) { $this->validateAttachment($request); } /** * @param $request * @param $additionalData */ public function postStoreUpdate($request, &$additionalData) { $project = $this->model; $this->handlePositionCrew($project); $this->handleProjectVendors($project); $this->handleSchedules($project); $this->handleMeals($project->fresh()); $this->notifyCrewsMembers($project); $this->sendPendingApprovalNotification($project); $this->handleAttachments($request, $this->model); $this->handleProjectTravels($project); } /** * @param Project $project */ public function notifyCrewsMembers(Project $project): void { if ($project->status == 'approved') { NotifyProjectCrewsMembers::dispatch($project); } } /** * @param Project $project */ public function sendPendingApprovalNotification(Project $project): void { if (data_get($project->getChanges(), 'status') === 'pending_approval') { event('notifications.project_plan.project_pending_approval_notification', [ 'project' => $project, ]); } } /** * @param Project $project */ protected function handleMeals(Project $project): void { $schedules = $project->schedules; $mealsToInsert = []; foreach (request('meals', []) as $mealType => $mealSchedule) { foreach ($mealSchedule as $scheduleType => $meal) { if (!data_get($meal, 'included')) { continue; } $schedule = $schedules->where('type', $scheduleType)->first(); $meal['schedule_id'] = $schedule->id; $meal['meal'] = $mealType; unset($meal['included']); $mealsToInsert[] = $meal; } } $project->meals()->forceDelete(); $project->meals()->createMany($mealsToInsert); } /** * @param Project $project */ protected function handleSchedules(Project $project) { foreach (request('schedule', []) as $schedule) { unset($schedule['with_meals']); if (is_null($schedule['id'])) { $schedulesToInsert[] = $schedule; } else { $schedulesToKeep[] = $schedule['id']; Schedule::where('id', $schedule['id'])->update($schedule); } } if (!empty($schedulesToKeep)) { Schedule::query()->where('pp_schedules.project_id', $project->id) ->whereNotIn('id', $schedulesToKeep) ->delete(); } if (isset($schedulesToInsert)) { $project->schedules()->createMany($schedulesToInsert); } } /** * @param Project $project */ protected function handleProjectVendors(Project $project): void { $includedProjectVendors = []; foreach (request('vendors', []) as $vendorType => $vendors) { foreach ($vendors as $index => $vendorData) { $projectVendor = ProjectVendor::query()->updateOrCreate( ['project_id' => $project->id, 'vendor_id' => $vendorData['vendor_id'], 'type' => $vendorData['type']], [ 'properties' => $vendorData['properties'] ] ); $includedProjectVendors[] = $projectVendor->id; } } ProjectVendor::where('project_id', $project->id) ->whereNotIn('id', $includedProjectVendors)->delete(); } /** * @param Project $project */ protected function handlePositionCrew(Project $project): void { $crewsToInsert = []; foreach (request('position_crew', []) as $users) { foreach ($users as $user) { foreach ($user as $userData) { $user = array_merge($userData, [ 'project_id' => $project->id ]); $user['properties'] = json_encode(data_get($userData, 'properties')); $user['created_at'] = now(); $crewsToInsert[] = $user; } } //delete all old records that are not in update list. ProjectCrew::query()->where('project_id', $project->id) ->each(function (ProjectCrew $projectCrew) { $projectCrew->surveyResponses()->delete(); $projectCrew->delete(); }); if ($crewsToInsert) { ProjectCrew::query()->insert($crewsToInsert); } } } /** * @param $positionsCode * @param $position_crew * @return array */ public function getFormattedCrewAndPositions($positionsCode, $position_crew) { foreach ($position_crew as $positionCode => $crews) { foreach ($crews as $userIndex => $userArray) { foreach ($userArray as $userId => $userData) { $user = User::find($userId); $position_crew[$positionCode][$userIndex][$userId]['id'] = $user->id; $position_crew[$positionCode][$userIndex][$userId]['full_name'] = $user->present('full_name'); $position_crew[$positionCode][$userIndex][$userId]['email'] = $user->present('email'); $position_crew[$positionCode][$userIndex][$userId]['phone_number'] = $user->present('phone'); } } } $positions = ListOfValue::query()->whereIn('code', $positionsCode)->pluck('label', 'code'); return compact('position_crew', 'positions'); } /** * @param $vendorsCode * @param $project_vendors * @return array */ public function getFormattedVndorsAndTypes($vendorsCode, $vendor_data) { $vendor_types = Arr::only(ListOfValues::get('vendor-types'), $vendorsCode); return compact('vendor_data', 'vendor_types'); } /** * @param $request * @throws \Illuminate\Validation\ValidationException */ protected function validateAttachment($request) { $rules = []; $attributes = []; $messages = []; $this->attachmentsValidation($request, $rules, $attributes); $this->validate($request, $rules, $messages, $attributes); } public function getFormattedTravelsAndTypes($travelsCode, $travel_data) { $travel_types = Arr::only(ListOfValues::get('travel-types'), $travelsCode); return compact('travel_data', 'travel_types'); } protected function handleProjectTravels(Project $project): void { $includedProjectHotels = []; $includedProjectAirfare = []; foreach (request('travels', []) as $key => $travelObject) { foreach ($travelObject as $index => $data) { if ($key === 'lodging') { $projectHotel = ProjectHotel::query()->updateOrCreate( ['project_id' => $project->id, 'hotel_id' => $data['hotel_id']], [ 'properties' => $data['properties'] ] ); $includedProjectHotels[] = $projectHotel->id; } else if ($key === 'airfare') { $projectAirfare = ProjectAirfare::query()->updateOrCreate( ['project_id' => $project->id, 'airfare_code' => $data['airfare_code']], [ 'properties' => $data['properties'] ] ); $includedProjectAirfare[] = $projectAirfare->id; } } } ProjectHotel::where('project_id', $project->id) ->whereNotIn('id', $includedProjectHotels)->delete(); ProjectAirfare::where('project_id', $project->id) ->whereNotIn('id', $includedProjectAirfare)->delete(); } }