summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivan <ivan>2011-05-01 19:27:52 +0000
committerivan <ivan>2011-05-01 19:27:52 +0000
commit811c95da18776232da103fd445e2def019f98d5b (patch)
tree8aa6dae300f9717d7a9b0bbdd4cd07a77f8a900e
parentab1ec8c254827cee30244d79a3c4544bf6946abc (diff)
cdr reimporting, RT#12181
-rw-r--r--FS/FS/Record.pm17
-rw-r--r--bin/cdr.reimport64
2 files changed, 81 insertions, 0 deletions
diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm
index 28d0d4f33..3511fe7f0 100644
--- a/FS/FS/Record.pm
+++ b/FS/FS/Record.pm
@@ -1633,6 +1633,8 @@ Class method for batch imports. Available params:
=item fields - Alternate way to specify import, specifying import fields directly as a listref
+=item preinsert_callback
+
=item postinsert_callback
=item params
@@ -1667,9 +1669,14 @@ sub batch_import {
my( $type, $header, $sep_char, $fixedlength_format,
$xml_format, $row_callback, @fields );
+
my $postinsert_callback = '';
$postinsert_callback = $param->{'postinsert_callback'}
if $param->{'postinsert_callback'};
+ my $preinsert_callback = '';
+ $preinsert_callback = $param->{'preinsert_callback'}
+ if $param->{'preinsert_callback'};
+
if ( $param->{'format'} ) {
my $format = $param->{'format'};
@@ -1917,6 +1924,16 @@ sub batch_import {
}
next if exists( $param->{skiprow} );
+ if ( $preinsert_callback ) {
+ my $error = &{$postinsert_callback}($record, $param);
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "preinsert_callback error". ( $line ? " for $line" : '' ).
+ ": $error";
+ }
+ next if exists $param->{skiprow} && $param->{skiprow};
+ }
+
my $error = $record->insert;
if ( $error ) {
diff --git a/bin/cdr.reimport b/bin/cdr.reimport
new file mode 100644
index 000000000..42492b0ee
--- /dev/null
+++ b/bin/cdr.reimport
@@ -0,0 +1,64 @@
+#!/usr/bin/perl
+#
+# Usage:
+# cdr.reimport user format filename
+#
+
+use strict;
+use FS::UID qw(adminsuidsetup);
+use FS::Record qw(qsearch);
+use FS::cdr;
+
+my $user = shift or die &usage;
+adminsuidsetup $user;
+
+my $format = shift or die &usage;
+
+my $file = shift;
+
+my($new, $rep, $skip) = (0, 0, 0);
+
+#this is what makes it a reimport and should probably be moved to cdr.pm
+my $cb = sub {
+ my($cdr, $param) = @_;
+
+ my @exists = qsearch({
+ 'table' => 'cdr',
+ 'hashref' => { 'uniqueid' => $cdr->uniqueid,
+ 'src' => $cdr->src,
+ 'startdate' => $cdr->startdate,
+ },
+ });
+
+ unless ( scalar(@exists) ) {
+ $new++;
+ return;
+ }
+ die "too many matches found!" if scalar(@exists) > 1;
+
+ my $exists = $exists[0];
+ if ( $exists->freesidestatus ) {
+ $skip++;
+ $param->{skiprow} = 1;
+ } else {
+ $rep++;
+ my $error = $exists->delete;
+ die $error if $error;
+ }
+
+};
+
+my $error = FS::cdr::batch_import( {
+ 'file' => $file,
+ 'format' => $format,
+ 'batch_namevalue' => $file,
+ 'preinsert_callback' => $cb,
+} );
+die $error if $error;
+
+warn "$skip skipped, $rep replaced, $new new\n";
+
+sub usage {
+ "Usage: \n cdr.reimport user format filename\n";
+}
+