=item substitutions
-A hash reference of additional string substitutions
-
-=item sub_param
-
-A hash reference, keys are the names of existing substitutions,
-values are an addition parameter object to pass to the subroutine
-for that substitution, e.g.
-
- 'sub_param' => {
- 'payment_history' => {
- 'start_date' => 1434764295,
- },
- },
+A hash reference of additional substitutions
=back
}
elsif( ref($name) eq 'ARRAY' ) {
# [ foo => sub { ... } ]
- my @subparam = ();
- push(@subparam, $opt{'sub_param'}->{$name->[0]})
- if $opt{'sub_param'} && $opt{'sub_param'}->{$name->[0]};
- $hash{$prefix.($name->[0])} = $name->[1]->($obj,@subparam);
+ $hash{$prefix.($name->[0])} = $name->[1]->($obj);
}
else {
warn "bad msg_template substitution: '$name'\n";
$hash{$_} = $opt{substitutions}->{$_} foreach keys %{$opt{substitutions}};
}
- foreach my $key (keys %hash) {
- next if $self->no_encode($key);
- $hash{$key} = encode_entities($_ || '');
- };
+ $_ = encode_entities($_ || '') foreach values(%hash);
###
# clean up template
'bcc' => $self->bcc_addr || undef,
'subject' => $subject,
'html_body' => $body,
- 'text_body' => $text_body
+ 'text_body' => $text_body,
);
}
=item send OPTION => VALUE
Fills in the template and sends it to the customer. Options are as for
-'prepare'.
+'prepare', plus 'attach', a L<MIME::Entity> (or arrayref of them) to attach
+to the message.
=cut
# preview it, etc.
sub send {
my $self = shift;
- send_email(generate_email($self->prepare(@_)));
+ my %opt = @_;
+
+ my %email = generate_email($self->prepare(%opt));
+ if ( $opt{'attach'} ) {
+ my @attach;
+ if (ref($opt{'attach'}) eq 'ARRAY') {
+ @attach = @{ $opt{'attach'} };
+ } else {
+ @attach = $opt{'attach'};
+ }
+ push @{ $email{mimeparts} }, @attach;
+ }
+
+ send_email(%email);
}
=item render OPTION => VALUE ...
#my $conf = new FS::Conf;
-# for substitutions that handle their own encoding
-sub no_encode {
- my $self = shift;
- my $field = shift;
- return ($field eq 'payment_history');
-}
-
#return contexts and fill-in values
# If you add anything, be sure to add a description in
# httemplate/edit/msg_template.html.
sub substitutions {
+ my $payinfo_sub = sub {
+ my $obj = shift;
+ ($obj->payby eq 'CARD' || $obj->payby eq 'CHEK')
+ ? $obj->paymask
+ : $obj->decrypt($obj->payinfo)
+ };
+ my $payinfo_end = sub {
+ my $obj = shift;
+ my $payinfo = &$payinfo_sub($obj);
+ substr($payinfo, -4);
+ };
{ 'cust_main' => [qw(
display_custnum agentnum agent_name
[ selfservice_server_base_url => sub {
$conf->config('selfservice_server-base_url') #, shift->agentnum)
} ],
- [ payment_history => sub {
- my $cust_main = shift;
- my $param = shift || {};
- #html works, see no_encode method
- return '<PRE>' . encode_entities($cust_main->payment_history_text($param)) . '</PRE>';
- } ],
],
# next_bill_date
'cust_pkg' => [qw(
# overrides the one in cust_main in cases where a cust_pay is passed
[ payby => sub { FS::payby->shortname(shift->payby) } ],
[ date => sub { time2str("%a %B %o, %Y", shift->_date) } ],
- [ payinfo => sub {
- my $cust_pay = shift;
- ($cust_pay->payby eq 'CARD' || $cust_pay->payby eq 'CHEK') ?
- $cust_pay->paymask : $cust_pay->decrypt($cust_pay->payinfo)
- } ],
+ [ 'payinfo' => $payinfo_sub ],
+ [ 'payinfo_end' => $payinfo_end ],
+ ],
+ # for refund receipts
+ 'cust_refund' => [
+ 'refundnum',
+ [ refund => sub { sprintf("%.2f", shift->refund) } ],
+ [ payby => sub { FS::payby->shortname(shift->payby) } ],
+ [ date => sub { time2str("%a %B %o, %Y", shift->_date) } ],
+ [ 'payinfo' => $payinfo_sub ],
+ [ 'payinfo_end' => $payinfo_end ],
],
# for payment decline messages
# try to support all cust_pay fields
[ paid => sub { sprintf("%.2f", shift->paid) } ],
[ payby => sub { FS::payby->shortname(shift->payby) } ],
[ date => sub { time2str("%a %B %o, %Y", shift->_date) } ],
- [ payinfo => sub {
- my $pending = shift;
- ($pending->payby eq 'CARD' || $pending->payby eq 'CHEK') ?
- $pending->paymask : $pending->decrypt($pending->payinfo)
- } ],
+ [ 'payinfo' => $payinfo_sub ],
+ [ 'payinfo_end' => $payinfo_end ],
],
};
}