cust_location editing features, RT#10766
[freeside.git] / httemplate / view / cust_main / packages.html
index afd9941..383c2a7 100755 (executable)
@@ -1,93 +1,20 @@
-<A NAME="cust_pkg"><FONT SIZE="+2">Packages</FONT></A><BR>
-
-% if ( $curuser->access_right('One-time charge') ) {
-
-<SCRIPT TYPE="text/javascript">
-
-function taxproductmagic(which) {
-  var str = '';
-  var elements = which.form.elements;
-  for (var i = 0; i<elements.length; i++) {
-    if (elements[i].name == 'taxproductnum'){
-      document.getElementById('taxproductnum').value = elements[i].value;
-      continue;
-    }
-    if (elements[i].name == 'taxproductnum_description'){
-      continue;
-    }
-    if (str.length){str += ';';}
-    str += elements[i].name + '=' + escape(elements[i].value);
-  }
-  document.getElementById('charge_storage').value = str;
-  cClick();
-  overlib( OLiframeContent('<% $p %>/browse/part_pkg_taxproduct.cgi?_type=select&id=taxproductnum&onclick=taxproductquickchargemagic&taxproductnum='+document.getElementById('taxproductnum').value, 1000, 400, 'tax_product_popup'), CAPTION, 'Select product', STICKY, AUTOSTATUSCAP, MIDX, 0, MIDY, 0, DRAGGABLE, CLOSECLICK);
-}
-
-function taxproductquickchargemagic() {
-  var str = document.getElementById('charge_storage').value;
-  if (str.length){str += ';';}
-  str += 'magic=taxproductnum;taxproductnum=';
-  str += escape(document.getElementById('taxproductnum').value);
-  cClick();
-  overlib( OLiframeContent('<% $p %>/edit/quick-charge.html?'+str, 545, 336, 'One-time charge'), CAPTION, 'One-time charge', STICKY, AUTOSTATUSCAP, MIDX, 0, MIDY, 0, DRAGGABLE, CLOSECLICK, BGCOLOR, '#333399', CGCOLOR, '#333399', CLOSETEXT, 'Close');
-
-}
-
-function taxoverridemagic(which) {
-  var str = '';
-  var elements = which.ownerDocument.QuickChargeForm.elements;
-  for (var i = 0; i<elements.length; i++) {
-    if (elements[i].name == 'tax_override'){
-      document.getElementById('tax_override').value = elements[i].value;
-      continue;
-    }
-    if (str.length){str += ';';}
-    str += elements[i].name + '=' + escape(elements[i].value);
-  }
-  document.getElementById('charge_storage').value = str;
-  cClick();
-  overlib( OLiframeContent('<% $p %>/edit/part_pkg_taxoverride.html?element_name=tax_override;onclick=taxoverridequickchargemagic;selected='+document.getElementById('tax_override').value, 1100, 600, 'tax_product_popup'), CAPTION, 'Edit product tax overrides', STICKY, AUTOSTATUSCAP, MIDX, 0, MIDY, 0, DRAGGABLE, CLOSECLICK);
-}
-
-function taxoverridequickchargemagic() {
-  var str = document.getElementById('charge_storage').value;
-  if (str.length){str += ';';}
-  str += 'magic=taxoverride;tax_override=';
-  str += document.getElementById('tax_override').value;
-  cClick();
-  overlib( OLiframeContent('<% $p %>/edit/quick-charge.html?'+str, 545, 336, 'One-time charge'), CAPTION, 'One-time charge', STICKY, AUTOSTATUSCAP, MIDX, 0, MIDY, 0, DRAGGABLE, CLOSECLICK, BGCOLOR, '#333399', CGCOLOR, '#333399', CLOSETEXT, 'Close');
-
-}
+% my $s = 0;
 
-</SCRIPT>
-<FORM NAME='quickcharge'>
-  <INPUT NAME="taxproductnum"  ID="taxproductnum"  TYPE="hidden">
-  <INPUT NAME="tax_override"   ID="tax_override"   TYPE="hidden">
-  <INPUT NAME="charge_storage" ID="charge_storage" TYPE="hidden">
-  <INPUT NAME="taxproductnum_description"  ID="taxproductnum_description" TYPE="hidden">
-</FORM>
-% } 
+% if ( $curuser->access_right('Qualify service') ) { 
+  <% $s++ ? ' | ' : '' %>
+  <% include('qual_link.html', $cust_main) %>
+% }
 
-% my $s = 0;
 % if ( $curuser->access_right('Order customer package') ) { 
   <% $s++ ? ' | ' : '' %>
-  <% order_pkg_link($cust_main) %>
+  <% include('order_pkg_link.html', $cust_main) %>
 % } 
 
 % if ( $curuser->access_right('One-time charge')
 %        && $conf->config('payby-default') ne 'HIDE'
 %      ) {
-%
   <% $s++ ? ' | ' : '' %>
-  <% include('/elements/popup_link.html',
-     { 
-       'action'      => $p. 'edit/quick-charge.html?custnum='. $cust_main->custnum,
-       'label'       => 'One-time charge',
-       'actionlabel' => 'One-time charge',
-       'color'       => '#333399',
-       'width'       => 763,
-     })
-  %>
+  <% include('one_time_charge_link.html', $cust_main) %>
 % } 
 
 % if ( $curuser->access_right('Bulk change customer packages') ) { 
@@ -95,8 +22,12 @@ function taxoverridequickchargemagic() {
   <A HREF="<% $p %>edit/cust_pkg.cgi?<% $cust_main->custnum %>">Bulk order and cancel packages</A> (preserves services)
 % } 
 
-
 <BR><BR>
+
+<TABLE>
+  <TR>
+    <TD ALIGN="left">
+
 % if ( @$packages ) {
 
 Current packages
@@ -108,66 +39,59 @@ Current packages
 %             )
 %        )
 %     {
+%       my $prev = $cgi->param('showcancelledpackages');
 %       $cgi->param('showcancelledpackages', 1);
-%
-
   ( <a href="<% $cgi->self_url %>">show
+%       $cgi->param('showcancelledpackages', $prev);
 %   } else {
 %       $cgi->param('showcancelledpackages', 0);
-%
-
   ( <a href="<% $cgi->self_url %>">hide
+%       $cgi->param('showcancelledpackages', 1);
 %   } 
 
  cancelled packages</a> )
 % } 
-% if ( @$packages ) { 
-
-<% include('/elements/table-grid.html') %>
-% my $bgcolor1 = '#eeeeee';
-%   my $bgcolor2 = '#ffffff';
-%   my $bgcolor = '';
-
-<TR>
-  <TH CLASS="grid" BGCOLOR="#cccccc">Package</TH>
-  <TH CLASS="grid" BGCOLOR="#cccccc">Status</TH>
-% if ( $show_location ) {
-  <TH CLASS="grid" BGCOLOR="#cccccc">Location</TH>
+% if ( $num_old_packages ) {
+%   $cgi->param('showoldpackages', 1);
+    ( <a href="<% $cgi->self_url %>">show old packages</a> )
+% } elsif ( $cgi->param('showoldpackages') ) {
+%   $cgi->param('showoldpackages', 0);
+    ( <a href="<% $cgi->self_url %>">hide old packages</a> )
 % }
-  <TH CLASS="grid" BGCOLOR="#cccccc">Services</TH>
-</TR>
 
-% foreach my $cust_pkg (@$packages) {
-%
-%   if ( $bgcolor eq $bgcolor1 ) {
-%     $bgcolor = $bgcolor2;
-%   } else {
-%     $bgcolor = $bgcolor1;
-%   }
-%
-%   my %iopt = (
-%     'bgcolor'  => $bgcolor,
-%     'cust_pkg' => $cust_pkg,
-%     'part_pkg' => $cust_pkg->part_pkg,
-%   );
-
-    <!--pkgnum: <% $cust_pkg->pkgnum %>-->
-    <TR>
-      <% include('packages/package.html',  %iopt) %>
-      <% include('packages/status.html',   %iopt) %>
-% if ( $show_location ) {
-      <% include('packages/location.html', %iopt) %>
+    </TD>
+    <TD ALIGN="right">
+      <A HREF="<%$p%>search/report_cust_pkg.html?custnum=<% $cust_main->custnum %>">Package reports</A>
+% if ( $curuser->access_right('Qualify service') ) { 
+    | <A HREF="<%$p%>search/qual.cgi?custnum=<% $cust_main->custnum %>">View Qualifications</A>
 % }
-      <% include('packages/services.html', %iopt) %>
-    </TR>
-
+      <BR>
+      Service reports:
+        <A HREF="<%$p%>search/report_svc_acct.html?custnum=<% $cust_main->custnum %>">accounts</A><BR>
+      Usage reports:
+        <A HREF="<%$p%>search/report_cdr.html?custnum=<% $cust_main->custnum %>">CDRs</A>
+    </TD>
+  </TR>
+
+  <TR>
+    <TD COLSPAN=2>
+% if ( $conf->exists('cust_pkg-group_by_location') and $show_location ) {
+<% include('locations.html',
+    'cust_main'     => $cust_main,
+    'packages'      => $packages,
+) %>
 % }
-
+% else {
+% # in this format, put all packages in one section
+<% include('/elements/table-grid.html') %>
+<% include('packages/section.html',
+    'packages'      => $packages,
+    'show_location' => $show_location,
+) %>
 </TABLE>
-
-% } else {
-<BR>
-% } 
+% }
+    </TD>
+  </TR>
 
 % if ( $cgi->param('fragment') =~ /^cust_pkg(\d+)$/ ) {
   <SCRIPT>
@@ -178,25 +102,28 @@ Current packages
     if ( el ) el.scrollIntoView(true);
   </SCRIPT>
 % }
+</TABLE>
 <%init>
 
-my( $cust_main ) = @_;
+my $cust_main = shift;
+my %opt = @_;
 my $conf = new FS::Conf;
 
 my $curuser = $FS::CurrentUser::CurrentUser;
 
-my $packages = get_packages($cust_main, $conf);
+my( $packages, $num_old_packages ) = get_packages($cust_main, $conf);
+
 
-my $show_location = $conf->exists('cust_pkg-always_show_location')
-                        || ( grep $_->locationnum, @$packages ); # ? '1' : '0';
+my $show_location = $conf->exists('cust_pkg-always_show_location') 
+                        || (grep $_->locationnum, @$packages); # ? '1' : '0';
 
+my $countrydefault = scalar($conf->config('countrydefault')) || 'US';
 #subroutines
 
 sub get_packages {
   my $cust_main = shift or return undef;
   my $conf = shift;
-  
-  my @packages = ();
+
   my $method;
   if (  $cgi->param('showcancelledpackages') eq '0' #see if it was set by me
      || ( $conf->exists('hidecancelledpackages')
@@ -208,19 +135,50 @@ sub get_packages {
     $method = 'all_pkgs';
   }
 
-  [ $cust_main->$method() ];
-}
+  my $cust_pkg_fields =
+    join(', ', map { "cust_pkg.$_ AS $_"          } fields('cust_pkg') );
+
+  my $part_pkg_fields =
+    join(', ', map { "part_pkg.$_ AS part_pkg_$_" } fields('part_pkg') );
+
+  my $group_by =
+    join(', ', map "cust_pkg.$_", fields('cust_pkg') ). ', '.
+    join(', ', map "part_pkg.$_", fields('part_pkg') );
+
+  my $num_svcs = '( SELECT COUNT(*) FROM cust_svc '.
+                 '    WHERE cust_svc.pkgnum = cust_pkg.pkgnum ) AS num_svcs';
+
+  my @packages = $cust_main->$method( {
+    'select'    => "$cust_pkg_fields, $part_pkg_fields, $num_svcs",
+    'addl_from' => 'LEFT JOIN part_pkg USING ( pkgpart )',
+  } );
+  my $num_old_packages = scalar(@packages);
+
+  foreach my $cust_pkg ( @packages ) {
+    my %hash = $cust_pkg->hash;
+    my %part_pkg = map  { /^part_pkg_(.+)$/ or die; ( $1 => $hash{$_} ); }
+                   grep { /^part_pkg_/ } keys %hash;
+    $cust_pkg->{'_pkgpart'} = new FS::part_pkg \%part_pkg;
+  }
+
+  unless ( $cgi->param('showoldpackages') ) {
+    my $years = $conf->config('cust_main-packages-years') || 2;
+    my $then = time - $years * 31556926; #60*60*24*365.2422 is close enough
+
+    my %hide = ( 'cancelled'       => 'cancel',
+                 'one-time charge' => 'setup',
+               );
+  
+    @packages =
+      grep { !exists($hide{$_->status}) or $_->get($hide{$_->status}) > $then
+             or $_->num_svcs #don't hide packages w/services
+           }
+           @packages;
+  }
+
+  $num_old_packages -= scalar(@packages);
 
-sub order_pkg_link {
-  include( '/elements/popup_link-cust_main.html',
-             'action'      => $p. 'misc/order_pkg.html',
-             'label'       => 'Order&nbsp;new&nbsp;package',
-             'actionlabel' => 'Order new package',
-             'color'       => '#333399',
-             'cust_main'   => shift,
-             'closetext'   => 'Close',
-             'width'       => 763,
-         )
+  ( \@packages, $num_old_packages );
 }
 
 </%init>