Spamworldpro Mini Shell
Spamworldpro


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/dceprojects.corals.io/Corals/modules/ProjectPlan/Services/ProjectService.php
<?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();
    }


}



Spamworldpro Mini