X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fmsg_template.pm;h=50a9b3f27665a653829b47dc7b5a0266cdc47645;hb=755159a8654a2eda89badd1498f8def3a472cb15;hp=644663e71c59201ff5eab6ac462d89280959b2e8;hpb=0be0b02db98ed06dabe51805fe45b2e9704327b8;p=freeside.git diff --git a/FS/FS/msg_template.pm b/FS/FS/msg_template.pm index 644663e71..50a9b3f27 100644 --- a/FS/FS/msg_template.pm +++ b/FS/FS/msg_template.pm @@ -268,19 +268,7 @@ invoicing_list addresses. Multiple addresses may be comma-separated. =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 @@ -336,10 +324,7 @@ sub prepare { } 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"; @@ -352,10 +337,7 @@ sub prepare { $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 @@ -401,12 +383,26 @@ sub prepare { my @to; if ( exists($opt{'to'}) ) { + @to = split(/\s*,\s*/, $opt{'to'}); + + } elsif ( $cust_main ) { + + my @classes; + if ( $opt{'to_contact_classnum'} ) { + my $classnum = $opt{'to_contact_classnum'}; + @classes = ref($classnum) ? @$classnum : split(',', $classnum); + } + if (!@classes) { + @classes = ( 'invoice' ); + } + @to = $cust_main->contact_list_email(@classes); + + } else { + + die 'no To: address or cust_main object specified'; + } - else { - @to = $cust_main->invoicing_list_emailonly; - } - # no warning when preparing with no destination my $from_addr = $self->from_addr; @@ -440,7 +436,7 @@ sub prepare { 'bcc' => $self->bcc_addr || undef, 'subject' => $subject, 'html_body' => $body, - 'text_body' => $text_body + 'text_body' => $text_body, ); } @@ -448,7 +444,8 @@ sub prepare { =item send OPTION => VALUE Fills in the template and sends it to the customer. Options are as for -'prepare'. +'prepare', plus 'attach', a L (or arrayref of them) to attach +to the message. =cut @@ -456,7 +453,20 @@ Fills in the template and sends it to the customer. Options are as for # 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 ... @@ -522,17 +532,21 @@ my $usage_warning = sub { #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 @@ -587,12 +601,6 @@ sub substitutions { [ 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 '
' . encode_entities($cust_main->payment_history_text($param)) . '
'; - } ], ], # next_bill_date 'cust_pkg' => [qw( @@ -685,11 +693,17 @@ sub substitutions { # 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 @@ -701,11 +715,8 @@ sub substitutions { [ 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 ], ], }; }