# BEGIN LICENSE BLOCK # # Copyright (c) 2004 Kristian Hoffmann # Based on the original RT::URI::base and RT::URI::fsck_com_rt. # # Copyright (c) 1996-2003 Jesse Vincent # # (Except where explictly superceded by other copyright notices) # # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have # been provided with this software, but in any event can be snarfed # from www.gnu.org. # # This work is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # Unless otherwise specified, all modifications, corrections or # extensions to this work which alter its source code become the # property of Best Practical Solutions, LLC when submitted for # inclusion in the work. # # # END LICENSE BLOCK package RT::URI::freeside; use base qw( RT::URI::base ); use strict; use vars qw( $IntegrationType $URL ); use Carp qw( cluck ); =head1 NAME RT::URI::freeside =head1 DESCRIPTION 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; } =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'); } =item _FreesideURILabel Method that returns a short string describing the customer referenced in the URI. =cut sub _FreesideURILabel { my $self = shift; #$RT::Logger->debug("Called _FreesideURILabel()"); return unless (exists($self->{'fstable'}) and exists($self->{'fspkey'})); 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; } } =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*)$/) { $table = $1; $pkey = $2; unless ( $pkey ) { cluck "bad URL $uri"; return(undef); } $self->{'scheme'} = $self->Scheme; } else { return(undef); } $self->{'uri'} = "${uriprefix}/${table}/${pkey}"; $self->{'fstable'} = $table; $self->{'fspkey'} = $pkey; my $url = $self->FreesideURL(); if ($url ne '') { $self->{'href'} = "${url}/view/${table}.cgi?${pkey}"; } else { $self->{'href'} = $self->{'uri'}; } $self->{'uri'}; } sub Scheme { my $self = shift; return('freeside'); } sub HREF { my $self = shift; return($self->{'href'} || $self->{'uri'}); } sub IsLocal { my $self = shift; return undef; } =item AsString Return a "pretty" string representing the URI object. This is meant to be used like this: % $re = $uri->Resolver; <% $re->AsString %> =cut sub AsString { my $self = shift; my $prettystring; 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; } } $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;