<?php

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

    /**
     * Llenar la tabla no_rh_dp_mf con los datos de cargos por fecha y novedades
     *
     * @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");

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

        try {

            /*
             * Variables de filtro
             */
            //Periodo
            $id_periodo = $request['id_periodo'];

            /*
             * Variables opcionales
             */
            //cod_tipo
            if (isset($request['id_tipo_formula'])) {
                $whereTipoFormula = " AND tab0.cod_tipo = '" . $request['id_tipo_formula'] . "' ";
            } else {
                $whereTipoFormula = ' ';
            }
            //id_concep_nomina
            if (isset($request['id_concep_nomina'])) {
                $whereConcepto = " AND tab0.id_concep_nomina = " . $request['id_concep_nomina'];
            } else {
                $whereConcepto = ' ';
            }
            //id_agrup_concepto
            if (isset($request['id_agrup_concepto'])) {
                $whereConceptoAgrup = " and tab0.id_concep_nomina in ( select no_agrup_deta.id_concep_nomina from no_agrup_deta where no_agrup_deta.id_agrup_concepto = " . $request['id_agrup_concepto'] . " ) ";
            } else {
                $whereConceptoAgrup = ' ';
            }
            //con_tip_val
            if (isset($request['con_tip_val'])) {
                $whereConTipoValor = " AND tab0.formula_mod like '%" . $request['con_tip_val'] . "%' ";
            } else {
                $whereConTipoValor = ' ';
            }


            /*
             * Agrupaciones 
             */
            $sql = <<<EOD
select * from no_agrup_concepto
order by
codigo 
EOD;
            //Ejecutar SQL
            $records = CN_TABLE::executeSQL($sql);

            //Agrega a un array todas las constantes
            foreach ($records as $value) {

//                foreach ($value as $key => $value2) {
//                    $this->logMessage($key . " - " . $value2);
//                }

                $arrayAgrupaciones[$value['id_agrup_concepto']] = $value['codigo'];
//                $this->logMessage($value['reemplazo'] . "------------------------" . $arrayConstantes[$value['reemplazo']]);
            }


            /*
             * Conceptos Nomina
             */
            $sql = <<<EOD
select * from no_concep_nomina
order by
codigo  
EOD;
            //Ejecutar SQL
            $records = CN_TABLE::executeSQL($sql);

            //Agrega a un array todas las constantes
            foreach ($records as $value) {

//                foreach ($value as $key => $value2) {
//                    $this->logMessage($key . " - " . $value2);
//                }

                $arrayConceptos[$value['id_concep_nomina']] = $value['codigo'];
//                $this->logMessage($value['reemplazo'] . "------------------------" . $arrayConstantes[$value['reemplazo']]);
            }


            //Sql
            $sql = <<<EOD
select distinct tab.* from no_formula tab
   WHERE tab.id_concep_nomina in (    
   
    select distinct 
    nvl( tab0.id_concep_nomina_ss, tab0.ID_CONCEP_NOMINA) as ID_CONCEP_NOMINA 
    from
    (

        select 
        formula.ID_FORMULA,
        formula.ID_CONCEP_NOMINA,
        formula.FORMULA,
        formula.NOMBRE,
        formula.COD_TIPO,
        foncon.id_descuento_ss,
        des.id_concep_nomina as id_concep_nomina_ss
        from no_formula formula
        left join no_fondo_concepto foncon
        on formula.id_concep_nomina = foncon.id_concep_nomina
        left join no_descuento_ss des
        on foncon.id_descuento_ss = des.id_descuento_ss

    )tab0
                    
    where
    1 = 1   
    $whereTipoFormula $whereConcepto $whereConceptoAgrup   
                    
)    
order by
tab.id_concep_nomina    
EOD;
            //Ejecutar SQL
            $records = CN_TABLE::executeSQL($sql);


            foreach ($records as $value) {

                $id_formula = $value['id_formula'];
                $formula = $value['formula'];
                $this->logMessage("[formula_mod] Formula Inicial: " . $formula);

                $vars = array();

                CN_TABLE::getVarsInFormula($vars, $formula);


                foreach ($vars as $var) {
                    $this->logMessage("[formula_mod] var: " . $var);

//                $consulta = str_replace('$', ':', $consulta);
                    if (substr($var, 0, 1) == 'A') {
                        $id_agrup_concepto = substr($var, 1);
                        $formula = str_replace($var, substr($var, 0, 1) . $arrayAgrupaciones[$id_agrup_concepto], $formula);
                    } else {
                        $id_concep_nomina = substr($var, 1);
                        $formula = str_replace($var, substr($var, 0, 1) . $arrayConceptos[$id_concep_nomina], $formula);
                    }
                }

                $this->logMessage("[formula_mod] Formula Final: " . $formula);

                /**
                 * Actualizar formula
                 */
                $sql = <<<EOD
update no_formula set formula_mod = '$formula' where id_formula = $id_formula     
EOD;
                $this->conn->execute($sql);
            }

            //OJO:: :oci_b_var_ pasar a ?, toca con el codigo chr(63) Problemas al guardar en oracle PHP
            $sql = <<<EOD
update no_formula set formula_mod = replace ( formula_mod,':oci_b_var_1',chr(63))    
EOD;
            $this->conn->execute($sql);

            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[formula_mod] Datos exitosos.");
        } catch (Exception $e) {

            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "[formula_mod] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[formula_mod] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

}
