<?php

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

    /**
     * Generar archivo de deudores morosos
     *
     * @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");

        /*
         * Manejar Errores
         */
        try {


            /*
             * 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 nitocc ';
            }

            /*
             * Variables
             */
            $vigencia = date('Y');
            $mes = date('m');
            $fecha_fin = $request['fecha_fin'];
            $tope = '';
            $tope2 = '';

            /**
             * Verifica tope El tope debe generar en el primer informe , todos los deudores que 
             * superen el tope sumados los saldos de debitos.
             * En el detallado, pues la composición detallada para los casos que entren en el tope - 20190529
             */
            if (isset($request['criteria'])) {
                
                $criteria = json_decode($request['criteria'], true);
                
                if ($criteria['fieldName'] == 'tope') {
                    $request['tope'] = $criteria['value'];
                }
            }

            if (isset($request['tope'])) {
                $tope = "WHERE total.saldo_total >= " . $request['tope'];
                $tope2 = "WHERE tab1.total >= " . $request['tope'];
            }

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

            //solo imprime log la primera vez de consulta
            if ($rowStart == 0) {

                //sentencia sql
                $sql = <<<EOD
TRUNCATE TABLE CA_DEUDOR 
EOD;
                //ejecuta y obtiene el resultado del sql
                CN_TABLE::executeSQL($sql);

                //sentencia sql
                $sql = <<<EOD
TRUNCATE TABLE CA_DEUDOR_DET 
EOD;
                //ejecuta y obtiene el resultado del sql
                CN_TABLE::executeSQL($sql);

                /**
                 * Se llenan los datos de principal
                 * El genera registros sobre con saldo actual mayor a 20000 
                 * y que la fecha del vencimiento sea menor o igual a la fecha filtrada - 20190521
                 * Incidente #12614, se levanta restriccion de saldos mayores a 20000 - 20190528
                 * Debitos segun fecha actual estado activo - 20190529
                 * Al mes en curso el saldo sea >0 - 20200428::LAVILA
                 * Incidente #17134 campo nuevo PAR - 20200429::LAVILA
                 * Se cambia cod_exp antes placa_mrn - 20201019::LAVILA
                 * Se adiciona tabla de CA_TITULO_PAR, por si se clasifico en cartera y no esta en canon - 20201029::LAVILA
                 */
                //sentencia sql
                $sql = <<<EOD
INSERT INTO CA_DEUDOR_DET (NITOCC,RAZSOC,NUMFAC,FECFAC,FECVEN,DIASVEN,VRTOTAL,TIPDOC,OBSERV,CONCEPTO,TIPDEU,PLACA_RMN,CODCIA,COBRO_COACTIVO,NOVEDAD_DEB, PAR )


SELECT distinct NITOCC,RAZSOC,NUMFAC,FECFAC,FECVEN,DIASVEN,VRTOTAL,TIPDOC,OBSERV,CONCEPTO,TIPDEU,PLACA_RMN,CODCIA,COBRO_COACTIVO,NOVEDAD_DEB, PAR            

FROM(                
                
    SELECT 
    rownum AS ID_DEUDOR_DET,
    saldos.num_doc AS NITOCC,
    saldos.razon_soc AS RAZSOC,
    saldos.sec_debito AS NUMFAC,
    saldos.fecha_proceso AS FECFAC,
    saldos.fecha_vence AS FECVEN,
    saldos.dias_pago AS DIASVEN,
    round(saldos.saldo_actual,2) AS VRTOTAL,
    tipde.desc_corta AS TIPDOC,
    'PRINCIPAL '||saldos.observaciones AS OBSERV,
    prod.codigo||'-'||prod.descripcion AS CONCEPTO,
    '01' AS TIPDEU,
    referencia.id_referencia2 AS PLACA_RMN,
    saldos.abreviatura_pv AS CODCIA,
    nvl(novedad.cobro,0) AS COBRO_COACTIVO,
    noves.NOVEDAD_DEB as NOVEDAD_DEB,
    nvl(compeca.nombre,compe.nombre) as par

    from ca_debito_saldos saldos

    left join ca_debito_ref referencia ON referencia.id_debito = saldos.id_debito

    left join ca_tipo_debito tipde ON tipde.id_tipo_debito = saldos.id_tipo_debito

    left join (

    select nov.id_debito,1 as cobro
    from ca_novedad_cartera nov
    where nov.id_tipo_novedad=2 and nov.anulado = 0


    )novedad on novedad.id_debito = saldos.id_debito

    left join(
        SELECT
        nov.id_debito,
        LISTAGG(nov.tipnov, ',') WITHIN GROUP (ORDER BY nov.tipnov) as NOVEDAD_DEB

        FROM (SELECT distinct id_debito, tipnov FROM ca_novedad_cartera_v where abierto = 1 and anulado = 0) nov

        group by
        nov.id_debito
    )noves on noves.id_debito = saldos.id_debito

    left join (
      SELECT 
       deta.*,
       ROW_NUMBER() OVER (
        PARTITION BY deta.id_debito
        ORDER BY deta.id_debito desc
       ) AS rn
       from ca_debito_detalle deta
    ) detalle ON detalle.id_debito = saldos.id_debito

    LEFT JOIN ca_producto prod ON prod.id_producto = detalle.id_producto
    
    LEFT JOIN rmn_titulo@can titulo ON titulo.cod_exp = referencia.id_referencia2
    LEFT JOIN (select distinct id_titulo, id_competencia from in_titulo_competencia@can where actual = 1) titper ON titper.id_titulo = titulo.id_titulo
    LEFT JOIN rmn_competencia@can compe ON compe.id_competencia = titper.id_competencia
    
    LEFT JOIN ca_titulo_par titpar ON titpar.id_titulo = referencia.id_referencia2
    LEFT JOIN rmn_competencia@can compeca ON compeca.id_competencia = titpar.id_competencia

    where saldos.id_anhos_sal= $vigencia and saldos.id_meses_sal= $mes
    and saldos.fecha_vence<=to_date('$fecha_fin','yyyy-mm-dd')
    and referencia.id_referencia2 IS NOT NULL
    --and saldos.saldo_actual>20000
    and saldos.saldo_actual > 0 
    and saldos.estado_ven = 1  
    $quitarTercero
            
)boletin                

left join(
                        
    select saldos.num_doc,sum(nvl(saldos.saldo_actual,0)) as SALDO_TOTAL
    from ca_debito_saldos saldos

    left join ca_debito_ref referencia ON referencia.id_debito = saldos.id_debito


    where saldos.id_anhos_sal= $vigencia and saldos.id_meses_sal= $mes
    and saldos.fecha_vence<=to_date('$fecha_fin','yyyy-mm-dd')
    --and saldos.saldo_actual>20000
    and saldos.saldo_actual > 0 
    and referencia.id_referencia2 IS NOT NULL

    group by saldos.num_doc

)total ON boletin.nitocc = total.num_doc

$tope

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

                /**
                 * Se llenan los datos de solidario de acuerdo a los principales
                 * Incidente #17065, toma el tercero doble, por registro de tablas de canon, se omite con el distinc por documento - 20200429::LAVILA
                 * Se cambia cod_exp antes placa_mrn - 20201019::LAVILA
                 */
                //sentencia sql
                $sql = <<<EOD
INSERT INTO CA_DEUDOR_DET (NITOCC,DV,RAZSOC,NUMFAC,FECFAC,FECVEN,DIASVEN,VRTOTAL,TIPDOC,OBSERV,CONCEPTO,TIPDEU,PLACA_RMN,CODCIA,COBRO_COACTIVO,NOVEDAD_DEB,PAR )


select * from(

    select tab0.* from(
        select persona.num_doc AS NITOCC,'' AS DV,persona.raz_soc AS RAZSOC,
        princi.numfac,princi.fecfac,princi.fecven,princi.diasven,princi.vrtotal,princi.tipdoc,
        'SOLIDARIO '||princi.observ,princi.concepto,'02' AS TIPDEU,princi.placa_rmn,princi.codcia,
        princi.cobro_coactivo AS COBRO_COACTIVO, princi.NOVEDAD_DEB, princi.PAR


        from ca_deudor_det princi

        LEFT JOIN rmn_titulo@can titulo ON titulo.cod_exp = princi.placa_rmn
        LEFT JOIN (select distinct id_titulo, id_titular from rmn_titulo_persona@can where actual = 1) titper ON titper.id_titulo = titulo.id_titulo
        LEFT JOIN rmn_persona_v@can persona ON persona.id_persona = titper.id_titular

        where persona.num_doc != to_char(princi.nitocc)
    )tab0

    left join (
        select persona.num_doc,sum(princi.vrtotal) TOTAL
        from ca_deudor_det princi
        LEFT JOIN rmn_titulo@can titulo ON titulo.cod_exp = princi.placa_rmn
        LEFT JOIN (select distinct id_titulo, id_titular from rmn_titulo_persona@can where actual = 1) titper ON titper.id_titulo = titulo.id_titulo
        LEFT JOIN rmn_persona_v@can persona ON persona.id_persona = titper.id_titular

        where persona.num_doc != to_char(princi.nitocc)
        group by persona.num_doc                        
    )tab1 ON tab1.num_doc = tab0.nitocc

    $tope2

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

                /**
                 * Se realiza cambio para los nit que poseen en cobro SI y NO, para que salga
                 * un registro para cada uno y no solo uno - 20150515
                 * Un registro para el de interceros, por si el nit esta repetido - 20160517
                 * anulado = 0 - 20200108
                 */
                //sentencia sql
                $sql = <<<EOD
INSERT INTO CA_DEUDOR (NITOCC,DV,TIPDEU,NOM1,NOM2,APL1,APL2,RAZSOC,VALOBL,TIPIDE,NUMOBL,PAR)

SELECT 
NITOCC,
DV,
MIN(TIPDEU) TIPDEU,
MAX(NOM1) NOM1,MAX(NOM2) NOM2,MAX(APL1) APL1,
MAX(APL2) APL2,MAX(RAZSOC) RAZSOC,SUM(VALOBL) VALOBL ,
MAX(TIPIDE) TIPIDE,MAX(NUMOBL) NUMOBL, MAX(PAR)

FROM(

    SELECT 
    
    COBRO,
    NITOCC,DV,MIN(TIPDEU) TIPDEU ,MAX(NOM1) NOM1,MAX(NOM2) NOM2,MAX(APL1) APL1,MAX(APL2) APL2,MAX(RAZSOC) RAZSOC,SUM(VALOBL) VALOBL ,MAX(TIPIDE) TIPIDE,MAX(NUMOBL) NUMOBL,MAX(PAR) PAR
    
    FROM(
    
        select detalle.nitocc,
        case when detalle.NITOCC>=800000000 and detalle.NITOCC<=999999999 then digito_verificacion(detalle.nitocc) else null end  AS DV,
        case when detalle.NITOCC>=800000000 and detalle.NITOCC<=999999999 then '' else inter.pnombre end AS NOM1,
        case when detalle.NITOCC>=800000000 and detalle.NITOCC<=999999999 then '' else inter.snombre end AS NOM2,
        case when detalle.NITOCC>=800000000 and detalle.NITOCC<=999999999 then '' else inter.papellido end AS APL1,
        case when detalle.NITOCC>=800000000 and detalle.NITOCC<=999999999 then '' else inter.sapellido end AS APL2,
        case when detalle.NITOCC>=800000000 and detalle.NITOCC<=999999999 then inter.razon_soc else '' end AS RAZSOC,
        case when detalle.NITOCC>=800000000 and detalle.NITOCC<=999999999 then '2' else '1' end AS TIPIDE,
        detalle.tipdeu AS TIPDEU,detalle.numfac AS NUMOBL,
        detalle.vrtotal AS VALOBL,
        case when tab1.cantidad > 0 then 'SI' else 'NO' end AS COBRO,
        detalle.PAR as PAR
        
        
        from ca_deudor_det detalle
        
        --left join interceros_v inter ON inter.num_doc = to_char(detalle.nitocc)
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.num_doc
            ORDER BY aut.id_mae_ter asc
           ) AS rn
          from interceros_v aut
          where
          aut.estado_ter = 1
        )inter
        ON inter.num_doc = to_char(detalle.nitocc)
        and inter.rn = 1
        
        left join(
            select tab0.num_deb,count(tab0.id_novedad_cartera) cantidad
            from ca_novedad_cartera_v tab0
            where tab0.id_tipo_novedad = 2 and tab0.abierto = 1 and tab0.anulado = 0
            group by tab0.num_deb
        )tab1 ON tab1.num_deb = detalle.NUMFAC
        
        where detalle.tipdeu='01' 
    )
    
    GROUP BY 
    NITOCC,
    DV,
    COBRO
    
    UNION
    
    SELECT 
    COBRO,
    NITOCC,DV,MIN(TIPDEU) TIPDEU ,MAX(NOM1) NOM1,MAX(NOM2) NOM2,MAX(APL1) APL1,MAX(APL2) APL2,MAX(RAZSOC) RAZSOC,SUM(VALOBL) VALOBL ,MAX(TIPIDE) TIPIDE,MAX(NUMOBL) NUMOBL,MAX(PAR) PAR
    
    FROM(
    
        select detalle.nitocc,
        case when NITOCC>=800000000 and NITOCC<=999999999 then digito_verificacion(detalle.nitocc) else null end  AS DV,
        case when nvl(instr(inter.nombre,' ',1),0) =0 then inter.nombre else substr(inter.nombre,1,nvl(instr(inter.nombre,' ',1),0)) end AS NOM1,
        case when nvl(instr(inter.nombre,' ',1),0) =0 then '' else substr(inter.nombre,nvl(instr(inter.nombre,' ',1),0),LENGTH(inter.nombre)) end AS NOM2,
        inter.primer_apellido AS APL1,
        inter.segundo_apellido AS APL2,
        CASE when NITOCC>=800000000 and NITOCC<=999999999 THEN inter.raz_soc ELSE NULL END AS RAZSOC,
        case when NITOCC>=800000000 and NITOCC<=999999999 then '2' else '1' end AS TIPIDE,
        detalle.tipdeu AS TIPDEU,detalle.numfac AS NUMOBL,
        detalle.vrtotal AS VALOBL,
        case when tab1.cantidad > 0 then 'SI' else 'NO' end AS COBRO,
        detalle.PAR as PAR
        
        
        from ca_deudor_det detalle
        
        
        left join (
          SELECT 
           inter.*,
           ROW_NUMBER() OVER (
            PARTITION BY inter.num_doc
            ORDER BY inter.num_doc desc
           ) AS rn
           from rmn_persona_v@can inter
        )
        
        inter
        ON inter.num_doc = to_char(detalle.nitocc) and inter.rn=1
        
        left join(
            select tab0.num_deb,count(tab0.id_novedad_cartera) cantidad
            from ca_novedad_cartera_v tab0
            where tab0.id_tipo_novedad = 2 and tab0.abierto = 1 and tab0.anulado = 0
            group by tab0.num_deb
        )tab1 ON tab1.num_deb = detalle.NUMFAC
        
        where detalle.tipdeu='02' 
    
    )
    
    GROUP BY 
    NITOCC,
    DV,
    COBRO

)
GROUP BY 
NITOCC,
DV,
COBRO  
EOD;
                //ejecuta y obtiene el resultado del sql
                CN_TABLE::executeSQL($sql);
            }


            //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 * from CA_DEUDOR_DET 

)
EOD;


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

            /*
             * Obtiene las vigencias/periodo que se encuentre en la tabla de saldos
             */
            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
    
select * from CA_DEUDOR_DET 

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

            $records = CN_TABLE::executeSQL($sql);

            //Ejecuta sql
            $this->totalRows = $total_record_count;
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($records);
            $this->list_data = $records;
        } catch (Exception $e) {

            $mensaje = "[boletin_deu_morosos] ERROR!!!";

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

}
