<?php

/**
 * cargar_novedades actions.
 *
 * @package    cartera
 * @subpackage cargar_novedades
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class cargar_novedadesActions 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");

        $fail = false;

        $id_username = $request['id_username'];
        $username = $request['username'];

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


        //tag para accion_filtro solo para crear, no para filtrar
        if (isset($request['accion_filtro'])) {

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

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

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

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


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


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

            //Crear registros
            if (isset($request['accion_filtro'])) {

                $archivo = $request['file_name'];

                //Mensaje de error diferentes columnas cabecera y fila - 20160801
                $tag_dif_cant = true;

                /**
                 * Carga de achivo
                 */
                $this->logMessage("-----------CARGA DE 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----------");
                        //$this->logMessage("-----------$row----------");

                        if (!$header) {
                            $header = $row;
                        } else {
                            if (count($row) == count($header)) {
                                $data[] = array_combine($header, $row);
                            } else {
                                $row_cant = count($row);
                                $tag_dif_cant = false;
                            }
                        }
                    }

                    if (count($data) > 0) {

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


                        //LLENO LA TABLA TEMPORAL
                        $tag_cabecera = true;
                        foreach ($data as $datos) {

                            $fila_i = $fila_i + 1;

                            //TIPO_NOVEDAD;DOCUMENTO;TIPO_DOCUMENTO;FECHA_NOVEDAD;OBSERVACIONES;VIGENCIA;SEC_DEBITO;TIPO_DEBITO
                            if (isset($datos['TIPO_NOVEDAD']) && isset($datos['DOCUMENTO']) && isset($datos['TIPO_DOCUMENTO']) && isset($datos['FECHA_NOVEDAD']) &&
                                    isset($datos['VIGENCIA']) && isset($datos['SEC_DEBITO']) && isset($datos['TIPO_DEBITO'])
                            ) {

                                $tag_cabecera = false;

                                $this->logMessage("-----------Entre validacion campos----------");

                                $tipo_novedad = $datos['TIPO_NOVEDAD'];
                                $documento = $datos['DOCUMENTO'];
                                $tipo_documento = $datos['TIPO_DOCUMENTO'];
                                $fecha_novedad = $datos['FECHA_NOVEDAD'];
                                $observaciones = $datos['OBSERVACIONES'];
                                $observaciones = str_replace('\'', ' ', $observaciones);
                                $vigencia = $datos['VIGENCIA'];
                                $sec_debito = $datos['SEC_DEBITO'];
                                $tipo_debito = $datos['TIPO_DEBITO'];

                                //VERIFICAR CAMPOS OBLIGATORIOS
                                if ($tipo_novedad != "" && $documento != "" && $tipo_documento != "" && $vigencia != "" && $sec_debito != "" && $tipo_debito != "") {

                                    //Verifica tipo_novedad
                                    $sql = <<<EOD
select 
* 
from ca_tipo_novedad
where
desc_corta = '$tipo_novedad' 
EOD;
                                    $tipnov_sql = CN_TABLE::executeSQL($sql);


                                    //Verifica tipo documento
                                    $sql = <<<EOD
select 
* 
from ts_td
where
documento = '$tipo_documento' 
EOD;
                                    $tipdoc_sql = CN_TABLE::executeSQL($sql);


                                    //Verifica debito
                                    $sql = <<<EOD
select 
* 
from ca_debito_vencimientos
where
id_anhos = $vigencia
and sec_debito = $sec_debito
and desc_corta_tipdeb = '$tipo_debito'
and estado = 1 
EOD;
                                    $debito_sql = CN_TABLE::executeSQL($sql);



                                    if (count($tipnov_sql) > 0) {
                                        if (count($tipdoc_sql) > 0) {
                                            if (count($debito_sql) > 0) {

                                                $id_tipo_novedad = $tipnov_sql[0]['id_tipo_novedad'];
                                                $id_ts_td = $tipdoc_sql[0]['id'];
                                                $id_debito = $debito_sql[0]['id_debito'];
                                                $id_vencimiento = $debito_sql[0]['id_vencimiento'];
                                                $saldo = $debito_sql[0]['valor'];


                                                /**
                                                 * Insertar registro tabla CA_IMP_NOVEDAD_CARTERA
                                                 */
                                                $sql = <<<EOD
Insert into CA_IMP_NOVEDAD_CARTERA (ID_IMP_NOVEDAD_CARTERA,ID_TIPO_NOVEDAD,NUM_DOC,ID_TS_TD,FECHA_NOVEDAD,
    OBSERVACIONES,ID_VENCIMIENTO,ID_DEBITO,SALDO,USUARIOLOG,FECHA_LOG) 
values (null,'$id_tipo_novedad','$documento','$id_ts_td',to_date('$fecha_novedad','DD/MM/YYYY'),
    '$observaciones','$id_vencimiento','$id_debito',nvl('$saldo',0),'$username',sysdate)   
EOD;

                                                $this->conn->execute($sql);
                                            } else {
                                                $this->logMessage("----------- EL DEBITO NO EXISTE CODIGO-VIGENCIA: $sec_debito-$vigencia ----------");
                                                $mensaje = "EL DEBITO NO SE ENCUENTRA CREADO. FAVOR VERIFICAR CODIGO-VIGENCIA:" . $sec_debito . "-" . $vigencia;
                                                $fail = true;
                                                break;
                                            }
                                        } else {
                                            $this->logMessage("----------- EL TIPO DE DOCUMENTO NO EXISTE CODIGO: $tipo_documento ----------");
                                            $mensaje = "EL TIPO DE DOCUMENTO NO SE ENCUENTRA CREADO. FAVOR VERIFICAR CODIGO:" . $tipo_documento;
                                            $fail = true;
                                            break;
                                        }
                                    } else {
                                        $this->logMessage("----------- EL TIPO DE NOVEDAD NO EXISTE CODIGO: $tipo_novedad ----------");
                                        $mensaje = "EL TIPO DE NOVEDAD NO SE ENCUENTRA CREADO. FAVOR VERIFICAR CODIGO:" . $tipo_novedad;
                                        $fail = true;
                                        break;
                                    }
                                } else {

                                    $this->logMessage("-----------NO TIENE DATOS----------");
                                    $mensaje = "Datos Incompletos. Favor Verificar Fila: " . $fila_i;
                                    $fail = true;
                                }
                            } else {

                                $this->logMessage("-----------NO TIENE DATOS/CABECERA----------");
                                //Si no estan todos los datos, aun vacios, el problema es de la cabera o la fila correspondiente - 20160607
                                if ($tag_cabecera) {
                                    $mensaje = "No se pudo Cargar el archivo. Revisar Formato de Cabecera, verificar espacios y contenido.";
                                } else {
                                    $mensaje = "No se pudo Cargar el archivo. Revisar datos de la Fila: " . $fila_i;
                                }
                                $fail = true;
                            }
                        }
                    } else {

                        if ($tag_dif_cant) {
                            $this->logMessage("-----------NO TIENE DATOS----------");
                            $mensaje = "El archivo esta vacio. Favor Verificar.";
                            $fail = true;
                        } else {
                            $this->logMessage("-----------CANTIDAD DE ELEMENTOS DIFERENTES CABECERA(" . count($header) . ")/FILA(" . $row_cant . ")----------");
                            $mensaje = "La cantidad de elementos de la cabecera no corresponde a la de las filas, revisar separador($delimiter). Favor Verificar.";
                            $fail = true;
                        }
                    }
                } else {
                    $this->logMessage("-----------NO HAY ARCHIVO----------");
                    $mensaje = "El archivo no existe. Favor Verificar.";
                    $fail = true;
                }

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


                /**
                 * Carga de registros
                 */
                $this->logMessage("-----------CARGA DE REGISTROS----------");
                if (!$fail) {/*
                 * Se recorre tabla ca_imp_debito_t para cargar debitos
                 */
                    $sql = <<<EOD
select

initcap_sofhouse(initcap( to_char(sysdate, 'month dd "de" YYYY' ,'nls_date_language=spanish') )) as fecha_obs,

nov.id_imp_novedad_cartera,
nov.id_tipo_novedad,
nov.num_doc,
nov.id_ts_td,
nov.fecha_novedad,
nov.observaciones,
nov.id_vencimiento,
nov.id_debito,
nov.saldo,
nov.usuariolog,
nov.fecha_log,

tip.desc_corta,
tip.descripcion,
td.desccorta,
td.descripcion as descripcion_td,
td.documento as documento_td,
deb.id_anhos,
deb.sec_debito,
deb.fecha_proceso,
ven.valor,
tipdeb.desc_corta as desc_corta_tipdeb

from ca_imp_novedad_cartera nov

left join ca_tipo_novedad tip
on tip.id_tipo_novedad = nov.id_tipo_novedad

left join ts_td td
on nov.id_ts_td = td.id

left join ca_debito deb
on deb.id_debito = nov.id_debito

left join ca_tipo_debito tipdeb
on tipdeb.id_tipo_debito = deb.id_tipo_debito

left join ca_vencimientos ven
on ven.id_debito = nov.id_debito
and ven.id_vencimiento = nov.id_vencimiento

order by
deb.id_anhos,
deb.sec_debito,
tip.desc_corta     
EOD;
                    $records = CN_TABLE::executeSQL($sql);

                    $tag_fila_uno = true;


                    //for de los registros
                    foreach ($records as $registros) {

                        $id_tipo_novedad = $registros['id_tipo_novedad'];
                        $descripcion = $registros['descripcion'];
                        $num_doc = $registros['num_doc'];
                        $id_ts_td = $registros['id_ts_td'];
                        $fecha_novedad = $registros['fecha_novedad'];
                        $observaciones = $registros['observaciones'];
                        $id_vencimiento = $registros['id_vencimiento'];
                        $id_debito = $registros['id_debito'];
                        $saldo = $registros['saldo'];
                        $usuariolog = $registros['usuariolog'];
                        $fecha_obs = $registros['fecha_obs'];


                        /*
                         * Crear registro
                         */
                        $sql = <<<EOD
Insert into CA_NOVEDAD_CARTERA (ID_NOVEDAD_CARTERA,ID_TIPO_NOVEDAD,NUM_DOC,ID_TS_TD,FECHA_NOVEDAD,
    OBSERVACIONES,ABIERTO,ANULADO,FECHA_CE,MOTIVO_CE,ID_VENCIMIENTO,ID_DEBITO,SALDO,USUARIOLOG,FECHA_LOG) 
values (null,'$id_tipo_novedad','$num_doc','$id_ts_td',to_date('$fecha_novedad','DD/MM/YYYY'),
    nvl('$observaciones','Novedad de $descripcion con fecha $fecha_obs'),'1','0',null,null,'$id_vencimiento','$id_debito','$saldo','$usuariolog',sysdate)
EOD;
                        //ejecuta y obtiene el resultado del sql
                        $this->conn->execute($sql);
                    }
                }
            }


            if (!$fail) {

                $this->logMessage("-----------Commit----------");
                $this->conn->commit();

                //TRAE LOS REGISTROS
                //ordenar consulta
                if (isset($request['_sortBy'])) {
                    $sortBy = " Order by " . $request['_sortBy'];
                } else {
                    $sortBy = 'order by
deb.id_anhos,
deb.sec_debito,
tip.desc_corta';
                }

                /*
                 * 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

nov.id_imp_novedad_cartera,
nov.id_tipo_novedad,
nov.num_doc,
nov.id_ts_td,
nov.fecha_novedad,
nov.observaciones,
nov.id_vencimiento,
nov.id_debito,
nov.saldo,
nov.usuariolog,
nov.fecha_log,

tip.desc_corta,
tip.descripcion,
td.desccorta,
td.descripcion as descripcion_td,
td.documento as documento_td,
deb.id_anhos,
deb.sec_debito,
deb.fecha_proceso,
ven.valor,
tipdeb.desc_corta as desc_corta_tipdeb

from ca_imp_novedad_cartera nov

left join ca_tipo_novedad tip
on tip.id_tipo_novedad = nov.id_tipo_novedad

left join ts_td td
on nov.id_ts_td = td.id

left join ca_debito deb
on deb.id_debito = nov.id_debito

left join ca_tipo_debito tipdeb
on tipdeb.id_tipo_debito = deb.id_tipo_debito

left join ca_vencimientos ven
on ven.id_debito = nov.id_debito
and ven.id_vencimiento = nov.id_vencimiento

)
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

nov.id_imp_novedad_cartera,
nov.id_tipo_novedad,
nov.num_doc,
nov.id_ts_td,
nov.fecha_novedad,
nov.observaciones,
nov.id_vencimiento,
nov.id_debito,
nov.saldo,
nov.usuariolog,
nov.fecha_log,

tip.desc_corta,
tip.descripcion,
td.desccorta,
td.descripcion as descripcion_td,
td.documento as documento_td,
deb.id_anhos,
deb.sec_debito,
deb.fecha_proceso,
ven.valor,
tipdeb.desc_corta as desc_corta_tipdeb

from ca_imp_novedad_cartera nov

left join ca_tipo_novedad tip
on tip.id_tipo_novedad = nov.id_tipo_novedad

left join ts_td td
on nov.id_ts_td = td.id

left join ca_debito deb
on deb.id_debito = nov.id_debito

left join ca_tipo_debito tipdeb
on tipdeb.id_tipo_debito = deb.id_tipo_debito

left join ca_vencimientos ven
on ven.id_debito = nov.id_debito
and ven.id_vencimiento = nov.id_vencimiento

$sortBy 
          
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;

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

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

                $this->logMessage("-----------Rollback----------");
                $this->conn->rollback();

                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {
            //Se agrega linea de error - 20160628
            $mensaje = "No se pudo Cargar Archivo. Revisar Formato, linea: " . $fila_i;
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array();
            $this->logMessage($mensaje);
            $this->logMessage($e->getMessage());
        }
    }

}
