#!/usr/bin/perl -w
BEGIN { open STDERR, ">>../../../logs/error_perl.log" or die $!;
print STDERR scalar localtime;
print STDERR "\n";
}

use strict;
use Data::Dumper;
use Storable;
use Time::Local;

use CGI;
my $cgi = new CGI;
$cgi->autoEscape(undef);
use CGI::Carp qw(carpout fatalsToBrowser);

use WebHosting::Setup;
my $su = new WebHosting::Setup (
    dom => 'logvall.com',
    uid => 'l/o/g/www.logvall.com',
);



#my $js_dir = $su->{www_dir} . '/javascripts';
#my $jsref = $su->load_js($js_dir);

my $man = $ENV{REMOTE_USER};

$su->lock('on', 'decapats');

my $prog_dir = $su->{www_dir} . "/public/www/decapats";
my $data_dir = "$prog_dir/data";
my $img_dir = "$prog_dir/img";
my $baseurl = $su->{baseurl};
my ($urlname) = $baseurl =~ m!^http://(.*)!;
my $language_file = "$prog_dir/cat.txt";

my $artform = "$prog_dir/art.form";
my $artaddform = "$prog_dir/artadd.form";
my $artdelform = "$prog_dir/artdel.form";
my $artnewform = "$prog_dir/artnew.form";
my $artshowform = "$prog_dir/artshow.form";
my $artshow_cform = "$prog_dir/artshow_c.form";
my $comform = "$prog_dir/com.form";
my $decapform = "$prog_dir/decap.form";
#my $comaddform = "$prog_dir/comadd.form";
#my $doentform = "$prog_dir/doent.form";
my $entform = "$prog_dir/ent.form";
my $etiform = "$prog_dir/eti.form";
my $list1form = "$prog_dir/list1.form";
my $list2form = "$prog_dir/list2.form";
my $list3form = "$prog_dir/list3.form";
 
my $initform;
if ($man eq 'admin') {
	$initform = "$prog_dir/init.form";
}
elsif ($man eq 'personal') {
	$initform = "$prog_dir/init2.form";
}
elsif ($man eq 'client') {
	$initform = "$prog_dir/init3.form";
}

my $ef = "$prog_dir/err.form";
my $ff = "$prog_dir/ff.form";



opendir D, $data_dir or die $!;
for (grep /[\d]+$/ && ! -d, readdir D) {
	my $age = (stat("$data_dir/$_"))[9];
	my $newage = $age + 14400;
	if ($age + 86400 < time) {
		#print STDERR "Unlinking $data_dir/$_\n";
		unlink "$data_dir/$_" or die $!
	}
}

use HTML::SimpleForm;
  my $f = new HTML::SimpleForm(
    dir => $prog_dir,
    errfile => $ef,
    filterfile => $ff,
    sep => '|',
    %$su,
    );



# Import language files into hash
my $lang = $su->language($language_file);
my $int = {
	baseurl => $baseurl,
	urlname => $urlname,
	man => $man,
};

my $now = time;
$now += 3600 * 1 unless $^O eq 'MSWin32';

my ($d, $mon, $yr) = (localtime($now))[3..5];
my $today = timelocal(0,0,0,$d, $mon, $yr);

my $items_db = "$data_dir/items.db";
my $items_db2 = "$data_dir/items" . time;
my $iref;
unless( -e $items_db) {open DB, ">$items_db" or die $!; close DB}
-z $items_db ? ($iref = {}) : ($iref = retrieve $items_db);

#print STDERR "ORIG IREF\n", Dumper $iref;



my $orders_db = "$data_dir/orders.db";
my $orders_db2 = "$data_dir/orders" . time;
my $oref;
unless( -e $orders_db) {open DB, ">$orders_db" or die $!; close DB}
-z $orders_db ? ($oref = {}) : ($oref = retrieve $orders_db);
#print STDERR "ORIG OREF\n", Dumper $oref;

my $tmp_db = "$data_dir/tmp.db";
my $tmp_db2 = "$data_dir/tmp" . time;
my $tmpref;
unless( -e $tmp_db) {open DB, ">$tmp_db" or die $!; close DB}
-z $tmp_db ? ($tmpref = {}) : ($tmpref = retrieve $tmp_db);
#print STDERR "ORIG IREF\n", Dumper $tmpref;


#printf STDOUT " Pepe $man $data_dir";
#exit();


init() and $su->lock('off', 'decapats') and exit unless $cgi->param();




my $in = {};
for ($cgi->param) {
	my @ary = $cgi->param($_);
	if (@ary > 1) {
		$in->{$_} = [@ary];
	}
	else {
		$in->{$_} = $cgi->param($_)
	}
}



#print STDERR "IN\n", Dumper $in;
#$in = $f->pre_filter($in);

articles() if $in->{'articles'};
artadd() if $in->{'artadd'};
artdel() if $in->{'artdel'};
artdel_confirm() if $in->{'artdel_confirm'};
artshow() if $cgi->param('artshow');
artupdate() if $in->{'artupdate'};

comandes() if $in->{'comandes'};
comadd() if $in->{'comadd'};
comadd('update') if $in->{'comupdate'};
comfinal() if $in->{'comfinal'};



decapats() if $in->{'decapats'};
decfinal() if $in->{'decfinal'};
decshow() if $in->{'decshow'};
decupdate() if $in->{'decupdate'};

entrades() if $in->{'entrades'};
entadd() if $in->{'entadd'};
entadd('update') if $in->{'entupdate'};
entfinal() if $in->{'entfinal'};

etiquetes() if $in->{'etiquetes'};
etishow() if $in->{'etishow'};

list1() if $in->{'list1'};
list1show() if $in->{'list1show'};
list2() if $in->{'list2'};
list2show() if $in->{'list2show'};
list3() if $in->{'list3'};
list3show() if $in->{'list3show'};
$su->lock('off', 'decapats');




# ARTICLES #################################################
sub articles {
	$lang = $su->expand_vars($int);
	print
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$f->print_form($artform, $int);
} # articles


# ARTADD #################################################
sub artadd {
	my $refnum = $in->{'refnum'};
	
	unless ($refnum) {
		my $href = {'refnum' => 1};
		$lang = $su->expand_vars($int);
		$f->error($artaddform, 'NO_NUM', $int, $href);
	}
	my $desc = $in->{'desc'};
	$int->{refnum} = $refnum;
	$lang = $su->expand_vars($int);
	delete $in->{'artadd'};

	open DB2, ">$items_db2" or die $!; close DB2;	
	store $iref, $items_db2;
	$iref->{$refnum} = $in;
	
	#print STDERR Dumper $iref;
	store $iref, $items_db;
	
	print 
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$lang->{ARTADD}{msg},
	$f->print_review($artaddform, $in, $int),
	$lang->{ARTADD}{more},
  $f->print_form($artform, $int);
	
} # artadd


# ARTDEL #################################################
sub artdel {
	my $refnum = $in->{'refnum'};
	$int->{refnum} = $refnum;
		
	$lang = $su->expand_vars($int);
	print 
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$lang->{ARTDEL}{msg},
  $f->print_form($artdelform, $int);
} # artdel


# ARTDEL_CONFIRM #################################################
sub artdel_confirm {
	my $refnum = $in->{'refnum'};
	$int->{refnum} = $refnum;
	open DB2, ">$items_db2" or die $!; close DB2;	
	store $iref, $items_db2;
	delete $iref->{$refnum};
	store $iref, $items_db;
	#print STDERR Dumper $iref;
	
	$lang = $su->expand_vars($int);
	print 
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$lang->{ARTDEL_CONFIRM}{msg};
} # artdel_confirm


# ARTSHOW #################################################
sub artshow {
	my $refnum = $in->{'refnum'};
	$f->process_form($artform, $in, $int, '0');
	
	$int->{refnum} = $refnum;
	my $err = {};
	$lang = $su->expand_vars($int);		
	
#	print STDERR Dumper $iref;
	if ($iref->{$refnum}) {
		calculate_stock($refnum);
		print 
	  $su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
 		$lang->{ARTSHOW}{emsg};
 		if ($man eq 'client') {
			$int->{desc} = $iref->{$refnum}{desc};
			print
			$f->print_form($artshow_cform, $int, $err, $iref->{$refnum}),
			$f->print_form($artnewform, $int);
		}
		else {
			print
	  	$f->print_form($artshowform, $int, $err, $iref->{$refnum}),
			$f->print_form($artnewform, $int);
		}
	}
	else {
		if ($man eq 'client') {
			my $href = {'refnum' => 1};
			$lang = $su->expand_vars($int);
			$f->error($artform, 'NO_NUM3', $int, $href, 0);
		}
		else {
			print 
			$su->header(title => $lang->{ARTSHOW}{ntitle},
									body => $lang->{CONFIG}{body},
									),
			$lang->{ARTSHOW}{nmsg},
			$f->print_form($artaddform, $int);
		}
	}
} # artshow


# ARTUPDATE #################################################
sub artupdate {
	my $refnum = $in->{'refnum'};
	my $desc = $in->{'desc'};
	$int->{refnum} = $refnum;
	$lang = $su->expand_vars($int);
	delete $in->{'artupdate'};

	open DB2, ">$items_db2" or die $!; close DB2;	
	store $iref, $items_db2;
	$iref->{$refnum}{desc} = $desc;
	store $iref, $items_db;
	
	print 
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$lang->{ARTUPDATE}{msg},
	$f->print_review($artshowform, $in, $int);
	
} # artupdate



# CALCULATE_STOCK #################################################
sub calculate_stock {
	(my $refnum) = @_;
	my $entrades = 0;
	for my $date (sort keys %{ $iref->{$refnum}{entrades} }) {
		$int->{uent} = $su->datestamp($date, $language_file);
		$entrades += $iref->{$refnum}{entrades}{$date};
	}
	$int->{uent} ||= $lang->{ARTSHOW}{no_uent};

	my $comandes = 0;
	for my $date (sort keys %{ $iref->{$refnum}{comandes} }) {
		$int->{ucom} = $su->datestamp($date, $language_file);
		$comandes += $iref->{$refnum}{comandes}{$date};
	}
	$int->{decapats} = $comandes;
	$int->{ucom} ||= $lang->{ARTSHOW}{no_ucom};

	my $pending = 0;
	for my $date (sort keys %{ $iref->{$refnum}{pending} }) {
    next unless $iref->{$refnum}{pending}{$date};
		$pending += $iref->{$refnum}{pending}{$date};
	}
	$int->{on_order} = $pending;
	$int->{estoc} = $entrades - ($comandes + $pending);
	return $int->{estoc};

} # calculate_stock


# COMANDES #################################################
sub comandes {	
	open DB2, ">$orders_db2" or die $!; close DB2;	
	store $oref, $orders_db2;
	open DB2, ">$items_db2" or die $!; close DB2;
	store $iref, $items_db2;
	
	for my $date (keys %$oref) {
		next if $oref->{$date}{final} or $oref->{$date}{sent};
		if ($date + 3600 < $now) {
			delete $oref->{$date};
			for my $refnum (keys %$iref) {
				delete $iref->{$refnum}{pending}{$date}
			}
		}
	}	
	store $oref, $orders_db;
	store $iref, $items_db;
	#print STDERR "OREF\n", Dumper $oref;
	#print STDERR "IREF\n", Dumper $iref;
	
	$int->{date} = $now;
	$lang = $su->expand_vars($int);
	print
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$f->print_form($comform, $int);
} # comandes


# COMADD #################################################
sub comadd {
	(my $update) = @_;
	my $date = $in->{'date'};
	my $itemdate = $now;
	my $newrefnum = $in->{'newrefnum'} if $in->{'newrefnum'};

	unless ($newrefnum || keys %{ $oref->{$date} }) {
		my $href = {'' => 1};
		$lang = $su->expand_vars($int);
		$f->error($comform, 'NO_NUM', $int, $href, '1');
	}
	
	if ($newrefnum && $oref->{$date}{$newrefnum}) {
		$int->{refnum} = $newrefnum;
		$lang = $su->expand_vars($int);
		comadd_print($date, 'repeat_num');
		exit;
	}
	
	my $no_new_ref;
	if ($newrefnum && !$iref->{$newrefnum}) {
		$int->{refnum} = $newrefnum;
		$lang = $su->expand_vars($int);
		if (keys %{ $oref->{$date} }) {
			$no_new_ref = 1;
		}
		else {
			my $href = {'newrefnum' => 1};
			$lang = $su->expand_vars($int);
			$f->error($comform, 'NO_NUM3', $int, $href,0);
		}
	}
		
	open DB2, ">$orders_db2" or die $!; close DB2;	
	store $oref, $orders_db2;
	open DB2, ">$items_db2" or die $!; close DB2;
	store $iref, $items_db2;
		
	if ($newrefnum and !$no_new_ref) {
		$oref->{$date}{$newrefnum}[0] = $now;
	}
	
	if ($update) {
		for my $qrefnum (keys %$in) {
			next unless (my $refnum = $qrefnum) =~ s/^q//;
			_chk_quant($date, $qrefnum, $refnum, 'com');
			$oref->{$date}{$refnum}[1] = $in->{$qrefnum};
			$iref->{$refnum}{pending}{$date} = $in->{$qrefnum};
		}
		if ($in->{'delete'}) {
			my @goners = $in->{'delete'};
			#print STDERR "GONERS\n", Dumper @goners;
			for my $refnum (@goners) {
				if (ref $refnum) {
					for my $i (0 .. @{$refnum}-1) {
						my $numref = $refnum->[$i];
						delete $oref->{$date}{$numref};
						delete $iref->{$numref}{pending}{$date};
					}
				}
				else {
					#print STDERR "$refnum\n";
					delete $oref->{$date}{$refnum} ;
					delete $iref->{$refnum}{pending}{$date};
				}
			}
		}
	}
	
	store $oref, $orders_db;
	store $iref, $items_db;
	#print STDERR "OREF\n", Dumper $oref;
	#print STDERR "IREF\n", Dumper $iref;
	
	$int->{date} = $date;
	$int->{nice_date} = $su->datestamp($date, $language_file);	
	$lang = $su->expand_vars($int);

	comadd_print($date, 'msg', $no_new_ref);
} # comadd


# COMADD_PRINT #############################################
sub comadd_print {
	my ($date, $msg, $no_new_ref) = @_;
	print 
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},);
	if ($no_new_ref) {
		print $lang->{COMADD}{no_new_ref};
	}
	else {
		print	$lang->{COMADD}{$msg}
	};
	print
	$cgi->start_form(),
	"\n",
	$cgi->hidden(-name => 'date',
					-default => $date,
	),
	"\n",
	$lang->{COMADD}{table1};
	for my $refnum (
			sort {
				$oref->{$date}{$a}[0] <=> $oref->{$date}{$b}[0]
			}
				keys %{ $oref->{$date} }
		) {
		next unless $refnum;
		my $stock = calculate_stock($refnum);		
		my $qname = 'q' . $refnum;
		my $quant;
		$quant = $oref->{$date}{$refnum}[1] if $oref->{$date}{$refnum};
		print 
		$lang->{COMADD}{tr},
		$lang->{COMADD}{td},
		$refnum,
	  "\n",
		$lang->{COMADD}{td},
		$iref->{$refnum}{desc},
	"\n",
		$lang->{COMADD}{td},
		$cgi->textfield(-name => $qname,
							-size => '3',
							-default => $quant,
							-override => 1,
		),
		"\n",
		$lang->{DECSHOW}{td},
		$stock,
		"\n",
		$lang->{COMADD}{td},
		$cgi->checkbox(-name => 'delete',
					   -value => $refnum,
					   -label => '',
					   ),
	"\n";
	}
	print
	$lang->{COMADD}{table2},
	$lang->{COMADD}{newrefnum},
	$cgi->textfield(-name => 'newrefnum',
						-size => '10',
						-override => 1,
						-maxlength => undef,
	),
	$lang->{COMADD}{act_fin},
	$cgi->end_form();
} #end comadd_print


# COMFINAL #################################################
sub comfinal {
	delete $in->{'newrefnum'};
	
	my $date = $in->{'date'};
		
	$int->{date} = $date;
	$int->{nice_date} = $su->datestamp($date, $language_file);
	
	if ($oref->{$date}{final}) {
		$lang = $su->expand_vars($int);
		print 
	  $su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
 		$lang->{COMFINAL}{repeat_order};
 		exit;
	}

	open DB2, ">$orders_db2" or die $!; close DB2;	
	store $oref, $orders_db2;
	open DB2, ">$items_db2" or die $!; close DB2;	
	store $iref, $items_db2;
	
	for my $qrefnum (keys %$in) {
		next unless (my $refnum = $qrefnum) =~ s/^q//;
		_chk_quant($date, $qrefnum, $refnum, 'com');
		$oref->{$date}{$refnum}[1] = $in->{$qrefnum};
		$iref->{$refnum}{pending}{$date} = $in->{$qrefnum};
	}
	if ($in->{'delete'}) {
		my @goners = $in->{'delete'};
		#print STDERR "GONERS\n", Dumper @goners;
		for my $refnum (@goners) {
			if (ref $refnum) {
				for my $i (0 .. @{$refnum}-1) {
					my $numref = $refnum->[$i];
					delete $oref->{$date}{$numref};
					delete $iref->{$numref}{pending}{$date};
				}
			}
			else {
				#print STDERR "$refnum\n";
				delete $oref->{$date}{$refnum} ;
				delete $iref->{$refnum}{pending}{$date};
			}
		}
	}
	
	$oref->{$date}{final} = [1,1];
	for my $refnum (keys %{ $oref->{$date} }) {
		next if $refnum eq 'sent' or $refnum eq 'final';
		delete $oref->{$date}{$refnum} unless $oref->{$date}{$refnum}[1];
	}
	store $oref, $orders_db;
	#print STDERR "OREF\n", Dumper $oref;
	store $iref, $items_db;
	#print STDERR "IREF\n", Dumper $iref;

	$lang = $su->expand_vars($int);
	my $mailmsg = $lang->{COMFINAL}{mailmsg} . "\n";
	
	print 
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$lang->{COMFINAL}{msg},
	$lang->{COMFINAL}{table1};
	for my $refnum (
			sort {
				$oref->{$date}{$a}[0] <=> $oref->{$date}{$b}[0]
			}
				keys %{ $oref->{$date} }
		) {
		next if $refnum eq 'sent' or $refnum eq 'final';
		print 
		$lang->{COMADD}{tr},
		$lang->{COMADD}{td},
		$refnum,
		"\n";
		$mailmsg .= "Refnum: $refnum\n";
		print
		$lang->{COMADD}{td},
		$iref->{$refnum}{desc},
		"\n";
		$mailmsg .= "Desc: " . $iref->{$refnum}{desc} . "\n";
		print
		$lang->{COMADD}{td},
		$oref->{$date}{$refnum}[1],
		"\n";
		$mailmsg .= "Quantitat: " . $oref->{$date}{$refnum}[1] . "\n\n";
	}
	print $lang->{COMFINAL}{table2};			

	my $mail = {
				'Return-Path' => 'postmaster@logvall.com',
				To => $lang->{COMFINAL}{email},
				From => 'postmaster@logvall.com',
				Subject => $lang->{COMFINAL}{subj},
				msg => $mailmsg,
				};
	$su->mail($mail);
} # comfinal


# DECAPATS #################################################
sub decapats {		
	unless (keys %$oref) {
		print
		$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
		$lang->{DECAPATS}{no_coms};
		exit;
	}

	open F, ">$prog_dir/date" or die $!;		
	for my $date (reverse sort keys %$oref) {
		next if $oref->{$date}{sent};
		my $nice_date = $su->datestamp($date, $language_file);
		print F "$date|$date ($nice_date)\n";
	}
	close F or warn $!;
	
	$lang = $su->expand_vars($int);
	print
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$f->print_form($decapform, $int);
	#print STDERR "OREF\n", Dumper $oref;
} # decapats


# DECFINAL #################################################
sub decfinal {
	my $date = $in->{'date'};
	$int->{date} = $date;
	$int->{nice_date} = $su->datestamp($date, $language_file);
		
	open DB2, ">$items_db2" or die $!; close DB2;
	open DB2, ">$orders_db2" or die $!; close DB2;
	store $iref, $items_db2;
	store $oref, $orders_db2;
	
	for my $qrefnum (keys %$in) {
			next unless (my $refnum = $qrefnum) =~ s/^q//;
		_chk_quant($date, $qrefnum, $refnum, 'dec');
			$oref->{$date}{$refnum}[1] = $in->{$qrefnum};
			$iref->{$refnum}{pending}{$date} = $in->{$qrefnum};
		}
		if ($in->{'delete'}) {
			my @goners = $in->{'delete'};
			#print STDERR "GONERS\n", Dumper @goners;
			for my $refnum (@goners) {
				if (ref $refnum) {
					for my $i (0 .. @{$refnum}-1) {
						my $numref = $refnum->[$i];
						delete $oref->{$date}{$numref};
						delete $iref->{$numref}{pending}{$date};
					}
				}
				else {
					#print STDERR "$refnum\n";
					delete $oref->{$date}{$refnum} ;
					delete $iref->{$refnum}{pending}{$date};
				}
			}
	}

	$oref->{$date}{sent} = [1,1];
	for my $refnum ( keys %{ $oref->{$date} } ) {
		next if $refnum eq 'final' or $refnum eq 'sent';
		$iref->{$refnum}{comandes}{$date} = $iref->{$refnum}{pending}{$date};
		delete $iref->{$refnum}{pending}{$date};
	}
	
	store $iref, $items_db;
	#print STDERR "IREF\n", Dumper $iref;
	store $oref, $orders_db;
	#print STDERR "OREF\n", Dumper $oref;

	$lang = $su->expand_vars($int);
	my $mailmsg = $lang->{DECFINAL}{mailmsg} . "\n";
	
	print 
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$lang->{DECFINAL}{msg},
	$lang->{DECFINAL}{table1};
	for my $refnum (
			sort {
				$oref->{$date}{$a}[0] <=> $oref->{$date}{$b}[0]
			}
				keys %{ $oref->{$date} }
		) {
		next if $refnum eq 'sent' or $refnum eq 'final';
		print 
		$lang->{COMADD}{tr},
		$lang->{COMADD}{td},
		$refnum,
		"\n";
		$mailmsg .= "Refnum: $refnum\n";
		print
		$lang->{COMADD}{td},
		$iref->{$refnum}{desc},
		"\n";
		$mailmsg .= "Desc: " . $iref->{$refnum}{desc} . "\n";
		print
		$lang->{COMADD}{td},
		$oref->{$date}{$refnum}[1],
		"\n";
		$mailmsg .= "Quantitat: " . $oref->{$date}{$refnum}[1] . "\n\n";
	}
	print $lang->{DECFINAL}{table2};			

	my $mail = {
				'Return-Path' => 'postmaster@logvall.com',
				To => $lang->{DECFINAL}{email},
				From => 'postmaster@logvall.com',
				Subject => $lang->{DECFINAL}{subj},
				msg => $mailmsg,
				};
	$su->mail($mail);
} # decfinal


# DECSHOW #################################################
sub decshow {
	my $date = $in->{'date'};
	$int->{date} = $date;
	
	unless ($oref->{$date}) {
		my $href = {'date' => 1};
		$lang = $su->expand_vars($int);
		$f->error($decapform, 'NO_ORDER', $int, $href, '0');
	}
	
	$int->{nice_date} = $su->datestamp($date, $language_file);
	$lang = $su->expand_vars($int);
	
	print
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$lang->{DECSHOW}{msg},
	$cgi->start_form(),
	"\n",
	$cgi->hidden(-name => 'date',
					-default => $date,
	),
	"\n",
	$lang->{DECSHOW}{table1};
	
	for my $refnum (
			sort {
				$oref->{$date}{$a}[0] <=> $oref->{$date}{$b}[0]
			}
				keys %{ $oref->{$date} }
		) {
		next if $refnum eq 'sent' or $refnum eq 'final';
		my $stock = calculate_stock($refnum);			
		my $qname = 'q' . $refnum;
		print 
		$lang->{DECSHOW}{tr},
		$lang->{DECSHOW}{td},
		$refnum,
	  "\n",
		$lang->{DECSHOW}{td},
		$iref->{$refnum}{desc},
		"\n",
		$lang->{DECSHOW}{td},
		$cgi->textfield(-name => $qname,
							-size => '3',
							-default => $oref->{$date}{$refnum}[1],
							-override => 1,
		),
		"\n",
		$lang->{DECSHOW}{td},
		$stock,
		"\n",
		
		$lang->{DECSHOW}{td},
		$cgi->checkbox(-name => 'delete',
					   -value => $refnum,
					   -label => '',
					   ),
	"\n";
	}
	print
	$lang->{DECSHOW}{act_fin},
	$cgi->end_form(),
	$lang->{DECSHOW}{table2};
} # decshow


# DECUPDATE #################################################
sub decupdate {
	my $date = $in->{'date'};
	$int->{date} = $date;
	$int->{nice_date} = $su->datestamp($date, $language_file);
	
	open DB2, ">$orders_db2" or die $!; close DB2;	
	store $oref, $orders_db2;
	open DB2, ">$items_db2" or die $!; close DB2;
	store $iref, $items_db2;
	
	for my $qrefnum (keys %$in) {
		next unless (my $refnum = $qrefnum) =~ s/^q//;
		_chk_quant($date, $qrefnum, $refnum, 'dec');
		$oref->{$date}{$refnum}[1] = $in->{$qrefnum};
		$iref->{$refnum}{pending}{$date} = $in->{$qrefnum};
	}
	if ($in->{'delete'}) {
		my @goners = $in->{'delete'};
		for my $refnum (@goners) {
			delete $oref->{$date}{$refnum};
			delete $iref->{$refnum}{pending}{$date};
		}
	}
		
	store $oref, $orders_db;
	store $iref, $items_db;
	#print STDERR "OREF\n", Dumper $oref;
	#print STDERR "IREF\n", Dumper $iref;

	$lang = $su->expand_vars($int);
	decupdate_print($date, 'msg');
} # end decupdate


# DECUPDATE_PRINT ##########################################
sub decupdate_print {
	my ($date, $msg) = @_;
	print
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$lang->{DECSHOW}{$msg},
	$cgi->start_form(),
	"\n",
	$cgi->hidden(-name => 'date',
					-default => $date,
	),
	"\n",
	$lang->{DECSHOW}{table1};

	for my $refnum (
			sort {
				$oref->{$date}{$a}[0] <=> $oref->{$date}{$b}[0]
			}
				keys %{ $oref->{$date} }
		) {
		next if $refnum eq 'sent' or $refnum eq 'final';
		my $stock = calculate_stock($refnum);			
		my $qname = 'q' . $refnum;
		print 
		$lang->{DECSHOW}{tr},
		$lang->{DECSHOW}{td},
		$refnum,
		"\n",
		$lang->{DECSHOW}{td},
		$iref->{$refnum}{desc},
		"\n",
		$lang->{DECSHOW}{td},
		$cgi->textfield(-name => $qname,
							-size => '3',
							-default => $oref->{$date}{$refnum}[1],
							-override => 1,
		),
		"\n",
		$lang->{DECSHOW}{td},
		$stock,
		"\n",

		$lang->{DECSHOW}{td},
		$cgi->checkbox(-name => 'delete',
						 -value => $refnum,
						 -label => '',
						 ),
	"\n";
	}
	print
	$lang->{DECSHOW}{act_fin},
	$cgi->end_form(),
	$lang->{DECSHOW}{table2};
} # decupdate


# ENTRADES #################################################
sub entrades {
	$int->{date} = $now;
	$lang = $su->expand_vars($int);
	print
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$f->print_form($entform, $int);
	
} # entrades


# ENTADD #################################################
sub entadd {
	(my $update) = @_;
	my $refnum = $in->{'refnum'};
	my $date = $in->{'date'};
	my $newrefnum = $in->{'newrefnum'} if $in->{'newrefnum'};

	unless ($newrefnum || keys %$tmpref) {
		my $href = {'newrefnum' => 1};
		$lang = $su->expand_vars($int);
		$f->error($entform, 'NO_NUM', $int, $href, '1');
	}

	$int->{newrefnum} = $newrefnum;
	my $itemdate = $now;
	
	my $no_num;
	if ($newrefnum) {
		if ($update) {
			if ($iref->{$newrefnum}) {
				$tmpref->{$date}{$newrefnum}[0] = $now;
			}
			else {
				$no_num = 1;
				$int->{refnum} = $newrefnum;
			}
		}
		else {
			if ($newrefnum && ! $iref->{$newrefnum}) {
				my $href = {'newrefnum' => 1};
				$lang = $su->expand_vars($int);
				$f->error($entform, 'NO_NUM2', $int, $href, '1');
			}
			else {
				$tmpref->{$date}{$newrefnum}[0] = $now;
			}
		}
	}

	if ($update) {
		for my $qrefnum (keys %$in) {
			next unless (my $refnum = $qrefnum) =~ s/^q//;
			$tmpref->{$date}{$refnum}[1] = $in->{$qrefnum};
		}
		if ($in->{'delete'}) {
			my @goners = $in->{'delete'};
			for my $refnum (@goners) {
				if (ref $refnum) {
					for my $i (0 .. @{$refnum}-1) {
						my $numref = $refnum->[$i];
						delete $tmpref->{$date}{$numref};
					}
				}
				else {
					delete $tmpref->{$date}{$refnum} ;
				}
			}
		}
	}
	
	store $tmpref, $tmp_db;
	#print STDERR "TMPREF\n", Dumper $tmpref;
	
	$int->{date} = $date;
	$int->{nice_date} = $su->datestamp($date, $language_file);	
	$lang = $su->expand_vars($int);

	print 
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},);
	if ($no_num) {print $lang->{ENTADD}{no_num}}
	else {print $lang->{ENTADD}{msg}}
	print
	$lang->{ENTADD}{table1},
	$cgi->start_form(),
	"\n",
	$cgi->hidden(-name => 'date',
					-default => $date,
	),
	"\n";
	for my $refnum (
			sort {
				$tmpref->{$date}{$a}[0] <=> $tmpref->{$date}{$b}[0]
			}
				keys %{ $tmpref->{$date} }
		) {
		next if $refnum eq 'sent' or $refnum eq 'final';

		my $stock = calculate_stock($refnum);
		my $qname = 'q' . $refnum;
		my $quant;
		$quant = $tmpref->{$date}{$refnum}[1] if $tmpref->{$date}{$refnum};
		print 
		$lang->{ENTADD}{tr},
		$lang->{ENTADD}{td},
		$refnum,
	  "\n",
		$lang->{ENTADD}{td},
		$iref->{$refnum}{desc},
	"\n",
		$lang->{ENTADD}{td},
		$cgi->textfield(-name => $qname,
							-size => '3',
							-default => $quant,
							-override => 1,
		),
		"\n",
		$lang->{ENTADD}{td},
		$stock,
		"\n",
		$lang->{ENTADD}{td},
		$cgi->checkbox(-name => 'delete',
					   -value => $refnum,
					   -label => '',
					   ),
	"\n";
	}
	print
	$lang->{ENTADD}{table2},
	$lang->{ENTADD}{newrefnum},
	$cgi->textfield(-name => 'newrefnum',
						-size => '10',
						-override => 1,
						-maxlength => undef,
	),
	$lang->{ENTADD}{act_fin},
	$cgi->end_form();
} # entadd


# ENTFINAL #################################################
sub entfinal {
	delete $in->{'newrefnum'};
	my $date = $in->{'date'};
		
	$int->{date} = $date;
	$int->{nice_date} = $su->datestamp($date, $language_file);
	
	if ($oref->{$date}) {
		$lang = $su->expand_vars($int);
		print 
	  $su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
 		$lang->{ENTFINAL}{repeat_order};
 		exit;
	}

	open DB2, ">$items_db2" or die $!; close DB2;	
	store $iref, $items_db2;

	for my $qrefnum (keys %$in) {
		next unless (my $refnum = $qrefnum) =~ s/^q//;
		$tmpref->{$date}{$refnum}[1] = $in->{$qrefnum};
	}
	if ($in->{'delete'}) {
		my @goners = $in->{'delete'};
		for my $refnum (@goners) {
			if (ref $refnum) {
				for my $i (0 .. @{$refnum}-1) {
					my $numref = $refnum->[$i];
					delete $tmpref->{$date}{$numref};
				}
			}
			else {
				delete $tmpref->{$date}{$refnum} ;
			}
		}
	}
	
	for my $refnum (keys %{ $tmpref->{$date} }) {
		next if $refnum eq 'sent' or $refnum eq 'final';
		delete $tmpref->{$date}{$refnum} unless $tmpref->{$date}{$refnum}[1];
	}
	
	for my $refnum (keys %{ $tmpref->{$date} }) {
		$iref->{$refnum}{entrades}{$date} = $tmpref->{$date}{$refnum}[1];
	}
	
	store $iref, $items_db;
	#print STDERR "IREF\n", Dumper $iref;
	
	$int->{date} = $date;
	$int->{nice_date} = $su->datestamp($date, $language_file);	
	$lang = $su->expand_vars($int);

	$lang = $su->expand_vars($int);
	my $mailmsg = $lang->{ENTFINAL}{mailmsg} . "\n";
	
	print 
	$su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},),
	$lang->{ENTFINAL}{msg},
	$lang->{ENTFINAL}{table1};
	for my $refnum (
			sort {
				$tmpref->{$date}{$a}[0] <=> $tmpref->{$date}{$b}[0]
			}
				keys %{ $tmpref->{$date} }
		) {
		next unless $refnum;
		my $stock = calculate_stock($refnum);	
		print 
		$lang->{COMADD}{tr},
		$lang->{COMADD}{td},
		$refnum,
		"\n";
		$mailmsg .= "Refnum: $refnum\n";
		print
		$lang->{COMADD}{td},
		$iref->{$refnum}{desc},
		"\n";
		$mailmsg .= "Desc: " . $iref->{$refnum}{desc} . "\n";
		print
		$lang->{COMADD}{td},
		$tmpref->{$date}{$refnum}[1],
		"\n";
		$mailmsg .= "Quantitat: " . $tmpref->{$date}{$refnum}[1] . "\n";
		print
		$lang->{COMADD}{td},
		$stock,
		"\n";
		$mailmsg .= "Estoc: " . $stock . "\n\n";
	}
	print $lang->{ENTFINAL}{table2};
	
	$tmpref = {};
	store $tmpref, $tmp_db;

	my $mail = {
				'Return-Path' => 'postmaster@logvall.com',
				To => $lang->{ENTFINAL}{email},
				From => 'postmaster@logvall.com',
				Subject => $lang->{ENTFINAL}{subj},
				msg => $mailmsg,
				};
	$su->mail($mail);
} # entfinal


# ETIQUETES #################################################
sub etiquetes {
	$lang = $su->expand_vars($int);
	print
  $su->header(head => $lang->{CONFIG}{head},
	            body => $lang->{CONFIG}{body},),
	$f->print_form($etiform, $int);
	
} # etiquetes


# ETISHOW #################################################
sub etishow {
	$int->{ent_sort} = $in->{'ent_sort'};
	$int->{refnum} = $in->{'refnum'};
	$int->{quant} = $in->{'quant'};
	$int->{date} = $in->{'date'};
        $int->{date2} = $in->{'date2'};
	$int->{delivery} = $in->{'delivery'};
	
	$lang = $su->expand_vars($int);
	
	print
  $su->header(head => $lang->{CONFIG}{head},
	            body => $lang->{CONFIG}{body},),
	$lang->{ETISHOW}{msg};
	
} # etishow


# INIT #################################################
sub init {
#	$int->{jsdate} = $jsref->{date};
	
  $lang = $su->expand_vars($int);
  print
  $su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},
		            ),
  $lang->{INIT}{msg},
  $f->print_form($initform, $int);
  
} # init


# LIST1 #################################################
sub list1 {
	$lang = $su->expand_vars($int);
  print
  $su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},
		            ),
  $lang->{LIST1}{msg},
  $f->print_form($list1form, $int);	
} # list1


# LIST1SHOW #################################################
sub list1show {
	my $refnum = $in->{'refnum'};
	$int->{refnum} = $refnum;
		
	
	my $since = $in->{'since'};
	my $till = $in->{'till'};
	$int->{since} = $since;
	$int->{till} = $till;
	
	$int->{desc} = $iref->{$refnum}{desc};
	
	for ($since, $till) {
		tr!0-9/!!cd;
		unless (m~^\d\d?/\d\d?/\d\d$~) {
			my $href = {$_ => 1};
			$lang = $su->expand_vars($int);
			$f->error($list1form, 'BAD_DATE2', $int, $href, 0);
		}
	}
	
	$since = _get_unix($since);
	$till = _get_unix($till);
	
	calculate_stock($refnum); 	
	$lang = $su->expand_vars($int);
	
	print
	$su->header(head => $lang->{CONFIG}{head},
							body => $lang->{CONFIG}{body},
							),
	$lang->{LIST1SHOW}{msg},
	$lang->{LIST1SHOW}{outer_table},
	$lang->{LIST1SHOW}{table1};
	my $ent_tot = 0;
	my $dec_tot = 0;
	
	for my $date (sort keys %{ $iref->{$refnum}{entrades} }) {
		next if $since > $date;
		last if $till < $date;
		$ent_tot += $iref->{$refnum}{entrades}{$date};
		my $showdate = get_short($date);
		print qq~
<tr>
<td>$showdate
<td>$iref->{$refnum}{entrades}{$date}
~;
	}
	
	print 
	$lang->{LIST1SHOW}{totaltable1},
	$ent_tot,
	$lang->{LIST1SHOW}{endtable1},
	$lang->{LIST1SHOW}{table2};
	
	for my $date ( sort keys %{ $iref->{$refnum}{comandes} } ) {
		next if $since > $date;
		last if $till < $date;
		$dec_tot += $iref->{$refnum}{comandes}{$date};
		my $showdate = get_short($date);
		print qq~
<tr>
<td>$showdate
<td>$iref->{$refnum}{comandes}{$date}
~;
	}
	print 
	$lang->{LIST1SHOW}{totaltable2},
	$dec_tot,
	$lang->{LIST1SHOW}{endtable2},
	$lang->{LIST1SHOW}{end_outer_table},
  $f->print_form($list1form, $int);	
	
} # list1show


# LIST2 #################################################
sub list2 {	
	$lang = $su->expand_vars($int);
  print
  $su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},
		            ),
	$lang->{LIST2SHOW}{msg};
	my $total;
	for my $refnum (sort keys %$iref) {
    print STDERR $refnum, "\n";
		my $tot = calculate_stock($refnum);
		$total += $tot;
		my $desc = $iref->{$refnum}{desc};
		next if $tot < 1;
		print qq~<tr>
	<td>$refnum</td>
	<td>$desc</td>
	<td>$tot</td>
~;
	}
	print qq~<tr>
<td colspan=2 align=right><b>Total:</b>
<td>$total</td>
</table>
~;
} # list2


# LIST3 #################################################
sub list3 {
	$lang = $su->expand_vars($int);
  print
  $su->header(head => $lang->{CONFIG}{head},
		          body => $lang->{CONFIG}{body},
		            ),
  $lang->{LIST3}{msg},
  $f->print_form($list3form, $int);	
} # list3


# LIST3SHOW #################################################
sub list3show {
	my $date = $in->{'date'};
	$int->{date} = $date;
	$date =~ tr!0-9/!!cd;
	
	unless ($date =~ m~^\d\d?/\d\d?/\d\d$~) {
		my $href = {'date' => 1};
		$lang = $su->expand_vars($int);
		$f->error($list3form, 'BAD_DATE2', $int, $href);
	}
	
	my $since = _get_unix($date);
	my $till = $since + 86400;		
	$lang = $su->expand_vars($int);
	print
	$su->header(head => $lang->{CONFIG}{head},
							body => $lang->{CONFIG}{body},
							),
	$lang->{LIST3SHOW}{msg};
	my %res;
	for my $refnum (keys %$iref) {
		for my $date (sort keys %{ $iref->{$refnum}{entrades} }) {
			next if $since > $date;
			last if $till < $date;
			my $showdate = get_short($date);
			$res{$refnum} += $iref->{$refnum}{entrades}{$date};
		}
	}
	for my $refnum (keys %res) {
		my $desc = $iref->{$refnum}{desc};
		print qq~
<tr>
<td>$refnum
<td>$desc
<td>$res{$refnum}
~;
	}
	print
	$lang->{LIST3SHOW}{endtable};
} # list3show


#_CHK_QUANT #################################################
sub _chk_quant {
	my ($date, $qrefnum, $refnum, $form) = @_;
	my $quant = $in->{$qrefnum};
	return unless $quant;
	my $total_entrades = 0;
	my $total_comandes = 0;
	for my $itemdate (keys %{ $iref->{$refnum}{entrades} }) {
		$total_entrades += $iref->{$refnum}{entrades}{$itemdate}
	}
	for my $itemdate (keys %{ $iref->{$refnum}{comandes} }) {
		$total_comandes += $iref->{$refnum}{comandes}{$itemdate}
	}
	for my $itemdate (keys %{ $iref->{$refnum}{pending} }) {
		next if $date eq $itemdate;
		$total_comandes += $iref->{$refnum}{pending}{$itemdate}
	}
	
	my $left = $total_entrades - $total_comandes;
	unless ( $quant <= $left ) {
		$int->{left} = $left;
		$int->{quant} = $quant;
		$int->{refnum} = $refnum;
		$lang = $su->expand_vars($int);
		if ($form eq 'com') {
			comadd_print($date, 'not_enough');
		}
		elsif ($form eq 'dec') {
			decupdate_print($date, 'not_enough');
		}
 		exit;
	}
	
} # _chk_quant


# GET_SHORT #################################################
sub get_short {
	my ($unix) = @_;
	#print STDERR scalar localtime($unix), "\n";
	my ($d, $mon, $yr) = (localtime($unix))[3,4,5];
	#print STDERR "$d, $mon, $yr\n";
	my $short = sprintf '%.2d/%.2d/%.2d', $d, $mon+1, $yr-100;
	return $short;
} # get_short


# _GET_UNIX #################################################
sub _get_unix {
	my ($date) = @_;
	my ($d, $mon, $yr) = split m~/~, $date;
	$mon--; $yr += 100;
	my $when = timelocal(0,0,0,$d, $mon, $yr);
	return $when;
} # _get_unix


__END__
