<?php

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

    protected $table_names = array(
        'COM_PLAN_TARIFAS_DESTINO_V'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'COM_PLAN_TARIFAS_DESTINO_V' =>
        array(
            'num_doc' => 'num_doc',
            'razsoc' => 'razsoc',
            'tipter_ter' => 'tipter_ter',
            'tipoter_text' => 'tipoter_text',
            'nitocc' => 'nitocc',
            'id_plan_comisiones' => 'id_plan_comisiones',
            'vigencia' => 'vigencia',
            'codmun' => 'codmun',
            'id_transporte' => 'id_transporte',
            'id_tarifa' => 'id_tarifa',
            'num_viajes' => 'num_viajes',
            'total' => 'total',
            'transporte' => 'transporte',
            'aplica_tarifa_taxis' => 'aplica_tarifa_taxis',
            'id_objeto_gasto' => 'id_objeto_gasto',
            'municipio' => 'municipio',
            'codmun_text' => 'codmun_text',
            'depto' => 'depto',
            'zona_roja' => 'zona_roja',
            'observaciones_mun' => 'observaciones_mun',
            'descripcion_tarifa' => 'descripcion_tarifa',
            'tarifa' => 'tarifa',
            'num_doc,||, - ,||,razsoc' => 'completo_ter',
            'placa_vehiculo' => 'placa_vehiculo',
            'tipo_vehiculo' => 'tipo_vehiculo',
            'recorrido_vehiculo' => 'recorrido_vehiculo',
            'distancia' => 'distancia',
            'aplica_tiquete' => 'aplica_tiquete',
            'aplica_solicitud' => 'aplica_solicitud',
            'tarifa_transporte' => 'tarifa_transporte',
            'tope_max' => 'tope_max',
            'valor_auxilio' => 'valor_auxilio'
        )
    ); //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_TARIFAS_DESTINO_V' => array(
            'id_plan_comisiones,a' => array('!=' => array(-1)),
            'id_plan_comisiones,b' => array('=' => array('id_plan_comisiones')),
            'vigencia' => array('=' => array('vigencia')),
            'num_doc' => array('=' => array('num_doc')),
            'codmun' => array('=' => array('codmun')),
            'id_transporte' => array('=' => array('id_transporte')),
            'id_tarifa' => array('=' => array('id_tarifa')),
            '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', 'num_doc', 'codmun', 'descripcion_tarifa'
    ); //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('id_plan_comisiones', 'vigencia', 'nitocc', 'codmun', 'id_transporte'); //llave primaria
    protected $field_names = array('num_viajes', 'total', 'id_tarifa',
        'recorrido_vehiculo', 'tipo_vehiculo', 'placa_vehiculo', 'distancia'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'COM_PLAN_TARIFAS_DESTINO'; //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) {

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

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */
        $request['nitocc'] = $request['num_doc'];

        $nitocc = $request['nitocc'];
        $id_plan_comisiones = $request['id_plan_comisiones'];
        $vigencia = $request['vigencia'];
        $id_transporte = $request['id_transporte'];
        $codmun = $request['codmun'];

        /*
         *  Generar errores en $errors
         */
        //sentencia sql
        $sql = <<<EOD
SELECT
    *
FROM com_plan_tarifas_destino
where
nitocc = '$nitocc'
and id_plan_comisiones = $id_plan_comisiones
and vigencia = $vigencia
and id_transporte = $id_transporte 
and codmun = '$codmun' 
EOD;
        //ejecuta el sql
        $records = CN_TABLE::executeSQL($sql);

        if (count($records) > 0) {
            /*
             * 20190802 Se comenta el error ya que el mismo transporte puede aplicar para el comisionado en los distintos destino
             * Se activa agregando codmun - 20230309::LAVILA
             */
            $errors['mensaje'] = "El tipo de transporte ya existe para el comisionado en el municipio.";
            $errors['servicio'] = "com_plan_tarifas_destino";
            $logger->info("El tipo de transporte ya existe para el comisionado en el municipio.");
        }

        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;

        /*
         * Variables request
         */
//        $id_tipo_doc = $request['id_tipo_doc'];
//        $num_doc = $request['num_doc'];
//        $id_clase_fondo = $request['id_clase_fondo'];

        /*
         *  Validar la operación, ya sea por SQL
         */
//        $sql = <<<EOD
//select * 
//from no_afilia_fondo
//where
//id_tipo_doc = $id_tipo_doc
//and num_doc = '$num_doc'
//and id_clase_fondo = $id_clase_fondo 
//EOD;
//        $records = CN_TABLE::executeSQL($sql);
        /*
         *  Generar errores en $errors
         */
//        if (count($records) > 0) {
//            $errors['mensaje'] = "Ya posee un registro de fondo, para la clase de fondo selecionado.";
//            $errors['servicio'] = "afilia_fondo";
//        }

        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
        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'];
            //Ubicamos los datos del comisionado para la planeacion
            $sql = <<<EOD
select 
*
                    
from com_plan_comisionados_placom_v a

where
a.id_plan_comisiones = $id_plan_comisiones
and a.vigencia = $vigencia
and a.nitocc = '$nitocc'
EOD;

            $records = CN_TABLE::executeSQL($sql);
            if (count($records) > 0) {
                //VARIABLES NECESARIAS PARA EL CALCULO

                $liquidar_via = $records[0]['liquidar_via'];
                $tipter = $records[0]['tipter'];
                $sueldo = $records[0]['sueldo'];
                $dias = $records[0]['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;

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

                //Genera objetos gasto segun la planeacion de comision
                $logger->info("Entro a liquidar_via = " . $liquidar_via);
                if ($liquidar_via == 1) {

                    //Metodo de recalculo de viaticos - 20190904
                    $this->conn = $this->recalculoViaticos($this->conn, $codobj, $id_obj_gasto, $dias, $tipo_tarifa, $sueldo, $nitocc, $id_plan_comisiones, $vigencia);
                }

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



//====================CODIGO ANTERIOR CALCULO TAXIS
            //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 = 0;
              $observaciones = '';

              if (count($records_taxi) > 0) {
              $taxis = $records_taxi[0]['total'];
              }

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

              //Datos del tercero - 20190801
              $sql = <<<EOD
              select * from TERCEROS_V where nitocc = '$nitocc'
              EOD;

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

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

              //Obtener id_obj_gasto por tipter si esta parametrizado - 20190801
              $sql = <<<EOD
              SELECT
             *
              FROM objetos_gasto_v
              where
              viatico = 1
              and ano_fiscal = $vigencia
              and id_tipo_comisionado = $id_tipo_comisionado
              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;
              }


              //actualiza si tiene obj 06
              $sql = <<<EOD
              update com_plan_comisionados_objs
              set valor = (valor - taxis)+'$taxis',
              taxis = '$taxis',
              observaciones = '$observaciones'
              where
              id_plan_comisiones = $id_plan_comisiones
              and vigencia = $vigencia
              and nitocc = '$nitocc'
              and codobj = '$codobj'
              EOD;

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


              //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 in (
              select
              obj.codigo
              from transportes trans
              left join objetos_gasto obj
              on obj.id = trans.id_objeto_gasto
              where
              trans.id_objeto_gasto is not null
              )
              EOD;

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

              //borra si tenia y crea nuevo
              $sql = <<<EOD
              insert into com_plan_comisionados_objs
              (
              nitocc,
              codobj,
              id_plan_comisiones,
              vigencia,
              valor,
              estado,
              observaciones,
              viaticos,
              taxis,
              tarifa,
              id_obj_gasto
              )

              select
              tardes.nitocc,
              obj.codigo as codobj,
              tardes.id_plan_comisiones,
              tardes.vigencia,
              nvl(sum(tardes.total),0) as valor,
              1 as estado,
              max( 'Transporte: ' || trans.descripcion ) as observaciones,
              0 as viaticos,
              nvl(sum(tardes.total),0) taxis,
              0 as tarifa,
              obj.id

              from com_plan_tarifas_destino tardes

              left join tarifas_taxis tar
              on tar.id = tardes.id_tarifa

              left join transportes trans
              on trans.id = tardes.id_transporte

              left join objetos_gasto obj
              on obj.id = trans.id_objeto_gasto

              where
              tardes.id_plan_comisiones = $id_plan_comisiones
              and tardes.vigencia = $vigencia
              and tardes.nitocc = '$nitocc'
              and trans.id_objeto_gasto is not null

              group by
              tardes.nitocc,
              obj.codigo,
              tardes.id_plan_comisiones,
              tardes.vigencia,
              obj.id
              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'];
            //Ubicamos los datos del comisionado para la planeacion
            $sql = <<<EOD
select 
*
                    
from com_plan_comisionados_placom_v a

where
a.id_plan_comisiones = $id_plan_comisiones
and a.vigencia = $vigencia
and a.nitocc = '$nitocc'
EOD;

            $records = CN_TABLE::executeSQL($sql);
            if (count($records) > 0) {
                //VARIABLES NECESARIAS PARA EL CALCULO

                $liquidar_via = $records[0]['liquidar_via'];
                $tipter = $records[0]['tipter'];
                $sueldo = $records[0]['sueldo'];
                $dias = $records[0]['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;

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

                //Genera objetos gasto segun la planeacion de comision
                $logger->info("Entro a liquidar_via = " . $liquidar_via);
                if ($liquidar_via == 1) {

                    //Metodo de recalculo de viaticos - 20190904
                    $this->conn = $this->recalculoViaticos($this->conn, $codobj, $id_obj_gasto, $dias, $tipo_tarifa, $sueldo, $nitocc, $id_plan_comisiones, $vigencia);
                }

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

            //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 = 0;
              $observaciones = '';

              if (count($records_taxi) > 0) {
              $taxis = $records_taxi[0]['total'];
              }

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

              //Datos del tercero - 20190801
              $sql = <<<EOD
              select * from TERCEROS_V where nitocc = '$nitocc'
              EOD;

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

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

              //Obtener id_obj_gasto por tipter si esta parametrizado - 20190801
              $sql = <<<EOD
              SELECT
             *
              FROM objetos_gasto_v
              where
              viatico = 1
              and ano_fiscal = $vigencia
              and id_tipo_comisionado = $id_tipo_comisionado
              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;
              }

              //actualiza si tiene obj 06
              $sql = <<<EOD
              update com_plan_comisionados_objs
              set valor = (valor - taxis)+'$taxis',
              taxis = '$taxis',
              observaciones = '$observaciones'
              where
              id_plan_comisiones = $id_plan_comisiones
              and vigencia = $vigencia
              and nitocc = '$nitocc'
              and codobj = '$codobj'
              EOD;

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

              //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 in (
              select
              obj.codigo
              from transportes trans
              left join objetos_gasto obj
              on obj.id = trans.id_objeto_gasto
              where
              trans.id_objeto_gasto is not null
              )
              EOD;

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

              //borra si tenia y crea nuevo
              $sql = <<<EOD
              insert into com_plan_comisionados_objs
              (
              nitocc,
              codobj,
              id_plan_comisiones,
              vigencia,
              valor,
              estado,
              observaciones,
              viaticos,
              taxis,
              tarifa,
              id_obj_gasto
              )

              select
              tardes.nitocc,
              obj.codigo as codobj,
              tardes.id_plan_comisiones,
              tardes.vigencia,
              nvl(sum(tardes.total),0) as valor,
              1 as estado,
              max( 'Transporte: ' || trans.descripcion ) as observaciones,
              0 as viaticos,
              nvl(sum(tardes.total),0) taxis,
              0 as tarifa,
              obj.id

              from com_plan_tarifas_destino tardes

              left join tarifas_taxis tar
              on tar.id = tardes.id_tarifa

              left join transportes trans
              on trans.id = tardes.id_transporte

              left join objetos_gasto obj
              on obj.id = trans.id_objeto_gasto

              where
              tardes.id_plan_comisiones = $id_plan_comisiones
              and tardes.vigencia = $vigencia
              and tardes.nitocc = '$nitocc'
              and trans.id_objeto_gasto is not null

              group by
              tardes.nitocc,
              obj.codigo,
              tardes.id_plan_comisiones,
              tardes.vigencia,
              obj.id
              EOD;

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

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

        //accion remove
        if ($Action == "REMOVE") {
            $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'];
            //Ubicamos los datos del comisionado para la planeacion
            $sql = <<<EOD
select 
*
                    
from com_plan_comisionados_placom_v a

where
a.id_plan_comisiones = $id_plan_comisiones
and a.vigencia = $vigencia
and a.nitocc = '$nitocc'
EOD;

            $records = CN_TABLE::executeSQL($sql);
            if (count($records) > 0) {
                //VARIABLES NECESARIAS PARA EL CALCULO

                $liquidar_via = $records[0]['liquidar_via'];
                $tipter = $records[0]['tipter'];
                $sueldo = $records[0]['sueldo'];
                $dias = $records[0]['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;

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

                //Genera objetos gasto segun la planeacion de comision
                $logger->info("Entro a liquidar_via = " . $liquidar_via);
                if ($liquidar_via == 1) {

                    //Metodo de recalculo de viaticos - 20190904
                    $this->conn = $this->recalculoViaticos($this->conn, $codobj, $id_obj_gasto, $dias, $tipo_tarifa, $sueldo, $nitocc, $id_plan_comisiones, $vigencia);
                }

                $this->conn->commit();

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

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

                  $nitocc = $request['nitocc'];

                  //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 = 0;
                  $observaciones = '';

                  if (count($records_taxi) > 0) {
                  $taxis = $records_taxi[0]['total'];
                  }

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

                  //Datos del tercero - 20190801
                  $sql = <<<EOD
                  select * from TERCEROS_V where nitocc = '$nitocc'
                  EOD;

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

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

                  //Obtener id_obj_gasto por tipter si esta parametrizado - 20190801
                  $sql = <<<EOD
                  SELECT
                 *
                  FROM objetos_gasto_v
                  where
                  viatico = 1
                  and ano_fiscal = $vigencia
                  and id_tipo_comisionado = $id_tipo_comisionado
                  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;
                  }

                  //actualiza si tiene obj 06
                  $sql = <<<EOD
                  update com_plan_comisionados_objs
                  set valor = (valor - taxis)+'$taxis',
                  taxis = '$taxis', observaciones = '$observaciones'
                  where
                  id_plan_comisiones = $id_plan_comisiones
                  and vigencia = $vigencia
                  and nitocc = '$nitocc'
                  and codobj = '$codobj'
                  EOD;

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

                  //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 in (
                  select
                  obj.codigo
                  from transportes trans
                  left join objetos_gasto obj
                  on obj.id = trans.id_objeto_gasto
                  where
                  trans.id_objeto_gasto is not null
                  )
                  EOD;

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

                  //borra si tenia y crea nuevo
                  $sql = <<<EOD
                  insert into com_plan_comisionados_objs
                  (
                  nitocc,
                  codobj,
                  id_plan_comisiones,
                  vigencia,
                  valor,
                  estado,
                  observaciones,
                  viaticos,
                  taxis,
                  tarifa,
                  id_obj_gasto
                  )

                  select
                  tardes.nitocc,
                  obj.codigo as codobj,
                  tardes.id_plan_comisiones,
                  tardes.vigencia,
                  nvl(sum(tardes.total),0) as valor,
                  1 as estado,
                  max( 'Transporte: ' || trans.descripcion ) as observaciones,
                  0 as viaticos,
                  nvl(sum(tardes.total),0) taxis,
                  0 as tarifa,
                  obj.id

                  from com_plan_tarifas_destino tardes

                  left join tarifas_taxis tar
                  on tar.id = tardes.id_tarifa

                  left join transportes trans
                  on trans.id = tardes.id_transporte

                  left join objetos_gasto obj
                  on obj.id = trans.id_objeto_gasto

                  where
                  tardes.id_plan_comisiones = $id_plan_comisiones
                  and tardes.vigencia = $vigencia
                  and tardes.nitocc = '$nitocc'
                  and trans.id_objeto_gasto is not null

                  group by
                  tardes.nitocc,
                  obj.codigo,
                  tardes.id_plan_comisiones,
                  tardes.vigencia,
                  obj.id
                  EOD;

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

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

            return $request;
        }
    }

    /**
     * Calculo de viaticos del tercero segun transportes y planeacion - 20190904
     * 
     * @param type $conn
     * @param type $codobj
     * @param type $id_obj_gasto
     * @param type $dias
     * @param type $tipo_tarifa
     * @param type $sueldo
     * @param type $nitocc
     * @param type $id_plan_comisiones
     * @param type $vigencia
     */
    public function recalculoViaticos($conn, $codobj, $id_obj_gasto, $dias, $tipo_tarifa, $sueldo, $nitocc, $id_plan_comisiones, $vigencia) {

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

        try {

            $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.
                 * 20200910::LAVILA 
                 * Cuando el comisionado tenga en cantidad de días menor a 1.5 (0,5 o 1,00) y el transporte de la comisión sea 
                 * “Aéreo y Terrestre contratos ANM” el sistema debe liquidar los viáticos por la tarifa completa (TARIFA A). 
                 * Se aplico en el informe para que tome segun los dias y la tarifa que corresponde, con o sin TR
                 */
                $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);
            $tag_trans = true;
            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'];
                    $tag_trans = false;
                }
            }

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


            //Tomar datos de placom por nitocc - 20201022
            $sql = <<<EOD
SELECT
    *
FROM com_plan_comisionados_placom
where
id_plan_comisiones = $id_plan_comisiones
and vigencia = $vigencia
and nitocc = '$nitocc'
EOD;

            $records_placom = CN_TABLE::executeSQL($sql);
            if (count($records_placom) > 0) {
                $id_transporte = $records_placom[0]['id_transporte'];
                $dias_tarifa_a = $records_placom[0]['dias_tarifa_a'];
                $dias_tarifa_b = $records_placom[0]['dias_tarifa_b'];
                $porcentaje_dia = $records_placom[0]['porcentaje_dia'];
            }


            /*
             * Validaciones nuevas #18873 - 20201014
             */
            $sql = <<<EOD
SELECT
    *
FROM transportes
where id = $id_transporte
and aplica_dias_tarifa = 1 
EOD;

            $records_aplicatr = CN_TABLE::executeSQL($sql);
            if (count($records_aplicatr) > 0) {

                $dias_tarifa_a = $dias_tarifa_a;
                $dias_tarifa_b = $dias_tarifa_b;

                if (!$tag_trans) {
                    if ($dias_tarifa_a > 0) {
                        $tarifa_a = $tarifa;
                    }
                    if ($dias_tarifa_b > 0) {
                        $tarifa_b = $tarifa;
                    }
                } else {

                    $logger->info("Verificar dias_tarifa_a:: " . $dias_tarifa_a);
                    $logger->info("Verificar dias_tarifa_b:: " . $dias_tarifa_b);

//                    if ($records_aplicatr[0]['tarifa_transporte'] == 2) {
//                        $tarifa_a = $tarifa_b;
//                    }

                    $viaticos = round(($tarifa_a * $dias_tarifa_a) + ($tarifa_b * $dias_tarifa_b));
                    $logger->info("Verificar viaticos segun dias:: " . $viaticos);
                }
            } else {
                $tarifa_a = 0;
                $tarifa_b = 0;
                $dias_tarifa_a = 0;
                $dias_tarifa_b = 0;
            }

            /**
             * 20201019::LAVILA
             * En este caso, las especificaciones de cálculo de viáticos para comisiones de 0.5 días, quedará de la siguiente manera:

              Al seleccionar porcentaje:
              - Valor fijo: $50.000
              - 25% - de Tarifa día
              - 50% - de Tarifa día

              Donde:

              Tarifa día: Es la que corresponde al sueldo y tipo de transporte
              Tarifa Normal: Desaparece, teniendo en cuenta que es igual a la opción 50%
             */
            //$porcentaje_dia = 100;
            if (isset($porcentaje_dia) && $porcentaje_dia != 100) {

                $viaticos = round($tarifa * $porcentaje_dia / 100);
                if (count($records_aplicatr) > 0 && $tag_trans) {
                    if ($dias_tarifa_a > $dias_tarifa_b) {
                        $viaticos = round($tarifa_a * $porcentaje_dia / 100);
                    } else {
                        $viaticos = round($tarifa_b * $porcentaje_dia / 100);
                    }
                }
            }

            $logger->info("Verificar viaticos porcentaje($porcentaje_dia):: " . $viaticos);
            if ($porcentaje_dia == 0) {
                $tarifa = $viaticos = 50000;

                if ($dias_tarifa_a > 0) {
                    $tarifa_a = $tarifa;
                }
                if ($dias_tarifa_b > 0) {
                    $tarifa_b = $tarifa;
                }
            }
            $logger->info("Verificar viaticos porcentaje valor fijo:: " . $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. ';

                /**
                 * Incidente #21160, taxis en objeto separado - 20210326::LAVILA
                 */
                $sql = <<<EOD
select valor from com_param_control_comis where parametro = 'CODIGO_OBJETO_TRANSPORTE'   
EOD;
                //ejecuta el sql
                $records = CN_TABLE::executeSQL($sql);
                if (count($records) > 0) {
                    $codigo_objeto_transporte = $records[0]['valor'];

                    $sql = <<<EOD
SELECT
    *
FROM objetos_gasto_v
where
codigo in ( $codigo_objeto_transporte )
and ano_fiscal = $vigencia
order by
codigo desc     
EOD;
                    //ejecuta el sql
                    $records = CN_TABLE::executeSQL($sql);
                    if (count($records) > 0) {
                        $codobj_trans = $records[0]['codigo'];
                        $id_obj_gasto_trans = $records[0]['id'];

                        $valor_trans = $taxis;

                        $sql = <<<EOD
SELECT
    *
FROM com_plan_comisionados_objs
where
id_plan_comisiones = $id_plan_comisiones
and vigencia = $vigencia
and nitocc = '$nitocc'
and id_obj_gasto = $id_obj_gasto_trans   
EOD;

                        //ejecuta el sql
                        $records = CN_TABLE::executeSQL($sql);
                        if (count($records) > 0) {
                            $sql = <<<EOD
update com_plan_comisionados_objs
set valor = valor - taxis + $taxis, taxis = $taxis, observaciones = '$observaciones'
where
id_plan_comisiones = $id_plan_comisiones
and vigencia = $vigencia
and nitocc = '$nitocc'
and id_obj_gasto = $id_obj_gasto_trans 
EOD;
                        } else {
                            $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, vl_tarifa_a, vl_tarifa_b) 
values ('$nitocc','$codobj_trans','$id_plan_comisiones','$vigencia',
    '$valor_trans','1','$observaciones','0','$taxis','0','$id_obj_gasto_trans',
        0, 0, 0, 0, 0) 
EOD;
                        }

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

                        $observaciones = '';
                        $taxis = 0;
                    }
                }
            }


            //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, vl_tarifa_a, vl_tarifa_b) 
values ('$nitocc','$codobj','$id_plan_comisiones','$vigencia',
    '$valor','1','$observaciones','$viaticos','$taxis','$tarifa','$id_obj_gasto',
        $tarifa_tiquete, $cant_dia_sal, $cant_dia_reg, $tarifa_a, $tarifa_b) 
EOD;

            //ejecutar sql
            $conn->execute($sql);
        } catch (Exception $exc) {
            $logger->info("Exception :: " . $exc->getMessage());
        }

        return $conn;
    }

}
