RT#17599: display cancelled services from history [display unprovisionable services...
[freeside.git] / httemplate / view / cust_main / packages / services.html
index 512efcc..a23a4c2 100644 (file)
@@ -3,28 +3,41 @@
 % ###
 
   <TD CLASS="inv" BGCOLOR="<% $bgcolor %>">
-    <TABLE CLASS="inv" BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%">
+    <TABLE CLASS="inv" BORDER=0 CELLSPACING=0 CELLPADDING=2 WIDTH="100%">
     <SCRIPT TYPE="text/javascript">
 function clearhint_search_cust_svc(obj, str) {
   if (obj.value == str) obj.value = '';
 }
     </SCRIPT>
 
-%  #foreach my $svcpart (sort {$a->{svcpart} <=> $b->{svcpart}} @{$pkg->{svcparts}}) {
-%  foreach my $part_svc ( $cust_pkg->part_svc ) {
-
+%  my $showdidlink = browse_received_did_inventory($cust_pkg->custnum);
+%  foreach my $part_svc (
+%    $cust_pkg->part_svc(
+%      'summarize_size'    => $opt{'cust_pkg-large_pkg_size'},
+%      'hide_discontinued' => $opt{'cust_pkg-hide_discontinued-part_svc'},
+%    )
+%  ) {
+%
+%    my $num_cust_svc = $cust_pkg->num_cust_svc( $part_svc->svcpart );
+%
 %    if ( $opt{'cust_pkg-large_pkg_size'} > 0 and
-%         $opt{'cust_pkg-large_pkg_size'} <= $cust_pkg->num_svcs ) {
-%      # summarize
+%         $opt{'cust_pkg-large_pkg_size'} <= $num_cust_svc ) { # summarize
+%
       <TR>
-        <TD ALIGN="center" VALIGN="top">
+        <TD ALIGN="right" VALIGN="top">
 %       my $href="${p}search/cust_pkg_svc.html?svcpart=".$part_svc->svcpart.
 %          ";pkgnum=".$cust_pkg->pkgnum;
-        <A HREF="<% $href %>"><% $part_svc->svc %></A>&nbsp;
-        <A HREF="<% $href %>"><B>(view all <% $cust_pkg->num_svcs %>)</B></A>
+        <A HREF="<% $href %>"><% $part_svc->svc |h %></A>
+        </TD>
+        <TD ALIGN="left" VALIGN="top">
+        <A HREF="<% $href %>"><B>(<% mt("view all [_1]", $num_cust_svc) |h %>)</B></A>
+        </TD>
+      </TR>
 %     my $hint = $hints{$part_svc->svcdb};
 %     if ( $hint ) {
-        <BR>
+      <TR>
+        <TD></TD>
+        <TD ALIGN="left" VALIGN="top">
         <FORM name="svcpart<%$part_svc->svcpart%>_search" STYLE="display:inline"
         ACTION="<%$p%>search/cust_pkg_svc.html" METHOD="GET">
         <INPUT TYPE="hidden" NAME="svcpart" VALUE="<%$part_svc->svcpart%>">
@@ -32,84 +45,85 @@ function clearhint_search_cust_svc(obj, str) {
         <INPUT TYPE="text" NAME="search_svc"
         onfocus="clearhint_search_cust_svc(this, '<%$hint%>')" VALUE="<%$hint%>">
         <INPUT TYPE="submit" VALUE="Search"></FORM>
-%     } #$hint
         </TD>
       </TR>
-%    }
-%    else {
+%     } #$hint
+%
+%    } else { # don't summarize
+%
 %      foreach my $cust_svc ( @{ $part_svc->cust_pkg_svc } ) {
+%        if ( $cust_pkg->getfield('cancel') > 0 ) {
+      <& /elements/tr-cust_svc_cancel.html,
+                  %opt,
+                  'part_svc' => $part_svc,
+                  'cust_svc' => $cust_svc,
+                  'cust_pkg' => $cust_pkg,
+       &>
+%        }
+%        else {
+      <& /elements/tr-cust_svc.html,
+                  %opt,
+                  'part_svc' => $part_svc,
+                  'cust_svc' => $cust_svc,
+                  'cust_pkg' => $cust_pkg,
+       &>
+%       } #if cancel > 0
+%     } #foreach $cust_svc
+%   } #if summarizing
+%   if (    ! $cust_pkg->get('cancel')
+%        && $curuser->access_right('Provision customer service') 
+%        && $part_svc->num_avail
+%      ) {
 
       <TR>
-        <TD ALIGN="right" VALIGN="top"><% FS::UI::Web::svc_link($m, $part_svc, $cust_svc) %></TD>
-        <TD STYLE="padding-bottom:0px"><B><% FS::UI::Web::svc_label_link($m, $part_svc, $cust_svc) %></B></TD>
-        <TD><% FS::UI::Web::svc_export_links($m, $part_svc, $cust_svc) %></TD>
-      </TR>
-
-      <TR>
-        <TD ALIGN="right" COLSPAN="3" VALIGN="top" STYLE="padding-bottom:1px;padding-top:0px"><FONT SIZE="-2" COLOR="#FFD000">
-
-            <% $cust_svc->overlimit ? "Overlimit: ". time2str('%b %o %Y' . ($opt{'cust_pkg-display_times'} ? ' %l:%M %P' : ''), $cust_svc->overlimit) : '' %>
-          </FONT></TD>
-      </TR>
+        <TD COLSPAN=3 ALIGN="center" STYLE="padding-bottom:4px;padding-top:0px">
 
-      <TR>
-        <TD ALIGN="right" VALIGN="top" STYLE="padding-bottom:5px;padding-top:0px"><FONT SIZE="-2">
-
-%         if ( $curuser->access_right('Recharge customer service')
-%              && $part_svc->svcdb eq 'svc_acct'
-%              && (    $cust_svc->svc_x->seconds    ne ''
-%                   || $cust_svc->svc_x->upbytes    ne ''
-%                   || $cust_svc->svc_x->downbytes  ne ''
-%                   || $cust_svc->svc_x->totalbytes ne ''
-%                 )
-%         ) { 
-            (&nbsp;<%svc_recharge_link($cust_svc)%>&nbsp;)
+          <B>
+%         if ( $opt{no_links} ) {
+            <% $part_svc->svc |h %>: <% $part_svc->num_avail %>
+            <% mt('Available') |h %>
+%         } else {
+            <% svc_provision_link($cust_pkg, $part_svc, \%opt, $curuser) %>
 %         }
-          </FONT></TD>
-
-          <TD ALIGN="right" VALIGN="top" STYLE="padding-bottom:5px;padding-top:0px">
-
-%           my $ip_addr = $cust_svc->svc_x->ip_addr;
-
-%           if ( $part_svc->svcdb eq 'svc_broadband' ) {
-              <FONT SIZE="-1" STYLE="float:left">(&nbsp;<% include('/elements/popup_link-ping.html', 'ip'=> $ip_addr ) %>&nbsp;)</FONT>
-
+          </B>
+
+%        if ( $curuser->access_right('Bulk provision customer service') 
+%               && $part_svc->svcdb eq 'svc_phone'
+%               && ! $opt{no_links}
+%           )
+%        {
+%          if ( $part_svc->num_avail > 5 ) {
+%             local $opt{'bulk'} = 1;
+%             local $opt{'svc_phone_bulk_provision_simple'} =  $svc_phone_bulk_provision_simple;
+%             local $opt{'num_avail'} = $part_svc->num_avail;
+              <BR><% svc_provision_link($cust_pkg, $part_svc, \%opt, $curuser) %>
 %           }
-
-%           my $manage_link = $opt{'svc_broadband-manage_link'};
-%           if ( $manage_link && $part_svc->svcdb eq 'svc_broadband' ) {
-%             my $svc_manage_link = eval(qq("$manage_link"));
-              <FONT SIZE="-1" STYLE="float:left">(&nbsp;<A HREF="<% $svc_manage_link %>">Manage Device</A>&nbsp;)</FONT>
-
+%           if ($showdidlink) {
+              <BR><A HREF="<%$p%>browse/did_order.html?custnum=<%$cust_pkg->custnum%>"><% mt('Browse Received DID Inventory') |h %></A> 
 %           }
+%       }
+        </TD>
+      </TR>
 
-%           if ( $curuser->access_right('Unprovision customer service') ) { 
-              <FONT SIZE="-2">(&nbsp;<%svc_unprovision_link($cust_svc)%>&nbsp;)</FONT>
-%           } 
-
-%           if ( $part_svc->svcdb eq 'svc_pbx' && $opt{'maestro-status_test'} ){
-              <FONT SIZE="-2">(&nbsp;<A HREF="<% $p %>misc/maestro-customer_status-test.html?<% $cust_pkg->custnum.'+'.$cust_svc->svcnum %>">Test maestro status</A>&nbsp;)</FONT>
-%           } 
-
-          </TD>
-        </TR>
-%     } #foreach $cust_svc
 %   }
 
-%   if (    ! $cust_pkg->get('cancel')
-%        && $curuser->access_right('Provision customer service') 
-%        && $part_svc->num_avail
-%      ) {
+% } #foreach part_svc
 
+% if ($cust_pkg->get('cancel')) {
+%   foreach my $svc (
+%     $cust_pkg->uncancel_svc_summary('summarize_size' => $opt{'cust_pkg-large_pkg_size'}, 'no_test_reprovision' => 1)
+%   ) {
       <TR>
-        <TD COLSPAN=3 ALIGN="center" STYLE="padding-bottom:4px;padding-top:0px">
-          <B><% svc_provision_link($cust_pkg, $part_svc, \%opt, $curuser) %></B>
+        <TD ALIGN="right" VALIGN="top"><% $svc->{'svc'} |h %></TD>
+        <TD STYLE="padding-bottom:0px; font-style: italic">
+        <% $svc->{'num_cust_svc'} 
+           ? $svc->{'num_cust_svc'} . ' ' . emt('services in history') 
+           : (defined($svc->{'label'}) ? $svc->{'label'} : emt('(cannot load svc label)')) |h %>
         </TD>
       </TR>
+%   }
+% }
 
-%   } 
-
-% } 
 
     </TABLE>
   </TD>
@@ -121,58 +135,80 @@ my %opt = @_;
 my $bgcolor  = $opt{'bgcolor'};
 my $cust_pkg = $opt{'cust_pkg'};
 my $part_pkg = $opt{'part_pkg'};
-my $curuser  = $FS::CurrentUser::CurrentUser;
+my $svc_phone_bulk_provision_simple = $opt{'svc_phone-bulk_provision_simple'};
 
-my $conf = new FS::Conf;
+my $curuser  = $FS::CurrentUser::CurrentUser;
 
 sub svc_provision_link {
   my ($cust_pkg, $part_svc, $opt, $curuser) = @_;
-  ( my $svc_nbsp = $part_svc->svc ) =~ s/\s+/&nbsp;/g;
+
+  ( my $svc_nbsp = $part_svc->svc ) =~ s/\s+/ /g;
   my $num_avail = $part_svc->num_avail;
-  my $pkgnum_svcpart = "pkgnum=". $cust_pkg->pkgnum. ';'.
-                       "svcpart=". $part_svc->svcpart;
+
+  my $query = "pkgnum=". $cust_pkg->pkgnum. ';'.
+              "svcpart=". $part_svc->svcpart;
+  $query .= ';bulk=1' if $opt->{bulk};
+
   my $url;
   if ( $part_svc->svcdb eq 'svc_external' #could be generalized
        && $opt->{'svc_external-skip_manual'}
   ) {
-    $url = "${p}edit/process/". $part_svc->svcdb. ".cgi?$pkgnum_svcpart";
+    $url = "${p}edit/process/". $part_svc->svcdb. ".cgi?$query";
+  } elsif ( $part_svc->svcdb eq 'svc_phone' && $opt->{bulk}
+              && $opt->{svc_phone_bulk_provision_simple}
+          )
+  {
+    $query .= ';num_avail='. $opt->{num_avail};
+    $url = "${p}edit/bulk-svc_phone.html?$query";
   } else {
     $url = svc_url(
                     'm'        => $m,
                     'action'   => 'edit',
                     'part_svc' => $part_svc, 
-                    'query'    => $pkgnum_svcpart,
+                    'query'    => $query,
                   );
-    #$url = "${p}edit/$svcpart->{svcdb}.cgi?$pkgnum_svcpart";
   }
 
+  my $action = $opt->{bulk} ? 'Bulk provision' : 'Provision';
+
   my $link = qq!<A CLASS="provision" HREF="$url">!.
-             "Provision&nbsp;$svc_nbsp&nbsp;($num_avail)</A>";
+             emt("$action [_1] ([_2])",$svc_nbsp,$num_avail).'</A>';
+
   if ( $opt->{'legacy_link'}
        && $curuser->access_right('View/link unlinked services')
+       && ! $opt{bulk}
      )
   {
     $link .= '<BR>'.
-             qq!<A CLASS="provision" HREF="${p}misc/link.cgi?!.
-             qq!$pkgnum_svcpart">!.
-            "Link&nbsp;to&nbsp;legacy&nbsp;$svc_nbsp&nbsp;($num_avail)</A>";
+             qq!<A CLASS="provision" HREF="${p}misc/link.cgi?$query">!.
+            emt("Link to legacy [_1] ([_2])",$svc_nbsp,$num_avail).'</A>';
   }
+
   $link;
 }
 
-sub svc_unprovision_link {
-  my $cust_svc = shift or return '';
-  qq!<A HREF="javascript:areyousure('${p}misc/unprovision.cgi?!. $cust_svc->svcnum.
-  qq!', 'Permanently unprovision and delete this service?')">Unprovision</A>!;
+sub browse_received_did_inventory {
+  local($FS::Record::qsearch_qualify_columns) = 1;
+  qsearch({
+    'table' => 'did_order',
+    'hashref' => { 'custnum' => $_[0] },
+    'extra_sql' => ' LIMIT 1'
+  }) ||
+  qsearch({
+    'table' => 'did_order_item',
+    'hashref' => { 'custnum' => $_[0] },
+    'addl_from' => ' INNER JOIN did_order ON did_order_item.ordernum = did_order.ordernum',
+    'extra_sql' => ' LIMIT 1'
+  });
 }
 
 my %hints = (
-svc_acct      => '(user or email)',
-svc_domain    => '(domain)',
-svc_broadband => '(ip or mac)',
-svc_forward   => '(email)',
-svc_phone     => '(phone)',
-svc_pbx       => '(phone)',
+svc_acct      => emt('(user or email)'),
+svc_domain    => emt('(domain)'),
+svc_broadband => emt('(ip or mac)'),
+svc_forward   => emt('(email)'),
+svc_phone     => emt('(phone)'),
+svc_pbx       => emt('(phone)'),
 );
 
 </%init>