File: /var/www/vhost/disk-apps/qas.sports-crowd.com/app/Http/Controllers/AcademyLocationController.php
<?php
namespace App\Http\Controllers;
use App\AcademyCategory;
use DataTables;
use App\AcademyLocation;
use App\AcademyLocationErp;
use App\AcademyUser;
use App\GatewayPayment;
use App\Parameter;
use App\Services\AcademyLocationsService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AcademyLocationController extends Controller
{
public function index()
{
$syncERP = Parameter::select('sync_siesa')->first()->sync_siesa;
return view('academy.locations.list', compact('syncERP'));
}
public function indexAdd()
{
$gatewayPayments = GatewayPayment::select('id', 'name')->where('active', true)->get();
$syncERP = Parameter::select('sync_siesa')->first()->sync_siesa;
return view('academy.locations.create', compact('gatewayPayments', 'syncERP'));
}
public function indexEdit($id)
{
$object = AcademyLocation::with('academy_location_erp')->findOrFail($id);
$gatewayPayments = GatewayPayment::select('id', 'name')->where('active', true)->get();
$syncERP = Parameter::select('sync_siesa')->first()->sync_siesa;
return view('academy.locations.edit', compact('object', 'gatewayPayments', 'syncERP'));
}
public function tableFilter()
{
$obj = AcademyLocation::select(
'academy_locations.id',
'academy_locations.name',
'academy_locations.total_capacity',
'academy_locations.direction',
'gateway_payments.name AS gateway',
'academy_locations.created_at',
'academy_locations.active',
'type_academy',
'academy_location_erps.operation_center',
'academy_location_erps.price_list'
)
->leftjoin('gateway_payments', 'gateway_payments.id', '=', 'academy_locations.gateway_payments_id')
->leftjoin('academy_location_erps', 'academy_location_erps.id', '=', 'academy_locations.academy_location_erp_id');
return DataTables::of($obj)
->addColumn('actions', function ($obj) {
return '
<i class="fa fa-pencil iconMini" onClick="clickEdit(' . $obj->id . ')" data-id="' . $obj->id . '" data-toggle="tooltip" data-placement="bottom" title="Editar" style="cursor:pointer;"></i>
<i class="fa fa-trash iconMini" onClick="clickDelete(' . $obj->id . ')" data-id="' . $obj->id . '" data-toggle="tooltip" data-placement="bottom" title="Eliminar" style="cursor:pointer;"></i>
';
})
->editColumn('created_at', function ($obj) {
return \Carbon\Carbon::parse($obj->created_at)->format('Y-m-d h:i:s A');
})
->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>';
}
})
->rawColumns(['actions', 'active'])
->make(true);
}
public function create(Request $request)
{
try {
if (AcademyLocation::where([['name', $request->input('name')], ['active', true]])->first()) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
}
$data = $request->except(['operation_center', 'price_list']);
if ($model = AcademyLocation::create($data)) {
if ($request->input('operation_center') && $request->input('price_list')) {
$erp = AcademyLocationErp::updateOrCreate(['operation_center' => $request->input('operation_center'), 'price_list' => $request->input('price_list')]);
$model->update(['academy_location_erp_id' => $erp->id]);
}
$this->registerLog(Auth::user()->id, 'Crear sede/franquicia 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;
if (AcademyLocation::where([['id', '!=', $id], ['name', $request->input('name')], ['active', true]])->first()) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
}
$data = $request->except(['operation_center', 'price_list']);
$model = AcademyLocation::findOrFail($id);
if ($model->update($data)) {
if ($request->input('operation_center') && $request->input('price_list')) {
$erp = AcademyLocationErp::select('academy_location_erps.*')->join('academy_locations', 'academy_locations.academy_location_erp_id', '=', 'academy_location_erps.id')
->where('academy_locations.id', $id)->first();
if (!$erp) {
$erp = AcademyLocationErp::updateOrCreate(['operation_center' => $request->input('operation_center'), 'price_list' => $request->input('price_list')]);
AcademyLocation::where('id', $id)->update(['academy_location_erp_id' => $erp->id]);
} else {
$erp->update(['operation_center' => $request->input('operation_center'), 'price_list' => $request->input('price_list')]);
}
}
$this->registerLog(Auth::user()->id, 'Editar sede/franquicia academia', json_encode($request->all()), "Update", $this->getModule($request));
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.updated_successfully'), "data" => $id));
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_updating'), "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 {
$location = AcademyLocation::find($id);
if (!$location) {
return response([
"r" => false,
"type" => "error",
"title" => "Oops...",
"m" => __('messages.not_found'),
"data" => null
]);
}
// Definir las relaciones a verificar
$relations = [
'academy_categories' => 'Categorías de academia',
'academy_location_users' => 'Usuarios de la sede',
'academy_location_periods' => 'Períodos de la sede',
'academy_location_discounts' => 'Descuentos de la sede',
];
// Comprobar si existen relaciones
$related = [];
// Verificar relaciones normales
foreach ($relations as $method => $relationName) {
if ($location->$method()->exists()) {
$related[] = $method;
}
}
//Verificación para usuarios de academia vinculados por categoría a la sede
$academyCategoryIds = AcademyCategory::where('academy_location_id', $location->id)->pluck('id');
$hasAcademyUsersViaCategories = AcademyUser::whereIn('academy_category_id', $academyCategoryIds)->exists();
if ($hasAcademyUsersViaCategories) {
$related[] = 'academy_users_via_categories';
}
// Procesar mensajes
if (!empty($related)) {
// Caso 1: Hay usuarios asignados vía categorías o location_users
if (in_array('academy_users_via_categories', $related) || in_array('academy_location_users', $related)) {
return response([
"r" => false,
"type" => "error",
"title" => "No se puede eliminar",
"m" => "La sede/franquicia no puede ser eliminada porque está asociada a niños y/o profesores.\n\n" .
"Siga los siguientes pasos para poder hacer la eliminación:\n" .
"1. Reasigne a los niños y/o profesores según sea su nueva sede, categoría u horario.\n" .
"2. Desvincule los horarios y las categorías asociadas a la sede que desea eliminar.\n" .
"3. Realice la eliminación de la sede.",
"data" => null
]);
}
// Caso 2: No hay usuarios, pero sí otras relaciones (categorías, horarios)
return response([
"r" => false,
"type" => "error",
"title" => "No se puede eliminar",
"m" => "La sede/franquicia no puede ser eliminada porque está asociada a categorías y horarios.\n\n" .
"Siga los siguientes pasos para poder hacer la eliminación:\n" .
"1. Desvincule los horarios / las categorías asociadas a la sede que desea eliminar.\n" .
"2. Realice la eliminación de la sede.",
"data" => null
]);
}
// Eliminar la sede si no tiene relaciones
if ($location->delete()) {
$this->registerLog(Auth::user()->id, 'Eliminó sede/franquicia academia', json_encode($location), "Delete", $this->getModule($request));
return response([
"r" => true,
"type" => "success",
"title" => "",
"m" => __('messages.deleted_successfully'),
"data" => null
]);
}
return response([
"r" => false,
"type" => "error",
"title" => "Oops...",
"m" => __('messages.error_removing'),
"data" => null
]);
} catch (\Exception $e) {
return response([
"r" => false,
"type" => "error",
"title" => "Oops...",
"m" => __('messages.delete_relation_data') . " Detalles: " . $e->getMessage(),
"data" => null
]);
}
}
public function activate(Request $request)
{
try {
$id = $request['id'];
$state = $request['state'];
$location = AcademyLocation::find($id);
$location->active = $state;
$location->update();
$this->registerLog(Auth::user()->id, 'Activar/Desactivar sede/franquicia academia', json_encode($location), "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 get()
{
$academyLocationsService = new AcademyLocationsService;
if (!$academyLocationsService->validateAuthorizedLocations()) {
$authorizedLocations = $academyLocationsService->getAuthorizedLocations();
$locations = AcademyLocation::select('id', 'name')->where('active', 1)->whereIn('id', $authorizedLocations)->orderBy('name', 'ASC')->get();
} else {
$locations = AcademyLocation::select('id', 'name')->where('active', 1)->orderBy('name', 'ASC')->get();
}
return $locations;
}
public function getByAuthUser()
{
return AcademyLocation::select('academy_locations.id')
->join('academy_location_users', 'academy_location_users.academy_location_id', '=', 'academy_locations.id')
->where('academy_location_users.user_id', Auth::user()->id)
->get();
}
}