+=cut
+
+sub replace {
+ my $self = shift;
+ my $old = $self->replace_old;
+
+ local $SIG{HUP} = 'IGNORE';
+ 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;
+
+ if ( $self->part_export_machine_textarea ) {
+
+ my %part_export_machine = map { $_->machine => $_ }
+ $self->part_export_machine;
+
+ my @machines = map { $_ =~ s/^\s+//; $_ =~ s/\s+$//; $_ }
+ grep /\S/,
+ split /[\n\r]{1,2}/,
+ $self->part_export_machine_textarea;
+
+ foreach my $machine ( @machines ) {
+
+ if ( $part_export_machine{$machine} ) {
+
+ if ( $part_export_machine{$machine}->disabled eq 'Y' ) {
+ $part_export_machine{$machine}->disabled('');
+ $error = $part_export_machine{$machine}->replace;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+
+ if ( $self->default_machine_name eq $machine ) {
+ $self->default_machine( $part_export_machine{$machine}->machinenum );
+ }
+
+ delete $part_export_machine{$machine}; #so we don't disable it below
+
+ } else {
+
+ my $part_export_machine = new FS::part_export_machine {
+ 'exportnum' => $self->exportnum,
+ 'machine' => $machine
+ };
+ $error = $part_export_machine->insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+
+ if ( $self->default_machine_name eq $machine ) {
+ $self->default_machine( $part_export_machine->machinenum );
+ }
+ }
+
+ }
+
+ foreach my $part_export_machine ( values %part_export_machine ) {
+ $part_export_machine->disabled('Y');
+ $error = $part_export_machine->replace;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+
+ if ( $old->machine ne '_SVC_MACHINE' ) {
+ # then set up the default for any already-attached export_svcs
+ foreach my $export_svc ( $self->export_svc ) {
+ my @svcs = qsearch('cust_svc', { 'svcpart' => $export_svc->svcpart });
+ foreach my $cust_svc ( @svcs ) {
+ my $svc_export_machine = FS::svc_export_machine->new({
+ 'exportnum' => $self->exportnum,
+ 'svcnum' => $cust_svc->svcnum,
+ 'machinenum' => $self->default_machine,
+ });
+ $error ||= $svc_export_machine->insert;
+ }
+ }
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ } # if switching to selectable hosts
+
+ } elsif ( $old->machine eq '_SVC_MACHINE' ) {
+ # then we're switching from selectable to non-selectable
+ foreach my $svc_export_machine (
+ qsearch('svc_export_machine', { 'exportnum' => $self->exportnum })
+ ) {
+ $error ||= $svc_export_machine->delete;
+ }
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+
+ }
+
+ $error = $self->SUPER::replace(@_);
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+
+ if ( $self->machine eq '_SVC_MACHINE' and ! $self->default_machine ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "no default export host selected";
+ }
+
+ $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+ '';