[freeside-commits] branch master updated. 0dfd49189b0ea878e99f1590a2939e55ab02c89c

Ivan ivan at 420.am
Sat Apr 5 12:46:17 PDT 2014


The branch, master has been updated
       via  0dfd49189b0ea878e99f1590a2939e55ab02c89c (commit)
      from  23699764d0d8436b50f5cf88f798c552969714eb (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 0dfd49189b0ea878e99f1590a2939e55ab02c89c
Author: Ivan Kohler <ivan at freeside.biz>
Date:   Sat Apr 5 12:46:14 2014 -0700

    installers, RT#16584

diff --git a/FS/FS.pm b/FS/FS.pm
index 41d5138..60adfc4 100644
--- a/FS/FS.pm
+++ b/FS/FS.pm
@@ -99,6 +99,10 @@ L<FS::access_groupagent> - Group reseller access
 
 L<FS::access_right> - Access rights
 
+L<FS::sched_item> - Installers / schedulable resources
+
+L<FS::sched_avail> - Installer/resource availability
+
 L<FS::svc_acct_pop> - POP (Point of Presence, not Post
 Office Protocol) class
 
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index 4f54772..bdae736 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -5479,6 +5479,44 @@ sub tables_hashref {
       'index'  => [],
     },
 
+    'sched_item' => {
+      'columns' => [
+        'itemnum',   'serial',      '', '', '', '', 
+        'usernum',      'int',  'NULL', '', '', '', 
+        #'itemname', 'varchar', $char_d, '', '', '',
+        'disabled',    'char',  'NULL',  1, '', '', 
+      ],
+      'primary_key'  => 'itemnum',
+      'unique'       => [ [ 'usernum' ] ],
+      'index'        => [],
+      'foreign_keys' => [
+                          { columns    => [ 'usernum' ],
+                            table      => 'access_user',
+                          },
+                        ],
+    },
+
+    #'sched_item_class'
+
+    'sched_avail' => {
+      'columns' => [
+        'availnum',      'serial', '', '', '', '', 
+        'itemnum',          'int', '', '', '', '',
+        'wday',             'int', '', '', '', '',
+        'stime',            'int', '', '', '', '',
+        'etime',            'int', '', '', '', '',
+        'override_date',    @date_type,    '', '',
+      ],
+      'primary_key'  => 'availnum',
+      'unique'       => [],
+      'index'        => [],
+      'foreign_keys' => [
+                          { columns    => [ 'itemnum' ],
+                            table      => 'sched_item',
+                          },
+                        ],
+    },
+
     'svc_phone' => {
       'columns' => [
         'svcnum',                         'int',     '',      '', '', '', 
diff --git a/FS/FS/sched_avail.pm b/FS/FS/sched_avail.pm
new file mode 100644
index 0000000..62b1a5d
--- /dev/null
+++ b/FS/FS/sched_avail.pm
@@ -0,0 +1,125 @@
+package FS::sched_avail;
+use base qw( FS::Record );
+
+use strict;
+#use FS::Record qw( qsearch qsearchs );
+
+=head1 NAME
+
+FS::sched_avail - Object methods for sched_avail records
+
+=head1 SYNOPSIS
+
+  use FS::sched_avail;
+
+  $record = new FS::sched_avail \%hash;
+  $record = new FS::sched_avail { 'column' => 'value' };
+
+  $error = $record->insert;
+
+  $error = $new_record->replace($old_record);
+
+  $error = $record->delete;
+
+  $error = $record->check;
+
+=head1 DESCRIPTION
+
+An FS::sched_avail object represents an availability period/interval.
+FS::sched_avail inherits from FS::Record.  The following fields are currently
+supported:
+
+=over 4
+
+=item availnum
+
+primary key
+
+=item itemnum
+
+itemnum
+
+=item wday
+
+wday
+
+=item stime
+
+stime
+
+=item etime
+
+etime
+
+=item override_date
+
+override_date
+
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item new HASHREF
+
+Creates a new period.  To add the period to the database, see L<"insert">.
+
+Note that this stores the hash reference, not a distinct copy of the hash it
+points to.  You can ask the object for a copy with the I<hash> method.
+
+=cut
+
+sub table { 'sched_avail'; }
+
+=item insert
+
+Adds this record to the database.  If there is an error, returns the error,
+otherwise returns false.
+
+=item delete
+
+Delete this record from the database.
+
+=item replace OLD_RECORD
+
+Replaces the OLD_RECORD with this one in the database.  If there is an error,
+returns the error, otherwise returns false.
+
+=item check
+
+Checks all fields to make sure this is a valid period.  If there is
+an error, returns the error, otherwise returns false.  Called by the insert
+and replace methods.
+
+=cut
+
+sub check {
+  my $self = shift;
+
+  my $error = 
+    $self->ut_numbern('availnum')
+    || $self->ut_foreign_key('itemnum', 'sched_avail', 'itemnum')
+    || $self->ut_number('wday')
+    || $self->ut_number('stime')
+    || $self->ut_number('etime')
+    || $self->ut_numbern('override_date')
+  ;
+  return $error if $error;
+
+  $self->SUPER::check;
+}
+
+=back
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+L<FS::sched_item>, L<FS::Record>
+
+=cut
+
+1;
+
diff --git a/FS/FS/sched_item.pm b/FS/FS/sched_item.pm
new file mode 100644
index 0000000..5f55188
--- /dev/null
+++ b/FS/FS/sched_item.pm
@@ -0,0 +1,123 @@
+package FS::sched_item;
+use base qw( FS::Record );
+
+use strict;
+#use FS::Record qw( qsearch qsearchs );
+
+=head1 NAME
+
+FS::sched_item - Object methods for sched_item records
+
+=head1 SYNOPSIS
+
+  use FS::sched_item;
+
+  $record = new FS::sched_item \%hash;
+  $record = new FS::sched_item { 'column' => 'value' };
+
+  $error = $record->insert;
+
+  $error = $new_record->replace($old_record);
+
+  $error = $record->delete;
+
+  $error = $record->check;
+
+=head1 DESCRIPTION
+
+An FS::sched_item object represents an schedulable item, such as an installer,
+meeting room or truck.  FS::sched_item inherits from FS::Record.  The following
+fields are currently supported:
+
+=over 4
+
+=item itemnum
+
+primary key
+
+=item usernum
+
+usernum
+
+=item disabled
+
+disabled
+
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item new HASHREF
+
+Creates a new item.  To add the item to the database, see L<"insert">.
+
+Note that this stores the hash reference, not a distinct copy of the hash it
+points to.  You can ask the object for a copy with the I<hash> method.
+
+=cut
+
+sub table { 'sched_item'; }
+
+=item insert
+
+Adds this record to the database.  If there is an error, returns the error,
+otherwise returns false.
+
+=item delete
+
+Delete this record from the database.
+
+=item replace OLD_RECORD
+
+Replaces the OLD_RECORD with this one in the database.  If there is an error,
+returns the error, otherwise returns false.
+
+=item check
+
+Checks all fields to make sure this is a valid item.  If there is
+an error, returns the error, otherwise returns false.  Called by the insert
+and replace methods.
+
+=cut
+
+sub check {
+  my $self = shift;
+
+  my $error = 
+    $self->ut_numbern('itemnum')
+    || $self->ut_foreign_keyn('usernum', 'access_user', 'usernum')
+    || $self->ut_enum('disabled', [ '', 'Y' ])
+  ;
+  return $error if $error;
+
+  $self->SUPER::check;
+}
+
+=item name
+
+Returns a name for this item; either the name of the associated employee (see
+L<FS::access_user), or the itemname field.
+
+=cut
+
+sub name {
+  my $self = shift;
+  my $access_user = $self->access_user;
+  $access_user ? $access_user->name : $self->itemname;
+}
+
+=back
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+L<FS::access_user>, L<FS::sched_avail>, L<FS::Record>
+
+=cut
+
+1;
+
diff --git a/FS/MANIFEST b/FS/MANIFEST
index 637401a..74de309 100644
--- a/FS/MANIFEST
+++ b/FS/MANIFEST
@@ -770,3 +770,7 @@ FS/part_fee_msgcat.pm
 t/part_fee_msgcat.t
 FS/part_fee_usage.pm
 FS/part_fee_usage.t
+FS/sched_item.pm
+t/sched_item.t
+FS/sched_avail.pm
+t/sched_avail.t
diff --git a/FS/t/sched_avail.t b/FS/t/sched_avail.t
new file mode 100644
index 0000000..045e7fa
--- /dev/null
+++ b/FS/t/sched_avail.t
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::sched_avail;
+$loaded=1;
+print "ok 1\n";
diff --git a/FS/t/sched_item.t b/FS/t/sched_item.t
new file mode 100644
index 0000000..212f8e8
--- /dev/null
+++ b/FS/t/sched_item.t
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::sched_item;
+$loaded=1;
+print "ok 1\n";
diff --git a/httemplate/browse/access_user.html b/httemplate/browse/access_user.html
index 6a1fea1..446bfe0 100644
--- a/httemplate/browse/access_user.html
+++ b/httemplate/browse/access_user.html
@@ -49,6 +49,12 @@ my $groups_sub = sub {
 
 };
 
+my $installer_sub = sub {
+  my $access_user = shift;
+  my @sched_item = $access_user->sched_item or return '';
+  $sched_item[0]->disabled ? '(disabled)' : 'Installer';
+};
+
 my $cust_sub = sub {
   my $access_user = shift;
   $access_user->user_custnum ? $access_user->user_cust_main->name : '';
@@ -59,10 +65,12 @@ my $count_query = 'SELECT COUNT(*) FROM access_user';
 
 my $link = [ $p.'edit/access_user.html?', 'usernum' ];
 
-my @header = ( '#',       'Username', 'Full name', 'Groups',    'Customer' );
-my @fields = ( 'usernum', 'username', 'name',      $groups_sub, $cust_sub, );
-my $align = 'rllll';
-my @links = ( $link, $link, $link, '', $cust_link );
+my @header = (
+  'Username', 'Full name', 'Groups',    'Installer',    'Customer' );
+my @fields = (
+  'username', 'name',      $groups_sub, $installer_sub, $cust_sub, );
+my $align = 'lllcl';
+my @links = ( $link, $link, $link, '', '', $cust_link );
 
 #if ( FS::Conf->new->config('ticket_system') ) {
 #  push @header, 'Ticketing';
diff --git a/httemplate/browse/sched_item.html b/httemplate/browse/sched_item.html
new file mode 100644
index 0000000..0943580
--- /dev/null
+++ b/httemplate/browse/sched_item.html
@@ -0,0 +1,18 @@
+<& elements/browse.html,
+     'title'         => 'Installers', #PL($sched_item_class->classname),
+     'name_singular' => 'installer', #$sched_item_class->classname
+     'query'         => { 'table' => 'sched_item' },
+     'count_query'   => 'SELECT COUNT(*) FROM sched_item',
+     'header'        => [ 'Installer', ], #$sched_item_class->classname
+     'fields'        => [ 'name' ],
+     #'links'         => [ $link, ],
+     'disableable'        => 1,
+     'disabled_statuspos' => 1,
+&>
+<%init>
+
+#XXX more specific AccessRight for scheduling
+die "access denied"
+  unless $FS::CurrentUser::CurrentUser->access_right('Configuration');
+
+</%init>
diff --git a/httemplate/edit/access_user.html b/httemplate/edit/access_user.html
index 2d39f96..9d25853 100644
--- a/httemplate/edit/access_user.html
+++ b/httemplate/edit/access_user.html
@@ -2,25 +2,30 @@
                  'name'   => 'Employee',
                  'table'  => 'access_user',
                  'fields' => [
-                               'username',
-                               @pw_fields,
-                               'last',
-                               'first',
-                               { field=>'user_custnum', type=>'search-cust_main', },
-                               { field=>'report_salesnum', type=>'select-sales', empty_label=>'all', },
-                               { field=>'disabled', type=>'checkbox', value=>'Y' },
-                             ],
+                   'username',
+                   @pw_fields,
+                   'last',
+                   'first',
+                   { field=>'sched_item_enabled', type=>'checkbox', value=>'Y' },
+                   { field=>'user_custnum', type=>'search-cust_main', },
+                   { field       => 'report_salesnum',
+                     type        => 'select-sales',
+                     empty_label => 'all',
+                   },
+                   { field=>'disabled', type=>'checkbox', value=>'Y' },
+                 ],
                  'labels' => { 
-                               'usernum'         => 'User number',
-                               'username'        => 'Username',
-                               '_password'       => 'Password',
-                               '_password2'      => 'Re-enter Password',
-                               'last'            => 'Last name',
-                               'first'           => 'First name',
-                               'user_custnum'    => 'Customer (optional)',
-                               'report_salesnum' => 'Limit commission report to sales person',
-                               'disabled'        => 'Disable employee',
-                             },
+                   'usernum'            => 'User number',
+                   'username'           => 'Username',
+                   '_password'          => 'Password',
+                   '_password2'         => 'Re-enter Password',
+                   'last'               => 'Last name',
+                   'first'              => 'First name',
+                   'sched_item_enabled' => 'Installer',
+                   'user_custnum'       => 'Customer (optional)',
+                   'report_salesnum'    => 'Limit commission report to sales person',
+                   'disabled'           => 'Disable employee',
+                 },
                  'edit_callback' => \&edit_callback,
                  'field_callback'=> \&field_callback,
                  'viewall_dir' => 'browse',
@@ -72,6 +77,10 @@ END
 sub edit_callback {
   my ($cgi, $access_user, $fields_listref, $opt_hashref) = @_;
   $access_user->_password('');
+
+  my @sched_item = $access_user->sched_item;
+  $access_user->sched_item_enabled('Y')
+    if $sched_item[0] && ! $sched_item[0]->disabled;
 }
 
 sub field_callback {
diff --git a/httemplate/edit/process/access_user.html b/httemplate/edit/process/access_user.html
index 7fc7c25..0554bb9 100644
--- a/httemplate/edit/process/access_user.html
+++ b/httemplate/edit/process/access_user.html
@@ -12,6 +12,7 @@
                                      },
                  'precheck_callback'        => \&precheck_callback,
                  'post_new_object_callback' => \&post_new_object_callback,
+                 'noerror_callback'         => \&noerror_callback,
              )
 %>
 %   }
@@ -47,4 +48,36 @@ sub post_new_object_callback {
 
 }
 
+sub noerror_callback {
+  my( $cgi, $access_user ) = @_;
+
+  #handle installer checkbox
+  my @sched_item = $access_user->sched_item;
+  my $sched_item = $sched_item[0];
+  if ( $cgi->param('sched_item_enabled') ) {
+
+    if ( ! $sched_item ) {
+      my $sched_item = new FS::sched_item {
+        'usernum' => $access_user->usernum,
+      };
+      my $error = $sched_item->insert;
+      die $error if $error; #wtf?  shouldn't happen
+    } elsif ( $sched_item->disabled ) {
+      $sched_item->disabled('');
+      my $error = $sched_item->replace;
+      die $error if $error; #wtf?  shouldn't happen
+    }
+
+  } elsif ( ! $cgi->param('sched_item_enabled')
+              && $sched_item
+              && ! $sched_item->disabled
+          )
+  {
+    $sched_item->disabled('Y');
+    my $error = $sched_item->replace;
+    die $error if $error; #wtf?  shouldn't happen
+  }
+
+}
+
 </%init>

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

Summary of changes:
 FS/FS.pm                                      |    4 ++
 FS/FS/Schema.pm                               |   38 +++++++++++++++++
 FS/FS/{extension_device.pm => sched_avail.pm} |   55 ++++++++++++++++---------
 FS/FS/{vend_class.pm => sched_item.pm}        |   51 ++++++++++++++---------
 FS/MANIFEST                                   |    4 ++
 FS/t/{AccessRight.t => sched_avail.t}         |    2 +-
 FS/t/{ConfItem.t => sched_item.t}             |    2 +-
 httemplate/browse/access_user.html            |   16 +++++--
 httemplate/browse/sched_item.html             |   18 ++++++++
 httemplate/edit/access_user.html              |   45 ++++++++++++--------
 httemplate/edit/process/access_user.html      |   33 +++++++++++++++
 11 files changed, 204 insertions(+), 64 deletions(-)
 copy FS/FS/{extension_device.pm => sched_avail.pm} (54%)
 copy FS/FS/{vend_class.pm => sched_item.pm} (52%)
 copy FS/t/{AccessRight.t => sched_avail.t} (82%)
 copy FS/t/{ConfItem.t => sched_item.t} (83%)
 create mode 100644 httemplate/browse/sched_item.html




More information about the freeside-commits mailing list