<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Actions para servicios CRUD, Detail...
 *
 * @author narange
 */
abstract class sfAPIActions extends sfActions {

    protected $has_activo = false; //para cambio de variables boolean a entero
    protected $has_check_exists = false; //para acutalizar registro si valida campos en check_exists
    protected $secuencia_oracle = false; //manejo de secuencias por oracle
    protected $has_secuencia = false; //si posee secuencia la tabla
    protected $log_list = false; //false - Registrar log para listar - consultar
    protected $log_crud = false; //false - Registrar log para add - update - remove
    protected $actions_remove = true; //true - Accion remove en vez de anular

    /*
     * Observacion perzonalizada
     */
    protected $observacion_list = false;
    protected $observacion_add = false;
    protected $observacion_update = false;
    protected $observacion_remove = false;

    /*
     * Errors GWT
     */
    protected $STATUS_FAILURE = 3; //-1
    protected $STATUS_LOGIN_INCORRECT = -5;
    protected $STATUS_LOGIN_REQUIRED = -7;
    protected $STATUS_LOGIN_SUCCESS = -8;
    protected $STATUS_MAX_LOGIN_ATTEMPTS_EXCEEDED = -6;
    protected $STATUS_SERVER_TIMEOUT = -100;
    protected $STATUS_SUCCESS = 0;
    protected $STATUS_TRANSPORT_ERROR = -90;
    protected $STATUS_VALIDATION_ERROR = -4;

    /**
     * Lista todos las filas de una tabla
     *
     * @param sfWebRequest $request
     */
    public function executeList(sfWebRequest $request) {

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


        /*
         * Variables globales del proyecto
         */
        $modulo = sfConfig::get('app_modulo');
        $usuarioERP = sfConfig::get('app_usuarioERP');
        $claveERP = sfConfig::get('app_claveERP');
        $tablaComandos = sfConfig::get('app_tablaComandos');


        /*
         * Validar errores de procedimiento
         */
        try {

            /*
             * Obtener todos los valores de las tablas
             */
            $records = CN_TABLE::getAll($this->table_name);

            $res = array();
//            $this->logMessage("[sfApiActions] **************************************************");
//valida si posee el campo activo convierte a boolean los campos
            if ($this->has_activo) {
//                $this->logMessage("[sfApiActions] if de has_activo.");
//recorre el resultado para cambiar a boolean si lo requiere
                foreach ($records as $record) {

                    /*
                     * Cambio de valores por mayusculas
                     */
                    if (isset($this->en_mayuscula)) {
//                        $this->logMessage("[sfApiActions] Entro convertir en mayuscula - miniscula, en el if de has_activo.");

                        if ($this->en_mayuscula) {
                            $resultado = $this->convertMayuscula($record->toArray(), 1); //cambio por mayusculas
                        } else {
                            $resultado = $this->convertMayuscula($record->toArray(), 0); //cambio por minusculas, primera en mayuscula
                        }
                    } else {
                        $resultado = $record->toArray();
                    }

                    $resultado = $this->convertActivoValueBoolean($resultado); //cambio de variables boolean
//validar resultados
//                    foreach ($resultado as $value) {
////                        foreach ($value as $val) {
//
//                        $this->logMessage("************************************************ 1 " . $value);
////                        }
//                    }//die();




                    $res[] = $resultado;
                }
            } else {
//                $this->logMessage("[sfApiActions] else de has_activo.");
//recorre el resultado para cambiar a boolean si lo requiere
                foreach ($records as $record) {

                    /*
                     * Cambio de valores por mayusculas
                     */
                    if (isset($this->en_mayuscula)) {
//                        $this->logMessage("[sfApiActions] Entro convertir en mayuscula - miniscula, en el else de has_activo.");

                        if ($this->en_mayuscula) {
                            $resultado = $this->convertMayuscula($record->toArray(), 1); //cambio por mayusculas
                        } else {
                            $resultado = $this->convertMayuscula($record->toArray(), 0); //cambio por minusculas, primera en mayuscula
                        }
                    } else {
                        $resultado = $record->toArray();
                    }

                    $res[] = $resultado; //cambio de variables boolean
                }

//                $res = $records;
            }

//validar resultados
//            foreach ($res as $value) {
//                foreach ($value as $val) {
//
//                    $this->logMessage("************************************************ 2 " . $val);
//                }
//            }//die();
//            if (isset($this->en_mayuscula)) {
//
//                $this->logMessage("[sfApiActions] Entro convertir en mayuscula - miniscula.");
//
//                $rese = array();
//                if ($this->en_mayuscula) {
//                    foreach ($records as $record) {
//                        $rese[] = $this->convertMayuscula($record->toArray(), 1);
//                    }
//                } else {
//                    foreach ($records as $record) {
//                        if ($record != null)
//                            $rese[] = $this->convertMayuscula($record->toArray(), 0);
//                    }
//                }
//                $res = $rese;
//            }


            /*
             * registro de consulta en tabla de log
             */
            if (!$this->log_list) {
                $this->logMessage("[sfApiActions] Entro registro LOG.");

                /*
                 * variables por defecto para el registro de log
                 */
                $id_tabla = 'null';

                //obtener id maestro tabla
                $id_mae_bd = CN_TABLE::consultarIdTablaBD($this->table_name);

                //1 - indica operacion de consultar
                //2 - indica operacion de actualizar
                //3 - indica operacion de adicionar
                //4 - indica operacion de eliminar
                //5 - indica operacion de anular
                $id_ope_bd = 1;

                //id del usuario
                $usuario = 1;
                if (isset($request['id_username'])) {
                    $usuario = $request['id_username'];
                }

                //username
                $username = '1';
                if (isset($request['username'])) {
                    $username = $request['username'];
                }

                $comando = 'sin comando';
                if (isset($request['comando'])) {
                    $comando = $request['comando'];
                }


                /*
                 * Observacion personalizada - 20120919
                 */
                if ($this->observacion_list != false) {
                    $this->logMessage('[sfApiActions] Entro a personalizar observacion.');
                    $observacion = "'";

                    /*
                     * Se divide el string de la observacion por &
                     */
                    $keys = explode("&", $this->observacion_list);
                    foreach ($keys as $value) {

                        /*
                         * Calida si es variable de request
                         */
                        if (preg_match('/request/', $value)) {
                            $keys_req = explode("-", $value);

                            //valida variable en el request
                            if (isset($request[$keys_req[1]])) {

                                $value = $request[$keys_req[1]];
                            }
                        }

                        $observacion .= $value;
                    }

                    $observacion .= "'";
                } else {
                    $this->logMessage('[sfApiActions] No entro a personalizar observacion.');
                    //construir observacion
                    $observacion = "'Se consulto tabla: " . $this->table_name . " desde la funcionalidad: " . $comando . "'";
                }



                /*
                 * registro de consulta en tabla de log
                 */
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $usuario, $username, $comando, $observacion);
            } else {
                $this->logMessage("[sfApiActions] NO entro registro LOG.");
            }

            //se anexa valor a la variable del template de JSON
            $this->list_data = $res;
        } catch (Doctrine_Connection_Exception $e) {

            $mensaje = "[LIST sfAPIActions] ERROR Doctrine_Connection_Exception !!!";
            $mensaje_es = "[LIST sfAPIActions] ERROR Ejecución de operaciones SQL !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                '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();
        } catch (Exception $e) {

            $mensaje = "[LIST sfAPIActions] ERROR Exception !!!";
            $mensaje_es = "[LIST sfAPIActions] ERROR Excepciones en la ejecución !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                '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();
        }
    }

    /**
     * Agrega una fila a la tabla
     *
     * @param sfWebRequest $request
     */
    public function executeAdd(sfWebRequest $request) {

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

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

            // Validar operación
            $errors = $this->validateAdd($request);

            /*
             * Validar errors
             */
            if ($errors == null) {

                /**
                 * Acciones anteriores a la original
                 * 
                 * return sfWebRequest Changed Request with additional parameters.
                 */
                $request = $this->preprocessRequest("ADD", $request);


                // Ejecutar la operación normalmente        
                $this->add($request);

                /**
                 * Acciones posteriores a la original
                 * 
                 * return sfWebRequest Changed Request with additional parameters.
                 */
                $this->postprocessRequest("ADD", $request, $this->list_data);
            } else {

                /*
                 * Validar que errors es un array con datos
                 */
                if (is_array($errors)) {
                    $errors['operacion'] = "ADD";
                    $this->list_errors = $errors;
                }

                // Devolver los errores vía Json
                if (isset($errors['mensaje'])) {
                    $mensaje = "[ADD sfAPIActions] " . $errors['mensaje'];
                } else {
                    $mensaje = "[ADD sfAPIActions] ERROR !!!";
                }


                $this->logMessage($mensaje);
                $this->logMessage("status -1");

                $this->status = $this->STATUS_FAILURE;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
            }
        } catch (Doctrine_Connection_Exception $e) {

            $mensaje = "[ADD sfAPIActions] ERROR Doctrine_Connection_Exception !!!";
            $mensaje_es = "[ADD sfAPIActions] ERROR Ejecución de operaciones SQL !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "ADD"
            );

            $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();
        } catch (Exception $e) {

            $mensaje = "[ADD sfAPIActions] ERROR Exception !!!";
            $mensaje_es = "[ADD sfAPIActions] ERROR Excepciones en la ejecución !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "ADD"
            );

            $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();
        }
    }

    /**
     * Actualiza una fila por los parametros de entrada
     *
     * @param sfWebRequest $request
     */
    public function executeUpdate(sfWebRequest $request) {

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

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

            // Validar operación
            $errors = $this->validateUpdate($request);

            /*
             * Validar errors
             */
            if ($errors == null) {

                /**
                 * return sfWebRequest Changed Request with additional parameters.
                 */
                $request = $this->preprocessRequest("UPDATE", $request);

                // Ejecutar la operación normalmente        
                $this->update($request);

                /**
                 * Acciones posteriores a la original
                 * 
                 * return sfWebRequest Changed Request with additional parameters.
                 */
                $this->postprocessRequest("UPDATE", $request, $this->list_data);
            } else {

                /*
                 * Validar que errors es un array con datos
                 */
                if (is_array($errors)) {
                    $errors['operacion'] = "UPDATE";
                    $this->list_errors = $errors;
                }

                // Devolver los errores vía Json
                if (isset($errors['mensaje'])) {
                    $mensaje = "[UPDATE sfAPIActions] " . $errors['mensaje'];
                } else {
                    $mensaje = "[UPDATE sfAPIActions] ERROR !!!";
                }

                $this->logMessage($mensaje);
                $this->logMessage("status -1");

                $this->status = $this->STATUS_FAILURE;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
            }
        } catch (Doctrine_Connection_Exception $e) {

            $mensaje = "[UPDATE sfAPIActions] ERROR Doctrine_Connection_Exception !!!";
            $mensaje_es = "[UPDATE sfAPIActions] ERROR Ejecución de operaciones SQL !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "UPDATE"
            );

            $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();
        } catch (Exception $e) {

            $mensaje = "[UPDATE sfAPIActions] ERROR Exception !!!";
            $mensaje_es = "[UPDATE sfAPIActions] ERROR Excepciones en la ejecución !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "UPDATE"
            );

            $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();
        }
    }

    /**
     * Remueve una fila de la tabla segun los parametros que entran
     *
     * @param sfWebRequest $request
     */
    public function executeRemove(sfWebRequest $request) {

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

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

            // Validar operación
            $errors = $this->validateRemove($request);

            /*
             * Validar errors
             */
            if ($errors == null) {

                /**
                 * return sfWebRequest Changed Request with additional parameters.
                 */
                $request = $this->preprocessRequest("REMOVE", $request);

                // Ejecutar la operación normalmente remove o anular
                if ($this->actions_remove) {
                    $this->logMessage("[REMOVE sfAPIActions] Accion ELIMINAR.");
                    $this->remove($request);
                } else {
                    $this->logMessage("[REMOVE sfAPIActions] Accion ANULAR");
                    $this->anular($request);
                }

                /**
                 * Acciones posteriores a la original
                 * 
                 * return sfWebRequest Changed Request with additional parameters.
                 */
                $this->postprocessRequest("REMOVE", $request, $this->list_data);
            } else {

                /*
                 * Validar que errors es un array con datos
                 */
                if (is_array($errors)) {
                    $errors['operacion'] = "REMOVE";
                    $this->list_errors = $errors;
                }

                // Devolver los errores vía Json
                if (isset($errors['mensaje'])) {
                    $mensaje = "[REMOVE sfAPIActions] " . $errors['mensaje'];
                } else {
                    $mensaje = "[REMOVE sfAPIActions] ERROR !!!";
                }

                $this->logMessage($mensaje);
                $this->logMessage("status -1");

                $this->status = $this->STATUS_FAILURE;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
            }
        } catch (Doctrine_Connection_Exception $e) {

            $mensaje = "[REMOVE sfAPIActions] ERROR Doctrine_Connection_Exception !!!";
            $mensaje_es = "[REMOVE sfAPIActions] ERROR Ejecución de operaciones SQL !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "REMOVE"
            );

            $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();
        } catch (Exception $e) {

            $mensaje = "[REMOVE sfAPIActions] ERROR Exception !!!";
            $mensaje_es = "[REMOVE sfAPIActions] ERROR Excepciones en la ejecución !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "REMOVE"
            );

            $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();
        }
    }

    /**
     * Agrega los valores en un array, si posee id_cia la tabla y los campos de llave primaria
     *
     * @param sfWebRequest $request
     * @return array
     */
    protected function getIdDisplayArray(sfWebRequest $request) {

        $res = array();

//Agrega la id_cia si la tabla lo requiere
        if ($this->has_id_cia) {
            $res['id_cia'] = $request['id_cia'];
        }

        foreach ($this->id_names as $value) {
            $res[$value] = $request[$value];
        }
        return array($res);
    }

    /*
     * Convierte los valores boolean por 0 ó 1
     */

    public static function extractIfBoolean($value) {
        return $value == 'true' || $value == 'false' ? $value == 'true' ? 1 : 0  : $value;
    }

    /**
     * Convierte los valores 0 ó 1 en true o false
     *
     * @param array $record
     */
    public static function convertActivoValueBoolean($record, $has_numero = false) {

///prueba
//        die("entro" . var_dump($record));
        foreach ($record as $key => $value) {
            if ($key == 'estado'
                    || $key == 'vencimiento'
                    || $key == 'sgr'
                    || $key == 'activo'
                    || $key == 'anulado'
                    || $key == 'cerrado'
                    || $key == 'operador'
                    || $key == 'festivo'
                    || $key == 'actual'
                    || $key == 'mas_empleados'
                    || $key == 'declarante_renta'
                    || $key == 'pensionado'
                    || $key == 'embargo'
                    || $key == 'dependiente'
                    || $key == 'aplica_iva'
                    || $key == 'firmado'
                    || $key == 'revisado'
                    || $key == 'autorizado'
                    || $key == 'radicado'
                    || $key == 'aplica_soporte'
                    || $key == 'aprobado'
                    || $key == 'aplica_hora_radicado'
                    || $key == 'aplica_fec_radicado'
                    || $key == 'aplica_rp_doble'
                    || $key == 'aplica_balance_contrato'
                    || $key == 'aplica_apertura_anho'
                    || $key == 'aplica_cierre_anho'
                    || $key == 'aplica_cuestionario'
            ) {
                $record[$key] = $record[$key] == 1 ? true : false;
            }
            //si se agrega esto no devuelve false para la edicion de firma
            //validar si modifica los demas servicios
            if ($key == 'fecha_anu'
                    || $key == 'fecha_anula'
                    || $key == 'motivo_anu') {
//                echo(var_dump($record[$key]) . "entro1");

                if ($record[$key] == false) {
                    $record[$key] = null;
//                    echo "\n*****\n";
                } else {

                    $record[$key] = $value;
//                    echo "\n+++++\n";
                }

//                $record[$key] = $record[$key] == true || $record[$key] == false ? null : $value;
//                die(var_dump($record[$key]) . "entro2--" . var_dump($value));
            }
//            echo var_dump($record[$key]);
        }
//        die("entrooooo");
        return $record;
    }

    /*
     * Metodo para convertir el texto en mayuscula o minuscula
     */

    public static function convertMayuscula($record, $mayuscula) {

//prueba
//        die("entro" . var_dump($record));

        /*
         * Recorre todos los resultados
         */
        foreach ($record as $key => $value) {

//si es en mayuscula
            if ($mayuscula == 1) {
                $record[$key] = strtoupper($value);
            } else {
                $record[$key] = strtoupper(substr($value, 0, 1));
                $record[$key].=strtolower(substr($value, 1));
            }
        }
        return $record;
    }

    /**
     * @param sfWebRequest $request 
     * @return array 
     */
    protected abstract function validateAdd(sfWebRequest $request);

    /**
     * @param sfWebRequest $request 
     * @return array 
     */
    protected abstract function validateUpdate(sfWebRequest $request);

    /**
     * @param sfWebRequest $request 
     * @return array 
     */
    protected abstract function validateRemove(sfWebRequest $request);

    /**
     * Acciones anteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param sfWebRequest $request 
     * @return array 
     */
    protected abstract function preprocessRequest($Action, sfWebRequest $request);

    /**
     * Acciones posteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param sfWebRequest $request 
     * @return array 
     */
    protected abstract function postprocessRequest($Action, sfWebRequest $request, $list_data_post);

    /**
     *
     * @param sfWebRequest $request 
     */
    protected function add(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");
//        }
//        $this->logMessage("---END Logging request");

        /*
         * Variables globales del proyecto
         */
        $modulo = sfConfig::get('app_modulo');
        $usuarioERP = sfConfig::get('app_usuarioERP');
        $claveERP = sfConfig::get('app_claveERP');
        $tablaComandos = sfConfig::get('app_tablaComandos');
        $tabla_log = sfConfig::get('app_tablaLog');
        $tabla_seg = sfConfig::get('app_tablaSeg');
        $tabla_vig_seg = sfConfig::get('app_tablaVigSeg');



        /*
         * Validar errores de procedimiento
         */
        try {

            /**
             * variables por defecto para el registro de log
             */
            $id_tabla = 'null';

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD($this->table_name);

            //1 - indica operacion de consultar
            //2 - indica operacion de actualizar
            //3 - indica operacion de adicionar
            //4 - indica operacion de eliminar
            //5 - indica operacion de anular
            $id_ope_bd = 3;

            //id del usuario
            $usuario = 1;
            if (isset($request['id_username'])) {
                $usuario = $request['id_username'];
            }

            //username
            $username = '1';
            if (isset($request['username'])) {
                $username = $request['username'];
            }

            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }




            /*
             * Observacion personalizada - 20120919
             */
            if ($this->observacion_add != false) {
                $this->logMessage('Entro a personalizar observacion.');
                $observacion = "'";

                /*
                 * Se divide el string de la observacion por &
                 */
                $keys = explode("&", $this->observacion_add);
                foreach ($keys as $value) {

                    /*
                     * Calida si es variable de request
                     */
                    if (preg_match('/request/', $value)) {
                        $keys_req = explode("-", $value);

                        //valida variable en el request
                        if (isset($request[$keys_req[1]])) {

                            $value = $request[$keys_req[1]];
                        }
                    }

                    $observacion .= $value;
                }

                $observacion .= "'";
            } else {
                $this->logMessage('No entro a personalizar observacion.');
                /*
                 * construir observacion
                 */
                $observacion = "'Se adiciono " . $this->id_unico . ": " . $id_tabla . " desde la funcionalidad: " . $comando . "'";
            }


            $id_punto_venta_log = 'null';
            if (isset($request['punto_venta_log'])) {
                $id_punto_venta_log = $request['punto_venta_log'];
            }

            $values = array();

            /* if (!is_null($this->uq_n2f)) {
              foreach ($this->uq_n2f as $value) {
              $values[$value] = 0;
              }
              } */

            //obtener id_ter_genero para el registro de control CAD
            if (isset($request['id_username'])) {
                $request['id_ter_genero'] = $request['id_username'];
//                $request['id_mae_ter'] = $request['id_username'];
            }

            //agrega los valores de idname, field_name y id_cia a una sola variable
            foreach ($this->id_names as $value) {
                $values[$value] = $request[$value];
            }
            //agrega los valores
            foreach ($this->field_names as $value) {
                if (isset($request[$value])) {
                    //convierte los valores si son booleanos a 0 ó 1
                    $values[$value] = $this->extractIfBoolean($request[$value]);
                }
            }

            /*
             * campos para fecha sistema
             */
            if (isset($this->campo_fecha_sistema)) {
                if (!is_null($this->campo_fecha_sistema)) {
//sentencia sql
                    $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;
//ejecuta y obtiene el resultado del sql
                    CN_TABLE::executeSQL($sql);

                    foreach ($this->campo_fecha_sistema as $campo_fecha) {


                        $values[$campo_fecha] = CN_TABLE::fechaSistema();
                    }
                }
            }

            /*
             * campos para fecha sistema
             */
            if (isset($this->campo_fecha_sistema_hora)) {
                if (!is_null($this->campo_fecha_sistema_hora)) {
//sentencia sql
                    $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD HH24:MI:SS"
EOD;
//ejecuta y obtiene el resultado del sql
                    CN_TABLE::executeSQL($sql);

                    foreach ($this->campo_fecha_sistema_hora as $campo_fecha) {


//sentencia sql
                        $sql = <<<EOD
select sysdate from dual
EOD;
//ejecuta y obtiene el resultado del sql
                        $fecha_sistema = CN_TABLE::executeSQL($sql);

                        $values[$campo_fecha] = $fecha_sistema[0]['sysdate'];
                    }
                }
            }

//agraga id compañia si la tabla lo requiere
            if ($this->has_id_cia) {
                $values['id_cia'] = $request['id_cia'];
            }

//            $this->logMessage("--------------------------------------------------*****");
//Agrega valores si son diferentes de null
            if (!is_null($this->other_tab_uq_fields)) {
                foreach ($this->other_tab_uq_fields as $key => $tab_props) {
                    $keys = explode(",", $key);
                    foreach ($keys as $value) {
//                        $this->logMessage("--------------------------------------------------1*****" . $value);
                        if (isset($request[$value])) {
                            $values[$value] = $this->extractIfBoolean($request[$value]);
//                            $this->logMessage("--------------------------------------------------2*****" . $values[$value]);
                        } else {
                            $values[$value] = 0;
//                            $this->logMessage("--------------------------------------------------3*****" . $values[$value]);
                        }
                    }
                }
            }
//            die();
            /*
             * registro de consulta en tabla de log
             */
            if (!$this->log_crud) {
                $this->logMessage("[sfApiActions] Entro registro LOG.");

                $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $usuario, $username, $comando, $observacion);
            } else {
                $this->logMessage("[sfApiActions] NO entro registro LOG.");
            }

            /*
             * Agrega la fila segun los campos que se ingresen
             */
            $inserted = CN_TABLE::addRow($this->table_name, $values, $this->id_name, $this->id_names, $this->field_names, $this->has_id_cia, $this->has_activo, $this->check_exists, $this->has_vigencia, $this->other_tab_uq_fields, $this->has_secuencia
            );

            /*
             * Valida si se inserto y devuelve la fila nueva
             */
            if ($inserted != null) {

                /*
                 * registro de consulta en tabla de log ----- no esta funcionando
                 */
//                if (!$this->log_crud) {
//                    $this->logMessage("[sfApiActions] Entro registro LOG.");
//                $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $usuario, $username, $comando, $observacion);
//                } else {
//                    $this->logMessage("[sfApiActions] NO entro registro LOG.");
//                }

                $this->list_data = array($this->convertActivoValueBoolean($inserted->toArray()));
            } else {
                $this->logMessage("[sfApiAction] Error al guardar registro.");
                $this->list_data = array();
            }


            /*
             * Registro de consulta en tabla de log
             */
            if (!$this->log_crud) {

                $this->logMessage("[sfApiAction] Actualizar id del ultimo insertado para el log.");

                /*
                 * Observacion personalizada - 20120919
                 */
                if ($this->observacion_add != false) {
                    $this->logMessage('[ADD sfApiAction] Entro a personalizar observacion.');
                } else {
                    $this->logMessage('[ADD sfApiAction] No entro a personalizar observacion.');

                    /*
                     * actualizar id del ultimo insertado para el log
                     */
                    //sentencia sql
                    $sql = <<<EOD
select nvl(max(id_log),0) as id_log from $tabla_log
EOD;

                    //ejecutar sql
                    $records = CN_TABLE::executeOCI_SQL_List($sql, $usuarioERP, $claveERP);

                    //validar resultados
                    if (count($records) > 0) {

                        $id_log = $records[0]['ID_LOG'];

                        //sentencia sql
                        $sql = <<<EOD
select nvl(max($this->id_unico),0) as $this->id_unico from $this->table_name
EOD;

                        //ejecutar sql
                        $records = CN_TABLE::executeOCI_SQL_List($sql, $usuarioERP, $claveERP);

                        $id_name = strtoupper($this->id_unico);
                        $id_tabla = $records[0][$id_name];

                        //verificar si el dato es un string
                        if (is_string($id_tabla)) {
                            $this->logMessage("[sfApiActions] id_tabla is_string: " . $id_tabla . ". Forzar cast int.");

                            //forzar el cast
                            try {
                                $id_tabla = (int) $id_tabla;
                            } catch (Exception $exc) {
                                $id_tabla = 'null';
                            }
                        }

//                        $this->list_data[0][$this->id_unico] = $id_tabla; //verificar este funcionamiento - 20120920
                        $observacion = "'Se adiciono " . $this->id_unico . ": " . $id_tabla . " desde la funcionalidad: " . $comando . "'";





                        //sentencia sql
                        $sql = <<<EOD
UPDATE $tabla_log
SET ID_TABLA = $id_tabla , OBSERVACION = $observacion
WHERE ID_LOG = $id_log
EOD;
                        $this->logMessage("[sfApiActions] SQL " . $sql);

                        //ejecutar sql
                        $exito = CN_TABLE::executeOCI_SQL_Add($sql, $usuarioERP, $claveERP);
                        $this->logMessage("[sfApiAction] Se pudo actualizar id del log.");
                    }
                }
            } else {
                $this->logMessage("[sfApiAction] No se pudo actualizar id del log.");
            }
        } catch (Doctrine_Connection_Exception $e) {

            $mensaje = "[ADD sfAPIActions] ERROR Doctrine_Connection_Exception !!!";
            $mensaje_es = "[ADD sfAPIActions] ERROR Ejecución de operaciones SQL !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "ADD"
            );

            $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();
        } catch (Exception $e) {

            $mensaje = "[ADD sfAPIActions] ERROR Exception !!!";
            $mensaje_es = "[ADD sfAPIActions] ERROR Excepciones en la ejecución !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "ADD"
            );

            $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();
        }
    }

    /**
     *
     * @param sfWebRequest $request 
     */
    protected function update(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");
//        }
//        $this->logMessage("---END Logging request");



        /*
         * variables por defecto para el registro de log
         */
        //obtiene el valor para su identificador unico
        $id_tabla = 'null';
        if (isset($request[$this->id_unico])) {
            //el id no es texo
            if (!isset($this->has_name_texto)) {
                $id_tabla = $request[$this->id_unico];
            }
        }

        //obtener id maestro tabla
        $id_mae_bd = CN_TABLE::consultarIdTablaBD($this->table_name);

        //1 - indica operacion de consultar
        //2 - indica operacion de actualizar
        //3 - indica operacion de adicionar
        //4 - indica operacion de eliminar
        //5 - indica operacion de anular
        $id_ope_bd = 2;

        //id del usuario
        $usuario = 1;
        if (isset($request['id_username'])) {
            $usuario = $request['id_username'];
        }

        //username
        $username = '1';
        if (isset($request['username'])) {
            $username = $request['username'];
        }

        //comando que identifica la funcionalidad
        $comando = 'sin comando';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }
        //validacion para no exeder el maximo de registros en el campo de observacion
        $cambios = $request['_oldValues'];
        if (strlen($cambios) > 400) {
            $this->logMessage(" ********************** Se exedio el tamaño del campo.");
            $cambios = substr($cambios, 0, 400);
        }
        $this->logMessage(" ");



        /*
         * Observacion personalizada - 20120919
         */
        if ($this->observacion_update != false) {
            $this->logMessage('[UPDATE sfAPIActions] Entro a personalizar observacion.');
            $observacion = "'";

            /*
             * Se divide el string de la observacion por &
             */
            $keys = explode("&", $this->observacion_update);
            foreach ($keys as $value) {

                /*
                 * Calida si es variable de request
                 */
                if (preg_match('/request/', $value)) {
                    $keys_req = explode("-", $value);

                    //valida variable en el request
                    if (isset($request[$keys_req[1]])) {

                        $value = $request[$keys_req[1]];
                    }
                }

                $observacion .= $value;
            }

            $observacion .= "'";
        } else {
            $this->logMessage('[UPDATE sfAPIActions] No entro a personalizar observacion.');
            /*
             * Construir observacion
             */
            $observacion = 'null';
            if (isset($request['_oldValues'])) {
                $observacion = "'Se modificaron los registros: " . $cambios . " desde la funcionalidad: " . $comando . "'";
            } else {
                $observacion = "'Se modifico " . $this->id_unico . ": " . $id_tabla . " desde la funcionalidad: " . $comando . "'";
            }
        }




        //validar errores de procedimiento
        try {


            //validar si se debe crerar el registro o direccionar
            if ($this->has_check_exists) {
                $check = false;
            } else {
                $check = true;
            }

            /*
             * campos para fecha sistema
             */
            $fecha_sistema = null;
            if (isset($this->campo_fecha_sistema)) {
                if (!is_null($this->campo_fecha_sistema)) {
                    //sentencia sql
                    $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;
                    //ejecuta y obtiene el resultado del sql
                    CN_TABLE::executeSQL($sql);

                    foreach ($this->campo_fecha_sistema as $campo_fecha) {

                        $fecha_sistema[$campo_fecha] = CN_TABLE::fechaSistema();
                    }
                }
            }

//valida se hay consulta de campos de verificacion y el check para asegurar que registre uno nuevo
            if (!is_null($this->check_exists) && $check) {
                $this->logMessage("------------------------ Redirect al executeAdd");
                $this->executeAdd($request);
            } else {

//se obtiene el contenedor para la eliminación con la tabla y campos llave para la actualización
                if (!isset($this->has_name_texto)) {
                    $this->logMessage("has_name_texo: false");
                    $toUpdate = CN_TABLE::getByIdFromContainer($this->table_name, $this->id_names, $request);
                } else {
                    $this->logMessage("has_name_texo: true");
                    $toUpdate = CN_TABLE::getByIdFromContainer($this->table_name, $this->id_names, $request, $this->has_name_texto);
                }

                $resultado = array();

//valida si se obtubo correctamente el contenedor y efectua la actualizacion
                if ($toUpdate) {

//                    foreach ($toUpdate as $value) {
////                        foreach ($value as $val) {
//
//                            $this->logMessage("************************************************ " . $value);
////                        }
//                    }


                    /*
                     * registro de consulta en tabla de log
                     */
                    if (!$this->log_crud) {
                        $this->logMessage("[sfApiActions] Entro registro LOG.");
                        $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $usuario, $username, $comando, $observacion);
                    } else {
                        $this->logMessage("[sfApiActions] NO entro registro LOG.");
                    }

                    $this->logMessage("[sfAPIActions] Entro al toUpdate. " . $toUpdate);
                    CN_TABLE::updateRowFromContainer($toUpdate, $this->field_names, $request, $fecha_sistema);

                    $resultado = $toUpdate->toArray();
                }

                foreach ($resultado as $value) {

                    $this->logMessage("------------- " . $value);
                }

                if ($toUpdate) {
//retorna la fila actualizada
                    $resultado = array($this->convertActivoValueBoolean($toUpdate->toArray()));
                }


//                foreach ($resultado as $value) {
//                    foreach ($value as $val) {
//
//                        $this->logMessage("************************************************ " . $val);
//                    }
//                }
                $this->list_data = $resultado;
            }
        } catch (Doctrine_Connection_Exception $e) {

            $mensaje = "[UPDATE sfAPIActions] ERROR Doctrine_Connection_Exception !!!";
            $mensaje_es = "[UPDATE sfAPIActions] ERROR Ejecución de operaciones SQL !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "UPDATE"
            );

            $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();
        } catch (Exception $e) {

            $mensaje = "[UPDATE sfAPIActions] ERROR Exception !!!";
            $mensaje_es = "[UPDATE sfAPIActions] ERROR Excepciones en la ejecución !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "UPDATE"
            );

            $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();
        }
    }

    /**
     *
     * @param sfWebRequest $request 
     */
    protected function remove(sfWebRequest $request) {

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

        /*
         * validar errores de procedimiento
         */
        try {
            /*
             * variables por defecto para el registro de log
             */
            //obtiene el valor para su identificador unico
            $id_tabla = 'null';
            if (isset($request[$this->id_unico])) {
                $id_tabla = $request[$this->id_unico];
            }

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD($this->table_name);

            //1 - indica operacion de consultar
            //2 - indica operacion de actualizar
            //3 - indica operacion de adicionar
            //4 - indica operacion de eliminar
            //5 - indica operacion de anular
            $id_ope_bd = 4;

            //id del usuario
            $usuario = 1;
            if (isset($request['id_username'])) {
                $usuario = $request['id_username'];
            }

            //username
            $username = '1';
            if (isset($request['username'])) {
                $username = $request['username'];
            }

            //comando que identifica la funcionalidad
            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }

            /*
             * Observacion personalizada - 20120919
             */
            if ($this->observacion_remove != false) {
                $this->logMessage('[REMOVE sfAPIActions] Entro a personalizar observacion.');
                $observacion = "'";

                /*
                 * Se divide el string de la observacion por &
                 */
                $keys = explode("&", $this->observacion_remove);
                foreach ($keys as $value) {

                    /*
                     * Calida si es variable de request
                     */
                    if (preg_match('/request/', $value)) {
                        $keys_req = explode("-", $value);

                        //valida variable en el request
                        if (isset($request[$keys_req[1]])) {

                            $value = $request[$keys_req[1]];
                        }
                    }

                    $observacion .= $value;
                }

                $observacion .= "'";
            } else {
                $this->logMessage('[REMOVE sfAPIActions] No entro a personalizar observacion.');
                /*
                 * Construir observacion
                 */
                $observacion = "'Se removio " . $this->id_unico . ": " . $id_tabla . " desde la funcionalidad: " . $comando . "'";
            }


            //se obtiene el contenedor para la eliminación con la tabla y campos llave para la eliminacion
            $toDelete = CN_TABLE::getByIdFromContainer($this->table_name, $this->id_names, $request);

            /*
             * registro de consulta en tabla de log
             */
            if (!$this->log_crud) {
                $this->logMessage("[sfApiActions] Entro registro LOG.");
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $usuario, $username, $comando, $observacion);
            } else {
                $this->logMessage("[sfApiActions] NO entro registro LOG.");
            }

            $success = $toDelete->delete();

            //valida operacion efectuada, retorna fila eliminada
            if ($success) {

                /*
                 * registro de consulta en tabla de log ----- no esta funcionando
                 */
//                if (!$this->log_crud) {
//                    $this->logMessage("[sfApiActions] Entro registro LOG.");
//                $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $usuario, $username, $comando, $observacion);
//                } else {
//                    $this->logMessage("[sfApiActions] NO entro registro LOG.");
//                }

                $this->list_data = $this->getIdDisplayArray($request);
                $this->state = 0;
            }
        } catch (Doctrine_Connection_Exception $e) {

            $mensaje = "[REMOVE sfAPIActions] ERROR Doctrine_Connection_Exception !!!";
            $mensaje_es = "[REMOVE sfAPIActions] ERROR Ejecución de operaciones SQL !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "REMOVE"
            );

            $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();
        } catch (Exception $e) {

            $mensaje = "[REMOVE sfAPIActions] ERROR Exception !!!";
            $mensaje_es = "[REMOVE sfAPIActions] ERROR Excepciones en la ejecución !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "REMOVE"
            );

            $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();
        }
    }

    /**
     *
     * @param sfWebRequest $request 
     */
    protected function anular(sfWebRequest $request) {

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





        /*
         * validar errores de procedimiento
         */
        try {

            /*
             * variables por defecto para el registro de log
             */
//obtiene el valor para su identificador unico
            $id_tabla = 'null';
            if (isset($request[$this->id_unico])) {
                $id_tabla = $request[$this->id_unico];
            }

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD($this->table_name);

            //1 - indica operacion de consultar
            //2 - indica operacion de actualizar
            //3 - indica operacion de adicionar
            //4 - indica operacion de eliminar
            //5 - indica operacion de anular
            $id_ope_bd = 5;

            //id del usuario
            $usuario = 1;
            if (isset($request['id_username'])) {
                $usuario = $request['id_username'];
            }

            //username
            $username = '1';
            if (isset($request['username'])) {
                $username = $request['username'];
            }

            //comando que identifica la funcionalidad
            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }

            /*
             * Observacion personalizada - 20120919
             */
            if ($this->observacion_remove != false) {
                $this->logMessage('[ANULAR sfAPIActions] Entro a personalizar observacion.');
                $observacion = "'";

                /*
                 * Se divide el string de la observacion por &
                 */
                $keys = explode("&", $this->observacion_remove);
                foreach ($keys as $value) {

                    /*
                     * Calida si es variable de request
                     */
                    if (preg_match('/request/', $value)) {
                        $keys_req = explode("-", $value);

                        //valida variable en el request
                        if (isset($request[$keys_req[1]])) {

                            $value = $request[$keys_req[1]];
                        }
                    }

                    $observacion .= $value;
                }

                $observacion .= "'";
            } else {
                $this->logMessage('[ANULAR sfAPIActions] No entro a personalizar observacion.');

                /*
                 * Construir observacion
                 */
                $observacion = "'Se anulo " . $this->id_unico . ": " . $id_tabla . " desde la funcionalidad: " . $comando . "'";
            }


            /*
             * campos para fecha sistema
             */
            $fecha_sistema = null;
//            if (isset($this->campo_fecha_sistema)) {
//                if (!is_null($this->campo_fecha_sistema)) {
////sentencia sql
//                    $sql = <<<EOD
//ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
//EOD;
////ejecuta y obtiene el resultado del sql
//                    CN_TABLE::executeSQL($sql);
//
//                    foreach ($this->campo_fecha_sistema as $campo_fecha) {
//
//                        $fecha_sistema[$campo_fecha] = CN_TABLE::fechaSistema();
//                    }
//                }
//            }
            //se obtiene el contenedor para la eliminación con la tabla y campos llave para la actualización
            if (!isset($this->has_name_texto)) {
                $this->logMessage("has_name_texo: false");
                $toUpdate = CN_TABLE::getByIdFromContainer($this->table_name, $this->id_names, $request);
            } else {
                $this->logMessage("has_name_texo: true");
                $toUpdate = CN_TABLE::getByIdFromContainer($this->table_name, $this->id_names, $request, $this->has_name_texto);
            }

            $resultado = array();

            //valida si se obtubo correctamente el contenedor y efectua la actualizacion
            if ($toUpdate) {

                $this->logMessage("[sfAPIActions] Entro al toUpdate. " . $toUpdate);
                CN_TABLE::updateRowFromContainer($toUpdate, $this->field_names, $request, $fecha_sistema);

                $resultado = $toUpdate->toArray();

                /*
                 * registro de consulta en tabla de log
                 */
                if (!$this->log_crud) {
                    $this->logMessage("[sfApiActions] Entro registro LOG.");
                    $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $usuario, $username, $comando, $observacion);
                } else {
                    $this->logMessage("[sfApiActions] NO entro registro LOG.");
                }
            }

            foreach ($resultado as $value) {

                $this->logMessage("------------- " . $value);
            }

            if ($toUpdate) {
                //retorna la fila actualizada
                $resultado = array($this->convertActivoValueBoolean($toUpdate->toArray()));
            }

            $this->list_data = $resultado;
        } catch (Doctrine_Connection_Exception $e) {

            $mensaje = "[ANULAR sfAPIActions] ERROR Doctrine_Connection_Exception !!!";
            $mensaje_es = "[ANULAR sfAPIActions] ERROR Ejecución de operaciones SQL !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "ANULAR"
            );

            $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();
        } catch (Exception $e) {

            $mensaje = "[ANULAR sfAPIActions] ERROR Exception !!!";
            $mensaje_es = "[ANULAR sfAPIActions] ERROR Excepciones en la ejecución !!!";

            //Se cambia para que no devuelva el error de SQL o PHP, sino solo lo ponga en el log - 20190213
            $this->list_errors = array(
                'Code' => $e->getCode(),
                //'Message' => $e->getMessage(),
                'Message' => $mensaje_es,
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                'operacion' => "ANULAR"
            );

            $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();
        }
    }

}

?>
