X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_main_Mixin.pm;h=5a29a4c2294ebcb254134f1fe0e102527f09a81a;hb=40a7b3dc653e099f7bd0bd762b649b04c4432db2;hp=3952f198c086e8c0579af9cf26497dea64c38316;hpb=6af586392aef95c6fe35326ced1a9073b068a78c;p=freeside.git diff --git a/FS/FS/cust_main_Mixin.pm b/FS/FS/cust_main_Mixin.pm index 3952f198c..5a29a4c22 100644 --- a/FS/FS/cust_main_Mixin.pm +++ b/FS/FS/cust_main_Mixin.pm @@ -1,10 +1,12 @@ package FS::cust_main_Mixin; use strict; -use vars qw( $DEBUG ); +use vars qw( $DEBUG $me ); +use FS::UID qw(dbh); use FS::cust_main; $DEBUG = 0; +$me = '[FS::cust_main_Mixin]'; =head1 NAME @@ -25,7 +27,12 @@ for example, from a JOINed search. See httemplate/search/ for examples. =over 4 -=item name +=cut + +sub cust_unlinked_msg { '(unlinked)'; } +sub cust_linked { $_[0]->custnum; } + +=item display_custnum Given an object that contains fields from cust_main (say, from a JOINed search; see httemplate/search/ for examples), returns the equivalent of the @@ -34,8 +41,21 @@ a customer. =cut -sub cust_unlinked_msg { '(unlinked)'; } -sub cust_linked { $_[0]->custnum; } +sub display_custnum { + my $self = shift; + $self->cust_linked + ? FS::cust_main::display_custnum($self) + : $self->cust_unlinked_msg; +} + +=item name + +Given an object that contains fields from cust_main (say, from a JOINed +search; see httemplate/search/ for examples), returns the equivalent of the +FS::cust_main I method, or "(unlinked)" if this object is not linked to +a customer. + +=cut sub name { my $self = shift; @@ -138,7 +158,7 @@ this object is not linked to a customer. sub invoicing_list_emailonly_scalar { my $self = shift; - warn "invoicing_list_email only called on $self, ". + warn "invoicing_list_emailonly called on $self, ". "custnum ". $self->custnum. "\n" if $DEBUG; $self->cust_linked @@ -165,8 +185,149 @@ sub invoicing_list { : (); } +=item status + +Given an object that contains fields from cust_main (say, from a JOINed +search; see httemplate/search/ for examples), returns the equivalent of the +FS::cust_main I method, or "(unlinked)" if this object is not linked to +a customer. + +=cut + +sub cust_status { + my $self = shift; + return $self->cust_unlinked_msg unless $self->cust_linked; + + #FS::cust_main::status($self) + #false laziness w/actual cust_main::status + # (make sure FS::cust_main methods are called) + for my $status (qw( prospect active inactive suspended cancelled )) { + my $method = $status.'_sql'; + my $sql = FS::cust_main->$method();; + my $numnum = ( $sql =~ s/cust_main\.custnum/?/g ); + my $sth = dbh->prepare("SELECT $sql") or die dbh->errstr; + $sth->execute( ($self->custnum) x $numnum ) + or die "Error executing 'SELECT $sql': ". $sth->errstr; + return $status if $sth->fetchrow_arrayref->[0]; + } +} + +=item ucfirst_cust_status + +Given an object that contains fields from cust_main (say, from a JOINed +search; see httemplate/search/ for examples), returns the equivalent of the +FS::cust_main I method, or "(unlinked)" if this object is not +linked to a customer. + =cut +sub ucfirst_cust_status { + my $self = shift; + $self->cust_linked + ? ucfirst( $self->cust_status(@_) ) + : $self->cust_unlinked_msg; +} + +=item cust_statuscolor + +Given an object that contains fields from cust_main (say, from a JOINed +search; see httemplate/search/ for examples), returns the equivalent of the +FS::cust_main I method, or "000000" if this object is not linked to +a customer. + +=cut + +sub cust_statuscolor { + my $self = shift; + + $self->cust_linked + ? FS::cust_main::cust_statuscolor($self) + : '000000'; +} + +=item prospect_sql + +=item active_sql + +=item inactive_sql + +=item suspended_sql + +=item cancelled_sql + +Given an object that contains fields from cust_main (say, from a JOINed +search; see httemplate/search/ for examples), returns the equivalent of the +corresponding FS::cust_main method, or "0" if this object is not linked to +a customer. + +=cut + +foreach my $sub (qw( prospect active inactive suspended cancelled )) { + eval " + sub ${sub}_sql { + my \$self = shift; + \$self->cust_linked + ? FS::cust_main::${sub}_sql(\$self) + : '0'; + } + "; + die $@ if $@; +} + +=item cust_search_sql + +Returns a list of SQL WHERE fragments to search for parameters specified +in HASHREF. Valid parameters are: + +=over 4 + +=item agentnum + +=item status + +=item payby + +=back + +=cut + +sub cust_search_sql { + my($class, $param) = @_; + + if ( $DEBUG ) { + warn "$me cust_search_sql called with params: \n". + join("\n", map { " $_: ". $param->{$_} } keys %$param ). "\n"; + } + + my @search = (); + + if ( $param->{'agentnum'} && $param->{'agentnum'} =~ /^(\d+)$/ ) { + push @search, "cust_main.agentnum = $1"; + } + + #status (prospect active inactive suspended cancelled) + if ( grep { $param->{'status'} eq $_ } FS::cust_main->statuses() ) { + my $method = $param->{'status'}. '_sql'; + push @search, $class->$method(); + } + + #payby + my @payby = ref($param->{'payby'}) + ? @{ $param->{'payby'} } + : split(',', $param->{'payby'}); + @payby = grep /^([A-Z]{4})$/, @payby; + if ( @payby ) { + push @search, 'cust_main.payby IN ('. join(',', map "'$_'", @payby). ')'; + } + + #here is the agent virtualization + push @search, + $FS::CurrentUser::CurrentUser->agentnums_sql( 'table' => 'cust_main' ); + + return @search; + +} + =back =head1 BUGS