HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/vhost/disk-apps/demo-telemedicina.teky.com.co/app/Http/Controllers/RFastController.php
<?php

namespace Telemedicina\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
use Carbon\Carbon;
use DB;
use Validator;
use Session;
use DateTime;
use Telemedicina\User;
use Telemedicina\Event;
use Illuminate\Support\Facades\Auth;
use Calendar;
use LaravelFullCalendar\Facades\Calendar as FacadesCalendar;
use Telemedicina\TemplateResponse;
use Telemedicina\Specialty;
use Telemedicina\HeaderValue;
use Telemedicina\RequestType;

class RFastController extends Controller
{
    public function index(){
        return view('rfast.rfast');
    }

    public function updateScheduleRfast(Request $request){

        if(!$this->rfastConnectionTest()){
            return response(array("r" => false, "data" => 'No hay conexión con R-Fast'));
        }
        
        $objs = DB::connection('sqlsrv-rfast')->table('fac_m_citas')
                                            ->where('FECHA','>',Carbon::now()->format('Ymd H:i:s').'.000')
                                            // ->where('FECHA','>','2021-07-29 07:00:00.000')
                                            ->where('CUPO_WEB',1)
                                            ->orderBy('FECHA')
                                            ->get();                                                                         
                                            
        if(count($objs) == 0){

            $events_date = Event::where('event_date','>=',Carbon::now()->format('Y-m-d'))->get();
            foreach ($events_date as $key => $value) {
                $date_event = $value->event_date.' '.$value->start_time;
                if($date_event > Carbon::now()->format('Y-m-d H:i:s')){
                    $value->delete();
                }
            }  
            return response(array("r" => false, "data" => 'No hay agenda para generar desde R-Fast'));

        }else{

            $events_date = Event::where('event_date','>=',Carbon::now()->format('Y-m-d'))->get();
            foreach ($events_date as $key => $value) {
                $date_event = $value->event_date.' '.$value->start_time;
                if($date_event > Carbon::now()->format('Y-m-d H:i:s')){
                    $value->delete();
                }
            }  

            foreach($objs as $key => $obj){
                if($obj->CODIGO){
                    $medic = User::where('medic_code',$obj->CODIGO)->first();
                    if($medic){
                        // Si el médico existe
                        $date = Carbon::parse($obj->FECHA);
                        $event = new Event;
                        $event->event_date = $date->toDateString();
                        $event->start_time = $date->toTimeString();
                        $event->end_time = $date->addMinutes(15)->toTimeString();
                        if($obj->FECHA_SOLICITADA){
                            // Cuando hay citas agendada en R-Fasr
                            $speciality = Specialty::where('code_cp',$obj->CENTROPROD)->first(); 
                            if(explode(':',$obj->OBSERVACIONES)[0] == 'TDOC'){
                                $tdoc = explode(':',$obj->OBSERVACIONES)[1];
                                $regs = explode(',',$tdoc);
                                if($obj->NUMERO_FACTURA && $obj->DOCUMENTO_FACTURA){
                                    $event->event_state = 4;
                                }else{
                                    $event->event_state = $regs[0];
                                }
                                // Registro Teledoc
                                $event->rate = 0;
                                $event->send_consent = 0;
                                $event->send_payment = 0;
                                $event->user_id = $regs[1];
                                $event->medic_id = $regs[2];
                                $event->agenda_type_id = $regs[3];
                                $event->specialty_id = $speciality->id;
                                if(str_contains($regs[4], 'null')){
                                    $event->header_value_id = NULL;
                                }else{
                                    $event->header_value_id = $regs[4];
                                }
                                if(str_contains($regs[5], 'null')){
                                    $event->document_id = NULL;
                                }else{
                                    $event->document_id = $regs[5];
                                }
                                $event->save();
                            }else{
                                if($obj->NUMERO_FACTURA && $obj->DOCUMENTO_FACTURA){
                                    $event->event_state = 4;
                                }else{
                                    $event->event_state= 3;
                                }
                                // Registro de R-Fast
                                $us = User::where('document',$obj->HISTORIA)->first();
                                //$event->event_state= 3;
                                $event->rate = 0;
                                $event->send_consent = 0;
                                $event->send_payment = 0;
                                $event->user_id = $us->id;
                                $event->medic_id = $medic->id;
                                $event->specialty_id = $speciality->id;
                                $event->save();
                            }
                        }else{
                            $date_mr = Carbon::parse($obj->FECHA)->format('Y-m-d H:i:s');
                            // Valida si hay solicitud móvil
                            $hv = HeaderValue::where('is_from_app',1)
                                                ->where('clinic_document_id',null)
                                                ->where('state',1)
                                                ->where('suggested_medic_id',$medic->id)
                                                ->where('date',$date_mr)
                                                ->with('form')->first();
                             
                            if($hv){
                                // Cuando hay solicitud móvil
                                $event->event_state= 2;
                                $event->rate = 0;
                                $event->send_consent = 0;
                                $event->send_payment = 0;
                                $event->user_id = $hv->user_id;
                                $event->medic_id = $medic->id;
                                $event->agenda_type_id = $hv->date_type_id;
                                $event->specialty_id = $hv->form->specialty_id;
                                $event->header_value_id = $hv->id;
                                $event->save();
                            }else{
                                // Cuando la agenda esta vacía
                                $event->event_state= 1;
                                $event->rate = 0;
                                $event->send_consent = 0;
                                $event->send_payment = 0;
                                $event->medic_id = $medic->id;
                                $event->save();
                            }
                        }
                    }
                }
            }

            return response(array("r" => true, "data" => $obj));
        }

    }

    public function appointmentMovilRequest($header_id){

        if(!$this->rfastConnectionTest()){
            return response(array("r" => false, "data" => 'No hay conexión con R-Fast'));
        }

        $hv = HeaderValue::where('id',$header_id)->first();
        $event_confirmed = Event::where('header_value_id',$header_id)->with('user','event_state_option','medic','agenda_type','speciality')->first();

        $rfast_tarjetero = DB::connection('sqlsrv-rfast')->table('fac_m_tarjetero')
                                        ->where('HISTORIA',$event_confirmed->user->document)->get();

        if(count($rfast_tarjetero) == 0){
            return response(array("r" => false, "data" => 'Usuario no registrado en R-Fast'));
        }

        $hv->state = 2;
        $hv->update();
        $event_confirmed->event_state = 3;
        //$event_confirmed->send_payment = 1;
        $event_confirmed->update();
        $medic_id = $event_confirmed->medic_id;
        //$medic_data = User::where('id', $medic_id)->first();
        $medic = User::where('id',$medic_id)->with('specialty')->first();
        $rfast_date_confirmed = DB::connection('sqlsrv-rfast')->table('fac_m_citas')
                                        ->where('FECHA',str_replace('-','',$event_confirmed->event_date).' '.$event_confirmed->start_time.'.000')
                                        ->where('CODIGO',$medic->medic_code)
                                        ->where('CUPO_WEB',1)
                                        ->update(['FECHA_SOLICITUD' => Carbon::now()->format('Ymd H:i:s'),
                                                'FECHA_SOLICITADA' => str_replace('-','',$event_confirmed->event_date).' '.$event_confirmed->start_time,
                                                'TIPO_SOLICITUD' => 3,
                                                'IPS' => 196980002601,
                                                'CENTROPROD' => $event_confirmed->speciality->code_cp,
                                                'HISTORIA' => $event_confirmed->user->document,
                                                'TELEFONO' => $event_confirmed->user->phone,
                                                'TIPDOCUM' => $event_confirmed->user->identification_type_id,
                                                'NUMDOCUM' => $event_confirmed->user->document,
                                                'APELLIDO1' => $event_confirmed->user->last_name,
                                                'APELLIDO2' => '',
                                                'NOMBRE1' => $event_confirmed->user->name,
                                                'NOMBRE2' => '',
                                                'OBSERVACIONES' => 'TDOC:'.$event_confirmed->event_state.','.$event_confirmed->user_id.','.
                                                                    $event_confirmed->medic_id.','.$event_confirmed->agenda_type_id.','.
                                                                    $event_confirmed->header_value_id.',null',
                                                'CODIGO_USUARIO' => 'jhamf']);

        return response(array("r" => true, "data" => 'Solicitud móvil agendada'));
    }

    public function filterCalendar(Request $request, $header_id = null){
        $medic = null;
        $is_medic = false;
        if ($header_id) {

            // if(!$this->rfastConnectionTest()){
            //     Session::flash('data', array('type' => 'warning', 'message' => 'No hay conexión con R-Fast'));
            //     return redirect()->back();
            // }

            $hv = HeaderValue::where('id',$header_id)->first();
            $event_confirmed = Event::where('header_value_id',$header_id)->with('user','event_state_option','medic','agenda_type','speciality')->first();

            //dd($event_confirmed->user->identification_type_id);
            //dd($event_confirmed->speciality->code_cp);

            // $rfast_tarjetero = DB::connection('sqlsrv-rfast')->table('fac_m_tarjetero')
            //                             ->where('HISTORIA',$event_confirmed->user->document)->get();

            // if(count($rfast_tarjetero) == 0){
            //     return response(array("r" => false, "data" => 'Usuario no registrado en R-Fast'));
            // }
            
            // if(count($rfast_tarjetero) == 0){
            //     Session::flash('data', array('type' => 'warning', 'message' => 'El usuario no se encuentra en los registros de Quilisalud'));
            //     return redirect()->back();
            // }
            $medic_id = $event_confirmed->medic_id;

            if(Auth::user()->rol->id == 3 || Auth::user()->rol->id == 6){
                $events = Event::where('medic_id', Auth::user()->id)->where('active', true)->with('user','event_state_option')->get();
                $is_medic = true;
            }else{
                $events = Event::where('active', true)->where('medic_id',$medic_id)->with('user','event_state_option')->get();
            }
        }elseif($request->medic_id){
            if(Auth::user()->rol->id == 3 || Auth::user()->rol->id == 6){
                $events = Event::where('medic_id', Auth::user()->id)->where('active', true)->with('user','event_state_option')->get();
                $is_medic = true;
            }else{
                $events = Event::where('active', true)->where('medic_id',$request->medic_id)->with('user','event_state_option')->get();
            }
            $medic = User::where('id',$request->medic_id)->with('specialty')->first();
        }else{
            $events = [];
            //$medic = User::where('id',$request->medic_id)->with('specialty')->first();
        }

        $responses_cancel = TemplateResponse::where('active', true)->get();
        $specialties = Specialty::where('active', true)->get();
        $medicos = User::orWhere('rol_id',3)->OrWhere('rol_id', 6)->where('active', true)->get();
        $request_types = RequestType::where('active', true)->get();

        $events_list_available = [];
        $events_list_movil = [];
        $events_list_confirmed = [];
        $events_list_invoiced = [];
        $events_list_not_available = [];
        $events_list_finished = [];

        foreach ($events as $key => $event) {
            if($event->user){
                $title = $event->user->name . " " . $event->user->last_name;
            }else{
                $title =  $event->event_state_option->name;
            }
            if($event->event_state == 1){
                $events_list_available[] = Calendar::event(
                    $title,
                    false,
                    new DateTime($event->event_date . " " . $event->start_time),
                    new DateTime($event->event_date . " " . $event->end_time ),
                    $event->id
                );
            }elseif($event->event_state == 2){
                $events_list_movil[] = Calendar::event(
                    $title,
                    false,
                    new DateTime($event->event_date . " " . $event->start_time),
                    new DateTime($event->event_date . " " . $event->end_time ),
                    $event->id
                );
            }elseif($event->event_state == 3){
                $events_list_confirmed[] = Calendar::event(
                    $title,
                    false,
                    new DateTime($event->event_date . " " . $event->start_time),
                    new DateTime($event->event_date . " " . $event->end_time ),
                    $event->id
                );
            }elseif($event->event_state == 4){
                $events_list_invoiced[] = Calendar::event(
                    $title,
                    false,
                    new DateTime($event->event_date . " " . $event->start_time),
                    new DateTime($event->event_date . " " . $event->end_time ),
                    $event->id
                );
            }elseif($event->event_state == 5){
                $events_list_finished[] = Calendar::event(
                    $title,
                    false,
                    new DateTime($event->event_date . " " . $event->start_time),
                    new DateTime($event->event_date . " " . $event->end_time ),
                    $event->id
                );
            }elseif($event->event_state == 6){
                $events_list_not_available[] = Calendar::event(
                    $title,
                    false,
                    new DateTime($event->event_date . " " . $event->start_time),
                    new DateTime($event->event_date . " " . $event->end_time ),
                    $event->id
                );
            }
        }
                                    
        $calendar_details = Calendar::addEvents($events_list_invoiced)
        ->addEvents($events_list_available, [ 'color' => '#00b34a'])
        ->addEvents($events_list_movil, [ 'color' => '#ff8000'])
        ->addEvents($events_list_confirmed, [ 'color' => '#750062'])
        ->addEvents($events_list_finished, [ 'color' => '#007373'])
        ->addEvents($events_list_not_available, [ 'color' => '#951703'])
        ->setOptions([
            'slotDuration'=> '00:15:00',
            'slotLabelInterval'=> 15,
            'slotMinutes'=> 15,
            'snapDuration'=> '00:30:00',
            'firstDay' => 1,
            'defaultView' => 'agendaWeek'
        ])
        ->setCallbacks([
            'eventClick' => 'function(event) { 
                window.currentDateId = event.id; 
                showDateDecisionModal(event.id);
            }',
        ]);


        if($header_id){
            return view('agenda.main', compact(['calendar_details', 'responses_cancel', 'medicos', 'medic','is_medic', 'specialties', 'request_types','header_id']));
        } else {
            return view('agenda.main', compact(['calendar_details', 'responses_cancel', 'medicos', 'medic','is_medic', 'specialties', 'request_types']));
        }
    }

    public function scheduleFromPortal(Request $request){

        if(!$this->rfastConnectionTest()){
            return response(array("r" => false, "data" => 'No hay conexión con R-Fast'));
        }

        $user = User::where('id', $request->user_id)->first();
        if(!$user){
            return response(array("r" => false, "data" => 'El usuario no existe en la base de datos'));
        }
        $rfast_tarjetero = DB::connection('sqlsrv-rfast')->table('fac_m_tarjetero')
                                        ->where('HISTORIA',$user->document)->get();
        
        if(count($rfast_tarjetero) == 0){
            return response(array("r" => false, "data" => 'Usuario no registrado en R-Fast'));
        }

        $event_confirmed = Event::where('id',$request->event_id)->with('user','event_state_option','medic','agenda_type','speciality')->first();

        // $hv = new HeaderValue;
        // $hv->user_id = $user->id;
        // $hv->user_id = $request->speciality_id;
        // $hv->state = 1;
        // $hv->suggested_medic_id = $event_confirmed->medic_id;
        // $hv->date_type_id = $request->date_type_id;
        // $hv->date = $event_confirmed->event_date.' '.$event_confirmed->start_time;
        // $hv->is_from_app = 0;
        // $hv->save();

        $event_confirmed->event_state = 3;
        //$event_confirmed->send_payment = 1;
        $event_confirmed->user_id = $request->user_id;
        $event_confirmed->agenda_type_id = $request->date_type_id;
        $event_confirmed->specialty_id = $request->speciality_id;
        // $event_confirmed->header_value_id = $request->speciality_id;
        $event_confirmed->update();
        $medic_data = User::where('id', $event_confirmed->medic_id)->first();
        $event_confirmed = Event::where('id',$request->event_id)->with('user','event_state_option','medic','agenda_type','speciality')->first();

        if($request->request_type){
            $centro_produccion = $request->request_type;
        } else {
            $centro_produccion = $event_confirmed->speciality->code_cp;
        }

        $rfast_date_confirmed = DB::connection('sqlsrv-rfast')->table('fac_m_citas')
                                            ->where('FECHA',str_replace('-','',$event_confirmed->event_date).' '.$event_confirmed->start_time.'.000')
                                            ->where('CODIGO',$medic_data->medic_code)
                                            ->where('CUPO_WEB',1)
                                            ->update(['FECHA_SOLICITUD' => Carbon::now()->format('Ymd H:i:s'),
                                                    'FECHA_SOLICITADA' => str_replace('-','',$event_confirmed->event_date).' '.$event_confirmed->start_time,
                                                    'TIPO_SOLICITUD' => 3,
                                                    'IPS' => 196980002601,
                                                    'CENTROPROD' => $centro_produccion,
                                                    'HISTORIA' => $user->document,
                                                    'TELEFONO' => $user->phone,
                                                    'TIPDOCUM' => $user->identification_type_id,
                                                    'NUMDOCUM' => $user->document,
                                                    'APELLIDO1' => $user->last_name,
                                                    'APELLIDO2' => '',
                                                    'NOMBRE1' => $user->name,
                                                    'NOMBRE2' => '',
                                                    'OBSERVACIONES' => 'TDOC:3,'.$event_confirmed->user_id.','.$event_confirmed->medic_id.','.
                                                                        $event_confirmed->agenda_type_id.',null,null',
                                                    'CODIGO_USUARIO' => 'jhamf']);

        return response(array("r" => true, "data" => $event_confirmed));
    }

    public function invoiceConfirmed(Request $request){

        if(!$this->rfastConnectionTest()){
            return response(array("r" => false, "data" => 'No hay conexión con R-Fast'));
        }

        $event = Event::where('id',$request->event_id)->first();
        $medic_data = User::where('id', $event->medic_id)->first();

        $rfast_invoice_confirmed = DB::connection('sqlsrv-rfast')->table('fac_m_citas')
                                            ->where('FECHA',str_replace('-','',$event->event_date).' '.$event->start_time.'.000')
                                            ->where('CODIGO',$medic_data->medic_code)
                                            ->where('CUPO_WEB',1)->get();
        
        if($rfast_invoice_confirmed[0]->NUMERO_FACTURA && $rfast_invoice_confirmed[0]->DOCUMENTO_FACTURA){
            $event->event_state = 4;
            $event->update();
            return response(array("r" => true, "data" => $rfast_invoice_confirmed[0]));
        }else{
            return response(array("r" => false, "data" => 'La consulta no se ha facturado aun'));
        }
    }

    public function rfastConnectionTest(){
        // Test database connection
        try {
            DB::connection('sqlsrv-rfast')->getPdo();
            return true;
        } catch (\Exception $e) {
            return false;
        }
    }

    public function cancelAppointment(Request $request){

        if(!$this->rfastConnectionTest()){
            return response(array("r" => false, "data" => 'No hay conexión con R-Fast'));
        }

        $event_confirmed = Event::where('id',$request->event_id)->with('user','event_state_option','medic','agenda_type','speciality')->first();
        $medic_data = User::where('id', $event_confirmed->medic_id)->first();
        $rfast_date_canceled = DB::connection('sqlsrv-rfast')->table('fac_m_citas')
                                            ->where('FECHA',str_replace('-','',$event_confirmed->event_date).' '.$event_confirmed->start_time.'.000')
                                            ->where('CODIGO',$medic_data->medic_code)
                                            ->where('CUPO_WEB',1)
                                            ->update(['FECHA_SOLICITUD' => NULL,
                                                    'FECHA_SOLICITADA' => NULL,
                                                    'TIPO_SOLICITUD' => NULL,
                                                    'IPS' => NULL,
                                                    'CENTROPROD' => NULL,
                                                    'HISTORIA' => '33333333',
                                                    'TELEFONO' => '',
                                                    'TIPDOCUM' => 0,
                                                    'NUMDOCUM' => '33333333',
                                                    'APELLIDO1' => 'NO AGENDAR',
                                                    'APELLIDO2' => '',
                                                    'NOMBRE1' => 'CUPOS TELEDOC',
                                                    'NOMBRE2' => '',
                                                    'OBSERVACIONES' => '',
                                                    'CODIGO_USUARIO' => NULL]);

        if($event_confirmed->header_value_id){
            $hv = HeaderValue::where('id', $event_confirmed->header_value_id)->first();
            $hv->state = 6;
            $hv->cancel_text = $request->title_cancel.': '.$request->text_cancel;
            $hv->update();
        }

        $event_confirmed->event_state = 1;
        //$event_confirmed->send_payment = 1;
        $event_confirmed->user_id = NULL;
        $event_confirmed->agenda_type_id = NULL;
        $event_confirmed->specialty_id = NULL;
        $event_confirmed->header_value_id = NULL;
        $event_confirmed->update();

        return response(array("r" => true, "data" => $event_confirmed));
    }

}