[freeside-commits] branch FREESIDE_2_3_BRANCH updated. ee8a3fde6a425db37f1e23ad0f0e977d6f0d1e93

Mark Wells mark at 420.am
Sat Jul 6 17:31:37 PDT 2013


The branch, FREESIDE_2_3_BRANCH has been updated
       via  ee8a3fde6a425db37f1e23ad0f0e977d6f0d1e93 (commit)
       via  90398f046915a915f65976e33ce060ac5baabbae (commit)
      from  d3b736c3603a980b67f7c69242c94f6ad31a12a1 (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 ee8a3fde6a425db37f1e23ad0f0e977d6f0d1e93
Author: Mark Wells <mark at freeside.biz>
Date:   Sat Jul 6 17:31:27 2013 -0700

    minor UI fix

diff --git a/httemplate/elements/tr-select-cust-part_pkg.html b/httemplate/elements/tr-select-cust-part_pkg.html
index af66fc3..300a775 100644
--- a/httemplate/elements/tr-select-cust-part_pkg.html
+++ b/httemplate/elements/tr-select-cust-part_pkg.html
@@ -11,7 +11,7 @@
       var optionName = new Option(text, value, false, false);
       optionName.setAttribute('data-can_discount',   can_discount);
       optionName.setAttribute('data-can_start_date', can_start_date);
-      optionName.setAttribute('data-start_date',     start_date);
+      optionName.setAttribute('data-start_date',     start_date || '');
       var length = what.length;
       what.options[length] = optionName;
     }

commit 90398f046915a915f65976e33ce060ac5baabbae
Author: Mark Wells <mark at freeside.biz>
Date:   Sat Jul 6 16:50:09 2013 -0700

    delayed package start option, #20686

diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 10b2b81..7534b41 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -4183,6 +4183,13 @@ and customer address. Include units.',
   },
 
   {
+    'key'         => 'part_pkg-delay_start',
+    'section'     => '',
+    'description' => 'Enabled "delayed start" option for packages.',
+    'type'        => 'checkbox',
+  },
+
+  {
     'key'         => 'mcp_svcpart',
     'section'     => '',
     'description' => 'Master Control Program svcpart.  Leave this blank.',
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index d4e35ec..cfacbfc 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -1730,6 +1730,7 @@ sub tables_hashref {
         'no_auto',          'char', 'NULL',  1, '', '', 
         'recur_show_zero',  'char', 'NULL',  1, '', '',
         'setup_show_zero',  'char', 'NULL',  1, '', '',
+        'delay_start',   'int',     'NULL', '', '', '',
       ],
       'primary_key' => 'pkgpart',
       'unique' => [],
diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index 308db5d..740a562 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -269,6 +269,7 @@ sub insert {
 
   my $part_pkg = $self->part_pkg;
 
+  # if the package def says to start only on the first of the month:
   if ( $part_pkg->option('start_1st', 1) && !$self->start_date ) {
     my ($sec,$min,$hour,$mday,$mon,$year) = (localtime(time) )[0,1,2,3,4,5];
     $mon += 1 unless $mday == 1;
@@ -276,6 +277,8 @@ sub insert {
     $self->start_date( timelocal_nocheck(0,0,0,1,$mon,$year) );
   }
 
+  # set up any automatic expire/adjourn/contract_end timers
+  # based on the start date
   foreach my $action ( qw(expire adjourn contract_end) ) {
     my $months = $part_pkg->option("${action}_months",1);
     if($months and !$self->$action) {
@@ -284,16 +287,16 @@ sub insert {
     }
   }
 
+  # if this package has "free days" and delayed setup fee, tehn 
+  # set start date that many days in the future.
+  # (this should have been set in the UI, but enforce it here)
   if (    ! $options{'change'}
        && ( my $free_days = $part_pkg->option('free_days',1) )
        && $part_pkg->option('delay_setup',1)
        #&& ! $self->start_date
      )
   {
-    my ($mday,$mon,$year) = (localtime(time) )[3,4,5];
-    #my $start_date = ($self->start_date || timelocal(0,0,0,$mday,$mon,$year)) + 86400 * $free_days;
-    my $start_date = timelocal(0,0,0,$mday,$mon,$year) + 86400 * $free_days;
-    $self->start_date($start_date);
+    $self->start_date( $part_pkg->default_start_date );
   }
 
   $self->order_date(time);
diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm
index 5424db5..8db0e99 100644
--- a/FS/FS/part_pkg.pm
+++ b/FS/FS/part_pkg.pm
@@ -4,7 +4,7 @@ use strict;
 use vars qw( @ISA %plans $DEBUG $setup_hack $skip_pkg_svc_hack );
 use Carp qw(carp cluck confess);
 use Scalar::Util qw( blessed );
-use Time::Local qw( timelocal_nocheck );
+use Time::Local qw( timelocal timelocal_nocheck );
 use Tie::IxHash;
 use FS::Conf;
 use FS::Record qw( qsearch qsearchs dbh dbdef );
@@ -106,6 +106,8 @@ inherits from FS::Record.  The following fields are currently supported:
 =item fcc_voip_class - Which column of FCC form 477 part II.B this package 
 belongs in.
 
+=item delay_start - Number of days to delay package start, by default
+
 =back
 
 =head1 METHODS
@@ -577,6 +579,7 @@ sub check {
        )
     || $self->ut_numbern('fcc_ds0s')
     || $self->ut_numbern('fcc_voip_class')
+    || $self->ut_numbern('delay_start')
     || $self->SUPER::check
   ;
   return $error if $error;
@@ -866,10 +869,36 @@ sub is_free {
   }
 }
 
+# whether the plan allows discounts to be applied to this package
 sub can_discount { 0; }
 
+# whether the plan allows changing the start date
 sub can_start_date { 1; }
 
+# the default start date; takes an FS::cust_main as an argument
+sub default_start_date {
+  my $self = shift;
+  my $cust_main = shift;
+  my $conf = FS::Conf->new;
+
+  if ( $self->delay_start ) {
+    my $delay = $self->delay_start;
+    
+    my ($mday,$mon,$year) = (localtime(time))[3,4,5];
+    my $start_date = timelocal(0,0,0,$mday,$mon,$year) + 86400 * $delay;
+    return $start_date;
+
+  } elsif ( $conf->exists('order_pkg-no_start_date') ) {
+
+    return ''
+
+  } else {
+    
+    return $cust_main->next_bill_date;
+  
+  }
+}
+
 sub freqs_href {
   # moved to FS::Misc to make this accessible to other packages
   # at initialization
diff --git a/FS/FS/part_pkg/delayed_Mixin.pm b/FS/FS/part_pkg/delayed_Mixin.pm
index ab53bda..ae286d3 100644
--- a/FS/FS/part_pkg/delayed_Mixin.pm
+++ b/FS/FS/part_pkg/delayed_Mixin.pm
@@ -2,6 +2,7 @@ package FS::part_pkg::delayed_Mixin;
 
 use strict;
 use vars qw(%info);
+use Time::Local qw(timelocal);
 use NEXT;
 
 %info = (
@@ -52,4 +53,15 @@ sub calc_remain {
 
 sub can_start_date { ! shift->option('delay_setup', 1) }
 
+sub default_start_date {
+  my $self = shift;
+  if ( $self->option('delay_setup') and $self->option('free_days') ) {
+    my $delay = $self->option('free_days');
+
+    my ($mday, $mon, $year) = (localtime(time))[3,4,5];
+    return timelocal(0,0,0,$mday,$mon,$year) + 86400 * $self->option('free_days');
+  }
+  return $self->NEXT::default_start_date(@_);
+}
+
 1;
diff --git a/httemplate/edit/part_pkg.cgi b/httemplate/edit/part_pkg.cgi
index 38505b5..8d33ba6 100755
--- a/httemplate/edit/part_pkg.cgi
+++ b/httemplate/edit/part_pkg.cgi
@@ -54,6 +54,7 @@
                             'report_option'    => 'Report classes',
                             'fcc_ds0s'         => 'Voice-grade equivalents',
                             'fcc_voip_class'   => 'Category',
+                            'delay_start'      => 'Default delay (days)',
                           },
 
               'fields' => [
@@ -170,6 +171,16 @@
                               { field=>'setup_cost', type=>'money', },
                               { field=>'recur_cost', type=>'money', },
 
+                              ( $conf->exists('part_pkg-delay_start')
+                                ? ( { type  => 'tablebreak-tr-title',
+                                      value => 'Delayed start',
+                                    },
+                                    { field => 'delay_start',
+                                      type => 'text', size => 6 },
+                                  )
+                                : ()
+                              ),
+
                             { type => 'columnnext' },
 
                               { field    => 'agent_type',
@@ -201,7 +212,6 @@
                                  : ()
                               ),
 
-
                             { type => 'columnend' },
 
                             { 'type'  => $report_option ? 'tablebreak-tr-title'
diff --git a/httemplate/elements/order_pkg.js b/httemplate/elements/order_pkg.js
index 4807359..d269c51 100644
--- a/httemplate/elements/order_pkg.js
+++ b/httemplate/elements/order_pkg.js
@@ -4,9 +4,15 @@ function pkg_changed () {
 
   if ( form.pkgpart.selectedIndex > 0 ) {
 
+    var opt = form.pkgpart.options[form.pkgpart.selectedIndex];
+    var date_button = document.getElementById('start_date_button');
+    var date_button_disabled = document.getElementById('start_date_button_disabled');
+    var date_text = document.getElementById('start_date_text');
+
+
     form.submitButton.disabled = false;
     if ( discountnum ) {
-      if ( form.pkgpart.options[form.pkgpart.selectedIndex].getAttribute('data-can_discount') == 1 ) {
+      if ( opt.getAttribute('data-can_discount') == 1 ) {
         form.discountnum.disabled = false;
         discountnum_changed(form.discountnum);
       } else {
@@ -14,18 +20,20 @@ function pkg_changed () {
         discountnum_changed(form.discountnum);
       }
     }
-
-    if ( form.pkgpart.options[form.pkgpart.selectedIndex].getAttribute('data-can_start_date') == 1 ) {
-      form.start_date_text.disabled = false;
-      form.start_date.style.backgroundColor = '#ffffff';
-      form.start_date_button.style.display = '';
-      form.start_date_button_disabled.style.display = 'none';
+    
+    form.start_date_text.value = opt.getAttribute('data-start_date');
+    if ( opt.getAttribute('data-can_start_date') == 1 ) {
+      date_text.style.backgroundColor = '#ffffff';
+      date_text.disabled = false;
+      date_button.style.display = '';
+      date_button_disabled.style.display = 'none';
       form.invoice_terms.disabled = true;
     } else {
-      form.start_date_text.disabled = true;
-      form.start_date.style.backgroundColor = '#dddddd';
-      form.start_date_button.style.display = 'none';
-      form.start_date_button_disabled.style.display = '';
+      date_text.style.backgroundColor = '#dddddd';
+      date_text.disabled = true;
+      date_button.style.display = 'none';
+      date_button_disabled.style.display = '';
+      form.invoice_terms.disabled = false;
     }
 
   } else {
diff --git a/httemplate/elements/select-part_pkg.html b/httemplate/elements/select-part_pkg.html
index 439c4b5..9d41b07 100644
--- a/httemplate/elements/select-part_pkg.html
+++ b/httemplate/elements/select-part_pkg.html
@@ -23,7 +23,6 @@ Example:
               'empty_label'    => 'Select package', #should this be the default?
               'label_callback' => sub { shift->pkg_comment },
               'hashref'        => \%hash,
-              'extra_option_attributes' => [ 'can_discount', 'can_start_date' ],
               %opt,
           )
 %>
diff --git a/httemplate/elements/tr-select-cust-part_pkg.html b/httemplate/elements/tr-select-cust-part_pkg.html
index 767d232..af66fc3 100644
--- a/httemplate/elements/tr-select-cust-part_pkg.html
+++ b/httemplate/elements/tr-select-cust-part_pkg.html
@@ -7,10 +7,11 @@
 
   <SCRIPT TYPE="text/javascript">
 
-    function part_pkg_opt(what, value, text, can_discount, can_start_date) {
+    function part_pkg_opt(what, value, text, can_discount, can_start_date, start_date) {
       var optionName = new Option(text, value, false, false);
       optionName.setAttribute('data-can_discount',   can_discount);
       optionName.setAttribute('data-can_start_date', can_start_date);
+      optionName.setAttribute('data-start_date',     start_date);
       var length = what.length;
       what.options[length] = optionName;
     }
@@ -38,12 +39,14 @@
         // add the new packages
         opt(what.form.pkgpart, '', 'Select package');
         var packagesArray = eval('(' + part_pkg + ')' );
-        for ( var s = 0; s < packagesArray.length; s=s+4 ) {
+        for ( var s = 0; s < packagesArray.length; s=s+5 ) {
+          //surely this should be some kind of JSON structure
           var packagesLabel  = packagesArray[s+1];
           var can_discount   = packagesArray[s+2];
           var can_start_date = packagesArray[s+3];
+          var start_date     = packagesArray[s+4];
           part_pkg_opt(
-            what.form.pkgpart, packagesArray[s], packagesLabel, can_discount, can_start_date
+            what.form.pkgpart, packagesArray[s], packagesLabel, can_discount, can_start_date, start_date
           );
         }
 
@@ -55,6 +58,10 @@
     
     }
 
+    window.onload = function() {
+      classnum_changed(document.getElementById('classnum'));
+    }
+
   </SCRIPT>
 
   <TR>
diff --git a/httemplate/misc/cust-part_pkg.cgi b/httemplate/misc/cust-part_pkg.cgi
index dcd033f..4662be1 100644
--- a/httemplate/misc/cust-part_pkg.cgi
+++ b/httemplate/misc/cust-part_pkg.cgi
@@ -23,12 +23,18 @@ my @part_pkg = qsearch({
   'order_by'  => 'ORDER BY pkg',
 });
 
-my @return = map  { warn $_->can_start_date;
+my $date_format = FS::Conf->new->config('date_format') || '%m/%d/%Y';
+
+my @return = map  {
+                    my $start_date = $_->default_start_date($cust_main);
+                    $start_date = time2str($date_format, $start_date)
+                      if $start_date;
                     ( $_->pkgpart,
                       $_->pkg_comment,
                       $_->can_discount,
                       $_->can_start_date,
-                    );
+                      $start_date,
+                    )
                   }
                   #sort { $a->pkg_comment cmp $b->pkg_comment }
                   @part_pkg;
diff --git a/httemplate/misc/order_pkg.html b/httemplate/misc/order_pkg.html
index 2332f20..f174dd9 100644
--- a/httemplate/misc/order_pkg.html
+++ b/httemplate/misc/order_pkg.html
@@ -38,9 +38,12 @@
     <& /elements/input-date-field.html,{
                 'name'      => 'start_date',
                 'format'    => $date_format,
-                'value'     => $start_date,
+                'value'     => '',
                 'noinit'    => 1,
               } &>
+    <IMG SRC   = "<%$fsurl%>images/calendar-disabled.png"
+         ID    = "start_date_button_disabled"
+         STYLE = "display:none">
     <FONT SIZE=-1>(<% mt('leave blank to start immediately') |h %>)</FONT>
   </TD>
 </TR>
@@ -164,11 +167,6 @@ if ( $cgi->param('lock_pkgpart') ) {
 my $pkgpart = $part_pkg ? $part_pkg->pkgpart : scalar($cgi->param('pkgpart'));
 
 my $format = $date_format. ' %T %z (%Z)'; #false laziness w/REAL_cust_pkg.cgi?
-my $start_date = '';
-if( ! $conf->exists('order_pkg-no_start_date') ) {
-  $start_date = $cust_main->next_bill_date;
-  $start_date = $start_date ? time2str($format, $start_date) : '';
-}
 
 my $svcpart = scalar($cgi->param('svcpart'));
 

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

Summary of changes:
 FS/FS/Conf.pm                                    |    7 +++++
 FS/FS/Schema.pm                                  |    1 +
 FS/FS/cust_pkg.pm                                |   11 +++++---
 FS/FS/part_pkg.pm                                |   31 +++++++++++++++++++++-
 FS/FS/part_pkg/delayed_Mixin.pm                  |   12 ++++++++
 httemplate/edit/part_pkg.cgi                     |   12 ++++++++-
 httemplate/elements/order_pkg.js                 |   30 +++++++++++++--------
 httemplate/elements/select-part_pkg.html         |    1 -
 httemplate/elements/tr-select-cust-part_pkg.html |   13 +++++++--
 httemplate/misc/cust-part_pkg.cgi                |   10 +++++-
 httemplate/misc/order_pkg.html                   |   10 +++----
 11 files changed, 109 insertions(+), 29 deletions(-)




More information about the freeside-commits mailing list