<?php

/**
 * inf_car_clasif_min_ter actions.
 *
 * @package    cartera
 * @subpackage inf_car_clasif_min_ter
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class inf_car_clasif_min_terActions 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 cod_mineral, to_number(tab0.num_doc)';
        }

        //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 deb.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 = ' ';
            }
            //Mineral
            if (isset($request['id_referencia1'])) {
                $whereMineral = " AND tab0.id_referencia1 = '" . $request['id_referencia1'] . "'"; //para la referencia2 DEBITO
            }else {
                $whereMineral = ' ';
            }
            //Punto Venta
            if (isset($request['id_punto_venta'])) {
                $wherePuntoVenta = " AND tab0.id_punto_venta = " . $request['id_punto_venta'];
            } else {
                $wherePuntoVenta = ' ';
            }
            /**
             * 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.* FROM (

SELECT 

tab0.cod_mineral,
tab0.descripcion_mine,
tab0.mineral,
tab0.id_referencia1,
tab0.id_mae_ter,
tab0.num_doc,
tab0.razon_soc,
sum(tab0.recursos_propios) as recursos_propios,
sum(tab0.aportes_nacion) as aportes_nacion,
sum(tab0.recursos_distri) as recursos_distri,
sum(tab0.recursos_propios) + sum(tab0.aportes_nacion) + sum(tab0.recursos_distri) as total,
nvl(sum(saldo_actual) ,0 ) as saldo_actual

FROM (

select 

deb.*,

debref.id_referencia1,
debref.id_referencia2,
mine.cod_mineral,
mine.descripcion as descripcion_mine,
mine.cod_mineral ||' - ' || mine.descripcion AS mineral,

nvl(case
  when deb.id_pr_tipo_ingre = 4 then deb.saldo_actual
  else 0
end ,0) as recursos_propios,

nvl(case
  when deb.id_pr_tipo_ingre = 5 then deb.saldo_actual
  else 0
end ,0) as aportes_nacion,

nvl(case
  when deb.id_pr_tipo_ingre = 7 then deb.saldo_actual
  else 0
end ,0) as recursos_distri

from ca_debito_saldos deb

LEFT JOIN CA_DEBITO_REF debref
ON debref.id_debito = deb.id_debito

LEFT JOIN RE_MINERAL mine
ON debref.id_referencia1 = mine.id_mineral

where
deb.id_anhos_sal = $anho and deb.id_meses_sal = $mes
and debref.id_referencia1 is not null $quitarTercero
 
and (case when deb.fecha_anu_ven<=last_day(to_date('$mes-$anho','MM-YYYY')) then 1 else 0 END  = 0)

)tab0


where
1 = 1
--and tab0.estado_ven = 1
$whereTercero $whereTipoIngreso $whereMineral $wherePuntoVenta


group by 
tab0.cod_mineral,
tab0.descripcion_mine,
tab0.mineral,
tab0.id_referencia1,
tab0.id_mae_ter,
tab0.num_doc,
tab0.razon_soc

)tab0
where
1 = 1
$whereSaldoActual

$sortBy

)
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.* FROM (

SELECT 

tab0.cod_mineral,
tab0.descripcion_mine,
tab0.mineral,
tab0.id_referencia1,
tab0.id_mae_ter,
tab0.num_doc,
tab0.razon_soc,
sum(tab0.recursos_propios) as recursos_propios,
sum(tab0.aportes_nacion) as aportes_nacion,
sum(tab0.recursos_distri) as recursos_distri,
sum(tab0.recursos_propios) + sum(tab0.aportes_nacion) + sum(tab0.recursos_distri) as total,
nvl(sum(saldo_actual) ,0 ) as saldo_actual

FROM (

select 

deb.*,

debref.id_referencia1,
debref.id_referencia2,
mine.cod_mineral,
mine.descripcion as descripcion_mine,
mine.cod_mineral ||' - ' || mine.descripcion AS mineral,

nvl(case
  when deb.id_pr_tipo_ingre = 4 then deb.saldo_actual
  else 0
end ,0) as recursos_propios,

nvl(case
  when deb.id_pr_tipo_ingre = 5 then deb.saldo_actual
  else 0
end ,0) as aportes_nacion,

nvl(case
  when deb.id_pr_tipo_ingre = 7 then deb.saldo_actual
  else 0
end ,0) as recursos_distri

from ca_debito_saldos deb

LEFT JOIN CA_DEBITO_REF debref
ON debref.id_debito = deb.id_debito

LEFT JOIN RE_MINERAL mine
ON debref.id_referencia1 = mine.id_mineral

where
deb.id_anhos_sal = $anho and deb.id_meses_sal = $mes
and debref.id_referencia1 is not null $quitarTercero
 
and (case when deb.fecha_anu_ven<=last_day(to_date('$mes-$anho','MM-YYYY')) then 1 else 0 END  = 0)

)tab0


where
1 = 1
--and tab0.estado_ven = 1
$whereTercero $whereTipoIngreso $whereMineral $wherePuntoVenta


group by 
tab0.cod_mineral,
tab0.descripcion_mine,
tab0.mineral,
tab0.id_referencia1,
tab0.id_mae_ter,
tab0.num_doc,
tab0.razon_soc

)tab0
where
1 = 1
$whereSaldoActual

$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_TER] 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 cod_mineral, to_number(tab0.num_doc)';
        }

        //manejo de errores
        try {
            
            /*
             * Se elimina 2176 - Drummnod de la consulta
             */
            $quitarTercero = " and deb.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 = ' ';
            }
            //Mineral
            if (isset($request['id_referencia1'])) {
                $whereMineral = " AND tab0.id_referencia1 = '" . $request['id_referencia1'] . "'"; //para la referencia2 DEBITO
            }else {
                $whereMineral = ' ';
            }
            //Punto Venta
            if (isset($request['id_punto_venta'])) {
                $wherePuntoVenta = " AND tab0.id_punto_venta = " . $request['id_punto_venta'];
            } else {
                $wherePuntoVenta = ' ';
            }
            /**
             * 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

   count(*) as razon_soc,
   'TOTALES' as num_doc,

   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.* FROM (

SELECT 

tab0.cod_mineral,
tab0.descripcion_mine,
tab0.mineral,
tab0.id_referencia1,
tab0.id_mae_ter,
tab0.num_doc,
tab0.razon_soc,
sum(tab0.recursos_propios) as recursos_propios,
sum(tab0.aportes_nacion) as aportes_nacion,
sum(tab0.recursos_distri) as recursos_distri,
sum(tab0.recursos_propios) + sum(tab0.aportes_nacion) + sum(tab0.recursos_distri) as total,
nvl(sum(saldo_actual) ,0 ) as saldo_actual

FROM (

select 

deb.*,

debref.id_referencia1,
debref.id_referencia2,
mine.cod_mineral,
mine.descripcion as descripcion_mine,
mine.cod_mineral ||' - ' || mine.descripcion AS mineral,

nvl(case
  when deb.id_pr_tipo_ingre = 4 then deb.saldo_actual
  else 0
end ,0) as recursos_propios,

nvl(case
  when deb.id_pr_tipo_ingre = 5 then deb.saldo_actual
  else 0
end ,0) as aportes_nacion,

nvl(case
  when deb.id_pr_tipo_ingre = 7 then deb.saldo_actual
  else 0
end ,0) as recursos_distri

from ca_debito_saldos deb

LEFT JOIN CA_DEBITO_REF debref
ON debref.id_debito = deb.id_debito

LEFT JOIN RE_MINERAL mine
ON debref.id_referencia1 = mine.id_mineral

where
deb.id_anhos_sal = $anho and deb.id_meses_sal = $mes
and debref.id_referencia1 is not null $quitarTercero
 
and (case when deb.fecha_anu_ven<=last_day(to_date('$mes-$anho','MM-YYYY')) then 1 else 0 END  = 0)

)tab0


where
1 = 1
--and tab0.estado_ven = 1
$whereTercero $whereTipoIngreso $whereMineral $wherePuntoVenta


group by 
tab0.cod_mineral,
tab0.descripcion_mine,
tab0.mineral,
tab0.id_referencia1,
tab0.id_mae_ter,
tab0.num_doc,
tab0.razon_soc

)tab0
where
1 = 1
$whereSaldoActual

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

}
