#===============================================#
# package DBObject #
#===============================================#
package DBObject;
use Carp;
use strict;
use vars qw(
$VERSION
$AUTOLOAD
);
### The package version, both in 1.23 style *and* usable by MakeMaker:
$VERSION = substr q$Revision: 1.30 $, 10;
my @Columns = ();
# objects in dependency order, listed independent to dependent
my @DependencyOrder = qw(
domain users person userauth company companyperson budget project accountsrecv
budgetproject persbudgproj cashdeposits cashwithdrawals work expense
invoicelineitem fundedactivity
);
#===================================#
# CLASS METHODS #
#===================================#
sub new
{
my $proto = shift;
my $class = ref($proto) || $proto;
### Create basic object:
my $self = {};
$self->{'_table_'} = $class;
bless $self, $class;
### Build, if needed:
return (@_ ? $self->build(@_) : $self);
}
#------------------------------
sub dependencyOrder
{
return @DependencyOrder;
}
#------------------------------
sub RoleRestriction
{
my ($self,$companyperson) = @_;
return "companyid = '" . $companyperson->{companyid} . "'";
}
#================================#
# INSTANCE METHODS #
#================================#
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
# get or set primary key
sub pk
{
my $self = shift;
my @cols = $self->columns;
my $pkname = shift(@cols);
if (@_)
{
return $self->{$pkname} = shift;
}
else
{
return $self->{$pkname};
}
}
#------------------------------
# update foreign keys: subclasses should override
sub updateFKs
{
my $self = shift;
# superclass has no foreign keys to update
}
#------------------------------
sub build
{
my ($self,$valstr) = @_;
my @vals = split($::col_delim,$valstr);
my @cols = $self->columns();
foreach my $col (@cols)
{
last if !@vals;
$self->{$col} = shift(@vals);
}
$self->{synecdoche} = $self->{$cols[0]};
return $self;
}
sub AUTOLOAD
{
my $self = shift;
my $type = ref($self)
or croak "$self is not an object";
my $name = $AUTOLOAD;
$name =~ s/.*://; # strip fully qualified portion
if (@_)
{
return $self->{$name} = shift;
}
else
{
return $self->{$name};
}
}
sub synecdoche
{
my $self = shift;
return $self->{synecdoche};
}
#===============================#
# all values, id first #
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
push(@vals,$self->{$col});
}
return join('|',@vals);
}
#=============================#
# just id, synecdoche #
#=============================#
sub forTableFK
{
my ($self,$separator) = @_;
$separator = $::col_delim unless length($separator);
my @vals = ();
my @cols = $self->columns();
push(@vals,$self->{$cols[0]}); #id
push(@vals,$self->synecdoche());
return join($separator,@vals);
}
#================================#
sub Sort
{
my ($self,$aptr) = @_;
my @ary = sort {$a->{id} cmp $b->{id}} @$aptr;
return \@ary;
}
#===============================#
# all values, HTML table format #
# *id values suppressed unless #
# a true second argument supplied.#
sub asHTMLTable
{
my $self = shift;
my $html = qq!
!;
foreach my $col ($self->columns())
{
my $val = $self->{$col};
$html .= qq!
| $col |
$val |
!;
}
$html .= qq!
!;
$html;
}
#===============================================#
# package person #
#===============================================#
package person;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
$self->{synecdoche} = $self->{firstname} . ' ' . $self->{lastname};
return $self;
}
#------------------------------
sub Sort
{
my ($self,$aptr) = @_;
my @ary = sort {$a->{lastname} cmp $b->{lastname}} @$aptr;
return \@ary;
}
#============================================#
# package company #
#============================================#
package company;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
my @Arrays = ('contacts','staff');
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
sub arrays # implement if you have an @Arrays class array
{
my $self = shift;
@Arrays;
}
sub build
{
my $self = shift;
$self->SUPER::build(@_);
$self->{synecdoche} = $self->{companyname};
# bring in our array of Contacts (companypersons)
my $id = $self->{id};
my $query = qq/
select cp.id
from companyperson cp, domain d
where companyid = '$id'
and cp.roleid = d.id
and d.filter = 'companyperson'
and d.value = 'Contact'/;
my @results = &::db_retrieve('mrnc',$query);
if (@results)
{
$self->{contacts} = [];
}
foreach my $cpid (@results)
{
my $cp = &::sessionObject('companyperson',$cpid);
push (@{ $self->{contacts} },$cp);
}
# bring in our array of Staff (companypersons)
my $id = $self->{id};
my $query = qq/
select cp.id
from companyperson cp, domain d
where companyid = '$id'
and cp.roleid = d.id
and d.filter = 'companyperson'
and d.value = 'Staff'/;
my @results = &::db_retrieve('mrnc',$query);
if (@results)
{
$self->{staff} = [];
}
foreach my $cpid (@results)
{
my $cp = &::sessionObject('companyperson',$cpid);
push (@{ $self->{staff} },$cp);
}
return $self;
}
#------------------------------
sub Sort
{
my ($self,$aptr) = @_;
my @ary = sort {$a->{companyname} cmp $b->{companyname}} @$aptr;
return \@ary;
}
#------------------------------
sub forTablePK
{
my $self = shift;
my %vals;
foreach my $col ($self->columns())
{
my $val;
$val = $self->{$col};
$vals{$col} = $val;
}
foreach my $rel ($self->arrays())
{
if ($rel eq 'contacts')
{
my @ary;
foreach my $contact ( @{ $self->{contacts} } )
{
push(@ary,$contact->forTableFK('|'));
}
$vals{contacts} = \@ary;
}
if ($rel eq 'staff')
{
my @ary;
foreach my $staff ( @{ $self->{staff} } )
{
push(@ary,$staff->forTableFK('|'));
}
$vals{staff} = \@ary;
}
}
return \%vals;
}
#===============================================#
# package companyperson #
#===============================================#
package companyperson;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
# update foreign keys
sub updateFKs
{
my $self = shift;
my $company = $self->{company};
$self->{companyid} = $company->pk() if $company;
my $person = $self->{person};
$self->{personid} = $person->pk() if $person;
my $role = $self->{role};
$self->{roleid} = $role->pk() if $role;
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
# don't bring in company object to avoid infinite loop
# bring in person object
my $personid = $self->{personid};
$self->{person} = &::sessionObject('person',$personid)
if length $personid;
# bring in domain object
my $roleid = $self->{roleid};
$self->{role} = &::sessionObject('domain',$roleid)
if length $roleid;
$self->{synecdoche} = $self->{person}->{synecdoche} .
# ' / ' . $self->{role}->{synecdoche} .
'|' . $self->{customrole};
return $self;
}
#------------------------------
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
my $val;
if ($col eq 'personid')
{
my $personid = $self->{$col};
my $person = &::sessionObject('person',$personid);
$val = $person->forTableFK() if defined $person;
}
elsif ($col eq 'roleid')
{
my $domainid = $self->{$col};
my $domain = &::sessionObject('domain',$domainid);
$val = $domain->forTableFK() if defined $domain;
}
else { $val = $self->{$col}; }
push(@vals,$val);
}
return join('|',@vals);
}
#------------------------------
sub loggedInRole
{
my $self = shift;
my $company = &::sessionObject('company',$self->{companyid});
return join('/',$company->{synecdoche},
$self->{role}->{synecdoche},
$self->{customrole});
}
#===============================================#
# package domain #
#===============================================#
package domain;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
$self->{synecdoche} = $self->{value};
return $self;
}
#============================================#
# package budget #
#============================================#
package budget;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#-------------------------------------------#
sub build
{
my $self = shift;
$self->SUPER::build(@_);
# bring in the clientcompany object
my $clientcompanyid = $self->{clientcompanyid};
$self->{clientcompany} = &::sessionObject('company',$clientcompanyid)
if length $clientcompanyid;
# bring in the contractedco object
my $contractedcoid = $self->{contractedcoid};
$self->{contractedco} = &::sessionObject('company',$contractedcoid)
if length $contractedcoid;
$self->{synecdoche} =
$self->{clientcompany}->{abbrev} . '(' .
$self->{contractno} . '): ' .
PerlDynamic::formatAsMoney($self->{budgetdollars});
return $self;
}
#-----------------------------------------#
# variation from superclass #
#-----------------------------------------#
sub RoleRestriction
{
my ($self,$companyperson) = @_;
return "contractedcoid = '" . $companyperson->{companyid} . "'";
}
#-------------------------------------------#
sub Sort
{
my ($self,$aptr) = @_;
my @ary = sort {$b->{datebegin} cmp $a->{datebegin}} @$aptr;
return \@ary;
}
#-------------------------------------------#
# update foreign keys
sub updateFKs
{
my $self = shift;
my $clientco = $self->{clientcompany};
$self->{clientcompanyid} = $clientco->pk() if $clientco;
my $contractedco = $self->{contractedco};
$self->{contractedcoid} = $contractedco->pk() if $contractedco;
}
#-------------------------------------------#
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
my $val;
if (grep (/^$col$/,qw ( clientcompanyid contractedcoid) ))
{
my $companyid = $self->{$col};
my $company = &::sessionObject('company',$companyid);
$val = $company->forTableFK() if defined $company;
}
else { $val = $self->{$col}; }
push(@vals,$val);
}
return join('|',@vals);
}
#===============================================#
# package project #
#===============================================#
package project;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
# update foreign keys
sub updateFKs
{
my $self = shift;
my $parent = $self->{parent};
$self->{parentid} = $parent->pk() if $parent;
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
# bring in the project parent object
my $parentid = $self->{parentid};
$self->{parent} = &::sessionObject('project',$parentid)
if length $parentid;
$self->{synecdoche} = $self->{projectname};
return $self;
}
#------------------------------
sub Sort
{
my ($self,$aptr) = @_;
my @ary = sort {uc($a->{projectname}) cmp uc($b->{projectname})} @$aptr;
return \@ary;
}
#------------------------------
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
my $val = '';
if (grep (/^$col$/,qw (parentid) ))
{
my $id = $self->{$col};
if (length($id))
{
my $table = 'project';
my $obj = &::sessionObject($table,$id);
$val = $obj->forTableFK() if $obj;
}
}
else { $val = $self->{$col}; }
push(@vals,$val);
}
return join('|',@vals);
}
#------------------------------
# differ from default: add in synecdoche of parent project
# but only if parent is not a root project
sub forTableFK
{
my $self = shift;
my @vals = ();
my @cols = $self->columns();
push(@vals,$self->{$cols[0]}); #id
if (length($self->{parentid}) && length($self->{parent}->{parentid}))
{
push(@vals,$self->{parent}->synecdoche() . '/' .
$self->synecdoche());
}
else
{
push(@vals,$self->synecdoche());
}
return join($::col_delim,@vals);
}
#===============================================#
# package budgetproject #
#===============================================#
package budgetproject;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
# update foreign keys
sub updateFKs
{
my $self = shift;
my $budget = $self->{budget};
$self->{budgetid} = $budget->pk() if $budget;
my $project = $self->{project};
if ($project)
{
$self->{projectid} = $project->pk();
}
else # try to use #temp_ProjectID
{
$self->{projectid} = $::session->param('temp_ProjectID');
}
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
# bring in the project object
my $projectid = $self->{projectid};
$self->{project} = &::sessionObject('project',$projectid)
if length $projectid;
# bring in the budget object
my $budgetid = $self->{budgetid};
$self->{budget} = &::sessionObject('budget',$budgetid)
if length $budgetid;
$self->{synecdoche} = $self->{budget}->{contractno} .
': ' . PerlDynamic::formatAsMoney($self->{budgetdollars});
# add derived attribute: hours
$self->{hours} = $self->{billrate} > 0 ?
$self->{budgetdollars} / $self->{billrate} : 9999;
return $self;
}
#------------------------------
sub Sort
{
my ($self,$aptr) = @_;
my @ary = sort {uc($a->{project}->{projectname})
cmp uc($b->{project}->{projectname})} @$aptr;
return \@ary;
}
#------------------------------
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
my $val;
if (grep (/^$col$/,qw (projectid budgetid) ))
{
my $id = $self->{$col};
my $table = $col;
$table =~ s/id$//;
my $obj = &::sessionObject($table,$id);
$val = $obj->forTableFK() if defined $obj;
}
else { $val = $self->{$col}; }
push(@vals,$val);
}
return join('|',@vals);
}
#------------------------------
# insert a new persbudgproj row for userid 'unallocated', with
# the total budgeted amount
sub postInsertTrigger
{
my $self = shift;
$self->AdjustUnalloc()
}
sub postUpdateTrigger
{
my $self = shift;
$self->AdjustUnalloc();
}
#---------------------------------------------------------#
# update the 'unalloc' persbudgproj row with the corrected
# unallocated budgeted amount
sub AdjustUnalloc
{
my $self = shift;
my $bpid = $self->{id};
my $personid = $::unalloc->{id};
my $pbp;
# get the 'unalloc' persbudgproj row
my $query = qq/
select id
from persbudgproj
where budgprojid = '$bpid'
and personid = '$personid'/;
my @results = &::db_retrieve("mrnc",$query);
if (!@results) {
$pbp = persbudgproj->new();
$pbp->{id} = 'new';
$pbp->{budgprojid} = $bpid;
$pbp->{personid} = $::unalloc->{id};
$pbp->{hourlyrate} = 0;
$pbp->build(); # load in budgetproject, person objects
} else {
my $pbpid = shift(@results);
$pbp = &::sessionObject('persbudgproj',$pbpid);
}
# get total funding for other persons
$query = qq/
select sum(budgetdollars) from persbudgproj
where budgprojid = '$bpid'
and personid <> '$personid'/;
@results = &::db_retrieve("mrnc",$query);
my $otherdollars = shift(@results);
# update and save
$pbp->{budgetdollars} = $self->{budgetdollars} - $otherdollars;
&::saveToDB('persbudgproj',$pbp);
}
#---------------------------------------------------------#
# remove all persbudgproj allocations for this budgetproject
sub preDeleteTrigger
{
my $self = shift;
my $bpid = $self->{id};
my $query = qq/
delete from persbudgproj
where budgprojid = '$bpid'/;
&::db_retrieve("im",$query);
}
#===============================================#
# package accountsrecv #
#===============================================#
package accountsrecv;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
# update foreign keys
sub updateFKs
{
my $self = shift;
my $budget = $self->{budget};
$self->{budgetid} = $budget->pk() if $budget;
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
# bring in the budget object
my $budgetid = $self->{budgetid};
$self->{budget} = &::sessionObject('budget',$budgetid)
if length $budgetid;
# compute the sum of all line items for this invoice
my $id = $self->{id};
my $query = qq/
select sum(hours * rate)
from invoicelineitem
where invoiceid = '$id'/;
my @results = &::db_retrieve('mrnc',$query);
$self->{Amount} = shift(@results);
$self->{synecdoche} = $self->{invoicenumber};
return $self;
}
#------------------------------
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
my $val;
if (grep (/^$col$/,qw (budgetid) ))
{
my $id = $self->{$col}; # budgetid
my $table = $col; # 'budgetid'
$table =~ s/id$//; # 'budget'
my $obj = &::sessionObject($table,$id);
$val = $obj->forTableFK() if defined $obj;
}
else { $val = $self->{$col}; }
push(@vals,$val);
}
# splice in amount after contract
splice(@vals,3,0,$self->{Amount});
return join('|',@vals);
}
#---------------------------------------------------------#
# remove all invoicelineitems for this accountsrecv
sub preDeleteTrigger
{
my $self = shift;
my $invid = $self->{id};
my $query = qq/
delete from invoicelineitem
where invoiceid = '$invid'/;
&::db_retrieve("im",$query);
}
#===============================================#
# package invoicelineitem #
#===============================================#
package invoicelineitem;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
# update foreign keys
sub updateFKs
{
my $self = shift;
my $invoice = $self->{invoice};
$self->{invoiceid} = $invoice->pk() if $invoice;
my $project = $self->{project};
$self->{projectid} = $project->pk() if $project;
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
# bring in the accountsrecv object
my $invoiceid = $self->{invoiceid};
$self->{invoice} = &::sessionObject('accountsrecv',$invoiceid)
if length $invoiceid;
# bring in the project object
my $projectid = $self->{projectid};
$self->{project} = &::sessionObject('project',$projectid)
if length $projectid;
$self->{synecdoche} = $self->{project}->{synecdoche} .
": " . $self->{hours} * $self->{rate};
return $self;
}
#------------------------------
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
my $val;
if (grep (/^$col$/,qw (projectid invoiceid) ))
{
my $id = $self->{$col};
my $table = $col;
$table =~ s/id$//;
$table =~ s/invoice/accountsrecv/;
my $obj = &::sessionObject($table,$id);
$val = $obj->forTableFK() if defined $obj;
}
else { $val = $self->{$col}; }
push(@vals,$val);
}
# splice in subtotal after rate
splice(@vals,6,0,$self->{hours} * $self->{rate});
return join('|',@vals);
}
#===============================================#
# package persbudgproj #
#===============================================#
package persbudgproj;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
# update foreign keys
sub updateFKs
{
my $self = shift;
my $bp = $self->{budgetproject};
$self->{budgprojid} = $bp->pk() if $bp;
my $person = $self->{person};
$self->{personid} = $person->pk() if $person;
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
# bring in the budgetproject object
my $bpid = $self->{budgprojid};
$self->{budgetproject} = &::sessionObject('budgetproject',$bpid)
if length $bpid;
# bring in the person object
my $personid = $self->{personid};
$self->{person} = &::sessionObject('person',$personid)
if length $personid;
$self->{synecdoche} = $self->{budgetproject}->{synecdoche} . ":" .
$self->{person}->{synecdoche};
# add derived attribute: hours
$self->{hours} = $self->{hourlyrate} > 0 ?
$self->{budgetdollars} / $self->{hourlyrate} : 9999;
return $self;
}
#------------------------------
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
my $val;
if (grep (/^$col$/,qw (budgprojid personid) ))
{
my $id = $self->{$col};
my $table = $col;
$table =~ s/id$//;
$table =~ s/budgproj/budgetproject/;
my $obj = &::sessionObject($table,$id);
$val = $obj->forTableFK() if defined $obj;
}
else { $val = $self->{$col}; }
push(@vals,$val);
}
return join('|',@vals);
}
#---------------------------------------------------------#
sub postInsertTrigger
{
my $self = shift;
$self->AdjustUnalloc();
}
#---------------------------------------------------------#
sub postUpdateTrigger
{
my $self = shift;
$self->AdjustUnalloc();
}
#---------------------------------------------------------#
sub postDeleteTrigger
{
my $self = shift;
$self->AdjustUnalloc();
}
# update the 'unalloc' persbudgproj row with the corrected
# unallocated budgeted amount
sub AdjustUnalloc
{
my $self = shift;
my $bpid = $self->{budgprojid};
my $personid = $::unalloc->{id};
my $pbp;
# do nothing if self IS the unalloc person
return if $self->{personid} eq $personid;
# get the 'unalloc' persbudgproj row
my $query = qq/
select id from persbudgproj
where budgprojid = '$bpid'
and personid = '$personid'/;
my @results = &::db_retrieve("mrnc",$query);
if (!@results) {
$pbp = persbudgproj->new();
$pbp->{id} = 'new';
$pbp->{budgprojid} = $bpid;
$pbp->{personid} = $::unalloc->{id};
$pbp->{hourlyrate} = 0;
$pbp->build(); # load in project, budget, person objects
} else {
my $pbpid = shift(@results);
$pbp = &::sessionObject('persbudgproj',$pbpid);
}
# get total funding for other persons
$query = qq/
select sum(budgetdollars) from persbudgproj
where budgprojid = '$bpid'
and personid <> '$personid'/;
@results = &::db_retrieve("mrnc",$query);
my $otherdollars = shift(@results);
# update and save
$pbp->{budgetdollars} = $self->{budgetproject}->{budgetdollars} - $otherdollars;
&::saveToDB('persbudgproj',$pbp);
}
#===============================================#
# package work #
#===============================================#
package work;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
# update foreign keys
sub updateFKs
{
my $self = shift;
my $obj = $self->{project};
$self->{projectid} = $obj->pk() if $obj;
$obj = $self->{person};
$self->{personid} = $obj->pk() if $obj;
$obj = $self->{company};
$self->{companyid} = $obj->pk() if $obj;
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
# bring in the project object
my $tid = $self->{projectid};
$self->{project} = &::sessionObject('project',$tid)
if length $tid;
# bring in the person object
$tid = $self->{personid};
$self->{person} = &::sessionObject('person',$tid)
if length $tid;
# bring in the company object
$tid = $self->{companyid};
$self->{company} = &::sessionObject('company',$tid)
if length $tid;
$self->{synecdoche} = $self->{person}->{synecdoche} . ":" .
$self->{date} . ":" . $self->{hours} . ":" .
$self->{project}->{synecdoche};
return $self;
}
#------------------------------
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
my $val;
if (grep (/^$col$/,qw (projectid personid companyid) ))
{
my $id = $self->{$col};
my $table = $col;
$table =~ s/id$//;
my $obj = &::sessionObject($table,$id);
$val = $obj->forTableFK() if defined $obj;
}
else { $val = $self->{$col}; }
push(@vals,$val);
}
return join('|',@vals);
}
#===============================================#
# package bug #
#===============================================#
package bug;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
# update foreign keys
sub updateFKs
{
my $self = shift;
my $obj = $self->{project};
$self->{projectid} = $obj->pk() if $obj;
$obj = $self->{assignedto};
$self->{assignedtoid} = $obj->pk() if $obj;
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
# bring in the project object
my $tid = $self->{projectid};
$self->{project} = &::sessionObject('project',$tid)
if length $tid;
# bring in the assigneto object
$tid = $self->{assignetoid};
$self->{assignedto} = &::sessionObject('companyperson',$tid)
if length $tid;
$self->{synecdoche} = $self->{bugno} . ":" .
$self->{description} . ":" . $self->{status};
return $self;
}
#------------------------------
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
my $val;
if (grep (/^$col$/,qw (projectid assignedtoid) ))
{
my $id = $self->{$col};
my $table = $col;
$table =~ s/id$//;
$table =~ s/assignedto/companyperson/;
my $obj = &::sessionObject($table,$id);
$val = $obj->forTableFK() if defined $obj;
}
else { $val = $self->{$col}; }
push(@vals,$val);
}
return join('|',@vals);
}
#===============================================#
# package buglog #
#===============================================#
package buglog;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
# update foreign keys
sub updateFKs
{
my $self = shift;
my $obj = $self->{bug};
$self->{bugid} = $obj->pk() if $obj;
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
# bring in the bug object
my $tid = $self->{bugid};
$self->{bug} = &::sessionObject('bug',$tid)
if length $tid;
$self->{synecdoche} = $self->{dateentered} . ":" .
$self->{userid};
return $self;
}
#------------------------------
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
my $val;
if (grep (/^$col$/,qw (bugid) ))
{
my $id = $self->{$col};
my $table = $col;
$table =~ s/id$//;
my $obj = &::sessionObject($table,$id);
$val = $obj->forTableFK() if defined $obj;
}
else { $val = $self->{$col}; }
push(@vals,$val);
}
return join('|',@vals);
}
#===============================================#
# package fundedactivity #
#===============================================#
package fundedactivity;
use strict;
use vars qw(@ISA);
@ISA = ("DBObject");
my @Columns = ();
sub columns # every subclass must override this method!
{
my $self = shift;
if (!@Columns)
{
@Columns = &::SchemaFor($self->{'_table_'});
splice(@Columns,-3,3); #remove bookkeeping columns
}
@Columns;
}
#------------------------------
# update foreign keys
sub updateFKs
{
my $self = shift;
my $obj = $self->{activity};
$self->{activityid} = $obj->pk() if $obj;
$obj = $self->{persbudgproj};
$self->{pbpid} = $obj->pk() if $obj;
$obj = $self->{paid};
$self->{cwid} = $obj->pk() if $obj;
}
#------------------------------
sub build
{
my $self = shift;
$self->SUPER::build(@_);
# bring in the activity object
my $tid = $self->{activityid};
my $ttype = $self->{activitytable};
$self->{activity} = &::sessionObject($ttype,$tid)
if length $tid;
# bring in the persbudgproj object
$tid = $self->{pbpid};
$self->{persbudgproj} = &::sessionObject('persbudgproj',$tid)
if length $tid;
# bring in the paid object (cashwithdrawals)
$tid = $self->{cwid};
$self->{paid} = &::sessionObject('cashwithdrawals',$tid)
if length $tid;
$self->{synecdoche} = $self->{activity}->{synecdoche} . ":" .
$self->{persbudgproj}->{synecdoche};
return $self;
}
#------------------------------
sub forTablePK
{
my $self = shift;
my @vals = ();
foreach my $col ($self->columns())
{
my $val;
if (grep (/^$col$/,qw (activityid pbpid cwid) ))
{
my $id = $self->{$col};
my $table = $col;
$table =~ s/id$//;
$table =~ s/pbp/persbudgproj/;
$table =~ s/cw/cashwithdrawals/;
my $obj = &::sessionObject($table,$id);
$val = $obj->forTableFK() if defined $obj;
}
else { $val = $self->{$col}; }
push(@vals,$val);
}
return join('|',@vals);
}
1;