generate_ps generate_pdf do_print
csv_from_fixed
ocr_image
+ bytes_substr
+ money_pretty
);
$DEBUG = 0;
$smtp_opt{'ssl'} = 1 if defined($enc) && $enc eq 'tls';
$transport = Email::Sender::Transport::SMTP->new( %smtp_opt );
}
-
+
push @to, $options{bcc} if defined($options{bcc});
+ # make sure
+ my @env_to = split(/\s*,\s*/, join(', ', @to));
+ # strip display-name from envelope addresses
+ foreach (@env_to) {
+ s/^\s*//;
+ s/\s*$//;
+ s/^(.*)\s*<(.*@.*)>$/$2/;
+ }
+
local $@; # just in case
eval { sendmail($message, { transport => $transport,
from => $from,
- to => \@to }) };
+ to => \@env_to }) };
my $error = '';
if(ref($@) and $@->isa('Email::Sender::Failure')) {
}
# Logging
- if ( $conf->exists('log_sent_mail') and $options{'custnum'} ) {
+ if ( $conf->exists('log_sent_mail') ) {
my $cust_msg = FS::cust_msg->new({
'env_from' => $options{'from'},
'env_to' => join(', ', @to),
'custnum' => $options{'custnum'},
'msgnum' => $options{'msgnum'},
'status' => ($error ? 'failed' : 'sent'),
+ 'msgtype' => $options{'msgtype'},
});
$cust_msg->insert; # ignore errors
}
my $me = '[FS::Misc::generate_email]';
- my @fields = qw(from to bcc subject custnum msgnum);
+ my @fields = qw(from to bcc subject custnum msgnum msgtype);
my %return;
@return{@fields} = @args{@fields};
sub states_hash {
my($country) = @_;
+ #a hash? not expecting an explosion of business from unrecognized countries..
+ return states_hash_nosubcountry($country) if $country eq 'XC';
+
my @states =
# sort
map { s/[\n\r]//g; $_; }
#it could throw a fatal "Invalid country code" error (for example "AX")
my $subcountry = eval { new Locale::SubCountry($country) }
- or return ( '', '(n/a)' );
+ or return (); # ( '', '(n/a)' );
#"i see your schwartz is as big as mine!"
map { ( $_->[0] => $_->[1] ) }
@states;
}
+sub states_hash_nosubcountry {
+ my($country) = @_;
+
+ my @states =
+# sort
+ map { s/[\n\r]//g; $_; }
+ map { $_->state; }
+ qsearch({
+ 'select' => 'state',
+ 'table' => 'cust_main_county',
+ 'hashref' => { 'country' => $country },
+ 'extra_sql' => 'GROUP BY state',
+ });
+
+ #"i see your schwartz is as big as mine!"
+ map { ( $_->[0] => $_->[1] ) }
+ sort { $a->[1] cmp $b->[1] }
+ map { [ $_ => $_ ] }
+ @states;
+}
+
=item counties STATE COUNTRY
Returns a list of counties for this state and country.
_pslatex($file);
- system('dvips', '-q', '-t', 'letter', "$file.dvi", '-o', "$file.ps" ) == 0
+ my $papersize = $conf->config('papersize') || 'letter';
+
+ system('dvips', '-q', '-t', $papersize, "$file.dvi", '-o', "$file.ps" ) == 0
or die "dvips failed";
open(POSTSCRIPT, "<$file.ps")
my $sfile = shell_quote $file;
#system('dvipdf', "$file.dvi", "$file.pdf" );
+ my $papersize = $conf->config('papersize') || 'letter';
+
system(
- "dvips -q -t letter -f $sfile.dvi ".
+ "dvips -q -f $sfile.dvi -t $papersize ".
"| gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$sfile.pdf ".
" -c save pop -"
) == 0
}
return if -e "$file.dvi" && -s "$file.dvi";
- die "pslatex $file.tex failed; see $file.log for details?\n";
+ die "pslatex $file.tex failed, see $file.log for details?\n";
}
@lines;
}
+=item bytes_substr STRING, OFFSET[, LENGTH[, REPLACEMENT] ]
+
+A replacement for "substr" that counts raw bytes rather than logical
+characters. Unlike "bytes::substr", will suppress fragmented UTF-8 characters
+rather than output them. Unlike real "substr", is not an lvalue.
+
+=cut
+
+sub bytes_substr {
+ my ($string, $offset, $length, $repl) = @_;
+ my $bytes = substr(
+ Encode::encode('utf8', $string),
+ $offset,
+ $length,
+ Encode::encode('utf8', $repl)
+ );
+ my $chk = $DEBUG ? Encode::FB_WARN : Encode::FB_QUIET;
+ return Encode::decode('utf8', $bytes, $chk);
+}
+
+=item money_pretty
+
+Accepts a postive or negative numerical value.
+Returns amount formatted for display,
+including money character.
+
+=cut
+
+sub money_pretty {
+ my $amount = shift;
+ my $money_char = $conf->{'money_char'} || '$';
+ $amount = sprintf("%0.2f",$amount);
+ $amount =~ s/^(-?)/$1$money_char/;
+ return $amount;
+}
+
=back
=head1 BUGS