<?php

/**
 * com_plan_comisiones actions.
 *
 * @package    controlComisiones
 * @subpackage com_plan_comisiones
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class com_plan_comisiones_basicActions extends sfQuery {
    
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
            if ($value == 'null') {
                unset($request[$key]);
            }
        }
        $this->logMessage("--------------------------------------------------*  Ip: " . $_SERVER['REMOTE_ADDR']);
        
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $where = "";

        if(isset($request['id_plan_comisiones'])) {
            $where .= " AND tab0.id_plan_comisiones = " . $request['id_plan_comisiones'];
        }
        
        if(isset($request['vigencia'])) {
            $where .= " AND tab0.vigencia = " . $request['vigencia'];
        }
        
        if(isset($request['estado'])){
            $where .= " AND tab0.estado = " . $request['estado'];
        }
        if(isset($request['autorizado'])){
            $where .= " AND tab0.autorizado = " . $request['autorizado'];
        }
        
        if(isset($request['programado'])){
            $where .= " AND tab0.programado = " . $request['programado'];
        }
        
        if(isset($request['vobo'])){
            $where .= " AND tab0.vobo = " . $request['vobo'];
        }
        
        if(isset($request['nivel_rechazo'])){
            $where .= " AND tab0.nivel_rechazo = " . $request['nivel_rechazo'];
        }
        if(isset($request['firmado'])){
            $where .= " AND tab0.firmado = " . $request['firmado'];
        }
        if(isset($request['estado_general'])){
            $where .= " AND tab0.estado_general = " . $request['firmado'];
        }
        if(isset($request['interrupcion'])){
            $where .= " AND tab0.interrupcion = " . $request['interrupcion'];
        }
            $this->logMessage("where = $where");
        $this->logMessage("---END Logging request");

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


        /**
         * VALIDAR ERRORES DE PROCEDIMIENTO
         */
        try {

            $record = array();

            //sentencia sql
            $sql = <<<EOD
select * from (  
                  select 
                  planea.id_plan_comisiones,
                  planea.vigencia,
                  planea.id_area,
                  planea.tipcomi,
                  planea.id_proyectos,
                  planea.fecha,
                  planea.fecha_log,
                  planea.usuario_log,
                  planea.interrupcion,
                  planea.id_original,
                  planea.vobo,
                  planea.estado,
                  planea.fecha_estado,
                  planea.id_usuario_estado,
                  planea.nivel_rechazo,
                  planea.firmado,
                  planea.fecha_firmado,
                  planea.id_usuario_firmado,
                  planea.autorizado,
                  planea.fecha_autorizado,
                  planea.id_usuario_autorizado,
                  planea.fecha_salida,
                  planea.fecha_regreso,
                  planea.aprobado,
                  planea.fecha_aprobado,
                  tipcom.descomi,
                  tipcom.dcomi,
                  nvl(prog.programado,1) as programado,
                  planea.id_proyectos_viatico,

                  /*estado general*/
                  case 
                  when planea.estado = 0 then 0
                  when planea.autorizado = 1 then 4
                  when planea.aprobado = 1 then 3
                  when planea.firmado = 1 then 2
                  when planea.estado = 1 then 1
                  else 0 end as estado_general,
                  case 
                  when planea.estado = 0 then 'Rechazado ' || planea.nivel_rechazo
                  when planea.autorizado = 1 then 'Autorizado'
                  when planea.aprobado = 1 then 'Aprobado'
                  when planea.firmado = 1 then 'Planeado'
                  when planea.estado = 1 then 'Abierto'
                  else 'Rechazado' end as desc_estado_general,

                  case 
                  when planea.estado = 0 then planea.fecha_estado
                  when planea.autorizado = 1 then planea.fecha_autorizado
                  when planea.aprobado = 1 then planea.fecha_aprobado
                  when planea.firmado = 1 then planea.fecha_firmado
                  when planea.estado = 1 then planea.fecha
                  else planea.fecha_estado end  as fecha_estado_general,

                  nvl(proyvia.id_cdp_global,proy.id_cdp_global) as id_cdp_proyecto,

                  saldocdp.ano_fiscal as vigencia_cdp,
                  saldocdp.saldo_cdp as saldo_cdp,
                  proy.codigo as cod_proyecto


                  from COM_PLAN_COMISIONES planea

                  left join TIPOS_COMISION tipcom
                  on tipcom.tipcomi = planea.tipcomi

                  left join PROYECTOS proy
                  on proy.id = planea.id_proyectos

                  left join proyectos_viatico proyvia
                  on proyvia.id_proyectos_viatico = planea.id_proyectos_viatico

                  left join PR_CDP_SALDO_V saldocdp on saldocdp.cdp = nvl(proyvia.id_cdp_global,proy.id_cdp_global) AND saldocdp.cod_proyecto = proy.codigo

                  left join (select tab0.id_plan_comisiones, tab0.vigencia , min(tab0.programado) as programado
                  
                  from (select
                        placom.nitocc as num_doc,
                        placom.id_plan_comisiones,
                        placom.vigencia,
                        case when prog.ID_COMISIONES is null then 0 else 1 end as programado
                        from COM_PLAN_COMISIONADOS_PLACOM placom
                        left join (Select id_plan_comisiones,tab0.ID_COMISIONES,tab0.VIGENCIA_COMISIONES,tab0.VIGENCIA,NITOCC
                        from COM_PLAN_PROGRAM_COMIS tab0
                        left join 
                        (select * from comisionados_planta
                        union
                        select * from comisionados_contrato
                        )tab1 on tab1.id_comision = tab0.id_comisiones and tab1.vigencia = tab0.vigencia_comisiones
                        where tab0.estado <> 0)prog 
                        on prog.id_plan_comisiones = placom.id_plan_comisiones
                        and prog.vigencia = placom.vigencia and placom.nitocc = prog.nitocc)tab0
                                    group by tab0.id_plan_comisiones, tab0.vigencia 
                        )prog on prog.id_plan_comisiones=planea.id_plan_comisiones and prog.vigencia = planea.vigencia
                  )tab0

                  WHERE 1 = 1 
                  $where
EOD;
            $records = CN_TABLE::executeSQL($sql);
           
            $this->status = 0;
            $this->totalRows = count($records);
            $this->startRow = 0;
            $this->endRow = count($records);
            $this->list_data = $records;
        } catch (Exception $e) {

            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
            $this->conn->rollback();
            $mensaje = "[LIST sfAPIActions] ERROR Exception !!!";

            $this->list_errors = array(
                'Code' => $e->getCode(),
                'Message' => $e->getMessage(),
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "LIST"
            );

            $this->logMessage($mensaje);
            $this->logMessage("status -1");
            $this->logMessage("Code " . $e->getCode());
            $this->logMessage("Message " . $e->getMessage());

            $this->status = $this->STATUS_FAILURE;
            $this->mensajeError = $mensaje;
            $this->list_data = array();
        }
    }


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

        /*
         * Se instancia la clase del manejo del log
      

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


        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['vigencia'] = date("Y", strtotime(CN_TABLE::fechaSistema()));
            $request['fecha'] = CN_TABLE::fechaSistema();
            $request['usuario_log'] = $request['id_username'];
        }

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

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        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") {
            
        }

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

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

}
