<?php

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

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

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

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

        //ordenar consulta
        if (isset($request['_sortBy'])) {
            $sortBy = " Order by " . $request['_sortBy'];
        } else {
            $sortBy = 'order by tab0.id_anhos, tab0.id_meses, tab0.codigo_pro, tab0.id_tipo_debito ';
        }

        //solo imprime log la primera vez de consulta
        if ($rowStart == 0) {
            /*
             * variables por defecto para el registro de log
             */
            $id_tabla = 'null';
            $id_vigencia = 'null';
            $id_cen_op = 'null';

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

            //obtener id maestro tabla
            $id_mae_bd = "null";

            //1 - indica operacion de consulta
            $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 log especifico la funcionalidad: " . $comando . "'";

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

        /*
         * Manejo de errores
         */
        try {

            /*
             * Se elimina 2176 - Drummnod de la consulta
             */
            $quitarTercero = " and sal.id_mae_ter != 2176 ";

            /*
             * Variables obligatorias
             */
            $anho = $request['id_anhos'];
            $mes = $request['id_meses'];

            /*
             * Variables opcionales
             */
            //tercero
            if (isset($request['id_mae_ter'])) {
                $whereTercero = " AND tab0.id_mae_ter = " . $request['id_mae_ter'];
            } else {
                $whereTercero = ' ';
            }
            //tipo ingreso
            if (isset($request['id'])) {
                $whereTipoIngreso = " AND tab0.id_pr_tipo_ingre = " . $request['id'];
            } else {
                $whereTipoIngreso = ' ';
            }
            //Punto Venta
            if (isset($request['id_punto_venta'])) {
                $wherePuntoVenta = " AND tab0.id_punto_venta = " . $request['id_punto_venta'];
            } else {
                $wherePuntoVenta = ' ';
            }
            //Producto
            if (isset($request['id_producto'])) {
                $whereProducto = " AND tab0.id_producto = " . $request['id_producto'];
            } else {
                $whereProducto = ' ';
            }
            /**
             * si se tiene el CcCheckBox de nombre "exacto" puede habilitar para valor exacto o un rango de valores
             * cuando es true habilita el parametro:  "valor_exacto" y "valor_total"
             * cuando es false habilita el rango de los parametros: "valor" y "valor_total"
             */
            $whereSaldoActual = " ";
            if (isset($request['exacto'])) {

                if ($request['exacto'] == 'true') {
                    if (isset($request['valor_exacto'])) {
                        if ($request['valor_exacto'] != "") {
                            $whereSaldoActual = " AND tab0.saldo_actual = " . $request['valor_exacto'];
                        }
                    }
                } else {
                    if (isset($request['valor_ini'])) {
                        if ($request['valor_ini'] != "") {
                            $whereSaldoActual = " AND tab0.saldo_actual >= " . $request['valor_ini'];
                        }
                    }
                    if (isset($request['valor_fin'])) {
                        if ($request['valor_fin'] != "") {
                            $whereSaldoActual .= " AND tab0.saldo_actual <= " . $request['valor_fin'];
                        }
                    }
                }
            }


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

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

select 

tab0.id_anhos,
tab0.id_meses,
tab0.id_tipo_debito,
tab0.tipo_debito,
tab0.id_producto,
tab0.codigo_pro,
tab0.descripcion_pro,
count(distinct tab0.id_debito) as cant_deb,
sum(nvl(tab0.valor_total,0)) as valor_total,
sum(nvl(tab0.saldo_anterior,0)) as saldo_anterior,
sum(nvl(tab0.debitos_mes,0)) as debitos_mes,
sum(nvl(tab0.creditos_mes,0)) as creditos_mes,
sum(nvl(tab0.saldo_actual,0)) as saldo_actual,
nvl(sum (tab0.cuarto), 0) as tipo4,
nvl(sum (tab0.quinto), 0) as tipo5,
nvl(sum (tab0.septimo), 0) as tipo7,
tab0.id_pr_tipo_ingre,
nvl(sum (tab0.cuarto), 0) as recursos_propios,
nvl(sum (tab0.quinto), 0) as aportes_nacion,
nvl(sum (tab0.septimo), 0) as recursos_distri,
sum(nvl(tab0.saldo_actual,0)) as total 

from(
    select 
     
    deb.id_debito,
    deb.id_punto_venta,
    deb.id_tipo_debito,
    tab4.descripcion AS tipo_debito,
    deb.valor_total,
    debdet.id_producto,
    pro.codigo AS codigo_pro,
    pro.descripcion AS descripcion_pro,
    sal.id_anhos,
    sal.id_meses,   
    sal.id_mae_ter as id_mae_ter, 
    sal.saldo_anterior,
    sal.debitos_mes,
    sal.creditos_mes,
    sal.saldo_actual,
    nvl(( case when deb.id_pr_tipo_ingre = 4 then sal.saldo_actual else 0 end  ) ,  0) as cuarto,
    nvl(( case when deb.id_pr_tipo_ingre = 5 then sal.saldo_actual else 0 end  ) ,  0) as quinto,
    nvl(( case when deb.id_pr_tipo_ingre = 7 then sal.saldo_actual else 0 end  ) ,  0) as septimo,
    deb.id_pr_tipo_ingre
    
    from ca_debito deb
    
  JOIN CA_TIPO_DEBITO tab4
  ON deb.id_tipo_debito = tab4.id_tipo_debito
    
    left join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.id_debito
        ORDER BY aut.id_debito
       ) AS rn
      from ca_debito_detalle aut
    )debdet
    on deb.id_debito = debdet.id_debito
    and debdet.rn = 1
    
    left JOIN ca_producto pro
    ON pro.id_producto = debdet.id_producto
    
    join ca_vencimientos ven
    on ven.id_debito = deb.id_debito
    
    left join ca_saldos sal
    on sal.id_debito = ven.id_debito
    
    where
    sal.id_anhos = $anho
    and sal.id_meses = $mes
    $quitarTercero 
    and sal.saldo_actual > 0

)tab0

where 1 = 1
$whereTercero $whereTipoIngreso $wherePuntoVenta $whereProducto 

group by
tab0.id_tipo_debito,
tab0.tipo_debito,
tab0.id_producto,
tab0.codigo_pro,
tab0.descripcion_pro,
tab0.id_anhos,
tab0.id_meses,
tab0.id_pr_tipo_ingre 

)
EOD;


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


            //obtener el listado de recaudos
            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

select 

tab0.id_anhos,
tab0.id_meses,
tab0.id_tipo_debito,
tab0.tipo_debito,
tab0.id_producto,
tab0.codigo_pro,
tab0.descripcion_pro,
count(distinct tab0.id_debito) as cant_deb,
sum(nvl(tab0.valor_total,0)) as valor_total,
sum(nvl(tab0.saldo_anterior,0)) as saldo_anterior,
sum(nvl(tab0.debitos_mes,0)) as debitos_mes,
sum(nvl(tab0.creditos_mes,0)) as creditos_mes,
sum(nvl(tab0.saldo_actual,0)) as saldo_actual,
nvl(sum (tab0.cuarto), 0) as tipo4,
nvl(sum (tab0.quinto), 0) as tipo5,
nvl(sum (tab0.septimo), 0) as tipo7,
tab0.id_pr_tipo_ingre,
nvl(sum (tab0.cuarto), 0) as recursos_propios,
nvl(sum (tab0.quinto), 0) as aportes_nacion,
nvl(sum (tab0.septimo), 0) as recursos_distri,
sum(nvl(tab0.saldo_actual,0)) as total 

from(
    select 
     
    deb.id_debito,
    deb.id_punto_venta,
    deb.id_tipo_debito,
    tab4.descripcion AS tipo_debito,
    deb.valor_total,
    debdet.id_producto,
    pro.codigo AS codigo_pro,
    pro.descripcion AS descripcion_pro,
    sal.id_anhos,
    sal.id_meses, 
    sal.id_mae_ter as id_mae_ter, 
    sal.saldo_anterior,
    sal.debitos_mes,
    sal.creditos_mes,
    sal.saldo_actual,
    nvl(( case when deb.id_pr_tipo_ingre = 4 then sal.saldo_actual else 0 end  ) ,  0) as cuarto,
    nvl(( case when deb.id_pr_tipo_ingre = 5 then sal.saldo_actual else 0 end  ) ,  0) as quinto,
    nvl(( case when deb.id_pr_tipo_ingre = 7 then sal.saldo_actual else 0 end  ) ,  0) as septimo,
    deb.id_pr_tipo_ingre
    
    from ca_debito deb
    
  JOIN CA_TIPO_DEBITO tab4
  ON deb.id_tipo_debito = tab4.id_tipo_debito
    
    left join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.id_debito
        ORDER BY aut.id_debito
       ) AS rn
      from ca_debito_detalle aut
    )debdet
    on deb.id_debito = debdet.id_debito
    and debdet.rn = 1
    
    left JOIN ca_producto pro
    ON pro.id_producto = debdet.id_producto
    
    join ca_vencimientos ven
    on ven.id_debito = deb.id_debito
    
    left join ca_saldos sal
    on sal.id_debito = ven.id_debito
    
    where
    sal.id_anhos = $anho
    and sal.id_meses = $mes
    $quitarTercero 
    and sal.saldo_actual > 0

)tab0

where 1 = 1
$whereTercero $whereTipoIngreso $wherePuntoVenta $whereProducto 

group by
tab0.id_tipo_debito,
tab0.tipo_debito,
tab0.id_producto,
tab0.codigo_pro,
tab0.descripcion_pro,
tab0.id_anhos,
tab0.id_meses,
tab0.id_pr_tipo_ingre 

$sortBy
            
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);


            $this->totalRows = $total_record_count;
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($resultado);
            $this->list_data = $resultado;
            $this->logMessage("[inf_car_clasif_prod] Consulta exitosa.");
        } catch (Exception $e) {

            $this->status = 1;
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Metodo para sumar cartera clasificada tercero
     *
     * @param sfWebRequest $request
     */
    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");

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

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

        //ordenar consulta
        if (isset($request['_sortBy'])) {
            $sortBy = " Order by " . $request['_sortBy'];
        } else {
            $sortBy = 'order by tab0.id_anhos, tab0.id_meses, tab0.codigo_pro, tab0.id_tipo_debito ';
        }

        //manejo de errores
        try {

            /*
             * Se elimina 2176 - Drummnod de la consulta
             */
            $quitarTercero = " and sal.id_mae_ter != 2176 ";

            /*
             * Variables obligatorias
             */
            $anho = $request['id_anhos'];
            $mes = $request['id_meses'];

            /*
             * Variables opcionales
             */
            //tercero
            if (isset($request['id_mae_ter'])) {
                $whereTercero = " AND tab0.id_mae_ter = " . $request['id_mae_ter'];
            } else {
                $whereTercero = ' ';
            }
            //tipo ingreso
            if (isset($request['id'])) {
                $whereTipoIngreso = " AND tab0.id_pr_tipo_ingre = " . $request['id'];
            } else {
                $whereTipoIngreso = ' ';
            }
            //Punto Venta
            if (isset($request['id_punto_venta'])) {
                $wherePuntoVenta = " AND tab0.id_punto_venta = " . $request['id_punto_venta'];
            } else {
                $wherePuntoVenta = ' ';
            }
            //Producto
            if (isset($request['id_producto'])) {
                $whereProducto = " AND tab0.id_producto = " . $request['id_producto'];
            } else {
                $whereProducto = ' ';
            }
            /**
             * si se tiene el CcCheckBox de nombre "exacto" puede habilitar para valor exacto o un rango de valores
             * cuando es true habilita el parametro:  "valor_exacto" y "valor_total"
             * cuando es false habilita el rango de los parametros: "valor" y "valor_total"
             */
            $whereSaldoActual = " ";
            if (isset($request['exacto'])) {

                if ($request['exacto'] == 'true') {
                    if (isset($request['valor_exacto'])) {
                        if ($request['valor_exacto'] != "") {
                            $whereSaldoActual = " AND tab0.saldo_actual = " . $request['valor_exacto'];
                        }
                    }
                } else {
                    if (isset($request['valor_ini'])) {
                        if ($request['valor_ini'] != "") {
                            $whereSaldoActual = " AND tab0.saldo_actual >= " . $request['valor_ini'];
                        }
                    }
                    if (isset($request['valor_fin'])) {
                        if ($request['valor_fin'] != "") {
                            $whereSaldoActual .= " AND tab0.saldo_actual <= " . $request['valor_fin'];
                        }
                    }
                }
            }

            //obtener el listado de recaudos
            $sql = <<<EOD
SELECT

   SUM(cant_deb) as cant_deb,
   'TOTALES' as codigo_pro,

   SUM(recursos_propios)  as recursos_propios,
   SUM(aportes_nacion)  as aportes_nacion,
   SUM(recursos_distri)  as recursos_distri,
   SUM(total)  as total,
   SUM(saldo_actual)  as saldo_actual

FROM (

select 

tab0.id_anhos,
tab0.id_meses,
tab0.id_tipo_debito,
tab0.tipo_debito,
tab0.id_producto,
tab0.codigo_pro,
tab0.descripcion_pro,
count(distinct tab0.id_debito) as cant_deb,
sum(nvl(tab0.valor_total,0)) as valor_total,
sum(nvl(tab0.saldo_anterior,0)) as saldo_anterior,
sum(nvl(tab0.debitos_mes,0)) as debitos_mes,
sum(nvl(tab0.creditos_mes,0)) as creditos_mes,
sum(nvl(tab0.saldo_actual,0)) as saldo_actual,
nvl(sum (tab0.cuarto), 0) as tipo4,
nvl(sum (tab0.quinto), 0) as tipo5,
nvl(sum (tab0.septimo), 0) as tipo7,
tab0.id_pr_tipo_ingre,
nvl(sum (tab0.cuarto), 0) as recursos_propios,
nvl(sum (tab0.quinto), 0) as aportes_nacion,
nvl(sum (tab0.septimo), 0) as recursos_distri,
sum(nvl(tab0.saldo_actual,0)) as total 

from(
    select 
     
    deb.id_debito,
    deb.id_punto_venta,
    deb.id_tipo_debito,
    tab4.descripcion AS tipo_debito,
    deb.valor_total,
    debdet.id_producto,
    pro.codigo AS codigo_pro,
    pro.descripcion AS descripcion_pro,
    sal.id_anhos,
    sal.id_meses,   
    sal.id_mae_ter as id_mae_ter, 
    sal.saldo_anterior,
    sal.debitos_mes,
    sal.creditos_mes,
    sal.saldo_actual,
    nvl(( case when deb.id_pr_tipo_ingre = 4 then sal.saldo_actual else 0 end  ) ,  0) as cuarto,
    nvl(( case when deb.id_pr_tipo_ingre = 5 then sal.saldo_actual else 0 end  ) ,  0) as quinto,
    nvl(( case when deb.id_pr_tipo_ingre = 7 then sal.saldo_actual else 0 end  ) ,  0) as septimo,
    deb.id_pr_tipo_ingre
    
    from ca_debito deb
    
  JOIN CA_TIPO_DEBITO tab4
  ON deb.id_tipo_debito = tab4.id_tipo_debito
    
    left join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.id_debito
        ORDER BY aut.id_debito
       ) AS rn
      from ca_debito_detalle aut
    )debdet
    on deb.id_debito = debdet.id_debito
    and debdet.rn = 1
    
    left JOIN ca_producto pro
    ON pro.id_producto = debdet.id_producto
    
    join ca_vencimientos ven
    on ven.id_debito = deb.id_debito
    
    left join ca_saldos sal
    on sal.id_debito = ven.id_debito
    
    where
    sal.id_anhos = $anho
    and sal.id_meses = $mes
    $quitarTercero 
    and sal.saldo_actual > 0

)tab0

where 1 = 1
$whereTercero $whereTipoIngreso $wherePuntoVenta $whereProducto 

group by
tab0.id_tipo_debito,
tab0.tipo_debito,
tab0.id_producto,
tab0.codigo_pro,
tab0.descripcion_pro,
tab0.id_anhos,
tab0.id_meses,
tab0.id_pr_tipo_ingre 

$sortBy

)

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


            $this->totalRows = count($resultado);
            $this->startRow = 0;
            $this->endRow = count($resultado);
            $this->list_data = $resultado;
        } catch (Exception $e) {

            $this->status = 1;
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

}
