From: Mark Wells Date: Wed, 25 Nov 2015 23:08:05 +0000 (-0800) Subject: add service location to RT ticket search, #19154 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=974347d88d264c60e65cbd22ac52553931b25ab8 add service location to RT ticket search, #19154 --- diff --git a/rt/lib/RT/URI/freeside/Internal.pm b/rt/lib/RT/URI/freeside/Internal.pm index 33831bcac..2b09c879b 100644 --- a/rt/lib/RT/URI/freeside/Internal.pm +++ b/rt/lib/RT/URI/freeside/Internal.pm @@ -210,8 +210,8 @@ sub CustomerResolver { sub CustomerInfo { my $self = shift; - $self = $self->CustomerResolver; return $self->{CustomerInfo} if $self->{CustomerInfo}; + $self = $self->CustomerResolver; my $rec = $self->_FreesideGetRecord() if $self; if (!$rec) { @@ -261,23 +261,33 @@ sub CustomerInfo { $info->{"bill_location"} = $bill_location->location_label(no_prefix => 1); $info->{"ship_location"} = $ship_location->location_label(no_prefix => 1); - return $self->{CustomerInfo} = $info; } sub ServiceInfo { my $self = shift; $self->{fstable} eq 'cust_svc' or return; + return $self->{ServiceInfo} if $self->{ServiceInfo}; + my $rec = $self->_FreesideGetRecord() or return; my $cust_svc = $rec->{'_object'}; my $svc_x = $cust_svc->svc_x; my $part_svc = $cust_svc->part_svc; - return $self->{ServiceInfo} ||= { + my $locationnum = $cust_svc->cust_pkg->locationnum; + my $cust_location = qsearchs('cust_location', { locationnum => $locationnum}); + my @lf = FS::cust_main->location_fields; + + # location fields are not prefixed + my $info = { $cust_svc->hash, $svc_x->hash, + $cust_location->hash, ServiceType => $part_svc->svc, Label => $self->AsString, - } + }; + $info->{'location'} = $cust_location->location_label(no_prefix => 1); + + return $self->{ServiceInfo} = $info; } 1; diff --git a/rt/share/html/Elements/ServiceFields b/rt/share/html/Elements/ServiceFields index 9c9a248c8..70eea232f 100644 --- a/rt/share/html/Elements/ServiceFields +++ b/rt/share/html/Elements/ServiceFields @@ -43,6 +43,11 @@ my @service_fields = ( # ordered OrderBy => 'Service.svcpart', }, { + Name => 'ServiceLocation', + Label => 'Service Location', + Display => svc_location_attribute('location'), + }, + { Name => 'ServiceKey', # loosely corresponds to smartsearch/label field Label => '', # not displayable @@ -118,6 +123,37 @@ sub svc_info_attribute { }; } +sub svc_location_attribute { + # Tricky: if the ticket is linked to a service, we want to return the + # service's location, but if it's not, we want to return the customer's + # default service location. + # If it's linked to Customer A and also to Service A, it should return + # Service A's location (and not Customer A's default service location). + # But if it's linked to Service A and also to Customer B, then what? We + # can't satisfy all the constraints here. + my $attribute = shift; + sub { + my @return; + my $Ticket = shift; + my @svc_resolvers = ticket_svc_resolvers($Ticket); + if (@svc_resolvers) { + warn '#' . $Ticket->id . ", service attribute $attribute\n"; + foreach my $s (@svc_resolvers) { + push @return, $s->ServiceInfo->{$attribute}, '
'; + } + } else { + warn '#' . $Ticket->id . ", customer attribute ship_$attribute\n"; + my @cust_resolvers = map $_->TargetURI->Resolver, + @{ $Ticket->Customers->ItemsArrayRef }; + foreach my $c (@cust_resolvers) { + push @return, $c->CustomerInfo->{"ship_$attribute"}, '
'; + } + } + pop @return; #trailing
+ @return; + }; +} + <%init> use Data::Dumper;