<?php

class cf_solCred_Amortizacion {

   private $asociado;
   private $parametros;
   private $dom;
   private $xml;

   /*-------------------------!!!25-SEP-2018(SACS)-------------------------
   | Se modifican los parametros usados en la funcion function __construct|
   | lo anterior debido a que se generan problemas al momento de ejecutar |
   | los flujos complementarios de cambio de amotizacion.                 |
   | La funcion function __construct debe ser una instancia de            |
   | gr_nucleo_Asociado por ello  gr_nucleo_Asociado no se puede usar como|
   | parametro. Liberaciones 8494 - 8495.                                 | 
   +---------------------------------------------------------------------*/
   //function __construct(gr_nucleo_Asociado $asociado) {
   function __construct($asociado=null) {
      $this->asociado=$asociado;
      $this->parametros=null;
      $this->xml=null;
   }

   public function setParametros($parametros) {
      $this->parametros=$parametros;
   }

   public function setParametro($parametro,$valor) {
      if($this->parametros==null) {
         $this->parametros=array();
      }
      $this->parametros[$parametro]=$valor;
   }

   public function getXml() {
      return $this->xml;
   }

   public function getAmortizacion($request) {
      $this->setParametros($request);
   }

   public function cargarInfo() {
      try {
         $usuario_web=Configuracion::getUsuarioConexion();
         /*-----------------------!!! 10-MAR-2015(ACCV) ------------------------+
         | Se modifica para que la fecha usada para calcular la periodicidad de |
         | las cuotas extraordinaria, sea la fecha de consulta del asociado, que|
         | finalmente ser� la fecha de solicitud del cr�dito                    |
         +----------------------------------------------------------------------*/
         if(Configurar::getFuncionario()->getNusuari()!=$usuario_web) {
            $asociado2=Configuracion::unserialize("gr_nucleo_Asociado");
            $k_idterc=$asociado2->getK_idterc();
            $esFuncionario='TRUE';
            $f_sugerida= $asociado2->getF_consulta();// 10-MAR-2015(ACCV), asignaci�n modificada, antes Configurar::getFuncionario()->getF_sugerida();
            Configuracion::serialize($asociado2);
         } else {
            $k_idterc=$this->asociado->getK_idterc();
            $f_sugerida= $this->asociado->getF_consulta();// 10-MAR-2015(ACCV), asignaci�n modificada, antes Configurar::getFuncionario()->getF_sugerida();
            $esFuncionario='FALSE';
         }
         if($this->parametros['incognita']=='C') {
            $this->parametros['v_cuota']=0;
         } else if($this->parametros['incognita']=='P') {
            $this->parametros['q_cuota']=0;
         }
         $this->parametros['v_monto']=str_replace(",","",$this->parametros['v_monto']);
         $this->parametros['v_cuota']=str_replace(",","",$this->parametros['v_cuota']);
         $sql="DECLARE "."r_solici pk_ca_simular.ty_r_solici; ";
         $sql.="t_cuoext pk_ca_ciclo.p_cuotas; ";
         $sql.="t_no_obliga pk_ca_simular.ty_t_norecogida; ";
         /*-----------------------!!! 08-JUL-2015(ACCV) -----------------------+
         | Se modifica para que s�lo incluya las periodicidades en el bloque   |
         | an�nimo, si el usuario las seleccion�, ya que se estaba presentando |
         | que el usuario no escog�a peridocidad, y en este punto generaba     |
         | error al intentar ejecutar el bloque                                |
         +---------------------------------------------------------------------*/
          $sql.="BEGIN ";
         if(!empty($this->parametros['perpag'])){
            $sql.="r_solici.i_perpag_k  :=  {$this->parametros['perpag']}; ";
         }
         if(!empty($this->parametros['perpag_i'])){
            $sql.="r_solici.i_perpag_i  :=  {$this->parametros['perpag_i']}; ";
         }
         /*-------------------------!!! 15-MAR-2016(AFG) ------------------------------+
          | Nueva validaci�n que permite el llenado cuando el usuario ingresa por      | 
          | workflow o por la consulta.                                                |
          +----------------------------------------------------------------------------*/          
         if($this->parametros['modificar'] == 'Y' ){
            $sql.="r_solici.k_idterc    := {$this->parametros['k_idterc']}; ";
         } else{
            $sql.="r_solici.k_idterc    := {$k_idterc}; ";
         }
         $sql.="r_solici.k_modali := '{$this->parametros['modalidad']}'; ";
         $sql.="r_solici.v_monto := {$this->parametros['v_monto']}; ";
         $sql.="r_solici.q_cuota := {$this->parametros['q_cuota']}; ";
         $sql.="r_solici.v_kapcuo := {$this->parametros['v_cuota']}; ";
         $sql.="r_solici.v_intcuo := 0; ";
         $sql.="r_solici.p_tasnom := 0; ";
         /*-------------------------!!! 15-08-2018(ADGN) ------------------------------+
         | Se agrega validacion para la nueva variable para la actualizacion de tasa   |
         | de interes                                                                  |
         +----------------------------------------------------------------------------*/ 
         if($this->parametros['V_NUEVA_TASA_COLOCACION']){
            $sql.="r_solici.p_tasnom_crea := {$this->parametros['V_NUEVA_TASA_COLOCACION']}; ";
         }
         
         $sql.="r_solici.i_amorti := '{$this->parametros['i_amorti']}'; ";
         $sql.="r_solici.v_monto_sug:= 0; ";
         $sql.="r_solici.v_recoge_obl:= 0; ";
         $sql.="r_solici.n_cumplerng := '{$this->parametros['n_cumplerng']}'; ";
         $sql.="r_solici.k_nomina := '{$this->parametros['nomina']}'; ";
         $sql.="r_solici.n_i_monto:= '{$this->parametros['n_i_monto']}'; ";
         $sql.="r_solici.f_pricuo := '{$this->parametros['f_pricuo']}'; "; // 15-MAR-2016(AFG) Nueva variable.
         $asistido = new cf_solCred_Asistido(); 
         if($this->parametros['p_segvid'] == null){            
            $sql.="r_solici.p_segvid:= '{$asistido->getParametro('p_segvid_ori')}'; ";
         }else{
            $sql.="r_solici.p_segvid:= '{$this->parametros['p_segvid']}'; ";          
         }
         if($this->parametros['i_otrcon'] == null){
            $sql.="r_solici.i_otrcon:= '{$asistido->getParametro('i_otrcon_ori')}'; ";
            $i_otrcon = $asistido->getParametro('i_otrcon_ori');    
         }else{
            $sql.="r_solici.i_otrcon:= '{$this->parametros['i_otrcon']}'; ";
            $i_otrcon = $this->parametros['i_otrcon'];            
         }
         if($i_otrcon == 'M'){
            if($this->parametros['V_POROTRCON'] == null){
               $sql.="r_solici.p_otrcon:= '{$asistido->getParametro('p_otrcon_ori')}'; ";   
            }else{
               $sql.="r_solici.p_otrcon:= '{$this->parametros['V_POROTRCON']}'; ";
            }   
         }else if($i_otrcon == 'P'){
            if($this->parametros['A_FACOTRCON'] == null){
               $sql.="r_solici.p_otrcon:= '{$asistido->getParametro('p_otrcon_ori')}'; ";   
            }else{
               $sql.="r_solici.p_otrcon:= '{$this->parametros['A_FACOTRCON']}'; ";
            }
         }         
         if($this->parametros['V_VALOTRCON'] == null){
            $sql.="r_solici.v_otrcon:= '{$asistido->getParametro('v_otrcon_ori')}'; ";   
         }else{            
            $sql.="r_solici.v_otrcon:= '{$this->parametros['V_VALOTRCON']}'; ";
         }
         if($this->parametros['i_capita'] == null){
            $sql.="r_solici.i_capita:= '{$asistido->getParametro('i_capita_ori')}'; ";
         }else{
            $sql.="r_solici.i_capita:= '{$this->parametros['i_capita']}'; ";
         }
         if($this->parametros['V_PORCAPITA'] == null){
            $sql.="r_solici.p_capita:= '{$asistido->getParametro('p_capita_ori')}'; ";
         }else{            
            $sql.="r_solici.p_capita:= '{$this->parametros['V_PORCAPITA']}'; ";   
         }
         if($this->parametros['V_VALTOTCAP'] == null){
            $sql.="r_solici.v_capitaliz:= '{$asistido->getParametro('v_capitaliz_ori')}'; ";
         }else{
            $sql.="r_solici.v_capitaliz:= '{$this->parametros['V_VALTOTCAP']}'; ";            
         }         
         if($this->parametros['i_capotr'] == null){
            $sql.="r_solici.i_capotr:= '{$asistido->getParametro('i_capotr_ori')}'; ";
         }else{
            $sql.="r_solici.i_capotr:= '{$this->parametros['i_capotr']}'; ";
         }
         if($this->parametros['i_segvid'] == null){
            $sql.="r_solici.i_segvid:= '{$asistido->getParametro('i_segvid_ori')}'; ";
         }else{
            $sql.="r_solici.i_segvid:= '{$this->parametros['i_segvid']}'; ";
         }
         
         $posicion=0;
         foreach($this->parametros as $nombre=>$valor) {
            if(substr($nombre,0,4)=="selo") {
               $arr=explode(":",$valor);
               $a_tipodr=$arr[0];
               $a_obliga=$arr[1];
               $v_saldo=$arr[2];
               $i_ctacob_tem=$arr[3];
               $i_obligator=$arr[4];
               /*-------------------------!!! 13-AGO-2014(ACCV) ----------------------------+
               | Se env�a entre comillas el tipo, para que no se presenten problemas cuando |
               | este sea alfanum�rico y/o empiece por 0                                    |
               +----------------------------------------------------------------------------*/
               $sql.="t_no_obliga({$posicion}).a_tipodr := '".$a_tipodr."'; ";
               $sql.="t_no_obliga({$posicion}).a_obliga := '".$a_obliga."'; ";
               if(Configurar::getParametros()->getParametro("VS",112)->getO_alfabe()!="N") {
                  if($this->parametros['selmonto'.$a_obliga]=='') {
                     $monto_prs=0;
                  } else {
                     $monto_prs=$this->parametros['selmonto'.$a_obliga];
                  }
                  $sql.="t_no_obliga({$posicion}).v_parcial_ca090 := ".$monto_prs."; ";
                  /*<---falta*/
               } else {
                  $sql.="t_no_obliga({$posicion}).v_parcial_ca090 := 0; ";
                  /*<---falta*/
               }
               $sql.="t_no_obliga({$posicion}).v_monto_liq := ".$this->parametros['v_monto']."; ";
               $sql.="t_no_obliga({$posicion}).k_idterc := ".$k_idterc."; ";
               $sql.="t_no_obliga({$posicion}).i_ctacob_tem := '".$i_ctacob_tem."'; ";
               $sql.="t_no_obliga({$posicion}).i_obligator := '".$i_obligator."'; ";
               $sql.="t_no_obliga({$posicion}).tipo := ".'\'A\''."; ";
               $posicion=$posicion+1;
            }
         }
         $total_ext=0;
         if(!isset($this->parametros['n_quota'])) {
            $this->parametros['n_quota']=0;
         }
         $itop=$this->parametros['n_quota']+0;
         for($i=1,$pos_cuoext=1;$i<=$itop;$i++) {
            if(!isset($this->parametros['f_quota'.$i])||empty($this->parametros['f_quota'.$i])||empty($this->parametros['v_quota'.$i])) {
               unset($this->parametros['f_quota'.$i]);
               unset($this->parametros['v_quota'.$i]);
            } else {
               if($this->parametros['n_perpag']='Semestral') {
                  $i_perpag=6;
               } else {
                  $i_perpag=3;
               }
               if($this->parametros['i_tipcuo'.$i]=='C') {
                  $this->parametros['i_forcot'.$i]='V';
               } else {
                  if($this->parametros['i_tipnom']=='N') {
                     $this->parametros['i_forcot'.$i]='P';
                  } else if($this->parametros['i_tipnom']=='V') {
                     $this->parametros['i_forcot'.$i]='V';
                  } else {
                     $this->parametros['i_forcot'.$i]='P';
                  }
               }
               $sql2="SELECT pk_ca_gr_2.fu_period_una_cuota(TO_DATE('{$this->parametros['f_quota'.$i]}','MM/DD/RRRR'),TO_DATE('{$f_sugerida}','MM/DD/RRRR')) as I_PERPAG FROM DUAL ";
               $resultado=Configurar::getDb()->ejecutaSentencia($sql2);
               $this->parametros['i_perpag'.$i]=$resultado[0]['I_PERPAG'];
               $f_sugerida=$this->parametros['f_quota'.$i];
               $this->parametros['v_quota'.$i]=str_replace(",","",$this->parametros['v_quota'.$i]);
               $sql.="t_cuoext({$pos_cuoext}).v_cuota:={$this->parametros['v_quota'.$i]}; ";
               $sql.="t_cuoext({$pos_cuoext}).f_cuota:=TO_DATE('{$this->parametros['f_quota'.$i]}','MM/DD/RRRR'); ";
               $sql.="t_cuoext({$pos_cuoext}).i_perpag:={$this->parametros['i_perpag'.$i]}; ";
               $sql.="t_cuoext({$pos_cuoext}).q_cuota:={$this->parametros['q_quota'.$i]}; ";
               $sql.="t_cuoext({$pos_cuoext}).i_forcot:='{$this->parametros['i_forcot'.$i]}'; ";
               $sql.="t_cuoext({$pos_cuoext}).i_tipcuo:='O'; ";
               $sql.="t_cuoext({$pos_cuoext}).k_serie:={$i}; ";
               $pos_cuoext++;
               $total_ext+=$this->parametros['q_quota'.$i]*$this->parametros['v_quota'.$i];
            }
         }
         $sql.=" pk_we_consultar_credito.pr_calcular_ciclo(r_solici,t_cuoext,t_no_obliga,:n_k_producto,:n_funcionario,:xml); END; ";
         //$sql.=" pk_we_consultar_credito.pr_calcular_ciclo(r_solici,t_cuoext,t_no_obliga,:xml);
         // END; ";
         $parametrosSql=array(
            'xml'=> array(
               'valor'=>'',
               'longitud'=>'CLOB'
            ),
            'n_k_producto'=> array(
               'valor'=>$this->parametros['A_PRODUCTO'],
               'longitud'=>-1
            ),
            'n_funcionario'=> array(
               'valor'=>$esFuncionario,
               'longitud'=>-1
            )
         );
         /*$parametrosSql=array('xml'=> array(
          'valor'=>'',
          'longitud'=>'CLOB'
          ));*/
         $info=Configurar::getDb()->ejecutaSentencia($sql,$parametrosSql);
         $this->xml=utf8_encode($parametrosSql['xml']['valor']);
         $domDoc=new DOMDocument();
         $domDoc->loadXML($this->xml);
         $this->dom=$domDoc;
      } catch(Exception $e) {
         $error=Error::getErrorVisible($e->getMessage());
         if($error!='') {
            throw new cf_solCred_Excepcion($error);
         } else {
            throw $e;
         }
      }
   }

   public function getGenerarPDF($parametros) {
      $parametros['modalidad']=$this->parametros['modalidad'].' - '.$this->parametros['modalidad_d'];
      $usuario_web = Configuracion::getUsuarioConexion();
      $asociado2=Configuracion::unserialize("gr_nucleo_Asociado");
      /*--------------------!!! 24-JUL-2018(JCH) ------------------------+
      | Se ajusta para tener en cuenta si llega ha parametrizarse una    |
      | clase especifica para el cliente, esta debe terminar con lo el   |
      | valor del parametro 1112 Ej: class ReporteSimulacionCongente     |
      | en caso de que no haya, tomara la estandar                       |
      +------------------------------------------------------------------*/
      $claseReporte="ReporteSimulacion";
      try {
         $clasecliente=Configurar::getParametros()->getParametro("MN", 1112)->getO_alfabe();
      } catch (Exception $e) {
         $clasecliente="";
      }
      if($clasecliente!=null && $clasecliente!=""){
         if(class_exists(trim($clasecliente))) $claseReporte=trim($clasecliente);
      }
      $reporteSimulacionCliente=new $claseReporte();
      if (Configurar::getFuncionario()->getNusuari() != $usuario_web) {
         $reporteSimulacionCliente::getAmortizacion($this->xml,$asociado2,$parametros);
         /*Se elimina por nueva forma de llamar la clase en caso de que haya una especifica para el cliente*/
         //ReporteSimulacion::getAmortizacion($this->xml,$asociado2,$parametros);
      } else {
         $reporteSimulacionCliente::getAmortizacion($this->xml,$asociado2,$parametros);
         /*Se elimina por nueva forma de llamar la clase en caso de que haya una especifica para el cliente*/
         /*--------------------!!! 10-JUN-2015(ACCV) ----------------------+
         | Se modifica para que invoque al reporte de amortización, porque |
         | cuando el que simulaba era un asociado, si imprimía el ciclo de |
         | amortización, le generaba era la preliquidación del crédito     |
         +-----------------------------------------------------------------*/
         //ReporteSimulacion::getAmortizacion($this->xml,$asociado2,$parametros); //!!! 10-JUN-2015(ACCV) invocación modificada
      }
   }

   public function asHtml() {
      $this->cargarInfo();
      if(!isset($this->parametros['modalidad_d'])||$this->parametros['modalidad_d']==null||trim($this->parametros['modalidad_d'])==''){
         $this->parametros['modalidad_d']=$this->parametros['A_MODALIDAD_CREDITO_D'];
      }
      $this->parametros['modalidad_d']=gr_util_String::toCodificadoUtf8($this->parametros['modalidad_d'],"decode");
      return gr_util_Html::presentar("cf/solCred/xsl/Amortizacion.xsl",$this->dom,true,$this->parametros,true,true);
   }

}
?>