<?php

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

    protected $table_names = array(
        'CA_NOVEDAD_CARTERA',
        'TS_TD',
        'CA_TIPO_NOVEDAD'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'TS_TD' =>
        array(
            'id_ts_td-id' => 'CA_NOVEDAD_CARTERA'
        ),
        'CA_TIPO_NOVEDAD' =>
        array(
            'id_tipo_novedad' => 'CA_NOVEDAD_CARTERA'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CA_NOVEDAD_CARTERA' =>
        array(
            'id_novedad_cartera' => 'id_novedad_cartera',
            'id_tipo_novedad' => 'id_tipo_novedad',
            'num_doc' => 'num_doc',
            'id_ts_td' => 'id_ts_td',
            'fecha_novedad' => 'fecha_novedad',
            'observaciones' => 'observaciones',
            'abierto' => 'abierto',
            'anulado' => 'anulado',
            'fecha_ce' => 'fecha_ce',
            'motivo_ce' => 'motivo_ce',
            'id_vencimiento' => 'id_vencimiento',
            'id_debito' => 'id_debito',
            'saldo' => 'saldo'
        ),
        'TS_TD' =>
        array(
            'documento' => 'documento',
            'descripcion' => 'descripcion_td'
        ),
        'CA_TIPO_NOVEDAD' =>
        array(
            'descripcion' => 'descripcion_tn',
            'desc_corta' => 'desc_corta_tn'
        )
    ); //por cada tabla especificar los campos del select
    protected $table_field_conditions = array(
        'CA_NOVEDAD_CARTERA' => array(
            'id_novedad_cartera,a' => array('!=' => array(-1)),
            'id_novedad_cartera,b' => array('=' => array('id_novedad_cartera')),
            'id_tipo_novedad' => array('=' => array('id_tipo_novedad')),
            'num_doc' => array('=' => array('num_doc')),
            'id_ts_td' => array('=' => array('id_ts_td')),
            'fecha_novedad' => array('BETWEENFECHA' => array('fecha_ini', 'fecha_fin')),
            'abierto' => array('=' => array('abierto')),
            'anulado' => array('=' => array('anulado')),
            'id_vencimiento' => array('=' => array('id_vencimiento')),
            'id_debito' => array('=' => array('id_debito')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $fields_orderBy = array(
        'num_doc'
    ); //campos para el ordenamiento de la consulta
    protected $table_field_obligatory = array('id_debito', 'id_vencimiento'); //campos obligatorios de filtro - estan en el request

    /*
     * Variables manejo de log
     */
    //true - consulta de administracion
    protected $is_admin = false;
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;



    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_novedad_cartera'; //identificador de la tabla
    protected $id_names = array('id_novedad_cartera'); //llave primaria
    protected $field_names = array('id_tipo_novedad', 'num_doc', 'id_ts_td', 'fecha_novedad', 'observaciones', 'abierto', 'anulado', 'fecha_ce', 'motivo_ce', 'id_vencimiento', 'id_debito','saldo'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'CA_NOVEDAD_CARTERA'; //tabla en la cual se aplican los cambios
    protected $has_activo = true; //si posee campo en la tabla de nombre activo ---- ESTADO PARA REGALIAS
    protected $has_vigencia = false; //si posee vigencia
    protected $has_cen_op = false; //si posee centro de operacion
    protected $has_id_cia = false; //si posee compañia
    protected $has_secuencia = true; //si posee secuencia la tabla


    /*
     * Manejo de registro log
     */
    protected $id_unico = 'id_novedad_cartera'; //identificador unico de la tabla

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

        //valor por defecto
        $errors = null;

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

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

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

        //valor por defecto
        $errors = null;

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

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

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

        //valor por defecto
        $errors = null;

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

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    

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

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

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            
        }

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

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

        return $request;
    }

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

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

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            
        }

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

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

        return $request;
    }

    /**
     * Metodo para anular la novedad
     *
     * @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("---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");

        //manejo de errores
        try {

            /*
             * Variables obligatorias
             */
            $id_novedad = $request['id_novedad_cartera'];
            $id_debito = $request['id_debito'];
            $id_vencimiento = $request['id_vencimiento'];
            $fecha_sistema = $request['fecha_ce'];
//            $fecha_sistema = CN_TABLE::fechaSistema();
            $motivo_ce = 'null';
            if (isset($request['motivo_ce'])) {
                if ($request['motivo_ce'] != 'null') {
                    $motivo_ce = "'" . $request['motivo_ce'] . "'";
                } else {
                    $motivo_ce = 'null';
                }
            }


            /*
             * INICIO variables por defecto para el registro de log
             */ {
                //obtiene el valor para su identificador unico
                $id_tabla = $id_novedad;

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

                //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('CA_NOVEDAD_CARTERA');

                //5 - indica operacion de anulacion de registro
                $id_ope_bd = 5;

                //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 anulo id_novedad_cartera : " . $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'];
                }
            }
            /*
             * FIN variables por defecto para el registro de log
             */



            $resultado = array();


            //sentencia sql
            $sql = <<<EOD
select * from ca_novedad_cartera
where 
id_novedad_cartera = $id_novedad
and id_debito = $id_debito
and id_vencimiento = $id_vencimiento
EOD;
            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);

            $anulado = $result[0]['anulado'];
            $abierto = $result[0]['abierto'];


            /*
             * Validar estado de la novedad
             * 1 abierta - 0 cerrada
             * 1 anulada - 0 no anulada
             */

            if ($anulado == 0 && $abierto == 1) {
                $this->logMessage("[NOVEDAD] La novedad esta abierta y no anulada.");


                /*
                 * anular novedad
                 */
                //sentencia sql
                $sql = <<<EOD
UPDATE CA_NOVEDAD_CARTERA SET anulado = 1, fecha_ce = '$fecha_sistema', motivo_ce = $motivo_ce
WHERE
id_novedad_cartera = $id_novedad
and id_debito = $id_debito
and id_vencimiento = $id_vencimiento
EOD;
//                $this->logMessage("---" . $sql);
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);


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


                //resultado de la novedad anulado
                $resultado[] = array(
                    'id_novedad_cartera' => $id_novedad,
                    'id_debito' => $id_debito,
                    'id_vencimiento' => $id_vencimiento,
                    'abierto' => true,
                    'anulado' => true,
                    'fecha_ce' => $fecha_sistema,
                    'motivo_ce' => $motivo_ce
                );

                $this->list_data = $resultado;
                $this->logMessage("[NOVEDAD] Se anulo la NOVEDAD.");
            } else {

                $mensaje = "[NOVEDAD] No se puede anular la novedad, ya esta anulada o cerrada.";
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            $this->status = 1;
            $this->mensajeError = "ERROR!!!";
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Metodo para actualizar estado de abierto la novedad
     *
     * @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("---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");

        //manejo de errores
        try {

            /*
             * Variables obligatorias
             */
            $id_novedad = $request['id_novedad_cartera'];
            $id_debito = $request['id_debito'];
            $id_vencimiento = $request['id_vencimiento'];
            $fecha_sistema = $request['fecha_ce'];
//            $fecha_sistema = CN_TABLE::fechaSistema();
            $motivo_ce = 'null';
            if (isset($request['motivo_ce'])) {
                if ($request['motivo_ce'] != 'null') {
                    $motivo_ce = "'" . $request['motivo_ce'] . "'";
                } else {
                    $motivo_ce = 'null';
                }
            }



            /*
             * INICIO variables por defecto para el registro de log
             */ {
                //obtiene el valor para su identificador unico
                $id_tabla = $id_novedad;

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

                //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('CA_NOVEDAD_CARTERA');

                //2 - indica operacion de actualizar 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'];
                }

                /*
                 * Construir observacion
                 */
                $observacion = "'Se actualizo id_novedad_cartera : " . $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'];
                }
            }
            /*
             * FIN variables por defecto para el registro de log
             */





            $resultado = array();


            //sentencia sql
            $sql = <<<EOD
select 

nov.*,
tipnov.descripcion as descripcion_tn,
td.descripcion as descripcion_td

from ca_novedad_cartera nov

join ca_tipo_novedad tipnov
on tipnov.id_tipo_novedad = nov.id_tipo_novedad

join ts_td td
on td.id = nov.id_ts_td

where 
nov.id_novedad_cartera = $id_novedad
and nov.id_debito = $id_debito
and nov.id_vencimiento = $id_vencimiento 
EOD;
            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);

            $anulado = $result[0]['anulado'];
            $abierto = $result[0]['abierto'];
            
            $resultado [0] = $result[0];

            /*
             * Validar estado de la novedad
             * 1 abierta - 0 cerrada
             * 1 anulada - 0 no anulada
             */

            if ($anulado == 0 && $abierto == 1) {
                $this->logMessage("[NOVEDAD] La novedad esta abierta y no anulada.");


                /*
                 * anular novedad
                 */
                //sentencia sql
                $sql = <<<EOD
UPDATE CA_NOVEDAD_CARTERA SET abierto = 0, fecha_ce = '$fecha_sistema', motivo_ce = $motivo_ce
WHERE
id_novedad_cartera = $id_novedad
and id_debito = $id_debito
and id_vencimiento = $id_vencimiento
EOD;
//                $this->logMessage("---" . $sql);
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);


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


                //resultado de la novedad anulado
//                $resultado[] = array(
//                    'id_novedad_cartera' => $id_novedad,
//                    'id_debito' => $id_debito,
//                    'id_vencimiento' => $id_vencimiento,
//                    'abierto' => false,
//                    'anulado' => false,
//                    'fecha_ce' => $fecha_sistema,
//                    'motivo_ce' => $motivo_ce,
//                    'descripcion_tn' => $descripcion_tn,
//                    'num_doc' => $num_doc,
//                    'descripcion_td' => $descripcion_td,
//                    'fecha_novedad' => $fecha_novedad,
//                    'observaciones' => $observaciones
//                );
                
                $resultado[0]['abierto'] = false;
                $resultado[0]['anulado'] = false;
                $resultado[0]['fecha_ce'] = $fecha_sistema;
                $resultado[0]['motivo_ce'] = $motivo_ce;

                $this->list_data = $resultado;
                $this->logMessage("[NOVEDAD] Se cerro la NOVEDAD.");
            } else {

                $mensaje = "[NOVEDAD] No se puede cerrar la novedad, ya esta anulada o cerrada.";
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            $this->status = 1;
            $this->mensajeError = "ERROR!!!";
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

}
