From: Ivan Kohler Date: Sat, 5 Apr 2014 19:46:14 +0000 (-0700) Subject: installers, RT#16584 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=0dfd49189b0ea878e99f1590a2939e55ab02c89c installers, RT#16584 --- diff --git a/FS/FS.pm b/FS/FS.pm index 41d513806..60adfc45f 100644 --- a/FS/FS.pm +++ b/FS/FS.pm @@ -99,6 +99,10 @@ L - Group reseller access L - Access rights +L - Installers / schedulable resources + +L - Installer/resource availability + L - POP (Point of Presence, not Post Office Protocol) class diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index 4f547725d..bdae73649 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 000000000..62b1a5d69 --- /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 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, L + +=cut + +1; + diff --git a/FS/FS/sched_item.pm b/FS/FS/sched_item.pm new file mode 100644 index 000000000..5f55188e6 --- /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 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 +Laccess_user; + $access_user ? $access_user->name : $self->itemname; +} + +=back + +=head1 BUGS + +=head1 SEE ALSO + +L, L, L + +=cut + +1; + diff --git a/FS/MANIFEST b/FS/MANIFEST index 637401a8f..74de30981 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 000000000..045e7fa30 --- /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 000000000..212f8e846 --- /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 6a1fea1ce..446bfe0be 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 000000000..09435805a --- /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'); + + diff --git a/httemplate/edit/access_user.html b/httemplate/edit/access_user.html index 2d39f969c..9d2585366 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 7fc7c25e1..0554bb940 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 + } + +} +