<?php

/**
 * cargar_deducidos actions.
 *
 * @package    nomina
 * @subpackage cargar_deducidos
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class cargar_deducidosActions extends sfActions {

    /**
     * Executes index action
     *
     * @param sfRequest $request A request object
     */
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------*  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");


        $id_concep_nomina_orig = $id_concep_nomina = $request['id_concep_nomina'];
        $id_periodo = $request['id_periodo'];
        $archivo = $request['file_name'];

        $mensaje = "";

        $header = null;
        $data = array();
        $delimiter = ",";

        $cant = 0;
        $cant_real = 0;
        $val_num_doc_res = true;

        /*
         * Variables de carga archivo con conceptos - 20130911
         */
        $accion_concepto = 0;
        if (isset($request['accion_concepto'])) {
            $accion_concepto = $request['accion_concepto'];
        }
        $accion_todos = 1;
        if (isset($request['accion_todos'])) {
            $accion_todos = $request['accion_todos'];
        }

        /*
         * Se crea conexión
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Manejo de errores
         */
        $linea = 1;
        try {

            if (isset($request['accion_filtro'])) {

                /*
                 * Validar de hay archivo
                 */
                if (($handle = fopen("uploads/carga_datos/" . $archivo, "r")) !== FALSE) {

                    $this->logMessage("-----------SI HAY ARCHIVO----------");

                    while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {

//                        $this->logMessage("-----------ENTRE AQUI----------");

                        if ($header == null)
                            $header = $row;
                        else
                            $data[] = array_combine($header, $row);
                    }

                    /*
                     * Limpia tabla NO_IMP_DEDUC_T temporal del proceso
                     */
                    $sql = <<<EOD
TRUNCATE TABLE NO_IMP_DEDUC_T    
EOD;

                    $this->conn->execute($sql);

                    /*
                     * El archivo tiene datos
                     */
                    if (count($data) > 0) {

                        $this->logMessage("-----------SI TIENE DATOS----------");

                        /*
                         * Recorrer datos del archivo por fila
                         */
                        foreach ($data as $datos) {
                            $linea = $linea + 1;

                            $this->logMessage("-----------NUM_DOC/VALOR----------" . $datos['NUM_DOC'] . "/" . $datos['VALOR']);

                            if (isset($datos['NUM_DOC']) && isset($datos['VALOR'])) {

//                                $this->logMessage("-----------VALOR----------");

                                $num_doc = $datos['NUM_DOC'];
                                $valor = $datos['VALOR'];

                                /*
                                 * Si archivo con conceptos - 20130911
                                 */
                                if ($accion_concepto == 1) {
                                    $concepto = $datos['CONCEPTO'];

                                    $sql = <<<EOD
select id_concep_nomina from no_concep_nomina where codigo = '$concepto'
EOD;
                                    $results = CN_TABLE::executeSQL($sql);

                                    $id_concep_nomina = $results[0]['id_concep_nomina'];
                                }

                                $sql = <<<EOD
INSERT INTO NO_IMP_DEDUC_T (NUM_DOC,ID_CONCEP_NOMINA,VALOR)
    VALUES($num_doc,$id_concep_nomina,$valor)
EOD;

                                /*
                                 * Validar que sean todos los conceptos 
                                 */
                                if ($accion_todos == 1) {
                                    $this->conn->execute($sql);
                                } else {
                                    //Valida que sea el concepto del filtro - 20130911
                                    if ($id_concep_nomina_orig == $id_concep_nomina) {
                                        $this->conn->execute($sql);
                                    }
                                }
                            } else {

                                $mensaje = "Error en el valor";
                                $this->logMessage("-----------Error en el valor----------");
                            }
                        }
                    } else {
                        $this->logMessage("-----------NO TIENE DATOS----------");
                        $mensaje = "El archivo esta vacio.Favor Verificar";
                    }

                    fclose($handle);
                } else {
                    $this->logMessage("-----------NO HAY ARCHIVO----------");
                    $mensaje = "El archivo no existe.Favor Verificar";
                }

                //RECORRO LA TABLA TEMPORAL 

                $sql = <<<EOD
SELECT * FROM NO_IMP_DEDUC_T
EOD;
                $records_real = CN_TABLE::executeSQL($sql);

                $cant_real = count($records_real);

                /*
                 * RECORRO LA TABLA TEMPORAL solo los conceptos para borrar registros en el periodo - 20130913
                 */
                $sql = <<<EOD
select distinct
imp.id_concep_nomina 
from no_imp_deduc_t imp
left join no_estado_retirado_v ret
on ret.num_doc = imp.num_doc 
where 
ret.id_estado_func is null 
or 
ret.id_anhos ||  lpad(ret.id_meses,2,'0')  >= (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = $id_periodo)
EOD;
                $records = CN_TABLE::executeSQL($sql);

                foreach ($records as $records) {
                    /*
                     * Datos del archivo
                     * El id_concep_nomina de toma de la tabla no_imp_deduc_t - 20130911
                     */
                    $id_concep_nomina = $records['id_concep_nomina'];

                    /**
                     * Borrar registros NO_DED_NOLEY en el periodo por carge masivo - 20130913 
                     */
                    $sql = <<<EOD
DELETE FROM NO_DED_NOLEY WHERE id_periodo = $id_periodo and id_concep_nomina = $id_concep_nomina 
EOD;
                    $this->conn->execute($sql);

                    /**
                     * Borrar registros NO_CONCEPTO_PERIODO en el periodo por carge masivo - 20130913 
                     */
                    $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO WHERE periodo = $id_periodo and id_concep_nomina = $id_concep_nomina  
EOD;
                    $this->conn->execute($sql);
                }


                /*
                 * RECORRO LA TABLA TEMPORAL 
                 */
                $sql = <<<EOD
select 
wm_concat( case when dat.num_doc is null then imp.num_doc else null end ) as num_doc_res
--imp.num_doc,
--dat.num_doc as num_doc_dat
from no_imp_deduc_t imp
left join no_estado_retirado_v ret
on ret.num_doc = imp.num_doc 
left join no_datos_funcionario_v dat
on imp.num_doc = dat.num_doc
where 
ret.id_estado_func is null 
or 
ret.id_anhos ||  lpad(ret.id_meses,2,'0')  >= (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = $id_periodo)
EOD;
                $records = CN_TABLE::executeSQL($sql);
                $num_doc_res = $records[0]['num_doc_res'];

                if ($num_doc_res == null) {
                    
                    /**
                     * Se toma el id_tipo_doc segun el ultimo nombramiento segun el documento - 20181018
                     */
                    $sql = <<<EOD
select distinct
imp.*,
nvl(nom.id_tipo_doc,1) as id_tipo_doc
                            
from no_imp_deduc_t imp
                            
left join no_estado_retirado_v ret
on ret.num_doc = imp.num_doc 

left join no_nombramiento_v nom
on nom.num_doc = imp.num_doc 
                            
where 
ret.id_estado_func is null 
or 
ret.id_anhos ||  lpad(ret.id_meses,2,'0')  >= (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = $id_periodo)
EOD;
                    $records = CN_TABLE::executeSQL($sql);

                    $cant = count($records);

                    foreach ($records as $records) {

                        /*
                         * Datos del archivo
                         * El id_concep_nomina de toma de la tabla no_imp_deduc_t - 20130911
                         */
                        $num_doc = $records['num_doc'];
                        $id_tipo_doc = $records['id_tipo_doc'];
                        $id_concep_nomina = $records['id_concep_nomina'];
                        $valor = $records['valor'];

                        /**
                         * Tomar los dias, anho, mes del periodo por el tipo periodo
                         */
                        $sql = <<<EOD
SELECT * FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo 
EOD;
                        $results = CN_TABLE::executeSQL($sql);

                        $id_anhos = $results[0]['id_anhos'];
                        $id_meses = $results[0]['id_meses'];
                        $id_periodo = $results[0]['id_periodo'];
                        $id_tipo_periodo = $results[0]['id_tipo_periodo'];

                        $sql = <<<EOD
SELECT * FROM NO_TIPO_PERIODO WHERE ID_TIPO_PERIODO = $id_tipo_periodo 
EOD;
                        $results = CN_TABLE::executeSQL($sql);

                        $num_dias = $results[0]['no_dias_mes'];


                        /**
                         * Se coloca en estado 0 los registros anteriores para el concepto - 20130913
                         */
                        $sql = <<<EOD
UPDATE NO_DED_NOLEY set estado = 0, fecha_anu = trunc(sysdate), motivo_anu = 'Se inactiva registro por carga de archivo'
    WHERE id_periodo != $id_periodo and estado = 1 
    and id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and id_concep_nomina = $id_concep_nomina     
EOD;
                        $this->conn->execute($sql);


                        /**
                         * Validar que no exista el registro
                         */
                        $sql = <<<EOD
SELECT * FROM NO_DED_NOLEY WHERE id_periodo = $id_periodo
    and id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and id_concep_nomina = $id_concep_nomina 
EOD;
                        $records_ver = CN_TABLE::executeSQL($sql);

                        /*
                         * Verifica que exista registro
                         */
                        if (count($records_ver) <= 0) {//Crea nuevos registros
                            $sql = <<<EOD
INSERT INTO NO_DED_NOLEY (ID_PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,NUM_CUOTAS,CUOTAS_DESC,VALOR_CUOTA,SALDO,FECHA_CREA,
    FECHA_MOD,ID_PERIODO_INI,ID_PERIODO_FIN,ID_MAE_TER,ESTADO)
    VALUES($id_periodo,$id_tipo_doc,$num_doc,$id_concep_nomina,1,0,$valor,$valor,sysdate,sysdate,$id_periodo,$id_periodo,
        (select id_acreedor from no_concep_nomina where id_concep_nomina = $id_concep_nomina),1) 
EOD;
                            $this->conn->execute($sql);


                            $sql = <<<EOD
INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,VALOR,NUM_DIAS)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,$id_concep_nomina,to_date( '01' || to_char(sysdate,'mm/yyyy') , 'dd/mm/yyyy'),last_day(to_date(sysdate)),$valor,$num_dias)
EOD;
                            $this->conn->execute($sql);
                        } else {//Actualiza registros
                            $sql = <<<EOD
UPDATE NO_DED_NOLEY set valor_cuota = $valor, saldo = $valor 
    WHERE id_periodo = $id_periodo
    and id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and id_concep_nomina = $id_concep_nomina     
EOD;
                            $this->conn->execute($sql);


                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set valor = $valor, fecha_desde = to_date( '01' || to_char(sysdate,'mm/yyyy') , 'dd/mm/yyyy'), fecha_hasta = last_day(to_date(sysdate))
    WHERE periodo = $id_periodo
    and id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and id_concep_nomina = $id_concep_nomina
EOD;
                            $this->conn->execute($sql);
                        }
                    }
                } else {
                    $val_num_doc_res = false;

                    $this->status = 1;
                    $this->list_data = array();
                    $mensaje = "Los documentos de algunos funcionarios no corresponden: " . $num_doc_res;
                    $this->mensajeError = $mensaje;
                    $this->logMessage($mensaje);
                }
            }

            //TRAE LOS REGISTROS

            /*
             * Paginacion
             */
            if (isset($request['_startRow'])) {
                $rowStart = $request['_startRow'];
            } else {
                $rowStart = 0;
            }

            if (isset($request['_endRow'])) {
                $rowEnd = $request['_endRow'];
            } else {
                $rowEnd = 75;
            }

            //sentencia sql
            $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;
            //ejecuta y obtiene el resultado del sql
            CN_TABLE::executeSQL($sql);

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
            $sql = <<<EOD
select count(*) as count from (

select * from NO_IMP_DEDUC_T 

)
EOD;


            $total_record_count = CN_TABLE::executeSQL($sql);
            $total_record_count = $total_record_count[0]["count"];


            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
    
select tab0.*, tab1.codigo AS CONCEPTO, tab2.nombre_apellido AS NOMBRE , tab3.num_doc||' - '||tab3.razon_soc AS ACREEDOR

from NO_IMP_DEDUC_T tab0

left join no_concep_nomina tab1 ON tab1.id_concep_nomina = tab0.id_concep_nomina

left join no_datos_funcionario_v tab2 ON tab2.num_doc = tab0.num_doc

left join interceros_v tab3 ON tab3.id_mae_ter = tab1.id_acreedor

order by tab0.num_doc, tab1.codigo
          
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;

            $records = CN_TABLE::executeSQL($sql);

            //Ejecuta sql
            $this->totalRows = $total_record_count;
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($records);
            $this->list_data = $records;

            $this->conn->commit();

            /*
             * Valida num_doc si estan correctos - 20140513
             */
            if ($val_num_doc_res) {
                $this->logMessage("Cant: " . $cant . " CantReal: " . $cant_real);
                if ($cant <> $cant_real) {
                    $this->status = 2;
                    $mensaje = "Se cargo archivo y se omitieron registros de funcionarios retirados.";
                    $this->mensajeError = $mensaje;
                }
            }
        } catch (Exception $e) {
            //Se agrega linea de error - 20160628
            $mensaje = "No se pudo Cargar Archivo. Revisar Formato, linea: " . $linea;
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array();
            $this->logMessage($mensaje);
            $this->logMessage($e->getMessage());
        }
    }

}
