Merge branch 'FREESIDE_4_BRANCH' of git.freeside.biz:/home/git/freeside into 4.x
authorMark Wells <mark@freeside.biz>
Tue, 19 Jul 2016 19:56:49 +0000 (12:56 -0700)
committerMark Wells <mark@freeside.biz>
Tue, 19 Jul 2016 19:56:49 +0000 (12:56 -0700)
FS/FS/quotation.pm
httemplate/edit/process/quotation_convert.html
httemplate/edit/svc_acct.cgi
httemplate/edit/svc_acct/communigate.html
httemplate/elements/tr-select-router_block_ip.html
httemplate/view/quotation.html
httemplate/view/svc_acct/basics.html

index 0549853..c61e001 100644 (file)
@@ -350,7 +350,7 @@ sub _items_sections {
 
 sub enable_previous { 0 }
 
-=item convert_cust_main
+=item convert_cust_main [ PARAMS ]
 
 If this quotation already belongs to a customer, then returns that customer, as
 an FS::cust_main object.
@@ -362,10 +362,13 @@ packages as real packages for the customer.
 If there is an error, returns an error message, otherwise, returns the
 newly-created FS::cust_main object.
 
+Accepts the same params as L</order>.
+
 =cut
 
 sub convert_cust_main {
   my $self = shift;
+  my $params = shift || {};
 
   my $cust_main = $self->cust_main;
   return $cust_main if $cust_main; #already converted, don't again
@@ -382,7 +385,7 @@ sub convert_cust_main {
 
   $self->prospectnum('');
   $self->custnum( $cust_main->custnum );
-  my $error = $self->replace || $self->order;
+  my $error = $self->replace || $self->order(undef,$params);
   if ( $error ) {
     $dbh->rollback if $oldAutoCommit;
     return $error;
@@ -394,7 +397,7 @@ sub convert_cust_main {
 
 }
 
-=item order [ HASHREF ]
+=item order [ HASHREF ] [ PARAMS ]
 
 This method is for use with quotations which are already associated with a customer.
 
@@ -406,11 +409,16 @@ If HASHREF is passed, it will be filled with a hash mapping the
 C<quotationpkgnum> of each quoted package to the C<pkgnum> of the package
 as ordered.
 
+If PARAMS hashref is passed, the following params are accepted:
+
+onhold - if true, suspends newly ordered packages
+
 =cut
 
 sub order {
   my $self = shift;
   my $pkgnum_map = shift || {};
+  my $params = shift || {};
   my $details_map = {};
 
   tie my %all_cust_pkg, 'Tie::RefHash';
@@ -461,10 +469,11 @@ sub order {
     }
   }
 
-  foreach my $quotationpkgnum (keys %$pkgnum_map) {
-    # convert the objects to just pkgnums
-    my $cust_pkg = $pkgnum_map->{$quotationpkgnum};
-    $pkgnum_map->{$quotationpkgnum} = $cust_pkg->pkgnum;
+  if ($$params{'onhold'}) {
+    foreach my $quotationpkgnum (keys %$pkgnum_map) {
+      last if $error;
+      $error = $pkgnum_map->{$quotationpkgnum}->suspend();
+    }
   }
 
   if ($error) {
@@ -473,6 +482,13 @@ sub order {
   }
 
   $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+
+  foreach my $quotationpkgnum (keys %$pkgnum_map) {
+    # convert the objects to just pkgnums
+    my $cust_pkg = $pkgnum_map->{$quotationpkgnum};
+    $pkgnum_map->{$quotationpkgnum} = $cust_pkg->pkgnum;
+  }
+
   ''; #no error
 
 }
index dc00a88..26b5294 100644 (file)
@@ -10,9 +10,12 @@ my $quotation = qsearchs( 'quotation' => {
   quotationnum => scalar( $cgi->param('quotationnum') ),
 } ) or die 'unknown quotationnum';
 
+my $params = {};
+$$params{'onhold'} = $cgi->param('onhold') ? 1 : 0;
+
 my $cust_main = $quotation->cust_main;
 if ( $cust_main ) {
-  my $error = $quotation->order;
+  my $error = $quotation->order(undef,$params);
   errorpage($error) if $error;
 
   #i should be part of the order transaction
@@ -20,7 +23,7 @@ if ( $cust_main ) {
   $quotation->replace;
 
 } else {
-  $cust_main = $quotation->convert_cust_main;
+  $cust_main = $quotation->convert_cust_main( $params );
   errorpage($cust_main) unless ref($cust_main);# eq 'FS::cust_main';
 }
 
index ca26c6c..7be5eab 100755 (executable)
@@ -31,7 +31,7 @@
 </TR>
 
 <% include('/elements/tr-td-label.html',
-     'label'    => mt('Username'),
+     'label'    => $part_svc->part_svc_column('username')->columnlabel || mt('Username'),
      'required' => $part_svc->part_svc_column('username')->required ) %>
 % if ( $svcnum && $conf->exists('svc_acct-no_edit_username') ) {
     <TD BGCOLOR="#eeeeee"><% $svc_acct->username() %></TD>
@@ -46,7 +46,7 @@
 %if ( $part_svc->part_svc_column('_password')->columnflag ne 'F' ) {
 % #XXX eventually should require "Edit Password" ACL
 <% include('/elements/tr-td-label.html',
-     'label'    => mt('Password'),
+     'label'    => $part_svc->part_svc_column('_password')->columnlabel || mt('Password'),
      'required' => $part_svc->part_svc_column('_password')->required ) %>
   <TD>
     <INPUT TYPE="text" ID="clear_password" NAME="clear_password" VALUE="<% $password %>" SIZE=<% $pmax2 %> MAXLENGTH=<% $pmax %>>
@@ -68,7 +68,7 @@
 %  && $part_svc->part_svc_column('sec_phrase')->columnflag ne 'F' ) {
 
 <% include('/elements/tr-td-label.html',
-     'label'    => mt('Security phrase'),
+     'label'    => $part_svc->part_svc_column('sec_phrase')->columnlabel || mt('Security phrase'),
      'required' => $part_svc->part_svc_column('sec_phrase')->required ) %>
     <TD>
       <INPUT TYPE="text" NAME="sec_phrase" VALUE="<% $sec_phrase %>" SIZE=32>
 %                );
 
 <% include('/elements/tr-td-label.html',
-     'label'    => mt('Domain'),
+     'label'    => $part_svc->part_svc_column('domsvc')->columnlabel || mt('Domain'),
      'required' => $part_svc->part_svc_column('domsvc')->required ) %>
     <TD>
       <SELECT NAME="domsvc" SIZE=1>
              'curr_value' => $svc_acct->pbxsvc,
              'part_svc'   => $part_svc,
              'cust_pkg'   => $cust_pkg,
+             'label'      => $part_svc->part_svc_column('pbxsvc')->columnlabel || 'PBX',
 &>
 
 %#pop
 % } else { 
 
 <% include('/elements/tr-td-label.html',
-     'label'    => mt('Access number'),
+     'label'    => $part_svc->part_svc_column('popnum')->columnlabel || mt('Access number'),
      'required' => $part_svc->part_svc_column('popnum')->required ) %>
     <TD><% FS::svc_acct_pop::popselector($popnum) %></TD>
   </TR>
          #'part_svc'   => $part_svc,
          #'cust_pkg'   => $cust_pkg,
          'required'   => $part_svc->part_svc_column('sectornum')->required,
+         'label'       => $part_svc->part_svc_column('sectornum')->columnlabel || mt('Tower sector'),
     &>
 %} else {
     <INPUT TYPE="hidden" NAME="sectornum" VALUE="<% $svc_acct->sectornum %>">
 % if ( length($svc_acct->$xid()) ) { 
 
 <% include('/elements/tr-td-label.html',
-     'label'    => uc($xid),
+     'label'    => $part_svc->part_svc_column($xid)->columnlabel || uc($xid),
      'required' => $part_svc->part_svc_column($xid)->required ) %>
-      <TR>
-        <TD ALIGN="right"><% uc($xid) %></TD>
+%#      <TR>
+%#        <TD ALIGN="right"><% uc($xid) %></TD>
           <TD BGCOLOR="#eeeeee"><% $svc_acct->$xid() %></TD>
         <TD>
         </TD>
 % } else { 
   
 <% include('/elements/tr-td-label.html',
-     'label'    => uc($xid),
+     'label'    => $part_svc->part_svc_column($xid)->columnlabel || uc($xid),
      'required' => $part_svc->part_svc_column($xid)->required ) %>
       <TD>
         <INPUT TYPE="text" NAME="<% $xid %>" SIZE=8 MAXLENGTH=6 VALUE="<% $svc_acct->$xid() %>">
 
 
 <% include('/elements/tr-td-label.html',
-     'label'    => mt('Real Name'),
+     'label'    => $part_svc->part_svc_column('finger')->columnlabel || mt('Real Name'),
      'required' => $part_svc->part_svc_column('finger')->required ) %>
     <TD>
       <INPUT TYPE="text" NAME="finger" VALUE="<% $svc_acct->finger %>">
 
 
 <% include('/elements/tr-td-label.html',
-     'label'    => mt('Home directory'),
+     'label'    => $part_svc->part_svc_column('dir')->columnlabel || mt('Home directory'),
      'required' => $part_svc->part_svc_column('dir')->required ) %>
     <TD><INPUT TYPE="text" NAME="dir" VALUE="<% $svc_acct->dir %>"></TD>
   </TR>
 
 
 <% include('/elements/tr-td-label.html',
-     'label'    => mt('Shell'),
+     'label'    => $part_svc->part_svc_column('shell')->columnlabel || mt('Shell'),
      'required' => $part_svc->part_svc_column('shell')->required ) %>
     <TD>
       <SELECT NAME="shell" SIZE=1>
   'object' => $svc_acct,
   'ip_field' => 'slipip',
   'required' => $part_svc->part_svc_column('routernum')->required,
+  'label'    => $part_svc->part_svc_column('routernum')->columnlabel,
   'ip_addr_required' => $part_svc->part_svc_column('slipip')->required,
+  'ip_addr_label' => $part_svc->part_svc_column('slipip')->columnlabel,
 &>
 % } else {
 %   # don't expose these to the user--they're only useful in the other case
     <INPUT TYPE="hidden" NAME="slipip" VALUE="<% $svc_acct->slipip %>">
 %   } else { 
 <% include('/elements/tr-td-label.html',
-     'label'    => mt('IP'),
+     'label'    => $part_svc->part_svc_column('slipip')->columnlabel || mt('IP'),
      'required' => $part_svc->part_svc_column('slipip')->required ) %>
       <TD><INPUT TYPE="text" NAME="slipip" VALUE="<% $svc_acct->slipip %>"></TD>
     </TR>
 
 
 <% include('/elements/tr-td-label.html',
-     'label'    => mt('RADIUS groups'),
+     'label'    => $part_svc->part_svc_column('usergroup')->columnlabel || mt('RADIUS groups'),
      'required' => $part_svc->part_svc_column('usergroup')->required ) %>
 % if ( $part_svc_usergroup->columnflag eq 'F' ) { 
     <TD BGCOLOR="#eeeeee"><% join('<BR>', @groupnames) %></TD>
index 370bfb0..544d00b 100644 (file)
@@ -46,7 +46,7 @@
 % if ( $part_svc->part_svc_column('quota')->columnflag eq 'F' ) { 
   <INPUT TYPE="hidden" NAME="quota" VALUE="<% $svc_acct->quota %>">
 % } else {
-%   my $quota_label = $communigate ? 'Mail storage limit' : 'Quota';
+%   my $quota_label = $communigate ? 'Mail storage limit' : ($part_svc->part_svc_column('quota')->columnlabel || 'Quota');
 <% include('/elements/tr-td-label.html',
      'label'    => $quota_label,
      'required' => $part_svc->part_svc_column('quota')->required ) %>
index ee13568..2aa715e 100644 (file)
@@ -56,7 +56,7 @@ function clearhint_ip_addr (what) {
 ]
 &>
 </td></tr>
-<& /elements/tr-td-label.html, label => 'IP address', required => $opt{'ip_addr_required'} &>
+<& /elements/tr-td-label.html, label => ($opt{'ip_addr_label'} || 'IP address'), required => $opt{'ip_addr_required'} &>
 <td>
 % #warn Dumper \%fixed;
 % if ( exists $fixed{$ip_field} ) {
index 7221d53..58d398c 100755 (executable)
@@ -67,7 +67,9 @@ function areyousure(href, message) {
     <BR><BR>
 
 %   if ( $curuser->access_right('New customer') && $quotation->quotation_pkg ) {
+%     # if we end up with more than one option, combine these links and add an interstitial screen
       <A HREF="<%$p%>edit/process/quotation_convert.html?quotationnum=<% $quotation->quotationnum %>">Place order</A>
+      | <A HREF="<%$p%>edit/process/quotation_convert.html?quotationnum=<% $quotation->quotationnum %>&onhold=1">Order on hold</A>
       <BR><BR>
 %   }
 
index 1b7d56b..5532c22 100644 (file)
@@ -1,18 +1,18 @@
 <% &ntable("#cccccc") %><TR><TD><% &ntable("#cccccc",2) %>
 
-<& /view/elements/tr.html, label=>mt('Service'),  value=>$part_svc->svc &>
+<& /view/elements/tr.html, label=> $part_svc->part_svc_column('svc')->columnlabel || mt('Service'),  value=>$part_svc->svc &>
 % if ( $opt{cust_svc}->agent_svcid ) {
   <& /view/elements/tr.html, label=>mt('Legacy ID'),  value=>$opt{cust_svc}->agent_svcid &>
 % }
-<& /view/elements/tr.html, label=>mt('Username'), value=>$svc_acct->username &>
-<& /view/elements/tr.html, label=>mt('Domain'),   value=>$domain &>
+<& /view/elements/tr.html, label=> $part_svc->part_svc_column('username')->columnlabel || mt('Username'), value=>$svc_acct->username &>
+<& /view/elements/tr.html, label=> $part_svc->part_svc_column('domsvc')->columnlabel || mt('Domain'),   value=>$domain &>
 
 % if ( $opt{'communigate'} ) {
   <& /view/elements/tr.html, label=>mt('Aliases'), value=>$svc_acct->cgp_aliases &>
 %}
 
 % if ( $svc_acct->pbxsvc ) {
-  <& /view/elements/tr.html, label=>mt('PBX'), value=>$svc_acct->pbx_title &>
+  <& /view/elements/tr.html, label=> $part_svc->part_svc_column('pbxsvc')->columnlabel || mt('PBX'), value=>$svc_acct->pbx_title &>
 %}
 
 % my $show_pw = '';
@@ -38,7 +38,7 @@
 %   # show nothing
 % } else {
 <TR>
-  <TD ALIGN="right"><% mt('Password') %></TD>
+  <TD ALIGN="right"><% $psc->columnlabel || mt('Password') %></TD>
   <TD STYLE="background-color: #ffffff; white-space: nowrap">
   <% $show_pw %>
 %   my $curuser = $FS::CurrentUser::CurrentUser;
 % }
 
 % if ( $conf->exists('security_phrase') ) {
-  <& /view/elements/tr.html, label=>mt('Security phrase'), value=>$svc_acct->sec_phrase &>
+  <& /view/elements/tr.html, label=> $part_svc->part_svc_column('sec_phrase')->columnlabel || mt('Security phrase'), value=>$svc_acct->sec_phrase &>
 % } 
 
 % if ( $svc_acct->popnum ) {
 %   my $svc_acct_pop = qsearchs('svc_acct_pop',{'popnum'=>$svc_acct->popnum});
-    <& /view/elements/tr.html, label=>mt('Access number'), value=>$svc_acct_pop->text &>
+    <& /view/elements/tr.html, label=> $part_svc->part_svc_column('popnum')->columnlabel || mt('Access number'), value=>$svc_acct_pop->text &>
 % } 
 
 % if ( $svc_acct->sectornum && $conf->exists('svc_acct-tower_sector') ) {
@@ -72,7 +72,7 @@
 %                ? '<A HREF="http://'. $tower_sector->ip_addr. '">'
 %                : '';
     <& /view/elements/tr.html,
-        label => mt('Tower sector'),
+        label =>  $part_svc->part_svc_column('sectornum')->columnlabel || mt('Tower sector'),
         value => $link. $tower_sector->description. ($link ? '</A>' : ''),
     &>
 % }
 &>
 
 % if ($svc_acct->uid ne '') { 
-  <& /view/elements/tr.html, label=>mt('UID'), value=>$svc_acct->uid &>
+  <& /view/elements/tr.html, label=> $part_svc->part_svc_column('uid')->columnlabel || mt('UID'), value=>$svc_acct->uid &>
 % } 
 
 % if ($svc_acct->gid ne '') { 
-  <& /view/elements/tr.html, label=>mt('GID'), value=>$svc_acct->gid &>
+  <& /view/elements/tr.html, label=> $part_svc->part_svc_column('gid')->columnlabel || mt('GID'), value=>$svc_acct->gid &>
 % } 
 
 % if ($svc_acct->finger ne '') { 
-  <& /view/elements/tr.html, label=>mt('Real Name'), value=>$svc_acct->finger &>
+  <& /view/elements/tr.html, label=> $part_svc->part_svc_column('finger')->columnlabel || mt('Real Name'), value=>$svc_acct->finger &>
 % } 
 
 % if ($svc_acct->dir ne '') { 
-  <& /view/elements/tr.html, label=>mt('Home directory'), value=>$svc_acct->dir &>
+  <& /view/elements/tr.html, label=> $part_svc->part_svc_column('dir')->columnlabel || mt('Home directory'), value=>$svc_acct->dir &>
 % } 
 
 % if ($svc_acct->shell ne '') { 
-  <& /view/elements/tr.html, label=>mt('Shell'), value=>$svc_acct->shell &>
+  <& /view/elements/tr.html, label=> $part_svc->part_svc_column('shell')->columnlabel || mt('Shell'), value=>$svc_acct->shell &>
 % } 
 
 % if ($svc_acct->quota ne '' && ! $opt{'communigate'} ) { 
 
-  <& /view/elements/tr.html, label=>mt('Quota'), value=>$svc_acct->quota &>
+  <& /view/elements/tr.html, label=> $part_svc->part_svc_column('quota')->columnlabel || mt('Quota'), value=>$svc_acct->quota &>
 
 % } elsif ( $opt{'communigate'} ) {
 
@@ -133,7 +133,7 @@ sub slipip {
 
 % if ($svc_acct->slipip) { 
   <& /view/elements/tr.html,
-       label=>mt('IP address'),
+       label=> $part_svc->part_svc_column('slipip')->columnlabel || mt('IP address'),
        value=> slipip($svc_acct)
   &>
 % } 
@@ -156,7 +156,7 @@ sub slipip {
     &>
 % } 
 
-<& /view/elements/tr.html, label=>mt('RADIUS groups'),
+<& /view/elements/tr.html, label=> $part_svc->part_svc_column('usergroup')->columnlabel || mt('RADIUS groups'),
     value=>join('<BR>', $svc_acct->radius_groups('long_description')) &>
 
 <& router.html, 'svc_acct' => $svc_acct &>