[freeside-commits] freeside/rt/share/html/Elements CustomerFields, NONE, 1.1 SelectCustomerAgent, 1.1, NONE SelectCustomerClass, 1.1, NONE SelectCustomerReferral, 1.1, NONE SelectCustomerTag, 1.1, NONE
Mark Wells
mark at wavetail.420.am
Sat Feb 18 16:34:35 PST 2012
Update of /home/cvs/cvsroot/freeside/rt/share/html/Elements
In directory wavetail.420.am:/tmp/cvs-serv30419/rt/share/html/Elements
Added Files:
CustomerFields
Removed Files:
SelectCustomerAgent SelectCustomerClass SelectCustomerReferral
SelectCustomerTag
Log Message:
improve customer field access in RT queries, #16490
--- SelectCustomerAgent DELETED ---
--- SelectCustomerTag DELETED ---
--- SelectCustomerClass DELETED ---
--- SelectCustomerReferral DELETED ---
--- NEW FILE: CustomerFields ---
<%doc>
All accessible Freeside customer fields fields go in here. Those of
them outside cust_main also need to go in RT::URI::freeside::Internal
(where they should be pulled into CustomerInfo). Nothing should need
to go in RT::Tickets_Overlay; it already resolves "Customer.foo" as
"cust_main.foo", and "Customer.cust_bar.foo" as "JOIN cust_bar using
(custnum) ... cust_bar.foo".
About the keys:
- 'Value' makes the field a search criterion. This also requires 'Op'.
See Search/Elements/PickBasics.
- 'Display' makes it an output column, and is either the cust_main
field, the CustomerInfo key, or a coderef that takes the RT::Ticket
as an argument.
- 'OrderBy' makes it a sort key, and must be set to an RT-SQL field
name to sort by.
</%doc>
<%once>
return unless $RT::URI::freeside::IntegrationType eq 'Internal';
my @customer_fields = ( # ordered
{
# custnum
Name => 'Customer',
Label => 'Customer',
Display => sub {
my $Ticket = shift;
my @return = ();
foreach my $c (ticket_cust_resolvers($Ticket)) {
push @return, \'<A HREF="', $c->HREF, \'">',
$c->AsString,
\'</A>',
\'<BR>';
}
pop @return;
@return;
},
OrderBy => 'Customer.Number',
},
{
#Column name (format string)
Name => 'Agent',
# Column heading/query builder name
Label => 'Agent',
# Column value (coderef, cust_main field, or CustomerInfo key)
Display => 'AgentName',
# Query builder options
# RT-SQL field, defaults to Name
QueryName => 'Customer.agentnum',
#QueryLabel => 'Agent' #defaults to Label
Op => equals_notequals,
Value => select_table('agent', 'agentnum', 'agent'),
# RT-SQL sort key (if any)
OrderBy => 'Customer.agentnum',
},
{
Name => 'CustomerClass',
Label => 'Customer Class',
Display => 'CustomerClass',
QueryName => 'Customer.classnum',
Op => equals_notequals,
Value => select_table('cust_class', 'classnum', 'classname'),
OrderBy => 'Customer.classnum',
},
{
Name => 'AdvertisingSource',
Label => 'Advertising Source',
Display => 'Referral',
QueryName => 'Customer.refnum',
Op => equals_notequals,
Value => select_table('part_referral', 'refnum', 'referral'),
OrderBy => 'Customer.refnum',
},
{
Name => 'BillingType',
Label => 'Billing Type',
Display => 'BillingType',
QueryName => 'Customer.payby',
Op => equals_notequals,
Value => {
Type => 'select',
Options => [ '' => '-',
map { $_, FS::payby->longname($_) } FS::payby->cust_payby
],
},
},
{
Name => 'InvoiceEmail',
Label => 'Invoice Email',
Display => 'InvoiceEmail',
# query/sort needed?
},
{
Name => 'City',
Label => 'City',
Display => 'city',
OrderBy => 'Customer.city',
},
{
Name => 'State',
Label => 'State',
Display => 'state',
OrderBy => 'Customer.state',
},
{
Name => 'CustomerTags',
Label => '',
Display => sub {
my $Ticket = shift;
my @return = ();
foreach my $c (ticket_cust_resolvers($Ticket)) {
foreach my $t (@{ $c->CustomerInfo->{CustomerTags} }) {
push @return, \'<SPAN style="background-color:#',
$t->{'color'},
\';"> ',
$t->{'name'},
\' </SPAN>',
\' '
;
}
pop @return;
push @return, \'<BR>';
}
pop @return;
@return;
},
QueryName => 'Customer.cust_tag.tagnum',
QueryLabel => 'Tag',
Op => equals_notequals,
Value => select_table('part_tag', 'tagnum', 'tagname'),
OrderBy => '',
},
);
#helper subs
#Op
sub equals_notequals {
return {
Type => 'component',
Path => '/Elements/SelectBoolean',
Arguments => { TrueVal=> '=', FalseVal=> '!=' },
}
}
#Value
sub select_table {
my ($table, $value_col, $name_col, $hashref) = @_;
$hashref ||= { disabled => '' }; # common case
return {
Type => 'select',
Options => [
'' => '-',
map { $_->$value_col, $_->$name_col }
qsearch($table, $hashref)
],
}
}
sub ticket_cust_resolvers {
my $Ticket = shift;
my @Customers = @{ $Ticket->Customers->ItemsArrayRef };
return map $_->TargetURI->Resolver, @Customers;
}
sub cust_info_attribute { # the simple case of $resolver->CustomerInfo->{foo}
my $attribute = shift;
sub {
my $Ticket = shift;
my @return;
foreach my $c (ticket_cust_resolvers($Ticket)) {
push @return, $c->CustomerInfo->{$attribute}, '<BR>';
}
pop @return; #trailing <BR>
@return;
};
}
</%once>
<%init>
return unless $RT::URI::freeside::IntegrationType eq 'Internal';
my $arg = shift;
if ( $arg eq 'Names' ) {
return map { $_->{Name} } @customer_fields;
}
elsif ( $arg eq 'ColumnMap' ) {
return map {
my $f = $_;
$f->{Name} => {
title => $f->{Label},
attribute => $f->{OrderBy} || '',
value => ref($f->{Display}) eq 'CODE' ?
$f->{Display} :
cust_info_attribute($f->{Display})
}
} #map
grep { exists $_->{Display} }
@customer_fields;
}
elsif ( $arg eq 'PickBasics' ) {
return map {
my $f = $_;
{
Name => ($f->{QueryName} || $f->{Name}),
Field => ($f->{QueryLabel} || $f->{Label}),
Op => $f->{Op},
Value => $f->{Value},
}
} #map
grep { exists $_->{Value} }
@customer_fields;
}
else { die "unknown CustomerFields mode '$arg'\n"; }
</%init>
More information about the freeside-commits
mailing list