package FS::Conf;
use vars qw($base_dir @config_items @base_items @card_types $DEBUG);
+use strict;
+use vars qw( $base_dir @config_items @base_items @card_types @invoice_terms
+ $DEBUG
+ );
use Carp;
use IO::File;
use File::Basename;
'key' => $_,
'base_key' => $proto->key,
'section' => $proto->section,
- 'description' => 'Alternate ' . $proto->description . ' See the <a href="http://www.freeside.biz/mediawiki/index.php/Freeside:2.1:Documentation:Administration#Invoice_templates">billing documentation</a> for details.',
+ 'description' => 'Alternate ' . $proto->description . ' See the <a href="http://www.freeside.biz/mediawiki/index.php/Freeside:3:Documentation:Administration#Invoice_templates">billing documentation</a> for details.',
'type' => $proto->type,
};
} &$listmaker($base);
( @config_items, $self->_orbase_items(@_) );
}
+=item invoice_from_full [ AGENTNUM ]
+
+Returns values of invoice_from and invoice_from_name, appropriately combined
+based on their current values.
+
+=cut
+
+sub invoice_from_full {
+ my ($self, $agentnum) = @_;
+ return $self->config('invoice_from_name', $agentnum ) ?
+ $self->config('invoice_from_name', $agentnum ) . ' <' .
+ $self->config('invoice_from', $agentnum ) . '>' :
+ $self->config('invoice_from', $agentnum );
+}
+
=back
=head1 SUBROUTINES
invoice_latexsmallfooter
invoice_latexnotes
invoice_latexcoupon
+invoice_latexwatermark
invoice_html
invoice_htmlreturnaddress
invoice_htmlfooter
invoice_htmlnotes
+invoice_htmlwatermark
logo.png
logo.eps
);
+@invoice_terms = (
+ '',
+ 'Payable upon receipt',
+ 'Net 0', 'Net 3', 'Net 5', 'Net 7', 'Net 9', 'Net 10', 'Net 14',
+ 'Net 15', 'Net 18', 'Net 20', 'Net 21', 'Net 25', 'Net 30', 'Net 45',
+ 'Net 60', 'Net 90'
+);
+
my %msg_template_options = (
'type' => 'select-sub',
'options_sub' => sub {
},
);
+my %invoice_mode_options = (
+ 'type' => 'select-sub',
+ 'options_sub' => sub {
+ my @modes = qsearch({
+ 'table' => 'invoice_mode',
+ 'extra_sql' => ' WHERE '.
+ $FS::CurrentUser::CurrentUser->agentnums_sql(null => 1),
+ });
+ map { $_->modenum, $_->modename } @modes;
+ },
+ 'option_sub' => sub {
+ my $mode = FS::invoice_mode->by_key(shift);
+ $mode ? $mode->modename : '',
+ },
+ 'per_agent' => 1,
+);
+
my @cdr_formats = (
'' => '',
'default' => 'Default',
}
}
+my $validate_email = sub { $_[0] =~
+ /^[^@]+\@[[:alnum:]-]+(\.[[:alnum:]-]+)+$/
+ ? '' : 'Invalid email address';
+ };
+
#Billing (81 items)
#Invoicing (50 items)
#UI (69 items)
{
'key' => 'business-onlinepayment',
'section' => 'billing',
- 'description' => '<a href="http://search.cpan.org/search?mode=module&query=Business%3A%3AOnlinePayment">Business::OnlinePayment</a> support, at least three lines: processor, login, and password. An optional fourth line specifies the action or actions (multiple actions are separated with `,\': for example: `Authorization Only, Post Authorization\'). Optional additional lines are passed to Business::OnlinePayment as %processor_options.',
+ 'description' => '<a href="http://search.cpan.org/search?mode=module&query=Business%3A%3AOnlinePayment">Business::OnlinePayment</a> support, at least three lines: processor, login, and password. An optional fourth line specifies the action or actions (multiple actions are separated with `,\': for example: `Authorization Only, Post Authorization\'). Optional additional lines are passed to Business::OnlinePayment as %processor_options. For more detailed information and examples see the <a href="http://www.freeside.biz/mediawiki/index.php/Freeside:3:Documentation:Administration:Real-time_Processing">real-time credit card processing documentation</a>.',
'type' => 'textarea',
},
'select_enum' => [ '', qw( USD AUD CAD DKK EUR GBP ILS JPY NZD ) ],
},
+ {
+ 'key' => 'business-onlinepayment-verification',
+ 'section' => 'billing',
+ 'description' => 'Run a $1 authorization (followed by a void) to verify new credit card information.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'currency',
'section' => 'billing',
{
'key' => 'invoice_from',
'section' => 'required',
- 'description' => 'Return address on email invoices',
+ 'description' => 'Return address on email invoices (address only, see invoice_from_name)',
'type' => 'text',
'per_agent' => 1,
+ 'validate' => $validate_email,
},
+ {
+ 'key' => 'invoice_from_name',
+ 'section' => 'invoicing',
+ 'description' => 'Return name on email invoices (set address in invoice_from)',
+ 'type' => 'text',
+ 'per_agent' => 1,
+ 'validate' => sub { (($_[0] =~ /[^[:alnum:][:space:]]/) && ($_[0] !~ /^\".*\"$/))
+ ? 'Invalid name. Use quotation marks around names that contain punctuation.'
+ : '' }
+ },
+
+ {
+ 'key' => 'quotation_from',
+ 'section' => '',
+ 'description' => 'Return address on email quotations',
+ 'type' => 'text',
+ 'per_agent' => 1,
+ },
+
+
{
'key' => 'invoice_subject',
'section' => 'invoicing',
'per_locale' => 1,
},
+ {
+ 'key' => 'quotation_subject',
+ 'section' => '',
+ 'description' => 'Subject: header on email quotations. Defaults to "Quotation".', # The following substitutions are available: $name, $name_short, $invoice_number, and $invoice_date.',
+ 'type' => 'text',
+ #'per_agent' => 1,
+ 'per_locale' => 1,
+ },
+
{
'key' => 'invoice_usesummary',
'section' => 'invoicing',
{
'key' => 'invoice_template',
'section' => 'invoicing',
- '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 <a href="http://www.freeside.biz/mediawiki/index.php/Freeside:2.1:Documentation:Administration#Plaintext_invoice_templates">billing documentation</a> for details.',
+ '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 <a href="http://www.freeside.biz/mediawiki/index.php/Freeside:3:Documentation:Administration#Plaintext_invoice_templates">billing documentation</a> for details.',
'type' => 'textarea',
},
'per_locale' => 1,
},
+ {
+ 'key' => 'invoice_htmlwatermark',
+ 'section' => 'invoicing',
+ 'description' => 'Watermark for HTML invoices. Appears in a semitransparent positioned DIV overlaid on the main invoice container.',
+ 'type' => 'textarea',
+ 'per_agent' => 1,
+ 'per_locale' => 1,
+ },
+
{
'key' => 'invoice_latex',
'section' => 'invoicing',
{
'key' => 'invoice_latexextracouponspace',
'section' => 'invoicing',
- 'description' => 'Optional LaTeX invoice textheight space to reserve for a tear off coupon. Include units. Default is 3.6cm',
+ 'description' => 'Optional LaTeX invoice textheight space to reserve for a tear off coupon. Include units. Default is 2.7 inches.',
'type' => 'text',
'per_agent' => 1,
'validate' => sub { shift =~
{
'key' => 'invoice_latexcouponfootsep',
'section' => 'invoicing',
- 'description' => 'Optional LaTeX invoice separation between tear off coupon and footer. Include units.',
+ 'description' => 'Optional LaTeX invoice separation between bottom of coupon address and footer. Include units. Default is 0.2 inches.',
'type' => 'text',
'per_agent' => 1,
'validate' => sub { shift =~
{
'key' => 'invoice_latexcouponamountenclosedsep',
'section' => 'invoicing',
- 'description' => 'Optional LaTeX invoice separation between total due and amount enclosed line. Include units.',
+ 'description' => 'Optional LaTeX invoice separation between total due and amount enclosed line. Include units. Default is 2.25 em.',
'type' => 'text',
'per_agent' => 1,
'validate' => sub { shift =~
{
'key' => 'invoice_latexcoupontoaddresssep',
'section' => 'invoicing',
- 'description' => 'Optional LaTeX invoice separation between invoice data and the to address (usually invoice_latexreturnaddress). Include units.',
+ 'description' => 'Optional LaTeX invoice separation between invoice data and the address (usually invoice_latexreturnaddress). Include units. Default is 1 inch.',
'type' => 'text',
'per_agent' => 1,
'validate' => sub { shift =~
{
'key' => 'invoice_latexverticalreturnaddress',
- 'section' => 'invoicing',
- 'description' => 'Place the return address under the company logo rather than beside it.',
+ 'section' => 'deprecated',
+ 'description' => 'Deprecated. With old invoice_latex template, places the return address under the company logo rather than beside it.',
'type' => 'checkbox',
'per_agent' => 1,
},
'per_locale' => 1,
},
+ {
+ 'key' => 'invoice_latexwatermark',
+ 'section' => 'invoicing',
+ 'description' => 'Watermark for LaTeX invoices. See "texdoc background" for information on what this can contain. The content itself should be enclosed in braces, optionally followed by a comma and any formatting options.',
+ 'type' => 'textarea',
+ 'per_agent' => 1,
+ 'per_locale' => 1,
+ },
+
{
'key' => 'invoice_email_pdf',
'section' => 'invoicing',
- 'description' => 'Send PDF invoice as an attachment to emailed invoices. By default, includes the plain text invoice as the email body, unless invoice_email_pdf_note is set.',
+ 'description' => 'Send PDF invoice as an attachment to emailed invoices. By default, includes the HTML invoice as the email body, unless invoice_email_pdf_note is set.',
'type' => 'checkbox'
},
+ {
+ 'key' => 'quotation_email_pdf',
+ 'section' => '',
+ 'description' => 'Send PDF quotations as an attachment to emailed quotations. By default, includes the HTML quotation as the email body, unless quotation_email_pdf_note is set.',
+ 'type' => 'checkbox'
+ },
+
+ {
+ 'key' => 'invoice_email_pdf_msgnum',
+ 'section' => 'invoicing',
+ 'description' => 'Message template to send as the text and HTML part of PDF invoices. If not selected, a text and HTML version of the invoice will be sent.',
+ %msg_template_options,
+ },
+
{
'key' => 'invoice_email_pdf_note',
'section' => 'invoicing',
- 'description' => 'If defined, this text will replace the default plain text invoice as the body of emailed PDF invoices.',
+ 'description' => 'If defined, this text will replace the default HTML invoice as the body of emailed PDF invoices.',
+ 'type' => 'textarea'
+ },
+
+ {
+ 'key' => 'quotation_email_pdf_note',
+ 'section' => '',
+ 'description' => 'If defined, this text will replace the default HTML quotation as the body of emailed PDF quotations.',
'type' => 'textarea'
},
'description' => 'Optional default invoice term, used to calculate a due date printed on invoices.',
'type' => 'select',
'per_agent' => 1,
- 'select_enum' => [
- '', 'Payable upon receipt', 'Net 0', 'Net 3', 'Net 5', 'Net 9', 'Net 10', 'Net 14',
- 'Net 15', 'Net 18', 'Net 20', 'Net 21', 'Net 25', 'Net 30', 'Net 45',
- 'Net 60', 'Net 90'
- ], },
+ 'select_enum' => \@invoice_terms,
+ },
{
'key' => 'invoice_show_prior_due_date',
'agent_bool' => 1,
},
+ {
+ 'key' => 'payment_receipt_statement_mode',
+ 'section' => 'notification',
+ 'description' => 'Automatic payments will cause a post-payment statement to be sent to the customer. Select the invoice mode to use for this statement. If unspecified, it will use the "_statement" versions of invoice configuration settings, and have the notice name "Statement".',
+ %invoice_mode_options,
+ },
+
{
'key' => 'payment_receipt_msgnum',
'section' => 'notification',
- 'description' => 'Template to use for payment receipts.',
+ 'description' => 'Template to use for manual payment receipts.',
%msg_template_options,
},
'per_agent' => 1,
},
+ {
+ 'key' => 'refund_receipt_msgnum',
+ 'section' => 'notification',
+ 'description' => 'Template to use for manual refund receipts.',
+ %msg_template_options,
+ },
+
{
'key' => 'trigger_export_insert_on_payment',
'section' => 'billing',
},
{
- 'key' => 'unsuspendauto',
+ 'key' => 'unsuspend_balance',
'section' => 'billing',
- 'description' => 'Enables the automatic unsuspension of suspended packages when a customer\'s balance due changes from positive to zero or negative as the result of a payment or credit',
- 'type' => 'checkbox',
+ 'description' => 'Enables the automatic unsuspension of suspended packages when a customer\'s balance due is at or below the specified amount after a payment or credit',
+ 'type' => 'select',
+ 'select_enum' => [
+ '', 'Zero', 'Latest invoice charges', 'Charges not past due'
+ ],
},
{
},
{
- 'key' => 'safe-part_bill_event',
+ 'key' => 'google_maps_api_key',
'section' => 'UI',
- 'description' => 'Validates invoice event expressions against a preset list. Useful for webdemos, annoying to powerusers.',
- 'type' => 'checkbox',
+ 'description' => 'API key for google maps. This must be set for map and directions links to work. See <a href="https://developers.google.com/maps/documentation/javascript/get-api-key" target="_top">Getting a Google Maps API Key</a>',
+ 'type' => 'text',
+ },
+
+ {
+ 'key' => 'company_physical_address',
+ 'section' => 'addresses',
+ 'description' => 'Your physical company address, for use in supplying google map directions, defaults to company_address',
+ 'type' => 'textarea',
+ 'per_agent' => 1,
},
{
'svc_acct' => 'Account (svc_acct)',
'svc_phone' => 'Phone number (svc_phone)',
'svc_pbx' => 'PBX (svc_pbx)',
+ 'none' => 'None - package only',
],
},
'section' => 'billing',
'description' => 'Available payment types.',
'type' => 'selectmultiple',
- 'select_enum' => [ qw(CARD DCRD CHEK DCHK LECB BILL CASH WEST MCRD PPAL COMP) ],
+ 'select_enum' => [ qw(CARD DCRD CHEK DCHK LECB BILL CASH WEST MCRD MCHK PPAL COMP) ],
},
{
'type' => 'checkbox',
},
+ {
+ 'key' => 'radius-canopy',
+ 'section' => '',
+ 'description' => 'Enable RADIUS attributes for Cambium (formerly Motorola) Canopy (Motorola-Canopy-Gateway).',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'svc_broadband-radius',
'section' => '',
'type' => 'text',
},
+ {
+ 'key' => 'dump-email_to',
+ 'section' => '',
+ 'description' => "Optional email address to send success/failure message for database dumps.",
+ 'type' => 'text',
+ 'validate' => $validate_email,
+ },
+
{
'key' => 'users-allow_comp',
'section' => 'deprecated',
'type' => 'checkbox',
},
+ {
+ 'key' => 'manual_process-single_invoice_amount',
+ 'section' => 'billing',
+ 'description' => 'When entering manual credit card and ACH payments, amount will not autofill if the customer has more than one open invoice',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'manual_process-pkgpart',
'section' => 'billing',
},
'option_sub' => sub { require FS::Record;
require FS::agent_type;
- my $agent = FS::Record::qsearchs(
+ my $agent_type = FS::Record::qsearchs(
'agent_type', { 'typenum'=>shift }
);
$agent_type ? $agent_type->atype : '';
{
'key' => 'ticket_system',
'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).',
+ '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:3: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) ],
'select_enum' => [ '', qw(RT_Internal RT_External) ],
}
},
},
+
{
'key' => 'ticket_system-force_default_queueid',
'section' => 'ticketing',
'description' => 'Disallow queue selection when creating new tickets from customer view.',
'type' => 'checkbox',
},
+
{
'key' => 'ticket_system-selfservice_queueid',
'section' => 'ticketing',
'type' => 'checkbox',
},
+ {
+ 'key' => 'ticket_system-appointment-queueid',
+ 'section' => 'ticketing',
+ 'description' => 'Ticketing queue to use for appointments.',
+ #false laziness w/above
+ 'type' => 'select-sub',
+ 'options_sub' => sub {
+ my $conf = new FS::Conf;
+ if ( $conf->config('ticket_system') ) {
+ eval "use FS::TicketSystem;";
+ die $@ if $@;
+ FS::TicketSystem->queues();
+ } else {
+ ();
+ }
+ },
+ 'option_sub' => sub {
+ my $conf = new FS::Conf;
+ if ( $conf->config('ticket_system') ) {
+ eval "use FS::TicketSystem;";
+ die $@ if $@;
+ FS::TicketSystem->queue(shift);
+ } else {
+ '';
+ }
+ },
+ },
+
+ {
+ 'key' => 'ticket_system-appointment-custom_field',
+ 'section' => 'ticketing',
+ 'description' => 'Ticketing custom field to use as an appointment classification.',
+ 'type' => 'text',
+ },
+
{
'key' => 'ticket_system-escalation',
'section' => 'ticketing',
{
'key' => 'cust_main-require_address2',
'section' => 'UI',
- 'description' => 'Second address field is required (on service address only, if billing and service addresses differ). Also enables "Unit" labeling of address2 on customer view and edit pages. Useful for multi-tenant applications. See also: address2-search',
+ 'description' => 'Second address field is required. Also enables "Unit" labeling of address2 on customer view and edit pages. Useful for multi-tenant applications. See also: address2-search', # service address only part not working in the modern world, see #41184 (on service address only, if billing and service addresses differ)
'type' => 'checkbox',
},
{
'key' => 'voip-cdr_email',
'section' => 'telephony',
- 'description' => 'Include the call details on emailed invoices (and HTML invoices viewed in the backend), even if the customer is configured for not printing them on the invoices.',
+ 'description' => 'Include the call details inline on emailed invoices (and HTML invoices viewed in the backend), even if the customer is configured for not printing them on the invoices. Useful for including these details in electronic delivery but omitting them when printing.',
'type' => 'checkbox',
},
{
'key' => 'voip-cust_email_csv_cdr',
- 'section' => 'telephony',
- 'description' => 'Enable the per-customer option for including CDR information as a CSV attachment on emailed invoices.',
+ 'section' => 'deprecated',
+ 'description' => 'Deprecated, see voip-cdr_email_attach instead. Used to enable the per-customer option for including CDR information as a CSV attachment on emailed invoices.',
'type' => 'checkbox',
},
+ {
+ 'key' => 'voip-cdr_email_attach',
+ 'section' => 'telephony',
+ 'description' => 'Enable the per-customer option for including CDR information as an attachment on emailed invoices.',
+ 'type' => 'select',
+ 'select_hash' => [ '' => 'Disabled',
+ 'csv' => 'Text (CSV) attachment',
+ 'zip' => 'Zip attachment',
+ ],
+ },
+
{
'key' => 'cgp_rule-domain_templates',
'section' => '',
'type' => 'checkbox',
},
+ {
+ 'key' => 'invoice-all_pkg_addresses',
+ 'section' => 'invoicing',
+ 'description' => 'Show all package addresses on invoices, even the default.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'invoice-unitprice',
'section' => 'invoicing',
{
'key' => 'batchconfig-RBC',
'section' => 'billing',
- 'description' => 'Configuration for Royal Bank of Canada PDS batching, four lines: 1. Client number, 2. Short name, 3. Long name, 4. Transaction code.',
+ 'description' => 'Configuration for Royal Bank of Canada PDS batching, five lines: 1. Client number, 2. Short name, 3. Long name, 4. Transaction code 5. (optional) set to TEST to turn on test mode.',
+ 'type' => 'textarea',
+ },
+
+ {
+ 'key' => 'batchconfig-RBC-login',
+ 'section' => 'billing',
+ 'description' => 'FTPS login for uploading Royal Bank of Canada batches. Two lines: 1. username, 2. password. If not supplied, batches can still be created but not automatically uploaded.',
'type' => 'textarea',
},
'type' => 'text',
},
+ {
+ 'key' => 'batchconfig-nacha-origin_name',
+ 'section' => 'billing',
+ 'description' => 'Configuration for NACHA batching, Origin name (defaults to company name, but sometimes bank name is needed instead.)',
+ 'type' => 'text',
+ },
+
{
'key' => 'batch-manual_approval',
'section' => 'billing',
{
'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.',
+ 'description' => 'A support key enables access to commercial services delivered over the network, such as address normalization and invoice printing.',
+ 'type' => 'text',
+ },
+
+ {
+ 'key' => 'freesideinc-webservice-svcpart',
+ 'section' => '',
+ 'description' => 'Do not set this.',
'type' => 'text',
},
},
{
- 'key' => 'password-generated-allcaps',
+ 'key' => 'password-generated-characters',
'section' => 'password',
- 'description' => 'Causes passwords automatically generated to consist entirely of capital letters',
+ 'description' => 'Set of characters to use when generating random passwords. This must contain at least one lowercase letter, uppercase letter, digit, and punctuation mark.',
+ 'type' => 'textarea',
+ },
+
+ {
+ 'key' => 'password-no_reuse',
+ 'section' => 'password',
+ 'description' => 'Minimum number of password changes before a password can be reused. By default, passwords can be reused without restriction.',
+ 'type' => 'text',
+ },
+
+ {
+ 'key' => 'password-insecure',
+ 'section' => 'password',
+ 'description' => 'Disable all password security checks and allow entry of insecure passwords. NOT RECOMMENDED.',
'type' => 'checkbox',
+ 'per_agent' => 1,
},
{
'per_agent' => 1,
},
+ {
+ 'key' => 'cust_main-require_classnum',
+ 'section' => '',
+ 'description' => 'Customer class is required: require customer class for all customer records.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'cust_main-check_unique',
'section' => '',
reason_type_options('R'),
},
+ # was only used to negate invoices during signup when card was declined, now we just void
{
'key' => 'signup_credit_type',
- 'section' => 'billing', #self-service?
+ 'section' => 'deprecated', #self-service?
'description' => 'The group to use for new, automatically generated credit reasons resulting from signup and self-service declines.',
reason_type_options('R'),
},
{
'key' => 'disable_previous_balance',
'section' => 'invoicing',
- 'description' => 'Disable inclusion of previous balance, payment, and credit lines on invoices.',
+ 'description' => 'Show new charges only; do not list previous invoices, payments, or credits on the invoice.',
'type' => 'checkbox',
'per_agent' => 1,
},
{
'key' => 'previous_balance-exclude_from_total',
'section' => 'invoicing',
- 'description' => 'Do not include previous balance in the \'Total\' line. Only meaningful when invoice_sections is false. Optionally provide text to override the Total New Charges description',
- 'type' => [ qw(checkbox text) ],
+ 'description' => 'Show separate totals for previous invoice balance and new charges. Only meaningful when invoice_sections is false.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'previous_balance-text',
+ 'section' => 'invoicing',
+ 'description' => 'Text for the label of the total previous balance, when it is shown separately. Defaults to "Previous Balance".',
+ 'type' => 'text',
+ },
+
+ {
+ 'key' => 'previous_balance-text-total_new_charges',
+ 'section' => 'invoicing',
+ 'description' => 'Text for the label of the total of new charges, when it is shown separately. If invoice_show_prior_due_date is enabled, the due date of current charges will be appended. Defaults to "Total New Charges".',
+ 'type' => 'text',
},
{
'type' => 'select',
'select_hash' => [ '' => '',
'usps' => 'U.S. Postal Service',
+ 'uscensus' => 'U.S. Census Bureau',
'ezlocate' => 'EZLocate',
- 'tomtom' => 'TomTom',
'melissa' => 'Melissa WebSmart',
+ 'freeside' => 'Freeside web service (support contract required)',
],
},
'type' => 'text',
},
- {
- 'key' => 'tomtom-userid',
- 'section' => 'UI',
- 'description' => 'TomTom geocoding service API key. See <a href="http://www.tomtom.com/">the TomTom website</a> to obtain a key. This is recommended for addresses in the United States only.',
- 'type' => 'text',
- },
-
{
'key' => 'ezlocate-userid',
'section' => 'UI',
'type' => 'checkbox',
},
+ {
+ 'key' => 'cust_main-no_city_in_address',
+ 'section' => 'UI',
+ 'description' => 'Turn off City for billing & shipping addresses',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'census_year',
'section' => 'UI',
{
'key' => 'cust_main-default_agent_custid',
'section' => 'UI',
- 'description' => 'Display the agent_custid field when available instead of the custnum field.',
+ 'description' => 'Display the agent_custid field when available instead of the custnum field. Restart Apache after changing.',
'type' => 'checkbox',
},
'per_agent' => 1,
},
- {
- 'key' => 'cust_main-custnum-display_special',
- 'section' => 'UI',
- 'description' => 'Use this customer number prefix format',
- 'type' => 'select',
- 'select_hash' => [ '' => '',
- 'CoStAg' => 'CoStAg (country, state, agent name or display_prefix)',
- 'CoStCl' => 'CoStCl (country, state, class name)' ],
- },
-
{
'key' => 'cust_main-custnum-display_length',
'section' => 'UI',
- 'description' => 'Zero fill the customer number to this many digits for display purposes.',
+ 'description' => 'Zero fill the customer number to this many digits for display purposes. Restart Apache after changing.',
'type' => 'text',
},
'type' => 'checkbox',
},
+ {
+ 'key' => 'part_pkg-delay_cancel-days',
+ 'section' => '',
+ 'description' => 'Number of days to suspend when using automatic suspension period before cancel (default is 1)',
+ 'type' => 'text',
+ 'validate' => sub { (($_[0] =~ /^\d*$/) && (($_[0] eq '') || $_[0]))
+ ? ''
+ : 'Must specify an integer number of days' }
+ },
+
{
'key' => 'mcp_svcpart',
'section' => '',
'type' => 'checkbox',
},
+ {
+ 'key' => 'cdr-userfield_dnis_rewrite',
+ 'section' => 'telephony',
+ 'description' => 'If the CDR userfield contains "DNIS=" followed by a sequence of digits, use that as the destination number for the call.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'cdr-intl_to_domestic_rewrite',
+ 'section' => 'telephony',
+ 'description' => 'Strip the "011" international prefix from CDR destination numbers if the rest of the number is 7 digits or shorter, and so probably does not contain a country code.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'cdr-gsm_tap3-sender',
'section' => 'telephony',
{
'key' => 'tax-cust_exempt-groups-require_individual_nums',
'section' => 'deprecated',
- 'description' => 'Deprecated: see tax-cust_exempt-groups-number_requirement',
+ 'description' => 'Deprecated: see tax-cust_exempt-groups-num_req',
'type' => 'checkbox',
},
],
},
+ {
+ 'key' => 'tax-round_per_line_item',
+ 'section' => 'billing',
+ 'description' => 'Calculate tax and round to the nearest cent for each line item, rather than for the whole invoice.',
+ 'type' => 'checkbox',
+ },
+
{
'key' => 'cust_main-default_view',
'section' => 'UI',
my @part_export =
map { qsearch( 'part_export', {exporttype => $_ } ) }
keys %{FS::part_export::export_info('cust_main')};
- map { $_->exportnum => $_->exporttype.' to '.$_->machine } @part_export;
+ map { $_->exportnum => $_->exportname } @part_export;
},
'option_sub' => sub {
require FS::Record;
'part_export', { 'exportnum' => shift }
);
$part_export
- ? $part_export->exporttype.' to '.$part_export->machine
+ ? $part_export->exportname
: '';
},
},
{
'key' => 'cust_location-exports',
'section' => '',
- 'description' => 'Export(s) to call on cust_location insert, modification and deletion.',
+ 'description' => 'Export(s) to call on cust_location insert or modification',
'type' => 'select-sub',
'multiple' => 1,
'options_sub' => sub {
my @part_export =
map { qsearch( 'part_export', {exporttype => $_ } ) }
keys %{FS::part_export::export_info('cust_location')};
- map { $_->exportnum => $_->exporttype.' to '.$_->machine } @part_export;
+ map { $_->exportnum => $_->exportname } @part_export;
},
'option_sub' => sub {
require FS::Record;
'part_export', { 'exportnum' => shift }
);
$part_export
- ? $part_export->exporttype.' to '.$part_export->machine
+ ? $part_export->exportname
: '';
},
},
{
'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. ',
+ 'section' => 'deprecated',
+ 'description' => 'With old invoice_latex template, truncate long line items to this number of characters on typeset invoices, to avoid losing things off the right margin. Defaults to 50. (With current invoice_latex template, this is handled internally in the template itself instead.)',
'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?
+ '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. Restart Apache after changing.', #other differences?
'type' => 'select',
'select_enum' => [ 'Classic', 'Recurring' ],
},
'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.',
+ '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. Restart Apache after changing.',
'type' => 'select',
'multiple' => 1,
'select_enum' => [ grep { $_ ne 'en_US' } FS::Locales::locales ],
'rate_low' => 'Lowest rate first',
],
},
+
+ {
+ 'key' => 'cdr-lrn_lookup',
+ 'section' => 'telephony',
+ 'description' => 'Look up LRNs of destination numbers for exact matching to the terminating carrier. This feature requires a Freeside support contract for paid access to the central NPAC database; see <a href ="#support-key">support-key</a>.',
+ 'type' => 'checkbox',
+ },
{
'key' => 'brand-agent',
'type' => 'checkbox',
},
+ {
+ 'key' => 'selfservice-enable_payment_without_balance',
+ 'section' => 'self-service',
+ 'description' => 'Allow selfservice customers to make payments even if balance is zero or below (resulting in an unapplied payment and negative balance.)',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'selfservice-announcement',
+ 'section' => 'self-service',
+ 'description' => 'HTML announcement to display to all authenticated users on account overview page',
+ 'type' => 'textarea',
+ },
+
{
'key' => 'logout-timeout',
'section' => 'UI',
'type' => 'checkbox',
},
+ {
+ 'key' => 'cust_main-default_commercial',
+ 'section' => 'UI',
+ 'description' => 'Default for new customers is commercial rather than residential.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'default_appointment_length',
+ 'section' => 'UI',
+ 'description' => 'Default appointment length, in minutes (30 minute granularity).',
+ 'type' => 'text',
+ },
+
{ 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" },
{ key => "vonage-password", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
{ key => "vonage-fromnumber", section => "deprecated", description => "<b>DEPRECATED</b>", type => "text" },
+ # for internal use only; test databases should declare this option and
+ # everyone else should pretend it doesn't exist
+ #{
+ # 'key' => 'no_random_ids',
+ # 'section' => '',
+ # 'description' => 'Replace random identifiers in UI code with a static string, for repeatable testing. Don\'t use in production.',
+ # 'type' => 'checkbox',
+ #},
+
);
1;