package RequestForm;
use Dancer2;
use Dancer2::Plugin::Ajax; # TODO: ajax prefix not recognised
use RequestForm::DB;
use RequestForm::PDF;
use RequestForm::BarCode;
use RequestForm::Validate;
use Data::Dumper::Concise;
our $VERSION = '0.1';
hook before => sub {
my $vars = params;
debug $vars if dancer_app->environment eq 'development';
};
get '/index' => sub { template 'index', {}, { layout => 'index' } };
get '/' => sub { template 'web_form' };
post '/' => sub {
my $vars = params; # warn Dumper $vars;
my $validation = _validate($vars); # warn Dumper $validation; # href
# if $validation has 'pass' key, save params to db & return PDF to print:
if ( $validation->{pass} ) { # no validation errors
my $data = $validation->{data}; # warn Dumper $data; # ie $dfv->valid
{ # generate unique ref for db:
my $unique_id = _build_unique_id($data); # warn Dumper $unique_id;
$data->{id} = $unique_id;
}
{ # save data to db:
my $db = RequestForm::DB->new();
$db->save_params($data);
}
{ # generate barcode for printed form:
my @args = (reference => $data->{id}); # returns html table:
my $o = RequestForm::BarCode->new(@args);
$data->{barcode} = $o->create_2d_barcode;
$data->{qrcode} = $o->create_3d_barcode;
}
{ # set headers & return PDF form for user to print & send:
my $content = template 'pdf_form', { data => $data },
{ layout => 'pdf' }; # override default 'main' layout
my $pdf = RequestForm::PDF->new(content => $content)->render;
header 'Content-Type' => 'application/pdf';
return $pdf;
}
}
# validation failed:
else { # return errs to input form:
my $errors = $validation->{errs}; # warn Dumper $errors;
template 'web_form', { errs => $errors, params => $vars };
}
};
ajax '/nhs_number/:var' => sub { # warn 'here'; warn Dumper params;
warn params->{var};
to_xml({}, RootName => undef);
};
# this should be 'ajax' method:
get '/referral_source' => sub {
my $var = params->{ref_src}; # warn $var;
return unless $var && length $var >= 3;
my $results = _get_referral_sources($var); # warn Dumper $data;
my $json = to_json({ results => $results }); # warn $json;
return $json;
};
sub _get_referral_sources {
my $str = shift;
my $db = RequestForm::DB->new();
my $results = $db->get_referral_sources($str); # warn Dumper $sources;
# manipulate $results to provide keys for AJAX caller:
my @data = map {
{
id => $_->{id},
value => $_->{display_name},
info => $_->{organisation_code},
}
} @$results;
return \@data;
}
sub _validate {
my $vars = shift;
my $dfv = RequestForm::Validate->new();
# get $result - hashref of key = errs (if failed) or data (if passed):
my $result = $dfv->validate($vars); # warn Dumper $validation; # errs or data keys
$result->{pass} = 1 if ( ! $result->{errs} ); # errs key if validation failed
return $result;
}
sub _build_unique_id {
my $vars = shift;
my $now = DateTime->now->epoch;
# id = datetime epoch + last_name + first initial:
my $id = $now . uc( $vars->{last_name} . substr($vars->{first_name}, 0, 1) );
return $id;
}
true;