#===============================================# # 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! !; } $html .= qq!
$col $val
!; $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;