#!/perl/bin/perl.exe
$|=1;
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# Information Software SA
# Date In: 2015-06-08
# Updates: 2015-06-08
# Author: Rodolfo Machon
# File Name: generar_carga_mensual_ilopango.pl
#------------------------------------------------------------------------- 
#-------------------------------------------------------------------------
#PERL MODULES
use CGI;
use DBI;
use XML::Simple;
use Data::Dumper;
use CGI::Carp qw(fatalsToBrowser);
binmode STDOUT, ":encoding(utf8)";
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#HTML printing activation
print "Content-type: text/html\n\n";
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#GET PARAMETERS
$cgiparms       = new CGI;
$i8_periodo     = $cgiparms->param('i8_periodo');
#$fecha          = $cgiparms->param('fecha');
$c3_tipo_facturador_id= $cgiparms->param('c3_tipo_facturador_id');
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# CHECK PARAMETERS
#-------------------------------------------------------------------------
$i8_periodo     = '202501';
#$c3_tipo_facturador_id= 'CAE';
#-------------------------------------------------------------------------
# GET CLASE SCHEMA
get_app_data();
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# GLBAL VARIABLES
$PATH 	= "../".$lan."/";
$FILE       = $lan."_carga_generada".".html";
$dir    = "../archivos_carga/";
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# GET CLASE SCHEMA AND VARIABLES
$dbh 	= DBI->connect("dbi:ODBC:$appid",'','',{PrintError => 1, RaiseError => 1});
if (!$dbh) {print "error: connection: $DBI::err\n$DBI::errstr\n$DBI::state\n";}
$dbh->{LongReadLen} = 512 * 1024;
$dbh->{LongTruncOk} = 1;
$dbh1 = DBI->connect("dbi:ODBC:$appid",'','',{PrintError => 1, RaiseError => 1});
if (!$dbh1) {print "error: connection: $DBI::err\n$DBI::errstr\n$DBI::state\n";}
$dbh1->{LongReadLen} = 512 * 1024;
$dbh->{LongTruncOk} = 1;
$dbh2 = DBI->connect("dbi:ODBC:$appid",'','',{PrintError => 1, RaiseError => 1});
if (!$dbh2) {print "error: connection: $DBI::err\n$DBI::errstr\n$DBI::state\n";}
$dbh2->{LongReadLen} = 512 * 1024;
$dbh->{LongTruncOk} = 1;
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# MAIN-PROGRAM
$fecha			= get_fecha_actual();
$year       = substr($i8_periodo,0,4);
$month      = substr($i8_periodo,4,2);
$day        = "30";
$digitos    = 2;
$dt_actual  = $year."-".$month."-".$day;
$per_pen    = put_periodo_pendiente();

print "Periodo Actual: $i8_periodo <> Periodo Pendiente : $per_pen <br>";
%sectores = get_carga_sectores();
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_carga_sectores {
    my %hash      = ();
    my $sql       = "SELECT c11_sector_id FROM sdm_carga_sectores WHERE i8_periodo='$i8_periodo'";
	#print $sql."<br>";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub get_carta_sectores');
    while (my @row = $sth->fetchrow_array) {
		$hash{$row[0]} = $row[0]; 
    }
	return %hash;
}
sub get_cuotas_pendientes {
    my $b       = 0;
    my $c       = 0;
    my %hash      = ();
    my %hash1     = ();
    my $sql     = "SELECT nic,cuenta,aseo,alumbrado,desecho,calle FROM cargas_caess WHERE periodo='$per_pen'";
	if (keys %sectores) {
		my $secs = "";
		foreach my $k (keys %sectores){$secs .= "'".$k."',"}
		$secs = substr($secs,0,length($secs)-1);
        $sql = "SELECT a.nic,a.cuenta,a.aseo,a.alumbrado,a.desecho,a.calle FROM cargas_caess a INNER JOIN sdm_inmuebles b ON a.cuenta=b.i8_inmueble_id WHERE a.periodo='$per_pen' AND b.c11_sector_id IN ($secs)";
    }
	#print $sql;
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub get_cuotas_pendientes');
    while (my @row = $sth->fetchrow_array) {
        my $aseo       = $row[2]*1;
        my $alumbrado  = $row[3]*1;
        my $desecho    = $row[4]*1;
        my $calle      = $row[5]*1;
        $hash{$row[0]} = $aseo+$alumbrado+$desecho+$calle;
    }
    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;
    %inicios    = get_inicios();
    %tarifas 	= get_tarifas();
    %tarifas_d  = get_tarifas_detalles();
    %accesorios = get_accesorios();
    %servicios  = get_servicios();
    %bases	    = get_bases();
    @expedientes= get_expedientes();
    #@expedientes = ('1014537');       
    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);
          if($c==5){print ".";$c=0}
          if($b==5000){print "Procesados=$a,ID Hasta=$id<br>";$b=0}
          $b++;
          $c++;            
    }
    return;
}
sub delete_balance_from_database {
    my $sql = "DELETE FROM sdd_inmueble_cargas WHERE i8_periodo='$i8_periodo' and c3_tipo_facturador_id='CAE'";
    #print "$sql<br>\n";
    $dbh->do($sql);
}
sub generar_carga {
    my $a = 0;
    my $b = 0;
    my $c = 0;
    $sql  = "delete from sdd_inmueble_cargos where i8_periodo='$i8_periodo' and c2_tipo_mandamiento_id='CA'";
    $dbh->do($sql);

    $sql  = "select i8_inmueble_id,i8_nic_id,c16_unicom,c16_medidor_id from sdd_inmueble_suministro_nics where c8_estado='ACT' and c3_facturador_id='$c3_tipo_facturador_id' order by i8_inmueble_id";
    $file = $dir.$i8_periodo.".txt";
    open("file_carga",">".$file);
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub generar_carga');
    while (my @row = $sth->fetchrow_array) {
           $i8_inmueble_id         = $row[0];
            $i8_nic_id              = $row[1];            
            $unicom                 = $row[2];
            $c16_medidor            = $row[3];
            
            $valor_aseo             = 0;
            $valor_aseo1            = 0;
            $valor_alumbrado        = 0;
            $valor_barrido          = 0;            
            $valor_calle            = 0;
            $valor_calle1           = 0;
            $valor_desecho          = 0;
            $valor_desecho1         = 0;
            $total_fiesta           = 0;

            $valor_aseo_fie         = 0;
            $valor_aseo1_fie        = 0;
            $valor_alumbrado_fie    = 0;
            $valor_barrido_fie      = 0;            
            $valor_calle_fie        = 0;
            $valor_calle1_fie       = 0;
            $valor_desecho_fie      = 0;
            $valor_desecho1_fie     = 0;
            $valor_cargo_caess      = 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' and c3_tipo_facturador_id='$c3_tipo_facturador_id'";
        #print $sql1."<br>";           
        my $sth1 = $dbh1->prepare($sql1);
        $sth1->execute or die SQL_fail($sql1,$dbh1,'sub generar_carga');
        while (my @row1 = $sth1->fetchrow_array) {
            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())";
                $dbh2->do($sql);
                $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())";
                $dbh2->do($sql);
            }
            if($tarifa eq "TSINMASD"){
                $valor_aseo1       = $d82_val;
                $valor_aseo1_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_aseo1,'VAL','CA',now(),now())";
                $dbh2->do($sql);
                $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_aseo1_fie,'FIE','CA',now(),now())";
                $dbh2->do($sql);
            }
            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())";
                $dbh2->do($sql);
                $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())";
                $dbh2->do($sql);
            }
            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())";
                $dbh2->do($sql);
                $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())";
                $dbh2->do($sql);
            }
            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())";
                $dbh2->do($sql);
                $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())";
                $dbh2->do($sql);
            }
            if($tarifa eq "TSINMCA2"){
                $valor_calle1      = $d82_val;
                $valor_calle1_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_calle1,'VAL','CA',now(),now())";
                $dbh2->do($sql);
                $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_calle1_fie,'FIE','CA',now(),now())";
                $dbh2->do($sql);
            }
             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())";
                $dbh2->do($sql);
                $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())";
                $dbh2->do($sql);
            }		
             if($tarifa eq "TSINMDED"){
                $valor_desecho1       = $d82_val;
                $valor_desecho1_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_desecho1,'VAL','CA',now(),now())";
                $dbh2->do($sql);
                $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_desecho1_fie,'FIE','CA',now(),now())";
                $dbh2->do($sql);
            }				
            $count++;
      }
      if($count>0 && $i8_periodo<201301){
             $valor_cargo_caess     = 0.33;
             $c16_tarifa_id          = "TSINMSEFNNAMF001";
             $c16_mandamiento_id     = "CAESS";
             $c2_tipo_mandamiento_id = "DE";
             $v64_cargo_agencia      = "AMT";
             $v64_cargo_sucursal     = "CAS";
             $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,c16_mandamiento_id,c2_tipo_mandamiento_id,v64_cargo_agencia,v64_cargo_sucursal,ts_in,ts_update) values($i8_inmueble_id,'TSINMSEF','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_cargo_caess,'VAL','$c16_mandamiento_id','$c2_tipo_mandamiento_id','$v64_cargo_agencia','$v64_cargo_sucursal',now(),now())";
             if ( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
             $sql="insert into sdd_inmueble_estados_mensuales (i8_inmueble_id,i8_periodo,i4_dias_mora,c16_tarifa_id,d82_val,d82_fie,d82_int,d82_mul) values ($i8_inmueble_id,$i8_periodo,0,'$c16_tarifa_id',$valor_cargo_caess,0,0,0)";
             if( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga')}
      }            
            $total_tasas      = $valor_aseo+$valor_aseo1+$valor_alumbrado+$valor_barrido+$valor_calle+$valor_calle1+$valor_desecho+$valor_desecho1;
            $total_fiesta     = $valor_aseo_fie+$valor_aseo1_fie+$valor_alumbrado_fie+$valor_barrido_fie+$valor_calle_fie+$valor_calle1_fie+$valor_desecho_fie+$valor_desecho1_fie;
            $valor_aseo       = ($valor_aseo+$valor_aseo1)*100;
            $valor_alumbrado  = ($valor_alumbrado)*100;
            $valor_barrido    = ($valor_barrido)*100;
            $valor_desecho    = ($valor_desecho+$valor_desecho1)*100;
            $valor_calle      = ($valor_calle+$valor_calle1)*100;
            $total_fiesta     = ($total_fiesta)*100;

						$c16_medidor      = Lzero($c16_medidor,10);
            $i8_nic_id        = Lzero($i8_nic_id,7);						
            $valor_aseo       = Lzero($valor_aseo,6);            
            $valor_alumbrado  = Lzero($valor_alumbrado,6);
            $valor_barrido    = Lzero($valor_barrido,6);            
            $valor_desecho    = Lzero($valor_desecho,6);
            $valor_calle      = Lzero($valor_calle,6);
            $total_fiesta     = Lzero($total_fiesta,6);

            $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_calle.$valor_barrido.$total_fiesta."         ".$actualizacion;
                  #if($i8_nic_id eq "2164024"){print "$registro";}
                  print file_carga $registro;
                  print file_carga "\n";
            }
      }
      #print "Proceso terminado";
      close(file_carga);
}
sub construct_page{
    open (DATA, "$PATH$FILE");
    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>";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub get_cuotas_pendientes');
    while (my @row = $sth->fetchrow_array) {
        $str++;
    }
    return $str;
}
sub get_inicios {
    my %hash = ();
    my $sql = "SELECT i8_inmueble_id,c8_tributo_id,dt_cargo_desde,dt_cargo_hasta FROM sdd_inmueble_cargo_inicios";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub get_tarifas');
    while (my @row = $sth->fetchrow_array) {
          $hash{$id}{$row[1]} = [@row];
    }
    return %hash;      
}
sub get_tarifas {
    my %tari  = ();
      my $sql = "SELECT c16_tarifa_id,c8_tributo_id,c1_tipo_tarifa_id,c2_codigo_id,c1_frecuencia_tarifa_id,c1_composicion_tarifa_id,d82_tarifa,dt_desde
                 FROM sdm_tarifas
                 WHERE c16_tarifa_id IN ( SELECT MAX(c16_tarifa_id) FROM  sdm_tarifas  group by c8_tributo_id,c1_tipo_tarifa_id,c2_codigo_id)";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub get_tarifas');
    while (my @row = $sth->fetchrow_array) {
          $tari{$row[1]}{$row[2]}{$row[3]}{$row[4]}{$row[5]} = [@row];
    }
    return %tari;
}
sub get_tarifas_detalles {
    my %tarid  = ();
    my $sql	 = "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";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub get_tarifas');
    while (my @row = $sth->fetchrow_array) {
          $tarid{$row[0]}{$row[3]} = [@row];
    }      
    return %tarid;
}
sub get_accesorios {
    my %acce	= ();
    my $sql = "SELECT c8_tributo_id,c8_accesorio_id,dt_desde,dt_hasta FROM sdd_tributo_accesorios";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub get_tarifas');
    while (my @row = $sth->fetchrow_array) {
          $acce{$row[0]}{$row[1]}=[@row];
    }
    return %acce;
}
sub get_servicios {
    my %serv = ();
    my $sql = "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' and c8_tributo_id!='TSINMSEF' ORDER BY 1,2,3";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub get_tarifas');
    while (my @row = $sth->fetchrow_array) {
        $serv{$row[0]}{$row[1]}{$row[2]} = [@row];
    }
    return %serv;
}
sub get_bases {
    my %base	 = ();
    my $sql = "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";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub get_tarifas');
    while (my @row = $sth->fetchrow_array) {
          $base{$row[0]}{$row[1]}{$row[2]} = [@row];
    }
    return %base;
}
sub get_expedientes {
    my $stream = "";
    my $sql = "SELECT i8_inmueble_id FROM sdd_inmueble_suministro_nics WHERE c8_estado='ACT' and c3_facturador_id='$c3_tipo_facturador_id' ORDER BY 1";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub get_tarifas');
    while (my @row = $sth->fetchrow_array) {
        $stream .= $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 $ini_desde = $servicios{$id}{$k}{$kk}[5];
                  my $ini_hasta = $servicios{$id}{$k}{$kk}[6];
                  if ($inicios{$id}{$kk}[2]) {$ini_desde = $inicios{$id}{$kk}[2]}
                  if ($inicios{$id}{$kk}[3]) {$ini_hasta = $inicios{$id}{$kk}[3]}                  
                  if ($inicios{$id}{$kk}[2]<='$dt_actual' && $inicios{$id}{$kk}[3]>='$dt_actual') {
                        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'} = round($base_imponible,2); 
                        $cargo{$id}{$tar_cod}{'FIE'} = get_fiesta($tar_cod,$base_imponible);
                        #print $cargo{$id}{$tar_cod}{'FIE'}."<br>";
                  }
            }
      }      
      return %cargo;
}
sub get_abonos {
    my ($id)  = @_;
    my %abono	= ();
    my $sql = "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'";
    my $sth = $dbh->prepare($sql);
    $sth->execute or die SQL_fail($sql,$dbh,'sub get_tarifas');
    while (my @row = $sth->fetchrow_array) {
          $abono{$id}{$row[1]}{$row[3]} += $row[2];
    }
    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}}
          }
    }      
    return %bal;     
}
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,c3_tipo_facturador_id";
    foreach $kk (sort keys %{$balance{$id}}){
          my $val   = $balance{$id}{$kk}{'VAL'};
          my $fie   = $balance{$id}{$kk}{'FIE'};
          if($val>0){
                my $sql = "INSERT INTO $table ($insert_fields) VALUES ('$id','$i8_periodo','$kk',$val,$fie,0,0,'$c3_tipo_facturador_id')";
                #print "$sql <br>";
                $dbh->do($sql);
          }
    }
}
sub insert_pendiente_into_database {
    my ($id,$val,$fie)          = @_;
    my $table		= "sdd_inmueble_cargas";
    my $insert_fields	= "i8_inmueble_id,i8_periodo,c16_tarifa_id,d82_val,d82_fie,d82_int,d82_mul,c3_tipo_facturador_id";    
    my $sql = "INSERT INTO $table ($insert_fields) VALUES ('$id','$i8_periodo','TSINMCUPNNAEF001',$val,$fie,0,0,'$c3_tipo_facturador_id')";
    print "$sql <br>";
    $dbh->do($sql);
}
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#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];
                  $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   =  round(($resultado - int($resultado)),$digitos);
                              if ($decimal>.00){$entero++}
                              $val_trib += $valor+($entero*$excendente);
                        }else{
                              $val_trib += $valor;
                        }
                  }
            }
      }
      $val_trib = round($val_trib,$digitos);
      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;
    if($i8_periodo>=$desde && $i8_periodo<=$hasta){
         $fiesta = round(($base_imponible*0.07),$digitos);
    }
    #print "$i8_periodo<>$desde<>$hasta<>$base_imponible*0.05<br>";
    return $fiesta;
}
#AUXILIAR-SUBROUTINES
sub get_app_data {
    my $schema   = "app.data.xml";
    my $xml      = new XML::Simple;
    my $data 	  = $xml->XMLin("../xml/".$schema);
    $appid	  = $data->{portal}->{app};
    $lan	  = $data->{portal}->{lang};
}
sub SQL_fail {
    my ($query,$dbh,$section)= @_;
    print "SQL failed in Section $section<br>";
    print "Query: ".$query."<br>";    
    exit;
}
sub connect_fail {
    my ($DSN)=@_;
    print "Error connecting to $DSN<br>";
    print "Error:".Win32::ODBC::Error()."<br>";
    exit;
}
sub Lzero {
    my ( $input, $padToLen ) = @_;
    substr( ( '0' x $padToLen ) . $input , -$padToLen );
}
sub round {
    my ($n, $places) = @_;
    my $abs = abs $n;
    my $val = substr($abs + ('0.' . '0' x $places . '5'),0,length(int($abs)) +(($places > 0) ? $places + 1 : 0));
    ($n < 0) ? "-" . $val : $val;
}
sub get_fecha_actual {
    my $sql = "SELECT DATE_FORMAT(CURRENT_DATE,'%Y-%m-%d')";
	my $sth = $dbh->prepare($sql);
	$sth->execute or die SQL_fail($sql,$dbh,'sub get_fecha_actual');
	if (my @row = $sth->fetchrow_array) {
		return ($row[0]);
	}else{
		return (0)
	}
}
#-------------------------------------------------------------------------