Sample History (organite)
first new 1292414994 me
first stage one 1292414994 me
second new 1292414994 me
second stage one 1292414994 me
second stage four 1292414994 me
first stage two 1292414994 me
test1 is currently at: stage two
sample is currently at: stage four
####
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use sam;
use tes;
# Create a sample
my $sample = new sam();
$sample->sample_id("organite");
# Create a new test, name it, add it to the sample and increase it's status a couple of times
my $test1 = new tes();
$test1->test_id("first");
$sample->add_test($test1);
$test1->status("new", "me");
$test1->status("stage one", "me");
# Create ANOTHER new test, name it, add it to the sample and increase it's status a couple of times
my $test2 = new tes();
$test2->test_id("second");
$sample->add_test($test2);
$test2->status("new", "me");
$test2->status("stage one", "me");
# change test2 status
$test2->status("stage four", "me");
# change test1 status, but not as high as test2
$test1->status("stage two", "me");
printf("\nSample History (%s)\n%s\n", $sample->sample_id(), $sample->status_history());
printf("\ntest1 is currently at: %s\n",$test1->current_status());
printf("\ntest2 is currently at: %s\n",$test2->current_status());
printf("\nsample is currently at: %s\n\n",$sample->current_status());
####
package sam;
use strict;
use Data::Dumper;
use status;
sub new{
my($class) = @_;
my $this = {
'sample_id'=>undef,
'test_list'=>[],
'status'=>[],
} ;
bless($this, $class);
return $this;
}
sub sample_id{
if(defined $_[1]){$_[0]->{'sample_id'}=$_[1];}
else{return $_[0]->{'sample_id'}}
}
sub add_test{
my($this, $test) = @_;
# Add test to sample
push @{$this->{'test_list'}}, $test;
$test->add_to_sample($this);
}
sub add_status{
my($this, $test) = @_;
my $h = {};
$h->{'ref'} = ${$test->{'status'}}[(scalar(@{$test->{'status'}}) - 1)];
$h->{'src'} = $test;
push @{$this->{'status'}}, $h;
}
sub status_history{
my($this) = @_;
my $history = "";
foreach my $entry(@{$this->{'status'}}){
$history .= sprintf("%s\t%s\t%s\t%s\n", $entry->{src}->test_id(), $entry->{'ref'}->status(), $entry->{'ref'}->time(), $entry->{'ref'}->owner());
}
return $history;
}
sub current_status{
my($this) = @_;
my $top;
foreach my $entry(@{$this->{'status'}}){
$top = $entry if(! defined $top || $entry->{'ref'}->status_code() > $top->{'ref'}->status_code());
}
return $top->{'ref'}->status;
}
1;
####
package tes;
use strict;
use Data::Dumper;
use status;
sub new{
my($class, $data) = @_;
my $this = {
'sample'=>undef,
'test_id'=>undef,
'status'=>[],
} ;
bless($this, $class);
return $this;
}
sub add_to_sample{
my($this, $sample) = @_;
$this->{'sample'} = $sample;
}
sub test_id{
my($this, $test_id) = @_;
if(defined $test_id){
$this->{'test_id'}=$test_id;
}
else{
return $this->{'test_id'}
}
}
sub status{
my($this, $status, $owner) = @_;
if(! defined $status){
return pop @{$this->{'status'}};
}
else{
my $stat = new status();
$stat->initiate($status, $owner);
push @{$this->{'status'}}, $stat;
$this->{'sample'}->add_status($this);
}
return 1;
}
sub current_status{
my($this) = @_;
my $status = $this->status();
return $status->status();
}
1;
####
package status;
use strict;
use Data::Dumper;
my $order = {"new"=>1,"stage one"=>2,"stage two"=>3,"stage four"=>4,"end"=>5};
sub new{
my($class) = @_;
my $this = { 'status'=>undef,
'time'=>undef,
'owner'=>undef};
bless($this, $class);
return $this;
}
sub initiate{
my($this, $status, $owner) = @_;
$this->status($status);
$this->time(time());
$this->owner($owner);
}
sub status{
my($this, $status) = @_;
if(defined $status){
$this->{'status'} = $status;
}
else{
return $this->{'status'};
}
}
sub status_code{
my($this, $status) = @_;
if(defined $this->{'status'}){
return $order->{$this->{'status'}};
}
else{
return undef;
}
}
sub time{
my($this, $time) = @_;
if(defined $time){
$this->{'time'} = $time;
}
else{
return $this->{'time'};
}
}
sub owner{
my($this, $owner) = @_;
if(defined $owner){
$this->{'owner'} = $owner;
}
else{
return $this->{'owner'};
}
}
1;