<?php

/**
 * bal_gen actions.
 *
 * @package    contab2
 * @subpackage bal_gen
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class bal_genActions extends sfQuery {
    /*
     * ------------VARIABLES PARA SERVICIOS DE CONSULTA - LIST
     */

    protected $table_names = array(
        'CN_BALANCE_GENERAL'
    ); //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_BALANCE_GENERAL' => array(
            'cuenta' => 'cuenta',
            'nombre_cuenta' => 'nombre_cuenta',
            'naturaleza' => 'naturaleza',
            'corriente' => 'corriente',
            'id_clase_cuenta' => 'id_clase_cuenta',
            'id_grupo_cuenta' => 'id_grupo_cuenta',
            'id_cuenta_mayor' => 'id_cuenta_mayor',
            'dig_cla' => 'dig_cla',
            'nom_cla' => 'nom_cla',
            'dig_gru' => 'dig_gru',
            'nom_gru' => 'nom_gru',
            'dig_cue' => 'dig_cue',
            'nom_cue' => 'nom_cue',
            'saldo_anterior' => 'saldo_anterior',
            'debito' => 'debito',
            'credito' => 'credito',
            'saldo_actual' => 'saldo_actual',
            'id_cen_op' => 'id_cen_op',
            'id_vigencia' => 'id_vigencia',
            'id_periodo_contable' => 'id_periodo_contable',
            'id_cia' => 'id_cia'
        )
    ); //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_BALANCE_GENERAL' => 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')),
            '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;

    /**
     * Metodo del servicio list - consulta balance general
     *
     * @param sfWebRequest $request
     */
    public function executeList(sfWebRequest $request) {

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


        /*
         * Variables globales
         */
        $modulo = sfConfig::get('app_modulo');
        $usuarioERP = sfConfig::get('app_usuarioERP');
        $claveERP = sfConfig::get('app_claveERP');
        $usuarioERPContab = sfConfig::get('app_usuarioERPContab');
        $claveERPContab = sfConfig::get('app_claveERPContab');

        
        /*
         * variables por defecto para el registro de log
         */
        $id_tabla = 'null';

        //validar vigencia
        $id_vigencia = 'null';
        if (isset($request['id_vigencia'])) {
            $id_vigencia = $request['id_vigencia'];
        }

        //validar centro de operacion
        $id_cen_op = 'null';
        if (isset($request['id_cen_op'])) {
            $id_cen_op = $request['id_cen_op'];
        }

        $id_cia = 'null';
        if (isset($request['id_cia'])) {
            $id_cia = $request['id_cia'];
        }

        //id maestro tabla - para consulta informes no es necesario
        $id_mae_bd = 'null';

        //1 - indica operacion de consulta
        $id_ope_bd = 1;

        //id del maestro tercero
        $id_mae_ter = 1;
        if (isset($request['id_username'])) {
            $id_mae_ter = $request['id_username'];
        }
        $usuario = 'admin';
        if (isset($request['username'])) {
            if (!is_null($request['username']) && $request['username'] != '') {
                $usuario = $request['username'];
            }
        }
        $comando = 'sin comando';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }

        /*
         * construir observacion
         */
        $informe = 'sin especificar';

        //sentencia sql
        $sql = <<<EOD
select * from CREDENCIAL
where ID_MOD = $modulo
and comando = '$comando'
EOD;

        //ejecuta y obtiene el resultado del sql
        $resultado = CN_TABLE::executeOCI_SQL_List($sql, $usuarioERP, $claveERP);

        if (count($resultado) > 0) {
            $informe = $resultado[0]['NOMBRE'];
        }

        //observacion para el log
        $observacion = "'Se consulto informe: " . $informe . " desde la funcionalidad: " . $comando . "'";


        /*
         * obtener variables del request
         */
        //filtros obligatorios
        $cia = $request['id_cia'];
        $cen_op = $request['id_cen_op'];
        $vigencia = $request['id_vigencia'];
        $periodo = $request['id_periodo_contable'];


        //validar comparacion de periodos
        if (isset($request["compara"])) {

            if ($request['compara'] == 'true') {

                $vig_compar = $request['vig_compar'];
                $per_compar = $request['per_compar'];
                $compara = $request['compara'];
            } else {
                $compara = 'false';
            }
        }

        $records = array();

        if ($compara == 'true') {

            /*
             * obtener los records de la consulta sql para los periodos a comparar
             */
            $rec = $this->sql_balance_general($cia, $cen_op, $vigencia, $periodo);
            $rec_compar = $this->sql_balance_general($cia, $cen_op, $vig_compar, $per_compar);

            //une los dos array
            $rec_completo = array_merge($rec, $rec_compar);

            //validar datos del arreglo
//        echo var_dump($rec);die();
            //ordenar la consulta de los dos periodos
            if (count($rec_completo) > 0) {
                $rec = $this->ordenar_array($rec_completo, 'orden', SORT_ASC, 'dig_cla', SORT_ASC, 'corriente', SORT_DESC, 'dig_gru', SORT_ASC, 'dig_cue', SORT_ASC, 'id_vigencia', SORT_DESC, 'id_periodo_contable', SORT_DESC) or die('<br>ERROR!<br>');
            } else {
                $rec = array();
            }

            $records = array();
//        $num_key = 0;
//        foreach ($rec as $rec_one) {
            /*
             * recorrer el arreglo de la union
             * generar un array con saldos de ambos periodos
             */
            for ($num_key = 0; $num_key < count($rec); $num_key++) {

                $records_one = array();

                foreach ($rec[$num_key] as $key => $value) {

                    $records_one[$key] = $value;
                }


                //iniciar variables
                $records_one['id_vigencia2'] = '?';
                $records_one['id_periodo_contable2'] = '?';
                $records_one['saldo_anterior2'] = '0';
                $records_one['debito2'] = '0';
                $records_one['credito2'] = '0';
                $records_one['saldo_actual2'] = '0';


                //validar si hay otra fila
                if (($num_key + 1) < count($rec)) {
                    //si son iguales las cuentas
                    if ($rec[($num_key)]['cuenta'] == $rec[($num_key + 1)]['cuenta'] &&
                            $rec[($num_key)]['nombre_cuenta'] == $rec[($num_key + 1)]['nombre_cuenta']) {

                        $records_one['id_vigencia2'] = $rec[($num_key + 1)]['id_vigencia'];
                        $records_one['id_periodo_contable2'] = $rec[($num_key + 1)]['id_periodo_contable'];
                        $records_one['saldo_anterior2'] = $rec[($num_key + 1)]['saldo_anterior'];
                        $records_one['debito2'] = $rec[($num_key + 1)]['debito'];
                        $records_one['credito2'] = $rec[($num_key + 1)]['credito'];
                        $records_one['saldo_actual2'] = $rec[($num_key + 1)]['saldo_actual'];
                        $num_key++;
                    } else {

                        $records_one['id_vigencia2'] = '?';
                        $records_one['id_periodo_contable2'] = '?';
                        $records_one['saldo_anterior2'] = '0';
                        $records_one['debito2'] = '0';
                        $records_one['credito2'] = '0';
                        $records_one['saldo_actual2'] = '0';
                    }
                }

                //calculo variacion
                $records_one['variacion'] = $records_one['saldo_actual'] - $records_one['saldo_actual2'];

                //calculo porcentaje
                if ($records_one['saldo_actual'] == 0 || $records_one['saldo_actual2'] == 0 || $records_one['saldo_actual'] == $records_one['saldo_actual2']) {

                    $records_one['porcentaje'] = 0;
                } else {

                    $records_one['porcentaje'] = ($records_one['saldo_actual2'] * 100) / $records_one['saldo_actual'];
                }

                //adjuntar la fila al arreglo de filas
                $records[] = $records_one;

//            $num_key++;
            }
        } else {
            //obtener filas de consultas sql por filtros
            $records = $this->sql_balance_general($cia, $cen_op, $vigencia, $periodo);
        }


        /*
         * Valida si se obtuvo valores en la consulta
         */
        if (count($records) > 0) {

            /*
             * registro de consulta en tabla de log
             */
            $sql = CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion);


            //array de filas de consulta para uso del template
            $this->list_data = $records;
        } else {
            $this->list_data = array();
        }

        //datos de grids live GWT
        $this->totalRows = count($records);
        $this->startRow = $request['_startRow'];
        $this->endRow = $this->startRow + count($records);
        //totales de filas y de consulta
        $this->logMessage('record_count = ' . count($records));
        $this->logMessage('total_record_count = ' . count($records));
    }

    /*
     * Metodo para ejecutar consulta sql de balance general un periodo y vigencia
     */

    function sql_balance_general($cia, $cen_op, $vigencia, $periodo) {

        //sentencia sql para balance general

        $sql = <<<EOD
SELECT
*
FROM CN_BALANCE_GENERAL tab0

WHERE tab0.id_cia = $cia
AND tab0.id_vigencia = $vigencia
AND tab0.id_periodo_contable = $periodo
and (tab0.dig_cla = 1 or tab0.dig_cla = 8)
EOD;

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

        //validar si hay datos
        if (count($records) > 0) {

            return $records;
        } else {

            return array();
        }
    }

    /*
     * Metodo para ordenar por varios campos
     */

    function ordenar_array() {

        $n_parametros = func_num_args(); // Obenemos el número de parámetros
        if ($n_parametros < 3 || $n_parametros % 2 != 1) { // Si tenemos el número de parametro mal...
            return false;
        } else { // Hasta aquí todo correcto...veamos si los parámetros tienen lo que debe ser...
            $arg_list = func_get_args();

            if (!(is_array($arg_list[0]) && is_array(current($arg_list[0])))) {
                return false; // Si el primero no es un array...MALO!
            }
            for ($i = 1; $i < $n_parametros; $i++) { // Miramos que el resto de parámetros tb estén bien...
                if ($i % 2 != 0) {// Parámetro impar...tiene que ser un campo del array...
                    if (!array_key_exists($arg_list[$i], current($arg_list[0]))) {
                        return false;
                    }
                } else { // Par, no falla...si no es SORT_ASC o SORT_DESC...a la calle!
                    if ($arg_list[$i] != SORT_ASC && $arg_list[$i] != SORT_DESC) {
                        return false;
                    }
                }
            }
            $array_salida = $arg_list[0];

            // Una vez los parámetros se que están bien, procederé a ordenar...
            $a_evaluar = "foreach (\$array_salida as \$fila){\n";
            for ($i = 1; $i < $n_parametros; $i+=2) { // Ahora por cada columna...
                $a_evaluar .= "  \$campo{$i}[] = \$fila['$arg_list[$i]'];\n";
            }
            $a_evaluar .= "}\n";
            $a_evaluar .= "array_multisort(\n";
            for ($i = 1; $i < $n_parametros; $i+=2) { // Ahora por cada elemento...
                $a_evaluar .= "  \$campo{$i}, SORT_REGULAR, \$arg_list[" . ($i + 1) . "],\n";
            }
            $a_evaluar .= "  \$array_salida);";
            // La verdad es que es más complicado de lo que creía en principio... :)

            eval($a_evaluar);
            return $array_salida;
        }
    }

}
