eWay self-signup fixes
[freeside.git] / FS / FS / contact.pm
index d3ab411..774aed0 100644 (file)
@@ -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.