<?php

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



    public function metListarMovimientos(){
        $registro = $this->_db->query(
            "SELECT
                        movimiento.codigo_movimiento,
                        concat( persona_emisor.ind_nombre1, ' ', persona_emisor.ind_apellido1 ) AS persona_emisor,
                        GROUP_CONCAT( DISTINCT pk_num_movimiento ),
                        GROUP_CONCAT(DISTINCT objeto.descripcion ),
                        movimiento.fecha_creacion,
                        movimiento.tipo_movimiento,
                        movimiento.estado
                    FROM
                        pa_c007_movimiento_objeto AS movimiento
                        LEFT JOIN pa_b013_objeto AS objeto ON movimiento.fk_pab013_objeto = objeto.pk_num_objeto
                        LEFT JOIN rh_b001_empleado AS empleado_emisor ON movimiento.fk_rhb001_num_empleado_emisor = empleado_emisor.pk_num_empleado
                        LEFT JOIN a003_persona AS persona_emisor ON empleado_emisor.fk_a003_num_persona = persona_emisor.pk_num_persona 
                    GROUP BY
                        movimiento.codigo_movimiento,movimiento.tipo_movimiento 
                    ORDER BY
                        movimiento.pk_num_movimiento DESC"
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        return $registro->fetchAll();
    }
    public function metGetCodigoInsertar(){
        $registro = $this->_db->query(
            "select concat(
                    '000',
                    (SELECT COUNT(*) AS cantidad FROM pa_c007_movimiento_objeto WHERE YEAR(fecha_creacion) = YEAR(now()) ) + 1,
                    '-',
                    YEAR(now())
                ) as codigo"
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        $registro= $registro->fetchAll();
        return $registro[0]['codigo'];
    }
    public function metListarCaracteristicasObjeto()
    {
        $registro = $this->_db->query(
            "SELECT * FROM pa_c004_caracteristica_objeto"
        );
        $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' "
        );
        $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 metGetObjetoWithCaracteristicas($pk_num_objeto)
    {
        $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.pk_num_objeto = ".$pk_num_objeto." and objeto.estado = 'Activo' "
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        $resultadoFetched = $registro->fetchAll();

        $resultado = array();

        foreach($resultadoFetched as $item){
            $resultado['pk_num_objeto'] = $item['pk_num_objeto'];
            $resultado['descripcion'] = $item['descripcion'];
            $resultado['caracteristicas'][$item['pk_num_caracteristica']]['pk_num_caracteristica']=$item['pk_num_caracteristica'];
            $resultado['caracteristicas'][$item['pk_num_caracteristica']]['tipo_caracteristica']=$item['tipo_caracteristica'];
            $resultado['caracteristicas'][$item['pk_num_caracteristica']]['valor_caracteristica']=$item['nombre_caracteristica'];
        }
        return $resultado;
    }
    public function metListarMovimientosObjeto()
    {
        $registro = $this->_db->query(
            "
            select 
                movimiento.pk_num_movimiento,
                concat(persona_emisor.ind_nombre1,' ',persona_emisor.ind_apellido1) as persona_emisor,
                movimiento.observacion as descripcion_movimiento,
                movimiento.observacion_salida as descripcion_salida,
                movimiento.fecha_creacion,
                movimiento.tipo_movimiento,
                movimiento.estado,
                objeto.pk_num_objeto,
                objeto.descripcion as nombre_objeto,
                caracteristica.pk_num_caracteristica,
                caracteristica.descripcion as nombre_caracteristica,
                asignacion.pk_num_caracteristica_objeto,
                asignacion.descripcion as valor_caracteristica,
                concat(persona_portador.ind_nombre1,' ',persona_portador.ind_apellido1) as persona_portador
            from pa_c007_movimiento_objeto	as movimiento
                left join pa_b013_objeto as objeto on movimiento.fk_pab013_objeto = objeto.pk_num_objeto
                left join rh_b001_empleado on movimiento.fk_rhb001_num_empleado_portador = rh_b001_empleado.pk_num_empleado
                left join a003_persona as persona_portador on rh_b001_empleado.fk_a003_num_persona = persona_portador.pk_num_persona
                left join rh_b001_empleado as empleado_emisor on movimiento.fk_rhb001_num_empleado_emisor = empleado_emisor.pk_num_empleado
                left join a003_persona as persona_emisor on empleado_emisor.fk_a003_num_persona = persona_emisor.pk_num_persona
                left join pa_d002_asignacion_caracteristica_objeto as asignacion on objeto.pk_num_objeto = asignacion.fk_pab013_objeto
                left join pa_c004_caracteristica_objeto as caracteristica on asignacion.fk_pac004_caracteristica = caracteristica.pk_num_caracteristica
            "
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        $registro = $registro->fetchAll();
        foreach ($registro as $valor){
            $resumen[$valor['pk_num_movimiento']]['pk_num_movimiento'] = $valor['pk_num_movimiento'];
            $resumen[$valor['pk_num_movimiento']]['emisor'] = $valor['persona_emisor'];
            $resumen[$valor['pk_num_movimiento']]['descripcion'] = $valor['descripcion_movimiento'];
            $resumen[$valor['pk_num_movimiento']]['fecha_creacion'] = $valor['fecha_creacion'];
            $resumen[$valor['pk_num_movimiento']]['tipo_movimiento'] = $valor['tipo_movimiento'];
            $resumen[$valor['pk_num_movimiento']]['estado'] = $valor['estado'];
            $resumen[$valor['pk_num_movimiento']]['objetos'][$valor['pk_num_objeto']]['persona_portador']=$valor['persona_portador'];
            $resumen[$valor['pk_num_movimiento']]['objetos'][$valor['pk_num_objeto']]['pk_num_objeto'] = $valor['pk_num_objeto'];
            $resumen[$valor['pk_num_movimiento']]['objetos'][$valor['pk_num_objeto']]['nombre_objeto'] = $valor['nombre_objeto'];
            $resumen[$valor['pk_num_movimiento']]['objetos'][$valor['pk_num_objeto']]['caracteristicas'][$valor['pk_num_caracteristica']]['pk_num_caracteristica']=$valor['pk_num_caracteristica'];
            $resumen[$valor['pk_num_movimiento']]['objetos'][$valor['pk_num_objeto']]['caracteristicas'][$valor['pk_num_caracteristica']]['nombre_caracteristica'] = $valor['nombre_caracteristica'];
            $resumen[$valor['pk_num_movimiento']]['objetos'][$valor['pk_num_objeto']]['caracteristicas'][$valor['pk_num_caracteristica']]['valor_caracteristica'] = $valor['valor_caracteristica'];
        }
        return $resumen;
    }
    public function metGetMovimientoObjeto($codigo_movimiento)
    {
        $registro = $this->_db->query(
            "
            SELECT
                movimiento.pk_num_movimiento,
                concat( persona_emisor.ind_nombre1, ' ', persona_emisor.ind_apellido1 ) AS persona_emisor,
                movimiento.observacion AS descripcion_movimiento,
                movimiento.observacion_salida AS descripcion_salida,
                movimiento.fecha_creacion,
                movimiento.estado as estado,
                objeto.pk_num_objeto,
                objeto.descripcion AS nombre_objeto,
                GROUP_CONCAT( concat( caracteristica.pk_num_caracteristica, '-', caracteristica.descripcion, '-', asignacion.descripcion ) ORDER BY caracteristica.pk_num_caracteristica ASC ) AS nombre_caracteristica,
                asignacion.pk_num_caracteristica_objeto,
                concat( persona_portador.ind_nombre1, ' ', persona_portador.ind_apellido1 ) AS persona_portador,
                tipo.descripcion as tipo_objeto
            FROM
                pa_c007_movimiento_objeto AS movimiento
                LEFT JOIN pa_b013_objeto AS objeto ON movimiento.fk_pab013_objeto = objeto.pk_num_objeto
                LEFT JOIN rh_b001_empleado ON movimiento.fk_rhb001_num_empleado_portador = rh_b001_empleado.pk_num_empleado
                LEFT JOIN a003_persona AS persona_portador ON rh_b001_empleado.fk_a003_num_persona = persona_portador.pk_num_persona
                LEFT JOIN rh_b001_empleado AS empleado_emisor ON movimiento.fk_rhb001_num_empleado_emisor = empleado_emisor.pk_num_empleado
                LEFT JOIN a003_persona AS persona_emisor ON empleado_emisor.fk_a003_num_persona = persona_emisor.pk_num_persona
                LEFT JOIN pa_d002_asignacion_caracteristica_objeto AS asignacion ON objeto.pk_num_objeto = asignacion.fk_pab013_objeto
                LEFT JOIN pa_c004_caracteristica_objeto AS caracteristica ON asignacion.fk_pac004_caracteristica = caracteristica.pk_num_caracteristica 
                LEFT JOIN pa_c008_tipo_objeto AS tipo ON  objeto.fk_pac008_tipo_objeto = tipo.pk_num_tipo_objeto
            WHERE
                movimiento.codigo_movimiento = '".$codigo_movimiento."' 
            GROUP BY
                objeto.pk_num_objeto DESC
            "
        );
        $registro->setFetchMode(PDO::FETCH_ASSOC);
        $registro = $registro->fetchAll();

        return $registro;
    }
    public function metInsertEntrada($info_persona,$objetos,$observacion_general){

        $objetos_agregados = array();
        $ID_objetos_agregados = '';

        $codigo=$this->metGetCodigoInsertar();

        $this->_db->beginTransaction();


        $insertObjeto = $this->_db->prepare("
            INSERT INTO
                pa_b013_objeto
            set 
                fk_pac008_tipo_objeto=:fk_pac008_tipo_objeto,
                descripcion=:descripcion,
                fk_rhb001_num_empleado=:fk_rhb001_num_empleado
        ");

        $insertPersona = $this->_db->prepare("
            INSERT INTO
                a003_persona
            set 
                ind_nombre1=:ind_nombre1,
                ind_apellido1=:ind_apellido1,
                ind_cedula_documento=:ind_cedula_documento,
                fk_a006_num_miscelaneo_detalle_sexo=:fk_a006_num_miscelaneo_detalle_sexo,
                fk_a006_num_miscelaneo_detalle_nacionalidad=:fk_a006_num_miscelaneo_detalle_nacionalidad,
                fk_a006_num_miscelaneo_det_tipopersona=:fk_a006_num_miscelaneo_det_tipopersona,
                ind_tipo_persona=:ind_tipo_persona,
                fk_a018_num_seguridad_usuario=:fk_a018_num_seguridad_usuario,
                fec_ultima_modificacion= now(),
                num_estatus=:num_estatus
            ");

        $insertAsignacionCaracteristicaObjeto = $this->_db->prepare("
            INSERT INTO
                pa_d002_asignacion_caracteristica_objeto
            set 
                fk_pab013_objeto=:fk_pab013_objeto,
                fk_pac004_caracteristica=:fk_pac004_caracteristica,
                descripcion=:descripcion,
                fk_rhb001_num_empleado=:fk_rhb001_num_empleado
            ");

        $insertMovimientoObjeto = $this->_db->prepare("
            INSERT INTO
                pa_c007_movimiento_objeto
            set 
                fk_rhb001_num_empleado_emisor=:fk_rhb001_num_empleado_emisor,
                codigo_movimiento=:codigo_movimiento,
                fk_pab013_objeto=:fk_pab013_objeto,
                fk_rhb001_num_empleado_portador=:fk_rhb001_num_empleado_portador,
                observacion=:observacion,
                fk_rhb001_num_empleado=:fk_rhb001_num_empleado,
                fk_a003_num_persona_portador=:fk_a003_num_persona_portador,
                telefono=:telefono,
                direccion=:direccion
            ");

 $flag=true;

        foreach ($objetos as $objeto){$flag=true;
            foreach ($objeto as $objetox){

                //Objeto no ha sido agregado y al estar marcado con X es porque no está en la BD
                if(!in_array($objetox['pk_num_objeto'], $objetos_agregados) && $objetox['pk_num_objeto'] < 0) {


                    if($flag){$flag=false;

                        $insertObjeto->execute(array(
                            'fk_pac008_tipo_objeto' => $objetox['id_tipo_objeto'],
                            'descripcion' => $objetox['descripcion_objeto'],
                            'fk_rhb001_num_empleado' => $this->atIdEmpleado,
                        ));

                        $idObjetoAgregado = $this->_db->lastInsertId();

                        $objetos_agregados[] = $idObjetoAgregado;
                    }


                } else {
                    if($objetox['pk_num_objeto'] < 0){
                        $idObjetoAgregado = $objetox['pk_num_objeto'];
                    }

                    $objetos_agregados[] = $idObjetoAgregado;
                }

                if($objetox['pk_num_objeto'] < 0 ){
                    $insertAsignacionCaracteristicaObjeto->execute(array(
                        'fk_pab013_objeto' => $idObjetoAgregado,
                        'fk_pac004_caracteristica' => $objetox['pk_num_caracteristica'],
                        'descripcion' => $objetox['valor_agregado'],
                        'fk_rhb001_num_empleado' => $this->atIdEmpleado,
                    ));
                }

            }///////////////////////////////////////

            $nuevaPersona = $info_persona['tipo_persona']=='Nuevo'?true:false;

            if( $nuevaPersona ){
                $insertPersona->execute(array(
                    'ind_nombre1' => $info_persona['nombres'],
                    'ind_apellido1' => $info_persona['apellidos'],
                    'ind_cedula_documento' => $info_persona['cedula'],
                    'fk_a006_num_miscelaneo_detalle_sexo' => $info_persona['fk_a006_num_miscelaneo_detalle_sexo'],
                    'fk_a006_num_miscelaneo_detalle_nacionalidad' => $info_persona['fk_a006_num_miscelaneo_detalle_nacionalidad'],
                    'fk_a006_num_miscelaneo_det_tipopersona' => $info_persona['fk_a006_num_miscelaneo_det_tipopersona'],
                    'fk_a018_num_seguridad_usuario' => $this->atIdUsuario,
                    'num_estatus' => $info_persona['num_estatus'],
                    'ind_tipo_persona' => $info_persona['ind_tipo_persona'],
                ));
                $info_persona['pk_num_persona'] = $this->_db->lastInsertId();
            }

            $insertMovimientoObjeto->execute(array(
                'fk_rhb001_num_empleado_emisor' => $this->atIdEmpleado,
                'fk_pab013_objeto' => $idObjetoAgregado,
                'fk_rhb001_num_empleado_portador' => $info_persona['id_empleado'],
                'observacion' => $observacion_general,
                'codigo_movimiento' => $codigo,
                 'fk_rhb001_num_empleado' => $this->atIdEmpleado,
                'fk_a003_num_persona_portador' => $info_persona['pk_num_persona'],
                'telefono' => $info_persona['telefono'],
                'direccion' => $info_persona['direccion'],
            ));
        }





        $fallaTansaccion = $insertMovimientoObjeto->errorInfo();



        if (!empty($fallaTansaccion[1]) && !empty($fallaTansaccion[2])) {
            $response=$fallaTansaccion[1] . ' ' . $fallaTansaccion[2];
            $this->_db->rollBack();
            return $response;
        } else {
            $response = true;
            $this->_db->commit();
            return $response;
        }
    }

    public function metInsertSalida($arrayMovimientos,$observacion_salida){
        $response=false;
        $this->_db->beginTransaction();

        $insertObjeto = $this->_db->prepare("
            UPDATE 
                pa_c007_movimiento_objeto
            set 
                fecha_salida= now(),
                fecha_modificacion= now(),
                fk_rhb001_num_empleado=:fk_rhb001_num_empleado,
                observacion_salida=:observacion_salida,
                estado= 'Cerrado',
                tipo_movimiento='Salida'
            where pk_num_movimiento=:pk_num_movimiento
        ");

        foreach ($arrayMovimientos as $movimiento){
            $insertObjeto->execute(array(
                'pk_num_movimiento' => $movimiento,
                'observacion_salida' => $observacion_salida,
                'fk_rhb001_num_empleado' => $this->atIdEmpleado,
            ));
            $fallaTansaccion = $insertObjeto->errorInfo();
        }

        if (!empty($fallaTansaccion[1]) && !empty($fallaTansaccion[2])) {
            $response=$fallaTansaccion[1] . ' ' . $fallaTansaccion[2];
            $this->_db->rollBack();
            return $response;
        }else{
            $response = true;
            $this->_db->commit();
            return $response;
        }


        function generarCodigoAlfanumerico($cantidad) {
            return bin2hex(random_bytes($cantidad));
        }

    }



}


