<?php

class recorridoModelo extends Modelo
{
    private $atIdEmpleado;
    public function __construct()
    {
        parent::__construct();
        $this->atIdEmpleado = Session::metObtener('idEmpleado');
    }

    public function metListarRecorridos($desde=null , $hasta=null)
    {
        /*
         * Dependiendo si se envía información de las fechas se toma como rango de búsqueda
         * caso contrario se utiliza la fecha actual del servidor para la consulta.
         * Se busca reducir el tamaño de la respuesta.
         */


        if( isset($desde) && isset($hasta)){
            $whereClause =" pa_b014_recorrido.fecha_creacion >= '". $desde . " ' and pa_b014_recorrido.fecha_creacion <= '". $hasta . " '";
        }else{
            $fecha = date("Y-m-d");
            $whereClause =" pa_b014_recorrido.fecha_creacion >= '". $fecha ." 00:00:01' and pa_b014_recorrido.fecha_creacion <= '". $fecha ." 23:59:59' ";

        }
        $registro = $this->_db->query(
            "SELECT 
                        pa_b014_recorrido.*,
                        pa_c005_tipo_tiempo_recorrido.descripcion ,
                        concat(a003_persona.ind_nombre1,' ',a003_persona.ind_apellido1) as nombre_emisor
                    FROM pa_b014_recorrido  
                    left join pa_c005_tipo_tiempo_recorrido on pa_b014_recorrido.fk_pac005_tipo_tiempo = pa_c005_tipo_tiempo_recorrido.pk_num_tiempo_recorrido 
                    LEFT JOIN rh_b001_empleado on pa_b014_recorrido.fk_rhb001_empleado_emisor = rh_b001_empleado.pk_num_empleado
	                LEFT JOIN a003_persona on rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona
                    where " . $whereClause
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        $resultado = $registro->fetchAll();
        return $resultado;
    }
    public function metListarUbicacionesRecorrido()
    {
        $registro = $this->_db->query(
            "SELECT * FROM pa_c006_tipo_ubicacion_recorrido"
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        return $registro->fetchAll();
    }
    public function metListarCaracteristicasObjeto()
    {
        $registro = $this->_db->query(
            "SELECT * FROM pa_c004_caracteristica_objeto"
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        return $registro->fetchAll();
    }
    public function metListarTiemposdeRecorrido()
    {
        $registro = $this->_db->query(
            "SELECT * FROM pa_c005_tipo_tiempo_recorrido"
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        return $registro->fetchAll();
    }
    public function metListarTipoObjeto()
    {
        $registro = $this->_db->query(
            "SELECT * FROM pa_c008_tipo_objeto"
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        return $registro->fetchAll();
    }
    public function metListarObjetoWithCaracteristicas()
    {
        $registro = $this->_db->query(
            "select 
                    objeto.pk_num_objeto, 
                    objeto.descripcion,
                    asignacion.descripcion as nombre_caracteristica,
                    caracteristica.descripcion as tipo_caracteristica,
                    caracteristica.pk_num_caracteristica,
                    objeto.estado as estado_objeto,
                    asignacion.estado as estado_asignacion,
                    caracteristica.estado as estado_caracteristica
                from pa_b013_objeto as objeto
                left join pa_d002_asignacion_caracteristica_objeto as asignacion on objeto.pk_num_objeto = asignacion.fk_b013_objeto
                left join pa_c004_caracteristica_objeto as caracteristica on asignacion.fk_c004_caracteristica = caracteristica.pk_num_caracteristica
                where objeto.estado = 'Activo' and asignacion.estado = 'Activo' and caracteristica.estado = 'Activo' "
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        $resultadoFetched = $registro->fetchAll();

        $resultado = array();

        foreach($resultadoFetched as $item){
            $resultado[$item['pk_num_objeto']]['pk_num_objeto'] = $item['pk_num_objeto'];
            $resultado[$item['pk_num_objeto']]['descripcion'] = $item['descripcion'];
            $resultado[$item['pk_num_objeto']]['caracteristicas'][$item['pk_num_caracteristica']]['pk_num_caracteristica']=$item['pk_num_caracteristica'];
            $resultado[$item['pk_num_objeto']]['caracteristicas'][$item['pk_num_caracteristica']]['tipo_caracteristica']=$item['tipo_caracteristica'];
            $resultado[$item['pk_num_objeto']]['caracteristicas'][$item['pk_num_caracteristica']]['valor_caracteristica']=$item['nombre_caracteristica'];
        }
        return $resultado;
    }


    public function metInsertRecorrido($descripcion_Recorrido,$id_tiempo_recorrido,$lugares_revisados){
        $this->_db->beginTransaction();


        $insertRecorrido = $this->_db->prepare("
            INSERT INTO
                pa_b014_recorrido
            set 
                fk_rhb001_empleado_emisor=:fk_rhb001_empleado_emisor,
                observacion=:observacion,
                fk_pac005_tipo_tiempo=:fk_pac005_tipo_tiempo,
                fk_rhb001_num_empleado=:fk_rhb001_num_empleado
            ");

        $insertRecorrido->execute(array(
            'fk_rhb001_empleado_emisor' => $this->atIdEmpleado,
            'observacion' => $descripcion_Recorrido,
            'fk_pac005_tipo_tiempo' => $id_tiempo_recorrido,
            'fk_rhb001_num_empleado' => $this->atIdEmpleado
        ));
        $idAgregado = $this->_db->lastInsertId();
        $fallaTansaccion = $insertRecorrido->errorInfo();


        if (!empty($fallaTansaccion[1]) && !empty($fallaTansaccion[2])) {
            $this->_db->rollBack();
        } else {

            $recorrido_ubicacion = $this->_db->prepare("
            INSERT INTO
                pa_d003_recorrido_ubicacion 
            set 
                fk_pab014_recorrido=:fk_pab014_recorrido,
                fk_pac006_tipo_ubicacion_recorrido=:fk_pac006_tipo_ubicacion_recorrido,
                observacion=:observacion,
                fk_rhb001_num_empleado=:fk_rhb001_num_empleado
            ");

            foreach($lugares_revisados as $lugar){
                $recorrido_ubicacion->execute(array(
                    'fk_pab014_recorrido' => $idAgregado,
                    'fk_pac006_tipo_ubicacion_recorrido' => $lugar['id'],
                    'observacion' => $lugar['observacion'],
                    'fk_rhb001_num_empleado' => $this->atIdEmpleado
                ));
                $fallaTansaccion2 = $recorrido_ubicacion->errorInfo();
            }

            if (!empty($fallaTansaccion2[1]) && !empty($fallaTansaccion2[2])) {
                $this->_db->rollBack();
            } else {
                $this->_db->commit();
            }
        }


        return $idAgregado;
    }


    public function metModificarRecorrido($pk_num_recorrido,$id_tiempo_recorrido,$descripcion_Recorrido,$lugares){
        $this->_db->beginTransaction();

        $modificarRecorrido = $this->_db->prepare("
            UPDATE
                pa_b014_recorrido
            SET 
                observacion=:observacion,
                fk_pac005_tipo_tiempo=:fk_pac005_tipo_tiempo,
                fk_rhb001_num_empleado=:fk_rhb001_num_empleado,
                fecha_modificacion=now()
            WHERE
                pk_num_recorrido = " . $pk_num_recorrido
            );

        $modificarRecorrido->execute(array(
            'observacion' => $descripcion_Recorrido,
            'fk_pac005_tipo_tiempo' => $id_tiempo_recorrido,
            'fk_rhb001_num_empleado' => $this->atIdEmpleado
        ));

        $fallaTansaccion = $modificarRecorrido->errorInfo();


        if (!empty($fallaTansaccion[1]) && !empty($fallaTansaccion[2])) {
            $this->_db->rollBack();
        } else {

            $nuevaUbicacion = $this->_db->prepare("
            INSERT INTO
                pa_d003_recorrido_ubicacion 
            set 
                fk_pab014_recorrido=:fk_pab014_recorrido,
                fk_pac006_tipo_ubicacion_recorrido=:fk_pac006_tipo_ubicacion_recorrido,
                observacion=:observacion,
                fk_rhb001_num_empleado=:fk_rhb001_num_empleado
            ");

            $modificarUbicacion = $this->_db->prepare("
            UPDATE                 
                pa_d003_recorrido_ubicacion 
            set 
                fk_pac006_tipo_ubicacion_recorrido=:fk_pac006_tipo_ubicacion_recorrido,
                observacion=:observacion,
                fk_rhb001_num_empleado=:fk_rhb001_num_empleado,
                fecha_modificacion=now()
            WHERE  
                pk_num_recorrido_ubicacion=:pk_num_recorrido_ubicacion"
            );

            $eliminarUbicacion = $this->_db->prepare("
            UPDATE
                pa_d003_recorrido_ubicacion 
            set 
                estado='Eliminado',
                fk_rhb001_num_empleado=:fk_rhb001_num_empleado,
                fecha_modificacion=now()
            WHERE  
                pk_num_recorrido_ubicacion=:pk_num_recorrido_ubicacion"
            );


            foreach($lugares as $lugar){
                switch ($lugar['estado']){
                    case 'nuevo':
                        $nuevaUbicacion->execute(array(
                            'fk_pab014_recorrido' => $pk_num_recorrido,
                            'observacion' => $lugar['observacion'],
                            'fk_pac006_tipo_ubicacion_recorrido' => $lugar['id'],
                            'fk_rhb001_num_empleado' => $this->atIdEmpleado
                        ));
                        break;

                    case 'modificado':
                        $modificarUbicacion->execute(array(
                            'pk_num_recorrido_ubicacion' => $lugar['id_ubicacion'],
                            'observacion' => $lugar['observacion'],
                            'fk_pac006_tipo_ubicacion_recorrido' => $lugar['id'],
                            'fk_rhb001_num_empleado' => $this->atIdEmpleado
                        ));
                        break;

                    case 'eliminado':
                        $eliminarUbicacion->execute(array(
                            'pk_num_recorrido_ubicacion' => $lugar['id_ubicacion'],
                            'fk_rhb001_num_empleado' => $this->atIdEmpleado
                        ));
                        break;
                }
            }

            $this->_db->commit();
        }


    }


    public function metGetRecorrido($pk_num_recorrido){
        $registro = $this->_db->query(
            "SELECT 
                        concat(a003_persona.ind_nombre1,' ',a003_persona.ind_apellido1) as nombre_emisor,
                        pa_c005_tipo_tiempo_recorrido.descripcion as tipo_recorrido,
                        pa_c006_tipo_ubicacion_recorrido.pk_num_ubicacion_recorrido,
                        pa_c006_tipo_ubicacion_recorrido.descripcion as ubicacion_recorrido,
                        pa_d003_recorrido_ubicacion.pk_num_recorrido_ubicacion,
                        pa_d003_recorrido_ubicacion.observacion as observacion_ubicacion,
                        pa_d003_recorrido_ubicacion.estado as estado_ubicacion_recorrido,
                        pa_b014_recorrido.*,
                        concat(person_modificado.ind_nombre1,' ',person_modificado.ind_apellido1) as persona_modificado
                    FROM pa_b014_recorrido  
                    left join pa_c005_tipo_tiempo_recorrido on pa_b014_recorrido.fk_pac005_tipo_tiempo = pa_c005_tipo_tiempo_recorrido.pk_num_tiempo_recorrido 
                    LEFT JOIN rh_b001_empleado on pa_b014_recorrido.fk_rhb001_empleado_emisor = rh_b001_empleado.pk_num_empleado
					LEFT JOIN a003_persona on rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona
					left join rh_b001_empleado as user_modificado on pa_b014_recorrido.fk_rhb001_num_empleado = user_modificado.pk_num_empleado
					LEFT JOIN a003_persona as person_modificado on user_modificado.fk_a003_num_persona = person_modificado.pk_num_persona
					left join pa_d003_recorrido_ubicacion on pa_b014_recorrido.pk_num_recorrido = pa_d003_recorrido_ubicacion.fk_pab014_recorrido
					left join pa_c006_tipo_ubicacion_recorrido on pa_d003_recorrido_ubicacion.fk_pac006_tipo_ubicacion_recorrido = pa_c006_tipo_ubicacion_recorrido.pk_num_ubicacion_recorrido
                    where pa_b014_recorrido.pk_num_recorrido = '". $pk_num_recorrido ."'"
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        $registro= $registro->fetchAll();

        foreach($registro as $valor){
                $ordenar['pk_num_recorrido'] = $valor['pk_num_recorrido'];
                $ordenar['emisor'] = $valor['nombre_emisor'];
                $ordenar['tipo_recorrido'] = $valor['tipo_recorrido'];
                $ordenar['observacion'] = $valor['observacion'];
                $ordenar['fk_pac005_tipo_tiempo'] = $valor['fk_pac005_tipo_tiempo'];
                $ordenar['estado'] = $valor['estado'];
                $ordenar['creado'] = $valor['fecha_creacion'];
                $ordenar['modificado'] = $valor['fecha_modificacion'];
                $ordenar['persona_modificado'] = $valor['persona_modificado'];
                $ordenar['Ubicaciones'][$valor['pk_num_ubicacion_recorrido']]['pk_num_ubicacion_recorrido'] = $valor['pk_num_ubicacion_recorrido'];
                $ordenar['Ubicaciones'][$valor['pk_num_ubicacion_recorrido']]['ubicacion_recorrido'] = $valor['ubicacion_recorrido'];
                $ordenar['Ubicaciones'][$valor['pk_num_ubicacion_recorrido']]['pk_num_recorrido_ubicacion'] = $valor['pk_num_recorrido_ubicacion'];
                $ordenar['Ubicaciones'][$valor['pk_num_ubicacion_recorrido']]['observacion'] = $valor['observacion_ubicacion'];
                $ordenar['Ubicaciones'][$valor['pk_num_ubicacion_recorrido']]['estado'] = $valor['estado_ubicacion_recorrido'];
        }
        return $ordenar;
    }


    public function metGetRecorridoNew($pk_num_recorrido){
        $registro = $this->_db->query(
            "SELECT 
                        concat(a003_persona.ind_nombre1,' ',a003_persona.ind_apellido1) as nombre_emisor,
                        pa_c005_tipo_tiempo_recorrido.descripcion as tipo_recorrido,
                         pa_b014_recorrido.*,
                        concat(person_modificado.ind_nombre1,' ',person_modificado.ind_apellido1) as persona_modificado
                    FROM pa_b014_recorrido  
                    left join pa_c005_tipo_tiempo_recorrido on pa_b014_recorrido.fk_pac005_tipo_tiempo = pa_c005_tipo_tiempo_recorrido.pk_num_tiempo_recorrido 
                    LEFT JOIN rh_b001_empleado on pa_b014_recorrido.fk_rhb001_empleado_emisor = rh_b001_empleado.pk_num_empleado
					LEFT JOIN a003_persona on rh_b001_empleado.fk_a003_num_persona = a003_persona.pk_num_persona
					left join rh_b001_empleado as user_modificado on pa_b014_recorrido.fk_rhb001_num_empleado = user_modificado.pk_num_empleado
					LEFT JOIN a003_persona as person_modificado on user_modificado.fk_a003_num_persona = person_modificado.pk_num_persona
					
                    where pa_b014_recorrido.pk_num_recorrido = " . $pk_num_recorrido
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        $resultadoInicial = $registro->fetchAll();

        //$resultadoInicial= $resultadoInicial[0];
        $resultadoFinal = array();

        foreach ($resultadoInicial as $resultado){
                $detalle = $this->metGetDetalleTipoRecorrido($pk_num_recorrido);
                $detallesEncontrados = array();
                foreach ($detalle as $myDetalle){
                    $detallesEncontrados[] = array(
                        'pk_num_recorrido_ubicacion' => $myDetalle['pk_num_recorrido_ubicacion'],
                        'pk_num_tipo_ubicacion' => $myDetalle['pk_num_tipo_ubicacion'],
                        'nombre_tipo_ubicacion' => $myDetalle['tipo_ubicacion'],
                        'observacion' => $myDetalle['observacion'],
                        'estado' => $myDetalle['estado_observacion']
                    );
                }

            $resultadoFinal[] = array(
                'pk_num_recorrido' => $resultado['pk_num_recorrido'],
                'emisor' => $resultado['nombre_emisor'],
                'creado' => $resultado['fecha_creacion'],
                'fk_pac005_tipo_tiempo' => $resultado['fk_pac005_tipo_tiempo'],
                'tipo_recorrido' => $resultado['tipo_recorrido'],
                'observacion' => $resultado['observacion'],
                'estado' => $resultado['estado'],
                'persona_modifica' => $resultado['persona_modificado'],
                'modificado' => $resultado['fecha_modificacion'],
                'ubicaciones'=> $detallesEncontrados
            );
        }
        return $resultadoFinal[0];

    }

    public function metGetDetalleTipoRecorrido($pk_num_recorrido)
    {
        $registro = $this->_db->query(
            "select 
                        detalle.pk_num_recorrido_ubicacion,
                        detalle.fk_pab014_recorrido,
                        tipo.pk_num_ubicacion_recorrido as pk_num_tipo_ubicacion,
                        tipo.descripcion as tipo_ubicacion,
                        detalle.observacion,
                        detalle.estado as estado_observacion
                    from pa_d003_recorrido_ubicacion as detalle 
                    left join pa_c006_tipo_ubicacion_recorrido as tipo on detalle.fk_pac006_tipo_ubicacion_recorrido = tipo.pk_num_ubicacion_recorrido
                    where detalle.fk_pab014_recorrido = " . $pk_num_recorrido
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        return $registro->fetchAll();
    }


}


