RSS Git Download  Clone
Raw Blame History
#!/usr/bin/perl

use strict;
use warnings;

BEGIN {
	use FindBin qw($RealBin); # warn $RealBin;
	use lib (
		'/home/raj/perl5/lib/perl5',
        $RealBin . '/../../lib',
	);
	
	# use CGI::Carp qw(fatalsToBrowser); # use for devel
	use CGI::HTMLError (trace => 1); # use in production
}

use CGI;
use Template;
use Data::Dumper;
use DBIx::Simple;
use HTML::FillInForm;
use Data::FormValidator;
use Data::FormValidator::Constraints qw(:closures);

use LIMS::Model::Email;
use LIMS::Local::Debug; # DEBUG()
use LIMS::Local::Config;
use Mail::Sendmail;

my $config = LIMS::Local::Config->instance;
my $dbix   = DBIx::Simple->connect(@{ $config->{dbh_params} });

my $ADMIN = $config->{settings}->{admin_contact};

# template src:
use constant TMPL_DIR => $RealBin . '/../../templates';
use constant TMPL => 'user/application_form.tt';

my $q = CGI->new(); # DEBUG($q);
   
# get form submission params:
my $vars = $q->Vars(); # DEBUG($vars);

use vars qw($content);

# if submitted form:
if ($vars->{register}) {
    my $dfv = _dfv();
    my $dfv_profile = _dfv_profile(); # DEBUG($dfv_profile);
    my $results = $dfv->check($q, $dfv_profile); # DEBUG($results);

    if ( $results->has_invalid or $results->has_missing ) { # DEBUG($results);
        $content = { errs => $results->msgs, vars => $vars };
    }
    else { # no validation errors:
        my $rtn = send_application();
        if ($rtn) { # sendmail error:
            $content = { vars => $vars, msg => $rtn, admin => $ADMIN };
        }
        else { # messages sent OK:
            $content = { vars => $vars, send_success => 1, admin => $ADMIN };
        }
    }
}

my $view = render_view($content);
print $q->header(), $view;

sub render_view {
    my $content = shift;
    
    { # user locations:
        my $sql = q!select location_name from user_locations where active = 'yes'!;
        my $user_locations = $dbix->query($sql)->flat;
        $content->{user_locations} = $user_locations;
    }
    { # user roles:
        my $roles = $dbix->query('select distinct(designation) from users')->flat;
        $content->{roles} = $roles;
    }
    
    # get TT object:
    my $t = Template->new({ INCLUDE_PATH => TMPL_DIR }); 
    
    my $template_output;
    $t->process(TMPL, $content, \$template_output)
    || die "Template process failed: ", $t->error(), "\n";

    my $output = HTML::FillInForm->fill( \$template_output, $vars );
    return $output;
}

sub send_application {
    my $message_body = _message_body();

    my $subject = sprintf 'HILIS Registration (%s, %s)',
        uc $vars->{last_name}, ucfirst lc $vars->{first_name};
    
	my %mail = (		
		config  => $config->{settings},
		message => $message_body,
		subject => $subject,
	); # DEBUG(\%mail);

    my @recipients = ($ADMIN, $vars->{email});
    
    for my $addr (@recipients) {
        $mail{recipient} = $addr; # DEBUG(\%mail);
        my $rtn = LIMS::Model::Email->send_message(\%mail);
        return $rtn if $rtn;
    }
    return 0; # messages sent OK
}

sub _dfv_profile {
    return {
        required => [ qw(last_name first_name contact email email2 tel dept) ],
        optional => [ qw(location other_source role other_role)],
        dependencies => {
			location    => { OTHER => 'other_source' }, # require 'other_source' if location == OTHER 
			designation => { OTHER => 'other_role'   }, # require 'other_role' if designation == OTHER 
		},
        require_some => { # require one from this group
            location => [ 1, qw(location other_source)  ],
            role     => [ 1, qw(designation other_role) ],
        },
        constraint_methods => {
            email  => email(),
            email2 => _check_emails_match(),
        },
		msgs => {
			constraints => {
                email_mismatch => 'e-mail addresses do not match',
            },
        },
    }
}

sub _message_body {
    $vars->{contact} =~ s/\,//g; $vars->{contact} =~ s/\r\n/, /g; # remove orig. commas & new-lines
    
	my $message = qq!Confirmation of your HILIS registration details:\n\n!;
	$message .= sprintf "%12s: %s\n", 'First Name', $vars->{first_name};
	$message .= sprintf "%12s: %s\n", 'Last Name', $vars->{last_name};
	$message .= sprintf "%12s: %s\n", 'Source', $vars->{other_source} || $vars->{location};
	$message .= sprintf "%12s: %s\n", 'Dept', $vars->{dept};
	$message .= sprintf "%12s: %s\n", 'Position', $vars->{other_role} || $vars->{designation};
	$message .= sprintf "%12s: %s\n", 'Address', $vars->{contact};
	$message .= sprintf "%12s: %s\n", 'Telephone', $vars->{tel};
	$message .= sprintf "%12s: %s\n", 'E-mail', $vars->{email};
    $message .= qq!\n\nPlease contact $ADMIN should you require any further details.!;
    return $message;
}

sub _dfv {
    my $defaults = $config->{dfv_defaults}; # DEBUG($defaults);    
    my $dfv = Data::FormValidator->new({}, $defaults);
    return $dfv;
}

sub _check_emails_match {
	return sub {
		my $dfv = shift; # DEBUG($dfv);
		$dfv->name_this('email_mismatch'); 

		my $data = $dfv->get_filtered_data; # DEBUG($data);    	
		return ($data->{email} eq $data->{email2}); # returns truth
	};
}