<?php

/**
 * cargar_movimiento actions.
 *
 * @package    Sofhouse
 * @subpackage cargar_movimiento
 * @author     Software House
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class cargar_movimientoActions 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_vigencia = $request['id_vigencia'];
        $id_cad = $request['id_cad'];
        $id_documento = $request['id_documento'];
        $id_cia = $request['id_cia'];
        $id_cen_op = 0;
        $archivo = $request['file_name'];

        $mensaje = "";

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


        //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 NO_IMP_DEDUC_T temporal del proceso
             * TRUNCATE TABLE CN_IMP_MOVI_CONTAB  
             */
            $sql = <<<EOD
DELETE FROM CN_IMP_MOVI_CONTAB    
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 {

            //Crea  movimientos
            if (isset($request['accion_filtro'])) {


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

                        /**
                         * Consultar cad
                         */
                        $sql = <<<EOD
select 
* 
from cn_control_cad
where 
id_cad = $id_cad
and id_vigencia = $id_vigencia 
and id_cia = $id_cia 
EOD;
                        $cad = CN_TABLE::executeSQL($sql);

                        /**
                         * Consultar documento
                         */
                        $sql = <<<EOD
select 
* 
from cn_documento
where 
id_documento = $id_documento
and id_cad = $id_cad
and id_vigencia = $id_vigencia
and id_cia = $id_cia
EOD;
                        $documento = CN_TABLE::executeSQL($sql);


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

                            $fila_i = $fila_i + 1;

                            if (isset($datos['CUENTA']) && isset($datos['AUXILIAR']) && isset($datos['NITOCC']) && isset($datos['TERCERO']) &&
                                    isset($datos['DEBITO']) && isset($datos['CREDITO'])
                            ) {

                                $tag_cabecera = false;

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

                                $cuenta = $datos['CUENTA'];
                                $auxiliar = $datos['AUXILIAR'];
                                $nitocc = $datos['NITOCC'];
                                $tercero = $datos['TERCERO'];
                                $tercero = str_replace('\'', ' ', $tercero);
                                $debito = str_replace(',', '.', $datos['DEBITO']);
                                $credito = str_replace(',', '.', $datos['CREDITO']);

                                //VERIFICAR CAMPOS OBLIGATORIOS

                                if ($cuenta != "" && $debito != "" && $credito != "") {

                                    if (count($cad) > 0) {
                                        if (count($documento) > 0) {

                                            $id_cen_op = $cad[0]['id_cen_op'];
                                            $id_periodo_contable = $cad[0]['id_periodo_contable'];

                                            /**
                                             * Validar que el periodo no esta cerrado
                                             */
                                            $sql = <<<EOD
select 
* 
from cn_control_periodo
where
id_vigencia = $id_vigencia
and id_cia = $id_cia
and id_cen_op = $id_cen_op
and id_periodo_contable = $id_periodo_contable
and activo = 1
EOD;
                                            $periodo_sql = CN_TABLE::executeSQL($sql);

                                            if (count($periodo_sql) > 0) {


                                                /**
                                                 * Consultar cuenta
                                                 */
                                                $sql = <<<EOD
select 
* 
from cn_subc_digitos
where 
id_cia = $id_cia
and digitos = '$cuenta' 
EOD;
                                                $cuenta_sql = CN_TABLE::executeSQL($sql);

                                                if (count($cuenta_sql) > 0) {

                                                    $id_catalogo = $cuenta_sql[0]['id_catalogo'];
                                                    $id_cuenta_mayor = $cuenta_sql[0]['id_cuenta_mayor'];
                                                    $id_grupo_cuenta = $cuenta_sql[0]['id_grupo_cuenta'];
                                                    $id_clase_cuenta = $cuenta_sql[0]['id_clase_cuenta'];

                                                    /**
                                                     * Consultar auxiliar
                                                     */
                                                    $sql = <<<EOD
select 
* 
from cn_subc_digitos_aux
where 
id_cia = $id_cia
and digitos = '$cuenta' 
and cod_aux = '$auxiliar' 
EOD;
                                                    $auxiliar_sql = CN_TABLE::executeSQL($sql);

                                                    $id_auxiliar = '';
                                                    if (count($auxiliar_sql) > 0) {
                                                        $id_auxiliar = $auxiliar_sql[0]['id_auxiliar'];
                                                    } else {
                                                        $this->logMessage("----------- EL AUXILIAR CONTABLE NO EXISTE CODIGO: $cuenta-$auxiliar ----------");
                                                    }

                                                    /**
                                                     * Consultar tercero
                                                     */
                                                    $sql = <<<EOD
select 
* 
from cn_mae_ter
where 
id_cia = 1
and nitocc = '$nitocc' 
order by
activo desc 
EOD;
                                                    $tercero_sql = CN_TABLE::executeSQL($sql);

                                                    $id_mae_ter = '';
                                                    if (count($tercero_sql) > 0) {
                                                        $id_mae_ter = $tercero_sql[0]['id_mae_ter'];
                                                    } else {
                                                        $this->logMessage("----------- EL TERCERO NO EXISTE CODIGO: $nitocc-$tercero ----------");
                                                    }

                                                    /**
                                                     * Insertar registro tabla CN_IMP_MOVI_CONTAB
                                                     */
                                                    $sql = <<<EOD
Insert into CN_IMP_MOVI_CONTAB (ID_IMP_MOVI_CONTAB,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,
    ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,
        ID_MAE_TER,ID_AUXILIAR,DEBITO,CREDITO) 
values (null,'$id_documento','$id_cad','$id_vigencia','$id_cen_op','$id_cia',
    '$id_catalogo','$id_cuenta_mayor','$id_grupo_cuenta','$id_clase_cuenta',
        '$id_mae_ter','$id_auxiliar','$debito','$credito')  
EOD;

                                                    $this->conn->execute($sql);
                                                } else {
                                                    $this->logMessage("----------- LA CUENTA CONTABLE NO EXISTE CODIGO: $cuenta ----------");
                                                    $mensaje = "LA CUENTA CONTABLE NO EXISTE CODIGO:" . $cuenta;
//                                                $fail = true;
//                                                break;
                                                }
                                            } else {
                                                $this->logMessage("----------- EL PERIODO NO ESTA ACTIVO CODIGO-VIGENCIA: $id_periodo_contable-$id_vigencia ----------");
                                                $mensaje = "EL PERIODO NO ESTA ACTIVO. FAVOR VERIFICAR CODIGO-VIGENCIA:" . $id_periodo_contable . "-" . $id_vigencia;
                                                $fail = true;
                                                break;
                                            }
                                        } else {
                                            $this->logMessage("----------- EL DOCUMENTO NO EXISTE CODIGO-VIGENCIA: $documento-$id_vigencia ----------");
                                            $mensaje = "EL DOCUMENTO NO SE ENCUENTRA CREADO. FAVOR VERIFICAR CODIGO-VIGENCIA:" . $documento . "-" . $id_vigencia;
                                            $fail = true;
                                            break;
                                        }
                                    } else {
                                        $this->logMessage("----------- EL CAD NO EXISTE CODIGO-VIGENCIA: $id_cad-$id_vigencia ----------");
                                        $mensaje = "EL CAD NO SE ENCUENTRA CREADO. FAVOR VERIFICAR CODIGO-VIGENCIA:" . $id_cad . "-" . $id_vigencia;
                                        $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(;). Favor Verificar.";
                            $fail = true;
                        }
                    }
                } else {
                    $this->logMessage("-----------NO HAY ARCHIVO----------");
                    $mensaje = "El archivo no existe. Favor Verificar.";
                    $fail = true;
                }

                /**
                 * Carga de movimientos
                 */
                $this->logMessage("-----------CARGA DE MOVIMIENTOS----------");
                if (!$fail) {

                    /*
                     * Limpia tabla CN_MOVIMIENTO_CONTABLE 
                     */
                    $sql = <<<EOD
delete
from CN_MOVIMIENTO_CONTABLE
where
id_cad = $id_cad
and id_documento = $id_documento
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_cia = $id_cia      
EOD;

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


                    /*
                     * Se recorre tabla ca_imp_debito_t para cargar debitos
                     */
                    $sql = <<<EOD
select 
                        
nvl(consec.seq,0) as consecutivo,
                        
imp.id_imp_movi_contab,
imp.id_documento,
imp.id_cad,
imp.id_vigencia,
imp.id_cen_op,
imp.id_cia,
imp.id_catalogo,
imp.id_cuenta_mayor,
imp.id_grupo_cuenta,
imp.id_clase_cuenta,
imp.id_mae_ter,
imp.id_auxiliar,
imp.debito,
imp.credito,

cad.fecha_cad,
subc.digitos,
subc.nombre as cuenta,
ter.nitocc,
ter.nombre,
aux.cod_aux,
aux.nombre as auxiliar

from cn_imp_movi_contab imp

join cn_control_cad cad 
on imp.id_cad = cad.id_cad 
and imp.id_vigencia = cad.id_vigencia 
and imp.id_cen_op = cad.id_cen_op 
and imp.id_cia = cad.id_cia 

left join cn_subc_digitos subc
on subc.id_cia = imp.id_cia
and subc.id_clase_cuenta = imp.id_clase_cuenta
and subc.id_grupo_cuenta = imp.id_grupo_cuenta
and subc.id_cuenta_mayor = imp.id_cuenta_mayor
and subc.id_catalogo = imp.id_catalogo

left join cn_mae_ter ter
on ter.id_mae_ter = imp.id_mae_ter

left join cn_auxiliar aux
on imp.id_auxiliar = aux.id_auxiliar

left join cn_table_vig_seq consec
on imp.id_vigencia = consec.id_vigencia
and imp.id_cia = consec.id_cia
and consec.nom_entidad = 'CN_MOVIMIENTO_CONTABLE'

order by
imp.id_cad,
imp.id_documento, 
imp.id_imp_movi_contab    
EOD;
                    $records = CN_TABLE::executeSQL($sql);

                    $tag_fila_uno = true;
                    $id_vigencia = 0;
                    $id_cia = 0;
                    $id_mov_cont = 0;

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

                        $id_documento = $movimientos['id_documento'];
                        $id_cad = $movimientos['id_cad'];
                        $id_vigencia = $movimientos['id_vigencia'];
                        $id_cen_op = $movimientos['id_cen_op'];
                        $id_cia = $movimientos['id_cia'];
                        $id_catalogo = $movimientos['id_catalogo'];
                        $id_cuenta_mayor = $movimientos['id_cuenta_mayor'];
                        $id_grupo_cuenta = $movimientos['id_grupo_cuenta'];
                        $id_clase_cuenta = $movimientos['id_clase_cuenta'];
                        $id_mae_ter = $movimientos['id_mae_ter'];
                        $id_auxiliar = $movimientos['id_auxiliar'];
                        $debito = $movimientos['debito'];
                        $credito = $movimientos['credito'];

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

                            //Si no hay consecutivo se crea uno en 0
                            if ($id_mov_cont == 0) {
                                $sql = <<<EOD
Insert into CN_TABLE_VIG_SEQ (NOM_ENTIDAD,ID_CIA,ID_VIGENCIA,SEQ) 
    values ('CN_MOVIMIENTO_CONTABLE','$id_cia','$id_vigencia','$id_mov_cont')                
EOD;
                                $this->conn->execute($sql);
                            }
                        }

                        $id_mov_cont += 1;

                        /*
                         * Crear movimiento
                         */
                        $sql = <<<EOD
Insert into CN_MOVIMIENTO_CONTABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,
    ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,
        ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) 
values ('$id_mov_cont','$id_documento','$id_cad','$id_vigencia','$id_cen_op','$id_cia',
    '$id_catalogo','$id_cuenta_mayor','$id_grupo_cuenta','$id_clase_cuenta','$id_mae_ter','$id_auxiliar',
        null,null,null,'$debito','$credito',null) 
EOD;
                        //ejecuta y obtiene el resultado del sql
                        $this->conn->execute($sql);
                    }

                    /**
                     * Actualizar consecutivo movimiento
                     */
                    $consecutivo = $id_mov_cont;
                    $sql = <<<EOD
UPDATE CN_TABLE_VIG_SEQ SET SEQ = $consecutivo 
    WHERE id_vigencia = $id_vigencia
    and id_cia = $id_cia
    and nom_entidad = 'CN_MOVIMIENTO_CONTABLE'  
EOD;
                    $this->conn->execute($sql);
                }
            }

            if (!$fail) {

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

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

imp.id_imp_movi_contab,
imp.id_documento,
imp.id_cad,
imp.id_vigencia,
imp.id_cen_op,
imp.id_cia,
imp.id_catalogo,
imp.id_cuenta_mayor,
imp.id_grupo_cuenta,
imp.id_clase_cuenta,
imp.id_mae_ter,
imp.id_auxiliar,
imp.debito,
imp.credito,

cad.fecha_cad,
subc.digitos,
subc.nombre as cuenta,
ter.nitocc,
ter.nombre,
aux.cod_aux,
aux.nombre as auxiliar

from cn_imp_movi_contab imp

join cn_control_cad cad 
on imp.id_cad = cad.id_cad 
and imp.id_vigencia = cad.id_vigencia 
and imp.id_cen_op = cad.id_cen_op 
and imp.id_cia = cad.id_cia 

left join cn_subc_digitos subc
on subc.id_cia = imp.id_cia
and subc.id_clase_cuenta = imp.id_clase_cuenta
and subc.id_grupo_cuenta = imp.id_grupo_cuenta
and subc.id_cuenta_mayor = imp.id_cuenta_mayor
and subc.id_catalogo = imp.id_catalogo

left join cn_mae_ter ter
on ter.id_mae_ter = imp.id_mae_ter

left join cn_auxiliar aux
on imp.id_auxiliar = aux.id_auxiliar


order by
imp.id_cad,
imp.id_documento, 
subc.digitos,
aux.cod_aux

)
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 

imp.id_imp_movi_contab,
imp.id_documento,
imp.id_cad,
imp.id_vigencia,
imp.id_cen_op,
imp.id_cia,
imp.id_catalogo,
imp.id_cuenta_mayor,
imp.id_grupo_cuenta,
imp.id_clase_cuenta,
imp.id_mae_ter,
imp.id_auxiliar,
imp.debito,
imp.credito,

cad.fecha_cad,
subc.digitos,
subc.nombre as cuenta,
ter.nitocc,
ter.nombre,
aux.cod_aux,
aux.nombre as auxiliar

from cn_imp_movi_contab imp

join cn_control_cad cad 
on imp.id_cad = cad.id_cad 
and imp.id_vigencia = cad.id_vigencia 
and imp.id_cen_op = cad.id_cen_op 
and imp.id_cia = cad.id_cia 

left join cn_subc_digitos subc
on subc.id_cia = imp.id_cia
and subc.id_clase_cuenta = imp.id_clase_cuenta
and subc.id_grupo_cuenta = imp.id_grupo_cuenta
and subc.id_cuenta_mayor = imp.id_cuenta_mayor
and subc.id_catalogo = imp.id_catalogo

left join cn_mae_ter ter
on ter.id_mae_ter = imp.id_mae_ter

left join cn_auxiliar aux
on imp.id_auxiliar = aux.id_auxiliar


order by
imp.id_cad,
imp.id_documento, 
subc.digitos,
aux.cod_aux
          
) 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());
        }
    }

}
