<?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("---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_moduloCar');
        $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';

                $id_vigencia = 'null';
                $id_cen_op = 'null';

                $id_cia = 'null';
                if ($this->has_id_cia) {
                    if (isset($request['id_cia'])) {
                        $id_cia = $request['id_cia'];
                    }
                }

                //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 maestro tercero
                $id_mae_ter = 1;
                if (isset($request['id_username'])) {
                    $id_mae_ter = $request['id_username'];
                }
                $usuario = 'admin';
                if (isset($request['username'])) {
                    if (!is_null($request['username']) && $request['username'] != '') {
                        $usuario = $request['username'];
                    }
                }
                $comando = 'sin comando';
                if (isset($request['comando'])) {
                    $comando = $request['comando'];
                }

                //construir observacion
                $observacion = "'Se consulto tabla: " . $this->table_name . " desde la funcionalidad: " . $comando . "'";

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


                /*
                 * registro de consulta en tabla de log
                 */
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion, $id_punto_venta_log);
            } 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 !!!";

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

            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Message' => $e->getMessage(),
                    'Line' => $e->getLine(),
                    'Trace' => $e->getTraceAsString(),
                    'mensaje' => $mensaje
                )
            );
        } catch (Exception $e) {

            $mensaje = "[LIST sfAPIActions] ERROR Exception !!!";

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

            $this->status = 2;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Message' => $e->getMessage(),
                    'Line' => $e->getLine(),
                    'Trace' => $e->getTraceAsString(),
                    'mensaje' => $mensaje
                )
            );
        }
    }

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


            $this->list_errors = array(
                'Code' => $e->getCode(),
                'Message' => $e->getMessage(),
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                '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 !!!";


            $this->list_errors = array(
                'Code' => $e->getCode(),
                'Message' => $e->getMessage(),
                '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();
        }
    }

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


            $this->list_errors = array(
                'Code' => $e->getCode(),
                'Message' => $e->getMessage(),
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                '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 !!!";


            $this->list_errors = array(
                'Code' => $e->getCode(),
                'Message' => $e->getMessage(),
                '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();
        }
    }

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


            $this->list_errors = array(
                'Code' => $e->getCode(),
                'Message' => $e->getMessage(),
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                '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 !!!";


            $this->list_errors = array(
                'Code' => $e->getCode(),
                'Message' => $e->getMessage(),
                '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();
        }
    }

    /**
     * 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 == 'activo' || $key == 'corriente' || $key == 'no_corriente' 
                    || $key == 'usa_tercero' || $key == 'usa_auxiliar' || $key == 'usa_cen_cto' 
                    || $key == 'usa_sub_cen_cto' || $key == 'estado' || $key == 'estado_ter' 
                    || $key == 'estado_ven' || $key == 'estado_cre' || $key == 'en_uso' 
                    || $key == 'pago' || $key == 'conf_ach' || $key == 'aplica_regalias' 
                    || $key == 'aplica_suspendido' || $key == 'autorizado' || $key == 'usar_pos' 
                    || $key == 'usar_caja' || $key == 'iva' || $key == 'aplica_ref' || $key == 'cancelado' 
                    || $key == 'aplica_bn' || $key == 'aplica_ingresos' || $key == 'local' 
                    || $key == 'actual' || $key == 'bloqueado' || $key == 'es_pos' || $key == 'abierto' 
                    || $key == 'anulado' || $key == 'usa_rac_soc' || $key == 'enviar_email' 
                    || $key == 'aplica_usura' || $key == 'aplica_cuenta' || $key == 'aplica_inventario' 
                    || $key == 'enviado' || $key == 'recibido'
                    || $key == 'aplica_facilidad_ic' 
                    || $key == 'aplica_facilidad_im'
                    || $key == 'aplica_devolucion'
                    || $key == 'aplica_auto_deb'
                    || $key == 'aplica_intereses'
                    || $key == 'aplica_interes_vence'
                    || $key == 'aplica_excedente'
                    || $key == 'aplica_cartera'
                    || $key == 'aplica_dias'
                    || $key == 'aplica_salvedad'
                    || $key == 'titular'
                    || $key == 'firmado'
                    || $key == 'aplica_interes_banco'
                    || $key == 'aplica_interes_mora'
                    || $key == 'aplica_indexacion'
                    || $key == 'aplica_bloqueo'
                    || $key == 'migracion_sgc'
            ) {
                $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 == 'numero' || $key == 'fecha_anu' || $key == 'motivo_anu' || $key == 'id_bn' || $key == 'id_cb') {
//                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_moduloCar');
        $usuarioERP = sfConfig::get('app_usuarioERP');
        $claveERP = sfConfig::get('app_claveERP');
        $tablaComandos = sfConfig::get('app_tablaComandos');
        $tabla_log = sfConfig::get('app_tablaLog');


        /*
         * variables por defecto para el registro de log
         */

        //validar vigencia
        $id_vigencia = 'null';
        if ($this->has_vigencia) {
            if (isset($request['id_vigencia'])) {
                $id_vigencia = $request['id_vigencia'];
            }
        }

        //validar centro de operacion
        $id_cen_op = 'null';
        if ($this->has_cen_op) {
            if (isset($request['id_cen_op'])) {
                $id_cen_op = $request['id_cen_op'];
            }
        }

        $id_cia = 'null';
        if ($this->has_id_cia) {
            if (isset($request['id_cia'])) {
                $id_cia = $request['id_cia'];
            }
        }

        /*
         * obtiene el valor para su identificador unico
         * realizar consulta segun manejo de secuencia
         */
        $id_tabla = 'null';
        //si posee id_cia
        if ($this->has_id_cia) {

            if (isset($request['id_cia'])) {

                //si posee vigencia
                if ($this->has_vigencia) {
                    if (isset($request['id_vigencia'])) {

                        //no obtiene la ultima secuencia -- corregir la anterior
                        $sql = <<<EOD
select * from CN_TABLE_VIG_SEQ
where NOM_ENTIDAD = '$this->table_name'
and ID_CIA = $id_cia
and ID_VIGENCIA = $id_vigencia
EOD;

                        //ejecuta y obtiene el resultado del sql
                        $record = CN_TABLE::executeSQL($sql);

                        if (count($record) > 0) {
                            $id_tabla = $record[0]['seq'] + 1;
                        }
                    }
                } else {

                    //no obtiene la ultima secuencia -- corregir la anterior
                    $sql = <<<EOD

select * from CN_TABLE_SEQ
where NOM_ENTIDAD = '$this->table_name'
and ID_CIA = $id_cia
EOD;

                    //ejecuta y obtiene el resultado del sql
                    $record = CN_TABLE::executeSQL($sql);

                    if (count($record) > 0) {
                        $id_tabla = $record[0]['seq'] + 1;
                    }
                }
            }
        } else {

            $seq = '_SEQ';

            //sentencia sql obtener secuencia -- arreglar consulta -- error
//            $sql = <<<EOD
//select $this->table_name$seq.currval as $this->id_unico from dual
//EOD;
            //no obtiene la ultima secuencia -- corregir la anterior
            $sql = <<<EOD
select max($this->id_unico) as $this->id_unico from $this->table_name
EOD;

            //ejecuta y obtiene el resultado del sql
            $record = CN_TABLE::executeSQL($sql);

            if (count($record) > 0) {
                $id_tabla = $record[0][$this->id_unico] + 1;
            }
        }


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

        //3 - indica operacion de adicion de registro
        $id_ope_bd = 3;

        //id del maestro tercero
        $id_mae_ter = 1;
        if (isset($request['id_username'])) {
            $id_mae_ter = $request['id_username'];
        }
        $usuario = 'admin';
        if (isset($request['username']) && $request['username'] != '') {
            $usuario = $request['username'];
        }
        $comando = 'sin comando';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }
        /*
         * 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;
          }
          } */

        /*
         * Validar errores de procedimiento
         */
        try {

            //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_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion, $id_punto_venta_log);
            } 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) {
                $this->logMessage("[sfApiAction] SI Actualizar id del ultimo insertado para el log.");
           
                /*
                 * 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_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion);
//                } else {
//                    $this->logMessage("[sfApiActions] NO entro registro LOG.");
//                }

                $this->list_data = array($this->convertActivoValueBoolean($inserted->toArray()));
            } else {
                $this->logMessage("[sfApiAction] NO Actualizar id del ultimo insertado para el log.");
                $this->list_data = array();
            }

            $this->logMessage("[sfApiAction] Actualizar id del ultimo insertado para el log.");
            /*
             * 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;
                        $this->list_data[0][$this->id_unico]=$id_tabla;
                    } catch (Exception $exc) {
                        $id_tabla = 'null';
                    }
                }

                if ($id_tabla == '') {
                    $id_tabla = 'null';
                }
                    
                $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 !!!";

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

            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Message' => $e->getMessage(),
                    'Line' => $e->getLine(),
                    'Trace' => $e->getTraceAsString(),
                    'mensaje' => $mensaje
                )
            );
        } catch (Exception $e) {

            $mensaje = "[ADD sfAPIActions] ERROR Exception !!!";

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

            $this->status = 2;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Message' => $e->getMessage(),
                    'Line' => $e->getLine(),
                    'Trace' => $e->getTraceAsString(),
                    'mensaje' => $mensaje
                )
            );
        }
    }

    /**
     *
     * @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];
            }
        }

        //validar vigencia
        $id_vigencia = 'null';
        if ($this->has_vigencia) {
            if (isset($request['id_vigencia'])) {
                $id_vigencia = $request['id_vigencia'];
            }
        }

        //validar centro de operacion
        $id_cen_op = 'null';
        if ($this->has_cen_op) {
            if (isset($request['id_cen_op'])) {
                $id_cen_op = $request['id_cen_op'];
            }
        }

        //valida si posee compañia
        $id_cia = 'null';
        if ($this->has_id_cia) {
            if (isset($request['id_cia'])) {
                $id_cia = $request['id_cia'];
            }
        }

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

        //2 - indica operacion de edicion de registro
        $id_ope_bd = 2;

        //id del maestro tercero
        $id_mae_ter = 1;
        if (isset($request['id_username'])) {
            $id_mae_ter = $request['id_username'];
        }
        //el username desde qebsafiERP
        $usuario = 'admin';
        if (isset($request['username']) && $request['username'] != '') {
            $usuario = $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(" ");

        /*
         * 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 . "'";
        }



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

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

                    /*
                     * registro de consulta en tabla de log
                     */
                    if (!$this->log_crud) {
                        $this->logMessage("[sfApiActions] Entro registro LOG.");
                        $sql = CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion, $id_punto_venta_log);
                    } 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 !!!";

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

            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Message' => $e->getMessage(),
                    'Line' => $e->getLine(),
                    'Trace' => $e->getTraceAsString(),
                    'mensaje' => $mensaje
                )
            );
        } catch (Exception $e) {

            $mensaje = "[UPDATE sfAPIActions] ERROR Exception !!!";

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

            $this->status = 2;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Message' => $e->getMessage(),
                    'Line' => $e->getLine(),
                    'Trace' => $e->getTraceAsString(),
                    'mensaje' => $mensaje
                )
            );
        }
    }

    /**
     *
     * @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");


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

        //validar vigencia
        $id_vigencia = 'null';
        if ($this->has_vigencia) {
            if (isset($request['id_vigencia'])) {
                $id_vigencia = $request['id_vigencia'];
            }
        }

        //validar centro de operacion
        $id_cen_op = 'null';
        if ($this->has_cen_op) {
            if (isset($request['id_cen_op'])) {
                $id_cen_op = $request['id_cen_op'];
            }
        }

        $id_cia = 'null';
        if ($this->has_id_cia) {
            if (isset($request['id_cia'])) {
                $id_cia = $request['id_cia'];
            }
        }

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

        //4 - indica operacion de eliminacion de registro
        $id_ope_bd = 4;

        //id del maestro tercero
        $id_mae_ter = 1;
        if (isset($request['id_username'])) {
            $id_mae_ter = $request['id_username'];
        }
        //el username desde qebsafiERP
        $usuario = 'admin';
        if (isset($request['username']) && $request['username'] != '') {
            $usuario = $request['username'];
        }
        //comando que identifica la funcionalidad
        $comando = 'sin comando';
        if (isset($request['comando'])) {
            $comando = $request['comando'];
        }

        /*
         * Construir observacion
         */
        $observacion = "'Se removio " . $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'];
        }

        //validar errores de procedimiento
        try {

            //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_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion, $id_punto_venta_log);
            } 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_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $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 !!!";

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

            $this->status = 1;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Message' => $e->getMessage(),
                    'Line' => $e->getLine(),
                    'Trace' => $e->getTraceAsString(),
                    'mensaje' => $mensaje
                )
            );
        } catch (Exception $e) {

            $mensaje = "[REMOVE sfAPIActions] ERROR Exception !!!";

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

            $this->status = 2;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Message' => $e->getMessage(),
                    'Line' => $e->getLine(),
                    'Trace' => $e->getTraceAsString(),
                    'mensaje' => $mensaje
                )
            );
        }
    }

    /**
     *
     * @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);
                    $sql = CN_TABLE::registroTableLog($id_tabla, null, null, null, $id_mae_bd, $id_ope_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 !!!";


            $this->list_errors = array(
                'Code' => $e->getCode(),
                'Message' => $e->getMessage(),
                'Line' => $e->getLine(),
                'Trace' => $e->getTraceAsString(),
                'mensaje' => $mensaje,
                '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 !!!";


            $this->list_errors = array(
                'Code' => $e->getCode(),
                'Message' => $e->getMessage(),
                '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();
        }
    }

}

?>