use FS::UID qw( dbh driver_name );
use FS::Record qw( qsearchs qsearch dbdef regexp_sql );
use FS::Cursor;
-use FS::Misc qw( generate_email send_email generate_ps do_print );
+use FS::Misc qw( generate_ps do_print money_pretty );
use FS::Msgcat qw(gettext);
use FS::CurrentUser;
use FS::TicketSystem;
=cut
# Caution: this gets used by FS::ClientAPI::MyAccount::billing_history,
-# and also payment_history_text, which should both be kept customer-friendly.
+# and also for sending customer statements, which should both be kept customer-friendly.
# If you add anything that shouldn't be passed on through the API or exposed
# to customers, add a new option to include it, don't include it by default
sub payment_history {
'amount' => sprintf('%.2f', $_->setup + $_->recur ),
'charged' => sprintf('%.2f', $_->setup + $_->recur ),
'date' => $cust_bill->_date,
- 'date_pretty' => time2str('%m/%d/%Y', $cust_bill->_date ),
+ 'date_pretty' => $self->time2str_local('short', $cust_bill->_date ),
}
foreach $cust_bill->cust_bill_pkg;
'amount' => sprintf('%.2f', $_->charged ),
'charged' => sprintf('%.2f', $_->charged ),
'date' => $_->_date,
- 'date_pretty' => time2str('%m/%d/%Y', $_->_date ),
+ 'date_pretty' => $self->time2str_local('short', $_->_date ),
}
foreach $self->cust_bill;
'amount' => sprintf('%.2f', 0 - $_->paid ),
'paid' => sprintf('%.2f', $_->paid ),
'date' => $_->_date,
- 'date_pretty' => time2str('%m/%d/%Y', $_->_date ),
+ 'date_pretty' => $self->time2str_local('short', $_->_date ),
}
foreach $self->cust_pay;
'amount' => sprintf('%.2f', 0 -$_->amount ),
'credit' => sprintf('%.2f', $_->amount ),
'date' => $_->_date,
- 'date_pretty' => time2str('%m/%d/%Y', $_->_date ),
+ 'date_pretty' => $self->time2str_local('short', $_->_date ),
}
foreach $self->cust_credit;
'amount' => $_->refund,
'refund' => $_->refund,
'date' => $_->_date,
- 'date_pretty' => time2str('%m/%d/%Y', $_->_date ),
+ 'date_pretty' => $self->time2str_local('short', $_->_date ),
}
foreach $self->cust_refund;
}
$$item{'balance'} = sprintf("%.2f",$balance);
foreach my $key ( qw(amount balance) ) {
- $$item{$key.'_pretty'} = $$item{$key};
- $$item{$key.'_pretty'} =~ s/^(-?)/$1$money_char/;
+ $$item{$key.'_pretty'} = money_pretty($$item{$key});
}
push(@out,$item);
}
'description' => 'Previous balance',
'amount' => sprintf("%.2f",$previous),
'balance' => sprintf("%.2f",$previous),
+ 'date' => $$opt{'start_date'},
+ 'date_pretty' => $self->time2str_local('short', $$opt{'start_date'} ),
};
#false laziness with above
foreach my $key ( qw(amount balance) ) {
return @out;
}
-=item payment_history_text
-
-Accepts the same options as L</payment_history> and returns those
-results as a string table with fixed-width columns, max width 80 char.
-
-=cut
-
-sub payment_history_text {
- my $self = shift;
- my $opt = ref($_[0]) ? $_[0] : { @_ };
- my $out = sprintf("%-12s",'Date');
- $out .= sprintf("%11s",'Amount') . ' ';
- $out .= sprintf("%11s",'Balance') . ' ';
- $out .= 'Description'; #don't need to pad with spaces
- $out .= "\n";
- foreach my $item ($self->payment_history($opt)) {
- $out .= sprintf("%-10.10s",$$item{'date_pretty'}) . ' '; #12 width
- $out .= sprintf("%11.11s",$$item{'amount_pretty'}) . ' '; #13 width
- $out .= sprintf("%11.11s",$$item{'balance_pretty'}) . ' '; #13 width
- $out .= sprintf("%.42s",$$item{'description'}); #max 42 width
- $out .= "\n";
- }
- return $out;
-}
-
=back
=head1 CLASS METHODS
=over 4
-=item notify CUSTOMER_OBJECT TEMPLATE_NAME OPTIONS
-
-Deprecated. Use event notification and message templates
-(L<FS::msg_template>) instead.
+#=item notify CUSTOMER_OBJECT TEMPLATE_NAME OPTIONS
-Sends a templated email notification to the customer (see L<Text::Template>).
-
-OPTIONS is a hash and may include
-
-I<from> - the email sender (default is invoice_from)
-
-I<to> - comma-separated scalar or arrayref of recipients
- (default is invoicing_list)
-
-I<subject> - The subject line of the sent email notification
- (default is "Notice from company_name")
-
-I<extra_fields> - a hashref of name/value pairs which will be substituted
- into the template
-
-The following variables are vavailable in the template.
-
-I<$first> - the customer first name
-I<$last> - the customer last name
-I<$company> - the customer company
-I<$payby> - a description of the method of payment for the customer
- # would be nice to use FS::payby::shortname
-I<$payinfo> - the account information used to collect for this customer
-I<$expdate> - the expiration of the customer payment in seconds from epoch
+#Deprecated. Use event notification and message templates
+#(L<FS::msg_template>) instead.
-=cut
+#Sends a templated email notification to the customer (see L<Text::Template>).
-sub notify {
- my ($self, $template, %options) = @_;
+#OPTIONS is a hash and may include
- return unless $conf->exists($template);
+#I<from> - the email sender (default is invoice_from)
- my $from = $conf->invoice_from_full($self->agentnum)
- if $conf->exists('invoice_from', $self->agentnum);
- $from = $options{from} if exists($options{from});
+#I<to> - comma-separated scalar or arrayref of recipients
+# (default is invoicing_list)
- my $to = join(',', $self->invoicing_list_emailonly);
- $to = $options{to} if exists($options{to});
-
- my $subject = "Notice from " . $conf->config('company_name', $self->agentnum)
- if $conf->exists('company_name', $self->agentnum);
- $subject = $options{subject} if exists($options{subject});
-
- my $notify_template = new Text::Template (TYPE => 'ARRAY',
- SOURCE => [ map "$_\n",
- $conf->config($template)]
- )
- or die "can't create new Text::Template object: Text::Template::ERROR";
- $notify_template->compile()
- or die "can't compile template: Text::Template::ERROR";
+#I<subject> - The subject line of the sent email notification
+# (default is "Notice from company_name")
- $FS::notify_template::_template::company_name =
- $conf->config('company_name', $self->agentnum);
- $FS::notify_template::_template::company_address =
- join("\n", $conf->config('company_address', $self->agentnum) ). "\n";
+#I<extra_fields> - a hashref of name/value pairs which will be substituted
+# into the template
- my $paydate = $self->paydate || '2037-12-31';
- $FS::notify_template::_template::first = $self->first;
- $FS::notify_template::_template::last = $self->last;
- $FS::notify_template::_template::company = $self->company;
- $FS::notify_template::_template::payinfo = $self->mask_payinfo;
- my $payby = $self->payby;
- my ($payyear,$paymonth,$payday) = split (/-/,$paydate);
- my $expire_time = timelocal(0,0,0,$payday,--$paymonth,$payyear);
+#The following variables are vavailable in the template.
- #credit cards expire at the end of the month/year of their exp date
- if ($payby eq 'CARD' || $payby eq 'DCRD') {
- $FS::notify_template::_template::payby = 'credit card';
- ($paymonth < 11) ? $paymonth++ : ($paymonth=0, $payyear++);
- $expire_time = timelocal(0,0,0,$payday,$paymonth,$payyear);
- $expire_time--;
- }elsif ($payby eq 'COMP') {
- $FS::notify_template::_template::payby = 'complimentary account';
- }else{
- $FS::notify_template::_template::payby = 'current method';
- }
- $FS::notify_template::_template::expdate = $expire_time;
+#I<$first> - the customer first name
+#I<$last> - the customer last name
+#I<$company> - the customer company
+#I<$payby> - a description of the method of payment for the customer
+# # would be nice to use FS::payby::shortname
+#I<$payinfo> - the account information used to collect for this customer
+#I<$expdate> - the expiration of the customer payment in seconds from epoch
- for (keys %{$options{extra_fields}}){
- no strict "refs";
- ${"FS::notify_template::_template::$_"} = $options{extra_fields}->{$_};
- }
+#=cut
- send_email(from => $from,
- to => $to,
- subject => $subject,
- body => $notify_template->fill_in( PACKAGE =>
- 'FS::notify_template::_template' ),
- );
+#sub notify {
+# my ($self, $template, %options) = @_;
+
+# return unless $conf->exists($template);
+
+# my $from = $conf->invoice_from_full($self->agentnum)
+# if $conf->exists('invoice_from', $self->agentnum);
+# $from = $options{from} if exists($options{from});
+
+# my $to = join(',', $self->invoicing_list_emailonly);
+# $to = $options{to} if exists($options{to});
+#
+# my $subject = "Notice from " . $conf->config('company_name', $self->agentnum)
+# if $conf->exists('company_name', $self->agentnum);
+# $subject = $options{subject} if exists($options{subject});
+
+# my $notify_template = new Text::Template (TYPE => 'ARRAY',
+# SOURCE => [ map "$_\n",
+# $conf->config($template)]
+# )
+# or die "can't create new Text::Template object: Text::Template::ERROR";
+# $notify_template->compile()
+# or die "can't compile template: Text::Template::ERROR";
+
+# $FS::notify_template::_template::company_name =
+# $conf->config('company_name', $self->agentnum);
+# $FS::notify_template::_template::company_address =
+# join("\n", $conf->config('company_address', $self->agentnum) ). "\n";
+
+# my $paydate = $self->paydate || '2037-12-31';
+# $FS::notify_template::_template::first = $self->first;
+# $FS::notify_template::_template::last = $self->last;
+# $FS::notify_template::_template::company = $self->company;
+# $FS::notify_template::_template::payinfo = $self->mask_payinfo;
+# my $payby = $self->payby;
+# my ($payyear,$paymonth,$payday) = split (/-/,$paydate);
+# my $expire_time = timelocal(0,0,0,$payday,--$paymonth,$payyear);
+
+# #credit cards expire at the end of the month/year of their exp date
+# if ($payby eq 'CARD' || $payby eq 'DCRD') {
+# $FS::notify_template::_template::payby = 'credit card';
+# ($paymonth < 11) ? $paymonth++ : ($paymonth=0, $payyear++);
+# $expire_time = timelocal(0,0,0,$payday,$paymonth,$payyear);
+# $expire_time--;
+# }elsif ($payby eq 'COMP') {
+# $FS::notify_template::_template::payby = 'complimentary account';
+# }else{
+# $FS::notify_template::_template::payby = 'current method';
+# }
+# $FS::notify_template::_template::expdate = $expire_time;
+
+# for (keys %{$options{extra_fields}}){
+# no strict "refs";
+# ${"FS::notify_template::_template::$_"} = $options{extra_fields}->{$_};
+# }
+
+# send_email(from => $from,
+# to => $to,
+# subject => $subject,
+# body => $notify_template->fill_in( PACKAGE =>
+# 'FS::notify_template::_template' ),
+# );
-}
+#}
=item generate_letter CUSTOMER_OBJECT TEMPLATE_NAME OPTIONS
into the template. These values may override values mentioned below
and those from the customer record.
+I<template_text> - if present, ignores TEMPLATE_NAME and uses the provided text
+
The following variables are available in the template instead of or in addition
to the fields of the customer record.
sub generate_letter {
my ($self, $template, %options) = @_;
- return unless $conf->exists($template);
+ warn "Template $template does not exist" && return
+ unless $conf->exists($template) || $options{'template_text'};
+
+ my $template_source = $options{'template_text'}
+ ? [ $options{'template_text'} ]
+ : [ map "$_\n", $conf->config($template) ];
my $letter_template = new Text::Template
( TYPE => 'ARRAY',
- SOURCE => [ map "$_\n", $conf->config($template)],
+ SOURCE => $template_source,
DELIMITERS => [ '[@--', '--@]' ],
)
or die "can't create new Text::Template object: Text::Template::ERROR";
my $self = qsearchs('cust_main', { 'custnum' => $opt{custnum} } )
or die "invalid customer number: " . $opt{custnum};
- my $error = $self->print( { 'template' => $opt{template} } );
+#do not backport this change to 3.x
+# my $error = $self->print( { 'template' => $opt{template} } );
+ my $error = $self->print( $opt{'template'} );
die $error if $error;
}