<?php

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

    /**
     * Obtener records para los saldos
     *
     * @param sfWebRequest $request
     */
    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");


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


        /*
         * Manejo de errores
         */
        try {

            /*
             * Se elimina 2176, 28143 - Drummnod de la consulta
             * Incidente #7393, Se retira esta condición - 20171023
             */
            //$quitarTercero = " and tab0.id_mae_ter != 2176 and tab0.id_mae_ter != 28143 ";
            $quitarTercero = " and tab0.id_mae_ter != 28143 ";

            /*
             * Variables obligatorias
             */
            if (isset($request['id_anhos'])) {
                $id_anhos = $request['id_anhos'];
            }
            if (isset($request['id_meses'])) {
                $id_meses = $request['id_meses'];
            }
            if (isset($request['frecuencia'])) {
                $frecuencia = $request['frecuencia'];
            }
            if (isset($request['num_bloques'])) {
                $numBloques = $request['num_bloques'];
            }
            if (isset($request['id_mae_ter'])) {
                $id_mae_ter = $request['id_mae_ter'];
                $whereTercero = "and tab0.id_mae_ter = " . $request['id_mae_ter'];
            } else {
                $whereTercero = " ";
            }

            /*
             * Variables NO obligatorias
             */
            if (isset($request['nitocc_ini']) && isset($request['nitocc_fin'])) {
                $whereNitocc = "and tab0.num_doc between  " . $request['nitocc_ini'] . " and " . $request['nitocc_fin'];
            } else {
                $whereNitocc = " ";
            }
            //Punto Venta - Todos menos servicio minero id - 4
            $wherePuntoVenta = " AND tab0.id_punto_venta != 4 ";

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

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


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

select

tab0.*,

trunc(last_day(to_date('$id_meses/$id_anhos','mm/yyyy'))) - tab0.fecha_vence as dias_vencidos

from ca_debito_saldos tab0

where
1 = 1    
--and tab0.estado_ven = 1
and tab0.id_meses_sal = $id_meses and tab0.id_anhos_sal = $id_anhos
and tab0.fecha_proceso <= trunc(last_day(to_date('$id_meses/$id_anhos','mm/yyyy')))
and (case when tab0.fecha_anu_ven<=last_day(to_date('$id_meses-$id_anhos','MM-YYYY')) then 1 else 0 END  = 0)
    
$whereTercero $quitarTercero $wherePuntoVenta

order by
tab0.num_doc,
tab0.sec_debito,
tab0.fecha_vence,
tab0.id_anhos_sal,
tab0.id_meses_sal

)
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) {


                /*
                 * CREAR CASE PARA SQL DE LOS DIFERENTES BLOQUES
                 */

                $case_oracle = <<<EOD

EOD;
                $case_total = <<<EOD

EOD;

                //establece el rango de vencimiento
                $i = 1;
                $ini = 1;
                $fin = $frecuencia;
                while ($i <= $numBloques) {
                    $case_oracle .= <<<EOD

 CASE
   WHEN last_day(to_date('$id_meses/$id_anhos','mm/yyyy')) - tab0.fecha_vence >= $ini AND last_day(to_date('$id_meses/$id_anhos','mm/yyyy')) - tab0.fecha_vence <= $fin
   THEN tab0.saldo_actual
   ELSE 0
   END AS  bloque_$i,

EOD;

                    $case_total .= <<<EOD
sum(bloque_$i) as bloque_$i,

EOD;

                    $ini = $fin + 1;
                    $fin = ($i + 1) * $frecuencia;
                    $i = $i + 1;
                }




                /*
                 * Obtiene los registros de debito/vencimiento con su saldo respectivo
                 */
                $sql = <<<EOD

SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

select

tab0.*,

trunc(last_day(to_date('$id_meses/$id_anhos','mm/yyyy'))) - tab0.fecha_vence as dias_vencidos,

 CASE
   WHEN last_day(to_date('$id_meses/$id_anhos','mm/yyyy')) - tab0.fecha_vence <= 0
   THEN tab0.saldo_actual
   ELSE 0
   END AS por_vencer,

$case_oracle

 CASE
   WHEN last_day(to_date('$id_meses/$id_anhos','mm/yyyy')) - tab0.fecha_vence > ($frecuencia*$numBloques)
   THEN tab0.saldo_actual
   ELSE 0
   END AS vencido_mas

from ca_debito_saldos tab0

where
1 = 1    
--and tab0.estado_ven = 1
and tab0.id_meses_sal = $id_meses and tab0.id_anhos_sal = $id_anhos
and tab0.fecha_proceso <= trunc(last_day(to_date('$id_meses/$id_anhos','mm/yyyy')))
and (case when tab0.fecha_anu_ven<=last_day(to_date('$id_meses-$id_anhos','MM-YYYY')) then 1 else 0 END  = 0)
  
$whereTercero $quitarTercero $wherePuntoVenta

order by
tab0.num_doc,
tab0.sec_debito,
tab0.fecha_vence,
tab0.id_anhos_sal,
tab0.id_meses_sal

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

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


                /*
                 * Generacion de columnas dinamicamente para las edades
                 */
//                $ini = 1;
//                $fin = $frecuencia;
//
//                //recorre cada fila de la consulta
//                foreach ($records as $key => $value) {
//
//                    //extrae los valores en cada fila del saldo y dias vencidos
//                    $dias_vencidos = explode(",", $value["dias_vencidos"]);
//                    $total_saldo = explode(",", $value["saldo_actual"]);
//
//
//                    $this->logMessage("[INFORME EDADES] Dias vencidos: " . $dias_vencidos[0]);
//
//                    foreach ($dias_vencidos as $key_vigper => $valor_vigper) {
//                        $dias_ve = $dias_vencidos[$key_vigper];
//                        $saldo = $total_saldo[$key_vigper];
//
////                    $this->logMessage("[INFORME EDADES] Dias vencidos: " .$dias_ve);
////                    $this->logMessage("[INFORME EDADES] Saldo Vencimiento: " .$saldo);
//                        //si no esta vencido
//                        if ($dias_ve <= 0) {
//                            $records[$key]["por_vencer"] = $saldo;
//                        } else {
//
//                            //establece el rango de vencimiento
//                            $i = 1;
//                            $ini = 1;
//                            $fin = $frecuencia;
//                            $varTemp = "false";
//                            while ($i <= $numBloques) {
//
//                                if ($dias_ve <= $fin && $dias_ve >= $ini) {
//                                    $records[$key]["bloque_" . $i] = $saldo;
//                                    $varTemp = "true";
//                                }
//                                $ini = $fin + 1;
//                                $fin = ($i + 1) * $frecuencia;
//                                $i = $i + 1;
//                            }
//                            //si supera todos los rangos de vencimiento
//                            if ($varTemp != "true") {
//                                $records[$key]["vencido_mas"] = $saldo;
//                            }
//                        }
//                    }
//                }

                $this->totalRows = $total_record_count;
                $this->startRow = $rowStart;
                $this->endRow = $rowStart + count($records);
                $this->list_data = $records;
                $this->logMessage("[INFORME EDADES] Consulta exitosa.");
            } else {

                $mensaje = "[INFORME EDADES] No hay registros debito.";
                $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 sumar informe cartera edades
     *
     * @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");

        //manejo de errores
        try {

            /*
             * Se elimina 2176, 28143 - Drummnod de la consulta
             * Incidente #7393, Se retira esta condición - 20171023
             */
            //$quitarTercero = " and tab0.id_mae_ter != 2176 and tab0.id_mae_ter != 28143 ";
            $quitarTercero = " and tab0.id_mae_ter != 28143 ";

            /*
             * Variables obligatorias
             */
            if (isset($request['id_anhos'])) {
                $id_anhos = $request['id_anhos'];
            }
            if (isset($request['id_meses'])) {
                $id_meses = $request['id_meses'];
            }
            if (isset($request['frecuencia'])) {
                $frecuencia = $request['frecuencia'];
            }
            if (isset($request['num_bloques'])) {
                $numBloques = $request['num_bloques'];
            }
            if (isset($request['id_mae_ter'])) {
                $id_mae_ter = $request['id_mae_ter'];
                $whereTercero = "and tab0.id_mae_ter = " . $request['id_mae_ter'];
            } else {
                $whereTercero = " ";
            }

            /*
             * Variables NO obligatorias
             */
            if (isset($request['nitocc_ini']) && isset($request['nitocc_fin'])) {
                $whereNitocc = "and tab0.num_doc between  " . $request['nitocc_ini'] . " and " . $request['nitocc_fin'];
            } else {
                $whereNitocc = " ";
            }
            //Punto Venta - Todos menos servicio minero id - 4
            $wherePuntoVenta = " AND tab0.id_punto_venta != 4 ";


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

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


            /*
             * CREAR CASE PARA SQL DE LOS DIFERENTES BLOQUES
             */

            $case_oracle = <<<EOD

EOD;
            $case_total = <<<EOD

EOD;

            //establece el rango de vencimiento
            $i = 1;
            $ini = 1;
            $fin = $frecuencia;
            while ($i <= $numBloques) {
                $case_oracle .= <<<EOD

 CASE
   WHEN last_day(to_date('$id_meses/$id_anhos','mm/yyyy')) - tab0.fecha_vence >= $ini AND last_day(to_date('$id_meses/$id_anhos','mm/yyyy')) - tab0.fecha_vence <= $fin
   THEN tab0.saldo_actual
   ELSE 0
   END AS  bloque_$i,

EOD;

                $case_total .= <<<EOD
sum(bloque_$i) as bloque_$i,

EOD;

                $ini = $fin + 1;
                $fin = ($i + 1) * $frecuencia;
                $i = $i + 1;
            }


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

'TOTALES' as razon_Soc,
sum(saldo_actual) as saldo_actual,
sum(por_vencer) as por_vencer,
$case_total
sum(vencido_mas) as vencido_mas

from(

select

tab0.*,

trunc(last_day(to_date('$id_meses/$id_anhos','mm/yyyy'))) - tab0.fecha_vence as dias_vencidos,

 CASE
   WHEN last_day(to_date('$id_meses/$id_anhos','mm/yyyy')) - tab0.fecha_vence <= 0
   THEN tab0.saldo_actual
   ELSE 0
   END AS por_vencer,

$case_oracle

 CASE
   WHEN last_day(to_date('$id_meses/$id_anhos','mm/yyyy')) - tab0.fecha_vence > ($frecuencia*$numBloques)
   THEN tab0.saldo_actual
   ELSE 0
   END AS vencido_mas

from ca_debito_saldos tab0

where
1 = 1    
--and tab0.estado_ven = 1
and tab0.id_meses_sal = $id_meses and tab0.id_anhos_sal = $id_anhos
and tab0.fecha_proceso <= trunc(last_day(to_date('$id_meses/$id_anhos','mm/yyyy')))
and (case when tab0.fecha_anu_ven<=last_day(to_date('$id_meses-$id_anhos','MM-YYYY')) then 1 else 0 END  = 0)
  
$whereTercero $quitarTercero $wherePuntoVenta

order by
tab0.num_doc,
tab0.sec_debito,
tab0.fecha_vence,
tab0.id_anhos_sal,
tab0.id_meses_sal

)tab1

EOD;

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


            /*
             * Array para regresar en una fila los totales
             */
//            $array_totales = array(
//                'desc_corta_tipdeb' => 'TOTALES',
//                'por_vencer' => 0,
//                'vencido_mas' => 0,
//                'saldo_actual' => 0
//            );
//
//            $i = 1;
//            while ($i <= $numBloques) {
//                $array_totales["bloque_" . $i] = 0;
//                $i = $i + 1;
//            }
//
//
//            /*
//             * Generacion de columnas dinamicamente para las edades
//             */
//            $ini = 1;
//            $fin = $frecuencia;
//
//            //recorre cada fila de la consulta
//            foreach ($records as $key => $value) {
//
//                //extrae los valores en cada fila del saldo y dias vencidos
//                $dias_vencidos = explode(",", $value["dias_vencidos"]);
//                $total_saldo = explode(",", $value["saldo_actual"]);
//
//
//                $this->logMessage("[INFORME EDADES] Dias vencidos: " . $dias_vencidos[0]);
//
//                foreach ($dias_vencidos as $key_vigper => $valor_vigper) {
//                    $dias_ve = $dias_vencidos[$key_vigper];
//                    $saldo = $total_saldo[$key_vigper];
//
//                    //suma valor al array de totales
//                    $array_totales["saldo_actual"] += $saldo;
//
////                    $this->logMessage("[INFORME EDADES] Dias vencidos: " .$dias_ve);
////                    $this->logMessage("[INFORME EDADES] Saldo Vencimiento: " .$saldo);
//                    //si no esta vencido
//                    if ($dias_ve <= 0) {
//                        $records[$key]["por_vencer"] = $saldo;
//
//
//                        //suma valor al array de totales
//                        $array_totales["por_vencer"] += $saldo;
//                    } else {
//
//                        //establece el rango de vencimiento
//                        $i = 1;
//                        $ini = 1;
//                        $fin = $frecuencia;
//                        $varTemp = "false";
//                        while ($i <= $numBloques) {
//
//                            if ($dias_ve <= $fin && $dias_ve >= $ini) {
//                                $records[$key]["bloque_" . $i] = $saldo;
//
//                                //suma valor al array de totales
//                                $array_totales["bloque_" . $i] += $saldo;
//
//                                $varTemp = "true";
//                            }
//                            $ini = $fin + 1;
//                            $fin = ($i + 1) * $frecuencia;
//                            $i = $i + 1;
//                        }
//                        //si supera todos los rangos de vencimiento
//                        if ($varTemp != "true") {
//                            $records[$key]["vencido_mas"] = $saldo;
//
//                            //suma valor al array de totales
//                            $array_totales["vencido_mas"] += $saldo;
//                        }
//                    }
//                }
//            }
//
//            //fila de totales
//            $records = array($array_totales);

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

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

}
