diff options
author | mark <mark> | 2010-10-28 07:47:13 +0000 |
---|---|---|
committer | mark <mark> | 2010-10-28 07:47:13 +0000 |
commit | 696b790c88984203912b46c9e4b103c2925833c1 (patch) | |
tree | c4758161e2185f6ee431431cd3fd8247347f7635 /FS/FS/svc_Common.pm | |
parent | 794e709ef65adb15d75a02ca9fd53d2a2caa5f8b (diff) |
global duplicate checking on svc_pbx.id, RT#9967
Diffstat (limited to 'FS/FS/svc_Common.pm')
-rw-r--r-- | FS/FS/svc_Common.pm | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/FS/FS/svc_Common.pm b/FS/FS/svc_Common.pm index 71290f4..e0f1e33 100644 --- a/FS/FS/svc_Common.pm +++ b/FS/FS/svc_Common.pm @@ -1013,6 +1013,42 @@ sub clone_kludge_unsuspend { shift; } +=item find_duplicates MODE FIELDS... + +Method used by _check_duplicate routines to find services with duplicate +values in specified fields. Set MODE to 'global' to search across all +services, or 'export' to limit to those that share one or more exports +with this service. FIELDS is a list of field names; only services +matching in all fields will be returned. Empty fields will be skipped. + +=cut + +sub find_duplicates { + my $self = shift; + my $mode = shift; + my @fields = @_; + + my %search = map { $_ => $self->getfield($_) } + grep { length($self->getfield($_)) } @fields; + return () if !%search; + my @dup = grep { ! $self->svcnum or $_->svcnum != $self->svcnum } + qsearch( $self->table, \%search ); + return () if !@dup; + return @dup if $mode eq 'global'; + die "incorrect find_duplicates mode '$mode'" if $mode ne 'export'; + + my $exports = FS::part_export::export_info($self->table); + my %conflict_svcparts; + my $part_svc = $self->part_svc; + foreach my $part_export ( $part_svc->part_export ) { + %conflict_svcparts = map { $_->svcpart => 1 } $part_export->export_svc; + } + return grep { $conflict_svcparts{$_->cust_svc->svcpart} } @dup; +} + + + + =back =head1 BUGS |