X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FConf.pm;h=855c9f42174785370845c3df8c883643c0bab308;hb=ae02d1178c6859f7a0a5e4a22c685de5f0477568;hp=cb4274f398e8e98c3444abd1972c89bc76e38c51;hpb=52a824f9b11ca266be10c76894eaf6607344c8d0;p=freeside.git diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index cb4274f39..855c9f421 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 vars qw($base_dir @config_items @base_items @card_types $DEBUG $conf_cache); use Carp; use IO::File; use File::Basename; @@ -133,9 +134,13 @@ sub _config { foreach my $a (@a) { $hashref->{agentnum} = $a; foreach my $l (@l) { - $hashref->{locale} = $l; - $cv = FS::Record::qsearchs('conf', $hashref); - return $cv if $cv; + my $key = join(':',$name, $a, $l); + if (! exists $conf_cache->{$key}){ + $hashref->{locale} = $l; + # $conf_cache is reset in FS::UID during myconnect, so the cache is reset per connection + $conf_cache->{$key} = FS::Record::qsearchs('conf', $hashref); + } + return $conf_cache->{$key} if $conf_cache->{$key}; } } return undef; @@ -361,6 +366,12 @@ sub set { $error = $new->insert; } + if (! $error) { + # clean the object cache + my $key = join(':',$name, $agentnum, $self->{locale}); + $conf_cache->{ $key } = $new; + } + die "error setting configuration value: $error \n" if $error; @@ -593,6 +604,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 @@ -718,6 +744,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', @@ -773,7 +816,7 @@ sub reason_type_options { { 'key' => 'log_sent_mail', 'section' => 'notification', - 'description' => 'Enable logging of template-generated email.', + 'description' => 'Enable logging of all sent email.', 'type' => 'checkbox', }, @@ -958,7 +1001,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', }, @@ -1233,12 +1276,36 @@ 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' => sub { $_[0] =~ + /^[^@]+\@[[:alnum:]-]+(\.[[:alnum:]-]+)+$/ + ? '' : 'Invalid email address'; + } + }, + + { + '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', 'description' => 'Subject: header on email invoices. Defaults to "Invoice". The following substitutions are available: $name, $name_short, $invoice_number, and $invoice_date.', @@ -1248,6 +1315,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.', @@ -1502,14 +1578,35 @@ and customer address. Include units.', { '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' }, @@ -1539,6 +1636,7 @@ and customer address. Include units.', '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', @@ -1651,9 +1749,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, }, @@ -2084,13 +2189,6 @@ and customer address. Include units.', }, { - 'key' => 'safe-part_bill_event', - 'section' => 'UI', - 'description' => 'Validates invoice event expressions against a preset list. Useful for webdemos, annoying to powerusers.', - 'type' => 'checkbox', - }, - - { 'key' => 'show_ship_company', 'section' => 'UI', 'description' => 'Turns on display/collection of a "service company name" field for customers.', @@ -2186,7 +2284,7 @@ and customer address. Include units.', 'section' => 'self-service', 'description' => 'Acceptable payment types for the signup server', 'type' => 'selectmultiple', - 'select_enum' => [ qw(CARD DCRD CHEK DCHK PREPAY PPAL BILL COMP) ], + 'select_enum' => [ qw(CARD DCRD CHEK DCHK PREPAY PPAL ) ], # BILL COMP) ], }, { @@ -2589,13 +2687,13 @@ and customer address. Include units.', 'section' => 'billing', 'description' => 'Available payment types.', 'type' => 'selectmultiple', - 'select_enum' => [ qw(CARD DCRD CHEK DCHK BILL CASH WEST MCRD PPAL COMP) ], + 'select_enum' => [ qw(CARD DCRD CHEK DCHK CASH WEST MCRD MCHK PPAL) ], }, { 'key' => 'payby-default', - 'section' => 'UI', - 'description' => 'Default payment type. HIDE disables display of billing information and sets customers to BILL.', + 'section' => 'deprecated', + 'description' => 'Deprecated; in 4.x there is no longer the concept of a single "payment type". Used to indicate the default payment type. HIDE disables display of billing information and sets customers to BILL.', 'type' => 'select', 'select_enum' => [ '', qw(CARD DCRD CHEK DCHK BILL CASH WEST MCRD PPAL COMP HIDE) ], }, @@ -2933,7 +3031,7 @@ and customer address. Include units.', 'type' => 'select', 'select_hash' => [ '' => 'Password reset disabled', 'email' => 'Click on a link in email', - 'paymask,amount,zip' => 'Click on a link in email, and also verify with credit card (or bank account) last 4 digits, payment amount and zip code', + 'paymask,amount,zip' => 'Click on a link in email, and also verify with credit card (or bank account) last 4 digits, payment amount and zip code. Note: Do not use if you have multi-customer contacts, as they will be unable to reset their passwords.', ], }, @@ -2991,7 +3089,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 : ''; @@ -3289,6 +3387,14 @@ and customer address. Include units.', }, { + 'key' => 'city_not_required', + 'section' => 'required', + 'description' => 'Turn off requirement for a City to be entered for billing & shipping addresses', + 'type' => 'checkbox', + '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', @@ -3854,7 +3960,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, }, @@ -4556,6 +4662,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.', @@ -4949,8 +5065,15 @@ 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' => '', + 'section' => 'telephony', 'description' => 'Default countrycode', 'type' => 'text', }, @@ -5161,19 +5284,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.', @@ -5826,6 +5960,13 @@ and customer address. Include units.', 'type' => 'checkbox', }, + { + 'key' => 'cust_main-default_commercial', + 'section' => 'UI', + 'description' => 'Default for new customers is commercial rather than residential.', + 'type' => 'checkbox', + }, + { key => "apacheroot", section => "deprecated", description => "DEPRECATED", type => "text" }, { key => "apachemachine", section => "deprecated", description => "DEPRECATED", type => "text" }, { key => "apachemachines", section => "deprecated", description => "DEPRECATED", type => "text" },