summaryrefslogtreecommitdiff
path: root/FS/FS
diff options
context:
space:
mode:
authorivan <ivan>2010-10-14 01:14:27 +0000
committerivan <ivan>2010-10-14 01:14:27 +0000
commit7bbe939d139be7edd77378cfc9a2c3ec6287749d (patch)
tree4c43f97b729880ae191cc630d9402b843ca76870 /FS/FS
parentf839709351aee1f9488e9a26496adc564aa5b8e5 (diff)
more contact work and preliminary business card upload
Diffstat (limited to 'FS/FS')
-rw-r--r--FS/FS/Mason.pm2
-rw-r--r--FS/FS/Misc.pm36
-rw-r--r--FS/FS/Schema.pm18
-rw-r--r--FS/FS/contact.pm133
-rw-r--r--FS/FS/contact_phone.pm2
-rw-r--r--FS/FS/cust_main.pm2
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 );