'name' => 'employee groups',
'query' => { 'table' => 'access_group',
'hashref' => {},
- 'extra_sql' => 'ORDER BY groupname', #??
+ 'order_by' => 'ORDER BY groupname', #??
},
'count_query' => $count_query,
'header' => [ '#',
'disabled_statuspos' => 2,
'query' => { 'table' => 'access_user',
'hashref' => {},
- 'extra_sql' => 'ORDER BY last, first'
+ 'order_by' => 'ORDER BY last, first'
},
'count_query' => $count_query,
'header' => \@header,
'name' => 'agent types',
'query' => { 'table' => 'agent_type',
'hashref' => {},
- 'extra_sql' => 'ORDER BY typenum', # 'ORDER BY atype',
+ 'order_by' => 'ORDER BY typenum', # 'ORDER BY atype',
},
'count_query' => $count_query,
'header' => [ '#',
,
'query' => { 'table' => 'cust_attachment',
'hashref' => $hashref,
- 'extra_sql' => 'ORDER BY '.$orderby,
+ 'order_by' => 'ORDER BY '.$orderby,
},
'count_query' => $count_query,
'header' => [ selflink('#',orderby => 'attachnum'),
'disabled_statuspos' => 2,
'query' => { 'table' => 'cust_category',
'hashref' => {},
- 'extra_sql' => 'ORDER BY categorynum',
+ 'order_by' => 'ORDER BY categorynum',
},
'count_query' => $count_query,
'header' => [ '#', 'Category' ],
'disabled_statuspos' => 2,
'query' => { 'table' => 'cust_class',
'hashref' => {},
- 'extra_sql' => 'ORDER BY classnum',
+ 'order_by' => 'ORDER BY classnum',
},
'count_query' => $count_query,
'header' => $header,
'query' => { 'table' => 'discount', },
'count_query' => 'SELECT COUNT(*) FROM discount',
'disableable' => 1,
- 'disabled_statuspos' => 2,
- 'header' => [ '#', 'Name', 'Discount', ],
- 'fields' => [ 'discountnum',
- 'name',
+ 'disabled_statuspos' => 1,
+ 'header' => [ 'Name', 'Discount', ],
+ 'fields' => [ 'name',
'description',
],
'links' => [ $link,
- $link,
+ '',
],
)
%>
'disabled_statuspos' => 2,
'query' => { 'table' => 'part_pkg_report_option',
'hashref' => {},
- 'extra_sql' => 'ORDER BY name',
+ 'order_by' => 'ORDER BY name',
},
'count_query' => 'SELECT COUNT(*) FROM part_pkg_report_option',
'header' => [ '#', 'Class' ],
'disabled_statuspos' => 3,
'query' => { 'table' => 'pkg_category',
'hashref' => {},
- 'extra_sql' => 'ORDER BY categorynum',
+ 'order_by' => 'ORDER BY categorynum',
},
'count_query' => $count_query,
'header' => [ '#', 'Category', 'Weight', 'Condense' ],
'disabled_statuspos' => 2,
'query' => { 'table' => 'pkg_class',
'hashref' => {},
- 'extra_sql' => 'ORDER BY classnum',
+ 'order_by' => 'ORDER BY classnum',
},
'count_query' => $count_query,
'header' => $header,
'name' => 'rate plans',
'query' => { 'table' => 'rate',
'hashref' => {},
- 'extra_sql' => 'ORDER BY ratenum',
+ 'order_by' => 'ORDER BY ratenum',
},
'count_query' => $count_query,
'header' => [ '#', 'Rate plan', 'Rates' ],
',
'table' => 'svc_acct_pop',
#'hashref' => { 'disabled' => '' },
- 'extra_sql' => 'ORDER BY state, city, ac, exch, loc',
+ 'order_by' => 'ORDER BY state, city, ac, exch, loc',
};
my $count_query = "SELECT COUNT(*) FROM svc_acct_pop"; # WHERE DISABLED IS NULL OR DISABLED = ''";
'disabled_statuspos' => 2,
'query' => { 'table' => 'usage_class',
'hashref' => {},
- 'extra_sql' => 'ORDER BY classnum',
+ 'order_by' => 'ORDER BY classnum',
},
'count_query' => 'SELECT COUNT(*) FROM usage_class',
'header' => [ '#',
sub { time2str('%b %d %Y', shift->_date ) },
\&FS::UI::Web::cust_fields,
],
+ 'sort_fields' => [
+ 'COALESCE( agent_invid, invnum )',
+ FS::cust_bill->owed_sql,
+ FS::cust_bill->net_sql,
+ 'charged',
+ '_date',
+ ],
'align' => 'rrrrl'.FS::UI::Web::cust_aligns(),
'links' => [
$link,
FS::UI::Web::cust_sql_fields(),
),
'hashref' => {},
- 'extra_sql' => "$where ORDER BY _date ASC",
+ 'extra_sql' => $where,
+ 'order_by' => 'ORDER BY _date ASC',
'addl_from' => $join,
};
sub { shift->cust_pay_otaker },
\&FS::UI::Web::cust_fields,
],
+ 'sort_fields' => [
+ 'amount',
+ 'invnum',
+ 'cust_bill_charged',
+ 'cust_bill_date',
+ '',
+ 'cust_pay_paid',
+ 'cust_pay_date',
+ '',
+ ],
'align' => 'rrrrlrrl'.FS::UI::Web::cust_aligns(),
'links' => [
'',
sub { time2str('%b %d %Y', shift->_date ) },
\&FS::UI::Web::cust_fields,
],
+ 'sort_fields' => [
+ 'setup', #broken in $unearned case i guess
+ ( $unearned ? ('', '') : () ),
+ ( $use_usage eq 'recurring' ? 'recur - usage' :
+ $use_usage eq 'usage' ? 'usage'
+ : 'recur'
+ ),
+ ( $undearned ? ('sdate', 'edate') : () ),
+ 'invnum',
+ '_date',
+ ],
'links' => [
#'',
'',
sub { time2str('%b %d %Y', shift->_date ) },
\&FS::UI::Web::cust_fields,
],
+ 'sort_fields' => [
+ '',
+ 'amount',
+ 'months',
+ 'pkg',
+ 'invnum',
+ '_date',
+ ],
'links' => [
#'',
'', #link to customer discount???
#'redirect' => $link,
'header' => \@header,
'fields' => \@fields,
+ 'sort_fields' => \@sort_fields,
'align' => $align,
'links' => \@links,
'color' => \@color,
: '';
};
-my (@header, @fields, $align, @links, @color, @style);
+my (@header, @fields, @sort_fields, $align, @links, @color, @style);
$align = '';
#amount
push @header, 'Amount';
push @fields, sub { $money_char .sprintf('%.2f', shift->amount) };
+push @sort_fields, 'amount';
$align .= 'r';
push @links, '';
push @color, '';
if ($unapplied) {
push @header, 'Unapplied';
push @fields, sub { $money_char .sprintf('%.2f', shift->unapplied_amount) };
+ push @sort_fields, '';
$align .= 'r';
push @links, '';
push @color, '';
'reason',
\&FS::UI::Web::cust_fields,
;
+push @sort_fields, '_date', 'otaker', 'reason';
$align .= 'rll'.FS::UI::Web::cust_aligns(),
push @links, '',
'',
sub { shift->cust_credit->reason },
\&FS::UI::Web::cust_fields,
],
+ 'sort_fields' => [
+ 'amount',
+ 'invnum',
+ 'cust_credit_amount', #?
+ '', #'otaker' #this is usernum now
+ '',
+ ],
'align' => 'rrrll'.FS::UI::Web::cust_aligns(),
'links' => [
'',
sub { shift->cust_refund->otaker },
\&FS::UI::Web::cust_fields,
],
+ 'sort_fields' => [
+ 'amount',
+ '', #cust_credit_amount? cust_credit_date? prolly split field
+ '', #_date? cust_refund_refund? also split
+ ],
'align' => 'rrrl'.FS::UI::Web::cust_aligns(),
'links' => [
'',
FS::UI::Web::cust_sql_fields(),
),
'hashref' => {},
- 'extra_sql' => "$where ORDER BY _date ASC",
+ 'extra_sql' => $where,
+ 'order_by' => 'ORDER BY _date ASC',
'addl_from' => $join,
};
'table' => 'cust_svc',
'addl_from' => $addl_from,
'hashref' => {},
- 'extra_sql' => "$extra_sql $orderby",
+ 'extra_sql' => $extra_sql,
+ 'order_by' => $orderby,
};
#warn Dumper($sql_query)."\n";
'table' => 'cust_svc',
'addl_from' => $addl_from,
'hashref' => {},
- 'extra_sql' => "$extra_sql $orderby",
+ 'extra_sql' => $extra_sql,
+ 'order_by' => $orderby,
};
my $count_query = "SELECT COUNT(*) FROM cust_svc $addl_from $extra_sql";
'redirect_empty' => $opt{'redirect_empty'},
'header' => \@header,
'fields' => \@fields,
+ 'sort_fields' => \@sort_fields,
'align' => $align,
'links' => \@links,
'color' => \@color,
my @header = ();
my @fields = ();
+my @sort_fields = ();
my $align = '';
my @links = ();
if ( $opt{'pre_header'} ) {
$align .= 'c' x scalar(@{ $opt{'pre_header'} });
push @links, map '', @{ $opt{'pre_header'} };
push @fields, @{ $opt{'pre_fields'} };
+ push @sort_fields, @{ $opt{'pre_fields'} };
}
push @header, "\u$name_singular",
push @fields, 'payby_payinfo_pretty',
sub { sprintf('$%.2f', shift->$amount_field() ) },
;
+push @sort_fields, '', $amount_field;
if ( $unapplied ) {
push @header, 'Unapplied';
$align .= 'r';
push @links, '';
push @fields, sub { sprintf('$%.2f', shift->unapplied_amount) };
+ push @sort_fields, '';
}
push @header, 'Date';
$align .= 'r';
push @links, '';
push @fields, sub { time2str('%b %d %Y', shift->_date ) };
+push @sort_fields, '_date';
unless ( $opt{'disable_by'} ) {
push @header, 'By';
'table' => $table,
'select' => join(', ', @select),
'hashref' => {},
- 'extra_sql' => "$search $group_by ORDER BY $orderby",
+ 'extra_sql' => "$search $group_by",
+ 'order_by' => "ORDER BY $orderby",
'addl_from' => $addl_from,
};
<TR>
% my $h2 = 0;
% my $colspan = 0;
+% my @fields = @{ $opt{'sort_fields'} || $opt{'fields'}};
+% my $order_by = $cgi->param('order_by');
% foreach my $header ( @{ $opt{header} } ) {
+%
+% my $field = shift @fields;
+%
% $colspan-- if $colspan > 0;
% next if $colspan;
%
% my $label = ref($header) ? $header->{label} : $header;
+% unless ( ref($field) || !$field ) {
+% if ( $order_by eq $field ) {
+% $cgi->param('order_by', "$field DESC");
+% } else {
+% $cgi->param('order_by', $field);
+% }
+% $label = qq(<A HREF="$self_url?). $cgi->query_string.
+% qq(">$label</A>);
+% }
+%
% $colspan = ref($header) ? $header->{colspan} : 0;
% my $rowspan = 1;
% my $style = '';
# qsearch hashref and header & fields need to
# be defined)
- # link & display properties for fields
+ # sort, link & display properties for fields
+
+ 'sort_fields' => [], #optional list of field names or SQL expressions for
+ # sorts
#listref - each item is the empty string,
# or a listref of link and method name to append,
}
+#order by override
+my $order_by = '';
+#if ( $cgi->param('order_by') =~ /^([\w\, ]+)$/ ) {
+# $order_by = $1;
+#}
+$order_by = $cgi->param('order_by') if $cgi->param('order_by');
+
# run the query
my $header = [ map { ref($_) ? $_->{'label'} : $_ } @{$opt{header}} ];
my @query;
if (ref($opt{query}) eq 'HASH') {
@query = ( $opt{query} );
+
+ if ( $order_by ) {
+ if ( $opt{query}->{'order_by'} ) {
+ if ( $opt{query}->{'order_by'} =~ /^(\s*ORDER\s+BY\s+)?(\S.*)$/is ) {
+ $opt{query}->{'order_by'} = "ORDER BY $order_by, $2";
+ } else {
+ warn "unparsable query order_by: ". $opt{query}->{'order_by'};
+ die "unparsable query order_by: ". $opt{query}->{'order_by'};
+ }
+ } else {
+ $opt{query}->{'order_by'} = "ORDER BY $order_by";
+ }
+ }
+
} elsif (ref($opt{query}) eq 'ARRAY') {
@query = @{ $opt{query} };
} else {
'name_singular' => 'batch',
'query' => { 'table' => 'pay_batch',
'hashref' => $hashref,
- 'extra_sql' => "$extra_sql ORDER BY batchnum DESC",
+ 'extra_sql' => $extra_sql,
+ 'order_by' => 'ORDER BY batchnum DESC',
},
'count_query' => "$count_query $extra_sql",
'header' => [ 'Batch',
'html_form' => qq!<FORM NAME="jobForm" ACTION="$p/misc/queue.cgi" METHOD="POST">!,
'query' => { 'table' => 'queue',
'hashref' => $hashref,
- 'extra_sql' => 'ORDER BY jobnum',
+ 'order_by' => 'ORDER BY jobnum',
},
'count_query' => $count_query,
'header' => [ '#',
'cust_main.custnum',
FS::UI::Web::cust_sql_fields(),
),
- 'extra_sql' => "$extra_sql $orderby",
+ 'extra_sql' => $extra_sql,
+ 'order_by' => $orderby,
'addl_from' => $addl_from,
};
'cust_main.custnum',
FS::UI::Web::cust_sql_fields(),
),
- 'extra_sql' => "$extra_sql $orderby",
+ 'extra_sql' => $extra_sql,
+ 'order_by' => $orderby,
'addl_from' => $addl_from,
};
'cust_main.custnum',
FS::UI::Web::cust_sql_fields(),
),
- 'extra_sql' => "$extra_sql $orderby",
+ 'extra_sql' => $extra_sql,
+ 'order_by' => $orderby,
'addl_from' => $addl_from,
};
'cust_main.custnum',
FS::UI::Web::cust_sql_fields(),
),
- 'extra_sql' => "$extra_sql $orderby",
+ 'extra_sql' => $extra_sql,
+ 'order_by' => $orderby,
'addl_from' => $addl_from,
};
'cust_main.custnum',
FS::UI::Web::cust_sql_fields(),
),
- 'extra_sql' => "$extra_sql $orderby",
+ 'extra_sql' => $extra_sql,
+ 'order_by' => $orderby,
'addl_from' => $addl_from,
};