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;