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;
}
}