File: /var/www/vhost/disk-apps/qas.sports-crowd.com/app/Http/Controllers/AcademyTournamentController.php
<?php
namespace App\Http\Controllers;
use App\AcademyCategoriesSchedule;
use App\AcademyCategory;
use App\AcademyLocation;
use App\AcademySchedule;
use DataTables;
use App\AcademyTournament;
use App\AcademyTournamentCategory;
use App\AcademyTournamentErp;
use App\AcademyTournamentFee;
use App\AcademyTournamentTag;
use App\Core\CorporateIdentity\Application\CorporateIdentityService;
use App\Parameter;
use App\Services\AcademyLocationsService;
use App\Tag;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class AcademyTournamentController extends Controller
{
private $util;
private $types = ['', 'TORNEO LOCAL', 'TORNEO NACIONAL', 'TORNEO INTERNACIONAL', 'OTRO'];
public function __construct()
{
$this->util = new UtilController();
}
public function index($type_academy = 'children')
{
$syncERP = Parameter::select('sync_siesa')->first()->sync_siesa;
$types = $this->types;
$corporateIdentity = CorporateIdentityService::get();
return view('academy.tournaments.list', compact('type_academy', 'syncERP', 'types', 'corporateIdentity'));
}
public function indexAdd($type_academy)
{
$syncERP = Parameter::select('sync_siesa')->first()->sync_siesa;
$types = $this->types;
$multiselectItems = Tag::select('id', 'name')->where('active', true)->get();
$locations = $this->getLocations();
$categories = $this->getCategories();
$schedules = $this->getSchedules();
$enableFranchises = $this->enableFranchises();
return view('academy.tournaments.create', compact('type_academy', 'syncERP', 'types', 'multiselectItems', 'locations', 'categories', 'schedules', 'enableFranchises'));
}
public function indexEdit($id)
{
$object = AcademyTournament::with('academy_tournament_erp', 'academy_tournament_fees')->findOrFail($id);
$syncERP = Parameter::select('sync_siesa')->first()->sync_siesa;
$types = $this->types;
$multiselectItems = Tag::select('id', 'name')->where('active', true)->get();
$locations = $this->getLocations();
$categories = $this->getCategories();
$schedules = $this->getSchedules();
$enableFranchises = $this->enableFranchises();
$multiselectValues = AcademyTournamentTag::select('tag_id')->where('academy_tournament_id', $id)->get();
$academyTournamentLocations = AcademyTournamentCategory::select('academy_categories.academy_location_id')
->join('academy_categories', 'academy_categories.id', '=', 'academy_tournament_categories.academy_category_id')
->where('academy_tournament_id', $id)
->pluck('academy_categories.academy_location_id')
->toArray();
$academyTournamentCategories = AcademyTournamentCategory::select('academy_category_id')
->where('academy_tournament_id', $id)
->pluck('academy_category_id')
->toArray();
$rawSchedules = AcademyTournamentCategory::select(DB::raw('DISTINCT academy_schedules'))
->where('academy_tournament_id', $id)
->pluck('academy_schedules')
->toArray();
$academyTournamentSchedules = [];
foreach ($rawSchedules as $sched) {
if ($sched === null) continue;
if (is_array($sched)) {
$academyTournamentSchedules = array_merge($academyTournamentSchedules, array_filter($sched));
} else {
$ids = explode(',', $sched);
$academyTournamentSchedules = array_merge($academyTournamentSchedules, array_filter($ids));
}
}
//dd($academyTournamentSchedules);
return view('academy.tournaments.edit', compact('object', 'syncERP', 'types', 'multiselectItems', 'locations', 'categories', 'schedules', 'enableFranchises', 'multiselectValues', 'academyTournamentLocations', 'academyTournamentCategories', 'academyTournamentSchedules'));
}
public function tableFilter($types = null, $from_term = null, $to_term = null, $from_date = null, $to_date = null, $type_academy, $categories = null)
{
DB::statement("SET sql_mode = ''");
$obj = AcademyTournament::select(
'academy_tournaments.id',
'academy_tournaments.name',
'academy_tournaments.description',
'academy_tournaments.type',
'academy_tournaments.image',
'price',
'discount',
DB::raw('IFNULL(payment_installments,"NO") AS payment_installments'),
'academy_tournaments.enable_price_payment_installments',
'academy_tournaments.enable_percentage_payment_installments',
DB::raw('GROUP_CONCAT(DISTINCT(tags.name)) AS segmentation'),
'payday_limit',
'start_date',
'end_date',
'academy_tournaments.created_at',
'academy_tournaments.active',
DB::raw('GROUP_CONCAT(DISTINCT(CONCAT(academy_categories.name, " (' . config('app.location') . ': ", academy_locations.name, ")"))) AS categories'),
'academy_tournament_erps.registration_service_item_code',
'academy_tournament_erps.cost_center',
)
->leftjoin('academy_tournament_tags', 'academy_tournament_tags.academy_tournament_id', '=', 'academy_tournaments.id')
->leftjoin('tags', function ($join) {
$join->on('tags.id', '=', 'academy_tournament_tags.tag_id')->where('tags.active', 1);
})
->leftjoin('academy_tournament_categories', 'academy_tournament_categories.academy_tournament_id', '=', 'academy_tournaments.id')
->leftjoin('academy_categories', 'academy_categories.id', '=', 'academy_tournament_categories.academy_category_id')
->leftjoin('academy_locations', 'academy_locations.id', '=', 'academy_categories.academy_location_id')
->leftjoin('academy_tournament_erps', 'academy_tournament_erps.id', '=', 'academy_tournaments.academy_tournament_erp_id')
->where('academy_tournaments.type_academy', $type_academy)
->groupBy('academy_tournaments.id');
DB::statement("SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");
$academyLocationsService = new AcademyLocationsService;
if (!$academyLocationsService->validateAuthorizedLocations()) {
$authorizedLocations = $academyLocationsService->getAuthorizedLocations();
$obj->whereIn('academy_categories.academy_location_id', $authorizedLocations);
}
$categories = (!empty($categories) && !is_array($categories)) ? explode(',', $categories) : $categories;
$categories = array_filter($categories, fn($v) => $v !== null && $v !== '' && $v !== 'null');
if (!empty($categories)) {
$obj->whereIn('academy_categories.id', $categories);
}
if ($types && $types != 'null') {
$types = explode(',', $types);
$obj->whereIn('academy_tournaments.type', $types);
}
if ($from_term && $from_term != 'null') {
$obj->whereDate('academy_tournaments.created_at', '>=', $from_term);
}
if ($to_term && $to_term != 'null') {
$obj->whereDate('academy_tournaments.created_at', '<=', $to_term);
}
if ($from_date && $from_date != 'null') {
$obj->whereDate('academy_tournaments.start_date', '>=', $from_date);
}
if ($to_date && $to_date != 'null') {
$obj->whereDate('academy_tournaments.end_date', '<=', $to_date);
}
return DataTables::of($obj)
->addColumn('actions', function ($obj) {
return '
<i class="fa fa-pencil iconMini" onClick="clickEdit(' . $obj->id . ')" data-id="' . $obj->id . '" title="Editar"></i>
<i class="fa fa-trash iconMini" onClick="clickDelete(' . $obj->id . ')" data-id="' . $obj->id . '" title="Eliminar"></i>
';
})
->editColumn('active', function ($obj) {
if ($obj->active == 0) {
return '<div class="switch"><label><div class="checkbox checbox-switch switch-success"> <label> ' . __('messages.no') . ' <input type="checkbox" onChange="chk(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" /> <span></span>' . __('messages.yes') . ' </label></div> </label> </div>';
} else {
return '<div class="switch"><label> <div class="checkbox checbox-switch switch-success"> <label> ' . __('messages.no') . ' <input type="checkbox" onChange="chk(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" checked="" />
<span></span> ' . __('messages.yes') . ' </label> </div> </label> </div>';
}
})
->editColumn('image', function ($obj) {
return $obj->image ? $this->util->generateImageColumn($obj->image, $obj->name, $obj->id) : $this->util->generateEmptyImageColumn();
})
->editColumn('payday_limit', function ($obj) {
return \Carbon\Carbon::parse($obj->payday_limit)->format('Y-m-d h:i:s A');
})
->editColumn('start_date', function ($obj) {
return \Carbon\Carbon::parse($obj->start_date)->format('Y-m-d h:i:s A');
})
->editColumn('end_date', function ($obj) {
return \Carbon\Carbon::parse($obj->end_date)->format('Y-m-d h:i:s A');
})
->editColumn('created_at', function ($obj) {
return \Carbon\Carbon::parse($obj->created_at)->format('Y-m-d h:i:s A');
})
->rawColumns(['actions', 'active', 'image'])
->make(true);
}
public function create(Request $request)
{
try {
$tournament = AcademyTournament::where('name', $request->input('name'))
->where('active', true)
->where('type_academy', $request->input('type_academy') ?? 'children')
->first();
if ($tournament) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
}
$enableFranchises = $this->enableFranchises();
if ($enableFranchises && !$request->input('categories')) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.categories_required'), "data" => null));
} else if ($request->input('locations') && !$request->input('categories')) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.categories_required'), "data" => null));
}
$tags = $request["tags"];
$request->request->remove('tags');
$fees = $request["fees"];
$request->request->remove('fees');
$data = $request->except(['generalMultiselect', 'tags', 'categories', 'registration_service_item_code', 'cost_center', 'academy_tournament_fees']);
if ($model = AcademyTournament::create($data)) {
if ($tags != null) {
foreach ($tags as $tagId) {
AcademyTournamentTag::create([
'tag_id' => $tagId,
'academy_tournament_id' => $model->id
]);
}
}
if ($request->input('categories')) {
$locations = $request->input('locations') && $request->input('locations')[0] ? $request->input('locations') : null;
$categories = $request->input('categories');
if ($request->input('categories') && !$request->input('categories')[0]) {
$categories = AcademyCategory::select('id')->when($locations, function ($query) use ($locations) {
return $query->whereIn('academy_location_id', $locations);
})
->where('active', true)
->pluck('id')->toArray();
}
foreach ($categories as $categoryId) {
$schedules = $request->input('schedules') && $request->input('schedules')[0] ? AcademyCategoriesSchedule::where('academy_category_id', $categoryId)->whereIn('academy_schedule_id', $request->input('schedules'))->pluck('academy_schedule_id')->toArray() : null;
$data = new AcademyTournamentCategory();
$data->academy_tournament_id = $model->id;
$data->academy_category_id = $categoryId;
$data->academy_schedules = $schedules ? implode(',', $schedules) : null;
$data->save();
}
}
if ($request->input('registration_service_item_code') || $request->input('cost_center')) {
$erp = AcademyTournamentErp::updateOrCreate([
'registration_service_item_code' => $request->input('registration_service_item_code'),
'cost_center' => $request->input('cost_center'),
]);
$model->update(['academy_tournament_erp_id' => $erp->id]);
}
if ($fees != null) {
$enablePrice = $request["enable_price_payment_installments"];
$enablePercentage = $request["enable_percentage_payment_installments"];
foreach ($fees as $index => $fee) {
AcademyTournamentFee::create([
'fee' => ($index + 1),
'price_discount' => $enablePrice ? $fee : 0,
'discount' => $enablePercentage ? $fee : 0,
'academy_tournament_id' => $model->id
]);
}
}
$this->registerLog(Auth::user()->id, 'Crear torneo academia', json_encode($request->all()), "Create", $this->getModule($request));
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.created_successfully'), "data" => $model->id));
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_creating'), "data" => null));
}
} catch (\Exception $e) {
return response(
array(
"r" => false,
"type" => "error",
"title" => "Oops...",
"m" => __($e->getMessage()),
"data" => null
)
);
}
}
public function update(Request $request, $id)
{
try {
$request['id'] = $id;
$tournament = AcademyTournament::where('academy_tournaments.id', '!=', $id)
->where('name', $request->input('name'))
->where('active', true)
->where('type_academy', $request->input('type_academy') ?? 'children')
->first();
if ($tournament) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
}
$enableFranchises = $this->enableFranchises();
if ($enableFranchises && !$request->input('categories')) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.categories_required'), "data" => null));
} else if ($request->input('locations') && !$request->input('categories')) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.categories_required'), "data" => null));
}
$tags = $request["tags"];
$request->request->remove('tags');
$fees = $request["fees"];
$request->request->remove('fees');
$data = $request->except(['generalMultiselect', 'tags', 'registration_service_item_code', 'cost_center', 'academy_tournament_fees', 'locations', 'categories', 'schedules']);
if (AcademyTournament::where('id', $id)->update($data)) {
AcademyTournamentTag::where('academy_tournament_id', $id)->delete();
if ($tags != null) {
foreach ($tags as $tagId) {
AcademyTournamentTag::create([
'tag_id' => $tagId,
'academy_tournament_id' => $id
]);
}
}
AcademyTournamentCategory::where('academy_tournament_id', $id)->delete();
if ($request->input('categories')) {
$locations = $request->input('locations') && $request->input('locations')[0] ? $request->input('locations') : null;
$categories = $request->input('categories');
if ($request->input('categories') && !$request->input('categories')[0]) {
$categories = AcademyCategory::select('id')->when($locations, function ($query) use ($locations) {
return $query->whereIn('academy_location_id', $locations);
})
->where('active', true)
->pluck('id')->toArray();
}
foreach ($categories as $categoryId) {
$schedules = $request->input('schedules') && $request->input('schedules')[0] ? AcademyCategoriesSchedule::where('academy_category_id', $categoryId)->whereIn('academy_schedule_id', $request->input('schedules'))->pluck('academy_schedule_id')->toArray() : null;
$data = new AcademyTournamentCategory();
$data->academy_tournament_id = $id;
$data->academy_category_id = $categoryId;
$data->academy_schedules = $schedules ? implode(',', $schedules) : null;
$data->save();
}
}
if ($request->input('registration_service_item_code') || $request->input('cost_center')) {
$erp = AcademyTournamentErp::select('academy_tournament_erps.*')->join('academy_tournaments', 'academy_tournaments.academy_tournament_erp_id', '=', 'academy_tournament_erps.id')
->where('academy_tournaments.id', $id)->first();
if (!$erp) {
$erp = AcademyTournamentErp::create([
'registration_service_item_code' => $request->input('registration_service_item_code'),
'cost_center' => $request->input('cost_center'),
]);
AcademyTournament::where('id', $id)->update(['academy_tournament_erp_id' => $erp->id]);
} else {
$erp->update([
'registration_service_item_code' => $request->input('registration_service_item_code'),
'cost_center' => $request->input('cost_center'),
]);
}
}
AcademyTournamentFee::where('academy_tournament_id', $id)->delete();
if ($fees != null) {
$enablePrice = $request["enable_price_payment_installments"];
$enablePercentage = $request["enable_percentage_payment_installments"];
foreach ($fees as $index => $fee) {
AcademyTournamentFee::create([
'fee' => ($index + 1),
'price_discount' => $enablePrice ? $fee : 0,
'discount' => $enablePercentage ? $fee : 0,
'academy_tournament_id' => $id
]);
}
}
$this->registerLog(Auth::user()->id, 'Editar torneo academia', json_encode($request->all()), "Update", $this->getModule($request));
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.created_successfully'), "data" => $id));
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_creating'), "data" => null));
}
} catch (\Exception $e) {
return response(
array(
"r" => false,
"type" => "error",
"title" => "Oops...",
"m" => __($e->getMessage()),
"data" => null
)
);
}
}
public function delete(Request $request, $id)
{
try {
$tournament = AcademyTournament::find($id);
AcademyTournamentCategory::where('academy_tournament_id', $id)->delete();
if (AcademyTournament::where('id', $id)->delete()) {
$this->registerLog(Auth::user()->id, 'Eliminar torneo academia', json_encode($tournament), "Delete", $this->getModule($request));
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.deleted_successfully'), "data" => null));
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_removing'), "data" => null));
}
} catch (\Illuminate\Database\QueryException $e) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.delete_relation_data'), "data" => null));
}
}
public function activate(Request $request)
{
try {
$id = $request['id'];
$state = $request['state'];
$tournament = AcademyTournament::find($id);
$tournament->active = $state;
$tournament->update();
$this->registerLog(Auth::user()->id, 'Activar/Desactivar torneo academia', json_encode($tournament), "Update", $this->getModule($request));
return array('r' => true, 'd' => null, 'm' => __('messages.updated_successfully'));
} catch (\Throwable $th) {
return array('r' => false, 'd' => null, 'm' => __('messages.error_updating'));
}
}
public function saveImage(Request $request)
{
try {
$extension = $request->file('image')->getClientOriginalExtension();
$filenametostore = $request->id . '.' . $extension;
Storage::disk('s3')->put(config('s3.academy') . '/academy_tournaments/' . $filenametostore, fopen($request->file('image'), 'r+'), 'public');
$url = config('filesystems.disks.s3.url') . '/academy/academy_tournaments/' . $filenametostore;
AcademyTournament::where('id', $request->id)->update(['image' => $url]);
$this->cleanTicketFiles();
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.updated_successfully'), "data" => null));
} catch (\Throwable $th) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_updating'), "data" => $th->getMessage()));
}
}
private function getLocations()
{
$locations = AcademyLocation::select('id', 'name')
->where('active', true)
->orderBy('name', 'ASC');
$academyLocationsService = new AcademyLocationsService;
if (!$academyLocationsService->validateAuthorizedLocations()) {
$authorizedLocations = $academyLocationsService->getAuthorizedLocations();
$locations = $locations->whereIn('id', $authorizedLocations);
}
return $locations->get();
}
private function getCategories()
{
$categories = AcademyCategory::select('academy_categories.id', 'academy_categories.name', 'academy_categories.academy_location_id')
->with('academy_location')
->where('academy_categories.active', true)
->whereNotNull('academy_categories.academy_location_id')
->orderBy('academy_categories.name', 'ASC');
$academyLocationsService = new AcademyLocationsService;
if (!$academyLocationsService->validateAuthorizedLocations()) {
$authorizedLocations = $academyLocationsService->getAuthorizedLocations();
$categories = $categories->join('academy_locations', 'academy_locations.id', '=', 'academy_categories.academy_location_id')
->whereIn('academy_locations.id', $authorizedLocations);
}
return $categories->get();
}
private function getSchedules()
{
$schedules = AcademySchedule::select('academy_schedules.id', 'academy_schedules.name')
->with('academy_categories_schedules')
->where('academy_schedules.active', true)
->orderBy('academy_schedules.name', 'ASC');
$academyLocationsService = new AcademyLocationsService;
if (!$academyLocationsService->validateAuthorizedLocations()) {
$authorizedLocations = $academyLocationsService->getAuthorizedLocations();
$schedules = $schedules->join('academy_categories_schedules', 'academy_categories_schedules.academy_schedule_id', '=', 'academy_schedules.id')
->join('academy_categories', 'academy_categories.id', '=', 'academy_categories_schedules.academy_category_id')
->join('academy_locations', 'academy_locations.id', '=', 'academy_categories.academy_location_id')
->whereIn('academy_locations.id', $authorizedLocations);
}
$schedules = $schedules->get();
foreach ($schedules as $schedule) {
$schedule->categories = $schedule->academy_categories_schedules->pluck('academy_category_id')->toArray();
}
return $schedules;
}
private function enableFranchises()
{
$academyLocationsService = new AcademyLocationsService;
return $academyLocationsService->enableFranchises() == 'true';
}
}