package LIMS::Model::Roles::Outreach; use Moose::Role; has followup_options_map => ( is => 'ro', isa => 'HashRef', lazy_build => 1 ); use Lingua::EN::Words2Nums; #------------------------------------------------------------------------------- sub do_outreach_request_pack_dispatch { my ($self, $data) = @_; my $request_id = $data->{_request_id}; my $followup_option_id = $data->{followup_option_id}; { # request_followup table: my @args = ( followup_option_id => $followup_option_id, request_id => $request_id, ); LIMS::DB::Outreach::RequestFollowup->new(@args)->save; } my $number_of_months = $self->get_followup_option_duration($followup_option_id); if ( defined $number_of_months ) { my $request = LIMS::DB::Request->new(id => $request_id)->load; my %args = ( int => $number_of_months, date => $request->created_at, # requires datetime object ); my $pack_dispatch_date = $self->calculate_pack_dispatch_date(\%args); my %data = ( request_id => $request_id, pack_due => $pack_dispatch_date, ); LIMS::DB::Outreach::RequestPackDispatch->new(%data)->save; } } #------------------------------------------------------------------------------- sub get_followup_option_duration { my ($self, $option_id) = @_; my $options_map = $self->followup_options_map; my $followup_durations = $self->followup_durations_map; my $followup_option_name = $options_map->{$option_id}->{option}; # eg six_month my $int = $followup_durations->{$followup_option_name}; # eg 0, 3, 6, etc return $int; } #------------------------------------------------------------------------------- sub calculate_pack_dispatch_date { # returns datetime object my $self = shift; my $args = shift; my $date = $args->{date}; # datetime object my $int = $args->{int}; # number of months # registration date + no. of months - 14 days: my $dispatch_due_date = $date->add(months => $int)->subtract(days => 14); return $dispatch_due_date; } #------------------------------------------------------------------------------- sub calculate_pack_return_date { # returns datetime object my ($self, $ref_date) = @_; # datetime object # return date = pack dispatch date + 1 month: my $return_date = $ref_date->add(months => 1); return $return_date; } #------------------------------------------------------------------------------- sub followup_durations_map { my $self = shift; my $opts = $self->followup_options_map; # get list of 'option' col: my @follow_up_opts = map $opts->{$_}->{option}, keys %$opts; # warn Dumper \@follow_up_opts; my %map; for my $option (@follow_up_opts) { if ( $option =~ /(\w+)_month/ ) { my $num = words2nums($1); # warn Dumper $num; $map{$option} = $num if defined $num; # could be zero } } # warn Dumper \%map; return \%map; } #------------------------------------------------------------------------------- # method shared by C::Outreach::edit_followup & M::Outreach (get_menu_options & update_followup) sub _build_followup_options_map { my $self = shift; my $dbix = $self->lims_dbix; my $sql = 'select `id`, `label`, `option` from outreach.followup_options'; my $options = $dbix->query($sql)->map_hashes('id'); return $options; } 1;