summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2012-09-23 18:07:47 -0700
committerIvan Kohler <ivan@freeside.biz>2012-09-23 18:07:47 -0700
commit36a1e9c1661fb552d368f2f675dcb0793d733748 (patch)
treea4d2e0c2bb10ae1f49017ea1a900f72c7dd48a75 /FS
parentaa38c070977cf63365a4d26a3e4a7e5049ad70d0 (diff)
export host selection per service, RT#17914
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/Mason.pm1
-rw-r--r--FS/FS/Schema.pm3
-rw-r--r--FS/FS/svc_Common.pm54
-rw-r--r--FS/FS/svc_export_machine.pm19
4 files changed, 66 insertions, 11 deletions
diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm
index 39c7dfd..11af25e 100644
--- a/FS/FS/Mason.pm
+++ b/FS/FS/Mason.pm
@@ -325,6 +325,7 @@ if ( -e $addl_handler_use_file ) {
use FS::cust_tax_exempt_pkg_void;
use FS::cust_bill_pkg_discount_void;
use FS::agent_pkg_class;
+ use FS::svc_export_machine;
# Sammath Naur
if ( $FS::Mason::addl_handler_use ) {
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index 6e3956a..7be8c66 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -1894,10 +1894,11 @@ sub tables_hashref {
'columns' => [
'svcexportmachinenum', 'serial', '', '', '', '',
'svcnum', 'int', '', '', '', '',
+ 'exportnum', 'int', '', '', '', '',
'machinenum', 'int', '', '', '', '',
],
'primary_key' => 'svcexportmachinenum',
- 'unique' => [],
+ 'unique' => [ ['svcnum', 'exportnum'] ],
'index' => [],
},
diff --git a/FS/FS/svc_Common.pm b/FS/FS/svc_Common.pm
index a6daf44..7aede54 100644
--- a/FS/FS/svc_Common.pm
+++ b/FS/FS/svc_Common.pm
@@ -200,12 +200,13 @@ I<depend_jobnum>.
If I<jobnum> is set to an array reference, the jobnums of any export jobs will
be added to the referenced array.
-If I<child_objects> is set to an array reference of FS::tablename objects (for
-example, FS::acct_snarf objects), they will have their svcnum field set and
-will be inserted after this record, but before any exports are run. Each
-element of the array can also optionally be a two-element array reference
-containing the child object and the name of an alternate field to be filled in
-with the newly-inserted svcnum, for example C<[ $svc_forward, 'srcsvc' ]>
+If I<child_objects> is set to an array reference of FS::tablename objects
+(for example, FS::svc_export_machine or FS::acct_snarf objects), they
+will have their svcnum field set and will be inserted after this record,
+but before any exports are run. Each element of the array can also
+optionally be a two-element array reference containing the child object
+and the name of an alternate field to be filled in with the newly-inserted
+svcnum, for example C<[ $svc_forward, 'srcsvc' ]>
If I<depend_jobnum> is set (to a scalar jobnum or an array reference of
jobnums), all provisioning jobs will have a dependancy on the supplied
@@ -439,7 +440,16 @@ sub expire {
Replaces OLD_RECORD with this one. If there is an error, returns the error,
otherwise returns false.
-Currently available options are: I<export_args> and I<depend_jobnum>.
+Currently available options are: I<child_objects>, I<export_args> and
+I<depend_jobnum>.
+
+If I<child_objects> is set to an array reference of FS::tablename objects
+(for example, FS::svc_export_machine or FS::acct_snarf objects), they
+will have their svcnum field set and will be inserted or replaced after
+this record, but before any exports are run. Each element of the array
+can also optionally be a two-element array reference containing the
+child object and the name of an alternate field to be filled in with
+the newly-inserted svcnum, for example C<[ $svc_forward, 'srcsvc' ]>
If I<depend_jobnum> is set (to a scalar jobnum or an array reference of
jobnums), all provisioning jobs will have a dependancy on the supplied
@@ -462,6 +472,8 @@ sub replace {
? shift
: { @_ };
+ my $objects = $options->{'child_objects'} || [];
+
my @jobnums = ();
local $FS::queue::jobnums = \@jobnums;
warn "[$me] replace: set \$FS::queue::jobnums to $FS::queue::jobnums\n"
@@ -511,6 +523,34 @@ sub replace {
return $error;
}
+ foreach my $object ( @$objects ) {
+ my($field, $obj);
+ if ( ref($object) eq 'ARRAY' ) {
+ ($obj, $field) = @$object;
+ } else {
+ $obj = $object;
+ $field = 'svcnum';
+ }
+ $obj->$field($new->svcnum);
+
+ my $oldobj = qsearchs( $obj->table, {
+ $field => $new->svcnum,
+ map { $_ => $obj->$_ } $obj->_svc_child_partfields,
+ });
+
+ if ( $oldobj ) {
+ my $pkey = $oldobj->primary_key;
+ $obj->$pkey($oldobj->$pkey);
+ $obj->replace($oldobj);
+ } else {
+ $error = $obj->insert;
+ }
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+
#new-style exports!
unless ( $noexport_hack ) {
diff --git a/FS/FS/svc_export_machine.pm b/FS/FS/svc_export_machine.pm
index 39629d8..10f7b68 100644
--- a/FS/FS/svc_export_machine.pm
+++ b/FS/FS/svc_export_machine.pm
@@ -2,10 +2,13 @@ package FS::svc_export_machine;
use strict;
use base qw( FS::Record );
-use FS::Record; # qw( qsearch qsearchs );
+use FS::Record qw( qsearchs ); #qsearch );
use FS::cust_svc;
+use FS::part_export;
use FS::part_export_machine;
+sub _svc_child_partfields { ('exportnum') };
+
=head1 NAME
FS::svc_export_machine - Object methods for svc_export_machine records
@@ -89,14 +92,24 @@ sub check {
my $error =
$self->ut_numbern('svcexportmachinenum')
- || $self->ut_foreign_key('svcnum', 'cust_svc', 'svcnum')
- || $self->ut_foreign_key('machinenum', 'part_export_machine', 'machinenum' )
+ || $self->ut_foreign_key('svcnum', 'cust_svc', 'svcnum' )
+ || $self->ut_foreign_key('exportnum', 'part_export', 'exportnum' )
+ || $self->ut_foreign_key('machinenum', 'part_export_machine', 'machinenum')
;
return $error if $error;
$self->SUPER::check;
}
+=item part_export_machine
+
+=cut
+
+sub part_export_machine {
+ my $self = shift;
+ qsearchs('part_export_machine', { 'machinenum' => $self->machinenum } );
+}
+
=back
=head1 BUGS