<?php

namespace App\Http\Controllers;

use DB;
use App\Custom\SQLConnection;
use App\Custom\Misc;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Request;

use Route;
use stdClass;
use App\Http\Controllers\EmailController;
use App\Http\Controllers\ActividadesTaskController;

class PanelInformesController extends Controller
{
    ///////////////////////////////////
    ////// INFORMES Y TAREAS DCL //////
    ///////////////////////////////////

    /**
     * Funcion que devuelve las
     * tareas para armar el panel 
     * de los informes sin contrapartes
     * @access public
     */
    public static function tareasSinContrapartes(){
        //
        $tareas = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL', array('REPORTE_DCL',NULL), 'select');
        //
        Traducciones::$blade = 'panel_informes_blue';
        foreach ($tareas as $key => $tarea){
            $tarea->estado_informe = (!is_null($tarea->cod_estado_informe)) ? Traducciones::get(Misc::NombreEstadosInforme($tarea->cod_estado_informe)) : NULL;
            $tarea->estado_tarea  = (!is_null($tarea->cod_estado_tarea)) ? Traducciones::get(Misc::NombreEstadosInforme($tarea->cod_estado_tarea)) : NULL;
            $tarea->nombre_tarea = Traducciones::get($tarea->nombre_tarea);
        }
        //
        return Response::JSON(['error' => 0,'data' => $tareas]);
    }

    /**
     * Funcion que devuelve la edicion
     * de las tareas de informes sin contrapartes
     * @access public
     */
    public function editarTareaSinContraparte(){
        $informe = Request::input('informe');
        $tarea = Request::input('tarea');
        //
        $datos_tarea = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('EDITAR_TAREA',$tarea),'selectOne');
        //
        return view('/informes-blue/edicion-tarea-sin-contrapartes')->with(compact('datos_tarea'));
    }

    /**
     * Funcion que actualiza la tarea
     * del informe sin contraparte
     * @access public
     */
    public function actualizarTareaSinContraparteOrg(){
        if ( isset($_POST['tarea']) && isset($_POST['informe']) && isset($_POST['estado']) ){
            $cliente = Request::input('cliente');
            $informe = Request::input('informe');
            $tarea = Request::input('tarea');
            $estado = Request::input('estado_tarea');
            //
            $tareas_dependientes = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_ESTADO',NULL,$tarea,Session::get('usuario')->user_id,NULL,NULL,NULL,NULL,$estado));
            //
            if ( $estado == 'K' ){
                foreach( $tareas_dependientes as $tarea ){
                    // 
                    if ( isset($tarea->ready_to_start) && $tarea->ready_to_start == '0' && isset($tarea->pend_aprobar) && isset($tarea->informe) && $tarea->pend_aprobar == '0' ){
                        SQLConnection::backendStoreProcedure('IV_ready2start',array('READY2START_DCL',NULL,$tarea->informe,Session::get('usuario')->user_id,NULL,$cliente));
                    }
                }
            }
            //
            return $this->editarTareaSinContraparte();
        }
    }

    /**
     * Funcion que actualiza la tarea
     * del informe sin contraparte
     * @access public
     */
    public function actualizarTareaSinContraparte(){
        if ( isset($_POST['tarea']) && isset($_POST['informe']) && isset($_POST['estado']) ){
            $cliente = Request::input('cliente');
            $informe = Request::input('informe');
            $tarea = Request::input('tarea');
            $estado = Request::input('estado_tarea');
            $tipo_actividad = Request::input('tipo_tarea');
            //
            $tareas_dependientes = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_ESTADO',NULL,$tarea,Session::get('usuario')->user_id,NULL,NULL,NULL,NULL,$estado));
            // en caso que la tarea se aprueba , se solicita abrir las tareas que dependen de su cierre
            if ( $estado == 'K' || $estado == 'N' ){
                if ( is_array($tareas_dependientes) ){
                    self::evaluarTareaDependencias($tareas_dependientes,$cliente);
                }
            } elseif ( $estado == 'E' ){
                self::marcarTareaIniciada($tarea);
            }
            //
            if( $tipo_actividad == 'T' ){
                // SE EVAULA SI SE TIENE QUE CAMBIAR EL ESTADO DEL INFORME EN BASE AL ESTADO DE LA TAREA
                self::cambiarEstadoInformePorEstadoTareaSC($informe,$tarea,$tipo_actividad,$estado);
            }
            //
            return $this->editarTareaSinContraparte();
        }
    }

    /**
     * Funcion que devuelve la edición
     * del informe sin contraparte
     * @access public
     */
    public static function editarInformeSinContraparte(){
        if ( isset($_POST['informe']) ){   
            $informe = Request::input('informe');
            $datos_informe = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('EDITAR_INFORME',$informe),'selectOne');
            //$users = SQLConnection::backendStoreProcedure('LN_Blue',array('USERS_BACK',NULL,NULL,NULL));
            $users = SQLConnection::backendStoreProcedure('LN_Blue',array('USERS_BACK',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,env('PLATAFORMA')));
            // TAREAS DEL INFORME
            $seccion_tareas = self::tareasInforme($informe,0,$users,$datos_informe,true);
            $datos_informe->fecha_tiempo_comprometida = date_create_from_format('Y-m-d H:i:s',$datos_informe->fecha_comprometida) ?? NULL;
            $datos_informe->fecha_tiempo_inicio = date_create_from_format('Y-m-d H:i:s',$datos_informe->fecha_inicio);
            $username = Session::get('usuario')->username;
            return view('/informes-blue/edicion-informe-sc')->with(compact('datos_informe','users','seccion_tareas','username'));
        } else {
            return 0;
        }
    }

    // FUNCION QUE DEVUELVE LAS TAREAS DEL INFORME PARA SER ASIGNADAS
    public static function tareasInforme($informe,$desde_modal_actividad=0,$users=null,$datos_informe=null,$sin_contraparte=false){
        if ($sin_contraparte){
            if (is_null($datos_informe)) {
                $datos_informe = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('EDITAR_INFORME',$informe),'selectOne');
            }
        } else {
            $datos_informe = (!is_null($datos_informe)) ? $datos_informe : SQLConnection::backendStoreProcedure('IV_panel_reports',array('informe_by_id',Session::get('usuario')->user_id,null,null,null,$informe),'selectOne');
        }
        // dd($datos_informe);
        $team = $datos_informe->idTeam;
        //
        $deshabilito_acciones = FALSE;
        if ( $datos_informe->codigo_estado_informe == 'N' || $datos_informe->codigo_estado_informe == 'C' || $datos_informe->codigo_estado_informe == 'K' ){
            $deshabilito_acciones = TRUE;
        }
        if ($sin_contraparte) {
            $tareas = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('TAREAS_INFORME',$informe));
        } else {
            $tareas = SQLConnection::backendStoreProcedure('LN_Blue_Tareas_Informe',array('tareas_informe',NULL,$informe));            
        }
        //$users = !is_null($users) ? $users : SQLConnection::backendStoreProcedure('LN_Blue',array('USERS_BACK',NULL,NULL,NULL));
        $users = !is_null($users) ? $users : SQLConnection::backendStoreProcedure('LN_Blue',array('USERS_BACK',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,env('PLATAFORMA')));
        $usuarios_filtrados = self::filtrarUsuarios($users,$team); // se filtran los usuarios para se sepa cual es del team y cual es no
        // SE FORMATEA LAS FECHAS DE LAS TAREAS
        foreach( $tareas as $tarea ){
            $tarea->objeto_fecha_inicio = NULL;
            $tarea->objeto_fecha_comprometida = NULL;
            //
            if ( !is_null($tarea->fecha_inicio) ){
                $tarea->objeto_fecha_inicio = date_create_from_format('Y-m-d H:i:s',$tarea->fecha_inicio);
            }
            //
            if ( isset($tarea->fecha_comprometidaTAR) && !is_null($tarea->fecha_comprometidaTAR) ){
                $tarea->objeto_fecha_comprometida = date_create_from_format('Y-m-d H:i:s',$tarea->fecha_comprometidaTAR);
            } elseif (isset ($tarea->fecha_comprometida) && !is_null($tarea->fecha_comprometida)){
                $tarea->objeto_fecha_comprometida = date_create_from_format('Y-m-d H:i:s',$tarea->fecha_comprometida);
            }
        }
        $feriados = SQLConnection::backendStoreProcedure('LN_feriados',array('FERIADOS_INFORME', 'AR', NULL, NULL));
        //--------------------------
        $feriados = json_encode($feriados);
        //
        // dd($tareas);
        if ( $desde_modal_actividad ){
            return '<div id="seccion-tareas-informe">'.view('/informes-blue/tareas-informe-sc')->with(compact('tareas','usuarios_filtrados','datos_informe','feriados','deshabilito_acciones')).'</div>';
        } else {
            $vista = !$sin_contraparte ? '/informes-blue/tareas-informe' : '/informes-blue/tareas-informe-sc' ;
            return view($vista)->with(compact('tareas','usuarios_filtrados','datos_informe','feriados','deshabilito_acciones'));
        }
    }

    // FUNCION QUE ACTUALIZA LOS DATOS DEL INFORME
    public function guardarInformeSC(){
        if ( isset($_POST['informe']) ){
            $user_id = Session::get('usuario')->user_id;
            $informe = Request::input('informe');
            $cliente = Request::input('cliente');
            $estado = Request::input('estado');
            $dedicacion = Request::input('dedicacion');
            // $nombre_usuario = Request::input('nombre_usuario_asignado');
            // $nombre_estado = Request::input('nombre_estado');
            // $nota_contraparte = Request::input('notas_contraparte');
            // $docs_rechazados = Request::input('docs_rechazados');
            //
            $idioma = Request::input('idioma');
            $fecha_inicio = Request::input('fecha_completa_inicio');
            $fecha_comprometida = Request::input('fecha_completa_comprometida');
            //
            // $busqueda = SQLConnection::backendStoreProcedure('IV_busquedas_', array('search', NULL, $contraparte), 'selectOne');
            // $datos_informe = SQLConnection::backendStoreProcedure('IV_panel_reports',array('informe_by_id',$user_id,null,null,null,$informe),'selectOne');
            $datos_informe = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('EDITAR_INFORME',$informe),'selectOne');
            // $ingresado_por = $datos_informe->created_by;
            $cliente = $datos_informe->cliente;
            $id_tipo_informe = $datos_informe->id_tipo_informe;
            // $servicio_contratado = $datos_informe->servicio_contratado;
            // SE OBTIENEN LOS DATOS ACTUALES DEL INFORME PARA COMPRAR SI SE REALIZO ALGUN CAMBIO
            $estado_informe_actual = $datos_informe->codigo_estado_informe;
            // $dedicacion_actual = $datos_informe->informe_prioridad;
            $usuario_actual = $datos_informe->userIDAsigandoInforme;
            // $nombre_usuario_actual = $datos_informe->usuario_informe;
            $idioma_actual = $datos_informe->idioma;
            $equipo_actual = $datos_informe->idTeam;
            //
            // $fecha_inicio_actual = ( !is_null($datos_informe->inicio_informe) ) ? date_create_from_format('Y-m-d H:i:s',$datos_informe->inicio_informe) : NULL;
            $fecha_inicio_actual = ( !is_null($datos_informe->fecha_inicio) ) ? date_create_from_format('Y-m-d H:i:s',$datos_informe->fecha_inicio) : NULL;
            if ( !is_null($fecha_inicio_actual) ){
                $fecha_inicio_actual = $fecha_inicio_actual->setTime($fecha_inicio_actual->format('H'),$fecha_inicio_actual->format('i'),0);
            }
            // $fecha_comprometida_actual = ( !is_null($datos_informe->fecha_comprometida_informe) ) ? date_create_from_format('Y-m-d H:i:s',$datos_informe->fecha_comprometida_informe) : NULL;
            $fecha_comprometida_actual = ( !is_null($datos_informe->fecha_comprometida) ) ? date_create_from_format('Y-m-d H:i:s',$datos_informe->fecha_comprometida) : NULL;
            if ( !is_null($fecha_comprometida_actual) ){
                $fecha_comprometida_actual->setTime($fecha_comprometida_actual->format('H'),$fecha_comprometida_actual->format('i'),0);
            }
            // SE FORMATEAN LAS FECHAS RECIBIDAS
            $fecha_completa_inicio = NULL;
            $fecha_completa_comprometida = NULL;
            $fecha_completa_inicio_object = NULL;
            $fecha_completa_comprometida_object = NULL;
            if ( !is_null($fecha_inicio) && !empty($fecha_inicio) ){
                $fecha_completa_inicio_object = date_create_from_format('d/m/Y H:i',$fecha_inicio);
                $fecha_completa_inicio_object->setTime($fecha_completa_inicio_object->format('H'),$fecha_completa_inicio_object->format('i'),0);
                $fecha_completa_inicio = $fecha_completa_inicio_object->format('Y-m-d H:i:s');
            }
            //
            if ( !is_null($fecha_comprometida) && !empty($fecha_comprometida) ){
                $fecha_completa_comprometida_object = date_create_from_format('d/m/Y H:i',$fecha_comprometida);
                $fecha_completa_comprometida_object->setTime($fecha_completa_comprometida_object->format('H'),$fecha_completa_comprometida_object->format('i'),0);
                $fecha_completa_comprometida = $fecha_completa_comprometida_object->format('Y-m-d H:i:s');
            }
            //
            $cambio_estado = ($estado_informe_actual != $estado);
            // si pasa de estados que deshabilitan accion a otros que habilitan accion o al reves
            $recarga_tareas = (( $estado_informe_actual == 'K' || $estado_informe_actual == 'N' || $estado_informe_actual == 'C' ) xor ( $estado == 'K' || $estado == 'N' || $estado == 'C' ) );
            $seccion_tareas = NULL;
            // SE ACTUALIZAN LOS DATOS DEL INFORME
            if ( ($estado == 'C' || $estado == 'N') && $cambio_estado ){
                SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('CANCELAR_INFORME',$informe,$estado,$user_id),'selectOne');
            } else {
                if ( $estado == 'E' && is_null($fecha_completa_inicio) ){
                    $fecha_completa_inicio = new \DateTime(); // fecha de ahora
                    $fecha_completa_inicio = $fecha_completa_inicio->format('Y-m-d H:i:s');
                }
                // NO GRABA IDIOMA
                $actualizar = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('UPD_informe',$informe,$estado,$user_id,$usuario_actual,$fecha_completa_inicio,$fecha_completa_comprometida));
                // SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_informe',$contraparte,$informe,$user_id,NULL,NULL,$id_tipo_informe,$dedicacion,$estado,NULL,NULL,$usuario,$cliente,NULL,NULL,$fecha_completa_comprometida,NULL,NULL,$idioma,$fecha_completa_inicio),'selectOne');
            }
            //
            if ( $estado == 'K' && $cambio_estado ){
                $this->finalizarCerrarDCL($informe);
                /* $idTer = SQLConnection::backendStoreProcedure('LN_informe_terceros',array('GET_REFTERCERO',$informe),'selectOne');
                //
                if ( !is_null($idTer->informeid_terceros) ){
                    $webhook = ActividadesTaskController::finDCLInquiro($idTer->informeid_terceros,$informe);
                    if ( !is_null($webhook) && isset($webhook->error) && !$webhook->error ){
                        SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('CERRAR_INFORME',$informe,NULL,Session::get('usuario')->user_id));
                    }
                } */
            }
            //
            $cambio_equipo = false;
            $nuevos_usuarios_asignados = [];
            $miembros_equipo = [];
            $equipo = Request::input('equipo_asignado');
            if ( $equipo != $equipo_actual && ( $estado_informe_actual != 'K' && $estado_informe_actual != 'N' && $estado_informe_actual != 'C' && $estado_informe_actual != 'F' ) ){
                $nombre_equipo = Request::input('nombre_equipo_asignado');
                //
                $cambio_equipo = true;
            }
            // SE ARMAN COMPARACION PARA GUARDAR TRAZABILIDAD
            // if ( $cambio_estado ){
            //     // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio el estado del informe a '.$nombre_estado, $cliente, 'CAMBIAR_ESTADO_INFORME','BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
			// 	// 
            //     if ( $estado == 'R' ){
            //         // Observado
            //         SQLConnection::logTrazabilidad('El Informe fue Observado','OBS_IV',Session::get('webdata')['id_menu_plataforma'],$user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,NULL,NULL);
            //     } elseif ( $estado == 'C' ){
            //         // Rechazado
            //         SQLConnection::logTrazabilidad('El Informe fue Rechazado','REJECT_IV',Session::get('webdata')['id_menu_plataforma'],$user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,NULL,NULL);
            //     } elseif ( $estado == 'E' ){
            //         // En proceso
            //         SQLConnection::logTrazabilidad('El Informe fue Iniciado','START_IV',Session::get('webdata')['id_menu_plataforma'],$user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,NULL,NULL);
            //     } elseif ( $estado == 'N' ){
            //         // Anulado
            //         SQLConnection::logTrazabilidad('El Informe fue Anulado','CANCEL_IV',Session::get('webdata')['id_menu_plataforma'],$user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,NULL,NULL);
            //     } elseif ( $estado == 'P' ){
            //         // En gestión
            //         SQLConnection::logTrazabilidad('El Informe esta en gestión de terceros','GESTION_IV',Session::get('webdata')['id_menu_plataforma'],$user_id,$datos_informe->servicio_contratado,$datos_informe->cliente,$datos_informe->contraparte,null,null,null,null,null,NULL,NULL,$informe);
            //     } else {
            //         SQLConnection::logTrazabilidad('Se cambió el estado del informe a '.$nombre_estado,'CAMBIAR_ESTADO_INFORME',Session::get('webdata')['id_menu_plataforma'],$user_id,null,$cliente,$contraparte,null,null,null,null,null,$informe,null);
            //     }
            // }
            //
            // if ( $dedicacion_actual != $dedicacion ){
            //     // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio la prioridad del informe a '.$dedicacion, $cliente, 'CAMBIAR_PRIORIDAD_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
			// 	SQLConnection::logTrazabilidad('Se cambió la prioridad del informe a '.$dedicacion,'CAMBIAR_PRIORIDAD_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,$informe,null);
            // }
            // //
            // if ( $idioma_actual != $idioma ){
            //     // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio el idioma del informe a '.strtoupper($idioma), $cliente, 'CAMBIAR_IDIOMA_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
            //     SQLConnection::logTrazabilidad('Se cambió el idioma del informe a '.strtoupper($idioma),'CAMBIAR_IDIOMA_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,$informe,null);
            // }
            // //
            // if ( $fecha_inicio_actual != $fecha_completa_inicio_object ){
            //     if ( !is_null($fecha_inicio_actual) && $fecha_inicio_actual != FALSE ){
            //         // SE CAMBIO LA FECHA DE INICIO
            //         // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio la fecha de inicio del informe : '.$fecha_completa_inicio, $cliente, 'CAMBIAR_INICIO_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
            //         SQLConnection::logTrazabilidad('Se cambió la fecha de inicio del informe: '.$fecha_inicio,'CAMBIAR_INICIO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,$informe,null);
            //     } else {
            //         // SE ESTABLECIÓ UNA FECHA DE INICIO
            //         // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se estableció un fecha de inicio para el informe : '.$fecha_completa_inicio, $cliente, 'ESTABLECER_INICIO_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
            //         SQLConnection::logTrazabilidad('Se estableció la fecha de inicio para el informe: '.$fecha_inicio,'ESTABLECER_INICIO_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,$informe,null);
            //     }
            // }
            // //
            // if ( $fecha_comprometida_actual != $fecha_completa_comprometida_object ){
            //     if ( !is_null($fecha_comprometida_actual) && $fecha_comprometida_actual != FALSE ){
            //         // SE CAMBIO LA FECHA COMPROMETIDA
            //         // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambio la fecha comprometida del informe : '.$fecha_completa_comprometida, $cliente, 'CAMBIAR_FECHA_COMPROMETIDA_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
            //         SQLConnection::logTrazabilidad('Se cambió la fecha comprometida del informe: '.$fecha_comprometida,'CAMBIAR_FECHA_COMPROMETIDA_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,$informe,null);
            //     } else {
            //         // SE ESTABLECIÓ UNA FECHA COMPROMETIDA
            //         // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se estableció un fecha comprometida para el informe : '.$fecha_completa_comprometida, $cliente, 'ESTABLECER_FECHA_COMPROMETIDA_INFORME','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado), 'selectOne');
            //         SQLConnection::logTrazabilidad('Se estableció la fecha comprometida del informe: '.$fecha_comprometida,'ESTABLECER_FECHA_COMPROMETIDA_INFORME',Session::get('webdata')['id_menu_plataforma'],Session::get('usuario')->user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,$informe,null);
            //     }
            // }
            //
            if ( $recarga_tareas ){
                $seccion_tareas = self::tareasInforme($informe,0,null,null,true)->render();
            }
            //
            return json_encode(['error' => 1, 'mensaje' => 'OK','cambio_equipo' => $cambio_equipo,'nuevos_usuarios_asignados' => $nuevos_usuarios_asignados,'nuevo_team_usuarios' => $miembros_equipo,'seccion_tareas' => $seccion_tareas]);
        } else {
            return json_encode(['error' => 0, 'mensaje' => 'Error']);
        }
    }

    /**
     * Funcion que actualiza
     * las tareas del informe
     * @access public
     * @static
     */
    public function actualizarTareasInformeSC(){
        $informe = Request::input('informe');
        if ( isset($_POST['informe']) && (!empty($_POST['tarea']) || !empty($_POST['_tareas']))){
            $user_id = Session::get('usuario')->user_id;
            $informe = Request::input('informe');
            $cliente = Request::input('cliente');
            // $servicio_contratado = Request::input('servicio_contratado');
            $tarea = ( empty(Request::input('tarea')) ) ? NULL : Request::input('tarea');
            $tareas_finalizadas = 0; // contador que indica las tareas aprobadas y anuladas osea tareas que se determino que son finalizadas
            //
            $tareas = ( !empty($tarea) ) ? [$tarea] : Request::input('_tareas');
            foreach( $tareas as $tr ){
                $estado_actual = Request::input('estado_tarea_actual_'.$tr);
                $es_modificado = Request::input('modificado-'.$tr);
                //
                if ( $es_modificado == '0' ){
                    if ( $estado_actual == 'K' || $estado_actual == 'N' ){
                        $tareas_finalizadas++;
                    }
                    //
                    continue;
                }
                //
                $fecha_inicio_actual = ( !empty(Request::input('fecha_actual_tarea_inicio_'.$tr)) ) ? date_create_from_format('Y-m-d H:i:s',Request::input('fecha_actual_tarea_inicio_'.$tr)) : NULL;
                if ( !is_null($fecha_inicio_actual) ){
                    $fecha_inicio_actual = $fecha_inicio_actual->setTime($fecha_inicio_actual->format('H'),$fecha_inicio_actual->format('i'),0);
                }
                //
                $fecha_comprometida_actual = ( !empty(Request::input('fecha_actual_tarea_comprometida_'.$tr)) ) ? date_create_from_format('Y-m-d H:i:s',Request::input('fecha_actual_tarea_comprometida_'.$tr)) : NULL;
                if ( $fecha_comprometida_actual && !is_null($fecha_comprometida_actual) ){
                    $fecha_comprometida_actual->setTime($fecha_comprometida_actual->format('H'),$fecha_comprometida_actual->format('i'),0);
                }
                //
                $estado = Request::input('estado_tarea_'.$tr);
                $nombre_estado = Request::input('nombre_estado_'.$tr);
                //
                $usuario = Request::input('usuario_tarea_'.$tr);
                $usuario_actual = Request::input('usuario_actual_tarea_'.$tr);
                // $tarea_usuario_asignado = Request::input('tarea_usuario_asignado_'.$tr);
                $nombre_usuario = Request::input('nombre_usuario_tarea_'.$tr);
                $fecha_inicio = Request::input('fecha_tarea_completa_inicio_'.$tr);
                $fecha_comprometida = Request::input('fecha_tarea_completa_comprometida_'.$tr);
                $dedicacion = Request::input('dedicacion_tareas_informe_'.$tr);
                $dedicacion_actual = Request::input('dedicacion_actual_tarea_'.$tr);
                $tipo_tarea = Request::input('tipo_tarea_'.$tr);
                $ingresado_por = Request::input('ingresado_por_'.$tr);
                // $tipo_doc_dependiente = Request::input('tipo_doc_dependiente_'.$tr);
                // $gestion = Request::input('gestion_'.$tr);
                $nombre_tipo_tarea = Request::input('nombre_tipo_tarea_'.$tr);
                $tipo_actividad = Request::input('tipo_actividad_'.$tr);
                //
                $fecha_completa_inicio = NULL;
                $fecha_completa_comprometida = NULL;
                $fecha_completa_inicio_object = NULL;
                $fecha_completa_comprometida_object = NULL;
                if ( !is_null($fecha_inicio) && !empty($fecha_inicio) ){
                    $fecha_completa_inicio_object = date_create_from_format('d/m/Y H:i',$fecha_inicio);
                    $fecha_completa_inicio_object->setTime($fecha_completa_inicio_object->format('H'),$fecha_completa_inicio_object->format('i'),0);
                    $fecha_completa_inicio = $fecha_completa_inicio_object->format('Y-m-d H:i:s');
                }
                if ( !is_null($fecha_comprometida) && !empty($fecha_comprometida) ){
                    $fecha_completa_comprometida_object = date_create_from_format('d/m/Y H:i',$fecha_comprometida);
                    $fecha_completa_comprometida_object->setTime($fecha_completa_comprometida_object->format('H'),$fecha_completa_comprometida_object->format('i'),0);
                    $fecha_completa_comprometida = $fecha_completa_comprometida_object->format('Y-m-d H:i:s');
                }
                //
                $tareas_dependientes = self::actualizarDatosTareaSC($tr,$estado,$usuario,$fecha_completa_inicio,$fecha_completa_comprometida);
                // en caso que la tarea se aprueba , se solicita abrir las tareas que dependen de su cierre
                $es_aprobada = ($estado == 'K');
                if ( $es_aprobada || $estado == 'N' ){
                    $tareas_finalizadas++;
                    //
                    if ( is_array($tareas_dependientes) ){
                        self::evaluarTareaDependencias($tareas_dependientes,$cliente);
                    }
                } elseif ( $estado == 'E' ){
                    self::marcarTareaIniciada($tr);
                }
                //
                if( $tipo_actividad == 'T' ){
                    // SE EVAULA SI SE TIENE QUE CAMBIAR EL ESTADO DEL INFORME EN BASE AL ESTADO DE LA TAREA
                    self::cambiarEstadoInformePorEstadoTareaSC($informe,$tr,$tipo_actividad,$estado,$fecha_completa_inicio);
                }
                // SE ARMAN COMPARACION PARA GUARDAR TRAZABILIDAD
                /* if ( $estado_actual != $estado ){
                    $tipo_accion_tarea = NULL;
                    if ( $estado == 'E' ){
                        $tipo_accion_tarea = 'I';
                    } elseif( $estado == 'K' ){
                        $tipo_accion_tarea = 'F';
                    }
                    //
                    if ( $estado == 'E' || $estado == 'P' ){
                        SQLConnection::logTrazabilidad('Se inicio la tarea '.$nombre_tipo_tarea,'INICIAR_TAREA',Session::get('webdata')['id_menu_plataforma'],$user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,NULL,NULL,$tr);
                    } elseif ( $estado == 'N' ){
                        SQLConnection::logTrazabilidad('Se anulo la tarea '.$nombre_tipo_tarea,'ANULAR_TAREA',Session::get('webdata')['id_menu_plataforma'],$user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,NULL,NULL,$tr);
                    } elseif ( $estado == 'K' ){
                        SQLConnection::logTrazabilidad('Se aprobo la tarea '.$nombre_tipo_tarea,'FIN_TAREA',Session::get('webdata')['id_menu_plataforma'],$user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,NULL,NULL,$tr);
                    } elseif ( $estado == 'W' ){
                        SQLConnection::logTrazabilidad('Se puso en Espera la tarea '.$nombre_tarea,'ESPERA_TAREA',Session::get('webdata')['id_menu_plataforma'],$user_id,$servicio_contratado,$cliente,$contraparte,null,null,null,null,null,NULL,NULL,$tr);
                    }
                    //
                    // $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió el estado de la tarea '.$nombre_tipo_tarea.' a '.$nombre_estado, $cliente, 'CAMBIAR_ESTADO_TAREA','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado,NULL,NULL,NULL,NULL,$tr,$tipo_tarea), 'selectOne');
                } */
                //
                /* if ( $dedicacion_actual != $dedicacion ){
                    $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la prioridad de la tarea '.$nombre_tipo_tarea.' a '.$dedicacion, $cliente, 'CAMBIAR_PRIORIDAD_TAREA','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado,NULL,NULL,NULL,NULL,$tr), 'selectOne');
                } */
                //
                /* if ( $usuario_actual != $usuario ){
                    if ( !empty($usuario) ){
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se asignó la tarea '.$nombre_tipo_tarea.' al usuario '.$nombre_usuario, $cliente, 'ASIGNAR_TAREA_USUARIO','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado,NULL,NULL,NULL,NULL,$tr), 'selectOne');
                    } else {
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se desasignó la tarea '.$nombre_tipo_tarea.' al usuario '.$tarea_usuario_asignado, $cliente, 'DESASIGNAR_TAREA_USUARIO','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado,NULL,NULL,NULL,NULL,$tr), 'selectOne');
                    }
                } */
                //
                /* if ( $fecha_inicio_actual != $fecha_completa_inicio_object ){
                    if ( !is_null($fecha_inicio_actual) && $fecha_inicio_actual != FALSE ){
                        // SE CAMBIO LA FECHA DE INICIO
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la fecha de inicio de la tarea '.$nombre_tipo_tarea.' : '.$fecha_completa_inicio, $cliente, 'CAMBIAR_INICIO_TAREA','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado,NULL,NULL,NULL,NULL,$tr), 'selectOne');
                    } else {
                        // SE ESTABLECIO UNA FECHA DE INICIO
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se estableció un fecha de inicio para la tarea '.$nombre_tipo_tarea.' : '.$fecha_completa_inicio, $cliente, 'ESTABLECER_INICIO_TAREA','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado,NULL,NULL,NULL,NULL,$tr), 'selectOne');
                    }
                } */
                //
                /* if ( $fecha_comprometida_actual != $fecha_completa_comprometida_object ){
                    if ( !is_null($fecha_comprometida_actual) && $fecha_comprometida_actual != FALSE ){
                        // SE CAMBIO LA FECHA COMPROMETIDA
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la fecha comprometida de la tarea '.$nombre_tipo_tarea.' : '.$fecha_completa_comprometida, $cliente, 'CAMBIAR_FECHA_COMPROMETIDA_TAREA','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado,NULL,NULL,NULL,NULL,$tr), 'selectOne');
                    } else {
                        // SE ESTABLECIO UNA FECHA COMPROMETIDA
                        $temp = SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se estableció un fecha comprometida para la tarea '.$nombre_tipo_tarea.' : '.$fecha_completa_comprometida, $cliente, 'ESTABLECER_FECHA_COMPROMETIDA_TAREA','IV_BACK', $contraparte,$user_id,NULL,$servicio_contratado,NULL,NULL,NULL,NULL,$tr), 'selectOne');
                    }
                } */
            }
            // se cierra el informe si se cierran todas sus tareas
            if ( count($tareas) > 1 && $tareas_finalizadas == count($tareas) ){
                $this->finalizarCerrarDCL($informe);
            }
            //
            return 1;
            //
        } else {
            return self::tareasInforme($informe);
        }
    }

    /**
     * Funcion que cierra el informe de data cleaning
     * y comunica la finalización al sistema del cliente
     * que la solicito
     * @param string|int el id del informe
     * @return void
     */
    public function finalizarCerrarDCL($informe){
        $idTer = SQLConnection::backendStoreProcedure('LN_informe_terceros',array('GET_REFTERCERO',$informe),'selectOne');
        //
        if ( !is_null($idTer->informeid_terceros) ){
            $controller = new ActividadesTaskController();
            $webhook = $controller->finDCLInquiro($idTer->informeid_terceros,$informe);
            if ( !is_null($webhook) && isset($webhook->error) && $webhook->error == '0' ){
                SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('CERRAR_INFORME',$informe,NULL,Session::get('usuario')->user_id));
            }
        }
    }

    public static function distribuirTareasSC(){
        if ( isset($_POST['informe']) ){
            $informe = Request::input('informe');
            //
            return self::tareasInforme($informe,1,null,null,true);
        } else {
            return '0';
        }
    }

    public static function evaluarTareaDependencias($tareas_dependientes,$cliente){
        foreach( $tareas_dependientes as $tarea ){
            // 
            if ( isset($tarea->ready_to_start) && $tarea->ready_to_start == '0' && isset($tarea->pend_aprobar) && isset($tarea->informe) && $tarea->pend_aprobar == '0' ){
                SQLConnection::backendStoreProcedure('IV_ready2start',array('READY2START_DCL',NULL,$tarea->informe,Session::get('usuario')->user_id,NULL,$cliente));
            }
        }
    }

    /**
     * Funcion que actualiza los datos de la tarea
     * 
     * @access private
     * @static
     * 
     * @param string id tarea
     * @param string estado de tarea
     * @param string usuario ingresado por
     * @param string usuario que le esta asignada la tarea
     * @param string fecha de inicio
     * @param string fecha comprometida
     * 
     * @return array|null
     */
    private static function actualizarDatosTareaSC($tarea,$estado,$usuario_asignado,$fecha_inicio_tarea,$fecha_comprometida_tarea){
        $user_id = Session::get('usuario')->user_id;
        return SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('UPD_TAREA',$tarea,$estado,$user_id,$usuario_asignado,$fecha_inicio_tarea,$fecha_comprometida_tarea));
    }

    /**
     * Funcion que filtra
     * la lista de usuarios
     * y devuelve una lista
     * filtrada
     * @access private
     * @static
     * @param array la lista de usuarios
     * @param string|int el id del team
     * @return array
     */
    private static function filtrarUsuarios($usuarios,$team){
        $active_members = [];
        $team_members = SQLConnection::backendStoreProcedure('LN_Teams_', array('LSTTEAMMEMBER',Session::get('usuario')->user_id,$team),'select');
        $filtered_users = [];
        //
        foreach( $team_members as $member ){
            if ( $member->activo ){
                $active_members[] = $member->user_id;
            }
        }
        //
        foreach( $usuarios as $usuario ){
            if ( in_array($usuario->user_id,$active_members) ){
                $filtered_users['miembros'][] = $usuario;
            } else {
                $filtered_users['externos'][] = $usuario;
            }
        }
        //
        return $filtered_users;
    }
    
    /**
     * Funcion que
     * marca una tarea
     * como iniciada
     * para grabar su 
     * fecha de inicio
     * @access private
     * @static
     * @param string|int el id de la tarea
     * @return void
     */
    private static function marcarTareaIniciada($tarea){
        SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_INCIADO',NULL,$tarea,Session::get('usuario')->user_id,NULL,NULL,NULL,NULL,NULL));
    }

    /**
     * FUNCION QUE CAMBIA EL ESTADO DEL INFORME EN BASE AL ESTADO DE LA TAREA EN 
     * 
     * @access private
     * @static
     * 
     * @param string id del informe
     * @param string id de la tarea
     * @param string id del tipo de tarea
     * @param string tipo de actividad de la tarea
     * @param string codigo del estado de la tarea
     * 
     * @return int
     * 
     * */ 
    private static function cambiarEstadoInformePorEstadoTareaSC($informe,$tarea,$tipo_actividad_tarea,$codigo_estado_tarea,$inicio_tarea=NULL){
        $user_id = Session::get('usuario')->user_id;
        $estado = null;
        //
        $datos_informe = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('EDITAR_INFORME',$informe),'selectOne');
        //
        $iniciado = $datos_informe->fecha_inicio;
        if ( $tipo_actividad_tarea == 'T' ){
            // SI LA TAREA ES LA PRIMERA TAREA ( ANALISIS Y DISTRIBUCION DE TAREAS )
            if ( ( $codigo_estado_tarea == 'K' || $codigo_estado_tarea == 'E') && $datos_informe->codigo_estado_informe != 'E' ){
                // SI LA TAREA ESTA EN PROCESO EL INFORME SE PONE EN PROCESO
                $estado = 'E';
                $nombre_estado = 'En proceso';
            }
            if ( !empty($inicio_tarea) && !is_null($inicio_tarea) ) {
                $iniciado = $inicio_tarea;
            } else {
                $iniciado = new \DateTime();
                $iniciado = $iniciado->format('Y-m-d H:i:s');
            }
        }
        //
        if ( !is_null($estado) ){
            // $actualizar = SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_informe',$datos_informe->contraparte,$informe,$user_id,NULL,NULL,$datos_informe->id_tipo_informe,$datos_informe->informe_prioridad,$estado,NULL,NULL,$datos_informe->userIDAsigandoInforme,$datos_informe->cliente,NULL,NULL,$datos_informe->fecha_comprometida_informe,NULL,NULL,$datos_informe->idioma,$iniciado));
            $actualizar = SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('UPD_informe',$informe,$estado,$user_id,$datos_informe->userIDAsigandoInforme,$iniciado,$datos_informe->fecha_comprometida));
            //
            /* if ( $estado == 'E') {
                // SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se inició la actividad del informe', $datos_informe->cliente, 'START_IV','IV_BACK', $datos_informe->contraparte,$user_id,NULL,$datos_informe->servicio_contratado,NULL,NULL,NULL,NULL,$informe), 'selectOne');
                SQLConnection::logTrazabilidad('Se inició la actividad del informe','START_IV',Session::get('webdata')['id_menu_plataforma'],$user_id,$datos_informe->servicio_contratado,$datos_informe->cliente,$datos_informe->contraparte,null,null,null,null,null,NULL,NULL,$informe);
            } */
        } 
        // Distribucion de Tareas
        /* if ( !is_null($inicio_tarea) && $tipo_actividad_tarea == 'T' ) {
            SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_informe',$datos_informe->contraparte,$informe,$user_id,NULL,NULL,$datos_informe->id_tipo_informe,$datos_informe->informe_prioridad,$datos_informe->codigo_estado_informe,NULL,NULL,$datos_informe->userIDAsigandoInforme,$datos_informe->cliente,NULL,NULL,$datos_informe->fecha_comprometida_informe,NULL,NULL,$datos_informe->idioma,$inicio_tarea));
            // 
            SQLConnection::backendStoreProcedure('insertar_trazabilidad', array('Se cambió la fecha de inicio del informe: '.$inicio_tarea, $datos_informe->cliente, 'CAMBIAR_FECHA_INICIO_INFORME','IV_BACK', $datos_informe->contraparte,$user_id,NULL,$datos_informe->servicio_contratado,NULL,NULL,NULL,NULL,$informe), 'selectOne');
        } */
        //
        return 1;
    }

    //////////////////////////////////////////////
    //////// FUNCIONES DE VERSIONES VIEJAS //////
    ////////////////////////////////////////////

    /**
     * Funcion que actualiza los datos de la tarea
     * 
     * @access private
     * @static
     * 
     * @param string id cliente
     * @param string id contraparte
     * @param string id tarea
     * @param string estado de tarea
     * @param string id tipo tarea
     * @param string prioridad
     * @param string usuario ingresado por
     * @param string usuario que le esta asignada la tarea
     * @param string fecha comprometida
     * @param string fecha de inicio
     * 
     * @return null
     */
    private static function actualizarDatosTareaSCOrg($cliente,$contraparte,$tarea,$estado,$id_tipo_tarea,$prioridad,$ingresado_por,$usuario_asignado,$fecha_comprometida,$fecha_inicio,$informe=NULL,$datos_informe=NULL){
        $user_id = Session::get('usuario')->user_id;
        // SOLO ACTUALIZA LOS DATOS SI VIENE EL DATO DE ID DE INFORME, PARA COMPARAR FECHAS Y QUE NO PUEDA GRABAR FECHAS POR FUERA DE LAS DELIMITADAS EN EL INFORME.
        if (isset($informe)) {
            $datos_informe = is_null($datos_informe) ? SQLConnection::backendStoreProcedure('LN_Tareas_Informes_DCL',array('EDITAR_INFORME',$informe),'selectOne') : $datos_informe;
            // 
            $inicio_informe = isset($datos_informe->fecha_inicio) ? new \DateTime($datos_informe->fecha_inicio) : NULL;
            $comprometida_informe = new \DateTime($datos_informe->fecha_comprometida);
            $inicio_tarea = new \DateTime($fecha_inicio);
            $comprometida_tarea = new \DateTime($fecha_comprometida);
            // 
            if (!is_null($inicio_informe)) {
                return SQLConnection::backendStoreProcedure('LN_Blue_UPDAGB',array('UPD_TAREA2',$contraparte,$tarea,$user_id,NULL,NULL,$id_tipo_tarea,$prioridad,$estado,$ingresado_por,NULL,$usuario_asignado,$cliente,NULL,NULL,$fecha_comprometida,NULL,NULL,NULL,$fecha_inicio));

            } else {
                return false;
            }

        }
    }

    public static function evaluarTareaDependenciasOrg($tareas_dependientes,$contraparte,$servicio_contratado,$cliente){
        foreach( $tareas_dependientes as $tarea ){
            // 
            if ( isset($tarea->ready_to_start) && $tarea->ready_to_start == '0' && isset($tarea->pend_aprobar) && isset($tarea->informe) && $tarea->pend_aprobar == '0' ){
                SQLConnection::backendStoreProcedure('IV_ready2start',array('READY2START_DCL',NULL,$tarea->informe,Session::get('usuario')->user_id,NULL,$cliente));
            }
        }
    }
}