#!/perl/bin/perl.exe
$|=1;
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# Author:Rodolfo Machon
# Company:WebSoft, SA de CV 
# Nombre del archivo: generar_partida_contable_ingresos_general.pl
# Created: 2014-08-31
# Updates: 2014-08-31,2023-03-21
# Copyright - All Rights Reserved
#------------------------------------------------------------------------- 
#-------------------------------------------------------------------------
# PERL MODULES
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use DBI;
use JSON;
use Date::Calc qw(Add_Delta_YMD);
use XML::Simple;
use Data::Dumper;
binmode STDOUT, ":encoding(utf8)";
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# HTML PRINTING ACTIVATION
print "Content-type: text/html; charset=utf-8\n\n";
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
#Getting parameters
$form		= new CGI;
$dt_desde	= $form->param('dt_desde');
$dt_hasta	= $form->param('dt_hasta');
#-------------------------------------------------------------------------
#-------------------------------------------------------------------------
# GET CLASE SCHEMA AND VARIABLES
get_app_data();
#------------------------------------------------------------------------- 
#-------------------------------------------------------------------------
# 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;
#------------------------------------------------------------------------- 
#-------------------------------------------------------------------------
# MAIN-PROGRAM
#$periodo_actual		= get_periodo_actual();
%recibos			= get_recibos();
%tarifas_cuentas	= get_tarifas_cuentas();
%cuentas_contables	= get_cuentas_contables();
%partida			= get_debe_haber1();
$table				= construct_table();
construct_page();
exit;
#------------------------------------------------------------------------- 
#-------------------------------------------------------------------------
#MAIN-SUBROUTINES
sub get_periodo_actual {
      my $sql= "SELECT DATE_FORMAT(CURRENT_DATE,'%Y%m')";
	my $sth = $dbh->prepare($sql);
	$sth->execute or die SQL_fail($sql,$dbh,'sub get_periodo_actual');
	if (my @row = $sth->fetchrow_array) {
		return ($row[0])
	}else{
		return (0);
	}
}
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
		   INNER JOIN sdd_recibos b ON a.`c16_recibo_id`=b.`c16_recibo_id`
		   WHERE  a.`dt_emision`>='$dt_desde' and a.`dt_emision`<='$dt_hasta' and b.d82_tarifa>0";
	my $sth = $dbh->prepare($sql);
	$sth->execute or die SQL_fail($sql,$dbh,'sub get_recibos');
	while (my @row = $sth->fetchrow_array) {
		$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 substr(c16_cuenta_recurso_id,1,8),
					  substr(c16_cuenta_obligacion_id,1,8),
					  substr(c16_cuenta_recurso_pasado_id,1,8),
					  substr(c16_cuenta_obligacion_pasado_id,1,8),
					  substr(c16_cuenta_recurso_futuro_id,1,8),
					  substr(c16_cuenta_obligacion_futuro_id,1,8)
				   FROM sdm_tarifas
				   WHERE c16_tarifa_id='$tid[0]'";
			my $sth = $dbh->prepare($sql);
			$sth->execute or die SQL_fail($sql,$dbh,'sub get_tarifas_cuentas');
			if (my @row = $sth->fetchrow_array) {
				$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 $tcc = substr($tcc[0],1,8);
				my $sql =  "SELECT v128_cuenta_contable
							FROM sdm_cuentas_contables
							WHERE c16_cuenta_contable_id='$tcc[$i]'";
				my $sth = $dbh->prepare($sql);
				$sth->execute or die SQL_fail($sql,$dbh,'sub get_cuentas_contables');
				while (my @row = $sth->fetchrow_array) {
					$cc{$tcc[$i]}=$row[0];
				}
			}
		}
	}
	return %cc;
}
sub get_debe_haber1{
	my %debe_haber1= ();
	foreach my $k(sort keys %recibos){
	  #if($k eq "002467"){
		
		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_haber1{'recurso'}{substr($tcc[0],0,8)} += $periodo_data[3];
						$debe_haber1{'obligacion'}{substr($tcc[1],0,8)} += $periodo_data[3];
					}
					if($ano_periodo < $ano_actual){
						if($tcc[2] ne "" && $tcc[3] ne ""){
							$debe_haber1{'recurso_pasado'}{substr($tcc[2],0,8)} += $periodo_data[3];
							$debe_haber1{'obligacion_pasado'}{substr($tcc[3],0,8)} += $periodo_data[3];
						}else{
							$debe_haber1{'recurso'}{substr($tcc[0],0,8)} += $periodo_data[3];
							$debe_haber1{'obligacion'}{substr($tcc[1],0,8)} += $periodo_data[3];
						}
					}
					if($ano_periodo > $ano_actual){
						if($tcc[4] ne "" && $tcc[5] ne ""){
							$debe_haber1{'recurso_futuro'}{substr($tcc[4],0,8)} += $periodo_data[3];
							$debe_haber1{'obligacion_futuro'}{substr($tcc[5],0,8)} += $periodo_data[3];
						}else{
							$debe_haber{'recurso'}{substr($tcc[0],0,8)} += $periodo_data[3];
							$debe_haber{'obligacion'}{substr($tcc[1],0,8)}+= $periodo_data[3];
						}
					}
					#if(substr($tcc[0],0,8) eq "21314001" ){print "$k,$kk,$tcc[0],".$periodo_data[3].",".$debe_haber1{'recurso'}{substr($tcc[0],0,8)}."<br>";}
				}
			}else{
				$debe_haber1{'recurso'}{substr($tcc[0],0,8)} += round(($recibos{$k}{$kk}[3]*$recibos{$k}{$kk}[4]),2);
				$debe_haber1{'obligacion'}{substr($tcc[1],0,8)} += round(($recibos{$k}{$kk}[3]*$recibos{$k}{$kk}[4]),2);
				#if(substr($tcc[0],0,8) eq "21314001" ){print "$k,$kk,$tcc[0],".round(($recibos{$k}{$kk}[3]*$recibos{$k}{$kk}[4]),2).",".$debe_haber1{'recurso'}{substr($tcc[0],0,8)}."<br>";}
			}
		}
	  #}
	}	
	return %debe_haber1;
}
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 align=right>{debe}</TD><TD align=right>{haber}</TD></TR>\n";
	my $cols_p = "<TR><TD>&nbsp;&nbsp;&nbsp;&nbsp;{cuenta}</TD><TD>{descripcion}</TD><TD align=right>{debe}</TD><TD align=right>{haber}</TD></TR>\n";
	my $cols_f = "<TR><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{cuenta}</TD><TD>{descripcion}</TD><TD align=right>{debe}</TD><TD align=right>{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;
	}
	#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  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><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/\{city}/$city/g;
		$line =~ s/\{state}/$state/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 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};
	$city      	= $data->{portal}->{city};
	$state     	= $data->{portal}->{state};	
	$PATH = "../".$lan."/";
	$file = $lan."_generar_partida_contable_ingresos.html";
}
sub SQL_fail {
    my ($dbh,$query,$section)= @_;
    print "SQL failed in Section $section<br>";
    print "Query: ".$query."<br>";    
    exit;
}
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;
}
#--------------------------------------------------------------------
