use strict;
use vars qw( @ISA $htpasswd_file );
+use FS::UID;
+use FS::Conf;
use FS::Record qw( qsearch qsearchs dbh );
use FS::m2m_Common;
+use FS::option_Common;
use FS::access_usergroup;
use FS::agent;
-@ISA = qw( FS::m2m_Common FS::Record );
+@ISA = qw( FS::m2m_Common FS::option_Common FS::Record );
+#@ISA = qw( FS::m2m_Common FS::option_Common );
-#kludge htpasswd for now
-$htpasswd_file = '/usr/local/etc/freeside/htpasswd';
+#kludge htpasswd for now (i hope this bootstraps okay)
+FS::UID->install_callback( sub {
+ my $conf = new FS::Conf;
+ $htpasswd_file = $conf->base_dir. '/htpasswd';
+} );
=head1 NAME
sub table { 'access_user'; }
+sub _option_table { 'access_user_pref'; }
+sub _option_namecol { 'prefname'; }
+sub _option_valuecol { 'prefvalue'; }
+
=item insert
Adds this record to the database. If there is an error, returns the error,
local $FS::UID::AutoCommit = 0;
my $dbh = dbh;
- my $error =
- $self->SUPER::insert(@_)
- || $self->htpasswd_kludge()
- ;
+ my $error = $self->htpasswd_kludge();
+ if ( $error ) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ return $error;
+ }
+
+ $error = $self->SUPER::insert(@_);
if ( $error ) {
$dbh->rollback or die $dbh->errstr if $oldAutoCommit;
}
}
-
=item delete
Delete this record from the database.
=cut
sub replace {
- my($new, $old) = ( shift, shift );
+ my $new = shift;
+
+ my $old = ( ref($_[0]) eq ref($new) )
+ ? shift
+ : $new->replace_old;
local $SIG{HUP} = 'IGNORE';
local $SIG{INT} = 'IGNORE';
local $FS::UID::AutoCommit = 0;
my $dbh = dbh;
- my $error =
- $new->SUPER::replace($old, @_)
- || $new->htpasswd_kludge()
- ;
+ if ( $new->_password ne $old->_password ) {
+ my $error = $new->htpasswd_kludge();
+ if ( $error ) {
+ $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
+ return $error;
+ }
+ }
+
+ my $error = $new->SUPER::replace($old, @_);
if ( $error ) {
$dbh->rollback or die $dbh->errstr if $oldAutoCommit;
my $error =
$self->ut_numbern('usernum')
- || $self->ut_text('username')
+ || $self->ut_alpha('username')
|| $self->ut_text('_password')
|| $self->ut_text('last')
|| $self->ut_text('first')
sub agentnums_href {
my $self = shift;
- { map { $_ => 1 } $self->agentnums };
+ scalar( { map { $_ => 1 } $self->agentnums } );
}
-=item agentnums_sql
+=item agentnums_sql [ HASHREF | OPTION => VALUE ... ]
Returns an sql fragement to select only agentnums this user can view.
+Options are passed as a hashref or a list. Available options are:
+
+=over 4
+
+=item null - The frament will also allow the selection of null agentnums.
+
+=item null_right - The fragment will also allow the selection of null agentnums if the current user has the provided access right
+
+=item table - Optional table name in which agentnum is being checked. Sometimes required to resolve 'column reference "agentnum" is ambiguous' errors.
+
+=back
+
=cut
sub agentnums_sql {
- my $self = shift;
+ my( $self ) = shift;
+ my %opt = ref($_[0]) ? %{$_[0]} : @_;
+
+ my $agentnum = $opt{'table'} ? $opt{'table'}.'.agentnum' : 'agentnum';
- my @agentnums = map { "agentnum = $_" } $self->agentnums;
+ my @agentnums = map { "$agentnum = $_" } $self->agentnums;
- push @agentnums, 'agentnum IS NULL'
- if $self->access_right('View/link unlinked services');
+ push @agentnums, "$agentnum IS NULL"
+ if $opt{'null'}
+ || ( $opt{'null_right'} && $self->access_right($opt{'null_right'}) );
return ' 1 = 0 ' unless scalar(@agentnums);
'( '. join( ' OR ', @agentnums ). ' )';