[freeside-commits] branch master updated. d0fc25693dd91869c6e1fe1372bcae35fde1a827

Mark Wells mark at 420.am
Thu Dec 31 17:45:01 PST 2015


The branch, master has been updated
       via  d0fc25693dd91869c6e1fe1372bcae35fde1a827 (commit)
      from  a9a6fd37a49d05f451adfacc363d377009fd9672 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit d0fc25693dd91869c6e1fe1372bcae35fde1a827
Author: Mark Wells <mark at freeside.biz>
Date:   Thu Dec 31 17:44:04 2015 -0800

    allow back-billing by changing start dates, #38883

diff --git a/FS/FS/AccessRight.pm b/FS/FS/AccessRight.pm
index 51e47ad..a24d736 100644
--- a/FS/FS/AccessRight.pm
+++ b/FS/FS/AccessRight.pm
@@ -152,6 +152,7 @@ tie my %rights, 'Tie::IxHash',
     'View appointments', #NEWNEW
     'Make appointment',
     'View package definition costs', #NEWNEW
+    'Change package start date',
   ],
   
   ###
diff --git a/FS/FS/access_right.pm b/FS/FS/access_right.pm
index 0da718c..57f67de 100644
--- a/FS/FS/access_right.pm
+++ b/FS/FS/access_right.pm
@@ -253,6 +253,7 @@ 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
   );
 
 #  foreach my $old_acl ( keys %onetime ) {
diff --git a/FS/FS/cust_main/Billing.pm b/FS/FS/cust_main/Billing.pm
index 29535f2..1157ba9 100644
--- a/FS/FS/cust_main/Billing.pm
+++ b/FS/FS/cust_main/Billing.pm
@@ -1042,10 +1042,15 @@ sub _make_lines {
         }
     }
 
-    $cust_pkg->setfield('setup', $time)
-      unless $cust_pkg->setup;
-          #do need it, but it won't get written to the db
-          #|| $cust_pkg->pkgpart != $real_pkgpart;
+    if ( $cust_pkg->get('setup') ) {
+      # don't change it
+    } elsif ( $cust_pkg->get('start_date') ) {
+      # this allows start_date to be used to set the first bill date
+      $cust_pkg->set('setup', $cust_pkg->get('start_date'));
+    } else {
+      # if unspecified, start it right now
+      $cust_pkg->set('setup', $time);
+    }
 
     $cust_pkg->setfield('start_date', '')
       if $cust_pkg->start_date;
diff --git a/httemplate/misc/change_pkg_start.html b/httemplate/misc/change_pkg_start.html
new file mode 100755
index 0000000..5a890c8
--- /dev/null
+++ b/httemplate/misc/change_pkg_start.html
@@ -0,0 +1,99 @@
+<& /elements/header-popup.html, mt($title) &>
+
+<& /elements/error.html &>
+
+% # only slightly different from unhold_pkg.
+<FORM NAME="MyForm" ACTION="process/change_pkg_start.html" METHOD=POST>
+<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $pkgnum %>">
+
+<BR>
+<% emt('Start billing [_1]', $part_pkg->pkg_comment(cust_pkg => $cust_pkg)) %>
+<UL STYLE="padding-left: 3ex; list-style: none; background-color: #cccccc">
+<LI>
+  <& /elements/radio.html,
+    field => 'when',
+    id    => 'when_now',
+    value => 'now',
+    curr_value => $when,
+  &>
+  <label for="when_now"><% emt('Immediately') %></label>
+</LI>
+% if ( $next_bill_date ) {
+<LI>
+  <& /elements/radio.html,
+    field => 'when',
+    id    => 'when_next_bill_date',
+    value => 'next_bill_date',
+    curr_value => $when,
+  &>
+  <label for="when_next_bill_date">
+    <% emt('On the next bill date: [_1]', 
+      time2str($date_format, $next_bill_date) ) %>
+  </label>
+</LI>
+% }
+<LI>
+<& /elements/radio.html,
+  field => 'when',
+  id    => 'when_date',
+  value => 'date',
+  curr_value => $when,
+&>
+<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,
+  }
+&>
+</LI>
+</UL>
+<INPUT TYPE="submit" NAME="submit" VALUE="<% emt('Set start date') %>">
+
+</FORM>
+</BODY>
+</HTML>
+
+<%init>
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+die "access denied"
+  unless $curuser->access_right('Change package start date');
+
+my $pkgnum;
+if ( $cgi->param('pkgnum') =~ /^(\d+)$/ ) {
+  $pkgnum = $1;
+} else {
+  die "illegal query ". $cgi->keywords;
+}
+
+my $conf = new FS::Conf;
+my $date_format = $conf->config('date_format') || '%m/%d/%Y';
+
+my $title = 'Start billing package';
+
+my $cust_pkg = qsearchs({
+  table     => 'cust_pkg',
+  addl_from => ' JOIN cust_main USING (custnum) ',
+  hashref   => { 'pkgnum' => $pkgnum },
+  extra_sql => ' AND '. $curuser->agentnums_sql,
+}) or die "Unknown pkgnum: $pkgnum";
+
+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
+# next bill date, and if none of those, default to now
+my $when = $cgi->param('when');
+
+if (!$when) {
+  if ($cust_pkg->start_date) {
+    $when = 'date';
+  } elsif ($next_bill_date) {
+    $when = 'next_bill_date';
+  } else {
+    $when = 'now';
+  }
+}
+</%init>
diff --git a/httemplate/misc/process/change_pkg_start.html b/httemplate/misc/process/change_pkg_start.html
new file mode 100755
index 0000000..17a8518
--- /dev/null
+++ b/httemplate/misc/process/change_pkg_start.html
@@ -0,0 +1,53 @@
+<& /elements/header-popup.html &>
+  <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 package start date');
+
+$cgi->param('pkgnum') =~ /^(\d+)$/
+  or die "illegal pkgnum";
+my $pkgnum = $1;
+
+my $cust_pkg = qsearchs({
+  table     => 'cust_pkg',
+  addl_from => ' JOIN cust_main USING (custnum) ',
+  hashref   => { 'pkgnum' => $pkgnum },
+  extra_sql => ' AND '. $curuser->agentnums_sql,
+}) or die "Unknown pkgnum: $pkgnum";
+
+my $cust_main = $cust_pkg->cust_main;
+
+my $error;
+my $start_date;
+if ( $cgi->param('when') eq 'now' ) {
+  # start it the next time billing runs
+  $start_date = '';
+} elsif ( $cgi->param('when') eq 'next_bill_date' ) {
+  $start_date = $cust_main->next_bill_date;
+} elsif ( $cgi->param('when') eq 'date' ) {
+  $start_date = parse_datetime($cgi->param('start_date'));
+}
+
+if ( $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);
+    $error ||= $pkg->replace;
+  }
+  $error ? dbh->rollback : dbh->commit;
+}
+
+if ( $error ) {
+  $cgi->param('error', $error);
+  print $cgi->redirect($fsurl.'misc/change_pkg_start.html?', $cgi->query_string);
+}
+</%init>
diff --git a/httemplate/view/cust_main/packages/status.html b/httemplate/view/cust_main/packages/status.html
index a149562..1d3de85 100644
--- a/httemplate/view/cust_main/packages/status.html
+++ b/httemplate/view/cust_main/packages/status.html
@@ -175,7 +175,7 @@
           </TR>
 %         }
 
-%       } else { 
+%       } else { # recurring package, not yet billed
 
           <% pkg_status_row_colspan($cust_pkg, emt("Not yet billed ($billed_or_prepaid [_1])", myfreq($part_pkg) ), '', %opt ) %>
 
@@ -188,6 +188,21 @@
           <% 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>
+            ( <% pkg_change_start_link($cust_pkg) %> )
+            </FONT>
+          </TD>
+        </TR>
+%         }
+          
 %       } 
 %
 %     } else { #setup
@@ -725,6 +740,18 @@ 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?',
+    'label'       => emt('Set start date'),
+    'actionlabel' => emt('Set start of billing 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',

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/AccessRight.pm                               |    1 +
 FS/FS/access_right.pm                              |    1 +
 FS/FS/cust_main/Billing.pm                         |   13 ++++++---
 .../{unhold_pkg.html => change_pkg_start.html}     |   20 +++++++++-----
 .../{unhold_pkg.html => change_pkg_start.html}     |   21 +++++++-------
 httemplate/view/cust_main/packages/status.html     |   29 +++++++++++++++++++-
 6 files changed, 63 insertions(+), 22 deletions(-)
 copy httemplate/misc/{unhold_pkg.html => change_pkg_start.html} (76%)
 copy httemplate/misc/process/{unhold_pkg.html => change_pkg_start.html} (65%)




More information about the freeside-commits mailing list