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;
( @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
);
},
);
+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)
'description' => 'Return address on email invoices (address only, see invoice_from_name)',
'type' => 'text',
'per_agent' => 1,
- 'validate' => sub { $_[0] =~
- /^[^@]+\@[[:alnum:]-]+(\.[[:alnum:]-]+)+$/
- ? '' : 'Invalid email address';
- }
+ 'validate' => $validate_email,
},
{
'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',
'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',
'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',
'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,
},
'svc_acct' => 'Account (svc_acct)',
'svc_phone' => 'Phone number (svc_phone)',
'svc_pbx' => 'PBX (svc_pbx)',
+ 'none' => 'None - package only',
],
},
'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' => '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' => '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',
'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',
'type' => 'checkbox',
},
+ {
+ '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' => '',
'multiple' => 1,
'options_sub' => sub {
map { $_ => FS::Locales->description($_) }
- grep { $_ ne 'en_US' }
FS::Locales->locales;
},
'option_sub' => sub { FS::Locales->description(shift) },
'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',
'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" },