#!/perl/bin/perl.exe
$|=1;
#------------------------------------------------------
#Perl Modules
use Win32::ODBC;
use CGI;
#------------------------------------------------------
#------------------------------------------------------
#HTML printing activation
print "Content-type: text/html\n\n";
#------------------------------------------------------
#------------------------------------------------------
#Get parameters
$form	                = new CGI;
$appid	                = $form->param("appid");
$lan                    = $form->param("lan");
$i8_expediente_id       = $form->param("i8_expediente_id");
$c16_recibo_id          = $form->param("c16_recibo_id");
$dt_abono               = $form->param("dt_abono");
$v64_abono_agencia      = $form->param("v64_abono_agencia");
$v64_abono_sucursal     = $form->param("v64_abono_sucursal");
$i8_periodo             = $form->param("i8_periodo");
$generador              = $form->param("generador");
$Tarifas                = $form->param("Tarifas");
$c2_tipo_recibo_id      = $form->param("c2_tipo_recibo_id");
#------------------------------------------------------
#------------------------------------------------------
#Define subdirectories and general variables
$PATH 		= "../es/";
$file_html      = "es_procesar_abonos1.html";
#------------------------------------------------------
#------------------------------------------------------
# ODBC
if (!($db = new Win32::ODBC($appid))){print "Error connecting to $appid <br>";print "Error: " . Win32::ODBC::Error() . "<br>";exit;}
if (!($db1 = new Win32::ODBC($appid))){print "Error connecting to $appid <br>";print "Error: " . Win32::ODBC::Error() . "<br>";exit;}
if (!($db2 = new Win32::ODBC($appid))){print "Error connecting to $appid <br>";print "Error: " . Win32::ODBC::Error() . "<br>";exit;}
#------------------------------------------------------
#------------------------------------------------------
#Main Program
procesar_abonos();
construct_page();
$db->Close();
$db1->Close();
$db2->Close();
exit;
#------------------------------------------------------
sub procesar_abonos
{
        
        if($generador eq "inmueble"){$table="sdd_inmueble_abonos";$id_field="i8_inmueble_id";}
        if($generador eq "empresa"){$table="sdd_empresa_abonos";$id_field="i8_empresa_id";}
        
        
        ###primero obtenemos los servicios para ese periodo
        $sql="select c8_tributo_id from sdd_".$generador."_servicios where c2_gravable='SI' and i8_".$generador."_id =$i8_expediente_id group by c8_tributo_id";
        #print "<br>$sql";
        if($db2->Sql($sql)){print "SQL failed. 6<br>";print "$sql<br>";print "Error: " . $db2->Error() . "<br>";$db->Close();exit;}
        while($db2->FetchRow())
        {
                undef @r;
                @r=$db2->Data();
                $c8_tributo_id=$r[0];
                $sql="select a.c2_codigo_id,a.i2_grupo_id from sdd_".$generador."_servicios a                
                where a.".$id_field."=".$i8_expediente_id." 
                and concat(substring(a.dt_desde,1,4),substring(a.dt_desde,6,2))<=$i8_periodo
                and a.c8_tributo_id='$c8_tributo_id'
                order by a.dt_desde desc limit 1";
                #print "<br>$sql";
                if($db->Sql($sql)){print "SQL failed. 6<br>";print "$sql<br>";print "Error: " . $db->Error() . "<br>";$db->Close();exit;}
                while($db->FetchRow())
                {
                                
                        undef @row; 
                        @row=$db->Data();
                        
                        $c2_codigo_id   =$row[0];
                        $i2_grupo       =$row[1];
                        #($c16_tarifa_id,  =get_tarifa($generador,$c8_tributo_id,$i8_periodo,$c2_codigo_id);
                        ($c16_tarifa_id,$c1_composicion_tarifa_id,$c1_tipo_tarifa_id,$dt_desde_tarifa,$c1_frecuencia_tarifa_id,$d82_valor)=get_tarifa($generador,$c8_tributo_id,$i8_periodo,$c2_codigo_id);
                        $d82_tarifa=get_valor_tarifa($c16_tarifa_id,$c1_tipo_tarifa_id,$c2_codigo_id,$c1_composicion_tarifa_id,$c1_frecuencia_tarifa_id,$d82_valor,$dt_desde_tarifa,$i2_grupo);
                        if($c16_tarifa_id ne "" and $d82_tarifa>0)
                        {
                                $sql="insert into $table ($id_field,c8_tributo_id,c16_tarifa_id,i8_periodo,d82_abono,c3_tipo_abono_id,c16_recibo_id,c2_tipo_recibo_id,dt_abono,v64_abono_agencia,v64_abono_sucursal,ts_in,ts_update)
                                values($i8_expediente_id,'$c8_tributo_id','$c16_tarifa_id',$i8_periodo,$d82_tarifa,'VAL','$c16_recibo_id','$c2_tipo_recibo_id','$dt_abono','$v64_abono_agencia','$v64_abono_sucursal',now(),now())";
                                if($db1->Sql($sql)){print "SQL failed. 6<br>";print "$sql<br>";print "Error: " . $db1->Error() . "<br>";$db->Close();exit;}
                                        
                                $sql="insert into $table ($id_field,c8_tributo_id,c16_tarifa_id,i8_periodo,d82_abono,c3_tipo_abono_id,c16_recibo_id,c2_tipo_recibo_id,dt_abono,v64_abono_agencia,v64_abono_sucursal,ts_in,ts_update)
                                values($i8_expediente_id,'$c8_tributo_id','$c16_tarifa_id',$i8_periodo,$d82_tarifa*0.05,'FIE','$c16_recibo_id','$c2_tipo_recibo_id','$dt_abono','$v64_abono_agencia','$v64_abono_sucursal',now(),now())";
                                if($db1->Sql($sql)){print "SQL failed. 6<br>";print "$sql<br>";print "Error: " . $db1->Error() . "<br>";$db->Close();exit;}
                        }
                }
        }
        
        
}

sub get_valor_tarifa
{
        
      my($tarifa_id,$tipo_tarifa_id,$codigo_id,$composicion_tarifa_id,$frecuencia_tarifa_id,$valor_tarifa,$desde,$grupo)=@_;
      if (!($dbh = new Win32::ODBC($appid))){connect_fail($database)}
      if (!($dbh1 = new Win32::ODBC($appid))){connect_fail($database1)}

                 #Esta linea fue agregada para la modificacion de bases.
		  if($composicion_tarifa_id eq "F"){
                        #my $per = substr($desde,0,length($desde)-2);
                        my $per = $desde;                        
                        $per	=~ s/-//g;                        
                        $tarifa_value= $valor_tarifa;
                        #print "0.$key=>$key1=>$per=>$base{$key}{$key1}{$per}\n";
                  }
                  #-------------------------------------------------------
		  if($composicion_tarifa_id eq "C"){
			my $query = "SELECT c16_tipo_tarifa_proceso_id,c2_tipo_base_imponible_id,c2_tipo_rango_id,i2_rango,
                        d82_valor,d82_excedente,d82_divisor,d82_rango_minimo,d82_rango_maximo
                        FROM sdd_tarifas WHERE c16_tarifa_id='$tarifa_id'";
			#print "\n$query\n";		  
			if ( $dbh->Sql($query) ){SQL_fail($query,$dbh,'sub get_bases_imponibles');}
			while($dbh->FetchRow()){
			      undef my @row;
			      @row = $dbh->Data();
			      my $tipo_tarifa_proceso_id = $row[0];
			      my $tipo_base_imponible_id = $row[1];
			      my $tipo_rango_id	   	 = $row[2];
			      my $rango		   	 = $row[3];
			      my $valor		   	 = $row[4];
			      my $excendente		 = $row[5];
			      my $divisor		 = $row[6]*1;
			      my $rango_minimo	    	 = $row[7];
			      my $rango_maximo	   	 = $row[8];
      
			      my $query1 = "SELECT f4_total,f4_deducible,i2_tipo_nivel_id,i2_divisor FROM sdd_".$generador."_bases_imponibles WHERE i8_".$generador."_id='$i8_expediente_id' AND c2_tipo_base_imponible_id='$tipo_base_imponible_id' and i2_grupo_id=$grupo";
			      #print "$tipo_tarifa_proceso_id=>$valor=>$query1\n";
			      if ( $dbh1->Sql($query1) ){SQL_fail($query1,$dbh1,'sub get_basefas');}
			      while($dbh1->FetchRow()){
				    undef my @row1;
				    @row1 		   = $dbh1->Data();
				    my $f4_total	   = $row1[0];
				    my $f4_deducible	   = $row1[1];
				    my $i2_tipo_nivel_id   = $row1[2];
				    my $i2_divisor	   = $row1[3]*1;
                                    #Esta linea fue agregada para la modificacion de bases.
                                    #my $per                = substr($row1[4],0,length($row1[4])-2);
                                    #$per	           =~ s/-//g;
                                    #my $per = substr($desde,0,length($desde)-2);
                                    my $per = $desde;                                    
                                    $per    =~ s/-//g;                                       
                                    #------------------------------------------------------
				    my $imponible	   = $f4_total-$f4_deducible;#Verificar si hay que sumar las bases imponibles por grupo y periodo
				    if($tipo_tarifa_proceso_id eq "BXV"){
                                          $tarifa_value= $imponible*$valor;
                                          #print "1.$key=>$key1=>$per=>$base{$key}{$key1}{$per}\n";
                                    }
				    if($tipo_tarifa_proceso_id eq "BVT"){
                                          my $calculo = $imponible*$valor;
                                          if($calculo > $rango_maximo){
                                                $calculo = $rango_maximo;
                                          }
                                          $tarifa_value= $calculo;
                                          #print "2.$key=>$key1=>$per=>$base{$key}{$key1}{$per}\n";
                                    }
				    if($tipo_tarifa_proceso_id eq "BME"){
					  #if ($imponible>=$rango_minimo && $imponible<=$rango_maximo){
					  if ($imponible>$rango_maximo){
                                                if($excendente ne ""){
                                                      if($divisor==0 || $divisor eq ""){$divisor=1}
                                                      #$base{$key}{$key1}{$per}= $valor+((($imponible-$rango_minimo)/$divisor)*$excendente);
                                                      $tarifa_value= $valor+((($imponible-$rango_maximo)/$divisor)*$excendente);##aqui se necesita el cambio para que puede aproximar el valor resultante de dividir el excednete entre el divisor, es necesario agregar una bandera que indique si se hara o no se hara, eso debe hacerse en el 
                                                      #print "3.$key=>$key1=>$per=>$base{$key}{$key1}{$per}\n";
                                                }
                                          }else{
                                                $tarifa_value= $valor;
                                                #print "4.$key=>$key1=>$per=>$base{$key}{$key1}{$per}\n";                                                      
                                          }
				    }
                                    #print "$imponible<>$rango_minimo<>$imponible<>$rango_maximo\n";                                    
				    if($tipo_tarifa_proceso_id eq "CR"){
                                          #print "$imponible=>$rango_minimo<>$rango_maximo\n";                                          
					  if ($imponible>=$rango_minimo && $imponible<=$rango_maximo){
						if($excendente ne ""){
                                                      if($divisor==0){$divisor=1}
                                                      $tarifa_value= $valor+((($imponible-$rango_minimo)/$divisor)*$excendente);
                                                      #$base{$key}{$key1}{$per}= $valor+((($rango_maximo-$imponible)/$divisor)*$excendente);
                                                      #print "5.$key=>$key1=>$per=>$base{$key}{$key1}{$per}\n";
						}else{
						      $tarifa_value= $valor;
                                                      #print "6.$key=>$key1=>$per=>$base{$key}{$key1}{$per}\n";
						}
					  }
				    }
			      }
			      
			}
		  }
	
      
      $dbh->Close();
      $dbh1->Close();
#      print "BASES IMPONIBLES\n";
        $tarifa_value=sprintf("%.2f",$tarifa_value);
      return $tarifa_value;
}

sub get_tarifa
{
        my($generador,$c8_tributo_id,$i8_periodo,$c2_codigo_id)=@_;
        
        $sql="select
        c16_tarifa_id,c1_composicion_tarifa_id,
        c1_tipo_tarifa_id,dt_desde,c1_frecuencia_tarifa_id,d82_tarifa
        from sdm_tarifas where concat(substring(dt_desde,1,4),substring(dt_desde,6,2))<=$i8_periodo
        and c8_tributo_id='$c8_tributo_id' and c2_codigo_id='$c2_codigo_id' order by dt_desde desc limit 1";
        #print "<br>$sql";
        if ( $db1->Sql($sql) ) {SQLfail($sql,$db1,'servicio desecho')}
        while($db1->FetchRow())
        {
            undef @row1;
            @row1=$db1->Data();
            $c16_tarifa_id              =$row1[0];
            $c1_composicion_tarifa_id   =$row1[1];
            $c1_tipo_tarifa_id          =$row1[2];
            $dt_desde_tarifa            =$row1[3];
            $c1_frecuencia_tarifa_id    =$row1[4];
            $d82_valor                  =$row1[5];
        }  
        return ($c16_tarifa_id,$c1_composicion_tarifa_id,$c1_tipo_tarifa_id,$dt_desde_tarifa,$c1_frecuencia_tarifa_id,$d82_valor,$i2_grupo); 
}



sub construct_page {
	open (DATA, "$PATH$file_html");
		while ($line = <DATA>)
                {
			$line =~ s/{lan}/$lan/g;
			$line =~ s/{appid}/$appid/g;		
			print $line;
		}		
	close (DATA);
}