#!/perl/bin/perl.exe
$|=1;
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# Information Software SA
# Date In: 2011-07-22
# Updates: 2011-07-22
# Author: Rodolfo Machon
# File Name: generar_carga_mensual_PUERTO DE LA LIBERTAD.pl
#------------------------------------------------------------------------- 
#-------------------------------------------------------------------------
#PERL MODULES
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use Win32::ODBC;
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#HTML printing activation
print "Content-type: text/html\n\n";
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#GET PARAMETERS
$cgiparms 	= new CGI;
$lan	 	= $cgiparms->param('lan');
$appid	 	= $cgiparms->param('appid');
$clase 	        = $cgiparms->param('clase');
$i8_periodo 	= $cgiparms->param('i8_periodo');
$fecha          = $cgiparms->param('fecha');
#-------------------------------------------------------------------------
#$lan        = "es";
#$appid      = "SIM_v20";
#$clase      = "inmueble";
#$i8_periodo = "201107";
#$fecha      = "2011-07-01";
#-------------------------------------------------------------------------
# CHECK PARAMETERS
if ($lan eq ""){print "Your are not passing LAN parameter<br>";}
if ($appid eq ""){print "Your are not passing APPID parameter<br>";}
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# GLBAL VARIABLES
$PATH 		= "../".$lan."/";
$FILE       	= $lan."_carga_generada".".html";
$dir            ="../archivos_carga/";
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# GET CLASE SCHEMA AND VARIABLES
if (!($dbh  = new Win32::ODBC($appid))){connect_fail($appid)}
if (!($dbh1 = new Win32::ODBC($appid))){connect_fail($appid)}
if (!($dbh2 = new Win32::ODBC($appid))){connect_fail($appid)}
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# MAIN-PROGRAM
$year       = substr($i8_periodo,0,4);
$month      = substr($i8_periodo,4,2);
$day        = "28";
$dt_actual  = $year."-".$month."-".$day;

$per_pen    = put_periodo_pendiente();
#$per_pen    = "201411";
print "Periodo Actual: $i8_periodo <> Periodo Pendiente : $per_pen <br>";
print "Cuotas Pendientes <br><br>";
%pendientes = get_cuotas_pendientes();

delete_balance_from_database();
print "Generar Estados Carga <br><br>";
generar_estado_mes();
print "<br>Generar Archivo Carga <br><br>";
generar_carga();
print "FIN<br><br>";
construct_page();

exit;
#------------------------------------------------------------------------- 
#-------------------------------------------------------------------------
#SUB-ROUTINES -> LEVEL 1
sub put_periodo_pendiente {
      my $ano	= substr($i8_periodo,0,4);
      my $mes	= substr($i8_periodo,4,2)*1;
      my $nmes	= $mes-2;
      if($nmes<=0){$ano = $ano-1; $nmes = 12+$nmes}
      if($nmes<10){$nmes = "0".$nmes}
      return ($ano.$nmes);      
}
sub get_cuotas_pendientes {
      my $b = 0;
      my $c = 0;
      my %hash  = ();
      my %hash1  = ();
      my $query	= "SELECT nic,cuenta,aseo,alumbrado,desecho,otro,calle,barrido FROM cargas_caess WHERE  periodo='$per_pen'";
            #print "$query <br>";
            if ( $dbh->Sql($query) ){SQL_fail($query,$dbh,'sub get_cuotas_pendientes');}                  
            while($dbh->FetchRow()){
                my @row        = $dbh->Data();
                my $aseo       = $row[2]*1;
                my $alumbrado  = $row[3]*1;
                my $desecho    = $row[4]*1;
                my $otro       = $row[5]*1;
                my $calle      = $row[6]*1;
                my $barrido    = $row[7]*1;
                #print "$row[0] > $row[1] > $aseo + $alumbrado + $desecho + $otro + $calle + $barrido <br>";
                $hash{$row[0]} = $aseo+$alumbrado+$desecho+$otro+$calle+$barrido;
      }
      foreach my $k (sort keys %hash){
            my $existe = get_existe($k);
            if($existe==0){
                  $hash1{$k} = $hash{$k};
                  if($c==25){print ".";$c=0}
                  if($b==5000){print "Procesados=$a,ID Hasta=$id<br>";$b=0}
                  $b++;
                  $c++;            
            }
      }
      return %hash1;
}
sub generar_estado_mes {
      my $b = 0;
      my $c = 0;
      %nics        = ();
      %tarifas 	   = get_tarifas();
      %tarifas_d   = get_tarifas_detalles();
      %accesorios  = get_accesorios();
      %servicios   = get_servicios();
      %bases	   = get_bases();
      @expedientes = get_expedientes();
      #print "$#expedientes <br>";
      for (my $a=0;$a<=$#expedientes;$a++){
            $id         = $expedientes[$a];
            %cargos	= get_cargos($id);
            %abonos	= get_abonos($id);
            %balance	= get_balance($id);
            insert_balance_into_database($id);
            #print "$a <br>";
            if($c==25){print ".";$c=0}
            if($b==5000){print "Procesados=$a,ID Hasta=$id<br>";$b=0}
            $b++;
            $c++;   
      }
      return;
}
sub generar_carga {
      my $a = 0;
      my $b = 0;
      my $c = 0;  
      my $sql="delete from sdd_inmueble_cargos where i8_periodo='$i8_periodo' and (c2_tipo_mandamiento_id='CA' or c2_tipo_mandamiento_id='DE')";
      if( $dbh->Sql($sql) ) {SQLfail($sql,$dbh,'generar carga')}      

      $sql="select i8_inmueble_id,i8_nis_id,i8_nic_id,c16_unicom from sdd_inmueble_suministro_nics where c8_estado='ACT' order by i8_inmueble_id";
      $file=$dir.$i8_periodo.".txt";
      open("file_carga",">".$file);
      if ( $dbh->Sql($sql) ) {SQLfail($sql,$dbh,'generar carga')}
      while($dbh->FetchRow()){
            undef @row;
            @row                    = $dbh->Data();
            $i8_inmueble_id         = $row[0];
            $i8_nis_id              = $row[1];
            $i8_nic_id              = $row[2];            
            $unicom                 = $row[3];
            $c16_medidor            = "";
            
            $valor_aseo             = 0;
            $valor_alumbrado        = 0;
            $valor_calle            = 0;
            $valor_barrido          = 0;
            $valor_desecho          = 0;

            $valor_aseo_fie         = 0;
            $valor_alumbrado_fie    = 0;
            $valor_calle_fie        = 0;
            $valor_barrido_fie      = 0;
            $valor_desecho_fie      = 0;
            
            if($unicom eq ""){$unicom=2119}
            $sql1="select c16_tarifa_id,d82_val,d82_fie from sdd_inmueble_cargas where i8_periodo='$i8_periodo' and i8_inmueble_id='$i8_inmueble_id'";
            #print $sql1."<br>";           
            if ( $dbh1->Sql($sql1) ) {SQLfail($sql1,$dbh1,'generar carga')}
            while($dbh1->FetchRow()){
                  undef my @row1;
                  @row1                = $dbh1->Data();
                  my $c16_tarifa_id    = $row1[0];
                  my $d82_val          = $row1[1];
                  my $d82_fie          = $row1[2];
                  my $tarifa           = substr($c16_tarifa_id,0,8);
                  if($tarifa eq "TSINMASE"){
                        $valor_aseo       = $d82_val;
                        $valor_aseo_fie   = $d82_fie;
                        $sql="insert into sdd_inmueble_cargos(i8_inmueble_id,c8_tributo_id,c16_tarifa_id,i8_periodo,dt_cargo,d82_cargo,c3_tipo_cargo_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMASE','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_aseo,'VAL','CA',now(),now())";
                        if ( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
                        $sql="insert into sdd_inmueble_cargos (i8_inmueble_id,c8_tributo_id,c16_tarifa_id,i8_periodo,dt_cargo,d82_cargo,c3_tipo_cargo_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMASE','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_aseo_fie,'FIE','CA',now(),now())";
                        if( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
                  }
                  if($tarifa eq "TSINMALU"){
                        $valor_alumbrado     = $d82_val;
                        $valor_alumbrado_fie = $d82_fie;
                        $sql="insert into sdd_inmueble_cargos(i8_inmueble_id,c8_tributo_id,c16_tarifa_id,i8_periodo,dt_cargo,d82_cargo,c3_tipo_cargo_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMALU','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_alumbrado,'VAL','CA',now(),now())";
                        if ( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
                        $sql="insert into sdd_inmueble_cargos (i8_inmueble_id,c8_tributo_id,c16_tarifa_id,i8_periodo,dt_cargo,d82_cargo,c3_tipo_cargo_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMALU','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_alumbrado_fie,'FIE','CA',now(),now())";
                        if ( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}                        
                  }
                  if($tarifa eq "TSINMCAL"){
                        $valor_calle      = $d82_val;
                        $valor_calle_fie  = $d82_fie;
                        $sql="insert into sdd_inmueble_cargos(i8_inmueble_id,c8_tributo_id,c16_tarifa_id,i8_periodo,dt_cargo,d82_cargo,c3_tipo_cargo_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMCAL','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_calle,'VAL','CA',now(),now())";
                        if( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
                        $sql="insert into sdd_inmueble_cargos(i8_inmueble_id,c8_tributo_id,c16_tarifa_id,i8_periodo,dt_cargo,d82_cargo,c3_tipo_cargo_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMCAL','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_calle_fie,'FIE','CA',now(),now())";
                        if( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
                  }
                  if($tarifa eq "TSINMDES"){
                        $valor_desecho      = $d82_val;
                        $valor_desecho_fie  = $d82_fie;
                        $sql="insert into sdd_inmueble_cargos(i8_inmueble_id,c8_tributo_id,c16_tarifa_id,i8_periodo,dt_cargo,d82_cargo,c3_tipo_cargo_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMDES','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_desecho,'VAL','CA',now(),now())";
                        if( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
                        $sql="insert into sdd_inmueble_cargos(i8_inmueble_id,c8_tributo_id,c16_tarifa_id,i8_periodo,dt_cargo,d82_cargo,c3_tipo_cargo_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMDES','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_desecho_fie,'FIE','CA',now(),now())";
                        if( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
                  }
                  if($tarifa eq "TSINMBAR"){
                        $valor_barrido      = $d82_val;
                        $valor_barrido_fie  = $d82_fie;
                        $sql="insert into sdd_inmueble_cargos(i8_inmueble_id,c8_tributo_id,c16_tarifa_id,i8_periodo,dt_cargo,d82_cargo,c3_tipo_cargo_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMBAR','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_barrido,'VAL','CA',now(),now())";
                        if( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
                        $sql="insert into sdd_inmueble_cargos(i8_inmueble_id,c8_tributo_id,c16_tarifa_id,i8_periodo,dt_cargo,d82_cargo,c3_tipo_cargo_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMBAR','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_barrido_fie,'FIE','CA',now(),now())";
                        if( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
                  }                  
            }
            $sql="select c16_medidor_id from sdd_inmueble_suministros_energias where i8_nis_id='$i8_nis_id'";
            if ( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
            while($dbh2->FetchRow()) {
                  undef @row3;
                  @row3=$dbh2->Data();
                  $c16_medidor=$row3[0];
            }
            
            $total_tasas      = $valor_aseo+$valor_calle+$valor_desecho+$valor_alumbrado+$valor_barrido;
            $valor_aseo       = ($valor_aseo+$valor_aseo_fie)*100;
            $valor_otro       = ($valor_calle+$valor_calle_fie)+($valor_barrido+$valor_barrido_fie);
            $valor_otro       = $valor_otro*100;
            $valor_desecho    = ($valor_desecho+$valor_desecho_fie)*100;
            $valor_alumbrado  = ($valor_alumbrado+$valor_alumbrado_fie)*100;
            #Agregar a nueva carga a partir de Noviembre 2014
            #-------------------------------------------------------
            $valor_otro       = "000000";
            $valor_calle      = ($valor_calle+$valor_calle_fie)*100;
            $valor_barrido    = ($valor_barrido+$valor_barrido_fie)*100;
            $valor_cuota      = $pendientes{$i8_nic_id};            
            #-------------------------------------------------------            
            $c16_medidor      = sprintf("%0*d",10, $c16_medidor);
            $i8_nic_id        = sprintf("%0*d",7, $i8_nic_id);
            $valor_aseo       = sprintf("%0*d",6, $valor_aseo);
            $valor_otro       = sprintf("%0*d",6, $valor_otro);
            $valor_desecho    = sprintf("%0*d",6, $valor_desecho);
            $valor_alumbrado  = sprintf("%0*d",6, $valor_alumbrado);
            #Agregar a nueva carga a partir de Noviembre 2014
            #-------------------------------------------------------            
            $valor_calle     = sprintf("%0*d",6, $valor_calle);
            $valor_barrido   = sprintf("%0*d",6, $valor_barrido);
            $valor_cuota     = sprintf("%0*d",6, $valor_cuota);
            #-------------------------------------------------------
            
            $actualizacion    = 1;
            $cuenta_alcaldia  = $i8_inmueble_id;            

            if($total_tasas>0){
                  $registro=$i8_nic_id.$unicom.$c16_medidor.$cuenta_alcaldia.$valor_aseo.$valor_alumbrado.$valor_desecho.$valor_otro."         ".$actualizacion.$valor_calle.$valor_barrido.$valor_cuota;
                  #if ($a<=10) {print "$registro <br>";}
                  
                  print file_carga $registro;
                  print file_carga "\n";
            }
            if($c==25){print ".";$c=0}
            if($b==5000){print "Procesados=$a<br>";$b=0}
            $a++;
            $b++;
            $c++;            
      }
      #print "Proceso terminado";
      close(file_carga);
}
sub construct_page{
      open (DATA, "$PATH$FILE");
      #print "$PATH$FILE <br>";
      while ($line = <DATA>){
	    $line =~ s/{lan}/$lan/g;
	    $line =~ s/{appid}/$appid/g;
	    $line =~ s/{periodo}/$i8_periodo/g;
            $line =~ s/{directorio}/$dir/g;
	    print "$line";
      }
}
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#SUB-ROUTINES -> LEVEL 2
sub get_existe {
    my ($id)  = @_;
    my $str	  = 0;
    my $sql   = "SELECT a.i8_periodo
                 FROM sdd_inmueble_abonos a
                 INNER JOIN sdd_inmueble_suministro_nics b ON a.i8_inmueble_id=b.i8_inmueble_id
                 WHERE b.i8_nic_id='$id' and a.i8_periodo='$per_pen'";
    #print "$sql <br>";
    if ( $dbh->Sql($sql) ){SQL_fail($sql,$dbh,'sub get_existe');}
    while($dbh->FetchRow()){
        my @row = $dbh->Data();
        $str++;
    }
    return $str;
}
sub get_tarifas {
      my %tari  = ();
      my $query	= "SELECT MAX(c16_tarifa_id),c8_tributo_id,c1_tipo_tarifa_id,c2_codigo_id,c1_frecuencia_tarifa_id,c1_composicion_tarifa_id,MAX(d82_tarifa),MAX(dt_desde) FROM sdm_tarifas group by c8_tributo_id,c1_tipo_tarifa_id,c2_codigo_id";
      if ( $dbh->Sql($query) ){SQL_fail($query,$dbh,'sub get_tarifas');}                  
      while($dbh->FetchRow()){
            undef my @row;
            @row = $dbh->Data();
            $tari{$row[1]}{$row[2]}{$row[3]}{$row[4]}{$row[5]} = [@row];
      }
#      print "TARIFAS\n<br>";      
#      foreach $k (sort keys %tari){
#	    foreach $kk (sort keys %{$tari{$k}}){
#            	    foreach $kkk (sort keys %{$tari{$k}{$kk}}){
#                        foreach $kkkk (sort keys %{$tari{$k}{$kk}{$kkk}}){
#                              foreach $kkkkk (sort keys %{$tari{$k}{$kk}{$kkk}{$kkkk}}){
#                                    print "$k=>$kk=>$kkk=>$kkkk=>$kkkkk<>$tari{$k}{$kk}{$kkk}{$kkkk}{$kkkkk}[6]<br>";
#                              }
#                        }
#            	    }
#            }
#	    print "\n<br>";
#      }
      return %tari;
}
sub get_tarifas_detalles {
      my %tarid  = ();
      my $query	 = "SELECT c16_tarifa_id,c16_tipo_tarifa_proceso_id,c2_tipo_base_imponible_id,i2_rango,d82_valor,d82_excedente,d82_divisor,d82_rango_minimo,d82_rango_maximo FROM sdd_tarifas ORDER BY c16_tarifa_id";
      if ( $dbh->Sql($query) ){SQL_fail($query,$dbh,'sub get_tarifas');}                  
      while($dbh->FetchRow()){
            undef my @row;
            @row = $dbh->Data();
            $tarid{$row[0]}{$row[3]} = [@row];
      }
#      print "TARIFAS DETALLES\n<br>";      
#      foreach $k (sort keys %tarid){
#	    foreach $kk (sort keys %{$tarid{$k}}){
#                  print "$k=>$kk=>$tarid{$k}{$kk}[4]<br>";
#            }
#	    print "\n<br>";
#      }      
      return %tarid;
}
sub get_accesorios {
      my %acce	= ();
      my $query = "SELECT c8_tributo_id,c8_accesorio_id,dt_desde,dt_hasta FROM sdd_tributo_accesorios";
      if ( $dbh->Sql($query) ){SQL_fail($query,$dbh,'sub get_accesorios 1');}
      while($dbh->FetchRow()){
            undef my @row;
            @row = $dbh->Data();
            $acce{$row[0]}{$row[1]}=[@row];
      }
#      print "ACCE\n<br>";      
#      foreach $k (sort keys %acce){
#	    foreach $kk (sort keys %{$acce{$k}}){
#                   print "$k=>$kk=><>$acce{$k}{$kk}[2]<br>";
#            }
#	    print "\n<br>";
#      } 
      return %acce;
}
sub get_servicios {
      my %serv = ();
      my $query = "SELECT i8_inmueble_id,i2_grupo_id,c8_tributo_id,c1_tipo_tarifa_id,c2_codigo_id,dt_desde,dt_hasta
                        FROM sdd_inmueble_servicios WHERE c2_gravable='SI' and dt_desde<='$dt_actual' and dt_hasta>='$dt_actual' ORDER BY 1,2,3";
      #print "$query";
      if ( $dbh->Sql($query) ){SQL_fail($query,$dbh,'sub get_tributos');}
      while($dbh->FetchRow()){
	    undef my @row;
	    @row            = $dbh->Data();
	    $serv{$row[0]}{$row[1]}{$row[2]} = [@row];
      }
      return %serv;
}
sub get_bases {
      my %base	 = ();
      my $query1 = "SELECT i8_inmueble_id,i2_grupo_id,c2_tipo_base_imponible_id,f4_total,f4_deducible,i2_tipo_nivel_id,i2_divisor,dt_desde
                        FROM sdd_inmueble_bases_imponibles";
      if ( $dbh1->Sql($query1) ){SQL_fail($query1,$dbh1,'sub get_basefas');}
      while($dbh1->FetchRow()){
            undef my @row;
            @row   = $dbh1->Data();
            $base{$row[0]}{$row[1]}{$row[2]} = [@row];
      }
#      print "BASES\n<br>";      
#      foreach $k (sort keys %base){
#	    foreach $kk (sort keys %{$base{$k}}){
#            	    foreach $kkk (sort keys %{$base{$k}{$kk}}){
#                           print "$k=>$kk=>$kkk=><>$base{$k}{$kk}{$kkk}[0]<br>";
#            	    }
#            }
#	    print "\n<br>";
#      } 
      return %base;
}
sub get_expedientes {
      my $stream = "";
      my $query  = "SELECT i8_inmueble_id,i8_nic_id FROM sdd_inmueble_suministro_nics WHERE c8_estado='ACT' GROUP BY i8_inmueble_id ORDER BY i8_inmueble_id";
      if ( $dbh->Sql($query) ){SQL_fail($query,$dbh,'sub get_tributos');}
      while($dbh->FetchRow()){
	    undef my @row;
	    @row     = $dbh->Data();
	    $stream .= $row[0].",";
        $nics{$row[1]} = $row[0];
      }
      $stream  = substr($stream,0,length($stream)-1);
      my @expe = split(/\,/,$stream);
      return @expe;
}
sub get_cargos {
      my ($id)  = @_;
      my %cargo = ();
      foreach my $k (sort keys %{$servicios{$id}}){
            foreach my $kk (sort keys %{$servicios{$id}{$k}}){
                  my $tip                     = $servicios{$id}{$k}{$kk}[3];
                  my $cod                     = $servicios{$id}{$k}{$kk}[4];
                  ($tar_cod,$base_imponible)  = get_base_imponible($id,$k,$kk,$tip,$cod);
                  $cargo{$id}{$tar_cod}{'VAL'} = sprintf("%.2f",$base_imponible); 
                  $cargo{$id}{$tar_cod}{'FIE'} = get_fiesta($tar_cod,$base_imponible);
            }
      }
#      print "CARGOS<br>\n";      
#      foreach $k (sort keys %cargo){
#	    foreach $kk (sort keys %{$cargo{$k}}){
#		  foreach $kkk (sort keys %{$cargo{$k}{$kk}}){  
#			print "$k=>$kk=>$kkk=>$cargo{$k}{$kk}{$kkk}<br>\n";
#		  }
#	    }
#	    print "\n";	    
#      }      
      return %cargo;
}
sub get_abonos {
      my ($id)  = @_;
      my %abono	= ();
      my $query = "SELECT i8_periodo,c16_tarifa_id,d82_abono,c3_tipo_abono_id,c1_balance_type FROM sdd_inmueble_abonos WHERE i8_inmueble_id='$id' and i8_periodo='$i8_periodo'";
      if ( $dbh->Sql($query) ){SQL_fail($query,$dbh,'sub get_abonos');}
      while($dbh->FetchRow()){
	    undef my @row;
	    @row = $dbh->Data();
            $abono{$id}{$row[1]}{$row[3]} += $row[2];
      }
#      print "ABONOS<br>\n";      
#      foreach $k (sort keys %abono){
#	    foreach $kk (sort keys %{$abono{$k}}){
#		  foreach $kkk (sort keys %{$abono{$k}{$kk}}){  
#			print "$k=>$kk=>$kkk=>$abono{$k}{$kk}{$kkk}<br>\n";
#		  }
#	    }
#	    print "\n";	    
#      }
      return %abono;
}
sub get_balance {
      my ($id)   = @_;
      my $stream = "";
      my %bal	 = ();
      foreach my $kk (sort keys %{$cargos{$id}}){
            foreach my $kkk (sort keys %{$cargos{$id}{$kk}}){
                  if(!$abonos{$id}{$kk}{$kkk}){$bal{$id}{$kk}{$kkk}=$cargos{$id}{$kk}{$kkk}}
            }
      }
#      print "BALANCE<br>\n";      
#      foreach $k (sort keys %bal){
#	    foreach $kk (sort keys %{$bal{$k}}){
#		  foreach $kkk (sort keys %{$bal{$k}{$kk}}){
#			print "$k=>$kk=>$kkk=>$bal{$k}{$kk}{$kkk}<br>\n";
#		  }
#	    }
#	    print "\n";	    
#      }      
      return %bal;     
}
sub delete_balance_from_database {
      my ($id)=@_;
      my $query    = "DELETE FROM sdd_inmueble_cargas WHERE i8_periodo='$i8_periodo'";
      #print "$query<br>\n";
      if ( $dbh->Sql($query) ){SQL_fail($query,$dbh,'sub delete_balance')}
}
sub insert_balance_into_database {
      my ($id)          = @_;
      my $table		= "sdd_inmueble_cargas";
      my $insert_fields	= "i8_inmueble_id,i8_periodo,c16_tarifa_id,d82_val,d82_fie,d82_int,d82_mul";    
      foreach $kk (sort keys %{$balance{$id}}){
            my $val   = $balance{$id}{$kk}{'VAL'};
            my $fie   = $balance{$id}{$kk}{'FIE'};
            #if($id eq "1041857"){print "I got here $val >> $fie <br>"}
            if($val>0){
                  my $query = "INSERT INTO $table ($insert_fields) VALUES ('$id','$i8_periodo','$kk',$val,$fie,0,0)";
                  #print "$query<br>\n";
                  if ( $dbh->Sql($query) ){SQL_fail($query,$dbh,'sub insert')}
            }else{
                  #if($kk ne "TSINMCALSTIMC004"){print "$id >> $kk >> $val >> $fie <br>";}
            }
            if ($pendientes{$nics{$id}}) {
                  my $query = "INSERT INTO $table ($insert_fields) VALUES ('$id','$i8_periodo','TSINMPENNAMC001',$pendientes{$nics{$id}},0,0,0)";
                  #print "$query<br>\n";
                  if ( $dbh->Sql($query) ){SQL_fail($query,$dbh,'sub insert_balance_into_database')}
            }
      }
}
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#SUB-ROUTINES -> LEVEL 3
sub get_base_imponible {
      my ($id,$gr,$trb,$tip,$cod)= @_;
      my $imponible  = 0;
      my $tariff_cod = "";
      foreach $l (sort keys %{$tarifas{$trb}{$tip}{$cod}{'M'}}){
            $tariff_cod = $tarifas{$trb}{$tip}{$cod}{'M'}{$l}[0];
            if ($l eq "F"){
                  #print "$trb=>$tip=>$cod=>M=>$l<>$tariff_cod<br>";
                 $imponible  = $tarifas{$trb}{$tip}{$cod}{'M'}{$l}[6];
            }
            if ($l eq "C"){
                  $imponible = get_tarifa_detalle_valor($tariff_cod,$id,$gr); 
            }
      }
      #print "$tariff_cod<>$imponible<br>";
      return ($tariff_cod,$imponible);
}
sub get_tarifa_detalle_valor {
      my ($tarifa,$id,$gr)  = @_;
      my $val_trib  = 0;
      my $imponible = 0;
      my $valor     = 0;
      foreach $k (sort keys %{$tarifas_d{$tarifa}}){
            if($tarifas_d{$tarifa}{$k}[1] eq "BXV"){
                  $tbp   = $tarifas_d{$tarifa}{$k}[2];
                  $valor = $tarifas_d{$tarifa}{$k}[4];
                  $imponible = $bases{$id}{$gr}{$tbp}[3]-$bases{$id}{$gr}{$tbp}[4];
                  $val_trib += $imponible*$valor;
                  if($tarifas_d{$tarifa}{$k}[7]>0){if($val_trib<$tarifas_d{$tarifa}{$k}[7]){$val_trib=$tarifas_d{$tarifa}{$k}[7]}}
                  if($tarifas_d{$tarifa}{$k}[7]>0){if($val_trib>$tarifas_d{$tarifa}{$k}[8]){$val_trib=$tarifas_d{$tarifa}{$k}[8]}}
            }
            if($tarifas_d{$tarifa}{$k}[1] eq "BVT"){
                  $tbp = $tarifas_d{$tarifa}{$k}[2];
                  $valor = $tarifas_d{$tarifa}{$k}[4];             
                  $imponible = $bases{$id}{$gr}{$tbp}[3]-$bases{$id}{$gr}{$tbp}[4];            
                  my $calculo = $imponible*$valor;
                  if($calculo > $tarifas_d{$tarifa}{$k}[8]){
                        $calculo = $tarifas_d{$tarifa}{$k}[8];
                  }
                  $val_trib += $calculo;
            }
            if($tarifas_d{$tarifa}{$k}[1] eq "BME"){
                  $tbp = $tarifas_d{$tarifa}{$k}[2];
                  $valor = $tarifas_d{$tarifa}{$k}[4];             
                  $imponible = $bases{$id}{$gr}{$tbp}[3]-$bases{$id}{$gr}{$tbp}[4];            
                  if ($imponible>$tarifas_d{$tarifa}{$k}[8]){
                        if($excendente ne ""){
                              if($divisor==0 || $divisor eq ""){$divisor=1}
                              $val_trib += $valor+((($imponible-$tarifas_d{$tarifa}{$k}[8])/$divisor)*$excendente);                                                      
                        }
                  }else{
                        $val_trib += $valor;
                  }
            }
            if($tarifas_d{$tarifa}{$k}[1] eq "CR"){
                  $tbp   = $tarifas_d{$tarifa}{$k}[2];
                  $valor = $tarifas_d{$tarifa}{$k}[4];
                  #print "$tarifa => $tarifas_d{$tarifa}{$k}[1] =>$valor<br>";
                  $imponible = $bases{$id}{$gr}{$tbp}[3]-$bases{$id}{$gr}{$tbp}[4];            
                  if ($imponible>=$tarifas_d{$tarifa}{$k}[7] && $imponible<=$tarifas_d{$tarifa}{$k}[8]){
                        if($excendente ne ""){
                              if($divisor==0){$divisor=1}
                              my $resultado = (($imponible-$tarifas_d{$tarifa}{$k}[7])/$divisor);
                              my $entero    = int($resultado);
                              my $decimal   = sprintf("%.2f", ($resultado - int($resultado)));
                              if ($decimal>.00){$entero++}
                              $val_trib += $valor+($entero*$excendente);
                        }else{
                              $val_trib += $valor;
                        }
                  }
            }
      }
      return $val_trib;
}
sub get_fiesta {
    my ($tarifa,$base_imponible)= @_;
    my $fiesta= 0;
    my $trib  = substr($tarifa,0,8);
    my $desde = substr($accesorios{$trib}{'ACINMFIE'}[2],0,7);
    my $hasta = substr($accesorios{$trib}{'ACINMFIE'}[3],0,7);
    $desde    =~ s/\-//g;
    $hasta    =~ s/\-//g;
    #~print "$i8_periodo<>$desde<>$hasta<br>";
    if($i8_periodo>=$desde && $i8_periodo<=$hasta){
         $fiesta = sprintf("%.2f",$base_imponible*0.05);
    }
    return $fiesta;
}
#AUXILIAR-SUBROUTINES
sub SQL_fail {
    my ($query,$dbh,$section)= @_;
    print "SQL failed in Section $section<br>";
    print "Error: ".$dbh->Error()."\n<br>";
    print "Query: ".$query."<br>";    
    $dbh->Close();
    exit;
}
sub connect_fail {
    my ($DSN)=@_;
    print "Error connecting to $DSN<br>";
    print "Error:".Win32::ODBC::Error()."<br>";
    exit;
}
#-------------------------------------------------------------------------