From 811c95da18776232da103fd445e2def019f98d5b Mon Sep 17 00:00:00 2001 From: ivan Date: Sun, 1 May 2011 19:27:52 +0000 Subject: [PATCH] cdr reimporting, RT#12181 --- FS/FS/Record.pm | 17 +++++++++++++++ bin/cdr.reimport | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 bin/cdr.reimport 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"; +} + -- 2.11.0