UI to change package quantities, #18330
authorMark Wells <mark@freeside.biz>
Wed, 27 Mar 2013 00:01:10 +0000 (17:01 -0700)
committerMark Wells <mark@freeside.biz>
Wed, 27 Mar 2013 00:01:51 +0000 (17:01 -0700)
FS/FS/cust_pkg.pm
httemplate/edit/cust_pkg_quantity.html [new file with mode: 0755]
httemplate/edit/process/cust_pkg_quantity.html [new file with mode: 0644]
httemplate/view/cust_main/packages/package.html

index 87acf0e..374cf7a 100644 (file)
@@ -1931,6 +1931,24 @@ sub change {
 
 }
 
+=item set_quantity QUANTITY
+
+Change the package's quantity field.  This is the one package property
+that can safely be changed without canceling and reordering the package
+(because it doesn't affect tax eligibility).  Returns an error or an 
+empty string.
+
+=cut
+
+sub set_quantity {
+  my $self = shift;
+  $self = $self->replace_old; # just to make sure
+  my $qty = shift;
+  ($qty =~ /^\d+$/ and $qty > 0) or return "bad package quantity $qty";
+  $self->set('quantity' => $qty);
+  $self->replace;
+}
+
 use Storable 'thaw';
 use MIME::Base64;
 sub process_bulk_cust_pkg {
diff --git a/httemplate/edit/cust_pkg_quantity.html b/httemplate/edit/cust_pkg_quantity.html
new file mode 100755 (executable)
index 0000000..ec47ed6
--- /dev/null
@@ -0,0 +1,49 @@
+<& /elements/header-popup.html, "Change Quantity" &>
+<& /elements/error.html &>
+
+<FORM ACTION="<% $p %>edit/process/cust_pkg_quantity.html" METHOD=POST>
+<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $pkgnum %>">
+<& /elements/table-grid.html, 'bgcolor' => '#cccccc', 'cellpadding' => 2 &>
+
+  <TR>
+    <TH ALIGN="right">Current package&nbsp;</TH>
+    <TD CLASS="grid">
+      <% $curuser->option('show_pkgnum') ? $cust_pkg->pkgnum.': ' : '' %><B><% $part_pkg->pkg |h %></B> - <% $part_pkg->comment |h %>
+    </TD>
+  </TR>
+
+<& /elements/tr-input-text.html,
+    'field'       => 'quantity',
+    'curr_value'  => $cust_pkg->quantity,
+    'label'       => emt('Quantity')
+&>
+
+</TABLE>
+
+<BR>
+<INPUT NAME="submit" TYPE="submit" VALUE="Change">
+
+</FORM>
+</BODY>
+</HTML>
+
+<%init>
+
+#some false laziness w/misc/change_pkg.cgi
+
+my $conf = new FS::Conf;
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+die "access denied"
+  unless $curuser->access_right('Change customer package');
+
+my $pkgnum = scalar($cgi->param('pkgnum'));
+$pkgnum =~ /^(\d+)$/ or die "illegal pkgnum $pkgnum";
+$pkgnum = $1;
+
+my $cust_pkg = FS::cust_pkg->by_key($pkgnum) or die "unknown pkgnum $pkgnum";
+
+my $part_pkg = $cust_pkg->part_pkg;
+
+</%init>
diff --git a/httemplate/edit/process/cust_pkg_quantity.html b/httemplate/edit/process/cust_pkg_quantity.html
new file mode 100644 (file)
index 0000000..fb26572
--- /dev/null
@@ -0,0 +1,33 @@
+% if ($error) {
+%   $cgi->param('error', $error);
+%   $cgi->redirect(popurl(3). 'edit/cust_pkg_quantity.html?'. $cgi->query_string );
+% } else {
+
+    <& /elements/header-popup.html, "Quantity changed" &>
+      <SCRIPT TYPE="text/javascript">
+        window.top.location.reload();
+      </SCRIPT>
+    </BODY>
+    </HTML>
+
+% }
+<%init>
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+die "access denied"
+  unless $curuser->access_right('Change customer package');
+
+my $cust_pkg = qsearchs({
+  'table'     => 'cust_pkg',
+  'addl_from' => 'LEFT JOIN cust_main USING ( custnum )',
+  'hashref'   => { 'pkgnum' => scalar($cgi->param('pkgnum')), },
+  'extra_sql' => ' AND '. $curuser->agentnums_sql,
+});
+die 'unknown pkgnum' unless $cust_pkg;
+
+$cgi->param('quantity') =~ /^(\d+)$/;
+my $quantity = $1;
+my $error = $cust_pkg->set_quantity($1);
+
+</%init>
index d0fc182..0b72d19 100644 (file)
       <TD COLSPAN=2>
         <FONT SIZE=-1>
 
-%         unless ( $cust_pkg->get('cancel') ) { 
+%         unless ( $cust_pkg->get('cancel') ) {
 %
-%           if ( $supplemental ) {
-%             # then only show "Edit dates", "Add invoice details", and "Add
-%             # comments".
+%           if ( $supplemental or $part_pkg->freq eq '0' ) {
+%             # Supplemental packages can't be changed independently.
+%             # One-time charges don't need to be changed.
+%             # For both of those, we only show "Edit dates", "Add comments",
+%             # and "Add invoice details".
 %             if ( $curuser->access_right('Edit customer package dates') ) {
                 (&nbsp;<%pkg_dates_link($cust_pkg)%>&nbsp;)
 %             }
 %           } else {
-%             # the usual case
+%             # the usual case: links to change package definition,
+%             # discount, and customization
 %             my $br = 0;
 %             if ( $curuser->access_right('Change customer package') ) {
 %               $br=1;
 %     if ( $curuser->access_right('Change customer package') and 
 %           !$cust_pkg->get('cancel') and
 %           !$supplemental and
-%           !$opt{'show_location'}) {
+%           $part_pkg->freq ne '0' ) {
       <TR>
+%       if ( !$opt{'show_location'} ) {
         <TD><FONT SIZE="-1">
           (&nbsp;<% pkg_change_location_link($cust_pkg) %>&nbsp;)
         </FONT></TD>
+%       }
+%       if ( FS::Conf->new->exists('invoice-unitprice') ) {
+        <TD><FONT SIZE="-1">
+          (&nbsp;<% pkg_change_quantity_link($cust_pkg) %>&nbsp;)
+        </FONT></TD>
+%       }
       </TR>
 %     }
 %   }
@@ -274,6 +284,17 @@ sub pkg_change_location_link {
   );
 }
 
+sub pkg_change_quantity_link {
+  include( '/elements/popup_link-cust_pkg.html',
+    'action'      => $p. 'edit/cust_pkg_quantity.html?',
+    'label'       => emt('Change quantity'),
+    'actionlabel' => emt('Change'),
+    'cust_pkg'    => shift,
+    'width'       => 390,
+    'height'      => 220,
+  );
+}
+
 sub pkg_dates_link { pkg_link('edit/REAL_cust_pkg', emt('Edit dates'), @_ ); }
 
 sub pkg_discount_link {