HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/vhost/disk-apps/teamdemo.sports-crowd.com/app/Core/User/Application/UserService.php
<?php

declare(strict_types=1);

namespace App\Core\User\Application;

use App\Address;
use App\Core\Address\Application\AddressService;
use App\Core\Parameter\Application\ParameterService;
use App\Core\Payment\Entities\Customer;
use App\Events\User\NewUserProcessesEvent;
use App\Models\Dependent;
use App\Models\Membership\MembershipSubscriber;
use App\User;
use Carbon\Carbon;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;

class UserService
{
    private $addressService;
    private $parameterService;

    public function __construct()
    {
        $this->addressService = new AddressService();
        $this->parameterService = new ParameterService();
    }

    public function find(int $id)
    {
        $user = User::find($id);
        if (!$user) {
            $user = User::where('id', $id)->withTrashed()->first();
        }
        return $user;
    }

    public function buildCustomerFromUser($user): Customer
    {
        return new Customer(
            (int) $user->id,
            $user->document,
            $user->documentType->alias,
            $user->first_name,
            $user->last_name,
            $user->email,
            $user->phone
        );
    }

    public function buildCustomerFromUserId($id): Customer
    {
        $user = $this->find((int)$id);
        return $this->buildCustomerFromUser($user);
    }

    public function addTags(User $user, array $tags)
    {
        $user->tags()->syncWithoutDetaching($tags);
    }

    public function removeTags(User $user, array $tags)
    {
        $user->tags()->detach($tags);
    }

    public function getLastUsedAddress(User $user)
    {
        return Address::where('user_id', $user->id)
            ->where('last_used', 1)
            ->first();
    }

    public function setLastUsedAddress(User $user, Address $address)
    {
        if (is_null($address->lat) || is_null($address->long)) {
            $this->addressService->storeGeocode($address);
        }

        Address::where('user_id', $user->id)
            ->update(['last_used' => 0]);

        $address->last_used = true;
        $address->save();
    }

    public function getMemberships(User $user)
    {
        return $user->memberships;
    }

    public function getActiveMemberships(User $user)
    {
        $user = User::with('memberships')
            ->whereHas('memberships', function ($query) {
                $query->where('membership_subscribers.status', '=', "CONFIRMED");
                $query->orderBy('id', 'desc');
            });

        return $user->get();
    }

    public function hasMembership(User $user, MembershipSubscriber $membershipSubscriber)
    {
        $result = MembershipSubscriber::where('membership_subscribers.user_id', '=', $user->id)
            ->where('membership_subscribers.membership_id', '=', $membershipSubscriber->membership_id)
            ->where('membership_subscribers.status', '!=',  "PENDING")
            ->first();

        return $result;
    }

    public function getExpiredMemberships(User $user)
    {
        $user = User::with('memberships')
            ->whereHas('memberships', function ($query) {
                $query->where('membership_subscribers.status', '=', "EXPIRED");
                $query->orderBy('id', 'desc');
            });

        return $user->get();
    }

    public function dispatchNewUserProcesses($users, $mailTemplate)
    {
        NewUserProcessesEvent::dispatch($users, $mailTemplate);
    }

    public function executeNewUserProcesses($users, $mailTemplate)
    {
        $appStoreUrl = $this->parameterService->appStoreUrl();
        $playStoreUrl = $this->parameterService->playStoreUrl();

        foreach ($users as $item) {
            $user = $item['user'];
            $password = $item['password'];

            Mail::send(
                $mailTemplate,
                [
                    'user'          => $user,
                    'password'      => $password,
                    'appStoreUrl'   => $appStoreUrl,
                    'playStoreUrl'  => $playStoreUrl,
                ],
                function ($message) use ($user) {
                    $message->from('noreply@sports-crowd.com', 'Sports Crowd');
                    $message->to($user->email);
                    $message->subject('Creación cuenta usuario');
                }
            );
        }
    }

    public function updateLastSession(Request $request)
    {
        $user = $request ? $request->user() : User::find(Auth::user()->id);
        if (!$user) {
            throw new Exception('No se encontró el usuario', 400);
        }
        $user->last_session = Carbon::now();
        $user->update();
        return array('r' => true, 'm' => 'Ultima sesión actualizada');
    }

    public function getUserByEmail($email)
    {
        $user = User::where('email', $email)->first();
        if (!$user) {
            $user = User::where('email', $email)->withTrashed()->first();
        }
        return $user;
    }

    public function getClientData($request)
    {
        $sinceDate = $request->sinceDate;
        if (!$sinceDate) {
            throw new Exception('No existe el filtro de fecha, es necesario el parametro: sinceDate', 400);
        }

        DB::statement("SET sql_mode = ''");
        $query = DB::table('users')
            ->select([
                // Campos cliente
                DB::raw('IFNULL(SHA2(users.id, 256), "") AS id'),
                DB::raw('IFNULL(users.first_name, "") AS firstName'),
                DB::raw('IFNULL(users.last_name, "") AS lastName'),
                DB::raw('IFNULL(users.email, "") AS email'),
                DB::raw('IFNULL(users.document, "") AS documentNumber'),
                DB::raw('IFNULL(document_types.name, "") AS documentType'),
                DB::raw('IFNULL(user_informations.dob, "") AS birthDate'),
                DB::raw('IFNULL(users.phone, "") AS phoneNumber'),
                DB::raw("DATE_FORMAT(users.created_at, '%Y-%m-%d %r') AS registrationDate"),
                DB::raw("IFNULL(DATE_FORMAT(users.last_session, '%Y-%m-%d'), '') AS lastLoginDate"),
                DB::raw("IFNULL(DATE_FORMAT(users.last_session, '%r'), '') AS lastLoginTime"),
                DB::raw("
                    CASE user_informations.sex
                        WHEN 'M' THEN '" . __('messages.sex_types.male') . "'
                        WHEN 'F' THEN '" . __('messages.sex_types.female') . "'
                        WHEN 'I' THEN '" . __('messages.sex_types.indeterminate') . "'
                        ELSE ''
                    END AS gender
                "),
                DB::raw('IFNULL(GROUP_CONCAT(DISTINCT(tags.name)), "") AS segmentation'),
                DB::raw("IFNULL(GROUP_CONCAT(DISTINCT(terms.version)), '') AS dataProcessingConsent"),
            ])
            ->leftjoin('document_types', 'document_types.id', '=', 'users.document_type_id')
            ->leftjoin('user_informations', 'user_informations.user_id', '=', 'users.id')
            ->leftJoin('user_tags', function ($join) {
                $join->on('user_tags.user_id', '=', 'users.id')->whereNull('user_tags.academy_user_id');
            })
            ->leftjoin('tags', function ($join) {
                $join->on('tags.id', '=', 'user_tags.tag_id')->where('tags.active', 1);
            })
            ->leftjoin('term_clients', 'term_clients.user_id', '=', 'users.id')
            ->leftjoin('terms', 'terms.id', '=', 'term_clients.term_id')
            ->whereNull('users.deleted_at')
            ->groupBy('users.id');

        $query->when($sinceDate, function ($query) use ($sinceDate) {
            if ($sinceDate != 'null') {
                $query->where(function ($query) use ($sinceDate) {
                    $query->where('users.created_at', '>=', $sinceDate)
                        ->orWhere('users.updated_at', '>=', $sinceDate);
                });
            }
        });

        $query->orderBy('users.id', 'DESC');
        DB::statement("SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");
        return $query;
    }

    public function createUser($userData)
    {
        if (User::where('email', $userData->email)->exists()) {
            throw new \Exception('A user with this email already exists.');
        }

        $user = new User();
        $user->first_name = $userData->first_name;
        $user->last_name = $userData->last_name;
        $user->email = $userData->email;
        $user->password = Hash::make($userData->password);
        $user->document = $userData->document;
        $user->document_type_id = $userData->document_type_id;
        $user->phone = $userData->phone;
        $user->dial_code = $userData->dial_code;
        $user->country_code = $userData->country_code;

        $user->rol_id = 4;

        $user->save();

        return $user;
    }

    public function checkAvailability($email)
    {
        return User::where('email', $email)->exists();
    }

    public function createDependent($user, $dependentData)
    {
        $dependent = new Dependent();
        $dependent->guardian_user_id = $user->id;
        $dependent->first_name = $dependentData->first_name;
        $dependent->last_name = $dependentData->last_name;
        $dependent->dob = $dependentData->dob;
        $dependent->relationship = $dependentData->relationship;
        $dependent->save();

        return $dependent;
    }

    public function dependentHasMembership($membershipSubscriber)
    {
        $result = MembershipSubscriber::where(
                'membership_subscribers.dependent_id', '=', $membershipSubscriber->dependent_id
            )
            ->where('membership_subscribers.membership_id', '=', $membershipSubscriber->membership_id)
            ->where('membership_subscribers.status', '!=',  "PENDING")
            ->first();

        return $result;
    }
}