use FS::ConfItem;
use FS::ConfDefaults;
use FS::Conf_compat17;
+use FS::Locales;
use FS::payby;
use FS::conf;
use FS::Record qw(qsearch qsearchs);
=over 4
-=item new
+=item new [ HASHREF ]
Create a new configuration object.
+HASHREF may contain options to set the configuration context. Currently
+accepts C<locale>, and C<localeonly> to disable fallback to the null locale.
+
=cut
sub new {
- my($proto) = @_;
+ my($proto) = shift;
+ my $opts = shift || {};
my($class) = ref($proto) || $proto;
- my($self) = { 'base_dir' => $base_dir };
+ my $self = {
+ 'base_dir' => $base_dir,
+ 'locale' => $opts->{locale},
+ 'localeonly' => $opts->{localeonly}, # for config-view.cgi ONLY
+ };
+ warn "FS::Conf created with no locale fallback.\n" if $self->{localeonly};
bless ($self, $class);
}
sub _config {
my($self,$name,$agentnum,$agentonly)=@_;
my $hashref = { 'name' => $name };
- $hashref->{agentnum} = $agentnum;
local $FS::Record::conf = undef; # XXX evil hack prevents recursion
- my $cv = FS::Record::qsearchs('conf', $hashref);
- if (!$agentonly && !$cv && defined($agentnum) && $agentnum) {
- $hashref->{agentnum} = '';
- $cv = FS::Record::qsearchs('conf', $hashref);
+ my $cv;
+ my @a = (
+ ($agentnum || ()),
+ ($agentonly && $agentnum ? () : '')
+ );
+ my @l = (
+ ($self->{locale} || ()),
+ ($self->{localeonly} && $self->{locale} ? () : '')
+ );
+ # try with the agentnum first, then fall back to no agentnum if allowed
+ foreach my $a (@a) {
+ $hashref->{agentnum} = $a;
+ foreach my $l (@l) {
+ $hashref->{locale} = $l;
+ $cv = FS::Record::qsearchs('conf', $hashref);
+ return $cv if $cv;
+ }
}
- return $cv;
+ return undef;
}
sub config {
warn "[FS::Conf] SET $name\n" if $DEBUG;
- my $old = FS::Record::qsearchs('conf', {name => $name, agentnum => $agentnum});
- my $new = new FS::conf { $old ? $old->hash
- : ('name' => $name, 'agentnum' => $agentnum)
- };
+ my $hashref = {
+ name => $name,
+ agentnum => $agentnum,
+ locale => $self->{locale}
+ };
+
+ my $old = FS::Record::qsearchs('conf', $hashref);
+ my $new = new FS::conf { $old ? $old->hash : %$hashref };
$new->value($value);
my $error;
return $self->_usecompat('delete', @_) if use_confcompat;
my($name, $agentnum) = @_;
- if ( my $cv = FS::Record::qsearchs('conf', {name => $name, agentnum => $agentnum}) ) {
- warn "[FS::Conf] DELETE $name\n";
+ if ( my $cv = FS::Record::qsearchs('conf', {name => $name, agentnum => $agentnum, locale => $self->{locale}}) ) {
+ warn "[FS::Conf] DELETE $name\n" if $DEBUG;
my $oldAutoCommit = $FS::UID::AutoCommit;
local $FS::UID::AutoCommit = 0;
'type' => 'text',
},
+ {
+ 'key' => 'log_sent_mail',
+ 'section' => 'notification',
+ 'description' => 'Enable logging of template-generated email.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'alert_expiration',
'section' => 'notification',
'type' => 'text',
},
+ {
+ 'key' => 'credits-auto-apply-disable',
+ 'section' => 'billing',
+ 'description' => 'Disable the "Auto-Apply to invoices" UI option for new credits',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'credit-card-surcharge-percentage',
'section' => 'billing',
'description' => 'Generate a line item on an invoice even when a package is discounted 100%',
'type' => 'checkbox',
},
-
+
+ {
+ 'key' => 'discount-show_available',
+ 'section' => 'billing',
+ 'description' => 'Show available prepayment discounts on invoices.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'invoice-barcode',
'section' => 'billing',
'description' => 'Display a barcode on HTML and PDF invoices',
'type' => 'checkbox',
},
+
+ {
+ 'key' => 'cust_main-select-billday',
+ 'section' => 'billing',
+ 'description' => 'When used with a specific billing event, allows the selection of the day of month on which to charge credit card / bank account automatically, on a per-customer basis',
+ 'type' => 'checkbox',
+ },
{
'key' => 'encryption',
'section' => 'billing',
- 'description' => 'Enable encryption of credit cards.',
+ 'description' => 'Enable encryption of credit cards and echeck numbers',
'type' => 'checkbox',
},
'key' => 'encryptionmodule',
'section' => 'billing',
'description' => 'Use which module for encryption?',
- 'type' => 'text',
+ 'type' => 'select',
+ 'select_enum' => [ '', 'Crypt::OpenSSL::RSA', ],
},
{
'key' => 'encryptionpublickey',
'section' => 'billing',
- 'description' => 'Your RSA Public Key - Required if Encryption is turned on.',
+ 'description' => 'Encryption public key',
'type' => 'textarea',
},
{
'key' => 'encryptionprivatekey',
'section' => 'billing',
- 'description' => 'Your RSA Private Key - Including this will enable the "Bill Now" feature. However if the system is compromised, a hacker can use this key to decode the stored credit card information. This is generally not a good idea.',
+ 'description' => 'Encryption private key',
'type' => 'textarea',
},
'type' => 'text',
'per_agent' => 1,
},
-
+
+ {
+ 'key' => 'next-bill-ignore-time',
+ 'section' => 'billing',
+ 'description' => 'Ignore the time portion of next bill dates when billing, matching anything from 00:00:00 to 23:59:59 on the billing day.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'business-onlinepayment',
'section' => 'billing',
'type' => 'checkbox',
},
+ {
+ 'key' => 'business-onlinepayment-currency',
+ 'section' => 'billing',
+ 'description' => 'Currency parameter for Business::OnlinePayment transactions.',
+ 'type' => 'select',
+ 'select_enum' => [ '', qw( USD AUD CAD DKK EUR GBP ILS JPY NZD ) ],
+ },
+
{
'key' => 'countrydefault',
'section' => 'UI',
'description' => 'Subject: header on email invoices. Defaults to "Invoice". The following substitutions are available: $name, $name_short, $invoice_number, and $invoice_date.',
'type' => 'text',
'per_agent' => 1,
+ 'per_locale' => 1,
},
{
'description' => 'Notes section for HTML invoices. Defaults to the same data in invoice_latexnotes if not specified.',
'type' => 'textarea',
'per_agent' => 1,
+ 'per_locale' => 1,
},
{
'description' => 'Footer for HTML invoices. Defaults to the same data in invoice_latexfooter if not specified.',
'type' => 'textarea',
'per_agent' => 1,
+ 'per_locale' => 1,
},
{
'description' => 'Summary initial page for HTML invoices.',
'type' => 'textarea',
'per_agent' => 1,
+ 'per_locale' => 1,
},
{
'section' => 'invoicing',
'description' => 'Return address for HTML invoices. Defaults to the same data in invoice_latexreturnaddress if not specified.',
'type' => 'textarea',
+ 'per_locale' => 1,
},
{
'description' => 'Notes section for LaTeX typeset PostScript invoices.',
'type' => 'textarea',
'per_agent' => 1,
+ 'per_locale' => 1,
},
{
'description' => 'Footer for LaTeX typeset PostScript invoices.',
'type' => 'textarea',
'per_agent' => 1,
+ 'per_locale' => 1,
},
{
'description' => 'Summary initial page for LaTeX typeset PostScript invoices.',
'type' => 'textarea',
'per_agent' => 1,
+ 'per_locale' => 1,
},
{
'description' => 'Remittance coupon for LaTeX typeset PostScript invoices.',
'type' => 'textarea',
'per_agent' => 1,
+ 'per_locale' => 1,
},
{
'description' => 'Optional small footer for multi-page LaTeX typeset PostScript invoices.',
'type' => 'textarea',
'per_agent' => 1,
+ 'per_locale' => 1,
},
{
{
'key' => 'invoice_print_pdf',
'section' => 'invoicing',
- 'description' => 'Store postal invoices for download in PDF format rather than printing them directly.',
+ 'description' => 'For all invoice print operations, store postal invoices for download in PDF format rather than printing them directly.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'invoice_print_pdf-spoolagent',
+ 'section' => 'invoicing',
+ 'description' => 'Store postal invoices PDF downloads in per-agent spools.',
'type' => 'checkbox',
},
'section' => 'invoicing',
'description' => 'Optional default invoice term, used to calculate a due date printed on invoices.',
'type' => 'select',
- 'select_enum' => [ '', 'Payable upon receipt', 'Net 0', 'Net 3', 'Net 10', 'Net 15', 'Net 20', 'Net 21', 'Net 30', 'Net 45', 'Net 60', 'Net 90' ],
+ 'select_enum' => [ '', 'Payable upon receipt', 'Net 0', 'Net 3', 'Net 9', 'Net 10', 'Net 15', 'Net 20', 'Net 21', 'Net 30', 'Net 45', 'Net 60', 'Net 90' ],
},
{
'description' => 'Template to use for payment receipts.',
%msg_template_options,
},
+
+ {
+ 'key' => 'payment_receipt_from',
+ 'section' => 'notification',
+ 'description' => 'From: address for payment receipts, if not specified in the template.',
+ 'type' => 'text',
+ 'per_agent' => 1,
+ },
{
'key' => 'payment_receipt_email',
{
'key' => 'locale',
'section' => 'UI',
- 'description' => 'Message locale',
+ 'description' => 'Default locale',
'type' => 'select',
- 'select_enum' => [ qw(en_US) ],
+ 'options_sub' => sub {
+ map { $_ => FS::Locales->description($_) } FS::Locales->locales;
+ },
+ 'option_sub' => sub {
+ FS::Locales->description(shift)
+ },
},
{
'type' => 'checkbox',
},
+ {
+ 'key' => 'default_agentnum',
+ 'section' => 'UI',
+ 'description' => 'Default agent for the backoffice',
+ 'type' => 'select-agent',
+ },
+
{
'key' => 'signup_server-default_agentnum',
'section' => 'self-service',
'description' => 'Default agent for the signup server',
- 'type' => 'select-sub',
- 'options_sub' => sub { require FS::Record;
- require FS::agent;
- map { $_->agentnum => $_->agent }
- FS::Record::qsearch('agent', { disabled=>'' } );
- },
- 'option_sub' => sub { require FS::Record;
- require FS::agent;
- my $agent = FS::Record::qsearchs(
- 'agent', { 'agentnum'=>shift }
- );
- $agent ? $agent->agent : '';
- },
+ 'type' => 'select-agent',
},
{
'description' => 'Template to use for welcome messages when a svc_acct record is created.',
%msg_template_options,
},
+
+ {
+ 'key' => 'svc_acct_welcome_exclude',
+ 'section' => 'notification',
+ 'description' => 'A list of svc_acct services for which no welcome email is to be sent.',
+ 'type' => 'select-part_svc',
+ 'multiple' => 1,
+ },
{
'key' => 'welcome_email',
'type' => 'checkbox',
},
+ {
+ 'key' => 'svc_broadband-radius',
+ 'section' => '',
+ 'description' => 'Enable RADIUS groups for broadband services.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'svc_acct-alldomains',
'section' => '',
'type' => 'checkbox',
},
+ {
+ 'key' => 'dump-localdest',
+ 'section' => '',
+ 'description' => 'Destination for local database dumps (full path)',
+ 'type' => 'text',
+ },
+
{
'key' => 'dump-scpdest',
'section' => '',
- 'description' => 'destination for scp database dumps: user@host:/path',
+ 'description' => 'Destination for scp database dumps: user@host:/path',
'type' => 'text',
},
'type' => 'select-part_svc',
'multiple' => 1,
},
-
+
+ {
+ 'key' => 'selfservice-password_reset_verification',
+ 'section' => 'self-service',
+ 'description' => 'If enabled, specifies the type of verification required for self-service password resets.',
+ 'type' => 'select',
+ 'select_hash' => [ '' => 'Password reset disabled',
+ 'paymask,amount,zip' => 'Verify with credit card (or bank account) last 4 digits, payment amount and zip code',
+ ],
+ },
+
+ {
+ 'key' => 'selfservice-password_reset_msgnum',
+ 'section' => 'self-service',
+ 'description' => 'Template to use for password reset emails.',
+ %msg_template_options,
+ },
+
+ {
+ 'key' => 'selfservice-hide_invoices-taxclass',
+ 'section' => 'self-service',
+ 'description' => 'Hide invoices with only this package tax class from self-service. Typically set to something like "Previous balance" and used when importing legacy invoices into legacy_cust_bill.',
+ 'type' => 'text',
+ },
+
{
'key' => 'selfservice-recent-did-age',
'section' => 'self-service',
{
'key' => 'ticket_system',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'Ticketing system integration. <b>RT_Internal</b> uses the built-in RT ticketing system (see the <a href="http://www.freeside.biz/mediawiki/index.php/Freeside:2.1:Documentation:RT_Installation">integrated ticketing installation instructions</a>). <b>RT_External</b> accesses an external RT installation in a separate database (local or remote).',
'type' => 'select',
#'select_enum' => [ '', qw(RT_Internal RT_Libs RT_External) ],
{
'key' => 'ticket_system-default_queueid',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'Default queue used when creating new customer tickets.',
'type' => 'select-sub',
'options_sub' => sub {
},
{
'key' => 'ticket_system-force_default_queueid',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'Disallow queue selection when creating new tickets from customer view.',
'type' => 'checkbox',
},
{
'key' => 'ticket_system-selfservice_queueid',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'Queue used when creating new customer tickets from self-service. Defautls to ticket_system-default_queueid if not specified.',
#false laziness w/above
'type' => 'select-sub',
{
'key' => 'ticket_system-requestor',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'Email address to use as the requestor for new tickets. If blank, the customer\'s invoicing address(es) will be used.',
'type' => 'text',
},
{
'key' => 'ticket_system-priority_reverse',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'Enable this to consider lower numbered priorities more important. A bad habit we picked up somewhere. You probably want to avoid it and use the default.',
'type' => 'checkbox',
},
{
'key' => 'ticket_system-custom_priority_field',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'Custom field from the ticketing system to use as a custom priority classification.',
'type' => 'text',
},
{
'key' => 'ticket_system-custom_priority_field-values',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'Values for the custom field from the ticketing system to break down and sort customer ticket lists.',
'type' => 'textarea',
},
{
'key' => 'ticket_system-custom_priority_field_queue',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'Ticketing system queue in which the custom field specified in ticket_system-custom_priority_field is located.',
'type' => 'text',
},
+ {
+ 'key' => 'ticket_system-selfservice_priority_field',
+ 'section' => 'ticketing',
+ 'description' => 'Custom field from the ticket system to use as a customer-managed priority field.',
+ 'type' => 'text',
+ },
+
+ {
+ 'key' => 'ticket_system-selfservice_edit_subject',
+ 'section' => 'ticketing',
+ 'description' => 'Allow customers to edit ticket subjects through selfservice.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'ticket_system-escalation',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'Enable priority escalation of tickets as part of daily batch processing.',
'type' => 'checkbox',
},
{
'key' => 'ticket_system-rt_external_datasrc',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'With external RT integration, the DBI data source for the external RT installation, for example, <code>DBI:Pg:user=rt_user;password=rt_word;host=rt.example.com;dbname=rt</code>',
'type' => 'text',
{
'key' => 'ticket_system-rt_external_url',
- 'section' => '',
+ 'section' => 'ticketing',
'description' => 'With external RT integration, the URL for the external RT installation, for example, <code>https://rt.example.com/rt</code>',
'type' => 'text',
},
'per_agent' => 1,
},
+ {
+ 'key' => 'company_phonenum',
+ 'section' => 'notification',
+ 'description' => 'Your company phone number',
+ 'type' => 'text',
+ 'per_agent' => 1,
+ },
+
{
'key' => 'echeck-void',
'section' => 'deprecated',
{
'key' => 'overlimit_groups',
'section' => '',
- 'description' => 'RADIUS group (or comma-separated groups) to assign to svc_acct which has exceeded its bandwidth or time limit.',
- 'type' => 'text',
+ 'description' => 'RADIUS group(s) to assign to svc_acct which has exceeded its bandwidth or time limit.',
+ 'type' => 'select-sub',
'per_agent' => 1,
+ 'multiple' => 1,
+ 'options_sub' => sub { require FS::Record;
+ require FS::radius_group;
+ map { $_->groupnum => $_->long_description }
+ FS::Record::qsearch('radius_group', {} );
+ },
+ 'option_sub' => sub { require FS::Record;
+ require FS::radius_group;
+ my $radius_group = FS::Record::qsearchs(
+ 'radius_group', { 'groupnum' => shift }
+ );
+ $radius_group ? $radius_group->long_description : '';
+ },
},
{
{
'key' => 'cust_pkg-show_fcc_voice_grade_equivalent',
'section' => 'UI',
- 'description' => "Show a field on package definitions for assigning a DSO equivalency number suitable for use on FCC form 477.",
+ 'description' => "Show a field on package definitions for assigning a DS0 equivalency number suitable for use on FCC form 477.",
'type' => 'checkbox',
},
'type' => 'checkbox',
},
+ {
+ 'key' => 'svc_acct-no_edit_username',
+ 'section' => 'shell',
+ 'description' => 'Disallow username editing.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'zone-underscore',
'section' => 'BIND',
'type' => 'checkbox',
},
+ {
+ 'key' => 'voip-cust_accountcode_cdr',
+ 'section' => 'telephony',
+ 'description' => 'Enable the per-customer option for CDR breakdown by accountcode.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'voip-cust_cdr_spools',
'section' => 'telephony',
'section' => 'billing',
'description' => 'This allows selection of a package to insert on invoices for customers with postal invoices selected.',
'type' => 'select-part_pkg',
+ 'per_agent' => 1,
},
{
'description' => 'Fixed (unchangeable) format for electronic check batches.',
'type' => 'select',
'select_enum' => [ 'csv-td_canada_trust-merchant_pc_batch', 'BoM', 'PAP',
- 'paymentech', 'ach-spiritone', 'RBC', 'td_eft1464'
+ 'paymentech', 'ach-spiritone', 'RBC', 'td_eft1464',
+ 'eft_canada'
]
},
'type' => 'checkbox',
},
+ {
+ 'key' => 'batchconfig-eft_canada',
+ 'section' => 'billing',
+ 'description' => 'Configuration for EFT Canada batching, four lines: 1. SFTP username, 2. SFTP password, 3. Transaction code, 4. Number of days to delay process date.',
+ 'type' => 'textarea',
+ 'per_agent' => 1,
+ },
+
+ {
+ 'key' => 'batch-spoolagent',
+ 'section' => 'billing',
+ 'description' => 'Store payment batches per-agent.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'payment_history-years',
'section' => 'UI',
'type' => 'checkbox',
},
+ {
+ 'key' => 'cust_main-edit_calling_list_exempt',
+ 'section' => 'UI',
+ 'description' => 'Display the "calling_list_exempt" checkbox on customer edit.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'support-key',
'section' => '',
'type' => 'image',
'per_agent' => 1, #XXX just view/logo.cgi, which is for the global
#old-style editor anyway...?
+ 'per_locale' => 1,
},
{
'description' => 'Company logo for printed and PDF invoices, in EPS format.',
'type' => 'image',
'per_agent' => 1, #XXX as above, kinda
+ 'per_locale' => 1,
},
{
'type' => 'image',
'per_agent' => 1,
},
+
+ {
+ 'key' => 'selfservice-view_usage_nodomain',
+ 'section' => 'self-service',
+ 'description' => 'Show usernames without their domains in "View my usage" in the self-service interface.',
+ 'type' => 'checkbox',
+ },
{
'key' => 'selfservice-bulk_format',
{
'key' => 'signup-recommend_daytime',
'section' => 'self-service',
- 'description' => 'Encourage the entry of a daytime phone number invoicing email address on signup.',
+ 'description' => 'Encourage the entry of a daytime phone number on signup.',
'type' => 'checkbox',
},
+ {
+ 'key' => 'signup-duplicate_cc-warn_hours',
+ 'section' => 'self-service',
+ 'description' => 'Issue a warning if the same credit card is used for multiple signups within this many hours.',
+ 'type' => 'text',
+ },
+
{
'key' => 'svc_phone-radius-default_password',
'section' => 'telephony',
{
'key' => 'cdr-taqua-da_rewrite',
- 'section' => '',
+ 'section' => 'telephony',
'description' => 'For the Taqua CDR format, a comma-separated list of directory assistance 800 numbers. Any CDRs with these numbers as "BilledNumber" will be rewritten to the "CallingPartyNumber" (and CallType "12") on import.',
'type' => 'text',
},
+ {
+ 'key' => 'cdr-taqua-accountcode_rewrite',
+ 'section' => 'telephony',
+ 'description' => 'For the Taqua CDR format, pull accountcodes from secondary CDRs with matching sessionNumber.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'cust_pkg-show_autosuspend',
'section' => 'UI',
'type' => 'text',
},
+ {
+ 'key' => 'svc_broadband-manage_link_text',
+ 'section' => 'UI',
+ 'description' => 'Label for "Manage Device" link',
+ 'type' => 'text',
+ },
+
+ {
+ 'key' => 'svc_broadband-manage_link_loc',
+ 'section' => 'UI',
+ 'description' => 'Location for "Manage Device" link',
+ 'type' => 'select',
+ 'select_hash' => [
+ 'bottom' => 'Near Unprovision link',
+ 'right' => 'With export-related links',
+ ],
+ },
+
+
#more fine-grained, service def-level control could be useful eventually?
{
'key' => 'svc_broadband-allow_null_ip_addr',
{
'key' => 'cust_main-custom_link',
'section' => 'UI',
- 'description' => 'URL to use as source for the "Custom" tab in the View Customer page. The custnum will be appended.',
- 'type' => 'text',
+ 'description' => 'URL to use as source for the "Custom" tab in the View Customer page. The customer number will be appended, or you can insert "$custnum" to have it inserted elsewhere. "$agentnum" will be replaced with the agent number.',
+ 'type' => 'textarea',
},
{
{
'key' => 'svc_phone-did-summary',
'section' => 'invoicing',
- 'description' => 'Enable DID activity summary for past 30 days on invoices, showing # DIDs activated/deactivated/ported-in/ported-out and total minutes usage',
+ 'description' => 'Enable DID activity summary on invoices, showing # DIDs activated/deactivated/ported-in/ported-out and total minutes usage, covering period since last invoice.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'svc_acct-usage_seconds',
+ 'section' => 'invoicing',
+ 'description' => 'Enable calculation of RADIUS usage time for invoices. You must modify your template to display this information.',
'type' => 'checkbox',
},
'type' => 'checkbox',
},
+ {
+ 'key' => 'cust_bill-latex_lineitem_maxlength',
+ 'section' => 'invoicing',
+ 'description' => 'Truncate long line items to this number of characters on typeset invoices, to avoid losing things off the right margin. Defaults to 50. ',
+ 'type' => 'text',
+ },
+
{
'key' => 'cust_main-status_module',
'section' => 'UI',
'select_enum' => [ '', '7', 'EmulateIE7', '8', 'EmulateIE8' ],
},
+ {
+ 'key' => 'disable_payauto_default',
+ 'section' => 'UI',
+ 'description' => 'Disable the "Charge future payments to this (card|check) automatically" checkbox from defaulting to checked.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'payment-history-report',
+ 'section' => 'UI',
+ 'description' => 'Show a link to the raw database payment history report in the Reports menu. DO NOT ENABLE THIS for modern installations.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'svc_broadband-require-nw-coordinates',
+ 'section' => 'UI',
+ 'description' => 'On svc_broadband add/edit, require latitude and longitude in the North Western quadrant, e.g. for North American co-ordinates, etc.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'cust-email-high-visibility',
+ 'section' => 'UI',
+ 'description' => 'Move the invoicing e-mail address field to the top of the billing address section and highlight it.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'cust_main-require-bank-branch',
+ 'section' => 'UI',
+ 'description' => 'An alternate DCHK/CHEK format; require entry of bank branch number.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'cust-edit-alt-field-order',
+ 'section' => 'UI',
+ 'description' => 'An alternate ordering of fields for the New Customer and Edit Customer screens.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'available-locales',
+ 'section' => '',
+ 'description' => 'Limit available locales (employee preferences, per-customer locale selection, etc.) to a particular set.',
+ 'type' => 'select-sub',
+ 'multiple' => 1,
+ 'options_sub' => sub {
+ map { $_ => FS::Locales->description($_) }
+ grep { $_ ne 'en_US' }
+ FS::Locales->locales;
+ },
+ 'option_sub' => sub { FS::Locales->description(shift) },
+ },
+
+ {
+ 'key' => 'translate-auto-insert',
+ 'section' => '',
+ 'description' => 'Auto-insert untranslated strings for selected non-en_US locales with their default/en_US values. DO NOT TURN THIS ON.',
+ 'type' => 'select-sub',
+ 'multiple' => 1,
+ 'options_sub' => sub { map { $_ => '' }
+ grep { $_ ne 'en_US' } FS::Locales::locales;
+ },
+ 'option_sub' => sub { ''; },
+ },
+
{ key => "apacheroot", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
{ key => "apachemachine", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
{ key => "apachemachines", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },