# 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
-sub FreesideURIPrefix {
+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; }
+
+
+=item email_search
+
+A wrapper for the FS::cust_main::email_search subroutine.
+
+=cut
+
+sub email_search { return undef; }
+
+
+=item small_custview
+
+A wrapper for the FS::CGI::small_custview subroutine.
+
+=cut
+
+sub small_custview { return 'Freeside integration error!</A>'; }
+
+
+=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 {
+=item _FreesideURILabel
- my $self = shift;
-
- 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 ) {
+ #way too noisy, using this prefix is normal usage# cluck "bad URL $uri";
+ return(undef);
+ }
+
$self->{'scheme'} = $self->Scheme;
+
} else {
return(undef);
}
$self->{'fstable'} = $table;
$self->{'fspkey'} = $pkey;
- my $p;
- eval {
- use FS::UID qw(dbh);
- use FS::CGI qw(popurl);
+ my $url = $self->FreesideURL();
- if (dbh) {
- $p = popurl(3);
- }
-
- };
-
- 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'};
return undef;
}
-=head2 AsString
+=item AsString
Return a "pretty" string representing the URI object.
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 $@;
+};
+
+=item CustomerInfo
+
+Return a hashref of customer information, including all fields from
+C<cust_main> as well as:
+
+- AgentName: the name of the customer's agent
+- CustomerClass: the name of the customer's class
+- CustomerTags: an arrayref of tags attached to the customer, each
+ as a hashref with keys "name", "desc", and "color".
+- Referral: the name of the customer's advertising source.
+
+=cut
+
+sub CustomerInfo { {} }
1;