File: /var/www/vhost/disk-apps/demo.sports-crowd.com/app/Http/Controllers/AcademyDocumentController.php
<?php
namespace App\Http\Controllers;
use DataTables;
use App\AcademyDocument;
use App\AcademyDocumentUser;
use App\AcademyLocation;
use App\AcademyUser;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class AcademyDocumentController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index($type_academy = 'children')
{
return view('academy.document.list')
->with('type_academy', $type_academy);
}
public function indexAdd($type_academy)
{
$locations = AcademyLocation::select('id', 'name')->where('active', 1)->get()->toArray();
array_unshift($locations, [
'id' => null,
'name' => 'Todos'
]);
return view('academy.document.create', compact('type_academy', 'locations'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create(Request $request)
{
try {
if (AcademyDocument::where([['name', $request->input('name')], ['type_academy', $request->input('type_academy')], ['active', true]])->first()) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
}
if ($model = AcademyDocument::create($request->except('link'))) {
$this->registerLog(Auth::user()->id, 'Crear documento academia', json_encode($request->all()), "Create", $this->getModule($request));
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.academy_users.tag54'), "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 saveDocument(Request $request)
{
try {
$extension = $request->file('document')->getClientOriginalExtension();
$filenametostore = 'document' . $request->id . '.' . $extension;
Storage::disk('s3')->put(config('s3.academy_documents') . $filenametostore, fopen($request->file('document'), 'r+'), 'public');
$url = config('filesystems.disks.s3.url') . '/academy/academy_documents/' . $filenametostore;
$document = AcademyDocument::find($request->id);
$document->link = $url;
$document->update();
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()));
}
}
public function tableFilter($type_academy)
{
$obj = AcademyDocument::select(
'id',
'name',
'link',
'required',
'order',
'type_person',
'active',
'external_form_link',
'external_form_id',
'external_form_exclusive',
'only_attempt',
'single_attempt_alert',
'created_at',
'removable'
)->where('type_academy', $type_academy);
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" 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('required', function ($obj) {
if ($obj->required == 0) {
return '<div class="switch"><label><div class="checkbox checbox-switch switch-success"> <label> ' . __('messages.no') . ' <input type="checkbox" onChange="chkRequired(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkrequired' . $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="chkRequired(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkrequired' . $obj->id . '" name="Checkactivo" checked="" />
<span></span> ' . __('messages.yes') . ' </label> </div> </label> </div>';
}
})
->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('removable', function ($obj) {
if ($obj->removable == 0) {
return '<div class="switch"><label><div class="checkbox checbox-switch switch-success"> <label> ' . __('messages.no') . ' <input type="checkbox" onChange="chkRemovable(' . $obj->id . ')" data-id="' . $obj->id . '" id="chkRemovable' . $obj->id . '" name="chkRemovable" /> <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="chkRemovable(' . $obj->id . ')" data-id="' . $obj->id . '" id="chkRemovable' . $obj->id . '" name="chkRemovable" checked="" />
<span></span> ' . __('messages.yes') . ' </label> </div> </label> </div>';
}
})
->editColumn('external_form_exclusive', function ($obj) {
return $obj->external_form_exclusive ? 'SI' : 'NO';
})
->editColumn('only_attempt', function ($obj) {
return $obj->only_attempt ? 'SI' : 'NO';
})
->rawColumns(['actions', 'required', 'active', 'removable'])
->make(true);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$infoDocument = AcademyDocument::findOrFail($id);
$locations = AcademyLocation::select('id', 'name')->where('active', 1)->get()->toArray();
array_unshift($locations, [
'id' => null,
'name' => 'Todos'
]);
return view('academy.document.edit', compact('infoDocument', 'locations'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
try {
if (AcademyDocument::where([['id', '!=', $id], ['name', $request->input('name')], ['type_academy', $request->input('type_academy')], ['active', true]])->first()) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
}
if (AcademyDocument::where('id', $id)->update($request->all())) {
$this->registerLog(Auth::user()->id, 'Editar documento academia', json_encode($request->all()), "Create", $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
)
);
}
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function delete(Request $request, $id)
{
try {
$document = AcademyDocument::find($id);
if (AcademyDocument::where('id', $id)->delete()) {
if ($document->link) {
$this->deleteStorageDocument($document->link);
}
$this->registerLog(Auth::user()->id, 'Eliminar documento academia', json_encode($document), "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 required(Request $request)
{
try {
$id = $request['id'];
$required = $request['state'];
$document = AcademyDocument::find($id);
$document->required = $required;
$document->update();
$this->registerLog(Auth::user()->id, 'Activar/Desactivar requerido documento academia', json_encode($document), "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 removable(Request $request)
{
try {
$id = $request['id'];
$document = AcademyDocument::find($id);
$document->removable = $request['state'];
$document->update();
$this->registerLog(Auth::user()->id, 'Activar/Desactivar eliminable documento academia', json_encode($document), "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 activate(Request $request)
{
try {
$id = $request['id'];
$state = $request['state'];
$document = AcademyDocument::find($id);
$document->active = $state;
$document->update();
$this->registerLog(Auth::user()->id, 'Activar/Desactivar documento academia', json_encode($document), "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 getDocuments($userId, $type_academy, $externalFormExclusive = null, $showDocumentInProcess = false)
{
$userId = intval($userId);
if ($userId == 0) {
$userId = Auth::user()->id;
$academyUser = AcademyUser::select('id')->where('user_id', $userId)->whereNull('deleted_at')->first();
if ($academyUser)
$userId = $academyUser->id;
}
$academyUser = AcademyUser::with('academy_category')->find($userId);
$personType = $academyUser->type_person == 'JURIDICAL_PERSON' ? 'JURIDIC_PERSON' : 'NATURAL_PERSON';
$academyLocationId = $academyUser->academy_category->academy_location_id ?? $academyUser->academy_location_id;
return AcademyDocument::select(
'academy_documents.id',
'academy_documents.name',
'academy_documents.link as template_link',
'academy_documents.required',
$showDocumentInProcess ? DB::raw('IF(academy_document_users.link != "pending", academy_document_users.link, null) as link') : DB::raw('IF(academy_document_users.link != "pending" AND academy_document_users.link NOT LIKE "%zapsign%", academy_document_users.link, null) as link'),
'academy_documents.external_form_link',
'academy_documents.external_form_id',
'academy_documents.only_attempt',
'academy_documents.single_attempt_alert',
'academy_documents.enable_autocomplete',
'academy_documents.enable_guardian_information',
'academy_documents.removable',
'academy_documents.enable_view_only',
)
->leftJoin('academy_document_users', function ($join) use ($userId) {
$join->on('academy_documents.id', '=', 'academy_document_users.academy_document_id');
$join->where('academy_document_users.academy_user_id', $userId);
})
->where('academy_documents.active', true)
->where('academy_documents.type_academy', $type_academy)
->when($externalFormExclusive, function ($q) use ($externalFormExclusive) {
$q->where('academy_documents.external_form_exclusive', $externalFormExclusive == 'yes' ? 1 : 0);
})
->when($userId, function ($q) use ($userId) {
$q->where(function ($q1) use ($userId) {
$q1->where('academy_document_users.academy_user_id', $userId)
->orWhereNull('academy_document_users.academy_user_id');
});
})
->when($personType, function ($q) use ($personType) {
$q->where(function ($q1) use ($personType) {
$q1->where('academy_documents.type_person', 'ALL')
->orWhere('academy_documents.type_person', $personType);
});
})
->when($academyLocationId, function ($q) use ($academyLocationId) {
$q->where(function ($q1) use ($academyLocationId) {
$q1->where('academy_documents.academy_location_id', $academyLocationId)
->orWhereNull('academy_documents.academy_location_id');
});
})
->orderBy('academy_documents.order', 'ASC')
->get();
}
public function uploadUserAcademyDocument(Request $request)
{
$file = $request['file'];
$academyUserId = intval($request['userId']);
if ($academyUserId == 0) {
$userId = Auth::user()->id;
$academyUser = AcademyUser::select('id')->where('user_id', $userId)->whereNull('deleted_at')->first();
if ($academyUser)
$academyUserId = $academyUser->id;
}
$academyDocumentId = $request['documentId'];
$extension = explode('/', mime_content_type($file))[1];
$filenametostore = 'document' . $academyUserId . '_' . $academyDocumentId . '.' . $extension;
list($baseType, $file) = explode(';', $file);
list(, $file) = explode(',', $file);
$file = base64_decode($file);
$this->deleteStorageDocument($filenametostore);
Storage::disk('s3')->put(config('s3.academy_documents') . $filenametostore, $file, 'public');
$url = config('filesystems.disks.s3.url') . '/academy/academy_documents/' . $filenametostore;
$data = [
'academy_user_id' => $academyUserId,
'academy_document_id' => $academyDocumentId,
'link' => $url,
];
AcademyDocumentUser::updateOrCreate(
[
'academy_user_id' => $academyUserId,
'academy_document_id' => $academyDocumentId
],
$data
);
return array('r' => true, 'm' => __('messages.academy_document.document_uploaded_successfully'));
}
public function uploadPendingUserAcademyDocument(Request $request)
{
$academyUserId = intval($request['academyUserId']);
if ($academyUserId == 0) {
$userId = Auth::user()->id;
$academyUser = AcademyUser::select('id')->where('user_id', $userId)->whereNull('deleted_at')->first();
if ($academyUser)
$academyUserId = $academyUser->id;
}
$academyDocumentId = $request['documentId'];
if ($academyDocumentUser = AcademyDocumentUser::where('academy_user_id', $academyUserId)->where('academy_document_id', $academyDocumentId)->first()) {
if ($academyDocumentUser->link != 'pending') {
if (!str_contains($academyDocumentUser->link, '.pdf')) {
return array('r' => true, 'm' => __('messages.academy_document.document_pending_uploaded'));
} else {
return array('r' => false, 'm' => __('messages.academy_document.document_already_uploaded'));
}
} else {
if (Carbon::now()->subMinutes(1)->greaterThan($academyDocumentUser->updated_at)) {
return array('r' => true, 'm' => __('messages.academy_document.document_pending_uploaded'), 'updated_at' => $academyDocumentUser->updated_at);
} else {
return array('r' => false, 'm' => __('messages.academy_document.document_pending_uploaded'), 'updated_at' => $academyDocumentUser->updated_at);
}
}
}
$link = $request['link'];
$data = [
'academy_user_id' => $academyUserId,
'academy_document_id' => $academyDocumentId,
'link' => $link,
];
AcademyDocumentUser::updateOrCreate(
[
'academy_user_id' => $academyUserId,
'academy_document_id' => $academyDocumentId
],
$data
);
return array('r' => true, 'm' => __('messages.academy_document.document_pending_uploaded'));
}
public function uploadUserAcademyDocumentExternal($parameters)
{
$academyUser = AcademyUser::select('id')->where('identification', $parameters->identification)->whereNull('deleted_at')->first();
if ($academyUser)
$academyUserId = $academyUser->id;
else
return;
$academyDocument = AcademyDocument::select('id')->where('external_form_id', 'LIKE', '%' . $parameters->external_form_id . '%')->first();
if ($academyDocument)
$academyDocumentId = $academyDocument->id;
else
return;
$extension = $parameters->extension ?? 'pdf';
$filenametostore = 'document' . $academyUserId . '_' . $academyDocumentId . '.' . $extension;
$file = $parameters->file;
$file = base64_decode($file);
$this->deleteStorageDocument($filenametostore);
Storage::disk('s3')->put(config('s3.academy_documents') . $filenametostore, $file, 'public');
$url = config('filesystems.disks.s3.url') . '/academy/academy_documents/' . $filenametostore;
$data = [
'academy_user_id' => $academyUserId,
'academy_document_id' => $academyDocumentId,
'link' => $url,
];
AcademyDocumentUser::updateOrCreate(
[
'academy_user_id' => $academyUserId,
'academy_document_id' => $academyDocumentId
],
$data
);
return array('r' => true, 'm' => __('messages.academy_document.document_uploaded_successfully'));
}
public function deleteDocument(Request $request, $documentId, $academyUserId, $obligatory = true)
{
$documentValid = AcademyDocument::find($documentId);
if (!$documentValid || (!$obligatory && $documentValid->only_attempt)) {
return array('r' => false, 'm' => __('messages.academy_document.document_delete_error'));
}
$document = AcademyDocumentUser::with('academy_user', 'academy_document')
->where('academy_user_id', $academyUserId)
->where('academy_document_id', $documentId)
->first();
if (!$document) {
return array('r' => false, 'm' => __('messages.academy_document.document_not_found'));
}
// Validacion para el caso de documentos diferentes a la plantilla
if ($documentValid->link != $document->link) {
$this->deleteStorageDocument($document->link);
}
$document->delete();
$this->registerLog(Auth::user()->id, 'Eliminar documento deportista academia', json_encode($document), "Delete", $this->getModule($request));
return array('r' => true, 'm' => __('messages.academy_document.document_deleted_successfully'));
}
public function deleteStorageDocument($link)
{
$fileName = basename($link);
if (Storage::disk('s3')->exists(config('s3.academy_documents') . $fileName)) {
Storage::disk('s3')->delete(config('s3.academy_documents') . $fileName);
}
}
}