summaryrefslogtreecommitdiff
path: root/httemplate
diff options
context:
space:
mode:
authormark <mark>2012-02-15 01:32:10 +0000
committermark <mark>2012-02-15 01:32:10 +0000
commitc6e4f9460f44a7440ef2fa7e67ed51dfe40a7668 (patch)
treee9df9004013e69645978fa0a3e1c66ad8c7ad6c2 /httemplate
parentca7ff572923114a72daae24e85f33ad89ebb5ab9 (diff)
query billing events to see affected objects, #15142
Diffstat (limited to 'httemplate')
-rw-r--r--httemplate/browse/part_event.html33
-rw-r--r--httemplate/search/elements/search-html.html9
-rwxr-xr-xhttemplate/view/cust_pkg.cgi11
-rw-r--r--httemplate/view/part_event-targets.html128
4 files changed, 176 insertions, 5 deletions
diff --git a/httemplate/browse/part_event.html b/httemplate/browse/part_event.html
index f68f06b9f..6be28602d 100644
--- a/httemplate/browse/part_event.html
+++ b/httemplate/browse/part_event.html
@@ -22,14 +22,14 @@
'Action',
],
'fields' => [ 'eventpart',
- 'event',
+ $event_sub,
$eventtable_sub,
$check_freq_sub,
$conditions_sub,
$action_sub,
],
'links' => [ $link,
- $link,
+ '',
'',
'',
'',
@@ -40,6 +40,33 @@
%>
<%once>
+my $link = [ $p.'edit/part_event.html?', 'eventpart' ];
+
+my $event_sub = sub {
+ my $part_event = shift;
+ my $onclick = include('/elements/popup_link_onclick.html',
+ action => $p.'view/part_event-targets.html?'.$part_event->eventpart,
+ actionlabel => 'Event query - '.$part_event->event,
+ width => 650,
+ height => 420,
+ close_text => 'Close',
+ );
+ [#rows
+ [#subcolumns
+ {
+ 'data' => $part_event->event,
+ 'link' => $p.'edit/part_event.html?'.$part_event->eventpart,
+ },
+ {
+ 'data' => ' (query) ',
+ 'size' => '-1',
+ 'data_style' => 'b',
+ 'onclick' => $onclick,
+ },
+ ],
+ ];
+};
+
my $eventtable_labels = FS::part_event->eventtable_labels;
my $eventtable_sub = sub { $eventtable_labels->{ shift->eventtable }; };
@@ -131,8 +158,6 @@ my $action_sub = sub {
};
-my $link = [ $p.'edit/part_event.html?', 'eventpart' ];
-
</%once>
<%init>
diff --git a/httemplate/search/elements/search-html.html b/httemplate/search/elements/search-html.html
index d1f4b2f1e..af0c8fc09 100644
--- a/httemplate/search/elements/search-html.html
+++ b/httemplate/search/elements/search-html.html
@@ -296,6 +296,11 @@
% ? '<A HREF="'. $e->{'link'}. '">'
% : ''
% ).
+% ( $e->{'onclick'} # don't use with 'link'
+% ? '<A HREF="#" onclick="' .
+% $e->{'onclick'}.'">'
+% : ''
+% ).
% ( $e->{'size'}
% ? '<FONT SIZE="'.uc($e->{'size'}).'">'
% : ''
@@ -310,7 +315,9 @@
% : ''
% ).
% ( $e->{'size'} ? '</FONT>' : '' ).
-% ( $e->{'link'} ? '</A>' : '' ).
+% ( $e->{'link'} || $e->{'onclick'}
+% ? '</A>'
+% : '' ).
% '</td>';
%
% } @$rowref ).
diff --git a/httemplate/view/cust_pkg.cgi b/httemplate/view/cust_pkg.cgi
new file mode 100755
index 000000000..d8a0041ee
--- /dev/null
+++ b/httemplate/view/cust_pkg.cgi
@@ -0,0 +1,11 @@
+<% $cgi->redirect($path) %>
+<%init>
+# since cust_pkgs can't be viewed directly, just throw a redirect
+my ($pkgnum) = $cgi->keywords;
+$pkgnum =~ /^\d+$/ or die "invalid pkgnum '$pkgnum'";
+my $show = $FS::CurrentUser::CurrentUser->default_customer_view =~ /^(jumbo|packages)$/ ? '' : ';show=packages';
+
+my $self = FS::cust_pkg->by_key($pkgnum) or die "pkgnum $pkgnum not found";
+my $frag = 'cust_pkg'. $self->pkgnum;
+my $path = $p.'view/cust_main.cgi?custnum='.$self->custnum.";$show#$frag";
+</%init>
diff --git a/httemplate/view/part_event-targets.html b/httemplate/view/part_event-targets.html
new file mode 100644
index 000000000..c5faccfd6
--- /dev/null
+++ b/httemplate/view/part_event-targets.html
@@ -0,0 +1,128 @@
+<& /elements/header-popup.html,
+ {
+ 'title' => 'Event query - '.$part_event->event,
+ }
+&>
+% if ( $objects > 0 ) {
+ <% emt("[quant,_1,$label]", $objects) %>
+% if ( $part_event->eventtable ne 'cust_main' ) {
+ <% emt("belonging to [quant,_1,customer]", $customers) %>
+% }
+<BR><BR>
+<TABLE class="grid" cellspacing=0 width="100%" style="font-size:80%">
+ <TR style='background-color:#cccccc'>
+% foreach my $header ('Trigger', @cust_header, @header) {
+ <TH><% $header %></TH>
+% }
+ </TR>
+
+% my @rowcolors = ('ffffff','eeeeee');
+% my $row = 0;
+ <TR style="background-color:#<% $rowcolors[$row++ % 2] %>">
+% foreach my $object (@targets) {
+% # now works for all eventtables, including cust_pkg
+% my $link = $p . 'view/' . $part_event->eventtable . '.cgi?' .
+% $object->$pkey;
+ <TD><A target="_blank" href="<% $link %>">
+ <% ucfirst $label %> #<% $object->$pkey %></A></TD>
+
+% my $cust_main = $object->cust_main; # via Mixin
+% my $i = 0; # hack to avoid messing with cust_aligns/colors/styles
+% foreach (@cust_fields) {
+% if ($cust_header[$i] eq 'Cust. Status') {
+ <TD style="text-align:center;
+ font-weight:bold;
+ color:#<% $cust_main->cust_statuscolor %>"><% $_->($cust_main) %></TD>
+% }
+% else {
+ <TD><% $_->($cust_main) %></TD>
+% }
+% $i++;
+% } #foreach @cust_fields
+
+% foreach (@fields) {
+ <TD><% ref($_) eq 'CODE' ? $_->($object) : $object->$_ %></TD>
+% }
+ </TR>
+% } #foreach $object
+
+</TABLE>
+
+% } #object > 0
+% else {
+
+<% emt("No matching ${label}s found.") %>
+
+%}
+<& /elements/footer.html &>
+<%once>
+use List::MoreUtils qw(uniq);
+</%once>
+<%init>
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+die "access denied"
+ unless $curuser->access_right('Edit billing events')
+ || $curuser->access_right('Edit global billing events');
+
+my ($eventpart) = $cgi->keywords;
+$eventpart =~ /^\d+$/ or die 'illegal eventpart';
+
+my $part_event = FS::part_event->by_key($eventpart)
+ or die "Event definition $eventpart not found.\n";
+my @targets = $part_event->targets;
+my $total = @targets;
+
+# in imitation of search/elements/search-html.html
+my @header;
+my @fields;
+my ($pkey, $label);
+$pkey = dbdef->table($part_event->eventtable)->primary_key;
+
+for ($part_event->eventtable) {
+ if (/^cust_main$/) {
+ # very likely to appear in events
+ my %paybys = FS::payby->cust_payby2longname;
+ push @header, 'Balance', 'Payment Method';
+ push @fields, 'balance', sub{ $paybys{$_[0]->payby} };
+ $label = 'customer';
+ }
+ elsif (/^cust_bill$/) {
+ push @header, 'Invoice Date', 'Amount', 'Balance';
+ push @fields, date_format('_date'), 'charged', 'owed';
+ $label = 'invoice';
+ }
+ elsif (/^cust_statement$/) {
+ push @header, 'Statement Date', 'Amount', 'Balance';
+ push @fields, date_format('_date'), 'charged', 'owed';
+ $label = 'statement';
+ }
+ elsif (/^cust_pkg$/) {
+ push @header, 'Package', 'Next Bill', 'Frequency';
+ push @fields, sub {$_[0]->part_pkg->pkg}, date_format('bill'),
+ sub {$_[0]->part_pkg->freq_pretty};
+ $label = 'package';
+ }
+ elsif (/^svc_acct$/) {
+ push @header, 'Username', 'Domain';
+ push @fields, 'username', 'domain';
+ $label = 'service';
+ }
+ else {}
+}
+
+my @cust_header = FS::UI::Web::cust_header();
+my @cust_fields = FS::UI::Web::cust_fields_subs();
+
+my $objects = scalar(@targets);
+my $customers = uniq(map {$_->cust_main->custnum} @targets);
+
+sub date_format {
+ my $column = shift;
+ sub { my $obj = shift;
+ my $value = $obj->get($column);
+ $value ? time2str('%b %d %Y', $value) : '';
+ };
+}
+
+</%init>