X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FConf.pm;h=2e52db7be61be090a13b26406482947b416d1404;hb=828a9903440fddc74b1014ff7b348d09b383d57b;hp=5f50ecad0ff351c895d8c0ece03546754567a18e;hpb=297ddd01fb112cf45a6dab819ec56803c953bda5;p=freeside.git diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 5f50ecad0..2e52db7be 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -1,6 +1,7 @@ package FS::Conf; use vars qw($base_dir @config_items @base_items @card_types $DEBUG); +use strict; use Carp; use IO::File; use File::Basename; @@ -592,6 +593,21 @@ sub config_items { ( @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 @@ -663,10 +679,12 @@ invoice_latexfooter invoice_latexsmallfooter invoice_latexnotes invoice_latexcoupon +invoice_latexwatermark invoice_html invoice_htmlreturnaddress invoice_htmlfooter invoice_htmlnotes +invoice_htmlwatermark logo.png logo.eps ); @@ -717,6 +735,23 @@ my %batch_gateway_options = ( }, ); +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', @@ -744,6 +779,11 @@ sub reason_type_options { } } +my $validate_email = sub { $_[0] =~ + /^[^@]+\@[[:alnum:]-]+(\.[[:alnum:]-]+)+$/ + ? '' : 'Invalid email address'; + }; + #Billing (81 items) #Invoicing (50 items) #UI (69 items) @@ -957,7 +997,7 @@ sub reason_type_options { { 'key' => 'business-onlinepayment', 'section' => 'billing', - 'description' => 'Business::OnlinePayment 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' => 'Business::OnlinePayment 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 real-time credit card processing documentation.', 'type' => 'textarea', }, @@ -1046,6 +1086,7 @@ sub reason_type_options { '%m/%d/%Y' => 'MM/DD/YYYY', '%d/%m/%Y' => 'DD/MM/YYYY', '%Y/%m/%d' => 'YYYY/MM/DD', + '%e %b %Y' => 'DD Mon YYYY', ], 'per_locale' => 1, }, @@ -1113,7 +1154,7 @@ sub reason_type_options { { 'key' => 'unapplycredits', 'section' => 'deprecated', - 'description' => 'DEPRECATED, now controlled by ACLs. Used to nable "unapplication" of unclosed credits.', + 'description' => 'DEPRECATED, now controlled by ACLs. Used to enable "unapplication" of unclosed credits.', 'type' => 'checkbox', }, @@ -1232,11 +1273,32 @@ sub reason_type_options { { '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', @@ -1247,6 +1309,15 @@ sub reason_type_options { }, { + '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', 'description' => 'Indicates that html and latex invoices should be in summary style and make use of invoice_latexsummary.', @@ -1312,6 +1383,15 @@ sub reason_type_options { }, { + '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', 'description' => 'Optional LaTeX template for typeset PostScript invoices. See the billing documentation for details.', @@ -1499,16 +1579,46 @@ and customer address. Include units.', }, { + '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' }, @@ -1526,11 +1636,19 @@ and customer address. Include units.', 'type' => 'checkbox', }, + { + 'key' => 'invoice_print_pdf-duplex', + 'section' => 'invoicing', + 'description' => 'Insert blank pages so that spooled invoices are each an even number of pages. Use this for double-sided printing.', + 'type' => 'checkbox', + }, + { 'key' => 'invoice_default_terms', 'section' => 'invoicing', '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', @@ -1560,11 +1678,19 @@ and customer address. Include units.', }, { - 'key' => 'invoice_sections_by_location', + 'key' => 'invoice_sections_method', 'section' => 'invoicing', - 'description' => 'Divide invoice into sections according to service location. Currently, this overrides sectioning by package category.', - 'type' => 'checkbox', - 'per_agent' => 1, + 'description' => 'How to group line items on multi-section invoices.', + 'type' => 'select', + 'select_enum' => [ qw(category location) ], + }, + + { + 'key' => 'summary_subtotals_method', + 'section' => 'invoicing', + 'description' => 'How to group line items when calculating summary subtotals. By default, it will be the same method used for grouping invoice sections.', + 'type' => 'select', + 'select_enum' => [ qw(category location) ], }, #quotations seem broken-ish with sections ATM? @@ -1576,6 +1702,13 @@ and customer address. Include units.', # 'per_agent' => 1, #}, + { + 'key' => 'usage_class_summary', + 'section' => 'invoicing', + 'description' => 'Summarize total usage by usage class in a separate section.', + 'type' => 'checkbox', + }, + { 'key' => 'usage_class_as_a_section', 'section' => 'invoicing', @@ -1628,9 +1761,16 @@ and customer address. Include units.', }, { + '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, }, @@ -1691,6 +1831,14 @@ and customer address. Include units.', }, { + 'key' => 'papersize', + 'section' => 'billing', + 'description' => 'Invoice paper size. Default is "letter" (U.S. standard). The LaTeX template must be configured to match this size.', + 'type' => 'select', + 'select_enum' => [ qw(letter a4) ], + }, + + { 'key' => 'money_char', 'section' => '', 'description' => 'Currency symbol - defaults to `$\'', @@ -2251,6 +2399,7 @@ and customer address. Include units.', 'svc_acct' => 'Account (svc_acct)', 'svc_phone' => 'Phone number (svc_phone)', 'svc_pbx' => 'PBX (svc_pbx)', + 'none' => 'None - package only', ], }, @@ -2322,6 +2471,7 @@ and customer address. Include units.', 'key' => 'selfservice-timeout', 'section' => 'self-service', 'description' => 'Timeout for the self-service login cookie, in seconds. Defaults to 1 hour.', + 'type' => 'text', }, { @@ -2542,7 +2692,7 @@ and customer address. Include units.', '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) ], }, { @@ -2634,6 +2784,14 @@ and customer address. Include units.', }, { + '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', 'description' => 'DEPRECATED, enable the Complimentary customer access right instead. Was: Usernames (Freeside users, created with freeside-adduser) which can create complimentary customers, one per line. If no usernames are entered, all users can create complimentary accounts.', @@ -2674,9 +2832,30 @@ and customer address. Include units.', }, { + 'key' => 'backoffice-require_cvv', + 'section' => 'billing', + 'description' => 'Require CVV for manual credit card entry.', + 'type' => 'checkbox', + }, + + { + 'key' => 'selfservice-onfile_require_cvv', + 'section' => 'self-service', + 'description' => 'Require CVV for on-file credit card during self-service payments.', + 'type' => 'checkbox', + }, + + { 'key' => 'selfservice-require_cvv', 'section' => 'self-service', - 'description' => 'Require CVV for credit card self-service payments.', + 'description' => 'Require CVV for credit card self-service payments, except for cards on-file.', + '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', }, @@ -2707,6 +2886,22 @@ and customer address. Include units.', }, { + 'key' => 'selfservice_immutable-package', + 'section' => 'self-service', + 'description' => 'Disable package changes in self-service interface.', + 'type' => 'checkbox', + 'per_agent' => 1, + }, + + { + 'key' => 'selfservice_hide-usage', + 'section' => 'self-service', + 'description' => 'Hide usage data in self-service interface.', + 'type' => 'checkbox', + 'per_agent' => 1, + }, + + { 'key' => 'selfservice_process-pkgpart', 'section' => 'billing', 'description' => 'Package to add to each manual credit card and ACH payment entered by the customer themselves in the self-service interface. Enabling this option may be in violation of your merchant agreement(s), so please check it(/them) carefully before enabling this option.', @@ -2868,6 +3063,13 @@ and customer address. Include units.', }, { + 'key' => 'selfservice-password_change_oldpass', + 'section' => 'self-service', + 'description' => 'Require old password to be entered again for password changes (in addition to being logged in), at the API level.', + 'type' => 'checkbox', + }, + + { '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.', @@ -2907,7 +3109,7 @@ and customer address. Include units.', }, '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 : ''; @@ -3415,7 +3617,8 @@ and customer address. Include units.', 'description' => 'Optional "site ID" to show in the location label', 'type' => 'select', 'select_hash' => [ '' => '', - 'CoStAg' => 'CoStAgXXXXX (country, state, agent name, locationnum)', + 'CoStAg' => 'CoStAgXXXXX (country, state, agent name, locationnum)', + '_location' => 'Manually defined per location', ], }, @@ -3441,17 +3644,24 @@ and customer address. Include units.', }, { - 'key' => 'cust_pkg-show_fcc_voice_grade_equivalent', + 'key' => 'cust_pkg-large_pkg_size', 'section' => 'UI', - 'description' => "Show fields on package definitions for FCC Form 477 classification", + 'description' => "In customer view, summarize packages with more than this many services. Set to zero to never summarize packages.", + 'type' => 'text', + }, + + { + 'key' => 'cust_pkg-hide_discontinued-part_svc', + 'section' => 'UI', + 'description' => "In customer view, hide provisioned services which are no longer available in the package definition. Not normally used except for very specific situations as it hides still-provisioned services.", 'type' => 'checkbox', }, { - 'key' => 'cust_pkg-large_pkg_size', + 'key' => 'part_pkg-show_fcc_options', 'section' => 'UI', - 'description' => "In customer view, summarize packages with more than this many services. Set to zero to never summarize packages.", - 'type' => 'text', + 'description' => "Show fields on package definitions for FCC Form 477 classification", + 'type' => 'checkbox', }, { @@ -3644,7 +3854,7 @@ and customer address. Include units.', 'type' => 'select', 'select_enum' => [ 'NACHA', 'csv-td_canada_trust-merchant_pc_batch', 'csv-chase_canada-E-xactBatch', 'BoM', 'PAP', - 'paymentech', 'ach-spiritone', 'RBC' + 'paymentech', 'ach-spiritone', 'RBC', 'CIBC', ] }, @@ -3706,7 +3916,7 @@ and customer address. Include units.', 'type' => 'select', 'select_enum' => [ 'NACHA', 'csv-td_canada_trust-merchant_pc_batch', 'BoM', 'PAP', 'paymentech', 'ach-spiritone', 'RBC', - 'td_eft1464', 'eft_canada' + 'td_eft1464', 'eft_canada', 'CIBC' ] }, @@ -3724,6 +3934,13 @@ and customer address. Include units.', 'type' => 'textarea', }, +{ + 'key' => 'batchconfig-CIBC', + 'section' => 'billing', + 'description' => 'Configuration for Canadian Imperial Bank of Commerce, six lines: 1. Origin ID, 2. Datacenter, 3. Typecode, 4. Short name, 5. Bank, 6. Bank account', + 'type' => 'textarea', + }, + { 'key' => 'batchconfig-PAP', 'section' => 'billing', @@ -3748,7 +3965,14 @@ and customer address. Include units.', { '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', }, @@ -3762,7 +3986,7 @@ 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. If you are using separate per-agent batches (batch-spoolagent), you must set this option separately for each agent, as the global setting will be ignored.', + 'description' => 'Configuration for EFT Canada batching, five lines: 1. SFTP username, 2. SFTP password, 3. Business transaction code, 4. Personal transaction code, 5. Number of days to delay process date. If you are using separate per-agent batches (batch-spoolagent), you must set this option separately for each agent, as the global setting will be ignored.', 'type' => 'textarea', 'per_agent' => 1, }, @@ -3789,6 +4013,13 @@ and customer address. Include units.', }, { + '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', 'description' => 'Allow manual batch closure, which will approve all payments that do not yet have a status. This is not advised unless needed for specific payment processors that provide a report of rejected rather than approved payments.', @@ -3881,6 +4112,13 @@ and customer address. Include units.', }, { + 'key' => 'cust_main-enable_order_package', + 'section' => 'UI', + 'description' => 'Display order new package on the basic tab', + 'type' => 'checkbox', + }, + + { 'key' => 'cust_main-edit_calling_list_exempt', 'section' => 'UI', 'description' => 'Display the "calling_list_exempt" checkbox on customer edit.', @@ -4000,13 +4238,6 @@ and customer address. Include units.', }, { - 'key' => 'disable_setup_suspended_pkgs', - 'section' => 'billing', - 'description' => 'Disables charging of setup fees for suspended packages.', - 'type' => 'checkbox', - }, - - { 'key' => 'password-generated-allcaps', 'section' => 'password', 'description' => 'Causes passwords automatically generated to consist entirely of capital letters', @@ -4191,8 +4422,22 @@ and customer address. Include units.', { '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', }, { @@ -4231,6 +4476,16 @@ and customer address. Include units.', }, { + 'key' => 'previous_invoice_history', + 'section' => 'invoicing', + 'description' => 'Show a month-by-month history of the customer\'s '. + 'billing amounts. This requires template '. + 'modification and is currently not supported on the '. + 'stock template.', + 'type' => 'checkbox', + }, + + { 'key' => 'balance_due_below_line', 'section' => 'invoicing', 'description' => 'Place the balance due message below a line. Only meaningful when when invoice_sections is false.', @@ -4251,6 +4506,7 @@ and customer address. Include units.', 'type' => 'select', 'select_hash' => [ '' => '', 'usps' => 'U.S. Postal Service', + 'uscensus' => 'U.S. Census Bureau', 'ezlocate' => 'EZLocate', 'tomtom' => 'TomTom', 'melissa' => 'Melissa WebSmart', @@ -4321,6 +4577,13 @@ and customer address. Include units.', }, { + 'key' => 'cust_main-no_city_in_address', + 'section' => 'UI', + 'description' => 'Turn off City for billing & shipping addresses', + 'type' => 'checkbox', + }, + + { 'key' => 'census_year', 'section' => 'UI', 'description' => 'The year to use in census tract lookups. NOTE: you need to select 2012 or 2013 for Year 2010 Census tract codes. A selection of 2011 provides Year 2000 Census tract codes. Use the freeside-censustract-update tool if exisitng customers need to be changed.', @@ -4469,6 +4732,16 @@ and customer address. Include units.', }, { + 'key' => 'part_pkg-delay_cancel-days', + 'section' => '', + 'description' => 'Expire packages in this many days when using delay_cancel (default is 1)', + 'type' => 'text', + 'validate' => sub { (($_[0] =~ /^\d*$/) && (($_[0] eq '') || $_[0])) + ? 'Must specify an integer number of days' + : '' } + }, + + { 'key' => 'mcp_svcpart', 'section' => '', 'description' => 'Master Control Program svcpart. Leave this blank.', @@ -4774,6 +5047,13 @@ and customer address. Include units.', }, { + 'key' => 'ng_selfservice-menu', + 'section' => 'self-service', + 'description' => 'Custom menu for the next-generation self-service interface. Each line is in the format "link Label", for example "main.php Home". Sub-menu items are listed on subsequent lines. Blank lines terminate the submenu.', #more docs/examples would be helpful + 'type' => 'textarea', + }, + + { 'key' => 'signup-no_company', 'section' => 'self-service', 'description' => "Don't display a field for company name on signup.", @@ -4855,9 +5135,16 @@ and customer address. Include units.', }, { + 'key' => 'svc_phone-bulk_provision_simple', + 'section' => 'telephony', + 'description' => 'Bulk provision phone numbers with a simple number range instead of from DID vendor orders', + 'type' => 'checkbox', + }, + + { 'key' => 'default_phone_countrycode', - 'section' => '', - 'description' => 'Default countrcode', + 'section' => 'telephony', + 'description' => 'Default countrycode', 'type' => 'text', }, @@ -5067,19 +5354,30 @@ and customer address. Include units.', { 'key' => 'tax-cust_exempt-groups', - 'section' => '', + 'section' => 'billing', 'description' => 'List of grouping possibilities for tax names, for per-customer exemption purposes, one tax name per line. For example, "GST" would indicate the ability to exempt customers individually from taxes named "GST" (but not other taxes).', 'type' => 'textarea', }, { 'key' => 'tax-cust_exempt-groups-require_individual_nums', - 'section' => '', - 'description' => 'When using tax-cust_exempt-groups, require an individual tax exemption number for each exemption from different taxes.', + 'section' => 'deprecated', + 'description' => 'Deprecated: see tax-cust_exempt-groups-number_requirement', 'type' => 'checkbox', }, { + 'key' => 'tax-cust_exempt-groups-num_req', + 'section' => 'billing', + 'description' => 'When using tax-cust_exempt-groups, control whether individual tax exemption numbers are required for exemption from different taxes.', + 'type' => 'select', + 'select_hash' => [ '' => 'Not required', + 'residential' => 'Required for residential customers only', + 'all' => 'Required for all customers', + ], + }, + + { 'key' => 'cust_main-default_view', 'section' => 'UI', 'description' => 'Default customer view, for users who have not selected a default view in their preferences.', @@ -5214,6 +5512,33 @@ and customer address. Include units.', }, }, + #false laziness w/above options_sub and option_sub + { + 'key' => 'cust_location-exports', + 'section' => '', + 'description' => 'Export(s) to call on cust_location insert, modification and deletion.', + 'type' => 'select-sub', + 'multiple' => 1, + 'options_sub' => sub { + require FS::Record; + require FS::part_export; + my @part_export = + map { qsearch( 'part_export', {exporttype => $_ } ) } + keys %{FS::part_export::export_info('cust_location')}; + map { $_->exportnum => $_->exporttype.' to '.$_->machine } @part_export; + }, + 'option_sub' => sub { + require FS::Record; + require FS::part_export; + my $part_export = FS::Record::qsearchs( + 'part_export', { 'exportnum' => shift } + ); + $part_export + ? $part_export->exporttype.' to '.$part_export->machine + : ''; + }, + }, + { 'key' => 'cust_tag-location', 'section' => 'UI', @@ -5446,7 +5771,6 @@ and customer address. Include units.', 'multiple' => 1, 'options_sub' => sub { map { $_ => FS::Locales->description($_) } - grep { $_ ne 'en_US' } FS::Locales->locales; }, 'option_sub' => sub { FS::Locales->description(shift) }, @@ -5554,6 +5878,20 @@ and customer address. Include units.', }, { + 'key' => 'selfservice-hide_cdr_price', + 'section' => 'self-service', + 'description' => 'Don\'t show the "Price" column on CDRs in self-service.', + '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' => 'logout-timeout', 'section' => 'UI', 'description' => 'If set, automatically log users out of the backoffice after this many minutes.', @@ -5638,6 +5976,59 @@ and customer address. Include units.', }, }, + { + 'key' => 'part_pkg-term_discounts', + 'section' => 'billing', + 'description' => 'Enable the term discounts feature. Recommended to keep turned off unless actually using - not well optimized for large installations.', + 'type' => 'checkbox', + }, + + { + 'key' => 'prepaid-never_renew', + 'section' => 'billing', + 'description' => 'Prepaid packages never renew.', + 'type' => 'checkbox', + }, + + { + 'key' => 'agent-disable_counts', + 'section' => 'UI', + 'description' => 'On the agent browse page, disable the customer and package counts. Typically used for very large databases when this page takes too long to render.', + 'type' => 'checkbox', + }, + + { + 'key' => 'tollfree-country', + 'section' => 'telephony', + 'description' => 'Country / region for toll-free recognition', + 'type' => 'select', + 'select_hash' => [ '' => 'NANPA (US/Canada)', + 'AU' => 'Australia', + 'NZ' => 'New Zealand', + ], + }, + + { + 'key' => 'old_fcc_report', + 'section' => '', + 'description' => 'Use the old (pre-2014) FCC Form 477 report format.', + '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 => "DEPRECATED", type => "text" }, { key => "apachemachine", section => "deprecated", description => "DEPRECATED", type => "text" }, { key => "apachemachines", section => "deprecated", description => "DEPRECATED", type => "text" },