diff options
author | ivan <ivan> | 2010-10-14 01:14:27 +0000 |
---|---|---|
committer | ivan <ivan> | 2010-10-14 01:14:27 +0000 |
commit | 7bbe939d139be7edd77378cfc9a2c3ec6287749d (patch) | |
tree | 4c43f97b729880ae191cc630d9402b843ca76870 /FS/FS | |
parent | f839709351aee1f9488e9a26496adc564aa5b8e5 (diff) |
more contact work and preliminary business card upload
Diffstat (limited to 'FS/FS')
-rw-r--r-- | FS/FS/Mason.pm | 2 | ||||
-rw-r--r-- | FS/FS/Misc.pm | 36 | ||||
-rw-r--r-- | FS/FS/Schema.pm | 18 | ||||
-rw-r--r-- | FS/FS/contact.pm | 133 | ||||
-rw-r--r-- | FS/FS/contact_phone.pm | 2 | ||||
-rw-r--r-- | FS/FS/cust_main.pm | 2 |
6 files changed, 176 insertions, 17 deletions
diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm index 2282bc58c..550ea1a45 100644 --- a/FS/FS/Mason.pm +++ b/FS/FS/Mason.pm @@ -126,7 +126,7 @@ if ( -e $addl_handler_use_file ) { use FS::UI::Web::small_custview qw(small_custview); use FS::UI::bytecount; use FS::Msgcat qw(gettext geterror); - use FS::Misc qw( send_email send_fax + use FS::Misc qw( send_email send_fax ocr_image states_hash counties cities state_label ); use FS::Misc::eps2png qw( eps2png ); diff --git a/FS/FS/Misc.pm b/FS/FS/Misc.pm index 0e8d92bb3..fe8ac6082 100644 --- a/FS/FS/Misc.pm +++ b/FS/FS/Misc.pm @@ -20,6 +20,7 @@ use Tie::IxHash; pkg_freqs generate_ps generate_pdf do_print csv_from_fixed + ocr_image ); $DEBUG = 0; @@ -850,6 +851,41 @@ sub csv_from_fixed { ''; } +=item ocr_image IMAGE_SCALAR + +Runs OCR on the provided image data and returns a list of text lines. + +=cut + +sub ocr_image { + my $logo_data = shift; + + #XXX use conf dir location from Makefile + my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; + my $fh = new File::Temp( + TEMPLATE => 'bizcard.XXXXXXXX', + SUFFIX => '.png', #XXX assuming, but should handle jpg, gif, etc. too + DIR => $dir, + UNLINK => 0, + ) or die "can't open temp file: $!\n"; + + my $filename = $fh->filename; + + print $fh $logo_data; + close $fh; + + run( [qw(ocroscript recognize), $filename], '>'=>"$filename.hocr" ) + or die "ocroscript recognize failed\n"; + + run( [qw(ocroscript hocr-to-text), "$filename.hocr"], '>pipe'=>\*OUT ) + or die "ocroscript hocr-to-text failed\n"; + + my @lines = split(/\n/, <OUT> ); + + foreach (@lines) { s/\.c0m\s*$/.com/; } + + @lines; +} =back diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index 6a987ceb1..a4c12aaff 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -831,8 +831,8 @@ sub tables_hashref { 'last', 'varchar', '', $char_d, '', '', # 'middle', 'varchar', 'NULL', $char_d, '', '', 'first', 'varchar', '', $char_d, '', '', - 'title', 'varchar', '', $char_d, '', '', #eg Head Bottle Washer - 'comment', 'varchar', '', $char_d, '', '', + 'title', 'varchar', 'NULL', $char_d, '', '', #eg Head Bottle Washer + 'comment', 'varchar', 'NULL', $char_d, '', '', 'disabled', 'char', 'NULL', 1, '', '', ], 'primary_key' => 'contactnum', @@ -844,13 +844,13 @@ sub tables_hashref { 'contact_phone' => { 'columns' => [ - 'contactphonenum', 'serial', '', '', '', '', - 'contactnum', 'int', '', '', '', '', - 'phonetypenum', 'int', '', '', '', '', - 'countrycode', 'varchar', '', 3, '', '', - 'phonenum', 'varchar', '', 14, '', '', - 'extension', 'varchar', '', 7, '', '', - #?#'comment', 'varchar', '', $char_d, '', '', + 'contactphonenum', 'serial', '', '', '', '', + 'contactnum', 'int', '', '', '', '', + 'phonetypenum', 'int', '', '', '', '', + 'countrycode', 'varchar', '', 3, '', '', + 'phonenum', 'varchar', '', 14, '', '', + 'extension', 'varchar', 'NULL', 7, '', '', + #?#'comment', 'varchar', '', $char_d, '', '', ], 'primary_key' => 'contactphonenum', 'unique' => [], diff --git a/FS/FS/contact.pm b/FS/FS/contact.pm index d3ab4118a..774aed088 100644 --- a/FS/FS/contact.pm +++ b/FS/FS/contact.pm @@ -2,10 +2,12 @@ package FS::contact; use strict; use base qw( FS::Record ); -use FS::Record qw( qsearch qsearchs ); +use FS::Record qw( qsearch qsearchs dbh ); use FS::prospect_main; use FS::cust_main; use FS::cust_location; +use FS::contact_phone; +use FS::contact_email; =head1 NAME @@ -96,7 +98,59 @@ otherwise returns false. =cut -# the insert method can be inherited from FS::Record +sub insert { + my $self = shift; + + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $error = $self->SUPER::insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + foreach my $pf ( grep { /^phonetypenum(\d+)$/ && $self->get($_) =~ /\S/ } + keys %{ $self->hashref } ) { + $pf =~ /^phonetypenum(\d+)$/ or die "wtf (daily, the)"; + my $phonetypenum = $1; + + my $contact_phone = new FS::contact_phone { + 'contactnum' => $self->contactnum, + 'phonetypenum' => $phonetypenum, + _parse_phonestring( $self->get($pf) ), + }; + $error = $contact_phone->insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + + if ( $self->get('emailaddress') =~ /\S/ ) { + my $contact_email = new FS::contact_email { + 'contactnum' => $self->contactnum, + 'emailaddress' => $self->get('emailaddress'), + }; + $error = $contact_email->insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + ''; + +} =item delete @@ -106,6 +160,8 @@ Delete this record from the database. # the delete method can be inherited from FS::Record +# XXX delete contact_phone, contact_email + =item replace OLD_RECORD Replaces the OLD_RECORD with this one in the database. If there is an error, @@ -113,7 +169,76 @@ returns the error, otherwise returns false. =cut -# the replace method can be inherited from FS::Record +sub replace { + my $self = shift; + + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $error = $self->SUPER::replace(@_); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + foreach my $pf ( grep { /^phonetypenum(\d+)$/ && $self->get($_) } + keys %{ $self->hashref } ) { + $pf =~ /^phonetypenum(\d+)$/ or die "wtf (daily, the)"; + my $phonetypenum = $1; + + my %cp = ( 'contactnum' => $self->contactnum, + 'phonetypenum' => $phonetypenum, + ); + my $contact_phone = qsearchs('contact_phone', \%cp) + || new FS::contact_phone \%cp; + + my %cpd = _parse_phonestring( $self->get($pf) ); + $contact_phone->set( $_ => $cpd{$_} ) foreach keys %cpd; + + my $method = $contact_phone->contactphonenum ? 'replace' : 'insert'; + + $error = $contact_phone->$method; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + ''; + +} + +#i probably belong in contact_phone.pm +sub _parse_phonestring { + my $value = shift; + + my($countrycode, $extension) = ('1', ''); + + #countrycode + if ( $value =~ s/^\s*\+\s*(\d+)// ) { + $countrycode = $1; + } else { + $value =~ s/^\s*1//; + } + #extension + if ( $value =~ s/\s*(ext|x)\s*(\d+)\s*$//i ) { + $extension = $2; + } + + ( 'countrycode' => $countrycode, + 'phonenum' => $value, + 'extension' => $extension, + ); +} =item check @@ -165,8 +290,6 @@ sub line { =head1 BUGS -The author forgot to customize this manpage. - =head1 SEE ALSO L<FS::Record>, schema.html from the base documentation. diff --git a/FS/FS/contact_phone.pm b/FS/FS/contact_phone.pm index bb9cf034d..ad8e8f737 100644 --- a/FS/FS/contact_phone.pm +++ b/FS/FS/contact_phone.pm @@ -120,7 +120,7 @@ sub check { || $self->ut_number('phonetypenum') || $self->ut_text('countrycode') || $self->ut_text('phonenum') - || $self->ut_text('extension') + || $self->ut_textn('extension') ; return $error if $error; diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 104a0c49c..4e42f8de0 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -26,7 +26,7 @@ use Tie::IxHash; use Digest::MD5 qw(md5_base64); use Date::Format; #use Date::Manip; -use File::Temp qw( tempfile ); +use File::Temp; #qw( tempfile ); use Business::CreditCard 0.28; use Locale::Country; use FS::UID qw( getotaker dbh driver_name ); |