<?php

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

    /**
     * Generar registros en BD
     *
     * @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");

        $records = array();

        /*
         * Log liquidacion
         */
        $logPath = sfConfig::get('sf_log_dir') . '/liquidacion.log';
        $custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));

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

            /*
             * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7, CEV-8, CEV PUB-9)
             */
            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

            $int = 0;
            foreach ($array as $routeName => $routeData) {
                //echo $routeName . "\n";
                if ('entidad_cliente' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $entidadCliente = $value;
                        }
                    }
                }
                $int++;
            }

            /*
             * Variables de filtro
             */
            $id_periodo = $request['id_periodo'];
            $id_anhos_ini = $request['anho_ini'];
            $id_anhos_fin = $request['anho_fin'];
            $id_meses_ini = $request['mes_ini'];
            $id_meses_fin = $request['mes_fin'];
            $fecha_ini = $request['fecha_ini'];
            $fecha_fin = $request['fecha_fin'];
            //$fecha_expe = $request['fecha_expe'];
            $progress_key = $request['progress_key'] . $request['username'];

            //Funcionario num_doc
            $num_doc = null;
            $whereFuncionarioNumDoc = "";
            if (isset($request['num_doc'])) {
                $num_doc = $request['num_doc'];
                $whereFuncionarioNumDoc = " AND tab0.num_doc = " . $request['num_doc'];
            }
            //Funcionario id_tipo_doc 
            $id_tipo_doc = null;
            $whereFuncionarioTipoDoc = "";
            if (isset($request['id_tipo_doc'])) {
                $id_tipo_doc = $request['id_tipo_doc'];
                $whereFuncionarioTipoDoc = " AND tab0.id_tipo_doc = " . $request['id_tipo_doc'];
            }
            //Tipo Concepto
            $whereTipoConcepto = "";
            if (isset($request['id_tipo_concepto'])) {
                $whereTipoConcepto = " AND concep.id_tipo_concepto = " . $request['id_tipo_concepto'];
            }

            /*
             *  Borrar datos anteriores Periodo-Funcionario
             */
            //Sql
            $sql = <<<EOD
DELETE FROM NO_CERTIF_INGRE_RETEN_RAN tab0 
    WHERE tab0.id_anhos_ini = $id_anhos_ini
            and tab0.id_anhos_fin = $id_anhos_fin
            and tab0.id_meses_ini = $id_meses_ini
            and tab0.id_meses_fin = $id_meses_fin
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc
EOD;
            //Se cambia para borrar toda la tabla y no dejar registros antiguos - 20210712::LAVILA
            $sql = <<<EOD
TRUNCATE TABLE NO_CERTIF_INGRE_RETEN_RAN 
EOD;
            //Ejecutar SQL
            CN_TABLE::executeSQL($sql);
            MemcacheHandler::getInstance()->set($progress_key, 15);

            /*
             *  Borrar datos de names para rango de fechas filtro
             */
            //Sql
            $sql = <<<EOD
DELETE FROM NO_CERTIF_RAN_NAMES tab0 
    WHERE tab0.id_anhos_ini = $id_anhos_ini
            and tab0.id_anhos_fin = $id_anhos_fin
            and tab0.id_meses_ini = $id_meses_ini
            and tab0.id_meses_fin = $id_meses_fin 
EOD;
            //Se cambia para borrar toda la tabla y no dejar registros antiguos - 20210712::LAVILA
            $sql = <<<EOD
TRUNCATE TABLE NO_CERTIF_RAN_NAMES 
EOD;
            //Ejecutar SQL
            CN_TABLE::executeSQL($sql);
            MemcacheHandler::getInstance()->set($progress_key, 30);

            if (isset($request['tipo_concepto'])) {
                $agrup_rete = 0;

                //Metodo que completa los registros
                $this->generar($id_anhos_ini, $id_anhos_fin, $id_meses_ini, $id_meses_fin, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_rete, 0, $whereTipoConcepto);
            }

            MemcacheHandler::getInstance()->set($progress_key, 100);

            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[generar_certif_ingre_reten_rango] Liquidación exitosa");
        } catch (Exception $e) {
            MemcacheHandler::getInstance()->set($progress_key, 100);

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

    /**
     * Registra los datos en NO_CERTIF_INGRE_RETEN_INF por agrupacion
     * 
     * @param type $id_anhos_ini
     * @param type $id_anhos_fin
     * @param type $id_meses_ini
     * @param type $id_meses_fin
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $num_doc
     * @param type $whereFuncionarioNumDoc
     * @param type $id_tipo_doc
     * @param type $whereFuncionarioTipoDoc
     * @param type $agrup
     * @param type $agrupOrden
     * @param type $whereTipoConcepto
     */
    private function generar($id_anhos_ini, $id_anhos_fin, $id_meses_ini, $id_meses_fin, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup, $agrupOrden, $whereTipoConcepto) {

        $this->logMessage("[generar_certif_ingre_reten_inf] Agrupación: " . $agrup);

        $whereAgrup = " ";
        $joinAgrup = " ";
        $varAgrup = 1;
        if ($agrup != 0) {
            $whereAgrup = "and tab0.id_concep_nomina in (
                select distinct id_concep_nomina from no_agrup_deta
                where id_agrup_concepto = $agrup
                )";

            $joinAgrup = "    join no_agrup_deta agrup
    on agrup.id_concep_nomina = tab0.id_concep_nomina
    and agrup.id_agrup_concepto = $agrup";

            $varAgrup = " agrup.operador ";
        }

        /**
         * Generar igualdad año-mes por 12 meses - 20190507
         */
        $anho_1 = $id_anhos_ini;
        $mes_1 = $id_meses_ini;
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_1, $mes_1);
        $anho_2 = $fecha_anhos['id_anhos'];
        $mes_2 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_2, $mes_2);
        $anho_3 = $fecha_anhos['id_anhos'];
        $mes_3 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_3, $mes_3);
        $anho_4 = $fecha_anhos['id_anhos'];
        $mes_4 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_4, $mes_4);
        $anho_5 = $fecha_anhos['id_anhos'];
        $mes_5 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_5, $mes_5);
        $anho_6 = $fecha_anhos['id_anhos'];
        $mes_6 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_6, $mes_6);
        $anho_7 = $fecha_anhos['id_anhos'];
        $mes_7 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_7, $mes_7);
        $anho_8 = $fecha_anhos['id_anhos'];
        $mes_8 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_8, $mes_8);
        $anho_9 = $fecha_anhos['id_anhos'];
        $mes_9 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_9, $mes_9);
        $anho_10 = $fecha_anhos['id_anhos'];
        $mes_10 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_10, $mes_10);
        $anho_11 = $fecha_anhos['id_anhos'];
        $mes_11 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_11, $mes_11);
        $anho_12 = $fecha_anhos['id_anhos'];
        $mes_12 = $fecha_anhos['id_meses'];

        $sql = <<<EOD
Insert into NO_CERTIF_RAN_NAMES (
    ID_ANHOS_INI,ID_ANHOS_FIN,ID_MESES_INI,
    ID_MESES_FIN,VALOR_MES1,VALOR_MES2,VALOR_MES3,VALOR_MES4,VALOR_MES5,VALOR_MES6,
    VALOR_MES7,VALOR_MES8,VALOR_MES9,VALOR_MES10,VALOR_MES11,VALOR_MES12
) 
    
values (
    '$id_anhos_ini','$id_anhos_fin','$id_meses_ini','$id_meses_fin',
    (SELECT descripcion FROM meses where id_meses = $mes_1) ||'-'|| $anho_1 ,
    (SELECT descripcion FROM meses where id_meses = $mes_2) ||'-'|| $anho_2 ,
    (SELECT descripcion FROM meses where id_meses = $mes_3) ||'-'|| $anho_3 ,
    (SELECT descripcion FROM meses where id_meses = $mes_4) ||'-'|| $anho_4 ,
    (SELECT descripcion FROM meses where id_meses = $mes_5) ||'-'|| $anho_5 ,
    (SELECT descripcion FROM meses where id_meses = $mes_6) ||'-'|| $anho_6 ,
    (SELECT descripcion FROM meses where id_meses = $mes_7) ||'-'|| $anho_7 ,
    (SELECT descripcion FROM meses where id_meses = $mes_8) ||'-'|| $anho_8 ,
    (SELECT descripcion FROM meses where id_meses = $mes_9) ||'-'|| $anho_9 ,
    (SELECT descripcion FROM meses where id_meses = $mes_10) ||'-'|| $anho_10 ,
    (SELECT descripcion FROM meses where id_meses = $mes_11) ||'-'|| $anho_11 ,
    (SELECT descripcion FROM meses where id_meses = $mes_12) ||'-'|| $anho_12 
)                
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        /*
         * insert into no_certif_ingre_reten_ran ;
         */
        //Sql
        $sql = <<<EOD
insert into no_certif_ingre_reten_ran (
ID_CERTIF_INGRE_RETEN_RAN,
ID_TIPO_DOC,
NUM_DOC,
ID_ANHOS_INI,
ID_ANHOS_FIN,
ID_MESES_INI,
ID_MESES_FIN,
ID_CONCEP_NOMINA,
VALOR_MES1,
VALOR_MES2,
VALOR_MES3,
VALOR_MES4,
VALOR_MES5,
VALOR_MES6,
VALOR_MES7,
VALOR_MES8,
VALOR_MES9,
VALOR_MES10,
VALOR_MES11,
VALOR_MES12,
VALOR_TOTAL,
AGRUPACION_ORDEN 
   ) 

(


select 
null as id_certif_ingre_reten_ran,
id_tipo_doc,
num_doc,
id_anhos_ini,
id_anhos_fin,
id_meses_ini,
id_meses_fin,
id_concep_nomina,

sum( valor_mes1) as valor_mes1,
sum( valor_mes2) as valor_mes2,
sum( valor_mes3) as valor_mes3,
sum( valor_mes4) as valor_mes4,
sum( valor_mes5) as valor_mes5,
sum( valor_mes6) as valor_mes6,
sum( valor_mes7) as valor_mes7,
sum( valor_mes8) as valor_mes8,
sum( valor_mes9) as valor_mes9,
sum( valor_mes10) as valor_mes10,
sum( valor_mes11) as valor_mes11,
sum( valor_mes12) as valor_mes12,

sum( valor_total) as valor_total,

nvl( $agrupOrden ,0) as agrupacion_orden 

from (

    select 
    tab0.id_tipo_doc,
    tab0.num_doc,
    $id_anhos_ini as id_anhos_ini,
    $id_anhos_fin as id_anhos_fin,
    $id_meses_ini as id_meses_ini,
    $id_meses_fin as id_meses_fin,
    tab0.id_concep_nomina,

    nvl( case when per.anho_mes = $anho_1 || lpad($mes_1, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes1,
    nvl( case when per.anho_mes = $anho_2 || lpad($mes_2, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes2,
    nvl( case when per.anho_mes = $anho_3 || lpad($mes_3, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes3,
    nvl( case when per.anho_mes = $anho_4 || lpad($mes_4, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes4,
    nvl( case when per.anho_mes = $anho_5 || lpad($mes_5, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes5,
    nvl( case when per.anho_mes = $anho_6 || lpad($mes_6, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes6,
    nvl( case when per.anho_mes = $anho_7 || lpad($mes_7, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes7,
    nvl( case when per.anho_mes = $anho_8 || lpad($mes_8, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes8,
    nvl( case when per.anho_mes = $anho_9 || lpad($mes_9, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes9,
    nvl( case when per.anho_mes = $anho_10 || lpad($mes_10, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes10,
    nvl( case when per.anho_mes = $anho_11 || lpad($mes_11, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes11,
    nvl( case when per.anho_mes = $anho_12  || lpad($mes_12, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes12,
    nvl( tab0.valor_liquidado * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_total

    from no_liquida_nomina tab0

    join no_concep_nomina concep
    on tab0.id_concep_nomina = concep.id_concep_nomina

    join no_periodo_v per
    on tab0.id_periodo = per.id_periodo
    
    $joinAgrup

    where
    1 = 1 
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc
    $whereTipoConcepto  

    and (
    per.fecha_ini between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
    or
    per.fecha_fin between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
    )

    $whereAgrup

)

group by
id_tipo_doc,
num_doc,
id_anhos_ini,
id_anhos_fin,
id_meses_ini,
id_meses_fin,
id_concep_nomina 

)
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);
    }

}
