File: /var/www/vhost/disk-apps/sigedo-dev.allup.com.co/app/Http/Controllers/UserdocumentsController.php
<?php
namespace App\Http\Controllers;
use DB;
use App\User;
use App\Covenant;
use App\Filetype;
use Carbon\Carbon;
use App\Filestatus;
use App\Userdocument;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Storage;
use App\Events\ViewFileUser;
use App\Http\Controllers\NotificationsController;
class UserdocumentsController extends Controller
{
public $file_extensions = ['JPEG','JPG','PNG','BMP','GIF','TIFF','TIF','PDF','XPS'];
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index($user_id)
{
abort_unless(\Gate::allows('userdocument_access'), 403);
$user = User::select('id','name','last_name')->with('roles')->findOrFail($user_id);
$documentupload = DB::table('userdocuments AS ud')
->leftJoin('filetypes AS ft', 'ud.filetype_id', '=', 'ft.id')
->leftJoin('filestatuses AS fs', 'ud.filestatus_id', '=', 'fs.id')
->select(
'ud.id AS userdocument_id',
'user_id',
'filetype_id',
'observations',
'expedition_date',
'expiration_date',
'review_date',
'ft.name AS ft_name',
'fs.name AS fs_name',
'fs.id AS fs_id',
)->where('user_id', $user_id);
$userdocuments = DB::table('filetype_role AS fr')
->leftJoinSub($documentupload, 'documentupload', function ($join){
$join->on('fr.filetype_id', '=', 'documentupload.filetype_id');
})
->leftJoin('filetypes AS ft', 'fr.filetype_id', '=', 'ft.id')
->where('fr.role_id', $user->roles[0]->id)
->orderBy('fs_id', 'asc')
->get();
return view('userdocuments.list', compact('userdocuments','user'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create($user_id,$filetype_id = 0)
{
abort_unless(\Gate::allows('userdocument_create'), 403);
$user_detail = User::select('id','name','last_name')->with('roles')->findOrFail($user_id);
$filetypes = Filetype::where('active', true)
->whereHas('roles', function (Builder $query) use($user_detail) {
$query->where('role_id', $user_detail->roles[0]->id);
})->get();
$list_documents_upload = Userdocument::where('user_id', $user_id)->with('filetype')->get();
$filestatuses = Filestatus::where([['id', '!=', 1],['active', true]])->get();
return view('userdocuments.create', compact('filetypes','user_id','user_detail','filetype_id','filestatuses','list_documents_upload'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request, $user_id)
{
abort_unless(\Gate::allows('userdocument_create'), 403);
$exists = Userdocument::where([
['user_id', $user_id],
['filetype_id', $request->input('filetype_id')],
])->first();
if (!$exists) {
$filestatus_id = $request->input('filestatus_id');
$observations = $request->input('observations');
if ($data = Userdocument::create(array_slice($request->all(), 4))) {
if($request->input('already_exists') == true){
$reference = Userdocument::select('filepath')->where('id', $request->input('document_upload_id'))->first();
$data->filepath = $reference->filepath;
$data->save();
}
if($filestatus_id != null){
$this->updateUserDocumentStatus($data->id,$filestatus_id,$observations);
}
$this->registerLogData(json_encode($request->all()), $data->id, 23, 1, Auth::user()->id);
return response(array("status" => true, "type" => "success", "title" => "", "message" => __('created_successfully'), "data" => $data->id));
} else {
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_creating'), "data" => null));
}
}else{
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('already_exists_userdocuments')));
}
}
/**
* Display the specified resource.
*
* @param int $user_id
* @return \Illuminate\Http\Response
*/
public function show($user_id)
{
abort_unless(\Gate::allows('userdocument_show'), 403);
return redirect()->back();
}
/**
* Show the form for editing the specified resource.
*
* @param int $user_id
* @return \Illuminate\Http\Response
*/
public function edit($user_id,$userdocument_id)
{
abort_unless(\Gate::allows('userdocument_edit'), 403);
$userdocument = Userdocument::with('user')->findOrFail($userdocument_id);
$user_detail = User::select('id','name','last_name')->with('roles')->findOrFail($user_id);
$filetypes = Filetype::where('active', true)
->whereHas('roles', function (Builder $query) use($user_detail) {
$query->where('role_id', $user_detail->roles[0]->id);
})->get();
$list_documents_upload = Userdocument::where('user_id', $user_id)->with('filetype')->get();
$filestatuses = Filestatus::where([['id', '!=', 1],['active', true]])->get();
return view('userdocuments.edit', compact('userdocument','filetypes','filestatuses','list_documents_upload'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $user_id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $user_id, $userdocument_id)
{
abort_unless(\Gate::allows('userdocument_edit'), 403);
$exists = Userdocument::where([
['id', '!=', $userdocument_id],
['user_id', $user_id],
['filetype_id', $request->input('filetype_id')],
])->first();
if (!$exists) {
$filestatus_id = $request->input('filestatus_id');
$observations = $request->input('observations');
if (Userdocument::where('id', $userdocument_id)->update(array_slice($request->all(), 5))) {
if($request->input('already_exists') == true){
$data = Userdocument::select('id','filepath')->where('id', $userdocument_id)->first();
$reference = Userdocument::select('filepath')->where('id', $request->input('document_upload_id'))->first();
$data->filepath = $reference->filepath;
$data->save();
}
if($filestatus_id == null){
$this->updateUserDocumentStatus($userdocument_id,2,$observations);
}else{
$this->updateUserDocumentStatus($userdocument_id,$filestatus_id,$observations);
}
$this->registerLogData(json_encode(array_slice($request->all(), 3)), $userdocument_id, 23, 3, Auth::user()->id);
return response(array("status" => true, "type" => "success", "title" => "", "message" => __('updated_successfully'), "data" => null));
} else {
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_updating'), "data" => null));
}
}else{
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('already_exists_userdocuments')));
}
}
/**
* Remove the specified resource from storage.
*
* @param int $user_id
* @return \Illuminate\Http\Response
*/
public function destroy($userdocument_id)
{
abort_unless(\Gate::allows('userdocument_destroy'), 403);
DB::beginTransaction();
try {
$userdocument = Userdocument::findOrFail($userdocument_id);
if ($userdocument->delete()) {
$this->registerLogData('', $userdocument_id, 23, 4, Auth::user()->id);
DB::commit();
return response(array("status" => true, "type" => "success", "title" => "", "message" => __('deleted_successfully'), "data" => null));
} else {
DB::rollback();
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_removing'), "data" => null));
}
} catch (\Illuminate\Database\QueryException $e) {
DB::rollback();
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('delete_relation_data'), "data" => null));
}
}
public function updateUserDocumentStatus($userdocument_id,$filestatus_id,$observations)
{
try {
if(\Gate::allows('document_access')){
Userdocument::where('id', $userdocument_id)->update([
'filestatus_id' => $filestatus_id,
'observations' => $observations,
'user_approve_id' => Auth::user()->id,
'review_date' => Carbon::now(),
]);
}else{
Userdocument::where('id', $userdocument_id)->update(['filestatus_id' => $filestatus_id]);
}
return response(array("status" => true, "type" => "success", "title" => "", "message" => __('updated_successfully'), "data" => null));
} catch (\Throwable $th) {
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_updating'), "data" => null));
}
}
public function changeStatusApprove($userdocument_id)
{
return $this->updateUserDocumentStatus($userdocument_id,3,null);
}
public function getCode()
{
return time() . rand(1, 9) . rand(1, 5);
}
/**
* @param file documento que se va a cargar
* @param folder el documento del usuario, para acceso a la carpeta del usuario
* @param name id para el nombre del archivo
*/
public function uploadFile(Request $request)
{
try {
$extension = $request->file('fileUser')->getClientOriginalExtension();
$exists = array_search(strtolower($extension), array_map('strtolower', $this->file_extensions));
if($exists !== false){
$user = User::select('document')->where('id', $request->user_id)->first();
$route = $user->document.'/'.$this->getCode().".".$extension;
Storage::put(env('S3_DOCUMENTS_PATH').$route, fopen($request->file('fileUser'), 'r+'), 'public');
Userdocument::where('id', $request->userdocument_id)->update(['filepath' => $route]);
return response(array("status" => true, "type" => "success", "title" => "", "message" => __('success_upload'), "data" => null));
}
Userdocument::where('id', $request->userdocument_id)->delete();
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_extension'), "data" => null));
} catch (\Exception $e) {
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_upload_file'), "data" => $e->getMessage()));
}
}
public function downloadFile($userdocument_id)
{
try {
$document = Userdocument::select('filepath')->where('id', $userdocument_id)->first();
if($document->filepath != null){
return Storage::download(env('S3_DOCUMENTS_PATH') . $document->filepath);
}
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_file'), "data" => $e->getMessage()));
} catch (\Exception $e) {
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_file'), "data" => $e->getMessage()));
}
}
public function viewFile($userdocument_id)
{
try {
$document = Userdocument::select('filepath')->where('id', $userdocument_id)->first();
if($document->filepath != null){
return redirect(env('AWS_URL') . 'documents/' . $document->filepath);
}
return response(__('error_file'));
} catch (\Exception $e) {
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_file'), "data" => $e->getMessage()));
}
}
public function validityDocuments()
{
try {
$documents = Userdocument::where([['expiration_date', '<=', Carbon::now()],['filestatus_id', '!=', '5'],['filestatus_id', '!=', '6']])->get();
foreach ($documents as $key => $document) {
$document->filestatus_id = 5;
$document->update();
}
return true;
} catch (\Throwable $th) {
return;
}
}
public function covenantsValidity6MonthsBefore()
{
try {
$convenats = Covenant::where('active', true)->get();
$listConvenants = " ";
foreach ($convenats as $key => $convenat) {
$current = explode("-", $convenat->term_end);
$date1 = Carbon::createMidnightDate($current[0], $current[1], $current[2]);
$now = Carbon::now();
$now = $now->toDateString();
$current2 = explode("-", $now);
$date1 = Carbon::createMidnightDate($current[0], $current[1], $current[2]);
$date2 = Carbon::createMidnightDate($current2[0], $current2[1], $current2[2]);
if($date1->diffInMonths($date2) <= 6){
$listConvenants = $listConvenants . $convenat->name. ", ";
}
}
return substr($listConvenants, 0, -2);
} catch (\Throwable $th) {
return;
}
}
public function validityCovenants()
{
try {
$covenants = Covenant::where([['term_end', '<=', Carbon::now()],['active', true]])->get();
foreach ($covenants as $key => $covenant) {
$covenant->active = false;
$covenant->update();
}
return true;
} catch (\Throwable $th) {
return;
}
}
public function validityCommitments()
{
try {
$userdocuments = Userdocument::where([['filestatus_id', 4],['commitment_date', '<=', Carbon::now()]])->get();
foreach ($userdocuments as $key => $document) {
$document->filestatus_id = 5;
$document->update();
}
return true;
} catch (\Throwable $th) {
return;
}
}
// Get information of expired documents
public function expiredDocumentsNoti()
{
$expired_docs = Userdocument::where('filestatus_id', '5')->with('filetype', 'user')->get();
foreach($expired_docs as $key => $expired){
$notification = new NotificationsController();
$notification->sendNotificationExpired($expired->user->email,$expired->filetype->name);
}
return;
}
public function sendProcess($process_id)
{
switch ($process_id) {
case '1':
return $this->validityDocuments();
break;
case '2':
$listConvenants = $this->covenantsValidity6MonthsBefore();
$noti = new NotificationsController();
return $noti->sendNotification(1,$listConvenants);
break;
case '3':
return $this->validityCovenants();
break;
case '4':
return $this->validityCommitments();
break;
// New proccess
case '5':
return $this->expiredDocumentsNoti();
break;
default:
break;
}
}
}