X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2FConf.pm;h=473c7be136c847e6530e5e917fb1c405dfada2c9;hp=cbfde50038bd502f37bd827fc3fe41acae58a028;hb=5b73387992a96f7b80e40b5ecb2fedabd8a78d6b;hpb=da86d5a8af2f915a340a74f6c97772451a1e23ef diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index cbfde5003..473c7be13 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -8,6 +8,7 @@ use MIME::Base64; 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); @@ -46,16 +47,25 @@ but this may change in the future. =over 4 -=item new +=item new [ HASHREF ] Create a new configuration object. +HASHREF may contain options to set the configuration context. Currently +accepts C, and C 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); } @@ -107,14 +117,26 @@ sub _usecompat { 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 { @@ -267,10 +289,14 @@ sub set { 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; @@ -311,8 +337,8 @@ sub delete { 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; @@ -622,6 +648,13 @@ my %payment_gateway_options = ( }, { + 'key' => 'log_sent_mail', + 'section' => 'notification', + 'description' => 'Enable logging of template-generated email.', + 'type' => 'checkbox', + }, + + { 'key' => 'alert_expiration', 'section' => 'notification', 'description' => 'Enable alerts about billing method expiration (i.e. expiring credit cards).', @@ -655,6 +688,13 @@ my %payment_gateway_options = ( }, { + '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' => 'Add a credit card surcharge to invoices, as a % of the invoice total. WARNING: this is usually prohibited by merchant account / other agreements and/or law, but is currently lawful in AU and UK.', @@ -667,18 +707,32 @@ my %payment_gateway_options = ( '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', }, @@ -686,20 +740,21 @@ my %payment_gateway_options = ( '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', }, @@ -736,7 +791,14 @@ my %payment_gateway_options = ( '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', @@ -791,6 +853,14 @@ my %payment_gateway_options = ( }, { + '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' => 'Default two-letter country code (if not supplied, the default is `US\')', @@ -991,6 +1061,7 @@ my %payment_gateway_options = ( '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, }, { @@ -1021,6 +1092,7 @@ my %payment_gateway_options = ( '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, }, { @@ -1029,6 +1101,7 @@ my %payment_gateway_options = ( 'description' => 'Footer for HTML invoices. Defaults to the same data in invoice_latexfooter if not specified.', 'type' => 'textarea', 'per_agent' => 1, + 'per_locale' => 1, }, { @@ -1037,6 +1110,7 @@ my %payment_gateway_options = ( 'description' => 'Summary initial page for HTML invoices.', 'type' => 'textarea', 'per_agent' => 1, + 'per_locale' => 1, }, { @@ -1044,6 +1118,7 @@ my %payment_gateway_options = ( 'section' => 'invoicing', 'description' => 'Return address for HTML invoices. Defaults to the same data in invoice_latexreturnaddress if not specified.', 'type' => 'textarea', + 'per_locale' => 1, }, { @@ -1108,6 +1183,7 @@ and customer address. Include units.', 'description' => 'Notes section for LaTeX typeset PostScript invoices.', 'type' => 'textarea', 'per_agent' => 1, + 'per_locale' => 1, }, { @@ -1116,6 +1192,7 @@ and customer address. Include units.', 'description' => 'Footer for LaTeX typeset PostScript invoices.', 'type' => 'textarea', 'per_agent' => 1, + 'per_locale' => 1, }, { @@ -1124,6 +1201,7 @@ and customer address. Include units.', 'description' => 'Summary initial page for LaTeX typeset PostScript invoices.', 'type' => 'textarea', 'per_agent' => 1, + 'per_locale' => 1, }, { @@ -1132,6 +1210,7 @@ and customer address. Include units.', 'description' => 'Remittance coupon for LaTeX typeset PostScript invoices.', 'type' => 'textarea', 'per_agent' => 1, + 'per_locale' => 1, }, { @@ -1210,6 +1289,7 @@ and customer address. Include units.', 'description' => 'Optional small footer for multi-page LaTeX typeset PostScript invoices.', 'type' => 'textarea', 'per_agent' => 1, + 'per_locale' => 1, }, { @@ -1229,7 +1309,14 @@ and customer address. Include units.', { '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', }, @@ -1238,7 +1325,7 @@ and customer address. Include units.', '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' ], }, { @@ -1318,6 +1405,14 @@ and customer address. Include units.', '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', @@ -1771,9 +1866,14 @@ and customer address. Include units.', { '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) + }, }, { @@ -1799,22 +1899,17 @@ and customer address. Include units.', }, { + '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', }, { @@ -2055,6 +2150,14 @@ and customer address. Include units.', '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', @@ -2194,6 +2297,13 @@ and customer address. Include units.', }, { + 'key' => 'svc_broadband-radius', + 'section' => '', + 'description' => 'Enable RADIUS groups for broadband services.', + 'type' => 'checkbox', + }, + + { 'key' => 'svc_acct-alldomains', 'section' => '', 'description' => 'Allow accounts to select any domain in the database. Normally accounts can only select from the domain set in the service definition and those purchased by the customer.', @@ -2201,9 +2311,16 @@ and customer address. Include units.', }, { + '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', }, @@ -2356,7 +2473,38 @@ and customer address. Include units.', 'type' => 'select-part_svc', 'multiple' => 1, }, - + + { + 'key' => 'selfservice-svc_forward_svcpart', + 'section' => 'self-service', + 'description' => 'Service for self-service forward editing.', + 'type' => 'select-part_svc', + }, + + { + '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 and supress sending (emailing, printing, faxing) them. 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', @@ -2493,7 +2641,7 @@ and customer address. Include units.', { 'key' => 'ticket_system', - 'section' => '', + 'section' => 'ticketing', 'description' => 'Ticketing system integration. RT_Internal uses the built-in RT ticketing system (see the integrated ticketing installation instructions). RT_External accesses an external RT installation in a separate database (local or remote).', 'type' => 'select', #'select_enum' => [ '', qw(RT_Internal RT_Libs RT_External) ], @@ -2502,16 +2650,30 @@ and customer address. Include units.', { 'key' => 'network_monitoring_system', - 'section' => '', + 'section' => 'network_monitoring', 'description' => 'Networking monitoring system (NMS) integration. Torrus_Internal uses the built-in Torrus ticketing system (see the integrated networking monitoring system installation instructions).', 'type' => 'select', - #'select_enum' => [ '', qw(RT_Internal RT_Libs RT_External) ], 'select_enum' => [ '', qw(Torrus_Internal) ], }, { + 'key' => 'nms-auto_add-svc_ips', + 'section' => 'network_monitoring', + 'description' => 'Automatically add (and remove) IP addresses from these service tables to the network monitoring system.', + 'type' => 'selectmultiple', + 'select_enum' => [ 'svc_acct', 'svc_broadband', 'svc_dsl' ], + }, + + { + 'key' => 'nms-auto_add-community', + 'section' => 'network_monitoring', + 'description' => 'SNMP community string to use when automatically adding IP addresses from these services to the network monitoring system.', + 'type' => 'text', + }, + + { 'key' => 'ticket_system-default_queueid', - 'section' => '', + 'section' => 'ticketing', 'description' => 'Default queue used when creating new customer tickets.', 'type' => 'select-sub', 'options_sub' => sub { @@ -2537,13 +2699,13 @@ and customer address. Include units.', }, { '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', @@ -2571,49 +2733,63 @@ and customer address. Include units.', { '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, DBI:Pg:user=rt_user;password=rt_word;host=rt.example.com;dbname=rt', 'type' => 'text', @@ -2621,7 +2797,7 @@ and customer address. Include units.', { 'key' => 'ticket_system-rt_external_url', - 'section' => '', + 'section' => 'ticketing', 'description' => 'With external RT integration, the URL for the external RT installation, for example, https://rt.example.com/rt', 'type' => 'text', }, @@ -2643,6 +2819,14 @@ and customer address. Include units.', }, { + 'key' => 'company_phonenum', + 'section' => 'notification', + 'description' => 'Your company phone number', + 'type' => 'text', + 'per_agent' => 1, + }, + + { 'key' => 'echeck-void', 'section' => 'deprecated', 'description' => 'DEPRECATED, now controlled by ACLs. Used to enable local-only voiding of echeck payments in addition to refunds against the payment gateway', @@ -2786,9 +2970,22 @@ and customer address. Include units.', { '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 : ''; + }, }, { @@ -2823,7 +3020,7 @@ and customer address. Include units.', { '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', }, @@ -2849,6 +3046,13 @@ and customer address. Include units.', }, { + 'key' => 'svc_acct-no_edit_username', + 'section' => 'shell', + 'description' => 'Disallow username editing.', + 'type' => 'checkbox', + }, + + { 'key' => 'zone-underscore', 'section' => 'BIND', 'description' => 'Allow underscores in zone names. As underscores are illegal characters in zone names, this option is not recommended.', @@ -2863,6 +3067,13 @@ and customer address. Include units.', }, { + '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', 'description' => 'Enable the per-customer option for individual CDR spools.', @@ -2958,6 +3169,7 @@ and customer address. Include units.', '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, }, { @@ -3018,7 +3230,8 @@ and customer address. Include units.', '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' ] }, @@ -3079,6 +3292,21 @@ and customer address. Include units.', }, { + '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', 'description' => 'Number of years of payment history to show by default. Currently defaults to 2.', @@ -3157,6 +3385,13 @@ and customer address. Include units.', }, { + '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' => '', 'description' => 'A support key enables access to commercial services delivered over the network, such as the payroll module, access to the internal ticket system, priority support and optional backups.', @@ -3227,6 +3462,7 @@ and customer address. Include units.', 'type' => 'image', 'per_agent' => 1, #XXX just view/logo.cgi, which is for the global #old-style editor anyway...? + 'per_locale' => 1, }, { @@ -3235,6 +3471,7 @@ and customer address. Include units.', 'description' => 'Company logo for printed and PDF invoices, in EPS format.', 'type' => 'image', 'per_agent' => 1, #XXX as above, kinda + 'per_locale' => 1, }, { @@ -3406,9 +3643,9 @@ and customer address. Include units.', 'description' => 'Enables searching of various formatted values in cust_main.agent_custid', 'type' => 'select', 'select_hash' => [ - '' => 'Numeric only', - '\d{7}' => 'Numeric only, exactly 7 digits', - 'ww?d+' => 'Numeric with one or two letter prefix', + '' => 'Numeric only', + '\d{7}' => 'Numeric only, exactly 7 digits', + 'ww?d+' => 'Numeric with one or two letter prefix', ], }, @@ -3515,6 +3752,21 @@ and customer address. Include units.', }, { + 'key' => 'geocode_module', + 'section' => '', + 'description' => 'Module to geocode (retrieve a latitude and longitude for) addresses', + 'type' => 'select', + 'select_enum' => [ 'Geo::Coder::Googlev3' ], + }, + + { + 'key' => 'geocode-require_nw_coordinates', + 'section' => 'UI', + 'description' => 'Require latitude and longitude in the North Western quadrant, e.g. for North American co-ordinates, etc.', + 'type' => 'checkbox', + }, + + { 'key' => 'disable_acl_changes', 'section' => '', 'description' => 'Disable all ACL changes, for demos.', @@ -3567,6 +3819,14 @@ and customer address. Include units.', }, { + 'key' => 'cust_main-custnum-display_prefix', + 'section' => 'UI', + 'description' => 'Prefix the customer number with this number for display purposes (and zero fill to 8 digits).', + 'type' => 'text', + #and then probably agent-virt this to merge these instances + }, + + { 'key' => 'cust_main-default_areacode', 'section' => 'UI', 'description' => 'Default area code for customers.', @@ -3807,6 +4067,13 @@ and customer address. Include units.', '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', @@ -3842,11 +4109,18 @@ and customer address. Include units.', { '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', 'description' => 'Default password when exporting svc_phone records to RADIUS', @@ -3873,7 +4147,14 @@ and customer address. Include units.', 'description' => 'Maximum length of the phone service "Name" field (svc_phone.phone_name). Sometimes useful to limit this (to 15?) when exporting as Caller ID data.', 'type' => 'text', }, - + + { + 'key' => 'svc_phone-random_pin', + 'section' => 'telephony', + 'description' => 'Number of random digits to generate in the "PIN" field, if empty.', + 'type' => 'text', + }, + { 'key' => 'svc_phone-lnp', 'section' => 'telephony', @@ -3941,12 +4222,19 @@ and customer address. Include units.', { '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', 'description' => 'Show package auto-suspend dates. Use with caution for now; can slow down customer view for large insallations.', @@ -4038,6 +4326,31 @@ and customer address. Include units.', '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', + ], + }, + + { + 'key' => 'svc_broadband-manage_link-new_window', + 'section' => 'UI', + 'description' => 'Open the "Manage Device" link in a new window', + 'type' => 'checkbox', + }, + #more fine-grained, service def-level control could be useful eventually? { 'key' => 'svc_broadband-allow_null_ip_addr', @@ -4213,8 +4526,8 @@ and customer address. Include units.', { '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, and "$usernum" will be replaced with the employee number.', + 'type' => 'textarea', }, { @@ -4232,12 +4545,26 @@ and customer address. Include units.', }, { - 'key' => 'qual-alt-address-format', + 'key' => 'qual-alt_address_format', 'section' => 'UI', - 'description' => 'Enable the alternate address format (location type, number, and kind) on qualifications', + 'description' => 'Enable the alternate address format (location type, number, and kind) for qualifications.', 'type' => 'checkbox', }, - + + { + 'key' => 'prospect_main-alt_address_format', + 'section' => 'UI', + 'description' => 'Enable the alternate address format (location type, number, and kind) for prospects. Recommended if qual-alt_address_format is set and the main use of propects is for qualifications.', + 'type' => 'checkbox', + }, + + { + 'key' => 'prospect_main-location_required', + 'section' => 'UI', + 'description' => 'Require an address for prospects. Recommended if the main use of propects is for qualifications.', + 'type' => 'checkbox', + }, + { 'key' => 'note-classes', 'section' => 'UI', @@ -4274,7 +4601,14 @@ and customer address. Include units.', { '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', }, @@ -4313,6 +4647,13 @@ and customer address. Include units.', }, { + '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', 'description' => 'Which module to use for customer status display. The "Classic" module (the default) considers accounts with cancelled recurring packages but un-cancelled one-time charges Inactive. The "Recurring" module considers those customers Cancelled. Similarly for customers with suspended recurring packages but one-time charges.', #other differences? @@ -4335,6 +4676,114 @@ and customer address. Include units.', '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' => 'deprecated', + 'description' => 'Deprecated; see geocode-require_nw_coordinates instead', + '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' => 'cust_bill-enable_promised_date', + 'section' => 'UI', + 'description' => 'Enable display/editing of the "promised payment date" field on invoices.', + '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 unless translating the interface into a new language.', + 'type' => 'select', + 'multiple' => 1, + 'select_enum' => [ grep { $_ ne 'en_US' } FS::Locales::locales ], + }, + + { + 'key' => 'svc_acct-tower_sector', + 'section' => '', + 'description' => 'Track tower and sector for svc_acct (account) services.', + 'type' => 'checkbox', + }, + + { + 'key' => 'cdr-prerate', + 'section' => 'telephony', + 'description' => 'Experimental feature to rate CDRs immediately, rather than waiting until invoice generation time. Can reduce invoice generation time when processing lots of CDRs. Currently works with "VoIP/telco CDR rating (standard)" price plans using "Phone numbers (svc_phone.phonenum)" CDR service matching, without any included minutes.', + 'type' => 'checkbox', + }, + + { + 'key' => 'cdr-prerate-cdrtypenums', + 'section' => 'telephony', + 'description' => 'When using cdr-prerate to rate CDRs immediately, limit processing to these CDR types.', + 'type' => 'select-sub', + 'multiple' => 1, + 'options_sub' => sub { require FS::Record; + require FS::cdr_type; + map { $_->cdrtypenum => $_->cdrtypename } + FS::Record::qsearch( 'cdr_type', + {} #{ 'disabled' => '' } + ); + }, + 'option_sub' => sub { require FS::Record; + require FS::cdr_type; + my $cdr_type = FS::Record::qsearchs( + 'cdr_type', { 'cdrtypenum'=>shift } ); + $cdr_type ? $cdr_type->cdrtypename : ''; + }, + }, + + { key => "apacheroot", section => "deprecated", description => "DEPRECATED", type => "text" }, { key => "apachemachine", section => "deprecated", description => "DEPRECATED", type => "text" }, { key => "apachemachines", section => "deprecated", description => "DEPRECATED", type => "text" },