X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FURI%2Ffreeside.pm;h=6194fd0cb338b5821d2b287ecaa447260f2b8739;hb=7b125e587a4d1ee0aca692e23ea7897f671855ae;hp=bfb514df892436d2900ae2155b30f78b08c05cfa;hpb=7c4645bf020a5ce35079008f5eeab6698c5362d5;p=freeside.git diff --git a/rt/lib/RT/URI/freeside.pm b/rt/lib/RT/URI/freeside.pm index bfb514df8..6194fd0cb 100644 --- a/rt/lib/RT/URI/freeside.pm +++ b/rt/lib/RT/URI/freeside.pm @@ -26,93 +26,188 @@ # END LICENSE BLOCK package RT::URI::freeside; -use RT::URI::base; +use base qw( RT::URI::base ); use strict; -use vars qw(@ISA); - -@ISA = qw/RT::URI::base/; +use vars qw( $IntegrationType $URL ); +use Carp qw( cluck ); =head1 NAME -RT::URI::base +RT::URI::freeside =head1 DESCRIPTION -URI handler for freeside URIs. See http://www.sisd.com/freeside/ for -more information on freeside. +URI handler for Freeside URIs. See http://www.freeside.biz/ for more +information on Freeside. + + +=head1 Public subroutines + +=over 4 + +=item FreesideGetConfig CONFKEY + +Subroutine that returns the freeside's configuration value(s) for CONFKEY +as a scalar or list. =cut +sub FreesideGetConfig { return undef; } + + +=item FreesideURL + +Returns the URL for freeside's web interface. + +=cut + +sub FreesideURL { return $URL; } + + +=item FreesideVersion + +Returns a string describing the freeside version being used. + +=cut + +sub FreesideVersion { return undef; } + + +=item smart_search + +A wrapper for the FS::cust_main::smart_search subroutine. + +=cut + +sub smart_search { return undef; } + -sub FreesideURIPrefix { +=item small_custview + +A wrapper for the FS::CGI::small_custview subroutine. + +=cut + +sub small_custview { return 'Freeside integration error!'; } + + +=back + +=head1 Private methods + +=over 4 + +=item _FreesideGetRecord + +Method returns a hashref of the freeside record referenced in the URI. +Must be called after ParseURI. + +=cut + +sub _FreesideGetRecord { return undef; } + + +=item _FreesideURIPrefix + +Method that returns the URI prefix for freeside URIs. + +=cut + +sub _FreesideURIPrefix { my $self = shift; return($self->Scheme . '://freeside'); } -sub FreesideURILabel { - - my $self = shift; +=item _FreesideURILabel - return(undef) unless (exists($self->{'fstable'}) and - exists($self->{'fspkey'})); +Method that returns a short string describing the customer referenced +in the URI. - my $label; - my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); +=cut - eval { - use FS::UID qw(dbh); - use FS::Record qw(qsearchs qsearch dbdef); - eval "use FS::$table;"; - use FS::cust_svc; +sub _FreesideURILabel { - my $dbdef = dbdef or die "No dbdef"; - my $pkeyfield = $dbdef->table($table)->primary_key - or die "No primary key for table $table"; + my $self = shift; - my $rec = qsearchs($table, { $pkeyfield => $pkey }) - or die "Record with $pkeyfield == $pkey does not exist in table $table"; + #$RT::Logger->debug("Called _FreesideURILabel()"); - if ($table =~ /^svc_/) { - if ($rec->can('cust_svc')) { - my $cust_svc = $rec->cust_svc or die '$rec->cust_svc failed'; - my ($svc, $tag, $svcdb) = $cust_svc->label; - $label = "Freeside service ${svc}: ${tag}"; - } - } elsif ($table eq 'cust_main') { - my ($last, $first, $company) = map { $rec->getfield($_) } - qw(last first company); - $label = "Freeside customer ${last}, ${first}"; - $label .= ($company ne '') ? " with ${company}" : ''; - } else { - $label = "Freeside ${table}, ${pkeyfield} == ${pkey}"; - } + return unless (exists($self->{'fstable'}) and + exists($self->{'fspkey'})); - #... other cases + my $label; + my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); - }; + #if ($table ne 'cust_main') { + # warn "FS::${table} not currently supported"; + # return; + #} + + my $rec = $self->_FreesideGetRecord(); + + if (ref($rec) eq 'HASH' && $table eq 'cust_main') { + my $name = $rec->{'last'} . ', ' . $rec->{'first'}; + $name = $rec->{'company'} . " ($name)" if $rec->{'company'}; + $label = "$pkey: $name"; + } elsif ( $table eq 'cust_svc' && ref($rec) && $rec->{'_object'} ) { + #Internal only + my($l,$v) = $rec->{'_object'}->label; + $label = "$l: $v"; + } else { + $label = "$pkey: $table"; + } if ($label and !$@) { return($label); } else { - return(undef); + return; } - } +=item _FreesideURILabelLong + +Method that returns a longer string describing the customer referenced +in the URI. + +=cut + +sub _FreesideURILabelLong { + + my $self = shift; + + return $self->_FreesideURILabel(); + +} + +=back + +=head1 Public methods + +=over 4 + +=cut + sub ParseURI { my $self = shift; my $uri = shift; my ($table, $pkey); - my $uriprefix = $self->FreesideURIPrefix; - if ($uri =~ /^$uriprefix\/(\w+)\/(\d+)$/) { + my $uriprefix = $self->_FreesideURIPrefix; + if ($uri =~ /^$uriprefix\/(\w+)\/(\d*)$/) { + $table = $1; $pkey = $2; + + unless ( $pkey ) { + cluck "bad URL $uri"; + return(undef); + } + $self->{'scheme'} = $self->Scheme; + } else { return(undef); } @@ -121,22 +216,13 @@ sub ParseURI { $self->{'fstable'} = $table; $self->{'fspkey'} = $pkey; - my $p; - - eval { - use FS::UID qw(dbh); - use FS::CGI qw(popurl); - - if (dbh) { - $p = popurl(3); - } - }; + my $url = $self->FreesideURL(); - if ($@ or (!$p)) { - $self->{'href'} = $self->{'uri'}; + if ($url ne '') { + $self->{'href'} = "${url}/view/${table}.cgi?${pkey}"; } else { - $self->{'href'} = "${p}view/${table}.cgi?${pkey}"; + $self->{'href'} = $self->{'uri'}; } $self->{'uri'}; @@ -159,7 +245,7 @@ sub IsLocal { return undef; } -=head2 AsString +=item AsString Return a "pretty" string representing the URI object. @@ -173,16 +259,39 @@ This is meant to be used like this: sub AsString { my $self = shift; my $prettystring; - if ($prettystring = $self->FreesideURILabel) { + if ($prettystring = $self->_FreesideURILabel) { + return $prettystring; + } else { + return $self->URI; + } +} + +=item AsStringLong + +Return a longer (HTML) string representing the URI object. + +=cut + +sub AsStringLong { + my $self = shift; + my $prettystring; + if ($prettystring = $self->_FreesideURILabelLong || $self->_FreesideURILabel){ return $prettystring; } else { return $self->URI; } } -eval "require RT::URI::base_Vendor"; -die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI/base_Vendor.pm}); -eval "require RT::URI::base_Local"; -die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI/base_Local.pm}); +$IntegrationType ||= 'Internal'; +eval "require RT::URI::freeside::${RT::URI::freeside::IntegrationType}"; +warn $@ if $@; +if ($@ && + $@ !~ qr(^Can't locate RT/URI/freeside/${RT::URI::freeside::IntegrationType}.pm)) { + die $@; +}; + +=back + +=cut 1;