<?php

/**
 * homolofacion_cuentas actions.
 *
 * @package    Sofhouse
 * @subpackage consulta_saldo
 * @author     Software House
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class homolofacion_cuentasActions extends sfQuery {
    /*
     * ------------VARIABLES PARA SERVICIOS DE CONSULTA - LIST
     */

    protected $table_names = array(
        'CN_SALDO'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CN_SALDO' =>
        array(
            'id_cia' => 'id_cia',
            'id_cen_op' => 'id_cen_op',
            'id_vigencia' => 'id_vigencia',
            'id_periodo_contable' => 'id_periodo_contable',
            'id_clase_cuenta' => 'id_clase_cuenta',
            'id_grupo_cuenta' => 'id_grupo_cuenta',
            'id_cuenta_mayor' => 'id_cuenta_mayor',
            'id_catalogo' => 'id_catalogo',
            'id_mae_ter' => 'id_mae_ter',
            'id_auxiliar' => 'id_auxiliar',
            'id_sub_aux' => 'id_sub_aux',
            'id_centro_costo' => 'id_centro_costo',
            'id_sub_centro_costo' => 'id_sub_centro_costo',
            'subcuenta' => 'subcuenta',
            'saldo_anterior' => 'saldo_anterior',
            'debito' => 'debito',
            'credito' => 'credito',
            'saldo_actual' => 'saldo_actual'
        )
    ); //por cada tabla especificar los campos del select

    /*
     * OPCIONES DE FILTRO:
     *
     * LIKEALLPLUS- busqueda comparativa de la cadena dividida por los espacios en blanco en cualquier posición
     * LIKEALL - busqueda comparativa de la cadena en cualquier posición
     * LIKE - busqueda en la cadena que inicie por la variable de filtro
     *
     * rownum,start - rownum,end / estos campos para uso del Grid live GWT, numero fijo de filas de consulta
     */
    protected $table_field_conditions = array(
        'CN_SALDO' => array(
            'id_cia' => array('=' => array('id_cia')),
            'id_vigencia' => array('=' => array('id_vigencia')),
            'id_periodo_contable' => array('=' => array('id_periodo_contable')),
            'id_cen_op' => array('=' => array('id_cen_op')),
            'subcuenta' => array('=' => array('digitos')),
            'id_auxiliar' => array('=' => array('id_auxiliar')),
            'id_mae_ter' => array('=' => array('id_mae_ter')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros

    /*
     * Variables manejo de log
     */
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = false;

    /*
     * ------------VARIABLES PARA SERVICIO DE SUMATORIA - SUM
     */
//    protected $summatory_data = array(
//        'CN_SALDO' => array(
//            'fields' => array('saldo_anterior', 'mvto_debito', 'mvto_credito', 'nuevo_saldo'),
//            'labels' => array('nombre_cuenta,Total'),
//            'condition,cuenta' => array('LENGTH(', 'field', ') = 6'),
//            'condition,auxiliar' => array('field', ' IS NULL'),
//            'condition,tercero' => array('field', ' IS NULL')
//        )
//    ); //se especifica por tabla los campos de suma y condiciones de filtro

    /**
     * Pueba servicio add de homologacion
     *
     * @param sfRequest $request A request object
     */
    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");

        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Formato de fecha
         */
        //Sql
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD" 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);


        /*
         * Manejo de errores
         */
        try {

            //sentencia sql
            $sql = <<<EOD
ALTER TRIGGER CN_COTROL_CAD_TOT_TRG DISABLE
EOD;
            //ejecuta el sql
            CN_TABLE::executeSQL($sql);

            /*
             * Variables de operacion
             */
            $id_cia = $request['id_cia'];
            $id_username = $request['id_username'];

            $id_vigencia = $request['id_vigencia'];
            $id_periodo_contable = $request['id_periodo_contable'];
            $id_cen_op = $request['id_cen_op'];
            $digitos = $request['digitos'];
            $digitos_fin = $request['digitos_fin'];

            $id_tipo_comprobante = $request['id_tipo_comprobante'];
            $id_td = $request['id_td'];
            $fecha_cad = $request['fecha_cad'];
            $fecha_soporte = $request['fecha_soporte'];

            $id_mae_ter = 'null';
            if (isset($request['id_mae_ter'])) {
                $id_mae_ter = $request['id_mae_ter'];
            }
            $descr_mto = 'null';
            if (isset($request['descr_mto'])) {
                $descr_mto = "'" . $request['descr_mto'] . "'";
            }
            $doc_soporte = 'null';
            if (isset($request['doc_soporte'])) {
                $doc_soporte = "'" . $request['doc_soporte'] . "'";
            }


            /**
             * Crear CAD
             */
            // Sentencia SQL 
            $sql = <<<EOD
select * from cn_control_cad 
where id_cia = $id_cia
and id_vigencia = $id_vigencia
and ID_CEN_OP = $id_cen_op
and ID_PERIODO_CONTABLE = $id_periodo_contable
and ID_TIPO_COMPROBANTE = $id_tipo_comprobante
and FECHA_CAD = to_date('$fecha_cad','yyyy-mm-dd')
EOD;

            // Ejecuta SQL
            $resultado = CN_TABLE::executeSQL($sql);

            /*
             * Validar que exista CAD
             */
            if (count($resultado) > 0) {
                $id_cad = $resultado[0]['id_cad'];
            } else {

                /*
                 * Crear cad - Insert into CN_CONTROL_CAD (ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_PERIODO_CONTABLE,ID_TIPO_COMPROBANTE,FECHA_CAD,TOT_DEBITO,TOT_CREDITO,ID_TER_GENERO,ID_TER_REVISO,ID_TER_APROBO) 
                 * values (0,2011,16,1,13,8,to_date('31-DEC-11','DD-MON-RR'),0,0,null,null,null);
                 */
                //obtener secuencia de tabla_vig_seq 
                //sentencia sql
                $sql = <<<EOD
select * from cn_table_vig_seq
where
id_cia = $id_cia
and id_vigencia = $id_vigencia
and nom_entidad = 'CN_CONTROL_CAD'
EOD;
                //ejecuta el sql
                $resultado = CN_TABLE::executeSQL($sql);

                $id_cad = $resultado[0]['seq'];
                $id_cad = $id_cad + 1;

                // Sentencia SQL 
                $sql = <<<EOD
Insert into CN_CONTROL_CAD (ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_PERIODO_CONTABLE,
    ID_TIPO_COMPROBANTE,FECHA_CAD,TOT_DEBITO,TOT_CREDITO,ID_TER_GENERO,ID_TER_REVISO,ID_TER_APROBO) 
    values ($id_cad,$id_vigencia,$id_cen_op,$id_cia,$id_periodo_contable,$id_tipo_comprobante,
        to_date('$fecha_cad','yyyy-mm-dd'),0,0,$id_username,null,null)
EOD;

                // Ejecuta SQL
                $this->conn->execute($sql);

                //actualizar secuencia de tabla_vig_seq por vigencia y tabla Cad-Docu-Movi
                //Actualiza secuencia de cad
                //sentencia sql
                $sql = <<<EOD
UPDATE CN_TABLE_VIG_SEQ
SET SEQ = NVL( (SELECT max(ID_CAD) FROM CN_CONTROL_CAD where ID_VIGENCIA = $id_vigencia AND ID_CIA = $id_cia ), 0 )
WHERE NOM_ENTIDAD='CN_CONTROL_CAD' AND ID_CIA = $id_cia and ID_VIGENCIA = $id_vigencia
EOD;
                //Ejecuta el sql
                $this->conn->execute($sql);
            }




            /**
             * Crear DOCUMENTO
             */
            /*
             * Crear docu - Insert into CN_DOCUMENTO (ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_TD,ID_MAE_TER,DESCR_MTO,DOC_SOPORTE,FECHA_SOPORTE,TOT_DEBITO,TOT_CREDITO) values (0,0,2011,16,1,9,444,'prueba','0',to_date('31-DEC-11','DD-MON-RR'),0,0);
             */

            //obtener secuencia de tabla_vig_seq 
            //sentencia sql
            $sql = <<<EOD
select * from cn_table_vig_seq
where
id_cia = $id_cia
and id_vigencia = $id_vigencia
and nom_entidad = 'CN_DOCUMENTO'
EOD;
            //ejecuta el sql
            $resultado = CN_TABLE::executeSQL($sql);

            $id_documento = $resultado[0]['seq'];
            $id_documento = $id_documento + 1;

            // Sentencia SQL
            $sql = <<<EOD
Insert into CN_DOCUMENTO (ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_TD
    ,ID_MAE_TER,DESCR_MTO,DOC_SOPORTE,FECHA_SOPORTE,TOT_DEBITO,TOT_CREDITO) 
    values ($id_documento,$id_cad,$id_vigencia,$id_cen_op,$id_cia,$id_td, 
            $id_mae_ter, $descr_mto, $doc_soporte,to_date('$fecha_soporte', 'yyyy-mm-dd'),0,0)
EOD;

            // Ejecuta SQL
            $this->conn->execute($sql);

            //Actualiza secuencia de documentos
            //sentencia sql
            $sql = <<<EOD
UPDATE CN_TABLE_VIG_SEQ
SET SEQ = NVL( (SELECT max(ID_DOCUMENTO) FROM CN_DOCUMENTO where ID_VIGENCIA = $id_vigencia AND ID_CIA = $id_cia ), 0 )
WHERE NOM_ENTIDAD='CN_DOCUMENTO' AND ID_CIA = $id_cia and ID_VIGENCIA = $id_vigencia
EOD;
            //Ejecuta el sql
            $this->conn->execute($sql);



            /**
             * CREAR MOVIMIENTOS
             */
            //sentencia sql
            $sql = <<<EOD
select * from cn_subc_digitos
where digitos = '$digitos_fin'
EOD;
            //ejecuta el sql
            $resultado = CN_TABLE::executeSQL($sql);

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

            //obtener secuencia de tabla_vig_seq 
            //sentencia sql
            $sql = <<<EOD
select * from cn_table_vig_seq
where
id_cia = $id_cia
and id_vigencia = $id_vigencia
and nom_entidad = 'CN_MOVIMIENTO_CONTABLE'
EOD;
            //ejecuta el sql
            $resultado = CN_TABLE::executeSQL($sql);

            $id_mov_cont = $resultado[0]['seq'];

            //Obtengo saldos
            //sentencia sql
            $sql = <<<EOD
SELECT   
tab0.id_cia as id_cia, tab0.id_cen_op as id_cen_op, tab0.id_vigencia as id_vigencia, 
tab0.id_periodo_contable as id_periodo_contable, tab0.id_clase_cuenta as id_clase_cuenta, 
tab0.id_grupo_cuenta as id_grupo_cuenta, tab0.id_cuenta_mayor as id_cuenta_mayor, 
tab0.id_catalogo as id_catalogo, tab0.id_mae_ter as id_mae_ter, tab0.id_auxiliar as id_auxiliar, 
tab0.id_sub_aux as id_sub_aux, tab0.id_centro_costo as id_centro_costo, 
tab0.id_sub_centro_costo as id_sub_centro_costo, tab0.subcuenta as subcuenta, 
tab0.saldo_anterior as saldo_anterior, tab0.debito as debito, tab0.credito as credito, 
tab0.saldo_actual as saldo_actual 
FROM CN_SALDO tab0 
WHERE tab0.id_cia = '$id_cia' 
AND tab0.id_vigencia = '$id_vigencia' 
AND tab0.id_periodo_contable = '$id_periodo_contable' 
AND tab0.id_cen_op = '$id_cen_op' 
AND tab0.subcuenta = '$digitos'
EOD;
            //ejecuta el sql
            $resultado = CN_TABLE::executeSQL($sql);

            if (count($resultado) > 0) {

                //recorre los saldos
                foreach ($resultado as $value) {

                    $id_mov_cont = $id_mov_cont + 1;

                    $id_mae_ter = 'null';
                    if (isset($value['id_mae_ter']) && $value['id_mae_ter'] != null && $value['id_mae_ter'] != '') {
                        $id_mae_ter = $value['id_mae_ter'];
                    }

                    $id_auxiliar = 'null';
                    if (isset($value['id_auxiliar']) && $value['id_auxiliar'] != null && $value['id_auxiliar'] != '') {
                        
                        $id_auxiliar = $value['id_auxiliar'];

                        //sentencia sql
                        $sql = <<<EOD
select * from cn_subc_digitos_aux
where digitos = '$digitos_fin'
and cod_aux = (select distinct cod_aux from cn_subc_digitos_aux
where digitos = '$digitos'
and id_auxiliar = $id_auxiliar)
EOD;
                        //ejecuta el sql
                        $resultado_aux = CN_TABLE::executeSQL($sql);

                        $id_auxiliar = $resultado_aux[0]['id_auxiliar'];
                    }

                    $saldo = $value['saldo_actual'];
                    //Saldos: Diferente de cero, 
                    //Menor a 0 = debito, Mayor a 0 = Credito.
                    if ($saldo != 0) {
                        if ($saldo < 0) {

                            // Sentencia SQL
                            $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, $saldo,0,0)
EOD;

                            // Ejecuta SQL
                            $this->conn->execute($sql);
                        } else {

                            // Sentencia SQL
                            $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,0, $saldo,0)
EOD;

                            // Ejecuta SQL
                            $this->conn->execute($sql);
                        }
                    }
                }
            }

            /*
             * Actualiza secuencia de movimientos
             */
            //sentencia sql
            $sql = <<<EOD
UPDATE CN_TABLE_VIG_SEQ
SET SEQ = NVL( (SELECT max(ID_MOV_CONT) FROM CN_MOVIMIENTO_CONTABLE where ID_VIGENCIA = $id_vigencia AND ID_CIA = $id_cia ), 0 )
WHERE NOM_ENTIDAD='CN_MOVIMIENTO_CONTABLE' AND ID_CIA = $id_cia and ID_VIGENCIA = $id_vigencia
EOD;
            EOD;
            //Ejecuta el sql
            $this->conn->execute($sql);



            //sentencia sql
            $sql = <<<EOD
ALTER TRIGGER CN_COTROL_CAD_TOT_TRG ENABLE
EOD;
            //ejecuta el sql
            CN_TABLE::executeSQL($sql);


            $this->conn->commit();

            /*
             * Resultado
             */
            $mensaje = "[Homolofación Cuentas] Se crearon los registros de las cuentas. CAD - " . $id_cad;
            $this->list_data = array();
            $this->mensajeError = $mensaje;
            $this->logMessage($mensaje);
        } catch (Exception $e) {

            $this->logMessage("ERROR!!!");

            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
            $this->conn->rollback();

            //sentencia sql
            $sql = <<<EOD
ALTER TRIGGER CN_COTROL_CAD_TOT_TRG ENABLE
EOD;
            //ejecuta el sql
            CN_TABLE::executeSQL($sql);


            $this->status = 1;
            $this->mensajeError = "ERROR!!!";
            $this->list_data = array();
            $this->logMessage($e->getMessage());
        }
    }

}
