<?php

/**
 * ca_deb_anu actions.
 * 
 * Se crea para la anulacion de debitos desde canon - 20160810
 *
 * @package    cartera
 * @subpackage ca_deb_anu
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class ca_deb_anuActions extends sfQuery {
    /*
     * ------------VARIABLES PARA SERVICIOS DE CONSULTA - LIST
     */

    protected $table_names = array(
        'CA_DEBITO',
        'CA_DEBITO_REF',
        'CA_PUNTO_VENTA',
        'CA_EJE_CUE_VEN_PUNTO',
        'CA_TIPO_DEBITO',
        'RE_MINERAL',
        'INTERCEROS_V',
        'CA_TIP_MON',
        'USUARIO'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'CA_DEBITO_REF,LEFT' =>
        array(
            'id_debito' => 'CA_DEBITO'
        ),
        'CA_PUNTO_VENTA' =>
        array(
            'id_punto_venta' => 'CA_DEBITO'
        ),
        'CA_TIPO_DEBITO' =>
        array(
            'id_tipo_debito' => 'CA_DEBITO'
        ),
        'CA_TIP_MON' =>
        array(
            'id_tip_mon' => 'CA_DEBITO'
        ),
        'RE_MINERAL,LEFT' =>
        array(
            'id_referencia1-id_mineral' => 'CA_DEBITO_REF'
        ),
        'INTERCEROS_V' =>
        array(
            'id_mae_ter' => 'CA_DEBITO'
        ),
        'CA_EJE_CUE_VEN_PUNTO,LEFT' =>
        array(
            'id_mae_ter_ven-id_mae_ter' => 'CA_DEBITO'
        ),
        'USUARIO,LEFT' =>
        array(
            'usuariolog-username' => 'CA_DEBITO'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CA_DEBITO' =>
        array(
            'id_debito' => 'id_debito',
            'id_anhos' => 'id_anhos',
            'id_punto_venta' => 'id_punto_venta',
            'id_tipo_debito' => 'id_tipo_debito',
            'sec_debito' => 'sec_debito',
            'id_mae_ter' => 'id_mae_ter',
            'fecha_proceso' => 'fecha_proceso',
            'fecha_vencimiento' => 'fecha_vencimiento',
            'dias_pago' => 'dias_pago',
            'valor_bruto' => 'valor_bruto',
            'valor_iva' => 'valor_iva',
            'valor_dcto' => 'valor_dcto',
            'porcen_dcto' => 'porcen_dcto',
            'valor_total' => 'valor_total',
            'id_mae_ter_ven' => 'id_mae_ter_ven',
            'observaciones' => 'observaciones',
            'id_tip_mon' => 'id_tip_mon',
            'valor_moneda' => 'valor_moneda',
            'trm_debito' => 'trm_debito',
            'estado' => 'estado',
            'fecha_anu' => 'fecha_anu',
            'motivo_anu' => 'motivo_anu',
            'periodo_ini' => 'periodo_ini',
            'periodo_fin' => 'periodo_fin',
            'usuariolog' => 'usuariolog',
            'id_pr_tipo_ingre' => 'id_pr_tipo_ingre'
        ),
        'CA_DEBITO_REF' =>
        array(
            'id_referencia1' => 'id_referencia1',
            'id_referencia2' => 'id_referencia2',
            'id_referencia2,||,id_referencia1' => 'titulo_minero'
        ),
        'CA_PUNTO_VENTA' =>
        array(
            'nombre' => 'punto_venta'
        ),
        'CA_TIPO_DEBITO' =>
        array(
            'descripcion' => 'tipo_debito'
        ),
        'CA_TIP_MON' =>
        array(
            'codigo' => 'codigo_tm',
            'descripcion' => 'tipo_moneda',
            'simbolo' => 'simbolo',
            'local' => 'local',
            'abrev_fac' => 'abrev_fac'
        ),
        'RE_MINERAL' =>
        array(
            'cod_mineral,||,descripcion' => 'mineral',
            'cod_mineral,||, ,||,descripcion' => 'mineral_completo'
        ),
        'INTERCEROS_V' =>
        array(
            'num_doc' => 'num_doc',
            'razon_soc' => 'razon_soc',
            'num_doc,||, - ,||,razon_soc' => 'tercero',
            'num_doc,||, - ,||,papellido,||,  ,||,sapellido,||, ,||,pnombre,||, ,||,snombre' => 'nombre_completo',
        ),
        'CA_EJE_CUE_VEN_PUNTO' =>
        array(
            'num_doc' => 'num_doc_ven',
            'razon_soc' => 'razon_soc_ven',
            'num_doc,||, - ,||,razon_soc' => 'vendedor'
        ),
        'USUARIO' =>
        array(
            'num_doc' => 'num_doc_usuario',
            'nombre,||, ,||,apellido' => 'nombre_usuario',
            'num_doc,||, - ,||,nombre,||, ,||,apellido' => 'completo_usuario'
        )
    ); //por cada tabla especificar los campos del select
    protected $table_field_conditions = array(
        'CA_DEBITO' => array(
//            'id_debito,a' => array('!=' => array(-1)),
            'id_debito' => array('=' => array('id_debito')),
            'id_anhos' => array('=' => array('id_anhos')),
            'id_punto_venta' => array('=' => array('id_punto_venta')),
            'id_tipo_debito' => array('=' => array('id_tipo_debito')),
            'sec_debito' => array('LIKE' => array('sec_debito')),
            'id_mae_ter' => array('=' => array('id_mae_ter')),
            'fecha_proceso' => array('BETWEENFECHA' => array('fecha_ini', 'fecha_fin')),
            'fecha_anu' => array('BETWEENFECHA' => array('fecha_ini_anu', 'fecha_fin_anu')),
            'id_mae_ter_ven' => array('=' => array('id_mae_ter_ven')),
            'id_tip_mon' => array('=' => array('id_tip_mon')),
            'estado' => array('=' => array('estado')),
            'valor_total,a' => array('>=' => array('valor_ini')),
            'valor_total,b' => array('<=' => array('valor_fin')),
            'valor_total,c' => array('=' => array('valor_exacto')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        ),
        'CA_DEBITO_REF' => array(
            'id_referencia2' => array('=' => array('id_referencia2')),
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $query_qualifier = 'DISTINCT'; //eliminar filas repetivas de consulta sql
    protected $fields_orderBy = array(
        'id_anhos', 'fecha_proceso', 'sec_debito'
    ); //campos para el ordenamiento de la consulta

    /*
     * 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 SERVICIO DE SUMATORIA - SUM
     *
     */
    protected $summatory_data = array(
        'CA_DEBITO' => array(
            'fields' => array(
                'case  when estado = 1 then valor_bruto  else 0 end#valor_bruto',
                'case  when estado = 1 then valor_iva  else 0 end#valor_iva',
                'case  when estado = 1 then valor_dcto  else 0 end#valor_dcto',
                'case  when estado = 1 then valor_total  else 0 end#valor_total',
                'case  when estado = 1 then valor_moneda  else 0 end#valor_moneda',
                'trm_debito'),
            'labels' => array('id_anhos,Total'),
            'count' => 'sec_debito'
        ),
    ); //se especifica por tabla los campos de suma y condiciones de filtro


    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_debito'; //identificador de la tabla
    protected $id_names = array('id_debito'); //llave primaria
    protected $field_names = array('id_anhos', 'id_punto_venta', 'id_tipo_debito', 'sec_debito', 'id_mae_ter', 'fecha_proceso', 'fecha_vencimiento', 'dias_pago',
        'valor_bruto', 'valor_iva', 'valor_dcto', 'porcen_dcto', 'valor_total', 'id_mae_ter_ven', 'observaciones', 'id_tip_mon', 'valor_moneda', 'trm_debito',
        'estado', 'fecha_anu', 'motivo_anu', 'periodo_ini', 'periodo_fin', 'usuariolog', 'id_pr_tipo_ingre'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'CA_DEBITO'; //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_debito'; //identificador unico de la tabla

    /**
     * Metodo para anular el debito
     *
     * @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_debito = $request['id_debito'];
//            $fecha_sistema = $request['fecha_proceso'];
            $fecha_sistema = CN_TABLE::fechaSistema();
            $motivo_anu = 'null';
            if (isset($request['motivo_anu'])) {
                if ($request['motivo_anu'] != 'null') {
                    $motivo_anu = "'" . "Canon: " . $request['motivo_anu'] . "'";
                } else {
                    $motivo_anu = 'null';
                }
            }

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

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

                //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_debito : " . $id_tabla . " desde la funcionalidad canon: " . $comando . "'";


                $id_punto_venta_log = 'null';
                if (isset($request['punto_venta_log'])) {
                    $id_punto_venta_log = $request['punto_venta_log'];
                }
            }
            /*
             * FNI variables por defecto para el registro de log
             */

            $resultado = array();

            /*
             * Validar si no posee creditos activos para el vencimientos del debito
             */

            //sentencia sql
            $sql = <<<EOD
/*Obtener los registros asociados a un debito,
por los vencimientos al credito*/
select
*
from ca_debito deb

join ca_vencimientos ven
on deb.id_debito = ven.id_debito
and ven.estado = 1
and ven.cancelado = 0

join ca_credito_detalle credet
on ven.id_vencimiento = credet.id_vencimiento

join ca_credito cre
on credet.id_credito = cre.id_credito
and cre.estado = 1

where
deb.id_debito = $id_debito
and deb.estado = 1
EOD;

            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);

            if (count($result) == 0) {
                $this->logMessage("[DEBITO] Se puede anular no existen creditos.");

                //Permita anular únicamente las del mismo mes 
                $sql = <<<EOD
select 
case when to_char(to_date('$fecha_sistema','yyyy-mm-dd'),'yyyy') = to_char(fecha_proceso,'yyyy') 
    and to_char(to_date('$fecha_sistema','yyyy-mm-dd'),'mm') = to_char(fecha_proceso,'mm') 
then 1
else 0
end as mes_fecha 
from ca_debito
where
id_debito = $id_debito 
EOD;

                //ejecuta el sql
                $result = CN_TABLE::executeSQL($sql);

                if (count($result) > 0 && $result[0]['mes_fecha'] == 1) {

                    /*
                     * anular obligacion
                     */
                    //sentencia sql
                    $sql = <<<EOD
UPDATE CA_DEBITO SET estado = 0, fecha_anu = '$fecha_sistema', motivo_anu = $motivo_anu
            WHERE id_debito = $id_debito
EOD;
//                $this->logMessage("---" . $sql);
                    //ejecuta el sql
                    CN_TABLE::executeSQL($sql);



                    /*
                     * anular vencimiento
                     */
                    //sentencia sql
                    $sql = <<<EOD
UPDATE CA_VENCIMIENTOS SET estado = 0, fecha_anu = '$fecha_sistema', motivo_anu = $motivo_anu
            WHERE id_debito = $id_debito
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 del debito anulado
                    $resultado[] = array(
                        'id_debito' => $id_debito,
                        'estado' => false,
                        'fecha_anu' => $fecha_sistema,
                        'motivo_anu' => $motivo_anu/* ,
                              'valor_bruto' => 0,
                              'valor_total' => 0 */
                    );

                    $this->list_data = $resultado;
                    $this->logMessage("Se anulo el DEBITO.");
                } else {

                    $this->status = 1;
                    $this->mensajeError = "DEBITO no corresponde al mes/año del sistema.";
                    $this->list_data = array();
                    $this->logMessage("DEBITO no corresponde al mes/año del sistema.");
                }
            } else {

                $this->status = 1;
                $this->mensajeError = "DEBITO no se puede anular.";
                $this->list_data = array();
                $this->logMessage("DEBITO no se puede anular.");
            }
        } catch (Exception $e) {

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

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

}
