[freeside-commits] branch FREESIDE_3_BRANCH updated. 4c57ddecfa1f8582d0624f940214a107d993289f

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


The branch, FREESIDE_3_BRANCH has been updated
       via  4c57ddecfa1f8582d0624f940214a107d993289f (commit)
       via  b69e236c9509a7427f8a34d30f10d2d1bed63245 (commit)
      from  07e65d5203cb6a7b0eef9ea794122b272444dd56 (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 4c57ddecfa1f8582d0624f940214a107d993289f
Author: Mark Wells <mark at freeside.biz>
Date:   Sat Jul 6 17:21:13 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 b9dc5a7..c9c50d2 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 b69e236c9509a7427f8a34d30f10d2d1bed63245
Author: Mark Wells <mark at freeside.biz>
Date:   Sat Jul 6 17:19:37 2013 -0700

    delayed package start option, #20686

diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 282fb11..3a4c656 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -4349,6 +4349,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 d66df9e..01bec16 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -2011,6 +2011,7 @@ sub tables_hashref {
         'setup_show_zero',  'char', 'NULL',  1, '', '',
         'successor',     'int',     'NULL', '', '', '',
         'family_pkgpart','int',     'NULL', '', '', '',
+        'delay_start',   'int',     'NULL', '', '', '',
       ],
       'primary_key' => 'pkgpart',
       'unique' => [],
diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index ce07bee..824221f 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -289,6 +289,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;
@@ -296,6 +297,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) {
@@ -304,16 +307,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 605c84f..3b4aaf5 100644
--- a/FS/FS/part_pkg.pm
+++ b/FS/FS/part_pkg.pm
@@ -5,7 +5,7 @@ use strict;
 use vars qw( %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 );
@@ -115,6 +115,8 @@ If this record is not obsolete, will be null.
 ancestor of this record.  If this record is not a successor to another 
 part_pkg, will be equal to pkgpart.
 
+=item delay_start - Number of days to delay package start, by default
+
 =back
 
 =head1 METHODS
@@ -630,6 +632,7 @@ sub check {
        )
     || $self->ut_numbern('fcc_ds0s')
     || $self->ut_numbern('fcc_voip_class')
+    || $self->ut_numbern('delay_start')
     || $self->ut_foreign_keyn('successor', 'part_pkg', 'pkgpart')
     || $self->ut_foreign_keyn('family_pkgpart', 'part_pkg', 'pkgpart')
     || $self->SUPER::check
@@ -1020,10 +1023,40 @@ 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 '';
+
+  } elsif ( $cust_main ) {
+    
+    return $cust_main->next_bill_date;
+  
+  } else {
+    
+    return '';
+
+  }
+}
+
 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 98d9cde..319e767 100755
--- a/httemplate/edit/part_pkg.cgi
+++ b/httemplate/edit/part_pkg.cgi
@@ -58,6 +58,7 @@
                             'report_option'    => 'Report classes',
                             'fcc_ds0s'         => 'Voice-grade equivalents',
                             'fcc_voip_class'   => 'Category',
+                            'delay_start'      => 'Default delay (days)',
                           },
 
               'fields' => [
@@ -177,6 +178,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',
@@ -208,7 +219,6 @@
                                  : ()
                               ),
 
-
                             { type => 'columnend' },
 
                             { 'type'  => $report_option ? 'tablebreak-tr-title'
diff --git a/httemplate/elements/order_pkg.js b/httemplate/elements/order_pkg.js
index 1069a0e..762b2dd 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 {
@@ -15,14 +21,17 @@ function pkg_changed () {
       }
     }
 
-    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_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';
     } else {
-      form.start_date_text.disabled = true;
-      form.start_date.style.backgroundColor = '#dddddd';
-      form.start_date_button.style.display = 'none';
+      date_text.style.backgroundColor = '#dddddd';
+      date_text.disabled = true;
+      date_button.style.display = 'none';
+      date_button_disabled.style.display = '';
     }
 
   } 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 848ab0a..b9dc5a7 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
           );
         }
 
@@ -58,6 +61,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 43b9229..7aebda4 100644
--- a/httemplate/misc/cust-part_pkg.cgi
+++ b/httemplate/misc/cust-part_pkg.cgi
@@ -5,8 +5,9 @@ my( $custnum, $prospectnum, $classnum ) = $cgi->param('arg');
 
 
 my $agent;
+my $cust_main;
 if ( $custnum ) {
-  my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+  $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
     or die 'unknown custnum';
   $agent = $cust_main->agent;
 } else {
@@ -31,12 +32,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 3973442..a257e53 100644
--- a/httemplate/misc/order_pkg.html
+++ b/httemplate/misc/order_pkg.html
@@ -54,9 +54,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>
@@ -213,11 +216,6 @@ if ( $cgi->param('quantity') =~ /^\s*(\d+)\s*$/ ) {
 }
 
 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') && $cust_main ) {
-  $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                                |   35 +++++++++++++++++++++-
 FS/FS/part_pkg/delayed_Mixin.pm                  |   12 +++++++
 httemplate/edit/part_pkg.cgi                     |   12 +++++++-
 httemplate/elements/order_pkg.js                 |   25 ++++++++++-----
 httemplate/elements/select-part_pkg.html         |    1 -
 httemplate/elements/tr-select-cust-part_pkg.html |   13 ++++++--
 httemplate/misc/cust-part_pkg.cgi                |   13 ++++++--
 httemplate/misc/order_pkg.html                   |   10 ++----
 11 files changed, 113 insertions(+), 27 deletions(-)




More information about the freeside-commits mailing list