X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FMisc.pm;h=83bc3b2a7e8eb3d162a4f72050bd708ea8ad440f;hb=6b74e2e7a98a11b8b4f62a10676ba8b37ee2ef4f;hp=101a2d4e01827694432b8f733c65fedf94f86747;hpb=929f432c766bbe3bdeed5b80818a12ddf6ec6339;p=freeside.git diff --git a/FS/FS/Misc.pm b/FS/FS/Misc.pm index 101a2d4e0..83bc3b2a7 100644 --- a/FS/FS/Misc.pm +++ b/FS/FS/Misc.pm @@ -5,9 +5,16 @@ use vars qw ( @ISA @EXPORT_OK $DEBUG ); use Exporter; use Carp; use Data::Dumper; +#do NOT depend on any FS:: modules here, causes weird (sometimes unreproducable +#until on client machine) dependancy loops. put them in FS::Misc::Something +#instead @ISA = qw( Exporter ); -@EXPORT_OK = qw( send_email send_fax states_hash state_label ); +@EXPORT_OK = qw( send_email send_fax + states_hash counties state_label + card_types + generate_ps do_print + ); $DEBUG = 0; @@ -301,7 +308,7 @@ sub send_fax { unless exists($options{'dialstring'}); if (exists($options{'docdata'}) and ref($options{'docdata'}) eq 'ARRAY') { - my $dir = $FS::UID::conf_dir. "cache.". $FS::UID::datasrc; + my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; my $fh = new File::Temp( TEMPLATE => 'faxdoc.'. $options{'dialstring'} . '.XXXXXXXX', DIR => $dir, @@ -359,11 +366,12 @@ sub states_hash { # sort map { s/[\n\r]//g; $_; } map { $_->state; } - qsearch( 'cust_main_county', - { 'country' => $country }, - 'DISTINCT ON ( state ) *', - ) - ; + qsearch({ + 'select' => 'state', + 'table' => 'cust_main_county', + 'hashref' => { 'country' => $country }, + 'extra_sql' => 'GROUP BY state', + }); #it could throw a fatal "Invalid country code" error (for example "AX") my $subcountry = eval { new Locale::SubCountry($country) } @@ -376,6 +384,26 @@ sub states_hash { @states; } +=item counties STATE COUNTRY + +Returns a list of counties for this state and country. + +=cut + +sub counties { + my( $state, $country ) = @_; + + sort map { s/[\n\r]//g; $_; } + map { $_->county } + qsearch({ + 'select' => 'DISTINCT county', + 'table' => 'cust_main_county', + 'hashref' => { 'state' => $state, + 'country' => $country, + }, + }); +} + =item state_label STATE COUNTRY_OR_LOCALE_SUBCOUNRY_OBJECT =cut @@ -403,6 +431,121 @@ sub state_label { } +=item card_types + +Returns a hash reference of the accepted credit card types. Keys are shorter +identifiers and values are the longer strings used by the system (see +L). + +=cut + +#$conf from above + +sub card_types { + my $conf = new FS::Conf; + + my %card_types = ( + #displayname #value (Business::CreditCard) + "VISA" => "VISA card", + "MasterCard" => "MasterCard", + "Discover" => "Discover card", + "American Express" => "American Express card", + "Diner's Club/Carte Blanche" => "Diner's Club/Carte Blanche", + "enRoute" => "enRoute", + "JCB" => "JCB", + "BankCard" => "BankCard", + "Switch" => "Switch", + "Solo" => "Solo", + ); + my @conf_card_types = grep { ! /^\s*$/ } $conf->config('card-types'); + if ( @conf_card_types ) { + #perhaps the hash is backwards for this, but this way works better for + #usage in selfservice + %card_types = map { $_ => $card_types{$_} } + grep { + my $d = $_; + grep { $card_types{$d} eq $_ } @conf_card_types + } + keys %card_types; + } + + \%card_types; +} + +=item generate_ps FILENAME + +Returns an postscript rendition of the LaTex file, as a scalar. +FILENAME does not contain the .tex suffix and is unlinked by this function. + +=cut + +use String::ShellQuote; + +sub generate_ps { + my $file = shift; + + my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; + chdir($dir); + + my $sfile = shell_quote $file; + + system("pslatex $sfile.tex >/dev/null 2>&1") == 0 + or die "pslatex $file.tex failed; see $file.log for details?\n"; + system("pslatex $sfile.tex >/dev/null 2>&1") == 0 + or die "pslatex $file.tex failed; see $file.log for details?\n"; + + system('dvips', '-q', '-t', 'letter', "$file.dvi", '-o', "$file.ps" ) == 0 + or die "dvips failed"; + + open(POSTSCRIPT, "<$file.ps") + or die "can't open $file.ps: $! (error in LaTeX template?)\n"; + + unlink("$file.dvi", "$file.log", "$file.aux", "$file.ps", "$file.tex"); + + my $ps = ''; + + if ( $conf->exists('lpr-postscript_prefix') ) { + my $prefix = $conf->config('lpr-postscript_prefix'); + $ps .= eval qq("$prefix"); + } + + while () { + $ps .= $_; + } + + close POSTSCRIPT; + + if ( $conf->exists('lpr-postscript_suffix') ) { + my $suffix = $conf->config('lpr-postscript_suffix'); + $ps .= eval qq("$suffix"); + } + + return $ps; + +} + +=item print ARRAYREF + +Sends the lines in ARRAYREF to the printer. + +=cut + +use IPC::Run3; + +sub do_print { + my $data = shift; + + my $lpr = $conf->config('lpr'); + + my $outerr = ''; + run3 $lpr, $data, \$outerr, \$outerr; + if ( $? ) { + $outerr = ": $outerr" if length($outerr); + die "Error from $lpr (exit status ". ($?>>8). ")$outerr\n"; + } + +} + =back =head1 BUGS