deb 9
[freeside.git] / bin / cdr.reimport
1 #!/usr/bin/perl
2 #
3 # Usage:
4 #  cdr.reimport user format filename
5 #
6
7 use strict;
8 use FS::UID qw(adminsuidsetup);
9 use FS::Record qw(qsearch);
10 use FS::cdr;
11
12 my $user = shift or die &usage;
13 adminsuidsetup $user;
14
15 my $format = shift or die &usage;
16
17 my $file = shift;
18
19 my($new, $rep, $skip) = (0, 0, 0);
20
21 #this is what makes it a reimport and should probably be moved to cdr.pm
22 my $cb = sub {
23   my($cdr, $param) = @_;
24
25   my @exists = qsearch('cdr', {
26     map { $_ => $cdr->$_() }
27       qw( uniqueid startdate enddate src dst charged_party )
28   });
29
30   unless ( scalar(@exists) ) {
31     $new++;
32     return;
33   }
34
35   if ( scalar(@exists) == 2 ) {
36     if ( $exists[0]->freesidestatus || $exists[1]->freesidestatus ) {
37       return "processed double record for uniqueid ". $cdr->uniqueid. "\n";
38     }
39     warn "deleting double record for uniqueid ". $cdr->uniqueid. "\n";
40     my $extra = shift @exists;
41     my $error = $extra->delete;
42     return $error if $error;
43   }
44
45   return "too many matches (". scalar(@exists). ") found!"
46     if scalar(@exists) > 1;
47
48   my $exists = $exists[0];
49   if ( $exists->freesidestatus ) {
50     $skip++;
51     $param->{skiprow} = 1;
52   } else {
53     $rep++;
54     my $error = $exists->delete;
55     return $error if $error;
56   }
57
58   return '';
59
60 };
61
62 my $error = FS::cdr::batch_import( {
63   'file'               => $file,
64   'format'             => $format,
65   'batch_namevalue'    => $file."-REIMPORT$$",
66   'preinsert_callback' => $cb,
67 } );
68 die $error if $error;
69
70 warn "$skip skipped, $rep replaced, $new new\n";
71
72 sub usage {
73   "Usage: \n  cdr.reimport user format filename\n";
74 }
75