#!/perl/bin/perl.exe
$|=1;
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# Information Software SA
# Date In: 2011-10-22
# Updates: 2011-10-22;2013-11-20 
# Author:Rodolfo Machon
# File Name: generar_carga_mensual_delsur_herradura.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');
$c3_tipo_facturador_id  = $cgiparms->param('c3_tipo_facturador_id');
$fecha                  = $cgiparms->param('fecha');
#-------------------------------------------------------------------------
#$lan        = "es";
#$appid      = "RTM_v36";
#$clase      = "inmueble";
$i8_periodo = "202401";
#$fecha      = "2011-05-01";
#-------------------------------------------------------------------------
# CHECK PARAMETERS

#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# GET CLASE SCHEMA
get_app_data();
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# GLBAL VARIABLES
$PATH 	= "../".$lan."/";
$FILE   = $lan."_carga_generada".".html";
$dir    = "../archivos_carga_delsur/";
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# 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;
$dbh1->{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;
$dbh2->{LongTruncOk} = 1;
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# MAIN-PROGRAM
$year       = substr($i8_periodo,0,4);
$month      = substr($i8_periodo,4,2);
$day        = "30";
$dt_actual  = $year."-".$month."-".$day;
$fecha = get_fecha_actual();
$fecha1 = get_fecha_actual1();
delete_balance_from_database();
generar_estado_mes();
generar_carga();
construct_page();
exit;
#------------------------------------------------------------------------- 
#-------------------------------------------------------------------------
#SUB-ROUTINES -> LEVEL 1
sub delete_balance_from_database {
    my $sql    = "DELETE FROM sdd_inmueble_cargas WHERE i8_periodo='$i8_periodo' and c3_tipo_facturador_id='DEL'";
    #print $sql."<br>";
	$dbh->do($sql);
}
sub generar_estado_mes {
    %inicios    = get_inicios();
    %tarifas 	= get_tarifas();
    %tarifas_d  = get_tarifas_detalles();
    %accesorios = get_accesorios();
    %servicios  = get_servicios();
    %bases	    = get_bases();
    @expedientes= get_expedientes();
    #@expedientes = ('1000012');
    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);
    }
    return;
}
sub generar_carga {
    my $encabezado = "COD_ALC,MEDI,CTA_AL,ALUM_AL,ASEO_AL,ESTADO,FEC_ACT,NIS_RAD,DISPO_FINA,IMP_ALC4,IMP_ALC5,IMP_ALC6,IMP_ALC7,IMP_ALC8,IMP_ALC9,IMP_ALC10,COMENTA1,COMENTA2,IMP_ALC11,IMP_ALC12,IMP_ALC13,IMP_ALC14,IMP_ALC15,IMP_ALC16,IMP_ALC17,IMP_ALC18,IMP_ALC19,IMP_ALC20";

    my $query="delete from sdd_inmueble_cargos where i8_periodo='$i8_periodo' and (c2_tipo_mandamiento_id='DS' or c2_tipo_mandamiento_id='DE')";
	$dbh->do($query);

    $file=$dir.$i8_periodo.".csv";
    open("file_carga",">".$file);
    print file_carga $encabezado;
    print file_carga "\n";      
    $sql="select i8_inmueble_id,i8_nis_id,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";
    #print "$sql <br>";
    my $sth = $dbh->prepare($sql);
	$sth->execute or die SQL_fail($sql,$dbh,'sub get_sectores');
	while (my @row = $sth->fetchrow_array) {
            $i8_inmueble_id         = $row[0];
            $i8_nis_id              = $row[1];
            $c16_medidor            = $row[2];
           
            $count                  = 0;
            $cod_alc                = 'A010';
            $valor_aseo             = 0;
            $valor_aseo2            = 0;
            $valor_aseo3            = 0;
            $valor_alumbrado        = 0;
            $valor_alumbrado2       = 0;
            $valor_alumbrado3       = 0;
            $valor_barrido          = 0;            
            $valor_calle            = 0;
            $valor_calle1           = 0;
            $valor_desecho          = 0;
            $valor_desecho1         = 0;
            $total_fiesta           = 0;

            $valor_aseo_fie         = 0;
            $valor_aseo2_fie        = 0;
            $valor_aseo3_fie        = 0;
            $valor_alumbrado_fie    = 0;
            $valor_alumbrado2_fie   = 0;
            $valor_alumbrado3_fie   = 0;
            $valor_barrido_fie      = 0;            
            $valor_calle_fie        = 0;
            $valor_calle1_fie       = 0;
            $valor_desecho_fie      = 0;
            $valor_desecho1_fie     = 0;
            $valor_cargo_delsur     = 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 get_cargos');
            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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMASE','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_aseo,'VAL','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMASE','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_aseo_fie,'FIE','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMASE','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_aseo1,'VAL','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMASE','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_aseo1_fie,'FIE','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMALU','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_alumbrado,'VAL','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMALU','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_alumbrado_fie,'FIE','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMBAR','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_barrido,'VAL','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMBAR','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_barrido_fie,'FIE','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMCAL','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_calle,'VAL','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMCAL','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_calle_fie,'FIE','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMCAL','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_calle1,'VAL','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMCAL','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_calle1_fie,'FIE','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMDES','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_desecho,'VAL','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMDES','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_desecho_fie,'FIE','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMDES','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_desecho1,'VAL','CARGA','DS',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,c16_mandamiento_id,c2_tipo_mandamiento_id,ts_in,ts_update) values($i8_inmueble_id,'TSINMDES','$c16_tarifa_id',$i8_periodo,'$fecha',$valor_desecho1_fie,'FIE','CARGA','DS',now(),now())";
                        if( $dbh2->Sql($sql) ) {SQLfail($sql,$dbh2,'generar carga7')}
                  }
                  $count++;
            }

            $total_fiesta         = round(($valor_aseo_fie+$valor_alumbrado_fie+$valor_desecho_fie+$valor_calle_fie+ $valor_barrido_fie),2); 
            $valor_total          = ($valor_aseo+$valor_alumbrado+$valor_desecho+$valor_calle)*1;
            if($i8_inmueble_id eq "1000012"){print "$valor_barrido <br>";}
            if($c16_medidor eq ""){$c16_medidor ="00000";}
            $espacio_blanco = "";
            $cero           = 0.00;       
            if($valor_total>0){
                  $registro = $cod_alc.",".$espacio_blanco.",".$i8_inmueble_id.",".$valor_alumbrado.",".$valor_aseo.",".$espacio_blanco.",".$fecha1.",".$i8_nis_id.",".$valor_desecho.",".$valor_calle.",".$cero.",".$total_fiesta.",".$cero.",".$cero.",".$valor_barrido.",".$cero.",".$espacio_blanco.",".$espacio_blanco.",".$cero.",".$cero.",".$cero.",".$cero.",".$cero.",".$cero.",".$cero.",".$cero.",".$cero.",".$cero;
                  print file_carga $registro;
                  print file_carga "\n";
            }
      }
      #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_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)";
      #print "$sql <br>";
      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_detalles');
	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_accesorios');
	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_servicios');
	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";
      #print "Yo > $query <br>";
      my $sth = $dbh->prepare($sql);
	$sth->execute or die SQL_fail($sql,$dbh,'sub get_bases');
	while (my @row = $sth->fetchrow_array) {
            #print "$row[0] > $row[1] > $row[2] > $row[3] <br>";
            $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_expedientes');
	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 "$id >$k > $kk > $tip > $cod > $tar_cod > $base_imponible > $cargo{$id}{$tar_cod}{'FIE'} > $cargo{$id}{$tar_cod}{'VAL'} <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_abonos');
	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 $query = "INSERT INTO $table ($insert_fields) VALUES ('$id','$i8_periodo','$kk',$val,$fie,0,0,'$c3_tipo_facturador_id')";
                  #print "$query<br>";
			$dbh->do($query);
            }
      }
}
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#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}}){
            #print "$k <> $tarifa <> $tarifas_d{$tarifa}{$k}[1] <br>";
            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;
                  #print "$id > $gr > $tbp > $valor > $imponible > $bases{$id}{$gr}{$tbp}[3] > $bases{$id}{$gr}{$tbp}[4] <br>";
                  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   = round(($resultado - int($resultado)),2);
                              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 = round(($base_imponible*0.07),2);
    }
    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 SQLfail {
    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 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)
	}
}
sub get_fecha_actual1 {
    my $sql = "SELECT DATE_FORMAT(DATE_ADD(CURRENT_DATE, INTERVAL 1 MONTH), '01-%m-%Y') AS siguiente_mes";
	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)
	}
}
#-------------------------------------------------------------------------