#!/perl/bin/perl.exe
$|=1;
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#Perl Modules
use CGI;
use Win32::ODBC;
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#HTML printing activation
print "Content-type: text/html\n\n";
#-------------------------------------------------------------------
#-------------------------------------------------------------------
#Getting parameters
$form		= new CGI;
$lan		= $form->param('lan');
$appid		= $form->param('appid');
$dt_desde	= $form->param('dt_desde');
$dt_hasta	= $form->param('dt_hasta');
#------------------------------------------------------------------
#------------------------------------------------------------------
#Define subdirectories and general variables
get_variables();
#-------------------------------------------------------------------
#-------------------------------------------------------------------
# Open Data Base Connections
if (!($db = new Win32::ODBC($appid))){connection_fail('$appid')}
#-------------------------------------------------------------------
#-------------------------------------------------------------------
# MAIN-PROGRAM
$periodo_actual	   = get_periodo_actual();
%recibos 	   = get_recibos();
%tarifas_cuentas   = get_tarifas_cuentas();
%cuentas_contables = get_cuentas_contables();
%partida	   = get_debe_haber();
$table		   = construct_table();
construct_page();
exit;
#-------------------------------------------------------------------
#MAIN-SUBROUTINES
sub get_recibos {
	my %rec = ();
	my $i   = 1;
	my $sql = "SELECT b.c16_recibo_id,
			  b.c16_tarifa_id,
			  b.v128_tarifa,
			  b.d82_cantidad,
			  b.d82_tarifa,
			  b.txt_periodos,
			  a.dt_emision
		   FROM sdm_recibos a, sdd_recibos b
		   WHERE a.`c16_recibo_id`=b.`c16_recibo_id` and
		   a.`dt_emision`>='$dt_desde' and a.`dt_emision`<='$dt_hasta' and b.d82_tarifa>0";
	if ( $db->Sql($sql) ){SQL_fail($db,$sql,'sub get_recibos')};
	while($db->FetchRow()){
		undef my @row;
		@row   = $db->Data();
		$rec{$row[0]}{$row[1]."_".$i}=[@row];
		$i++;
	}
	return %rec;
}
sub get_tarifas_cuentas{
	my %tc  = ();	
	foreach my $k(sort keys %recibos){
		foreach my $kk(sort keys %{$recibos{$k}}){
			my @tid = split(/\_/,$kk);
			my $sql = "SELECT c16_cuenta_recurso_id,
					  c16_cuenta_obligacion_id,
					  c16_cuenta_recurso_pasado_id,
					  c16_cuenta_obligacion_pasado_id,
					  c16_cuenta_recurso_futuro_id,
					  c16_cuenta_obligacion_futuro_id
				   FROM sdm_tarifas
				   WHERE c16_tarifa_id='$tid[0]'";
			if ($db->Sql($sql) ){SQL_fail($db,$sql,'sub get_tarifa_cuentas')};
			while ($db->FetchRow()){
				undef my @row;
				@row   = $db->Data();
				$tc{$k}{$tid[0]}= join('|',@row);;
			}		
		}
	}
	return %tc;
}
sub get_cuentas_contables {
	my %cc = ();
	foreach my $k(sort keys %tarifas_cuentas){
		foreach my $kk(sort keys %{$tarifas_cuentas{$k}}){
			my @tcc = split(/\|/,$tarifas_cuentas{$k}{$kk});
			for (my $i=0;$i<=$#tcc;$i++){			
				my $sql = "SELECT v128_cuenta_contable
					   FROM sdm_cuentas_contables
					   WHERE c16_cuenta_contable_id='$tcc[$i]'";
				if ($db->Sql($sql) ){SQL_fail($db,$sql,'sub get_cuentas_contables')};
				while ($db->FetchRow()){
					undef my @row;
					@row   = $db->Data();
					$cc{$tcc[$i]}=$row[0];
				}
			}
		}
	}
	return %cc;
}
sub get_debe_haber{
	my %debe_haber = ();
	#my %debe_haber1= ();
	foreach my $k(sort keys %recibos){
		foreach my $kk(sort keys %{$recibos{$k}}){
			my @tid = split(/\_/,$kk);			
			my @tcc = split(/\|/,$tarifas_cuentas{$k}{$tid[0]});			
			$recibos{$k}{$kk}[5] =~ s/\ //g;
			$recibos{$k}{$kk}[6] =~ s/\-//g;			
			if($recibos{$k}{$kk}[5] ne ""){
				my @periodos = split(/\~/,$recibos{$k}{$kk}[5]);
				for (my $i=0;$i<=$#periodos;$i++){
					my @periodo_data  = split(/\,/,$periodos[$i]);
					my $ano_periodo   = substr($periodo_data[0],0,4); 
					#my $ano_actual    = substr($periodo_actual,0,4);
					my $ano_actual    = substr($recibos{$k}{$kk}[6],0,4);
					if($ano_periodo == $ano_actual){
						$debe_haber{'recurso'}{$tcc[0]} += $periodo_data[3];
						#$debe_haber1{'recurso'}{substr($tcc[0],0,8)} += $periodo_data[3];						
						$debe_haber{'obligacion'}{$tcc[1]} += $periodo_data[3];
					}
					if($ano_periodo < $ano_actual){
						if($tcc[2] ne "" && $tcc[3] ne ""){
							$debe_haber{'recurso_pasado'}{$tcc[2]} += $periodo_data[3];
							$debe_haber{'obligacion_pasado'}{$tcc[3]} += $periodo_data[3];
							
						}else{
							$debe_haber{'recurso'}{$tcc[0]} += $periodo_data[3];
							$debe_haber{'obligacion'}{$tcc[1]} += $periodo_data[3];
						}
					}
					if($ano_periodo > $ano_actual){
						if($tcc[4] ne "" && $tcc[5] ne ""){
							$debe_haber{'recurso_futuro'}{$tcc[4]} += $periodo_data[3];
							$debe_haber{'obligacion_futuro'}{$tcc[5]} += $periodo_data[3];
						}else{
							$debe_haber{'recurso'}{$tcc[0]} += $periodo_data[3];
							$debe_haber{'obligacion'}{$tcc[1]} += $periodo_data[3];
						}
					}		
				}
			}else{
				$debe_haber{'recurso'}{$tcc[0]} += ($recibos{$k}{$kk}[3]*$recibos{$k}{$kk}[4]);
				$debe_haber{'obligacion'}{$tcc[1]} += ($recibos{$k}{$kk}[3]*$recibos{$k}{$kk}[4]);
			print "$debe_haber";
			}
		}
	}	
	return %debe_haber;
}
sub construct_table {
	my $tbr    = "";
	my $tbr1    = "";
	my $debe   = 0;
	my $debe2   = 0;
	my $debe3   = 0;
	my $debe1   = 0;
	my $haber1   = 0;
	my $haber  = 0;
	my $cols   = "<TR><TD>{cuenta}</TD><TD>{descripcion}</TD><TD class=my_style2>{debe}</TD><TD class=my_style2>{haber}</TD></TR>\n";
	#my $colsr   = "<TR><TD>&nbsp;&nbsp;{cuenta}</TD><TD>{descripcion}</TD><TD class=my_style2>{debe}</TD><TD class=my_style2>{haber}</TD></TR>\n";
	my $cols_p = "<TR><TD>&nbsp;&nbsp;&nbsp;&nbsp;{cuenta}</TD><TD>{descripcion}</TD><TD class=my_style2>{debe}</TD><TD class=my_style2>{haber}</TD></TR>\n";
	my $cols_f = "<TR><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{cuenta}</TD><TD>{descripcion}</TD><TD class=my_style2>{debe}</TD><TD class=my_style2>{haber}</TD></TR>\n";	
	#print "RECURSO<br>";
	foreach $kk (sort keys %{$partida{'recurso'}}){
		$val  = sprintf("%.2f",$partida{'recurso'}{$kk});
		$tbr .= $cols;
		$tbr  =~ s/\{cuenta}/$kk/g;
		$tbr  =~ s/\{descripcion}/$cuentas_contables{$kk}/g;
		$tbr  =~ s/\{debe}/$val/g;
		$tbr  =~ s/\{haber}//g;
		$debe += $val;       000000000000000
	}
	#print "OBLIGACION<br>";		
	foreach $kk (sort keys %{$partida{'obligacion'}}){
		$val  = sprintf("%.2f",$partida{'obligacion'}{$kk});
		$tbr .= $cols;
		$tbr  =~ s/\{cuenta}/$kk/g;
		$tbr  =~ s/\{descripcion}/$cuentas_contables{$kk}/g;
		$tbr  =~ s/\{haber}/$val/g;
		$tbr  =~ s/\{debe}//g;
		$haber += $val;
	}
	#print "RECURSO PASADO<br>";		
	foreach $kk (sort keys %{$partida{'recurso_pasado'}}){
		$val  = sprintf("%.2f",$partida{'recurso_pasado'}{$kk});
		$tbr .= $cols_p;
		$tbr  =~ s/\{cuenta}/$kk/g;
		$tbr  =~ s/\{descripcion}/$cuentas_contables{$kk}/g;
		$tbr  =~ s/\{debe}/$val/g;
		$tbr  =~ s/\{haber}//g;
		$debe += $val;
	}
	#print "OBLIGACION PASADO<br>";		
	foreach $kk (sort keys %{$partida{'obligacion_pasado'}}){
		$val  = sprintf("%.2f",$partida{'obligacion_pasado'}{$kk});
		$tbr .= $cols_p;
		$tbr  =~ s/\{cuenta}/$kk/g;
		$tbr  =~ s/\{descripcion}/$cuentas_contables{$kk}/g;
		$tbr  =~ s/\{haber}/$val/g;
		$tbr  =~ s/\{debe}//g;
		$haber += $val;
	}
	#print "RECURSO FUTURO<br>";		
	foreach $kk (sort keys %{$partida{'recurso_futuro'}}){
		$val  = sprintf("%.2f",$partida{'recurso_futuro'}{$kk});
		$tbr .= $cols_f;
		$tbr  =~ s/\{cuenta}/$kk/g;
		$tbr  =~ s/\{descripcion}/$cuentas_contables{$kk}/g;
		#CAMBIO DE DEBE POR HABER POR CAJA EN REPORTE
		$tbr  =~ s/\{debe}//g;
		$tbr  =~ s/\{haber}/$val/g;
		$haber += $val;
	}
	#print "OBLIGACION FUTURO<br>";		
	foreach $kk (sort keys %{$partida{'obligacion_futuro'}}){
		$val  = sprintf("%.2f",$partida{'obligacion_futuro'}{$kk});
		$tbr .= $cols_f;
		$tbr  =~ s/\{cuenta}/$kk/g;
		$tbr  =~ s/\{descripcion}/$cuentas_contables{$kk}/g;
		#CAMBIO DE DEBE POR HABER POR CAJA EN REPORTE
		$tbr  =~ s/\{haber}//g;
		$tbr  =~ s/\{debe}/$val/g;
		$debe += $val;
		$debe2 += $val;
	        
	}
	$debe3 = $debe - $debe2;
	$tbr .= "<TR><TD>21101001</TD><TD>CAJA GENERAL</TD><TD  class=my_style2 align=right>$debe3</TD><TD align=right></TD>";
	#$debe +=$debe;
	$debe +=$debe - $debe2;
	#print "RECURSO HABER<br>";		
	foreach $kk (sort keys %{$partida{'recurso'}}){
		$val  = sprintf("%.2f",$partida{'recurso'}{$kk});
		$tbr .= $cols;
		$tbr  =~ s/\{cuenta}/$kk/g;
		$tbr  =~ s/\{descripcion}/$cuentas_contables{$kk}/g;
		$tbr  =~ s/\{debe}//g;
		$tbr  =~ s/\{haber}/$val/g;
		$haber += $val;
	}
	#print "RECURSO PASADO HABER<br>";		
	foreach $kk (sort keys %{$partida{'recurso_pasado'}}){
		$val  = sprintf("%.2f",$partida{'recurso_pasado'}{$kk});
		$tbr .= $cols;
		$tbr  =~ s/\{cuenta}/$kk/g;
		$tbr  =~ s/\{descripcion}/$cuentas_contables{$kk}/g;
		$tbr  =~ s/\{debe}//g;
		$tbr  =~ s/\{haber}/$val/g;
		$haber += $val;
	}
	#print "RECURSO FUTURO HABER<br>";
	#no es necesario volver a cargarlas las cuentas de futuro contra caja
	#foreach $kk (sort keys %{$partida{'recurso_futuro'}}){
		#$val  = sprintf("%.2f",$partida{'recurso_futuro'}{$kk});
		#$tbr .= $cols;
		#$tbr  =~ s/\{cuenta}/$kk/g;
		#$tbr  =~ s/\{descripcion}/$cuentas_contables{$kk}/g;
		#$tbr  =~ s/\{debe}//g;
		#$tbr  =~ s/\{haber}/$val/g;
		#$haber += $val;
	#}	
	$tbr .= "<TR class=my_style3><TD></TD><TD align=right>TOTAL</TD><TD align=right>$debe</TD><TD align=right>$haber</TD></TR>";
	return $tbr;
}
sub construct_page {
	open (DATA, "$PATH$file");
	while ($line = <DATA>) {	
		$line =~ s/\{lan}/$lan/g;
		$line =~ s/\{appid}/$appid/g;
		$line =~ s/\{template_rows_total}/$table/g;
		$line =~ s/\{dt_desde}/$dt_desde/g;
		$line =~ s/\{dt_hasta}/$dt_hasta/g;
		print "$line";
	}
}
#--------------------------------------------------------------------
#AUXILIAR-SUBROUTINES
sub SQL_fail {
    my ($dbh,$query,$section)= @_;
    print "SQL failed in Section $section<br>";
    print "Query: ".$query."<br>";    
    print "Error: ".$dbh->Error()."\n<br>";
    $dbh->Close();
    exit;
}
sub connect_fail {
    my ($DSN)=@_;
    print "Error connecting to $DSN<br>";
    print "Error:".Win32::ODBC::Error()."<br>";
    exit;
}
sub get_variables{
	$PATH = "../".$lan."/";
	$file = $lan."_generar_partida_contable_ingresos.html";
}
sub get_periodo_actual {
      my $query= "SELECT DATE_FORMAT(CURRENT_DATE,'%Y%m')";
      if ($db->Sql($query)){SQL_fail($db,$query,'sub get_periodo_actual')};
      if ($db->FetchRow()){undef my @row; @row=$db->Data();return ($row[0])}else{return (0)}
}
#--------------------------------------------------------------------
