<?php

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

    /**
     * Afiliacion completa
     * Genera para todos la afiliacion y retiro a la anterior que posean
     *
     * @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();

        /**
         * 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'];
            $id_clase_fondo = $request['id_clase_fondo'];
            $id_mae_fondos = $request['id_mae_fondos'];
            $fecha_ingreso = $request['fecha_ingreso'];
            $id_tipo_aporte = $request['id_tipo_aporte'];
            $id_tipo_aporte_sql = 0;
            $fecha_doc = $request['fecha_doc'];

            $num_afiliacion = '';
            if (isset($request['num_afiliacion'])) {
                $num_afiliacion = $request['num_afiliacion'];
            }
            $numero_doc = '';
            if (isset($request['numero_doc'])) {
                $numero_doc = $request['numero_doc'];
            }
            $centro_trabajo = 'null';
            if (isset($request['centro_trabajo'])) {
                $centro_trabajo = $request['centro_trabajo'];
            }
            $riesgo = 'null';
            if (isset($request['riesgo'])) {
                $riesgo = $request['riesgo'];
            }
            
            //Incidente #3842 <-> Se agrega filtro de centro de operacion - 20160707
            $whereCenOp = ' ';
            if (isset($request['id_cen_op'])) {
                $whereCenOp = 'and tab.id_cen_op = ' . $request['id_cen_op'];
            }

            /**
             * Traer afiliaciones activas de la clase de fondo y funcionario
             * Solo personas activas en el periodo activo - 20151023
             */
            $sql = <<<EOD
select 
afi.* 
from no_afilia_fondo afi
where 
afi.estado = 1
and afi.id_clase_fondo = $id_clase_fondo

and afi.num_doc in (
    select distinct tab.num_doc from no_estado_func tab 
        where tab.periodo = $id_periodo 
        $whereCenOp 
)

order by
afi.num_doc 
EOD;

            $records = CN_TABLE::executeSQL($sql);
            
            foreach ($records as $value) {

                $id_tipo_doc = $value['id_tipo_doc'];
                $num_doc = $value['num_doc'];

                //Inactiva la afiliacion activa
                $sql = <<<EOD
update no_afilia_fondo 
set estado = 0, fecha_retiro = to_date( '$fecha_ingreso', 'yyyy-mm-dd') - 1
where
estado = 1
and id_tipo_doc = $id_tipo_doc
and num_doc = '$num_doc' 
and id_clase_fondo = $id_clase_fondo 
and fecha_retiro is null
EOD;
                //Ejecutar SQL
                $this->conn->execute($sql);

                /*
                 * Se traen las afiliaciones que estan anuladas 
                 * para tomar el ultimo registro se ordenan descendente el id_afilia_fondo - 20130507
                 */
                $sql = <<<EOD
SELECT id_mae_fondos, id_tipo_aporte
    from no_afilia_fondo
    where
estado = 0
and id_tipo_doc = $id_tipo_doc
and num_doc = '$num_doc' 
and id_clase_fondo = $id_clase_fondo 
and fecha_retiro is not null
order by id_afilia_fondo desc
EOD;

                $results = CN_TABLE::executeSQL($sql);

                if (count($results) > 0) {

                    $id_mae_fondos_sql = $results[0]['id_mae_fondos'];
                    $id_tipo_aporte_sql = $results[0]['id_tipo_aporte'];


                    //CONSULTO LOS CONCEPTOS QUE APLICAN DE ACUERDO A LOS FONDOS

                    $sql = "select descto.porcentaje_func AS PORCENTAJE, descto.rango_desde, descto.rango_hasta, foncon.id_concep_nomina
                      from no_descto_detalle descto
                      LEFT JOIN no_fondo_concepto foncon ON foncon.id_descuento_ss = descto.id_descuento_ss
                      where foncon.id_mae_fondos = $id_mae_fondos_sql and descto.id_tipo_aporte = $id_tipo_aporte_sql";

                    $results = CN_TABLE::executeSQL($sql);

                    //RECORRO LOS CONCEPTOS PARA VERIFICAR CUALES APLICAN TENIENDO EN CUENTA EL RANGO DE APLICACION (SMDLV)
                    foreach ($results as $conceptos) {

                        $rango_desde = $conceptos['rango_desde'];
                        $rango_hasta = $conceptos['rango_hasta'];

                        $sql = "select estado.*,
                            (
                            select salario.valor_mensual 
                            from no_smdlv salario
                            join no_param_gen param ON param.id_anhos = salario.vigencia
                            ) AS SALARIO
                          from no_concepto_func estado
                          join no_param_concep parametros ON parametros.id_concep_basica = estado.id_concep_nomina
                          where estado.estado=1 and estado.actual=1 and estado.id_tipo_doc = $id_tipo_doc and estado.num_doc='$num_doc'";

                        $results = CN_TABLE::executeSQL($sql);
                        $asignacion_basica = $results[0]['valor'];
                        $salario = $results[0]['valor'];
                        $num_salarios = round($asignacion_basica / $salario, 2);

                        $id_concepto = $conceptos['id_concep_nomina'];

                        if ($num_salarios >= $rango_desde && $num_salarios <= $rango_hasta) {

                            //solo registros activos
                            $sql = <<<EOD
UPDATE NO_CONCEPTO_FUNC SET ESTADO = 0, ACTUAL = 0, FECHA_HASTA = to_date('$fecha_ingreso','YYYY-MM-DD') - 1
   WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
       and ID_CONCEP_NOMINA = $id_concepto and ESTADO = 1
EOD;
                            //Ejecutar SQL
                            $this->conn->execute($sql);

                            /*
                             * Actualizacion de no_concepto_periodo - 20130319
                             * Se elimina registro en vez de actualizar solo la fecha, para evitar repeticion de fondos en un periodo
                             */
                            $sql = <<<EOD
delete from NO_CONCEPTO_PERIODO 
where id_concepto_periodo in (
  select tab.id_concepto_periodo FROM NO_CONCEPTO_PERIODO tab
  join no_periodo per 
  on tab.PERIODO = per.id_periodo
   WHERE tab.ID_TIPO_DOC = $id_tipo_doc AND tab.NUM_DOC = $num_doc 
       and tab.ID_CONCEP_NOMINA = $id_concepto AND tab.PERIODO = $id_periodo
       and to_date('$fecha_ingreso','YYYY-MM-DD') between per.fecha_ini and per.fecha_fin
) 
EOD;
                            //Ejecutar SQL
                            $this->conn->execute($sql);
                        }
                    }
                }

                /**
                 * Mantiene el tipo de aporte si posee registro anterior
                 */
                if ($id_tipo_aporte_sql == 0) {
                    $id_tipo_aporte_sql = $id_tipo_aporte;
                }


                /**
                 * Registrar nueva afiliacion
                 */
                $sql = <<<EOD
Insert into NO_AFILIA_FONDO (ID_AFILIA_FONDO,ID_TIPO_DOC,NUM_DOC,ID_CLASE_FONDO,ID_MAE_FONDOS,NUM_AFILIACION,NUMERO_DOC,
FECHA_DOC,FECHA_INGRESO,FECHA_RETIRO,ID_TIPO_APORTE,CENTRO_TRABAJO,RIESGO,ESTADO,ID_PERIODO) 
values (null,$id_tipo_doc,'$num_doc',$id_clase_fondo,$id_mae_fondos,'$num_afiliacion','$numero_doc',
to_date('$fecha_doc','yyyy-mm-dd'),to_date('$fecha_ingreso','yyyy-mm-dd'),null,$id_tipo_aporte_sql,
    $centro_trabajo,$riesgo,1,$id_periodo)  
EOD;
                $this->conn->execute($sql);



                //CONSULTO LOS CONCEPTOS QUE APLICAN DE ACUERDO A LOS FONDOS

                $sql = "select descto.porcentaje_func AS PORCENTAJE, descto.rango_desde, descto.rango_hasta, foncon.id_concep_nomina, connom.id_tipo_concepto
                      from no_descto_detalle descto
                      LEFT JOIN no_fondo_concepto foncon ON foncon.id_descuento_ss = descto.id_descuento_ss
                      left join no_concep_nomina connom on foncon.id_concep_nomina = connom.id_concep_nomina
                      where foncon.id_mae_fondos = $id_mae_fondos and descto.id_tipo_aporte = $id_tipo_aporte_sql";

                $results = CN_TABLE::executeSQL($sql);

                //RECORRO LOS CONCEPTOS PARA VERIFICAR CUALES APLICAN TENIENDO EN CUENTA EL RANGO DE APLICACION (SMDLV)

                foreach ($results as $conceptos) {

                    $rango_desde = $conceptos['rango_desde'];
                    $rango_hasta = $conceptos['rango_hasta'];

                    $sql = "select estado.*,
                            (
                            select salario.valor_mensual 
                            from no_smdlv salario
                            join no_param_gen param ON param.id_anhos = salario.vigencia
                            ) AS SALARIO
                          from no_concepto_func estado
                          join no_param_concep parametros ON parametros.id_concep_basica = estado.id_concep_nomina
                          where estado.estado = 1 and estado.actual = 1 and estado.id_tipo_doc = $id_tipo_doc and estado.num_doc='$num_doc'";

                    $results = CN_TABLE::executeSQL($sql);

                    $asignacion_basica = $results[0]['valor'];
                    $salario = $results[0]['valor'];
                    $num_salarios = round($asignacion_basica / $salario, 2);
                    $id_concepto = $conceptos['id_concep_nomina'];
                    $id_tipo_concepto = $conceptos['id_tipo_concepto'];
                    $porcentaje = $conceptos['porcentaje'];

                    if ($num_salarios >= $rango_desde && $num_salarios <= $rango_hasta) {

                        //CREO EL REGISTRO EN LA TABLA NO_CONCEPTO_FUNC

                        if ($fecha_ingreso != "" && $id_tipo_concepto != 4) {

                            $sql = <<<EOD
            INSERT INTO NO_CONCEPTO_FUNC (ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,PORCENTAJE,ESTADO,ACTUAL,FECHA_DESDE,FECHA_HASTA)
                VALUES($id_tipo_doc,$num_doc,$id_concepto,$porcentaje,1,1,to_date('$fecha_ingreso','YYYY-MM-DD'),null)
EOD;
                        } elseif ($id_tipo_concepto != 4) {
                            $sql = <<<EOD
            INSERT INTO NO_CONCEPTO_FUNC (ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,PORCENTAJE,ESTADO,ACTUAL,FECHA_DESDE)
                VALUES($id_tipo_doc,$num_doc,$id_concepto,$porcentaje,1,1,to_date('$fecha_ingreso','YYYY-MM-DD'))
EOD;
                        }
                        $this->conn->execute($sql);

                        if ($id_tipo_concepto != 4) {
                            $sql = <<<EOD
            SELECT * FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo 
EOD;
                            $results = CN_TABLE::executeSQL($sql);
                            $parametros = CN_TABLE::executeSQL($sql);
                            $id_anhos = $parametros[0]['id_anhos'];
                            $id_meses = $parametros[0]['id_meses'];
                            $id_periodo = $parametros[0]['id_periodo'];
                            $id_tipo_periodo = $results[0]['id_tipo_periodo'];

                            $sql = <<<EOD
            SELECT * FROM NO_TIPO_PERIODO WHERE ID_TIPO_PERIODO = $id_tipo_periodo 
EOD;
                            $results = CN_TABLE::executeSQL($sql);

                            $num_dias = $results[0]['no_dias_mes'];


                            $this->conn->execute($sql);

                            /**
                             * NOM-93 :: SGC-Validar registro en concepto periodo - 20150331
                             */
                            $sql = <<<EOD
select per.* from no_periodo per 
     WHERE 
     per.id_periodo = $id_periodo
       and to_date('$fecha_ingreso','YYYY-MM-DD') between per.fecha_ini and per.fecha_fin
EOD;
                            $results_aplica = CN_TABLE::executeSQL($sql);

                            if (count($results_aplica) > 0) {
                                $aplica_insert = true;
                            } else {
                                $aplica_insert = false;
                            }

                            /*
                             * ($num_dias - TO_NUMBER(to_char(to_date('$fecha_ingre','YYYY-MM-DD'),'DD')))+1
                             * validar nuevo registros - 20150331
                             */
                            if ($aplica_insert && $id_tipo_concepto != 4) {
                                $sql = <<<EOD
INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,PORCENTAJE,NUM_DIAS)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,$id_concepto,
        to_date('$fecha_ingreso','YYYY-MM-DD'),last_day(to_date('$fecha_ingreso','YYYY-MM-DD')),
            $porcentaje, $num_dias)
EOD;
                                $this->conn->execute($sql);
                            }
                        }
                    }
                }
            }

            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[afiliacion_completa] Afiliació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 = "[afiliacion_completa] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[afiliacion_completa] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

}
