5 <TD CLASS="inv" BGCOLOR="<% $bgcolor %>">
6 <TABLE CLASS="inv" BORDER=0 CELLSPACING=0 CELLPADDING=2 WIDTH="100%">
7 <SCRIPT TYPE="text/javascript">
8 function clearhint_search_cust_svc(obj, str) {
9 if (obj.value == str) obj.value = '';
13 % my $showdidlink = browse_received_did_inventory($cust_pkg->custnum);
14 % foreach my $part_svc (
15 % $cust_pkg->part_svc(
16 % 'summarize_size' => $opt{'cust_pkg-large_pkg_size'},
17 % 'hide_discontinued' => $opt{'cust_pkg-hide_discontinued-part_svc'},
21 % my $num_cust_svc = $cust_pkg->num_cust_svc( $part_svc->svcpart );
23 % if ( $opt{'cust_pkg-large_pkg_size'} > 0 and
24 % $opt{'cust_pkg-large_pkg_size'} <= $num_cust_svc ) { # summarize
27 <TD ALIGN="right" VALIGN="top">
28 % my $href="${p}search/cust_pkg_svc.html?svcpart=".$part_svc->svcpart.
29 % ";pkgnum=".$cust_pkg->pkgnum;
30 <A HREF="<% $href %>"><% $part_svc->svc |h %></A>
32 <TD ALIGN="left" VALIGN="top">
33 <A HREF="<% $href %>"><B>(<% mt("view all [_1]", $num_cust_svc) |h %>)</B></A>
36 % my $hint = $hints{$part_svc->svcdb};
40 <TD ALIGN="left" VALIGN="top">
41 <FORM name="svcpart<%$part_svc->svcpart%>_search" STYLE="display:inline"
42 ACTION="<%$p%>search/cust_pkg_svc.html" METHOD="GET">
43 <INPUT TYPE="hidden" NAME="svcpart" VALUE="<%$part_svc->svcpart%>">
44 <INPUT TYPE="hidden" NAME="pkgnum" VALUE="<%$cust_pkg->pkgnum%>">
45 <INPUT TYPE="text" NAME="search_svc"
46 onfocus="clearhint_search_cust_svc(this, '<%$hint%>')" VALUE="<%$hint%>">
47 <INPUT TYPE="submit" VALUE="Search"></FORM>
52 % } else { # don't summarize
54 % foreach my $cust_svc ( @{ $part_svc->cust_pkg_svc } ) {
55 % if ( $cust_pkg->getfield('cancel') > 0 ) {
56 <& /elements/tr-cust_svc_cancel.html,
58 'part_svc' => $part_svc,
59 'cust_svc' => $cust_svc,
60 'cust_pkg' => $cust_pkg,
64 <& /elements/tr-cust_svc.html,
66 'part_svc' => $part_svc,
67 'cust_svc' => $cust_svc,
68 'cust_pkg' => $cust_pkg,
71 % } #foreach $cust_svc
73 % if ( ! $cust_pkg->get('cancel')
74 % && $curuser->access_right('Provision customer service')
75 % && $part_svc->num_avail
79 <TD COLSPAN=3 ALIGN="center" STYLE="padding-bottom:4px;padding-top:0px">
82 % if ( $opt{no_links} ) {
83 <% $part_svc->svc |h %>: <% $part_svc->num_avail %>
84 <% mt('Available') |h %>
86 <% svc_provision_link($cust_pkg, $part_svc, \%opt, $curuser) %>
90 % if ( $curuser->access_right('Bulk provision customer service')
91 % && $part_svc->svcdb eq 'svc_phone'
95 % if ( $part_svc->num_avail > 5 ) {
96 % local $opt{'bulk'} = 1;
97 % local $opt{'svc_phone_bulk_provision_simple'} = $svc_phone_bulk_provision_simple;
98 % local $opt{'num_avail'} = $part_svc->num_avail;
99 <BR><% svc_provision_link($cust_pkg, $part_svc, \%opt, $curuser) %>
101 % if ($showdidlink) {
102 <BR><A HREF="<%$p%>browse/did_order.html?custnum=<%$cust_pkg->custnum%>"><% mt('Browse Received DID Inventory') |h %></A>
110 % } #foreach part_svc
112 % if ($cust_pkg->get('cancel')) {
114 % $cust_pkg->uncancel_svc_summary('summarize_size' => $opt{'cust_pkg-large_pkg_size'}, 'no_test_reprovision' => 1)
117 <TD ALIGN="right" VALIGN="top"><% $svc->{'svc'} |h %></TD>
118 <TD STYLE="padding-bottom:0px; font-style: italic">
119 <% $svc->{'num_cust_svc'}
120 ? $svc->{'num_cust_svc'} . ' ' . emt('services in history')
121 : (defined($svc->{'label'}) ? $svc->{'label'} : emt('(cannot load svc label)')) |h %>
135 my $bgcolor = $opt{'bgcolor'};
136 my $cust_pkg = $opt{'cust_pkg'};
137 my $part_pkg = $opt{'part_pkg'};
138 my $svc_phone_bulk_provision_simple = $opt{'svc_phone-bulk_provision_simple'};
140 my $curuser = $FS::CurrentUser::CurrentUser;
142 sub svc_provision_link {
143 my ($cust_pkg, $part_svc, $opt, $curuser) = @_;
145 ( my $svc_nbsp = $part_svc->svc ) =~ s/\s+/ /g;
146 my $num_avail = $part_svc->num_avail;
148 my $query = "pkgnum=". $cust_pkg->pkgnum. ';'.
149 "svcpart=". $part_svc->svcpart;
150 $query .= ';bulk=1' if $opt->{bulk};
153 if ( $part_svc->svcdb eq 'svc_external' #could be generalized
154 && $opt->{'svc_external-skip_manual'}
156 $url = "${p}edit/process/". $part_svc->svcdb. ".cgi?$query";
157 } elsif ( $part_svc->svcdb eq 'svc_phone' && $opt->{bulk}
158 && $opt->{svc_phone_bulk_provision_simple}
161 $query .= ';num_avail='. $opt->{num_avail};
162 $url = "${p}edit/bulk-svc_phone.html?$query";
167 'part_svc' => $part_svc,
172 my $action = $opt->{bulk} ? 'Bulk provision' : 'Provision';
174 my $link = qq!<A CLASS="provision" HREF="$url">!.
175 emt("$action [_1] ([_2])",$svc_nbsp,$num_avail).'</A>';
177 if ( $opt->{'legacy_link'}
178 && $curuser->access_right('View/link unlinked services')
183 qq!<A CLASS="provision" HREF="${p}misc/link.cgi?$query">!.
184 emt("Link to legacy [_1] ([_2])",$svc_nbsp,$num_avail).'</A>';
190 sub browse_received_did_inventory {
191 local($FS::Record::qsearch_qualify_columns) = 1;
193 'table' => 'did_order',
194 'hashref' => { 'custnum' => $_[0] },
195 'extra_sql' => ' LIMIT 1'
198 'table' => 'did_order_item',
199 'hashref' => { 'custnum' => $_[0] },
200 'addl_from' => ' INNER JOIN did_order ON did_order_item.ordernum = did_order.ordernum',
201 'extra_sql' => ' LIMIT 1'
206 svc_acct => emt('(user or email)'),
207 svc_domain => emt('(domain)'),
208 svc_broadband => emt('(ip or mac)'),
209 svc_forward => emt('(email)'),
210 svc_phone => emt('(phone)'),
211 svc_pbx => emt('(phone)'),