X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2FConf.pm;h=3aa19b70786acda406782dd1714177ffaa0cf35a;hp=66fd9b30e6a90e1c19724a74487d58225c423995;hb=9dc88f6c738f30ce1eb6339ba4b739b45555dea4;hpb=cd907554f4c08175c379e204e28e26483acf957a diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 66fd9b30e..3aa19b707 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -1,6 +1,7 @@ package FS::Conf; use vars qw($base_dir @config_items @base_items @card_types $DEBUG); +use Carp; use IO::File; use File::Basename; use MIME::Base64; @@ -74,30 +75,30 @@ sub base_dir { $1; } -=item config KEY +=item config KEY [ AGENTNUM ] Returns the configuration value or values (depending on context) for key. +The optional agent number selects an agent specific value instead of the +global default if one is present. =cut sub _usecompat { my ($self, $method) = (shift, shift); - warn "NO CONFIGURATION RECORDS FOUND -- USING COMPATIBILITY MODE" + carp "NO CONFIGURATION RECORDS FOUND -- USING COMPATIBILITY MODE" if use_confcompat; my $compat = new FS::Conf_compat17 ("$base_dir/conf." . datasrc); $compat->$method(@_); } sub _config { - my($self,$name,$agent)=@_; + my($self,$name,$agentnum)=@_; my $hashref = { 'name' => $name }; - if (defined($agent) && $agent) { - $hashref->{agent} = $agent; - } + $hashref->{agentnum} = $agentnum; local $FS::Record::conf = undef; # XXX evil hack prevents recursion my $cv = FS::Record::qsearchs('conf', $hashref); - if (!$cv && exists($hashref->{agent})) { - delete($hashref->{agent}); + if (!$cv && defined($agentnum)) { + $hashref->{agentnum} = ''; $cv = FS::Record::qsearchs('conf', $hashref); } return $cv; @@ -107,8 +108,8 @@ sub config { my $self = shift; return $self->_usecompat('config', @_) if use_confcompat; - my($name,$agent)=@_; - my $cv = $self->_config($name, $agent) or return; + my($name,$agentnum)=@_; + my $cv = $self->_config($name, $agentnum) or return; if ( wantarray ) { my $v = $cv->value; @@ -119,7 +120,7 @@ sub config { } } -=item config_binary KEY +=item config_binary KEY [ AGENTNUM ] Returns the exact scalar value for key. @@ -129,12 +130,12 @@ sub config_binary { my $self = shift; return $self->_usecompat('config_binary', @_) if use_confcompat; - my($name,$agent)=@_; - my $cv = $self->_config($name, $agent) or return; + my($name,$agentnum)=@_; + my $cv = $self->_config($name, $agentnum) or return; decode_base64($cv->value); } -=item exists KEY +=item exists KEY [ AGENTNUM ] Returns true if the specified key exists, even if the corresponding value is undefined. @@ -145,8 +146,8 @@ sub exists { my $self = shift; return $self->_usecompat('exists', @_) if use_confcompat; - my($name,$agent)=@_; - defined($self->_config($name, $agent)); + my($name,$agentnum)=@_; + defined($self->_config($name, $agentnum)); } =item config_orbase KEY SUFFIX @@ -156,6 +157,9 @@ KEY_SUFFIX, if it exists, otherwise for KEY =cut +# outmoded as soon as we shift to agentnum based config values +# well, mostly. still useful for e.g. late notices, etc. in that we want +# these to fall back to standard values sub config_orbase { my $self = shift; return $self->_usecompat('config_orbase', @_) if use_confcompat; @@ -168,7 +172,51 @@ sub config_orbase { } } -=item touch KEY +=item key_orbase KEY SUFFIX + +If the config value KEY_SUFFIX exists, returns KEY_SUFFIX, otherwise returns +KEY. Useful for determining which exact configuration option is returned by +config_orbase. + +=cut + +sub key_orbase { + my $self = shift; + #no compat for this...return $self->_usecompat('config_orbase', @_) if use_confcompat; + + my( $name, $suffix ) = @_; + if ( $self->exists("${name}_$suffix") ) { + "${name}_$suffix"; + } else { + $name; + } +} + +=item invoice_templatenames + +Returns all possible invoice template names. + +=cut + +sub invoice_templatenames { + my( $self ) = @_; + + my %templatenames = (); + foreach my $item ( $self->config_items ) { + foreach my $base ( @base_items ) { + my( $main, $ext) = split(/\./, $base); + $ext = ".$ext" if $ext; + if ( $item->key =~ /^${main}_(.+)$ext$/ ) { + $templatenames{$1}++; + } + } + } + + sort keys %templatenames; + +} + +=item touch KEY [ AGENT ]; Creates the specified configuration key if it does not exist. @@ -178,11 +226,13 @@ sub touch { my $self = shift; return $self->_usecompat('touch', @_) if use_confcompat; - my($name, $agent) = @_; - $self->set($name, '', $agent); + my($name, $agentnum) = @_; + unless ( $self->exists($name, $agentnum) ) { + $self->set($name, '', $agentnum); + } } -=item set KEY VALUE +=item set KEY VALUE [ AGENTNUM ]; Sets the specified configuration key to the given value. @@ -192,15 +242,15 @@ sub set { my $self = shift; return $self->_usecompat('set', @_) if use_confcompat; - my($name, $value, $agent) = @_; + my($name, $value, $agentnum) = @_; $value =~ /^(.*)$/s; $value = $1; warn "[FS::Conf] SET $name\n" if $DEBUG; - my $old = FS::Record::qsearchs('conf', {name => $name, agent => $agent}); + my $old = FS::Record::qsearchs('conf', {name => $name, agentnum => $agentnum}); my $new = new FS::conf { $old ? $old->hash - : ('name' => $name, 'agent' => $agent) + : ('name' => $name, 'agentnum' => $agentnum) }; $new->value($value); @@ -216,7 +266,7 @@ sub set { } -=item set_binary KEY VALUE +=item set_binary KEY VALUE [ AGENTNUM ] Sets the specified configuration key to an exact scalar value which can be retrieved with config_binary. @@ -227,11 +277,11 @@ sub set_binary { my $self = shift; return if use_confcompat; - my($name, $value, $agent)=@_; - $self->set($name, encode_base64($value), $agent); + my($name, $value, $agentnum)=@_; + $self->set($name, encode_base64($value), $agentnum); } -=item delete KEY +=item delete KEY [ AGENTNUM ]; Deletes the specified configuration key. @@ -241,9 +291,9 @@ sub delete { my $self = shift; return $self->_usecompat('delete', @_) if use_confcompat; - my($name, $agent) = @_; - if ( my $cv = FS::Record::qsearchs('conf', {name => $name, agent => $agent}) ) { - warn "[FS::Conf] DELETE $file\n"; + my($name, $agentnum) = @_; + if ( my $cv = FS::Record::qsearchs('conf', {name => $name, agentnum => $agentnum}) ) { + warn "[FS::Conf] DELETE $name\n"; my $oldAutoCommit = $FS::UID::AutoCommit; local $FS::UID::AutoCommit = 0; @@ -391,7 +441,7 @@ sub _orbase_items { map { new FS::ConfItem { 'key' => $_, 'section' => $proto->section, - 'description' => 'Alternate ' . $proto->description . ' See the billing documentation for details.', + 'description' => 'Alternate ' . $proto->description . ' See the billing documentation for details.', 'type' => $proto->type, }; } &$listmaker($base); @@ -460,8 +510,6 @@ worry that config_items is freeside-specific and icky. "Configuration" in the web interface (config/config.cgi). -httemplate/docs/config.html - =cut #Business::CreditCard @@ -493,6 +541,21 @@ httemplate/docs/config.html logo.eps ); +@base_items = qw ( + invoice_template + invoice_latex + invoice_latexreturnaddress + invoice_latexfooter + invoice_latexsmallfooter + invoice_latexnotes + invoice_html + invoice_htmlreturnaddress + invoice_htmlfooter + invoice_htmlnotes + logo.png + logo.eps + ); + @config_items = map { new FS::ConfItem $_ } ( { @@ -505,7 +568,7 @@ httemplate/docs/config.html { 'key' => 'alerter_template', 'section' => 'billing', - 'description' => 'Template file for billing method expiration alerts. See the billing documentation for details.', + 'description' => 'Template file for billing method expiration alerts. See the billing documentation for details.', 'type' => 'textarea', }, @@ -573,6 +636,13 @@ httemplate/docs/config.html }, { + 'key' => 'business-onlinepayment-email_customer', + 'section' => 'billing', + 'description' => 'Controls the "email_customer" flag used by some Business::OnlinePayment processors to enable customer receipts.', + 'type' => 'checkbox', + }, + + { 'key' => 'countrydefault', 'section' => 'UI', 'description' => 'Default two-letter country code (if not supplied, the default is `US\')', @@ -690,7 +760,7 @@ httemplate/docs/config.html { 'key' => 'home', - 'section' => 'required', + 'section' => 'shell', 'description' => 'For new users, prefixed to username to create a directory name. Should have a leading but not a trailing slash.', 'type' => 'text', }, @@ -704,15 +774,15 @@ httemplate/docs/config.html { 'key' => 'invoice_template', - 'section' => 'required', - 'description' => 'Required template file for invoices. See the billing documentation for details.', + 'section' => 'billing', + 'description' => 'Text template file for invoices. Used if no invoice_html template is defined, and also seen by users using non-HTML capable mail clients. See the billing documentation for details.', 'type' => 'textarea', }, { 'key' => 'invoice_html', 'section' => 'billing', - 'description' => 'Optional HTML template for invoices. See the billing documentation for details.', + 'description' => 'Optional HTML template for invoices. See the billing documentation for details.', 'type' => 'textarea', }, @@ -741,7 +811,7 @@ httemplate/docs/config.html { 'key' => 'invoice_latex', 'section' => 'billing', - 'description' => 'Optional LaTeX template for typeset PostScript invoices. See the billing documentation for details.', + 'description' => 'Optional LaTeX template for typeset PostScript invoices. See the billing documentation for details.', 'type' => 'textarea', }, @@ -793,7 +863,14 @@ httemplate/docs/config.html 'section' => 'billing', 'description' => 'Optional default invoice term, used to calculate a due date printed on invoices.', 'type' => 'select', - 'select_enum' => [ '', 'Payable upon receipt', 'Net 0', 'Net 10', 'Net 15', 'Net 30', 'Net 45', 'Net 60' ], + 'select_enum' => [ '', 'Payable upon receipt', 'Net 0', 'Net 10', 'Net 15', 'Net 20', 'Net 30', 'Net 45', 'Net 60' ], + }, + + { + 'key' => 'invoice_sections', + 'section' => 'billing', + 'description' => 'Split invoice into sections and label according to package class when enabled.', + 'type' => 'checkbox', }, { @@ -907,7 +984,7 @@ httemplate/docs/config.html { 'key' => 'shells', - 'section' => 'required', + 'section' => 'shell', 'description' => 'Legal shells (think /etc/shells). You probably want to `cut -d: -f7 /etc/passwd | sort | uniq\' initially so that importing doesn\'t fail with `Illegal shell\' errors, then remove any special entries afterwords. A blank line specifies that an empty shell is permitted.', 'type' => 'textarea', }, @@ -922,7 +999,7 @@ httemplate/docs/config.html { 'key' => 'signupurl', 'section' => 'UI', - 'description' => 'if you are using customer-to-customer referrals, and you enter the URL of your signup server CGI, the customer view screen will display a customized link to the signup server with the appropriate customer as referral', + 'description' => 'if you are using customer-to-customer referrals, and you enter the URL of your signup server CGI, the customer view screen will display a customized link to the signup server with the appropriate customer as referral', 'type' => 'text', }, @@ -1055,7 +1132,7 @@ httemplate/docs/config.html { 'key' => 'username-uppercase', 'section' => 'username', - 'description' => 'Allow uppercase characters in usernames', + 'description' => 'Allow uppercase characters in usernames. Not recommended for use with FreeRADIUS with MySQL backend, which is case-insensitive by default.', 'type' => 'checkbox', }, @@ -1303,7 +1380,7 @@ httemplate/docs/config.html { 'key' => 'emailcancel', 'section' => 'billing', - 'description' => 'Enable emailing of cancellation notices.', + 'description' => 'Enable emailing of cancellation notices. Make sure to fill in the cancelmessage and cancelsubject configuration values as well.', 'type' => 'checkbox', }, @@ -1329,10 +1406,18 @@ httemplate/docs/config.html }, { + 'key' => 'enable_taxproducts', + 'section' => 'billing', + 'description' => 'Enable per-package mapping to new style tax classes', + 'type' => 'checkbox', + }, + + { 'key' => 'welcome_email', 'section' => '', 'description' => 'Template file for welcome email. Welcome emails are sent to the customer email invoice destination(s) each time a svc_acct record is created. See the Text::Template documentation for details on the template substitution language. The following variables are available
$username
$password
$first
$last
$pkg