<?php

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

    protected $table_names = array(
        'COM_PLAN_COMISIONADOS_PLACOM_V',
        'TRANSPORTES',
        'REGIONALES',
        'COM_TIPO_COMISIONADO'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'TRANSPORTES' =>
        array(
            'id_transporte-id' => 'COM_PLAN_COMISIONADOS_PLACOM_V'
        ),
        'REGIONALES' =>
        array(
            'codreg' => 'COM_PLAN_COMISIONADOS_PLACOM_V'
        ),
        'COM_TIPO_COMISIONADO' =>
        array(
            'tipter' => 'COM_PLAN_COMISIONADOS_PLACOM_V'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'COM_PLAN_COMISIONADOS_PLACOM_V' =>
        array(
            'num_doc' => 'num_doc',
            'razsoc' => 'razsoc',
            'num_doc,||, - ,||,razsoc' => 'completo_ter',
            'tipter_ter' => 'tipter_ter',
            'tipoter_text' => 'tipoter_text',
            'tipter_ter,||, - ,||,tipoter_text' => 'completo_tipter',
            'nitocc' => 'nitocc',
            'id_plan_comisiones' => 'id_plan_comisiones',
            'vigencia' => 'vigencia',
            'id_transporte' => 'id_transporte',
            'sueldo' => 'sueldo',
            'cargo' => 'cargo',
            'fecha_salida' => 'fecha_salida',
            'dias' => 'dias',
            'codreg' => 'codreg',
            'total_comision' => 'total_comision',
            'estado' => 'estado',
            'fecha_regreso' => 'fecha_regreso',
            'gastos_taxis' => 'gastos_taxis',
            'dias_manu' => 'dias_manu',
            'tipter' => 'tipter',
            'codobj' => 'codobj',
            'valor' => 'valor',
            'valor_gasto' => 'valor_gasto',
            'viaticos' => 'viaticos',
            'acumulado_gastos' => 'acumulado_gastos',
            'taxis' => 'taxis',
            'tarifa' => 'tarifa',
            'dias_tiempo' => 'dias_tiempo',
            'hora_salida' => 'hora_salida',
            'hora_regreso' => 'hora_regreso',
            'hora_salida_sel' => 'hora_salida_sel',
            'hora_regreso_sel' => 'hora_regreso_sel'
        ),
        'TRANSPORTES' =>
        array(
            'descripcion' => 'descripcion_trans'
        ),
        'REGIONALES' =>
        array(
            'desreg' => 'desreg',
            'abreviatura' => 'abreviatura'
        ),
        'COM_TIPO_COMISIONADO' =>
        array(
            'descripcion' => 'tipo_comisionado'
        )
    ); //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
     *
     * _filtroNull / para filtro de not null o null - type debe ser is - para todas las variables
     * TYPE NULL / para filtro de not null o null con el valor de campo desde gwt
     * EJEMPLO: 'titular' => array('NULL' => array('titular')),
     *
     * rownum,start - rownum,end / estos campos para uso del Grid live GWT, numero fijo de filas de consulta
     */
    protected $table_field_conditions = array(
        'COM_PLAN_COMISIONADOS_PLACOM_V' => array(
            'id_plan_comisiones,a' => array('!=' => array(-1)),
            'id_plan_comisiones,b' => array('=' => array('id_plan_comisiones')),
            'num_doc' => array('=' => array('num_doc')),
            'vigencia' => array('=' => array('vigencia')),
            'programado' => array('=' => array('programado')),
            'id_transporte' => array('=' => array('id_transporte')),
            'codreg' => array('=' => array('codreg')),
            'tipter' => array('=' => array('tipter')),
            '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
    protected $table_field_or_conditions = array(
    ); // filtros de condicion or
//    protected $query_qualifier = 'DISTINCT'; //Variable para el sql para eliminar filas repetidas
    protected $fields_orderBy = array(
        'vigencia', 'id_plan_comisiones', 'tipoter_text', 'nitocc'
    ); //campos para el ordenamiento de la consulta
//    protected $table_field_obligatory = array('id_debito'); //campos obligatorios de filtro - estan en el request

    /*
     * Variables manejo de log
     */
    //true - consulta de administracion
    protected $is_admin = true;
    //si es servicio para filtro agregar campo
//    protected $filtro = 'Area';
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;



    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = null; //identificador de la tabla - solo si es un dato no llave compuesta
    protected $id_names = array('nitocc', 'id_plan_comisiones', 'vigencia'); //llave primaria
    protected $field_names = array('id_transporte', 'sueldo', 'cargo', 'fecha_salida',
        'dias', 'codreg', 'total_comision', 'estado', 'fecha_regreso', 'gastos_taxis',
        'dias_manu', 'tipter', 'dias_tiempo', 'hora_salida', 'hora_regreso', 'liquidar_via'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'COM_PLAN_COMISIONADOS_PLACOM'; //tabla en la cual se aplican los cambios
    protected $has_activo = true; //si posee campo en la tabla de nombre activo ---- ESTADO PARA REGALIAS - CARTERA
    protected $has_vigencia = false; //si posee vigencia
    protected $has_cen_op = false; //si posee centro de operacion
    protected $has_id_cia = false; //si posee compañia
    protected $has_secuencia = false; //si posee secuencia la tabla - true si es por tabla, false - trigger
//    protected $en_mayuscula = true; // si se pone, se puede poner en mayucula con true y en minuscula con false, de lo contrario la pone tal cual la BD

    /*
     * campos para fecha sistema
     */
//    protected $campo_fecha_sistema = array(
//        'fecha'
//    );

    /*
     * Manejo de registro log
     */
    protected $id_unico = 'id_plan_comisiones'; //identificador unico de la tabla
    //false - Registrar log para list - consultar
    protected $log_list = false;
    //false - Registrar log para add - update - remove
    protected $log_crud = false;

    /**
     * Construccion de observacion perzonalizada
     * 
     * Toda variable para tomarla del request con el formato:
     * &request-variable&
     * 
     * false - observacion por defecto
     *
     * @var string 
     */
    protected $observacion_list = false;
    protected $observacion_add = false;
    protected $observacion_update = false;
    protected $observacion_remove = false;

    // Validate
    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Add
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateAdd(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7)
         */
        $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;
                    }
                }
            }
            if ('entidad_nombre' == $routeName) {
                foreach ($routeData as $key => $value) {
                    //echo $value . "\n";
                    if ($key == 'value') {
                        $entidadNombre = $value;
                    }
                }
            }
            if ('correoEnvio' == $routeName) {
                foreach ($routeData as $key => $value) {
                    //echo $value . "\n";
                    if ($key == 'value') {
                        $correoEnvio = $value;
                    }
                }
            }
            if ('jasper_url' == $routeName) {
                foreach ($routeData as $key => $value) {
                    //echo $value . "\n";
                    if ($key == 'value') {
                        $url_jasper = $value;
                    }
                }
            }
            //$url_presup = "http://10.0.100.66/presupuesto/web/index.php/pr_resolucion_comis/";
            $int++;
        }

        /*
         *  Validar la operación, ya sea por SQL
         */
        //20190506 Validamos que la fecha de regreso de la comision sea al menos 3 dias antes de la fecha de 
        //finalizacion de contrato activo del contratista
        //ademas que el contratista tenga contrato activo en Radicacion Virtual de cuentas
        //Aplica solo cuando el tercero es contratista
        if ($request['tipter'] == "01") {

            $schema = "";
            if ($entidadCliente == "3") {
                $schema = "@WEBSAFI.ANM.LOCAL";
            }

            $numdoc = $request['num_doc'];
            $fecha = $request['fecha_regreso'];

            $sql = <<<EOD
select *
from rvc_contratista$schema tab1 
where tab1.num_doc='$numdoc' and tab1.omite_contrato = 0
EOD;

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


            if (count($records) > 0) {
                $sql = <<<EOD
select to_char(tab0.fecha_fin,'dd/mm/yyyy') as fecha_fin,
case when tab0.fecha_fin-3<to_date('$fecha','yyyy-mm-dd') then 'NO' else 'SI' end as fecha_valida
from rvc_contrato$schema tab0
left join rvc_contratista$schema tab1 on tab1.id_contratista=tab0.id_contratista
where tab0.estado=1 and tab1.num_doc='$numdoc'
EOD;

                $records = CN_TABLE::executeSQL($sql);
                if (count($records) > 0) {
                    $fecha_valida = $records[0]['fecha_valida'];
                    $fecha_fin_contrato = $records[0]['fecha_fin'];
                    if ($fecha_valida == "NO") {
                        $errors['mensaje'] = "El contrato del contratista termina el $fecha_fin_contrato, No puede programar una comision con fecha de regreso mayor a tres dias antes a la finalizacion del contrato.";
                        $errors['servicio'] = "com_plan_comisionados_placom";
                    }
                } else {
                    $errors['mensaje'] = "El contratista no tiene ningun contrato activo.";
                    $errors['servicio'] = "com_plan_comisionados_placom";
                }
            }
        }
        //$errors['mensaje'] = "ERROR DE PRUEBA";
        //$errors['servicio'] = "com_plan_comisionados_placom";
        $id_plan_comisiones = $request['id_plan_comisiones'];
        $vigencia = $request['vigencia'];
        //Obtenemos el Tipo de comision
        $sql = <<<EOD
select tipcomi
from com_plan_comisiones tab0
where id_plan_comisiones = $id_plan_comisiones and vigencia = $vigencia
EOD;

        $records = CN_TABLE::executeSQL($sql);
        $tipcomi = $records[0]['tipcomi'];
        if ($tipcomi != '07' and $tipcomi != '02') {//Si es emergencia o extraordinaria omitimos validacion de fecha del funcionario
            /**
             * Validacion para que el comisionado, no tenga en el mismo rango de fechas otra planeacion activa - 20190902
             */
            $schema_pgn = "";
            $schema_sgr = "";
            if ($entidadCliente == "2") {
                $schema_pgn = "";
                $schema_sgr = "@SGR.ANM.LOCAL";
            }
            if ($entidadCliente == "3") {
                $schema_pgn = "@WEBSAFI.ANM.LOCAL";
                $schema_sgr = "";
            }

            $numdoc = $request['num_doc'];
            $fecha_salida = $request['fecha_salida'];
            $fecha_regreso = $request['fecha_regreso'];
            $sql = <<<EOD
SELECT
0 as sgr 
FROM com_plan_comisionados_placom$schema_pgn tab0
left join (select tab0.id_plan_comisiones,tab0.vigencia,tab0.nitocc,tab1.id_resoluciones
from com_comisionados_resol_v$schema_pgn tab0
join pr_resoluciones$schema_pgn tab1 on tab0.id_resol_comis = tab1.id_resol_orig and tab1.id_tipo_resol = 2)tab1 
on tab0.ID_PLAN_COMISIONES=tab1.id_plan_comisiones and tab0.VIGENCIA = tab1.vigencia and tab0.NITOCC = tab1.nitocc
where
tab0.nitocc = '$numdoc' and tab0.estado = 1 
and (
    to_date('$fecha_salida','yyyy-mm-dd') BETWEEN tab0.fecha_salida and fecha_regreso
    or
    to_date('$fecha_regreso','yyyy-mm-dd') BETWEEN tab0.fecha_salida and fecha_regreso
) and tab1.id_resoluciones is null

union

SELECT
1 as sgr 
FROM com_plan_comisionados_placom$schema_sgr tab0
left join (select tab0.id_plan_comisiones,tab0.vigencia,tab0.nitocc,tab1.id_resoluciones
from com_comisionados_resol_v$schema_sgr tab0
join pr_resoluciones$schema_sgr tab1 on tab0.id_resol_comis = tab1.id_resol_orig and tab1.id_tipo_resol = 2)tab1 
on tab0.ID_PLAN_COMISIONES=tab1.id_plan_comisiones and tab0.VIGENCIA = tab1.vigencia and tab0.NITOCC = tab1.nitocc
where
tab0.nitocc = '$numdoc' and tab0.estado = 1 
and (
    to_date('$fecha_salida','yyyy-mm-dd') BETWEEN tab0.fecha_salida and fecha_regreso
    or
    to_date('$fecha_regreso','yyyy-mm-dd') BETWEEN tab0.fecha_salida and fecha_regreso
) and tab1.id_resoluciones is null
EOD;

            $records = CN_TABLE::executeSQL($sql);
            if (count($records) > 0) {
                $errors['mensaje'] = "El comisionado tiene comisiones programadas en el mismo rango de fechas($fecha_salida a $fecha_regreso), favor verificar.";
                $errors['servicio'] = "com_plan_comisionados_placom";
            }
        }
        
        //ticket 15704 Valida que el funcionario no tenga una legalizacion vencida
        /**
        * Validacion para que el comisionado, no tenga en el mismo rango de fechas otra planeacion activa - 20190902
        */
        $schema_pgn = "";
        $schema_sgr = "";
        if ($entidadCliente == "2") {
            $schema_pgn = "";
            $schema_sgr = "@SGR.ANM.LOCAL";
        }
        if ($entidadCliente == "3") {
            $schema_pgn = "@WEBSAFI.ANM.LOCAL";
            $schema_sgr = "";
        }
        $numdoc = $request['num_doc'];
        $dias_para_legalizar = 3;
        $sql = <<<EOD
SELECT DISTINCT 
tab.dias as dias_com,
tab.fecha_salida,
tab.fecha_regreso,
dias_habiles ( trunc(tab.fecha_regreso) , $dias_para_legalizar) as fecha_tope_legalizacion,
tab.nitocc,
prrpc.ID as ID_PR_RP_COMIS, 
prrpc.id_comision as COMISION,
prrpc.FECHA_PROCESO as FECHA_REGISTRO,
tipco.DESCOMI as DESCOMI,
prresol.FECHA_FUNCIONARIO as FEC_FUN,
prresol.FECHA_COMISIONADO as FEC_COM, 
prresol.RESOLUCION as RESOLU,
area.descripcion as area, 
avan.dias_comi as DIASC, 
avan.fecha_ini_comi as FEC_SAL_C,
case when com.interrupcion=1 then 'I' else '' end as interr

FROM PR_RP_COMIS$schema_pgn prrpc

left join (
  SELECT
   aut.*,
   ROW_NUMBER() OVER (
    partition by aut.id_rp_comis
    ORDER BY aut.fecha_proceso desc, id_cierre_comision desc
   ) AS rn
  from PR_CIERRE_COMISION$schema_pgn aut
)tab1
on prrpc.id=tab1.id_rp_comis and prrpc.id_vigencia=tab1.id_vigencia and prrpc.vigencia= tab1.vigencia
and tab1.rn = 1

left join (
    select 
    tab.id_comision,
    tab.nitocc,
    min(tab.fecha_salida) as fecha_salida,
    sum(tab.dias) as dias,
    max(tab.fecha_regreso) as fecha_regreso,
    tab.vigencia
    from (
    
        select 
        complan.id_comision,
        complan.nitocc,
        complan.fecha_salida,
        complan.dias,
        complan.fecha_regreso,
        complan.vigencia
        from comisionados_planta$schema_pgn complan
        where
        complan.estado = 1
    
        union
        
        select 
        comcont.id_comision,
        comcont.nitocc,
        comcont.fecha_salida,
        comcont.dias,
        comcont.fecha_regreso,
        comcont.vigencia
        from comisionados_contrato$schema_pgn comcont
        where
        comcont.estado = 1
        
    )tab
    
    group by
    tab.id_comision,
    tab.nitocc,
    tab.vigencia
)tab
on tab.nitocc=prrpc.id_tercero and tab.id_comision=prrpc.id_comision and tab.vigencia=prrpc.vigencia



JOIN COMISIONES$schema_pgn com ON prrpc.vigencia = com.vigencia AND prrpc.id_comision = com.id
JOIN TIPOS_COMISION$schema_pgn tipco ON com.TIPCOMI = tipco.TIPCOMI
LEFT JOIN PR_RESOL_COMIS$schema_pgn prresol ON prrpc.NO_ACTO_ADMIN = prresol.id 
JOIN PR_RP_COMPROMISO$schema_pgn prrpcomp ON prrpc.ID = prrpcomp.ID_RP AND prrpc.ID_VIGENCIA = prrpcomp.ID_VIGENCIA AND prrpc.VIGENCIA = prrpcomp.VIGENCIA
JOIN PROYECTOS$schema_pgn pro ON pro.codigo = com.codpro and pro.ano_fiscal = com.vigencia
JOIN AREAS$schema_pgn area ON pro.id_area_lider = area.id_area
LEFT JOIN PR_AVANCES_COMISIONES$schema_pgn avan ON prrpc.id = avan.id_rp_comis and prrpc.id_vigencia = avan.id_vigencia and prrpc.vigencia = avan.vigencia

LEFT JOIN(
    select legal.id_rp_comis as id, legal.id_vigencia, legal.vigencia, ter.num_doc, sum(legal.v_bruto) as valor
    from PR_LEGALIZACION_COMIS$schema_pgn legal
    join INTERCEROS$schema_pgn ter ON legal.id_tercero = ter.id_mae_ter
    group by legal.id_rp_comis, legal.id_vigencia, legal.vigencia, ter.num_doc 
)legal ON legal.id =  prrpc.id
and legal.num_doc = ''||prrpc.id_tercero
and legal.id_vigencia = prrpc.id_vigencia
and prrpc.vigencia = legal.vigencia


WHERE 
prrpc.ESTADO = 1 
and prrpc.vigencia>2019                
and dias_habiles ( trunc(tab.fecha_regreso) , $dias_para_legalizar) <= sysdate
and avan.ID_AVANCES_COMISIONES is null
and tab.nitocc = '$numdoc'
                
union
                
SELECT DISTINCT 
tab.dias as dias_com,
tab.fecha_salida,
tab.fecha_regreso,
dias_habiles ( trunc(tab.fecha_regreso) , $dias_para_legalizar) as fecha_tope_legalizacion,
tab.nitocc,
prrpc.ID as ID_PR_RP_COMIS, 
prrpc.id_comision as COMISION,
prrpc.FECHA_PROCESO as FECHA_REGISTRO,
tipco.DESCOMI as DESCOMI,
prresol.FECHA_FUNCIONARIO as FEC_FUN,
prresol.FECHA_COMISIONADO as FEC_COM, 
prresol.RESOLUCION as RESOLU,
area.descripcion as area, 
avan.dias_comi as DIASC, 
avan.fecha_ini_comi as FEC_SAL_C,
case when com.interrupcion=1 then 'I' else '' end as interr

FROM PR_RP_COMIS$schema_sgr prrpc

left join (
  SELECT
   aut.*,
   ROW_NUMBER() OVER (
    partition by aut.id_rp_comis
    ORDER BY aut.fecha_proceso desc, id_cierre_comision desc
   ) AS rn
  from PR_CIERRE_COMISION$schema_sgr aut
)tab1
on prrpc.id=tab1.id_rp_comis and prrpc.id_vigencia=tab1.id_vigencia and prrpc.vigencia= tab1.vigencia
and tab1.rn = 1

left join (
    select 
    tab.id_comision,
    tab.nitocc,
    min(tab.fecha_salida) as fecha_salida,
    sum(tab.dias) as dias,
    max(tab.fecha_regreso) as fecha_regreso,
    tab.vigencia
    from (
    
        select 
        complan.id_comision,
        complan.nitocc,
        complan.fecha_salida,
        complan.dias,
        complan.fecha_regreso,
        complan.vigencia
        from comisionados_planta$schema_sgr complan
        where
        complan.estado = 1
    
        union
        
        select 
        comcont.id_comision,
        comcont.nitocc,
        comcont.fecha_salida,
        comcont.dias,
        comcont.fecha_regreso,
        comcont.vigencia
        from comisionados_contrato$schema_sgr comcont
        where
        comcont.estado = 1
        
    )tab
    
    group by
    tab.id_comision,
    tab.nitocc,
    tab.vigencia
)tab
on tab.nitocc=prrpc.id_tercero and tab.id_comision=prrpc.id_comision and tab.vigencia=prrpc.vigencia



JOIN COMISIONES$schema_sgr com ON prrpc.vigencia = com.vigencia AND prrpc.id_comision = com.id
JOIN TIPOS_COMISION$schema_sgr tipco ON com.TIPCOMI = tipco.TIPCOMI
LEFT JOIN PR_RESOL_COMIS$schema_sgr prresol ON prrpc.NO_ACTO_ADMIN = prresol.id 
JOIN PR_RP_COMPROMISO$schema_sgr prrpcomp ON prrpc.ID = prrpcomp.ID_RP AND prrpc.ID_VIGENCIA = prrpcomp.ID_VIGENCIA AND prrpc.VIGENCIA = prrpcomp.VIGENCIA
JOIN PROYECTOS$schema_sgr pro ON pro.codigo = com.codpro and pro.ano_fiscal = com.vigencia
JOIN AREAS$schema_sgr area ON pro.id_area_lider = area.id_area
LEFT JOIN PR_AVANCES_COMISIONES$schema_sgr avan ON prrpc.id = avan.id_rp_comis and prrpc.id_vigencia = avan.id_vigencia and prrpc.vigencia = avan.vigencia

LEFT JOIN(
    select legal.id_rp_comis as id, legal.id_vigencia, legal.vigencia, ter.num_doc, sum(legal.v_bruto) as valor
    from PR_LEGALIZACION_COMIS$schema_sgr legal
    join INTERCEROS$schema_sgr ter ON legal.id_tercero = ter.id_mae_ter
    group by legal.id_rp_comis, legal.id_vigencia, legal.vigencia, ter.num_doc 
)legal ON legal.id =  prrpc.id
and legal.num_doc = ''||prrpc.id_tercero
and legal.id_vigencia = prrpc.id_vigencia
and prrpc.vigencia = legal.vigencia


WHERE 
prrpc.ESTADO = 1 
and prrpc.vigencia>2019                
and dias_habiles ( trunc(tab.fecha_regreso) , $dias_para_legalizar) <= sysdate
and avan.ID_AVANCES_COMISIONES is null
and tab.nitocc = '$numdoc'                
                
EOD;
        $records = CN_TABLE::executeSQL($sql);
        if (count($records) > 0 && $tipcomi != "07") {
            $errors['mensaje'] = "El comisionado tiene comisiones pendientes de legalizar , favor verificar.";
            $errors['servicio'] = "com_plan_comisionados_placom";
        }

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Update
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateUpdate(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7)
         */
        $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;
                    }
                }
            }
            if ('entidad_nombre' == $routeName) {
                foreach ($routeData as $key => $value) {
                    //echo $value . "\n";
                    if ($key == 'value') {
                        $entidadNombre = $value;
                    }
                }
            }
            if ('correoEnvio' == $routeName) {
                foreach ($routeData as $key => $value) {
                    //echo $value . "\n";
                    if ($key == 'value') {
                        $correoEnvio = $value;
                    }
                }
            }
            if ('jasper_url' == $routeName) {
                foreach ($routeData as $key => $value) {
                    //echo $value . "\n";
                    if ($key == 'value') {
                        $url_jasper = $value;
                    }
                }
            }
            //$url_presup = "http://10.0.100.66/presupuesto/web/index.php/pr_resolucion_comis/";
            $int++;
        }


        /*
         * Variables request
         */
        /**
         * Validacion para que el comisionado, no tenga en el mismo rango de fechas otra planeacion activa - 20190902
         */
        $schema_pgn = "";
        $schema_sgr = "";
        if ($entidadCliente == "2") {
            $schema_pgn = "";
            $schema_sgr = "@SGR.ANM.LOCAL";
        }
        if ($entidadCliente == "3") {
            $schema_pgn = "@WEBSAFI.ANM.LOCAL";
            $schema_sgr = "";
        }

        $id_plan_comisiones = $request['id_plan_comisiones'];
        $vigencia = $request['vigencia'];
        //Obtenemos el Tipo de comision
        $sql = <<<EOD
select tipcomi
from com_plan_comisiones tab0
where id_plan_comisiones = $id_plan_comisiones and vigencia = $vigencia
EOD;

        $records = CN_TABLE::executeSQL($sql);
        $tipcomi = $records[0]['tipcomi'];
        
        if ($tipcomi != '07' and $tipcomi != '02') {//Si es emergencia omitimos validacion de fecha del funcionario
            $numdoc = $request['num_doc'];
            $fecha_salida = $request['fecha_salida'];
            $fecha_regreso = $request['fecha_regreso'];
            $sql = <<<EOD
SELECT
0 as sgr 
FROM com_plan_comisionados_placom$schema_pgn tab0
                left join (select tab0.id_plan_comisiones,tab0.vigencia,tab0.nitocc,tab1.id_resoluciones
from com_comisionados_resol_v$schema_pgn tab0
join pr_resoluciones$schema_pgn tab1 on tab0.id_resol_comis = tab1.id_resol_orig and tab1.id_tipo_resol = 2)tab1 
on tab0.ID_PLAN_COMISIONES=tab1.id_plan_comisiones and tab0.VIGENCIA = tab1.vigencia and tab0.NITOCC = tab1.nitocc
where
tab0.nitocc = '$numdoc' and tab0.estado = 1 
and tab0.id_plan_comisiones != $id_plan_comisiones and tab0.vigencia = $vigencia 
and (
    to_date('$fecha_salida','yyyy-mm-dd') BETWEEN tab0.fecha_salida and fecha_regreso
    or
    to_date('$fecha_regreso','yyyy-mm-dd') BETWEEN tab0.fecha_salida and fecha_regreso
) and tab1.id_resoluciones is null

union

SELECT
1 as sgr 
FROM com_plan_comisionados_placom$schema_sgr tab0
left join (select tab0.id_plan_comisiones,tab0.vigencia,tab0.nitocc,tab1.id_resoluciones
from com_comisionados_resol_v$schema_sgr tab0
join pr_resoluciones$schema_sgr tab1 on tab0.id_resol_comis = tab1.id_resol_orig and tab1.id_tipo_resol = 2)tab1 
on tab0.ID_PLAN_COMISIONES=tab1.id_plan_comisiones and tab0.VIGENCIA = tab1.vigencia and tab0.NITOCC = tab1.nitocc
where
tab0.nitocc = '$numdoc' and tab0.estado = 1 
and tab0.id_plan_comisiones != $id_plan_comisiones and tab0.vigencia = $vigencia 
and (
    to_date('$fecha_salida','yyyy-mm-dd') BETWEEN tab0.fecha_salida and fecha_regreso
    or
    to_date('$fecha_regreso','yyyy-mm-dd') BETWEEN tab0.fecha_salida and fecha_regreso
)  and tab1.id_resoluciones is null
EOD;

            $records = CN_TABLE::executeSQL($sql);
            if (count($records) > 0) {
                $errors['mensaje'] = "El comisionado tiene comisiones programadas en el mismo rango de fechas($fecha_salida a $fecha_regreso), favor verificar.";
                $errors['servicio'] = "com_plan_comisionados_placom";
            }
        }

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Remove
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateRemove(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Acciones anteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function preprocessRequest($Action, sfWebRequest $request) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a preprocessRequest");

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            $request['nitocc'] = $request['num_doc'];
        }

        //accion update
        if ($Action == "UPDATE") {
            $request['nitocc'] = $request['num_doc'];
        }

        //accion remove
        if ($Action == "REMOVE") {
            $request['nitocc'] = $request['num_doc'];
        }

        return $request;
    }

    /**
     * Acciones posteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function postprocessRequest($Action, sfWebRequest $request, $list_data_post) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a postprocessRequest - " . $list_data_post);

        /*
         * Procesar Request
         */
        //accion add
        //20190723 Se redondean todos los valores calculados al entero menor mas cercano 
        if ($Action == "ADD") {


            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();

            $id_plan_comisiones = $request['id_plan_comisiones'];
            $vigencia = $request['vigencia'];

            $nitocc = $request['nitocc'];
            $id_transporte = $request['id_transporte'];

            $liquidar_via = $request['liquidar_via'];
            $tipter = $request['tipter'];
            $sueldo = $request['sueldo'];
            $dias = $request['dias'];

            //Genera objetos gasto segun la planeacion de comision
            if ($liquidar_via == 'true') {

                //mirar si es de 02-planta o 01-contrato - 20130625 actualizar
                if ($tipter == '01') {
                    $sueldo = round($sueldo * 70 / 100);
                }

                $sql = <<<EOD
select * from com_tipo_comisionado where tipter = '$tipter' 
EOD;

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

                $id_tipo_comisionado = $tipo_tarifa = $records[0]['id_tipo_comisionado'];

                $sql = <<<EOD
select 
* 
from nviatico
where
tipo_tarifa = $tipo_tarifa
and '$sueldo' between rango1 and rango2 
and estado = 1 
EOD;

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

                if (count($records_tarifa) > 0) {
                    $viaticoa = $records_tarifa[0]['viaticoa'];
                    $viaticob = $records_tarifa[0]['viaticob'];
                } else {
                    $viaticoa = 0;
                    $viaticob = 0;
                }

                //si algo segun tarifa
                $tarifa = $viaticoa;

                //calculo viaticos
                $viaticos = floor($tarifa * $dias);

                //calculo taxis 
                $sql = <<<EOD
select nvl(sum(tardes.total),0) as total
from com_plan_tarifas_destino tardes
left join transportes trans
on trans.id = tardes.id_transporte
where
tardes.id_plan_comisiones = $id_plan_comisiones
and tardes.vigencia = $vigencia
and tardes.nitocc = '$nitocc'
--and trans.id_objeto_gasto is null 
and trans.aplica_tarifa_taxis = 1 
EOD;

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

                $taxis = $records_taxi[0]['total'];

                $observaciones = '';
                if ($taxis > 0) {
                    $observaciones = '$' . $taxis . ' para taxis. ';
                }

                //valor total
                $valor = floor($viaticos + $taxis);

                //Obtener id_obj_gasto por tipter si esta parametrizado - 20190801
                //campo id_tipo_comisionado = 0, para que tome tanto comisionado como funcionario viaticos - 20191217
                $sql = <<<EOD
SELECT
    *
FROM objetos_gasto_v
where
viatico = 1
and ano_fiscal = $vigencia
and ( id_tipo_comisionado = $id_tipo_comisionado or id_tipo_comisionado = 0 )
order by
codigo desc     
EOD;
                //ejecuta el sql
                $records = CN_TABLE::executeSQL($sql);
                if (count($records) > 0) {
                    $codobj = $records[0]['codigo'];
                    $id_obj_gasto = $records[0]['id'];
                } else {
                    $codobj = '06';
                    $id_obj_gasto = 100;
                }

                $sql = <<<EOD
Insert into COM_PLAN_COMISIONADOS_OBJS (NITOCC,CODOBJ,ID_PLAN_COMISIONES,VIGENCIA,
    VALOR,ESTADO,OBSERVACIONES,VIATICOS,TAXIS,TARIFA,ID_OBJ_GASTO) 
values ('$nitocc','$codobj','$id_plan_comisiones','$vigencia',
    '$valor','1','$observaciones','$viaticos','$taxis','$tarifa','$id_obj_gasto') 
EOD;

                //ejecutar sql
                $this->conn->execute($sql);
            }

            //Genera destinos segun la planeacion de comision
            //20190409 se generan los destinos con estado inactivo
            $sql = <<<EOD
insert into com_plan_destinos_comisionados
select
$nitocc as nitocc,
id_plan_comisiones as id_plan_comisiones,
vigencia as vigencia,
codmun as codmun,
orden as orden,
0 as estado,
$id_transporte as id_transporte
 
from com_plan_destinos

where
id_plan_comisiones = $id_plan_comisiones
and vigencia = $vigencia 
EOD;

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

            $this->conn->commit();
        }

        //accion update
        if ($Action == "UPDATE") {

            //
            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();

            $id_plan_comisiones = $request['id_plan_comisiones'];
            $vigencia = $request['vigencia'];

            $nitocc = $request['nitocc'];
            $id_transporte = $request['id_transporte'];

            $liquidar_via = $request['liquidar_via'];
            $tipter = $request['tipter'];
            $sueldo = $request['sueldo'];
            $dias = $request['dias'];

            //mirar si es de 02-planta o 01-contrato - 20130625 actualizar
            if ($tipter == '01') {
                $sueldo = round($sueldo * 70 / 100);
            }

            $sql = <<<EOD
select * from com_tipo_comisionado where tipter = '$tipter' 
EOD;

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

            $id_tipo_comisionado = $tipo_tarifa = $records[0]['id_tipo_comisionado'];


            //Obtener id_obj_gasto por tipter si esta parametrizado - 20190801
            //campo id_tipo_comisionado = 0, para que tome tanto comisionado como funcionario viaticos - 20191217
            $sql = <<<EOD
SELECT
    *
FROM objetos_gasto_v
where
viatico = 1
and ano_fiscal = $vigencia
and ( id_tipo_comisionado = $id_tipo_comisionado or id_tipo_comisionado = 0 )
order by
codigo desc     
EOD;
            //ejecuta el sql
            $records = CN_TABLE::executeSQL($sql);
            if (count($records) > 0) {
                $codobj = $records[0]['codigo'];
                $id_obj_gasto = $records[0]['id'];
            } else {
                $codobj = '06';
                $id_obj_gasto = 100;
            }

            //borra si tenia y crea nuevo
            $sql = <<<EOD
delete from
COM_PLAN_COMISIONADOS_OBJS 
where
id_plan_comisiones = $id_plan_comisiones
and vigencia = $vigencia  
and nitocc = '$nitocc'   
and codobj = '$codobj'   
EOD;

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

            //Genera objetos gasto segun la planeacion de comision
            if ($liquidar_via == 'true') {

                $viaticoa = 0;
                $viaticob = 0;

                //sentencia SQL
                $sql = <<<EOD
select 
* 
from nviatico
where
tipo_tarifa = $tipo_tarifa
and '$sueldo' between rango1 and rango2 
and estado = 1 
EOD;

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

                if (count($records_tarifa) > 0) {
                    $viaticoa = $records_tarifa[0]['viaticoa'];
                    $viaticob = $records_tarifa[0]['viaticob'];
                }

                /**
                 * Verificar si la persona tiene trasnporte con tiquete aereo - 20190902
                 */
                $sql = <<<EOD
SELECT
    *
FROM com_plan_tarifas_destino_v
where
nitocc = '$nitocc'
and id_plan_comisiones = $id_plan_comisiones
and vigencia = $vigencia 
and aplica_tiquete = 1 
order by
tope_max desc  
EOD;

                $records_tarifa_tiq = CN_TABLE::executeSQL($sql);
                $tarifa_tiquete = 0;
                $viatico_tiquete = 0;
                $cant_dia_sal = 0;
                $cant_dia_reg = 0;
                if (count($records_tarifa_tiq) > 0) {
                    $logger->info("Verificar si la persona tiene trasnporte con tiquete aereo");

                    $tarifa_tiquete = $viaticoa;

                    /**
                      1. Cuando el comisionado pernocte el sistema liquidará un día de viáticos
                      2. Cuando el comisionado no pernocte el sistema liquidará 0.5 días de la tarifa del viático.
                      3. Cuando el comisionado registre la hora de salida del primer día de su comisión después de las 11:00 am, y pernocte el sistema le liquidará 0.5 días del viático.
                      4. Cuando el comisionado registre la hora de regreso del último día de su comisión antes de las 4:30 pm, el sistema le liquidará 0.5 días del viático.
                     */
                    $sql = <<<EOD
SELECT

fecha_salida as fecha_salida,
fecha_regreso as fecha_regreso,
(fecha_regreso - fecha_salida) as dif,
case when (fecha_regreso - fecha_salida) >= 1 then 1 else 0 end as si_pernocta,

case 
when hora_salida is null and (fecha_regreso - fecha_salida) >= 1 then 1
when hora_salida is null and (fecha_regreso - fecha_salida) <= 0 then 0.5
when to_date(to_char(fecha_salida,'yyyy-mm-dd') || ' ' || hora_salida,'yyyy-mm-dd hh24:mi') <= to_date(to_char(fecha_salida,'yyyy-mm-dd') || ' 11:00','yyyy-mm-dd hh24:mi') and (fecha_regreso - fecha_salida) >= 1 then 1
when to_date(to_char(fecha_salida,'yyyy-mm-dd') || ' ' || hora_salida,'yyyy-mm-dd hh24:mi')  > to_date(to_char(fecha_salida,'yyyy-mm-dd') || ' 11:00','yyyy-mm-dd hh24:mi') and (fecha_regreso - fecha_salida) >= 1 then 0.5 
when hora_salida is not null and (fecha_regreso - fecha_salida) <= 0 then 0.5
else 0 end as cant_dia_sal,

case 
when hora_regreso is null and (fecha_regreso - fecha_salida) >= 1 then 0.5
when hora_regreso is null and (fecha_regreso - fecha_salida) <= 0 then 0
when to_date(to_char(fecha_regreso,'yyyy-mm-dd') || ' ' || hora_regreso,'yyyy-mm-dd hh24:mi') <= to_date(to_char(fecha_regreso,'yyyy-mm-dd') || ' 16:30','yyyy-mm-dd hh24:mi') and (fecha_regreso - fecha_salida) >= 1 then 0.5
when to_date(to_char(fecha_regreso,'yyyy-mm-dd') || ' ' || hora_regreso,'yyyy-mm-dd hh24:mi')  > to_date(to_char(fecha_regreso,'yyyy-mm-dd') || ' 16:30','yyyy-mm-dd hh24:mi') and (fecha_regreso - fecha_salida) >= 1 then 0.5 
when hora_regreso is not null and (fecha_regreso - fecha_salida) <= 0 then 0
else 0 end as cant_dia_reg

FROM com_plan_comisionados_placom
                            
where
id_plan_comisiones = $id_plan_comisiones
and vigencia = $vigencia
and nitocc = '$nitocc'
EOD;

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

                    if (count($records_tarifa_dia) > 0) {

                        $cant_dia_sal = $records_tarifa_dia[0]['cant_dia_sal'];
                        $cant_dia_reg = $records_tarifa_dia[0]['cant_dia_reg'];
                        //Calculo viticos por dias tiquetes
                        $viatico_tiquete = floor($tarifa_tiquete * ($cant_dia_sal + $cant_dia_reg));
                    }
                }



                /**
                 * Validar si tiene transporte contratato(tope_max > 0)  - 20190801
                 */
                $sql = <<<EOD
SELECT
    *
FROM com_plan_tarifas_destino_v
where
nitocc = '$nitocc'
and id_plan_comisiones = $id_plan_comisiones
and vigencia = $vigencia 
and tope_max > 0  
order by
tope_max desc 
EOD;

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

                if (count($records_tarifa_des) > 0) {

                    $distancia = $records_tarifa_des[0]['distancia'];
                    $tope_max = $records_tarifa_des[0]['tope_max'];

                    //tope max segun transporte
                    if ($distancia <= $tope_max) {
                        $viaticoa = $records_tarifa_des[0]['valor_auxilio'];
                        $viaticob = $records_tarifa_des[0]['valor_auxilio'];
                    }
                }

                //si algo segun tarifa
                if (count($records_tarifa_des) > 0) {
                    if ($records_tarifa_des[0]['tarifa_transporte'] == 2) {
                        //RANGO 2: Comisionado SI usa durante la comisión TRANSPORTE CONTRATADO TERRESTRE
                        $tarifa = $viaticob;
                    } else {
                        $tarifa = $viaticoa;
                    }
                } else {
                    //RANGO 1: Comisionado NO hace uso del TRANSPORTE CONTRATADO TERRESTRE
                    $tarifa = $viaticoa;
                }

                //calculo viaticos
                $dias = $dias - $cant_dia_sal - $cant_dia_reg;
                $logger->info("Verificar dias:: " . $dias);
                $logger->info("Verificar tarifa:: " . $tarifa);
                $logger->info("Verificar tarifa_tiquete:: " . $tarifa_tiquete);
                $logger->info("Verificar viatico_tiquete:: " . $viatico_tiquete);

                $viaticos = $viatico_tiquete + floor($tarifa * $dias);
                $logger->info("Verificar viaticos:: " . $viaticos);


                //calculo taxis 
                $sql = <<<EOD
select nvl(sum(tardes.total),0) as total
from com_plan_tarifas_destino tardes
left join transportes trans
on trans.id = tardes.id_transporte
where
tardes.id_plan_comisiones = $id_plan_comisiones
and tardes.vigencia = $vigencia
and tardes.nitocc = '$nitocc'
--and trans.id_objeto_gasto is null
and trans.aplica_tarifa_taxis = 1  
EOD;

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

                $taxis = $records_taxi[0]['total'];

                $observaciones = '';
                if ($taxis > 0) {
                    $observaciones = '$' . $taxis . ' para taxis. ';
                }

                //valor total
                $valor = floor($viaticos + $taxis);

                $sql = <<<EOD
Insert into COM_PLAN_COMISIONADOS_OBJS (NITOCC,CODOBJ,ID_PLAN_COMISIONES,VIGENCIA,
    VALOR,ESTADO,OBSERVACIONES,VIATICOS,TAXIS,TARIFA,ID_OBJ_GASTO,
        TARIFA_TIQUETE,CANT_DIA_SAL,CANT_DIA_REG) 
values ('$nitocc','$codobj','$id_plan_comisiones','$vigencia',
    '$valor','1','$observaciones','$viaticos','$taxis','$tarifa','$id_obj_gasto',
        $tarifa_tiquete, $cant_dia_sal, $cant_dia_reg) 
EOD;

                //ejecut6ar sql
                $this->conn->execute($sql);
            }

            $this->conn->commit();
        }

        //accion remove
        if ($Action == "REMOVE") {
            /**
             * Al elminar un registro elimina para cada comisionado que tenga - 20181026
             */
            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();

            $id_plan_comisiones = $request['id_plan_comisiones'];
            $vigencia = $request['vigencia'];

            $nitocc = $request['nitocc'];

            //delete objetos gasto segun la planeacion de comision
            $sql = <<<EOD
delete
from com_plan_destinos_comisionados
where
id_plan_comisiones = $id_plan_comisiones
and vigencia = $vigencia
and nitocc = '$nitocc'
EOD;

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

            //delete destinos planeacion de comision
            $sql = <<<EOD
delete
from com_plan_comisionados_objs
where
id_plan_comisiones = $id_plan_comisiones
and vigencia = $vigencia
and nitocc = '$nitocc'
EOD;

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

            $this->conn->commit();
        }

        return $request;
    }

}
