<?php

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

    /**
     * Metodo que inserta registros del CSV a la tabla ca_imp_debito_t
     *
     * @param sfRequest $request A request object
     */
    public function executeUpdate(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_punto_venta = $request['punto_venta_log'];
        $id_username = $request['id_username'];
        $username = $request['username'];

        $id_tipo_credito = $request['id_tipo_credito'];
        $id_con_credito = $request['id_con_credito'];
        $id_tip_mon = $request['id_tip_mon'];
        $id_ts_td = $request['id_ts_td'];

        $id_bn = 'null';
        if (isset($request['id_bn'])) {
            $id_bn = $request['id_bn'];
        }
        $id_cb = 'null';
        if (isset($request['id_cb'])) {
            $id_cb = $request['id_cb'];
        }
        $oficina = 'null';
        if (isset($request['oficina'])) {
            $oficina = "'" . $request['oficina'] . "'";
        }

        $archivo = $request['file_name'];

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

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

        //Se borra tabla de carga, siempre antes de iniciar el proceso - 20170510
        $sql = <<<EOD
TRUNCATE TABLE ca_imp_credito_t    
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 = 0;
        try {

            //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);

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

            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) {
                        $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;

                        if (isset($datos['FECHA_PROCESO']) && isset($datos['IDENTIFICACION']) && isset($datos['NUM_DOC']) && isset($datos['VALOR_TOTAL_CRE']) &&
                                isset($datos['OBSERVACIONES_CRED']) && isset($datos['FECHA_OBLIGACION']) && isset($datos['NO_CREDITO']) &&
                                isset($datos['SEC_DEBITO']) && isset($datos['ID_TIPO_DEBITO']) && isset($datos['ID_ANHOS']) && isset($datos['VALOR_BRUTO']) &&
                                isset($datos['VALOR_RETENCIONES']) && isset($datos['VALOR_ABONO']) && isset($datos['OBSERVACIONES'])
                        ) {

                            $tag_cabecera = false;

                            $this->logMessage("-----------entre aca----------");

                            $fecha_proceso = $datos['FECHA_PROCESO'];
                            $identificacion = $datos['IDENTIFICACION'];
                            $num_doc = $datos['NUM_DOC'];
                            $valor_total_cre = str_replace(',', '.', $datos['VALOR_TOTAL_CRE']);
                            $observaciones_cred = $datos['OBSERVACIONES_CRED'];
                            $fecha_obligacion = $datos['FECHA_OBLIGACION'];
                            $no_credito = $datos['NO_CREDITO'];
                            $sec_debito = $datos['SEC_DEBITO'];
                            $id_tipo_debito_txt = $id_tipo_debito = $datos['ID_TIPO_DEBITO'];
                            $id_anhos = $datos['ID_ANHOS'];
                            $valor_bruto = str_replace(',', '.', $datos['VALOR_BRUTO']);
                            $valor_retenciones = str_replace(',', '.', $datos['VALOR_RETENCIONES']);
                            $valor_abono = str_replace(',', '.', $datos['VALOR_ABONO']);
                            $observaciones = $datos['OBSERVACIONES'];


                            $observaciones_cred = str_replace('\'', ' ', $observaciones_cred);
                            if ($observaciones == "") {
                                $observaciones = $observaciones_cred;
                            }

                            //VERIFICAR CAMPOS OBLIGATORIOS
                            if ($fecha_proceso != "" && $identificacion != "" && $num_doc != "" && $valor_total_cre != "" && $observaciones_cred != "" && $no_credito != "" && $sec_debito != "" && $id_tipo_debito != "" && $id_anhos != "" && $valor_bruto != "" && $valor_retenciones != "" && $valor_abono != "") {

                                $sql = <<<EOD
select 
* 
from ca_credito
where 
id_anhos = to_char(to_date('$fecha_proceso','DD/MM/YYYY'), 'yyyy' )
and estado = 1
and num_doc = '$num_doc' 
EOD;
                                $sql_num_doc = CN_TABLE::executeSQL($sql);

                                //Validar num_doc para año y estado activo
                                if (count($sql_num_doc) == 0) {


                                    $sql = <<<EOD
select * from ca_tipo_debito
where desc_corta = '$id_tipo_debito'
EOD;
                                    $sql_tipo_deb = CN_TABLE::executeSQL($sql);

                                    //Validar tipo de debito
                                    if (count($sql_tipo_deb) > 0) {

                                        $id_tipo_debito = $sql_tipo_deb[0]['id_tipo_debito'];

                                        $sql = <<<EOD
select 
vence.*,
deb.id_mae_ter,
ter.num_doc as tercero
from ca_vencimientos_saldo vence
join ca_debito deb
on vence.id_debito = deb.id_debito
join interceros ter
on ter.id_mae_ter = deb.id_mae_ter
where 
deb.id_anhos = $id_anhos
and deb.id_tipo_debito = $id_tipo_debito
and deb.sec_debito = $sec_debito 
and deb.estado = 1 
EOD;
                                        $sql_debito_vence = CN_TABLE::executeSQL($sql);

                                        $saldo_vence = 0;
                                        if (count($sql_debito_vence) > 0) {
                                            $saldo_vence = $sql_debito_vence[0]['saldo_vence'];
                                            $tercero = $sql_debito_vence[0]['tercero'];
                                        }

                                        //Validar debito y valor del vencimiento
                                        if (count($sql_debito_vence) > 0 && $valor_abono <= $saldo_vence && $identificacion == $tercero && $valor_abono > 0) {

                                            $id_vencimiento = $sql_debito_vence[0]['id_vencimiento'];

                                            $sql = <<<EOD
Insert into CA_IMP_CREDITO_T (ID_IMP_CREDITO_T,ID_PUNTO_VENTA,ID_TIPO_CREDITO,ID_CON_CREDITO,IDENTIFICACION,FECHA_PROCESO,ID_BN,ID_CB,NUM_DOC,OFICINA,
    VALOR,OBSERVACIONES_CRED,FECHA_OBLIGACION,ID_TS_TD,USUARIOLOG,NO_CREDITO,SEC_DEBITO,ID_TIPO_DEBITO,ID_ANHOS,
        VALOR_BRUTO,VALOR_RETENCIONES,VALOR_ABONO,ID_TIP_MON,VALOR_TOTAL_MONEDA,OBSERVACIONES,ID_CREDITO,ID_CREDITO_DETALLE,ID_VENCIMIENTO) 
values ('$fila_i',$id_punto_venta,$id_tipo_credito,$id_con_credito,'$identificacion',to_date('$fecha_proceso','DD/MM/YYYY'),$id_bn,$id_cb,'$num_doc',$oficina,
    '$valor_total_cre','$observaciones_cred',to_date('$fecha_obligacion','DD/MM/YYYY'),$id_ts_td,'$username',$no_credito,$sec_debito,$id_tipo_debito,$id_anhos,
        '$valor_bruto','$valor_retenciones','$valor_abono',$id_tip_mon,0,'$observaciones',null,null,$id_vencimiento) 
EOD;

                                            $this->conn->execute($sql);
                                        } else {
                                            $this->logMessage("-----------EL DEBITO NO EXISTE O EL VALOR NO CORRESPONDE SEC: $id_tipo_debito_txt.$sec_debito de $id_anhos----------");
                                            $mensaje = "ALGUNO DE LOS DEBITOS REGISTRADOS NO SE ENCUENTRA CREADO O EL VALOR NO CORRESPONDE. FAVOR VERIFICAR SEC::" . $id_tipo_debito_txt . "." . $sec_debito . " de " . $id_anhos . " Valor Abono:" . $valor_abono . " " . " Fila: " . $fila_i;
                                            $fail = true;
                                        }
                                    } else {
                                        $this->logMessage("-----------EL TIPO DE DEBITO NO EXISTE TIPO: $id_tipo_debito_txt----------");
                                        $mensaje = "ALGUNO DE LOS TIPO DE DEBITO NO SE ENCUENTRA CREADO. FAVOR VERIFICAR TIPO:" . $id_tipo_debito_txt . " Fila: " . $fila_i;
                                        $fail = true;
                                    }
                                } else {
                                    $this->logMessage("-----------EL NUMERO DE DOCUMENTO YA EXISTE No: $num_doc----------");
                                    $mensaje = "ALGUNO DE LOS NUMEROS DE DOCUMENTOS REGISTRADOS YA SE ENCUENTRA CREADO. FAVOR VERIFICAR No:" . $num_doc;
                                    $fail = true;
                                }
                            } 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(;). Favor Verificar.";
                        $fail = true;
                    }
                }
            } else {
                $this->logMessage("-----------NO HAY ARCHIVO----------");
                $mensaje = "El archivo no existe. Favor Verificar.";
                $fail = true;
            }


            if (!$fail) {

                $this->conn->commit();

                $this->list_data = array();
                $this->status = 0;
                //$mensaje = "Se cargo archivo.";
                $this->mensajeError = $mensaje;
            } else {

                $this->conn->rollback();
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
            }
        } catch (Exception $e) {
            $mensaje = "[Error] No se pudo Cargar Archivo. Revisar Fila: " . $fila_i . " - Caracteres extraños.";
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array();
            $this->logMessage($mensaje);
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Metodo que crea las creditos segun tabla ca_imp_credito_t
     * 
     * @param sfWebRequest $request
     */
    public function executeAdd(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;
        $tag_error = false;

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

        $id_tipo_credito = $request['id_tipo_credito'];
        $id_con_credito = $request['id_con_credito'];
        $id_tip_mon = $request['id_tip_mon'];
        $id_ts_td = $request['id_ts_td'];

        $id_bn = 'null';
        if (isset($request['id_bn'])) {
            $id_bn = $request['id_bn'];
        }
        $id_cb = 'null';
        if (isset($request['id_cb'])) {
            $id_cb = $request['id_cb'];
        }
        $oficina = 'null';
        if (isset($request['oficina'])) {
            $oficina = $request['oficina'];
        }

        $archivo = $request['file_name'];

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

        /*
         * Manejo de errores
         */
        try {

            //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);


            /*
             * Se recorre tabla ca_imp_credito_t para cargar creditos
             */
            $sql = <<<EOD
select
nvl(consec.consecutivo,0) as consecutivo,
to_char(imp.fecha_proceso, 'yyyy' ) as id_anhos,
imp.id_imp_credito_t,
imp.id_punto_venta,
imp.id_tipo_credito,
imp.id_con_credito,
imp.identificacion,
imp.fecha_proceso,
imp.id_bn,
imp.id_cb,
imp.num_doc,
imp.oficina,
imp.valor,
imp.observaciones_cred,
imp.fecha_obligacion,
imp.id_ts_td,
imp.usuariolog,
imp.no_credito,
imp.sec_debito,
imp.id_tipo_debito,
imp.valor_bruto,
imp.valor_retenciones,
imp.valor_abono,
imp.id_tip_mon,
imp.valor_total_moneda,
imp.observaciones,
imp.id_credito,
imp.id_credito_detalle,
imp.id_vencimiento,
cred.sec_credito as sec_credito,
tipmon.local,
vence.id_debito,
vence.saldo_vence

from ca_imp_credito_t imp

left join ca_credito cred
on cred.id_credito = imp.id_credito

left join ca_tip_mon tipmon
on tipmon.id_tip_mon = imp.id_tip_mon

left join ca_consecutivo_cre consec
on imp.id_punto_venta = consec.id_punto_venta
and imp.id_tipo_credito = consec.id_tipo_credito
and consec.id_anhos = to_char(imp.fecha_proceso, 'yyyy' )

left join ca_vencimientos_saldo vence
on vence.id_vencimiento = imp.id_vencimiento

order by
imp.no_credito,  
imp.id_imp_credito_t    
EOD;
            $records = CN_TABLE::executeSQL($sql);

            $id_anhos = 0;

            $tag_fila_uno = true;
            $no_credito_ini = 0;

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

                $id_anhos = $creditos['id_anhos'];
                $id_imp_credito_t = $creditos['id_imp_credito_t'];
                $id_punto_venta = $creditos['id_punto_venta'];
                $id_tipo_credito = $creditos['id_tipo_credito'];
                $id_con_credito = $creditos['id_con_credito'];
                $identificacion = $creditos['identificacion'];
                $fecha_proceso = $creditos['fecha_proceso'];
                $id_bn = $creditos['id_bn'];
                $id_cb = $creditos['id_cb'];
                $num_doc = $creditos['num_doc'];
                $oficina = $creditos['oficina'];
                $valor = $creditos['valor'];
                $observaciones_cred = $creditos['observaciones_cred'];
                $fecha_obligacion = $creditos['fecha_obligacion'];
                $id_ts_td = $creditos['id_ts_td'];
                $usuariolog = $creditos['usuariolog'];
                $no_credito = $creditos['no_credito'];
                $sec_debito = $creditos['sec_debito'];
                $id_tipo_debito = $creditos['id_tipo_debito'];
                $valor_bruto = $creditos['valor_bruto'];
                $valor_retenciones = $creditos['valor_retenciones'];
                $valor_abono = $creditos['valor_abono'];
                $id_tip_mon = $creditos['id_tip_mon'];
                $valor_total_moneda = $creditos['valor_total_moneda'];
                $observaciones = $creditos['observaciones'];
                $id_vencimiento = $creditos['id_vencimiento'];
                $local = $creditos['local'];
                $id_debito = $creditos['id_debito'];
                $saldo_vence = $creditos['saldo_vence'];

                //Solo entra la primera vez, fila uno del record
                if ($tag_fila_uno) {
                    $tag_fila_uno = false;
                    $sec_credito = $creditos['consecutivo'];

                    //Si no hay consecutivo se crea uno en 0
                    if ($sec_credito == 0) {
                        $sql = <<<EOD
Insert into CA_CONSECUTIVO_CRE (ID_CONSECUTIVO_CRED,ID_TIPO_CREDITO,ID_ANHOS,ID_PUNTO_VENTA,CONSECUTIVO) 
    values (null,'$id_tipo_credito','$id_anhos','$id_punto_venta','$sec_credito')                
EOD;
                        $this->conn->execute($sql);
                    }
                }

                /*
                 * Actualizar correo si aplica para tercero
                 */
                //sentencia sql
                $sql = <<<EOD
SELECT * FROM interceros
where
num_doc = '$identificacion'
order by
estado_ter desc 
EOD;

                //ejecuta el sql
                $result = CN_TABLE::executeSQL($sql);
                if (count($result) > 0) {

                    $id_mae_ter = $result[0]['id_mae_ter']; //tercero del debito
                } else {
                    $tag_error = true;
                    throw new Exception("El tercero ($identificacion) no existe.");
                }


                /*
                 * Validar fecha de creacion, solo mes actual - Pendiente
                 */

                /*
                 * Tipo de moneda 
                 */
                if ($local == 1) {
                    $diferencia_cambio = 0;
                    $trm_credito = 1;
                } else {
                    //Pendiente cuando es otro tipo de moneda
                    $diferencia_cambio = 0;
                    $trm_credito = 0;
                }

                //Verificar consecutivo no_debito, para varios detalles de un mismo credito
                if ($no_credito_ini != $no_credito) {

                    $sec_credito += 1;
                    $no_credito_ini = $no_credito;
                    $tag_credito = true; //si se crea credito, para detalles varios
                    $this->logMessage("[cargar_creditos] La secuencia = " . $sec_credito);

                    /*
                     * Crear credito
                     */
                    $sql = <<<EOD
insert into ca_credito (id_credito,id_anhos,id_punto_venta,id_tipo_credito,sec_credito,
    id_con_credito,fecha_proceso,id_bn,id_cb,num_doc,oficina,valor,observaciones,
        estado,fecha_anu,motivo_anu,fecha,id_ts_td,usuariolog,id_mae_ter) 
values (null, $id_anhos, $id_punto_venta, $id_tipo_credito, $sec_credito,
    $id_con_credito,to_date('$fecha_proceso','yyyy-mm-dd'),'$id_bn','$id_cb','$num_doc','$oficina',$valor,'$observaciones_cred',
        1 ,null,null,to_date('$fecha_obligacion','yyyy-mm-dd'),$id_ts_td,'$username',$id_mae_ter) 
EOD;
                    //ejecuta y obtiene el resultado del sql
                    $this->conn->execute($sql);
                } else {
                    $tag_credito = false;
                }

                //Ultimo registro insertado CA_CREDITO
                $sql = <<<EOD
select * from ca_credito
where 
sec_credito = $sec_credito
and id_anhos = $id_anhos
and id_punto_venta = $id_punto_venta
and id_tipo_credito = $id_tipo_credito
EOD;
                //ejecuta y obtiene el resultado del sql
                $resultado = CN_TABLE::executeSQL($sql);


                /*
                 * Verifica que sea un registro para insertar las referencias del credito
                 * y vienen registros para las referenciass
                 */
                $id_credito_detalle = 'null';
                if (count($resultado) > 0) {

                    $id_credito = $resultado[0]['id_credito'];


                    //Registro credito detalle
                    $sql = <<<EOD
insert into ca_credito_detalle (id_credito_detalle,id_credito,id_vencimiento,valor_bruto,valor_retenciones,valor_abono,
    id_tip_mon,valor_total_moneda,trm_credito,diferencia_cambio,observaciones) 
values (null,$id_credito,$id_vencimiento, $valor_bruto, $valor_retenciones, $valor_abono,
    $id_tip_mon, $valor_total_moneda, $trm_credito, $diferencia_cambio, '$observaciones')   
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);

                    //Saldos Cartera
                    $sql = <<<EOD

update ca_saldos
set creditos_mes = creditos_mes + $valor_abono,
saldo_actual = saldo_actual - $valor_abono                            
where id_debito = $id_debito and id_vencimiento = $id_vencimiento 
and id_anhos = to_char(sysdate, 'yyyy') and id_meses=to_char(sysdate, 'mm')

EOD;

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

                    //actualizo el vencimiento
                    if (($saldo_vence - $valor_abono) <= 0) {
                        $sql = <<<EOD
update ca_vencimientos
set cancelado = 1
where id_vencimiento = $id_vencimiento  
EOD;
                        //ejecuta el sql
                        $this->conn->execute($sql);
                    }

                    $observacion = "'Se adiciono id: $id_vencimiento de un vencimiento para el detalle del id_credito $id_credito desde la funcionalidad: credito_carga por valor de $valor_abono'";
                    $this->logMessage("[cargar_creditos] " . $observacion . ".\n");

                    //Ultimo registro insertado ca_credito_detalle
                    $sql = <<<EOD
select * from ca_credito_detalle
where 
id_credito = $id_credito
and id_vencimiento = $id_vencimiento  
order by
id_credito_detalle desc                         
EOD;
                    //ejecuta y obtiene el resultado del sql
                    $resultado_det = CN_TABLE::executeSQL($sql);
                    if (count($resultado_det) > 0) {
                        $id_credito_detalle = $resultado_det[0]['id_credito_detalle'];
                    }
                }


                /**
                 * actualizas import credito
                 */
                //sentencia sql
                $sql = <<<EOD
update ca_imp_credito_t set id_credito = $id_credito, id_credito_detalle = $id_credito_detalle
where
id_imp_credito_t = $id_imp_credito_t  
EOD;
                //ejecuta el sql
                $this->conn->execute($sql);
            }

            $consecutivo = $sec_credito;
            //actualizar el consecutivo del credito
            $sql = <<<EOD
UPDATE CA_CONSECUTIVO_CRE SET CONSECUTIVO = $consecutivo 
    WHERE id_anhos = $id_anhos
    and id_tipo_credito = $id_tipo_credito               
    and id_punto_venta = $id_punto_venta                
EOD;
            $this->conn->execute($sql);


            /**
             * Recorrer todos los movimientos credito creados
             */
            $sql = <<<EOD
select distinct  
imp.no_credito, 
imp.id_credito,
imp.id_con_credito,
cred.sec_credito,
cred.valor,
(select sum(det.valor_abono) from ca_credito_detalle det where det.id_credito = imp.id_credito) as valor_det 

from ca_imp_credito_t imp
join ca_credito cred
on imp.id_credito = cred.id_credito 
EOD;

            $resultado_creditos = CN_TABLE::executeSQL($sql);
            foreach ($resultado_creditos as $value) {

                $no_credito = $value['no_credito'];
                $id_credito = $value['id_credito'];
                $sec_credito = $value['sec_credito'];
                $valor = $value['valor'];
                $valor_det = $value['valor_det'];
                $valor_exed = $valor - $valor_det;

                /**
                 * Crear excedente
                 */
                if ($valor_exed > 0) {
                    //sentencia sql
                    $sql = <<<EOD
Insert into CA_EXCEDENTES (ID_EXCEDENTE,ID_CREDITO,VALOR,EN_USO,ID_CREDITO_APLICADO,ID_NOV_DEVOL_EXCED,ID_MAE_TER) 
    values (null,'$id_credito','$valor_exed','0',null,null,null) 
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                } elseif ($valor_exed < 0) {
                    $tag_error = true;
                    throw new Exception("Los valores de los detalles del credito No. Credito.$no_credito, superan el del credito de carga.");
                }
            }

            $mensaje = "Termino Proceso Carga Credito";
            $this->conn->commit();
            $this->list_data = array();
            $this->status = 0;
            $this->mensajeError = $mensaje;

            $this->logMessage($mensaje);



            /**
             * GENERAR MOVIMIENTO BANCO - 20160211
             */
            $this->logMessage("INICIO GENERAR MOVIMIENTO BANCO");

            $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD" 
EOD;
            CN_TABLE::executeSQL($sql);

            /**
             * Recorrer todos los movimientos credito creados
             */
            $sql = <<<EOD
select distinct  
imp.id_credito,
imp.id_con_credito
                    
from ca_imp_credito_t imp
join ca_credito cred
on imp.id_credito = cred.id_credito 
EOD;

            $resultado_creditos = CN_TABLE::executeSQL($sql);
            foreach ($resultado_creditos as $value) {

                $id_credito = $value['id_credito'];
                $id_con_credito = $value['id_con_credito'];


                //Valida que aplica banco
                $sql = <<<EOD
select * from ca_con_credito
where id_con_credito = $id_con_credito
and aplica_bn = 1 
EOD;

                $resultado = CN_TABLE::executeSQL($sql);
                $aplica_banco = false;
                if (count($resultado) > 0) {
                    $aplica_banco = true;
                }

                if ($aplica_banco) {
                    $this->logMessage("GENERAR MOVIMIENTO BANCO");

                    //Traer datos de la factura
                    $sql = <<<EOD
select * from ca_credito
where
id_credito = $id_credito 
EOD;

                    $resultado = CN_TABLE::executeSQL($sql);
                    if (count($resultado) > 0) {
                        $id_credito = $resultado[0]['id_credito'];
                        $id_anhos = $resultado[0]['id_anhos'];
                        $id_punto_venta = $resultado[0]['id_punto_venta'];
                        $id_tipo_credito = $resultado[0]['id_tipo_credito'];
                        $sec_credito = $resultado[0]['sec_credito'];
                        $id_con_credito = $resultado[0]['id_con_credito'];
                        $fecha_proceso = $resultado[0]['fecha_proceso'];
                        $id_bn = $resultado[0]['id_bn'];
                        $id_cb = $resultado[0]['id_cb'];
                        $num_doc = $resultado[0]['num_doc'];
                        $oficina = $resultado[0]['oficina'];
                        $valor = $resultado[0]['valor'];
                        $fecha = $resultado[0]['fecha'];
                        $id_ts_td = $resultado[0]['id_ts_td'];
                        $id_mae_ter = $resultado[0]['id_mae_ter'];
                    }

                    //Se trae de la configuracipon la url que se ha establecido para las interfaces contables
                    $arrayAtrib = array();

                    $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

                    $int = 0;
                    foreach ($array as $routeName => $routeData) {
                        if ('service_url' == $routeName) {
                            foreach ($routeData as $key => $value) {
                                if ($key == 'value') {
                                    $service_url = $value;
                                }
                            }
                        }
                        $int++;
                    }
                    $url = $service_url;
                    $url = $url . 'movimiento_banco/list.json?id_mod=12&username=websafi&nitocc=800189921&id_username=946';

                    //variables del credito
                    $url = $url . '&id_credito=' . $id_credito;
                    $url = $url . '&id_anhos=' . $id_anhos;
                    $url = $url . '&id_punto_venta=' . $id_punto_venta;
                    $url = $url . '&id_tipo_credito=' . $id_tipo_credito;
                    $url = $url . '&sec_credito=' . $sec_credito;
                    $url = $url . '&id_con_credito=' . $id_con_credito;
                    $url = $url . '&fecha_proceso=' . $fecha_proceso;
                    $url = $url . '&id_bn=' . $id_bn;
                    $url = $url . '&id_cb=' . $id_cb;
                    $url = $url . '&num_doc=' . $num_doc;
                    $url = $url . '&oficina=' . $oficina;
                    $url = $url . '&valor=' . $valor;
                    $url = $url . '&fecha=' . $fecha;
                    $url = $url . '&id_ts_td=' . $id_ts_td;
                    $url = $url . '&id_mae_ter=' . $id_mae_ter;
                    $url = $url . '&tag_portal_web=1'; //facturas portal web - validar el retorno del json - 20160512

                    $ch = curl_init($url);

                    //Parametros de retorno en cURL
                    curl_setopt($ch, CURLOPT_HEADER, 0);
                    $rta = curl_exec($ch);
                    curl_close($ch);

                    $arrayRespuesta = json_decode($rta, true);
                    //Verifica el status, si es diferente de 0, ocurrio un error al subir la interfaz y debe reportarlo
                    if ($arrayRespuesta['response']['status'] == 1) {
                        $mensajeError = "Error :: Al generar el movimiento de bancos, se debe anular la factura.";
                        $this->status = 1;
                        $this->list_data = array();
                        $this->mensajeError = $mensajeError;
                        $this->logMessage("[cargar_creditos] " . $mensajeError);
                    } else {
                        $this->logMessage("[cargar_creditos] Genero movimiento de bancos.");
                    }
                } else {
                    $this->logMessage("[cargar_creditos] No aplica bancos.");
                }
            }
            /**
             * FIN MOVBANC
             */
            /**
             * Llamado INTERFAZ CONTABLE - 20190816
             */
            $this->logMessage("INICIO INTERFAZ CONTABLE CREDITO");

            //Se trae de la configuracion la url que se ha establecido para las interfaces contables
            $arrayAtrib = array();

            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

            $int = 0;
            foreach ($array as $routeName => $routeData) {
                if ('service_url' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        if ($key == 'value') {
                            $service_url = $value;
                        }
                    }
                }
                $int++;
            }
            $url = $service_url;
            $url = $url . 'ejecutaInterfacesContables/list.json?id_mod=11&username=websafi&nitocc=800189921&id_username=946';
            //variables del credito
            //$fecha_proceso = $fecha_sistema;
            $id_mae_ter = 946;
            $mov_ejecutado = "Notas-.-Credito";
            $url = $url . '&fecha_proceso=' . $fecha_proceso;
            $url = $url . '&id_mae_ter=' . $id_mae_ter;
            $url = $url . '&mov_ejecutado=' . $mov_ejecutado;
            $url = $url . '&id_movimiento=' . -1; //NUMERO PRA EJECUTAR INTERFAZ ID_TRANSACCION 420 Y 119 - 20190816
            $url = $url . '&tag_portal_web=1'; //facturas portal web - validar el retorno del json

            $ch = curl_init($url);

            //Parametros de retorno en cURL
            curl_setopt($ch, CURLOPT_HEADER, 0);
            $rta = curl_exec($ch);
            curl_close($ch);

            $arrayRespuesta = json_decode($rta, true);
            //Verifica el status, si es diferente de 0, ocurrio un error al subir la interfaz y debe reportarlo
            if ($arrayRespuesta['response']['status'] == 1) {
                $mensajeError = "Error :: Al generar la interfaz contable.";
                $this->status = 1;
                $this->list_data = array();
                $this->mensajeError = $mensajeError;
                $this->logMessage("[CARGAR_CREDITOS] " . $mensajeError);
            } else {
                $this->logMessage("[CARGAR_CREDITOS] Genero interfaz contable.");
            }

            $this->logMessage("FIN INTERFAZ CONTABLE CREDITO");
        } catch (Exception $e) {

            if ($tag_error) {
                $mensaje = $e->getMessage();
            } else {
                $mensaje = "[ERROR] No se pudo Cargar Registros del Archivo. Revisar Formato.";
            }

            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array();
            $this->logMessage($mensaje);
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Executes list 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");


        //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);

        //TRAE LOS REGISTROS

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

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

        //ordenar consulta
        if (isset($request['_sortBy'])) {
            $sortBy = " Order by " . $request['_sortBy'];
        } else {
            $sortBy = 'order by no_credito, identificacion';
        }


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

select
tab0.id_imp_credito_t,
tab0.id_punto_venta,
tab0.id_tipo_credito,
tab0.id_con_credito,
tab0.identificacion,
tab0.fecha_proceso,
tab0.id_bn,
tab0.id_cb,
tab0.num_doc,
tab0.oficina,
tab0.valor,
tab0.observaciones_cred,
tab0.fecha_obligacion,
tab0.id_ts_td,
tab0.usuariolog,
tab0.no_credito,
tab0.sec_debito,
tab0.id_tipo_debito,
tab0.valor_bruto,
tab0.valor_retenciones,
tab0.valor_abono,
tab0.id_tip_mon,
tab0.valor_total_moneda,
tab0.observaciones,
tab0.id_credito,
tab0.id_credito_detalle,
cred.sec_credito as sec_credito

from ca_imp_credito_t tab0

left join ca_credito cred
on cred.id_credito = tab0.id_credito         

)
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.id_imp_credito_t,
tab0.id_punto_venta,
tab0.id_tipo_credito,
tab0.id_con_credito,
tab0.identificacion,
tab0.fecha_proceso,
tab0.id_bn,
tab0.id_cb,
tab0.num_doc,
tab0.oficina,
tab0.valor,
tab0.observaciones_cred,
tab0.fecha_obligacion,
tab0.id_ts_td,
tab0.usuariolog,
tab0.no_credito,
tab0.sec_debito,
tab0.id_tipo_debito,
tab0.valor_bruto,
tab0.valor_retenciones,
tab0.valor_abono,
tab0.id_tip_mon,
tab0.valor_total_moneda,
tab0.observaciones,
tab0.id_credito,
tab0.id_credito_detalle,
cred.sec_credito as sec_credito

from ca_imp_credito_t tab0

left join ca_credito cred
on cred.id_credito = tab0.id_credito

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

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

        $mensaje = "Proceso Terminado";

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

}
