<?php

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

    /**
     * Revisar si por periodo hay registros de separacion
     *
     * @param sfWebRequest $request
     */
    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");

        /*
         * manejo de errores
         */
        try {

            $id_periodo = $request['id_periodo_filtro'];

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

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

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('NO_FUNCIONARIO_AGRUP_REC_BF');

            //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'];
            }
            $username = 'admin';
            if (isset($request['username'])) {
                if (!is_null($request['username']) && $request['username'] != '') {
                    $username = $request['username'];
                }
            }
            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }
            //construir observacion
            $observacion = "'Se consulto la separación de tipo financiación desde la funcionalidad: " . $comando . "'";


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



            /*
             * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
             */
            $sql = <<<EOD
SELECT
    *
FROM no_funcionario_agrup_rec_bf
where
id_periodo = $id_periodo 
EOD;

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

            $this->totalRows = count($resultado);
            $this->logMessage("[separar_agrup_rec] Total Filas: " . count($resultado));
            $this->startRow = 0;
            $this->endRow = count($resultado);
            $this->list_data = $resultado;
        } catch (Exception $e) {

            $this->status = 1;
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Seprar segun periodo y to nacion
     *
     * @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");

        /*
         * manejo de errores
         */
        try {

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

            $id_periodo = $request['id_periodo_filtro'];
            $tope_nacion = $request['tope_nacion'];

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

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

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('NO_FUNCIONARIO_AGRUP_REC_BF');

            //2 - indica operacion de adicion
            $id_ope_bd = 2;

            //id del maestro tercero
            $id_mae_ter = 1;
            if (isset($request['id_username'])) {
                $id_mae_ter = $request['id_username'];
            }
            $username = 'admin';
            if (isset($request['username'])) {
                if (!is_null($request['username']) && $request['username'] != '') {
                    $username = $request['username'];
                }
            }
            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }
            //construir observacion
            $observacion = "'Se adiciono la separación de tipo financiación desde la funcionalidad: " . $comando . "'";


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


            /*
             * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
             * 
             * Incidente #32043, tomar segun parametrizacion y orden - 20220921::LAVILA
              1. Los que tienen Incapacidades o Licencias por maternidad y paternidad. 
              2. los que tienen Vacaciones y
              3. Concepto 1004 si esta parametrizado - 20231020::LAVILA
              9. el valor restante sobre Asignación Básica
             * 
             */
            $sql = <<<EOD
select
tab0.*

from(
    SELECT
    tab1.id_tipo_doc,
    tab1.num_doc,
    sum(
    
        case when tab5.operador = 1 then tab1.valor_liquidado
             when tab5.operador = 0 then (tab1.valor_liquidado * -1) 
             else (tab1.valor_liquidado * -1) end 
                 
    ) as valor_liquidado,
    
    min( case 
        when tab5.id_concep_nomina in (select distinct no_concep_ka.id_concep_nomina from no_concep_ka) then 1 
        when tab5.id_concep_nomina in (select distinct no_concep_vac.id_concep_nomina from no_concep_vac) then 2 
        when tab5.id_concep_nomina in (select id_concep_primtec_nosal from no_param_concep) then 3
        else 9 end ) as tag_orden 
    
    FROM no_liquida_nomina tab1
    
    left join no_periodo_v per
    on tab1.id_periodo = per.id_periodo
    
    left join no_concep_nomina tab5 on tab5.id_concep_nomina = tab1.id_concep_nomina
    
    where
    tab1.id_periodo = $id_periodo 
    and tab1.id_concep_nomina in  (
        select id_concep_basica from no_param_concep 
            union select id_concep_ajuste from no_concep_nomina where id_concep_nomina in (select id_concep_basica from no_param_concep)
            union select id_concep_rein from no_concep_nomina where id_concep_nomina in (select id_concep_basica from no_param_concep)
       union
       ( select distinct ka.id_concep_nomina from no_concep_ka ka
            join  no_concep_nomina concep on ka.id_concep_nomina = concep.id_concep_nomina
            join pr_rubro_agrup_rec rec on rec.id_rubro = concep.id_rubro
            where rec.id_agrup_rec = 5 )
       union
       ( select distinct vac.id_concep_nomina from no_concep_vac vac
            join  no_concep_nomina concep on vac.id_concep_nomina = concep.id_concep_nomina
            join pr_rubro_agrup_rec rec on rec.id_rubro = concep.id_rubro
            where rec.id_agrup_rec = 5 )           
       union
        ( select distinct concep.id_concep_nomina from  no_concep_nomina concep 
            join pr_rubro_agrup_rec rec on rec.id_rubro = concep.id_rubro
            where rec.id_agrup_rec = 5
            and concep.id_concep_nomina in (select id_concep_primtec_nosal from no_param_concep) )
    )
    
    group by
    tab1.id_tipo_doc,
    tab1.num_doc

)tab0

order by
tab0.tag_orden,
tab0.num_doc
EOD;

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


            /**
             * delete separacion
             */
            //Sql
            $sql = <<<EOD
DELETE FROM NO_FUNCIONARIO_AGRUP_REC_BF tab0 WHERE tab0.id_periodo = $id_periodo 
EOD;
            //Ejecutar SQL
            CN_TABLE::executeSQL($sql);


            /**
             * generar separacion
             * inicia con id-5 nacion y luego 6-propios
             */
            $id_agrup_rec = 5;
            $valor_liq_sum = 0;
            if ($tope_nacion > 0) {

                foreach ($resultado as $value) {

                    $id_tipo_doc = $value['id_tipo_doc'];
                    $num_doc = $value['num_doc'];
                    $valor_liq_sum += $value['valor_liquidado'];

                    if ($valor_liq_sum > $tope_nacion) {
                        $id_agrup_rec = 6;
                    }

                    //Sql
                    $sql = <<<EOD
Insert into NO_FUNCIONARIO_AGRUP_REC_BF (ID_TIPO_DOC,NUM_DOC,ID_PERIODO,ID_AGRUP_REC,TOPE_NACION) 
    values ('$id_tipo_doc','$num_doc','$id_periodo','$id_agrup_rec','$tope_nacion')
EOD;
                    //Ejecutar SQL
                    $this->conn->execute($sql);
                }
            }

            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();

            $this->totalRows = count($resultado);
            $this->logMessage("[separar_agrup_rec] Total Filas: " . count($resultado));
            $this->startRow = 0;
            $this->endRow = count($resultado);
            $this->list_data = $resultado;
        } catch (Exception $e) {

            $this->status = 1;
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

}
