<?php

/**
 * inf_cierre_caja actions.
 *
 * @package    cartera
 * @subpackage inf_cierre_caja
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class inf_cierre_cajaActions extends sfQuery {

    // 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 list de accesos
     *
     * @param sfRequest $request A request object
     */
    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");
        }
        $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 {

            /*
             * Paginacion
             */
            if (isset($request['_startRow'])) {
                $rowStart = $request['_startRow'];
            } else {
                $rowStart = 0;
            }

            if (isset($request['_endRow'])) {
                $rowEnd = $request['_endRow'];
            } else {
                $rowEnd = 75;
            }

            /*
             * variables de filtro
             */

            $whereCaja = ' ';
            $whereCajaPOS = ' ';
            if (isset($request['id_caja'])) {
                $username = $request['id_caja'];
                $whereCaja = " AND tab0.id_caja = '" . $request['id_caja'] . "' ";
                $whereCajaPOS = " AND pos.id_caja = '" . $request['id_caja'] . "' ";
            }

            $whereFacturas = ' ';
            $whereFacturasPOS = ' ';
            if (isset($request['sec_factura_ini']) && isset($request['sec_factura_fin'])) {
                $whereFacturas = " AND tab0.sec_factura between  '" . $request['sec_factura_ini'] . "' and '" . $request['sec_factura_fin'] . "'";
                $whereFacturasPOS = " AND pos.sec_factura between  '" . $request['sec_factura_ini'] . "' and '" . $request['sec_factura_fin'] . "'";
            }

            //estado caja para conocer fechas de cierre - 20160830
            $id_estado_caja = $request['id_estado_caja'];

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

            //id de companhia
            $id_cia = 'null';
            if (isset($request['id_cia'])) {
                $id_cia = $request['id_cia'];
            }

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

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('ca_usuario');

            //id del usuario
            $id_usuario = 'null';
            if (isset($request['id_usuario_log'])) {
                $id_usuario = $request['id_usuario_log'];
            }
            //id del tercero del usuario
            $id_tercero = 'null';
            if (isset($request['id_tercero_log'])) {
                $id_tercero = $request['id_tercero_log'];
            }
            //comando de funcionalidad
            $cod_func = 'sin comando';
            if (isset($request['cod_func'])) {
                $cod_func = $request['cod_func'];
            }

            //construir observacion
            $observacion = "'Se consulto informe de cierre de caja";

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             * Se coloca valor dif_cambio para el inf de cierre - 20160830
             */
            $sql = <<<EOD
select count(*) as count from(

select table1.*, tab2.descripcion from

(select tab1.id_ts_pc_fp, 
count(tab1.id_factura_pago) as transacciones,
sum(tab1.valor) as valor_total,--_pag,
sum(tab0.valor_total) as valor_total_tot,
sum(tab0.valor_total) as valor_total_pos,
(
    select 
    --pos.id_factura,
    --pos.valor_total,
    --sum(pag.valor) as valor,
    --sum(pag.valor) - pos.valor_total as dif_cambio
    sum(sum(pag.valor) - pos.valor_total) as dif_cambio
    from ca_factura_pos pos 
    join ca_factura_pago pag 
    on pos.id_factura=pag.id_factura 
                            
    where 
    pos.id_factura = pos.id_factura
    and pos.estado=1  $whereCajaPOS $whereFacturasPOS
    and trunc(pos.fecha_facturacion) between (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = (
            select id_estado_caja 
            from ca_estado_caja 
            where sesion = (select sesion from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_punto_venta = (select id_punto_venta from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_caja = (select id_caja from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and estado = 1
        ))
        and (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = $id_estado_caja)
    
    group by
    pos.id_factura,
    pos.valor_total
) as dif_cambio
from ca_factura_pos tab0 
join ca_factura_pago tab1 
on tab0.id_factura=tab1.id_factura 
                    
where tab0.estado=1 $whereCaja $whereFacturas
and trunc(tab0.fecha_facturacion) between (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = (
                    select id_estado_caja 
            from ca_estado_caja 
            where sesion = (select sesion from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_punto_venta = (select id_punto_venta from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_caja = (select id_caja from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and estado = 1
    ))
    and (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = $id_estado_caja)
                    
group by tab1.id_ts_pc_fp)table1 join ts_pc_fp tab2 on table1.id_ts_pc_fp=tab2.id

union

SELECT NULL, 
count(tab1.id_factura_pago) as transacciones,
-sum(tab1.valor) as valor_total,--_pag,
sum(tab0.valor_total) as valor_total_tot,
sum(tab0.valor_total) as valor_total_pos,
0 as dif_cambio,
'ANULADAS' as descripcion 
FROM ca_factura_pos tab0 
join ca_factura_pago tab1 
ON tab0.id_factura=tab1.id_factura 
                    
where tab0.estado=0  $whereCaja $whereFacturas
and trunc(tab0.fecha_facturacion) between (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = (
                    select id_estado_caja 
            from ca_estado_caja 
            where sesion = (select sesion from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_punto_venta = (select id_punto_venta from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_caja = (select id_caja from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and estado = 1
   ))
    and (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = $id_estado_caja)

)tabla
EOD;

            $total_record_count = CN_TABLE::executeSQL($sql);
            $total_record_count = $total_record_count[0]["count"];

            //validar si hay registros
            if ($total_record_count > 0) {


                /*
                 * Obtiene el registo de usuario si se encuentra autenticado
                 * Se coloca valor dif_cambio para el inf de cierre - 20160830
                 */
                $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
 
select table1.*, tab2.descripcion from

(select tab1.id_ts_pc_fp, 
count(tab1.id_factura_pago) as transacciones,
sum(tab1.valor) as valor_total,--_pag,
sum(tab0.valor_total) as valor_total_tot,
sum(tab0.valor_total) as valor_total_pos,
(
    select 
    --pos.id_factura,
    --pos.valor_total,
    --sum(pag.valor) as valor,
    --sum(pag.valor) - pos.valor_total as dif_cambio
    sum(sum(pag.valor) - pos.valor_total) as dif_cambio
    from ca_factura_pos pos 
    join ca_factura_pago pag 
    on pos.id_factura=pag.id_factura 
                            
    where 
    pos.id_factura = pos.id_factura
    and pos.estado=1  $whereCajaPOS $whereFacturasPOS
    and trunc(pos.fecha_facturacion) between (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = (
                    select id_estado_caja 
            from ca_estado_caja 
            where sesion = (select sesion from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_punto_venta = (select id_punto_venta from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_caja = (select id_caja from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and estado = 1
   ))
        and (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = $id_estado_caja)
    
    group by
    pos.id_factura,
    pos.valor_total
) as dif_cambio
from ca_factura_pos tab0 
join ca_factura_pago tab1 
on tab0.id_factura=tab1.id_factura 
                        
where tab0.estado=1 $whereCaja $whereFacturas
and trunc(tab0.fecha_facturacion) between (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = (
                    select id_estado_caja 
            from ca_estado_caja 
            where sesion = (select sesion from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_punto_venta = (select id_punto_venta from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_caja = (select id_caja from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and estado = 1
   ))
    and (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = $id_estado_caja)
                        
group by tab1.id_ts_pc_fp)table1 join ts_pc_fp tab2 on table1.id_ts_pc_fp=tab2.id

union

SELECT NULL, 
count(tab1.id_factura_pago) as transacciones,
-sum(tab1.valor) as valor_total,--_pag,
sum(tab0.valor_total) as valor_total_tot,
sum(tab0.valor_total) as valor_total_pos,
0 as dif_cambio,
'ANULADAS' as descripcion 
FROM ca_factura_pos tab0 
join ca_factura_pago tab1 
ON tab0.id_factura=tab1.id_factura
                        
where tab0.estado=0  $whereCaja $whereFacturas
and trunc(tab0.fecha_facturacion) between (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = (
                    select id_estado_caja 
            from ca_estado_caja 
            where sesion = (select sesion from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_punto_venta = (select id_punto_venta from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_caja = (select id_caja from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and estado = 1
   ))
    and (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = $id_estado_caja)
    
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart 
EOD;

                $records = CN_TABLE::executeSQL($sql);
                $this->logMessage("[inf_cierre_caja] Exitoso.");
                $this->totalRows = $total_record_count;
                $this->startRow = $rowStart;
                $this->endRow = $rowEnd;
                $this->list_data = $records;
            } else {

                $id_usuario = 0;
                $this->logMessage("[inf_cierre_caja] No Exitoso");
                $mensaje = "[inf_cierre_caja] No hay registros de consulta.";
                $this->totalRows = 1;
                $this->startRow = $rowStart;
                $this->endRow = $rowEnd;
                $this->list_data = array();
                $this->logMessage($mensaje);
            }

            /*
             * registro de consulta en tabla de log
             */
            //$sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_usuario, $cod_func, $observacion);
        } catch (Exception $e) {

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

    /**
     * Metodo list de accesos
     *
     * @param sfRequest $request A request object
     */
    public function executeSum(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 {

            /*
             * Paginacion
             */
            if (isset($request['_startRow'])) {
                $rowStart = $request['_startRow'];
            } else {
                $rowStart = 0;
            }

            if (isset($request['_endRow'])) {
                $rowEnd = $request['_endRow'];
            } else {
                $rowEnd = 75;
            }

            /*
             * variables de filtro
             */

            //estado caja para conocer fechas de cierre - 20160830
            $id_estado_caja = $request['id_estado_caja'];

            $whereCaja = ' ';
            if (isset($request['id_caja'])) {
                $username = $request['id_caja'];
                $whereCaja = " AND tab0.id_caja = '" . $request['id_caja'] . "' ";
            }

            $whereFacturas = ' ';
            if (isset($request['sec_factura_ini']) && isset($request['sec_factura_fin'])) {
                $whereFacturas = " AND tab0.sec_factura between  '" . $request['sec_factura_ini'] . "' and '" . $request['sec_factura_fin'] . "'";
            }

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

            //id de companhia
            $id_cia = 'null';
            if (isset($request['id_cia'])) {
                $id_cia = $request['id_cia'];
            }

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

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('ca_usuario');

            //id del usuario
            $id_usuario = 'null';
            if (isset($request['id_usuario_log'])) {
                $id_usuario = $request['id_usuario_log'];
            }
            //id del tercero del usuario
            $id_tercero = 'null';
            if (isset($request['id_tercero_log'])) {
                $id_tercero = $request['id_tercero_log'];
            }
            //comando de funcionalidad
            $cod_func = 'sin comando';
            if (isset($request['cod_func'])) {
                $cod_func = $request['cod_func'];
            }

            //construir observacion
            $observacion = "'Se consulto informe de cierre de caja";

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
            $sql = <<<EOD
select count(*) as count from(

SELECT 
* 
FROM 

(
SELECT 
count(id_factura) as transacciones_efectivas,
sum(tab0.valor_total) as valor_total, 
sum(tab0.valor_bruto) as valor_bruto, 
sum(tab0.valor_iva) as valor_iva 
FROM ca_factura_pos tab0 
WHERE 1=1 AND tab0.estado=1  $whereCaja $whereFacturas
and trunc(tab0.fecha_facturacion) between (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = (
                    select id_estado_caja 
            from ca_estado_caja 
            where sesion = (select sesion from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_punto_venta = (select id_punto_venta from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_caja = (select id_caja from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and estado = 1
   ))
and (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = $id_estado_caja)
), 
(
SELECT count(id_factura) as transacciones FROM ca_factura_pos tab0
WHERE 1=1   $whereCaja $whereFacturas
and trunc(tab0.fecha_facturacion) between (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = (
                    select id_estado_caja 
            from ca_estado_caja 
            where sesion = (select sesion from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_punto_venta = (select id_punto_venta from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_caja = (select id_caja from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and estado = 1
   ))
and (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = $id_estado_caja)
) 

)tabla
EOD;

            $total_record_count = CN_TABLE::executeSQL($sql);
            $total_record_count = $total_record_count[0]["count"];

            //validar si hay registros
            if ($total_record_count > 0) {


                /*
                 * Obtiene el registo de usuario si se encuentra autenticado
                 */
                $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
 
SELECT 
* 
FROM 

(
SELECT 
count(id_factura) as transacciones_efectivas,
sum(tab0.valor_total) as valor_total, 
sum(tab0.valor_bruto) as valor_bruto, 
sum(tab0.valor_iva) as valor_iva 
FROM ca_factura_pos tab0 
WHERE 1=1 AND tab0.estado=1  $whereCaja $whereFacturas
and trunc(tab0.fecha_facturacion) between (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = (
                    select id_estado_caja 
            from ca_estado_caja 
            where sesion = (select sesion from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_punto_venta = (select id_punto_venta from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_caja = (select id_caja from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and estado = 1
   ))
and (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = $id_estado_caja)
), 
(
SELECT count(id_factura) as transacciones FROM ca_factura_pos tab0
WHERE 1=1   $whereCaja $whereFacturas
and trunc(tab0.fecha_facturacion) between (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = (
                    select id_estado_caja 
            from ca_estado_caja 
            where sesion = (select sesion from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_punto_venta = (select id_punto_venta from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and id_caja = (select id_caja from ca_estado_caja where id_estado_caja = $id_estado_caja)
            and estado = 1
   ))
and (select trunc(est.fecha_estado) from ca_estado_caja est where est.id_estado_caja = $id_estado_caja)
) 

) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart 
EOD;

                $records = CN_TABLE::executeSQL($sql);
                $this->logMessage("[inf_cierre_caja] Exitoso.");
                $this->totalRows = $total_record_count;
                $this->startRow = $rowStart;
                $this->endRow = $rowEnd;
                $this->list_data = $records;
            } else {

                $id_usuario = 0;
                $this->logMessage("[inf_cierre_caja] No Exitoso");
                $mensaje = "[inf_cierre_caja] No hay registros de consulta.";
                $this->totalRows = 1;
                $this->startRow = $rowStart;
                $this->endRow = $rowEnd;
                $this->list_data = array();
                $this->logMessage($mensaje);
            }

            /*
             * registro de consulta en tabla de log
             */
            //$sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_usuario, $cod_func, $observacion);
        } catch (Exception $e) {

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

}
