modular price plans!
[freeside.git] / httemplate / view / cust_main.cgi
index 4497713..9aa0089 100755 (executable)
@@ -300,13 +300,25 @@ if ( defined $cust_main->dbdef_table->column('comments')
         '</PRE></TD></TR></TABLE></TABLE>';
 }
 
-print '</TD></TR></TABLE>';
+%>
 
-print '<BR>'.
-  '<FORM ACTION="'.popurl(2).'edit/process/quick-cust_pkg.cgi" METHOD="POST">'.
-  qq!<INPUT TYPE="hidden" NAME="custnum" VALUE="$custnum">!.
-  '<SELECT NAME="pkgpart"><OPTION> ';
+</TD></TR></TABLE>
 
+<BR>
+<SCRIPT TYPE="text/javascript">
+function enable_order_pkg () {
+  if ( document.OrderPkgForm.pkgpart.selectedIndex > 0 ) {
+    document.OrderPkgForm.submit.disabled = false;
+  } else {
+    document.OrderPkgForm.submit.disabled = true;
+  }
+}
+</SCRIPT>
+<FORM NAME="OrderPkgForm" ACTION="<%= $p %>edit/process/quick-cust_pkg.cgi" METHOD="POST">
+<INPUT TYPE="hidden" NAME="custnum" VALUE="<%= $custnum %>">
+<SELECT NAME="pkgpart" onChange="enable_order_pkg()"><OPTION>Order additional package
+
+<%
 foreach my $part_pkg (
   qsearch( 'part_pkg', { 'disabled' => '' }, '',
            ' AND 0 < ( SELECT COUNT(*) FROM type_pkgs '.
@@ -314,11 +326,13 @@ foreach my $part_pkg (
            '             AND type_pkgs.pkgpart = part_pkg.pkgpart )'
          )
 ) {
-  print '<OPTION VALUE="'. $part_pkg->pkgpart. '">'. $part_pkg->pkg. ' - '.
-        $part_pkg->comment;
-}
+%>
+<OPTION VALUE="<%= $part_pkg->pkgpart %>"><%= $part_pkg->pkg %> - <%= $part_pkg->comment %>
+<% } %>
 
-print '</SELECT><INPUT TYPE="submit" VALUE="Order Package"></FORM><BR>';
+</SELECT><INPUT NAME="submit" TYPE="submit" VALUE="Order Package" disabled></FORM><BR>
+
+<%
 
 if ( $conf->config('payby-default') ne 'HIDE' ) {
 
@@ -397,27 +411,13 @@ foreach my $pkg (sort pkgsort_pkgnum_cancel @$packages) {
   #}
   print "<TD ROWSPAN=$rowspan>". &itable('');
 
-  sub freq {
-
-    #false laziness w/edit/part_pkg.cgi
-    my %freq = ( #move this
-      '1d' => 'daily',
-      '1w' => 'weekly',
-      '2w' => 'biweekly (every 2 weeks)',
-      '1'  => 'monthly',
-      '2'  => 'bimonthly (every 2 months)',
-      '3'  => 'quarterly (every 3 months)',
-      '6'  => 'semiannually (every 6 months)',
-      '12' => 'annually',
-      '24' => 'biannually (every 2 years)',
-    );
-
-    my $freq = shift;
-    exists $freq{$freq} ? $freq{$freq} : "every&nbsp;$freq&nbsp;months";
+  sub myfreq {
+    my $part_pkg = shift;
+    my $freq = $part_pkg->freq_pretty;
+    $freq =~ s/ /&nbsp;/g;
+    $freq;
   }
 
-  #eomove
-
   if ( $pkg->{cancel} ) { #status: cancelled
 
     print '<TR><TD><FONT COLOR="#ff0000"><B>Cancelled&nbsp;</B></FONT></TD>'.
@@ -466,7 +466,7 @@ foreach my $pkg (sort pkgsort_pkgnum_cancel @$packages) {
           print '<TR><TD COLSPAN=2>(&nbsp;'. pkg_cancel_link($pkg).
                 '&nbsp;)</TD</TR>';
         } else {
-          print 'billed&nbsp;'. freq($pkg->{freq}). ')</TD></TR>';
+          print 'billed&nbsp;'. myfreq($pkg->{part_pkg}). ')</TD></TR>';
         }
 
       } else { #setup
@@ -477,7 +477,7 @@ foreach my $pkg (sort pkgsort_pkgnum_cancel @$packages) {
                 pkg_datestr($pkg,'setup',$conf). '</TD></TR>';
         } else {
           print '<TR><TD COLSPAN=2><FONT COLOR="#00CC00"><B>Active</B></FONT>'.
-                ',&nbsp;billed&nbsp;'. freq($pkg->{freq}). '</TD></TR>'.
+                ',&nbsp;billed&nbsp;'. myfreq($pkg->{part_pkg}). '</TD></TR>'.
                 '<TR><TD>Setup&nbsp;</TD><TD>'.
                 pkg_datestr($pkg, 'setup',$conf). '</TD></TR>';
         }
@@ -570,6 +570,7 @@ print '</TABLE>';
 
     my $target = "$payby$payinfo";
     $payby =~ s/^BILL$/Check #/ if $payinfo;
+    $payby =~ s/^CHEK$/Electronic check /;
     $payby =~ s/^BILL$//;
     $payby =~ s/^(CARD|COMP)$/$1 /;
     my $info = $payby ? " ($payby$payinfo)" : '';
@@ -625,17 +626,17 @@ print '</TABLE>';
     my $refund = '';
     my $refund_days = $conf->config('card_refund-days') || 120;
     if (    $cust_pay->closed !~ /^Y/i
-         && $cust_pay->payby eq 'CARD' 
+         && $cust_pay->payby =~ /^(CARD|CHEK)$/
          && time-$cust_pay->_date < $refund_days*86400
          && $cust_pay->unrefunded > 0
     ) {
-      $refund = qq! (<A HREF="!. qq!${p}edit/cust_refund.cgi?payby=CARD;!.
+      $refund = qq! (<A HREF="!. qq!${p}edit/cust_refund.cgi?payby=$1;!.
                 qq!paynum=!. $cust_pay->paynum. qq!">refund</A>)!;
     }
 
     my $void = '';
     if (    $cust_pay->closed !~ /^Y/i
-         && $cust_pay->payby ne 'CARD'
+         && $cust_pay->payby !~  /^(CARD|CHEK)$/
        ) {
       $void = qq! (<A HREF="javascript:areyousure('!.
               qq!${p}misc/void-cust_pay.cgi?!. $cust_pay->paynum.
@@ -679,6 +680,7 @@ print '</TABLE>';
                     : $cust_pay_void->payinfo;
 
     $payby =~ s/^BILL$/Check #/ if $payinfo;
+    $payby =~ s/^CHEK$/Electronic check /;
     $payby =~ s/^BILL$//;
     $payby =~ s/^(CARD|COMP)$/$1 /;
     my $info = $payby ? " ($payby$payinfo)" : '';
@@ -783,6 +785,7 @@ print '</TABLE>';
                     : $cust_refund->payinfo;
 
     $payby =~ s/^BILL$/Check #/ if $payinfo;
+    $payby =~ s/^CHEK$/Electronic check /;
     $payby =~ s/^(CARD|COMP)$/$1 /;
 
     push @history, {
@@ -883,8 +886,13 @@ sub get_packages {
   ) { 
   
     my $part_pkg = $cust_pkg->part_pkg;
-  
+
     my %pkg = ();
+
+    #to get back to the original object... should use it in the first place!!
+    $pkg{cust_pkg} = $cust_pkg;
+    $pkg{part_pkg} = $part_pkg;
+
     $pkg{pkgnum} = $cust_pkg->pkgnum;
     $pkg{pkg} = $part_pkg->pkg;
     $pkg{pkgpart} = $part_pkg->pkgpart;
@@ -896,29 +904,16 @@ sub get_packages {
     $pkg{susp} = $cust_pkg->getfield('susp');
     $pkg{expire} = $cust_pkg->getfield('expire');
     $pkg{cancel} = $cust_pkg->getfield('cancel');
-  
-    my %svcparts = ();
 
-    foreach my $pkg_svc (
-      qsearch('pkg_svc', { 'pkgpart' => $part_pkg->pkgpart })
-    ) {
-  
-      next if ($pkg_svc->quantity == 0);
   
-      my $part_svc = qsearchs('part_svc', { 'svcpart' => $pkg_svc->svcpart });
-  
-      my $svcpart = {};
-      $svcpart->{svcpart} = $part_svc->svcpart;
-      $svcpart->{svc} = $part_svc->svc;
-      $svcpart->{svcdb} = $part_svc->svcdb;
-      $svcpart->{quantity} = $pkg_svc->quantity;
-      $svcpart->{count} = 0;
-  
-      $svcpart->{services} = [];
-
-      $svcparts{$svcpart->{svcpart}} = $svcpart;
-
-    }
+    my %svcparts = map {
+      $_->svcpart => {
+                       $_->part_svc->hash,
+                       'quantity' => $_->quantity,
+                       'count'    => $cust_pkg->num_cust_svc($_->svcpart),
+                       #'services' => [],
+                     };
+    } $part_pkg->pkg_svc;
 
     foreach my $cust_svc ( $cust_pkg->cust_svc ) {
       #warn "svcnum ". $cust_svc->svcnum. " / svcpart ". $cust_svc->svcpart. "\n";
@@ -930,18 +925,14 @@ sub get_packages {
       #false laziness with above, to catch extraneous services.  whole
       #damn thing should be OO...
       my $svcpart = ( $svcparts{$cust_svc->svcpart} ||= {
-        'svcpart'  => $cust_svc->svcpart,
-        'svc'      => $cust_svc->part_svc->svc,
-        'svcdb'    => $cust_svc->part_svc->svcdb,
+        $cust_svc->part_svc->hash,
         'quantity' => 0,
-        'count'    => 0,
-        'services' => [],
+        'count'    => $cust_pkg->num_cust_svc($cust_svc->svcpart),
+        #'services' => [],
       } );
 
       push @{$svcpart->{services}}, $svc;
 
-      $svcpart->{count}++;
-
     }
 
     $pkg{svcparts} = [ values %svcparts ];
@@ -971,11 +962,21 @@ sub svc_label_link {
 sub svc_provision_link {
   my ($pkg, $svcpart, $conf) = @_;
   ( my $svc_nbsp = $svcpart->{svc} ) =~ s/\s+/&nbsp;/g;
-  my $pkgnum_svcpart = "pkgnum$pkg->{pkgnum}-svcpart$svcpart->{svcpart}";
   my $num_left = $svcpart->{quantity} - $svcpart->{count};
+  my $pkgnum_svcpart = "pkgnum$pkg->{pkgnum}-svcpart$svcpart->{svcpart}";
 
-  my $link = qq!<A CLASS="provision" HREF="${p}edit/$svcpart->{svcdb}.cgi?!.
-             qq!$pkgnum_svcpart">!.
+  my $url;
+  if ( $svcpart->{svcdb} eq 'svc_external'
+       && $conf->exists('svc_external-skip_manual')
+  ) {
+    $url = "${p}edit/process/$svcpart->{svcdb}.cgi?".
+           "pkgnum=$pkg->{pkgnum}&".
+           "svcpart=$svcpart->{svcpart}";
+  } else {
+    $url = "${p}edit/$svcpart->{svcdb}.cgi?$pkgnum_svcpart";
+  }
+
+  my $link = qq!<A CLASS="provision" HREF="$url">!.
              "Provision&nbsp;$svc_nbsp&nbsp;($num_left)</A>";
   if ( $conf->exists('legacy_link') ) {
     $link .= '<BR>'.