1 <style type="text/css">
22 text-decoration: none;
23 border-top: thin solid #CFDEFF;
26 #menu_ul a.current_show {
39 border-bottom: thin solid #CFDEFF;
49 border-top: thin solid #CFDEFF;
51 background: transparent;
56 text-decoration: underline;
61 <script src="<% $p %>elements/jquery.js"></script>
62 <script type="text/javascript">
64 $(document).ready(function() {
66 function closemenu () {
67 if (openmenu !== undefined) {
72 $('#menu_ul > li').hover(function(){
74 openmenu = $('ul:first', this);
83 % foreach my $submenu (@processed_menu) {
87 % foreach my $link ( @$submenu ) {
97 my $cust_main = $opt{'cust_main'};
98 my $custnum = $cust_main->custnum;
99 my $curuser = $FS::CurrentUser::CurrentUser;
100 my $conf = FS::Conf->new;
102 my %payby = map { $_ => 1 } $conf->config('payby');
104 # nice declarative menu; should be a parameter to some kind of menu generator
111 label => 'Edit customer',
112 url => 'edit/cust_main.cgi?$custnum',
113 acl => 'Edit customer'
116 label => 'Edit contacts',
117 url => 'edit/cust_main-contacts.html?$custnum',
122 acl => 'Bill customer now',
123 content => sub { include( '/elements/bill.html',
124 label => emt('Bill now'),
125 url => $cgi->self_url,
126 custnum => shift->custnum,
132 popup => 'misc/suspend_cust.html?custnum=$custnum',
133 acl => 'Suspend customer',
134 condition => sub { shift->unsuspended_pkgs > 0 },
135 actionlabel => 'Confirm Suspension',
139 label => 'Unsuspend',
140 popup => 'misc/unsuspend_cust.html?custnum=$custnum',
141 acl => 'Unsuspend customer',
142 condition => sub { shift->suspended_pkgs > 0 },
143 actionlabel => 'Confirm Unsuspension',
147 popup => 'misc/suspend_cust.html?custnum=$custnum',
148 acl => 'Cancel customer',
149 condition => sub { shift->ncancelled_pkgs > 0 },
150 actionlabel => 'Confirm Cancellation',
155 popup => 'misc/merge_cust.html?custnum=$custnum',
156 acl => 'Merge customer',
157 actionlabel => 'Merge customer',
162 label => 'Refer a new customer',
163 url => 'edit/cust_main.cgi?referral_custnum=$custnum',
164 confexists => '!disable_customer_referrals',
166 # should have a separator here
168 label => 'View this customer\'s referrals',
169 url => 'search/cust_main.cgi?referral_custnum=$custnum',
170 confexists => '!disable_customer_referrals',
172 FS::cust_main->count('referral_custnum = ?', shift->custnum) > 0
176 label => 'View billing events',
177 url => 'search/cust_event.html?custnum=$custnum',
178 acl => [ 'Billing event reports',
179 'View customer billing events' ],
182 label => 'Email a notice to this customer',
184 my $cust_main = shift;
185 my $agentnum = $cust_main->agentnum;
186 'misc/email-customers.html?table=cust_main;search_hash='.
187 'agent_virt_agentnum='.$agentnum.';custnum=$custnum';
189 condition => sub { shift->invoicing_list_emailonly },
199 popup => 'edit/cust_main_note.cgi?custnum=$custnum',
200 actionlabel => 'Add note',
201 confexists => '!cust_main-disable_notes',
202 acl => 'Add customer note',
207 label => 'Attach file',
208 popup => 'edit/cust_main_attach.cgi?custnum=$custnum',
209 actionlabel => 'Upload file',
210 confexists => '!disable_cust_attachment',
211 acl => 'Add attachment',
220 confexists => 'ticket_system'
225 label => 'Appointments',
226 show => 'appointments',
227 confexists => 'ticket_system',
228 acl => 'View appointments',
233 label => 'Quotations',
234 show => 'quotations',
237 label => 'Add quotation',
238 url => 'edit/quotation.html?custnum=$custnum',
239 acl => 'Generate quotation',
248 label => 'New qualification',
249 popup => 'misc/qual.html?custnum=$custnum',
250 actionlabel => 'New qualification',
254 acl => 'Qualify service',
257 label => 'Order new package',
258 popup => 'misc/order_pkg.html?custnum=$custnum',
259 actionlabel => 'Order new package',
263 acl => 'Order customer package',
266 # it's just a popup, but there's some freaky CCH tax stuff in it
267 label => 'One-time charge',
269 include( '/elements/one_time_charge_link.html',
270 custnum => shift->custnum,
273 acl => 'One-time charge',
276 label => 'Move services between packages',
277 popup => 'edit/bulk-cust_svc-pkgnum.html?custnum=$custnum',
278 actionlabel => 'Move services',
281 acl => 'Bulk move customer services',
284 label => 'Bulk order and cancel packages',
285 url => 'edit/cust_pkg.cgi?$custnum',
286 acl => 'Bulk change customer packages',
290 label => 'Package reports',
291 url => 'search/report_cust_pkg?custnum=$custnum',
294 label => 'View qualifications',
295 url => 'search/qual.cgi?custnum=$custnum',
296 acl => 'Qualify service',
299 label => 'View accounts',
300 url => 'search/report_svc_acct.html?custnum=$custnum',
303 label => 'View CDRs',
304 url => 'search/report_cdr.html?custnum=$custnum',
309 label => 'Payment History',
310 show => 'payment_history',
312 # manual payment entry via edit/cust_pay
314 label => 'Enter check payment',
315 popup => 'edit/cust_pay.cgi?popup=1;payby=BILL;custnum=$custnum',
316 actionlabel => 'Enter check payment',
319 acl => [ 'Post payment', 'Post check payment' ],
320 condition => sub { $payby{BILL} },
323 label => 'Enter cash payment',
324 popup => 'edit/cust_pay.cgi?popup=1;payby=CASH;custnum=$custnum',
325 actionlabel => 'Enter cash payment',
328 acl => [ 'Post payment', 'Post cash payment' ],
329 condition => sub { $payby{CASH} },
332 label => 'Enter Western Union payment',
333 popup => 'edit/cust_pay.cgi?popup=1;payby=WEST;custnum=$custnum',
334 actionlabel => 'Enter Western Union payment',
337 acl => [ 'Post payment', ],
338 condition => sub { $payby{WEST} },
341 label => 'Post manual (offline/POS) credit card payment',
342 popup => 'edit/cust_pay.cgi?popup=1;payby=MCRD;custnum=$custnum',
343 actionlabel => 'Enter credit card payment',
346 acl => [ 'Post payment', ],
347 condition => sub { $payby{MCRD} },
350 label => 'Post manual (offline/POS) electronic check',
351 popup => 'edit/cust_pay.cgi?popup=1;payby=MCHK;custnum=$custnum',
352 actionlabel => 'Enter credit card payment',
355 acl => [ 'Post payment', ],
356 condition => sub { $payby{MCHK} },
358 # realtime payments via payment.cgi
360 label => 'Process credit card payment',
361 url => 'misc/payment.cgi?payby=CARD;custnum=$custnum',
362 acl => [ 'Process payment', 'Process credit card payment', ],
363 condition => sub { $payby{CARD} or $payby{DCRD} },
366 label => 'Process electronic check payment',
367 url => 'misc/payment.cgi?payby=CHEK;custnum=$custnum',
368 acl => [ 'Process payment', 'Process Echeck payment', ],
369 condition => sub { $payby{CHEK} or $payby{DCHK} },
373 label => 'Enter credit',
374 popup => 'edit/cust_credit.cgi?custnum=$custnum',
375 actionlabel => 'Enter credit',
377 acl => 'Post credit',
380 label => 'Credit line items',
381 popup => 'edit/credit-cust_bill_pkg.html?custnum=$custnum',
382 actionlabel => 'Credit line items',
385 acl => 'Credit line items',
387 FS::cust_bill->count('custnum = ?', shift->custnum) > 0
391 label => 'Enter check refund',
392 popup => 'edit/cust_refund.cgi?popup=1;payby=BILL;custnum=$custnum',
393 actionlabel => 'Enter check refund',
395 acl => ['Post refund', 'Post check refund'],
396 condition => sub { $payby{BILL} },
399 label => 'Enter cash refund',
400 popup => 'edit/cust_refund.cgi?popup=1;payby=CASH;custnum=$custnum',
401 actionlabel => 'Enter cash refund',
403 acl => ['Post refund', 'Post cash refund'],
404 condition => sub { $payby{CASH} },
407 label => 'Enter manual (offline/POS) credit card refund',
408 popup => 'edit/cust_refund.cgi?popup=1;payby=MCRD;custnum=$custnum',
409 actionlabel => 'Enter credit card refund',
411 acl => ['Post refund' ],
412 condition => sub { $payby{MCRD} },
415 label => 'Enter manual (offline/POS) electronic check refund',
416 popup => 'edit/cust_refund.cgi?popup=1;payby=MCHK;custnum=$custnum',
417 actionlabel => 'Enter electronic check refund',
419 acl => ['Post refund' ],
420 condition => sub { $payby{MCHK} },
423 label => 'Add tax adjustment',
424 popup => 'edit/cust_tax_adjustment.html?custnum=$custnum',
425 actionlabel => 'Add tax adjustment',
427 confexists => 'enable_tax_adjustments',
428 acl => 'Add customer tax adjustment',
430 # separator, definitely
432 label => 'Download statement',
433 url => 'view/cust_main_statement-pdf.cgi?$custnum',
434 acl => 'List invoices',
436 FS::cust_bill->count('custnum = ?', shift->custnum) > 0
440 label => 'Search invoices',
441 url => 'search/report_cust_bill.html?custnum=$custnum',
442 acl => 'List invoices',
445 label => 'View tax exemptions',
446 url => 'search/cust_tax_exempt_pkg.cgi?custnum=$custnum',
447 acl => 'View customer tax exemptions',
450 label => 'View tax adjustments',
451 url => 'search/cust_tax_adjustment.html?custnum=$custnum',
452 confexists => 'enable_tax_adjustments',
453 acl => 'Add customer tax adjustment',
456 label => 'View pending payments',
457 url => 'search/cust_pay_pending.html?magic=_date;statusNOT=done;custnum=$custnum',
458 acl => 'View pending payments',
460 FS::cust_pay_pending->count('custnum = ?', shift->custnum) > 0
466 label => 'Change History',
467 show => 'change_history',
468 acl => 'View customer history',
475 foreach my $submenu (@menu) {
479 foreach my $entry ( @$submenu ) {
480 # if the menu head was skipped, skip the whole menu
481 last if (!$first and !@links);
485 if ( $entry->{acl} ) {
486 next unless $curuser->access_right( $entry->{acl} );
488 if ( $entry->{confexists} ) {
489 if ( $entry->{confexists} =~ /^!(.*)/ ) {
490 # confexists => !foo, a negative condition
491 next if $conf->exists( $1 );
493 next unless $conf->exists( $entry->{confexists} );
496 if ( $entry->{condition} ) {
497 next unless &{ $entry->{condition} }($cust_main);
500 my $label = emt($entry->{label});
501 my $target = $entry->{content}
505 if ( ref($target) eq 'CODE' ) {
506 $target = &$target($cust_main);
510 if ( $entry->{content} ) { # then the coderef specified the whole thing
513 } elsif ( $entry->{show} ) {
515 # the menu head: always a link back to this page
516 $cgi->param('show', $entry->{show});
517 $target = $cgi->self_url;
519 $a = qq[ <A HREF="$target"];
520 if ( $opt{'show'} eq $entry->{show} ) {
521 $a .= ' class="current_show"';
523 $a .= qq[>$label</A> ];
526 } elsif ( $entry->{popup} ) {
528 $target =~ s/\$custnum/$custnum/g;
529 $target = $p.$target;
530 $a = include('/elements/popup_link.html',
535 label => emt($label),
538 } elsif ( $entry->{url} ) {
540 $target =~ s/\$custnum/$custnum/g;
541 $target = $p.$target;
542 $a = qq[ <A HREF="$target">$label</A> ];
549 push @processed_menu, \@links;