RT#71009: (v4+) OFM - Separate permissions for edit dates and contract dates
authorJonathan Prykop <jonathan@freeside.biz>
Wed, 27 Jul 2016 22:23:14 +0000 (17:23 -0500)
committerJonathan Prykop <jonathan@freeside.biz>
Wed, 27 Jul 2016 22:23:14 +0000 (17:23 -0500)
FS/FS/access_right.pm
httemplate/misc/change_pkg_date.html
httemplate/misc/process/change_pkg_date.html
httemplate/view/cust_main/packages/status.html

index 0ee0aa0..13a826f 100644 (file)
@@ -253,7 +253,9 @@ sub _upgrade_data { # class method
     'Generate quotation' => 'Disable quotation',
     'Add on-the-fly void credit reason' => 'Add on-the-fly void reason',
     '_ALL' => 'Employee preference telephony integration',
-    'Edit customer package dates' => 'Change package start date', #4.x
+    'Edit customer package dates' => [ 'Change package start date', #4.x
+                                       'Change package contract end date',
+                                     ],
     'Resend invoices' => 'Print and mail invoices',
   );
 
index 5a890c8..0a23805 100755 (executable)
@@ -3,11 +3,12 @@
 <& /elements/error.html &>
 
 % # only slightly different from unhold_pkg.
-<FORM NAME="MyForm" ACTION="process/change_pkg_start.html" METHOD=POST>
+<FORM NAME="MyForm" ACTION="process/change_pkg_date.html" METHOD=POST>
 <INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $pkgnum %>">
+<INPUT TYPE="hidden" NAME="field" VALUE="<% $field %>">
 
 <BR>
-<% emt('Start billing [_1]', $part_pkg->pkg_comment(cust_pkg => $cust_pkg)) %>
+<% emt(($isstart ? 'Start billing' : 'Set contract end for').' [_1]', $part_pkg->pkg_comment(cust_pkg => $cust_pkg)) %>
 <UL STYLE="padding-left: 3ex; list-style: none; background-color: #cccccc">
 <LI>
   <& /elements/radio.html,
@@ -16,7 +17,7 @@
     value => 'now',
     curr_value => $when,
   &>
-  <label for="when_now"><% emt('Immediately') %></label>
+  <label for="when_now"><% emt('Now') %></label>
 </LI>
 % if ( $next_bill_date ) {
 <LI>
 &>
 <label for="when_date"> <% emt('On this date:') %> </label>
 <& /elements/input-date-field.html,
-  { name  => 'start_date',
-    value => $cgi->param('start_date') || $cust_pkg->start_date,
+  { name  => 'date_value',
+    value => $cgi->param('date_value') || $cust_pkg->get($field),
   }
 &>
 </LI>
 </UL>
-<INPUT TYPE="submit" NAME="submit" VALUE="<% emt('Set start date') %>">
+<INPUT TYPE="submit" NAME="submit" VALUE="<% emt('Set '.($isstart ? 'start date' : 'contract end')) %>">
 
 </FORM>
 </BODY>
 
 <%init>
 
+my $field = $cgi->param('field');
+
+my ($acl, $isstart);
+if ($field eq 'start_date') {
+  $acl = 'Change package start date';
+  $isstart = 1;
+} elsif ($field eq 'contract_end') {
+  $acl = 'Change package contract end date';
+} else {
+  die "Unknown date field";
+}
+
 my $curuser = $FS::CurrentUser::CurrentUser;
 die "access denied"
-  unless $curuser->access_right('Change package start date');
+  unless $curuser->access_right($acl);
 
 my $pkgnum;
 if ( $cgi->param('pkgnum') =~ /^(\d+)$/ ) {
@@ -69,7 +82,7 @@ if ( $cgi->param('pkgnum') =~ /^(\d+)$/ ) {
 my $conf = new FS::Conf;
 my $date_format = $conf->config('date_format') || '%m/%d/%Y';
 
-my $title = 'Start billing package';
+my $title = $isstart ? 'Start billing package' : 'Change contract end';
 
 my $cust_pkg = qsearchs({
   table     => 'cust_pkg',
@@ -83,12 +96,12 @@ my $next_bill_date = $cust_pkg->cust_main->next_bill_date;
 my $part_pkg = $cust_pkg->part_pkg;
 
 # defaults:
-# sticky on error, then the existing start date if any, then the customer's
+# sticky on error, then the existing date if any, then the customer's
 # next bill date, and if none of those, default to now
 my $when = $cgi->param('when');
 
 if (!$when) {
-  if ($cust_pkg->start_date) {
+  if ($cust_pkg->get($field)) {
     $when = 'date';
   } elsif ($next_bill_date) {
     $when = 'next_bill_date';
index 17a8518..5b1eedf 100755 (executable)
@@ -6,9 +6,21 @@
 </HTML>
 <%init>
 
+my $field = $cgi->param('field');
+
+my ($acl, $isstart);
+if ($field eq 'start_date') {
+  $acl = 'Change package start date';
+  $isstart = 1;
+} elsif ($field eq 'contract_end') {
+  $acl = 'Change package contract end date';
+} else {
+  die "Unknown date field";
+}
+
 my $curuser = $FS::CurrentUser::CurrentUser;
 die "access denied"
-  unless $curuser->access_right('Change package start date');
+  unless $curuser->access_right($acl);
 
 $cgi->param('pkgnum') =~ /^(\d+)$/
   or die "illegal pkgnum";
@@ -24,23 +36,24 @@ my $cust_pkg = qsearchs({
 my $cust_main = $cust_pkg->cust_main;
 
 my $error;
-my $start_date;
+my $date_value;
 if ( $cgi->param('when') eq 'now' ) {
-  # start it the next time billing runs
-  $start_date = '';
+  # blank start means start it the next time billing runs
+  $date_value = $isstart ? '' : time;
 } elsif ( $cgi->param('when') eq 'next_bill_date' ) {
-  $start_date = $cust_main->next_bill_date;
+  $date_value = $cust_main->next_bill_date;
 } elsif ( $cgi->param('when') eq 'date' ) {
-  $start_date = parse_datetime($cgi->param('start_date'));
+  $date_value = parse_datetime($cgi->param('date_value'));
 }
 
-if ( $cust_pkg->setup ) {
+if ( $isstart && $cust_pkg->setup ) {
   # shouldn't happen
   $error = 'This package has already started billing.';
 } else {
   local $FS::UID::AutoCommit = 0;
   foreach my $pkg ($cust_pkg, $cust_pkg->supplemental_pkgs) {
-    $pkg->set('start_date', $start_date);
+    last if $error;
+    $pkg->set($field, $date_value);
     $error ||= $pkg->replace;
   }
   $error ? dbh->rollback : dbh->commit;
@@ -48,6 +61,6 @@ if ( $cust_pkg->setup ) {
 
 if ( $error ) {
   $cgi->param('error', $error);
-  print $cgi->redirect($fsurl.'misc/change_pkg_start.html?', $cgi->query_string);
+  print $cgi->redirect($fsurl.'misc/change_pkg_date.html?', $cgi->query_string);
 }
 </%init>
index 97011c3..3f629e1 100644 (file)
       <TR>
         <TD COLSPAN=<%$opt{colspan}%>>
           <FONT SIZE=-1>
+%           if ( !$cust_pkg->change_to_pkgnum # because on a technical level, change won't propagate,
+%                                             # and there's not really a use case worth making that work
+%                 and $part_pkg->freq # technically possible to have contract_end w/o freq, but nonsensical
+%                 and $curuser->access_right('Change package contract end date')
+%           ) {
+                (&nbsp;<% pkg_change_contract_end_link($cust_pkg) %>&nbsp;)
+                <BR>
+%           }
 %           if ( $cust_pkg->change_to_pkgnum ) {
 %               # then you can modify the package change
 %               if ( $curuser->access_right('Change customer package') ) {
           <% pkg_status_row_if($cust_pkg, emt('Start billing'), 'start_date', %opt) %>
           <% pkg_status_row_if($cust_pkg, emt('Un-cancelled'), 'uncancel', %opt ) %>
 
-%         if ( !$opt{no_links}
-%               and !$change_from
-%               and !$supplemental # can be changed from its main package
-%               and $curuser->access_right('Change package start date') )
-%         {
-
-        <TR>
-          <TD COLSPAN=<%$opt{colspan}%>>
-            <FONT SIZE=-1>
-            (&nbsp;<% pkg_change_start_link($cust_pkg) %>&nbsp;)
-            </FONT>
-          </TD>
-        </TR>
-%         }
-          
 %       } 
 %
 %     } else { #setup
         <TR>
           <TD COLSPAN=<%$opt{colspan}%>>
             <FONT SIZE=-1>
+
+% #change date links
+%           if ( !$change_from and !$supplemental ) {
+%             my $has_date_links = 0;
+%             if ( !$cust_pkg->get('setup')
+%                   and $curuser->access_right('Change package start date')
+%             ) {
+            (&nbsp;<% pkg_change_start_link($cust_pkg) %>&nbsp;)
+%               $has_date_links = 1;
+%             }
+%             if ( !$cust_pkg->change_to_pkgnum # because on a technical level, change won't propagate,
+%                                               # and there's not really a use case worth making that work
+%                   and $curuser->access_right('Change package contract end date')
+%             ) {
+            (&nbsp;<% pkg_change_contract_end_link($cust_pkg) %>&nbsp;)
+%               $has_date_links = 1;
+%             }
+%             if ($has_date_links) {
+            <BR>
+%             }
+%           }
+
 % # action links
 %           if ( $change_from ) {
 %               # nothing
@@ -745,7 +760,7 @@ sub pkg_change_later_link {
 sub pkg_change_start_link {
   my $cust_pkg = shift;
   include( '/elements/popup_link-cust_pkg.html',
-    'action'      => $p . 'misc/change_pkg_start.html',
+    'action'      => $p . 'misc/change_pkg_date.html?field=start_date',
     'label'       => emt('Set start date'),
     'actionlabel' => emt('Set start of billing for'),
     'cust_pkg'    => $cust_pkg,
@@ -754,6 +769,18 @@ sub pkg_change_start_link {
   )
 }
 
+sub pkg_change_contract_end_link {
+  my $cust_pkg = shift;
+  include( '/elements/popup_link-cust_pkg.html',
+    'action'      => $p . 'misc/change_pkg_date.html?field=contract_end',
+    'label'       => emt('Set contract end'),
+    'actionlabel' => emt('Set contract end for'),
+    'cust_pkg'    => $cust_pkg,
+    'width'       => 510,
+    'height'      => 310,
+  )
+}
+
 sub svc_recharge_link {
   include( '/elements/popup_link-cust_svc.html',
              'action'      => $p. 'misc/recharge_svc.html',