#!/usr/bin/perl
#
# $Id: inspect-final.pl,v 1.2 1997/02/07 16:13:55 steinhau Exp steinhau $
# $Source: /local/web/PSESCAPE-97/perl/RCS/inspect-final.pl,v $

#
# This is the 'manual-inspection' script for final papers
#
# Author: Steinar Hauan <steinhau@pvv.org>
#

$ENV{'PATH'}    = '/bin:/usr/bin';
$ENV{'IFS'}     = '';
$ENV{'SHELL'}   = '/bin/sh';
            
unshift (@INC,'/local/web/PSESCAPE-97/perl');

require "cgi.pl";
require "defines.pl";
require "utils.pl";

$THIS_PROG     = "/BIN/PSE-97/inspect-final";
$FORM_ACTION   = "<FORM ACTION=\"$THIS_PROG\" METHOD=get>\n";

#
# This script is recursive on 3 levels:
#
# lvl 1: no arguments => list all papers
# lvl 2: $args{'control'} != ''  => show control file / display PS
# lvl 3: $args{'receiver'} != '' => send confirmation (accept/reject)
#

if ( ! defined %args ){
    &ListPapers;
} elsif ( $args{'receiver'} ne '' ){
    &SendMessage;
} elsif ( $args{'control'} ne '' ){
    &ViewPaper;
} else {
    print "(INTERNAL ERROR) - please email $EMAIL_ADMIN\n";
}

exit 0;

################################################################
#    S U B R O U T I N E S
################################################################


# input arguments: NONE
sub ListPapers
{
    &WriteComplexHead(STDOUT,
		      'PSESCAPE-97: Manual Final Paper Check',
		      'CENTER',
		      'H1','Manual Final Paper Check',
		      'H4',&GetCurrentDate);


    chdir($ARTICLE_SPOOL_DIR);

    print "<H3>Reference numbers</H3>\n";
    print "<MENU>\n";
    foreach $control (`ls -1 *control`)
    {
	chop($control);
	next unless -f "$control";

	local($num,$trash) = split(/\./,$control);
	
	print "<LI><A HREF=\"$THIS_PROG?control=$control\">$num</A>";
    }
    print "</MENU>\n";
    
    &WriteAdr;
}

# input arguments: name of control file
sub ViewPaper
{

    chdir($ARTICLE_SPOOL_DIR);

    undef %data;
    undef %final;

    (%final)           = &ReadFinalConfig($args{'control'});

    local($num,$trash) = split(/\./,$args{'control'});
    local($ref)        = "reference: $num";

    local($pctrl)  = sprintf("%s/paper.ps\@control",&Num2Dir($num));
    (%data)        = &ReadPaperConfig($pctrl);

    &WriteComplexHead(STDOUT,
		      'PSESCAPE-97: Final Paper Inspection Form',
		      'CENTER',
		      'H2',$ref,
		      'H1',$data{'title'});

    print "<B>Comments with final submissions</B>\n";
    print "<DL><DD>$final{'comment'}</DL>\n";

    print "<HR>\n";
    print "<B>Corresponding Author</B>\n";
    print "<DL>\n";
    print "\t<DD><B>Name:</B> $data{'firstname'} $data{'lastname'}\n";
    print "\t<DD><B>Address:</B> $data{'adress'}\n";
    if ( $data{'email'} ne "NONE" )
    {
	print "\t<DD><B>email:</B> $data{'email'}\n";
    }
    print "\t<DD><B>fax/phone:</B> $data{'fax'} / $data{'phone'}\n";
    print "</DL>\n";

    # reference to PS-file
    ( $ps_file = $args{'control'} ) =~ s/\@control$//;
    $printfile = sprintf("%s/%s",$ARTICLE_SPOOL_DIR,$ps_file);
    $format = &FindFileFormat($ps_file);

    print "<HR><H3>\n";
    print "<A HREF=\"$PRINT_FILE?file=$printfile\">Print document</A>";
    print "</H3>\n";
    if ( "$format" ne "PostScript document" )
    {
	print "<BLINK><H4>WARNING: document format has been identified ";
	print "as '$format'</H4></BLINK>\n"; 
    }
    print "<HR>\n";

    print "$FORM_ACTION\n";
    print "<INPUT TYPE=hidden NAME=control VALUE=$args{'control'}>\n";
    if ( $data{'email'} ne "NONE" )
    {
        $receiver = $data{'email'};
    } else {
        $receiver = sprintf("%s.%s@%s.fax",$data{'firstname'},
                            $data{'lastname'},$data{'fax'});
    }
    print "<INPUT TYPE=hidden NAME=receiver VALUE=$receiver>\n";

    print "<B>REPLY:</B> <SELECT NAME=template>\n";
    print "\t<OPTION>accept\n\t<OPTION>technical\n\t<OPTION>reject\n</SELECT><P>\n";

    print "<B>Optional message to authors</B>:<P>";
    print "<TEXTAREA type=text name=comment rows=3 cols=50></TEXTAREA><P>\n";
    print "<INPUT TYPE=submit VALUE=Submit>\n";
    print "<INPUT TYPE=reset VALUE=Reset>\n";
    print "</FORM>\n";
 
    &WriteAdr;
}

#
# Input arguments
#    control   : name of control file
#    receiver  : where to send email/fax
#    template  : which confirmation template to send
#    comment   : optional comment from secretariat
#

sub SendMessage
{

    chdir($ARTICLE_SPOOL_DIR);

    undef %data;
    local($status);
    local($num,$trash) = split(/\./,$args{'control'});
    (%data) = &ReadPaperConfig(sprintf("%s/paper.ps\@control",&Num2Dir($num)));

    &WriteComplexHead(STDOUT,
		      'PSESCAPE-97: Manual Verification of Final Paper',
		      'CENTER',
		      'H1','Manual Verification of Final Paper');

    # move the files to article/abstract database
    ( $ps_file = $args{'control'} ) =~ s/\@control$//;

    # retrieve reference number
    local($gref,$trash) = split(/\./,$args{'control'});

    # only move files if code='accept'
    if ( $args{'template'} eq 'accept' )
    {
	local($destdir) = &Num2Dir($gref);
	if ( ! -d "$destdir" )
	{
	    print "FATAL ERROR: no target directory '$destdir'\n";
	    return;
	}
	$targetfile = sprintf("%s/final.ps",$destdir);
	if ( -f "$targetfile" )
	{
	    print "FATAL ERROR: refusing to overwrite '$targetfile'\n";
	    return;
	}
	print "Paper code <B>$args{'template'}</B> sent to $args{'receiver'}<P>\n";
	print "Paper destination directory: $destdir<P>\n";

    } else {
	# rewrite receiver if code=='technical'
	if ( $args{'template'} eq 'technical' )
	{
	    $args{'receiver'} = $PSEADM;
	}
	if ( ! -d "$REJECT_DIR" )
	{
	    print "FATAL ERROR: no target directory '$REJECT_DIR'\n";
	    return;
	}
	print "Abstract code <B>$args{'template'}</B> sent to $args{'receiver'}<P>\n";

	# in theory this filename may NOT be unique - only in practise..
	$targetfile = sprintf("%s/%s",$REJECT_DIR,$ps_file);

	# this is a cludge - sorry :-(
	if ( $args{'template'} eq 'reject' )
	{
	    $targetfile = sprintf("%s/DELETE/%s",$REJECT_DIR,$ps_file);
	}
	print "File renamed to $targetfile<P>";
    }
    system("$SUID_MV $ps_file $targetfile");
    system("$SUID_MV $args{'control'} $targetfile\@control");

    # write reply to file for mail/archive
    
    $tmpfile = "/tmp/PSEreply.$$";
    if ( ! open(FD,">$tmpfile") )
    {
	print "(INTERNAL ERROR) - Unable to write file $tmpfile ($!)";
	return;
    }

    local($now)= &GetCurrentDate;
    $template = sprintf("%s/%s-final.template",
			$TEMPLATE_DIR,$args{'template'});
    $str = &SubstTemplate($template,
			  "LASTNAME",$data{'lastname'},
			  "FIRSTNAME",$data{'firstname'},
			  "PAPER_REFERENCE",$gref,
			  "PAPER_TITLE",$data{'title'},
			  "PAPER_FILE",$targetfile,
			  "CURRENT_DATE",$now,
			  "PAPER_COMMENT",$args{'comment'});
    print FD "$str\n";
    close(FD);

    if ( ! open(FD,"$tmpfile") )
    {
	print "(INTERNAL ERROR) Unable to reopen temporary file ($!)";
	return;
    }

    # print file unless technical
    if ( $args{'template'} ne 'technical' )
    {
	system("$LPR -P$ARCHIVE_PRINTER $tmpfile");
	print "Copy of reply sent to archive printer<P>";
    }

    $mailheader = "PSESCAPE-97: manual paper confirmation";
    if ( ! open(OUT,"| $MAIL -s \"$mailheader\" $args{'receiver'}") )
    {
	print "(INTERNAL ERROR) - no mailer $MAIL ($!)";
	return;
    }
    while (<FD>){ print OUT "$_"; }
    close(FD);
    close(OUT);

    unlink($tmpfile);

    &WriteAdr;
}
