planet telecom rate import, RT#83146
[freeside.git] / bin / rate-ptelecom.import
1 #!/usr/bin/perl
2
3 use strict;
4 use Text::CSV_XS;
5 use FS::Misc::Getopt;
6 use FS::Record qw( dbh );
7 use FS::rate;
8 use FS::rate_region;
9 use FS::rate_detail;
10 use FS::rate_prefix;
11
12 our %opt;
13 getopts('d');
14
15 $FS::UID::AutoCommit = 0;
16 my $dbh = dbh;
17
18 ###
19 # import rate ("profiles")
20 ###
21
22 my $file = shift or usage();
23 open my $in, '<', $file or die "$file: $!\n";
24 my $csv = Text::CSV->new({ binary => 1, auto_diag => 2 });
25
26 my $rp = 0;
27 my %granularity = ();
28 #my %currency = ();
29
30 my %rate = ();
31 while (my $row = $csv->getline($in)) {
32
33   my $profilekey  = $row->[1];
34   my $name        = $row->[2];
35   my $granularity = $row->[5];
36   my $currency    = $row->[18];
37   my $rate = new FS::rate {
38     'ratename'     => "$currency: $name",
39     'agent_rateid' => $profilekey,
40   };
41   my $error = $rate->insert;
42   die $error if $error;
43
44   $granularity{$rate->ratenum} = $granularity;
45
46   $rate{$profilekey} = $rate;
47
48   $rp++;
49 }
50
51 ###
52 # import rate_region and rate_detail ("destination rates")
53 ###
54
55 my $rfile = shift or usage();
56 open my $rin, '<', $rfile or die "$rfile: $!\n";
57
58 my $header = <$rin>;
59
60 my $rr = 0;
61 my $rd = 0;
62 my %rate_region;
63 while( my $row = $csv->getline($rin) ) {
64
65   my( $profilekey, $currency, $destid, $profilerate, $destkey ) = @$row;
66
67
68   my $rate = $rate{$profilekey};
69   my $ratecurrency = (split(':', $rate->ratename) )[0];
70   die "currency mismatch" unless $currency eq $ratecurrency;
71
72   unless ( $rate_region{ $destkey } ) {
73
74     if ( $destid =~ /^(.*)\n\1$/ ) {
75       $destid = $1;
76       #warn $destid;
77     }
78
79     my $rate_region = new FS::rate_region {
80       'regionname'     => $destid,
81       'agent_regionid' => $destkey,
82     };
83     my $error = $rate_region->insert;
84     die $error if $error;
85     warn "$destkey: $destid\n";
86
87     $rate_region{$destkey} = $rate_region;
88     $rr++;
89   }
90
91   my $rate_detail = new FS::rate_detail {
92     'ratenum'         => $rate->ratenum,
93     'dest_regionnum'  => $rate_region{$destkey}->regionnum,
94     'min_charge'      => $profilerate,
95     'sec_granularity' => $granularity{ $rate->ratenum },
96     'min_included'    => 0,
97   };
98   my $error = $rate_detail->insert;
99   die $error if $error;
100
101   $rd++;
102
103 }
104
105 ###
106 # import rate_prefix ("country")
107 ###
108
109 my $pfile = shift or usage();
110 open my $pin, '<', $pfile or die "$pfile: $!\n";
111
112 my $rx = 0;
113 while( my $row = $csv->getline($pin) ) {
114   my $destkey     = $row->[1];
115   my $prefix      = $row->[4];
116   my $countrycode = $row->[20];
117   #my $npa         = $row->[21];
118   #my $npa2        = $row->[22];
119   my $pattern     = $row->[24];
120
121   #$npa  = '' if $npa  eq 'NULL';
122   #$npa2 = '' if $npa2 eq 'NULL';
123
124   die "destkey $destkey: $prefix ne $pattern\n"
125     if $prefix ne $pattern;
126
127   if ( $countrycode eq 'NULL' ) {
128     warn "destkey $destkey: countrycode is null for prefix $prefix; skipping\n";
129     next;
130   }
131
132   my $rate_region = $rate_region{$destkey}
133     or do {
134              warn "destkey $destkey: not found for prefix $prefix; skipping\n";
135              next;
136           };
137
138   $prefix =~ s/^\Q$countrycode\E//;
139   $prefix =~ s/ //g;
140   $prefix =~ s/\.$//;
141
142   my $rate_prefix = new FS::rate_prefix {
143     'regionnum'   => $rate_region->regionnum,
144     'countrycode' => $countrycode,
145     'npa'         => $prefix,
146   };
147   my $error = $rate_prefix->insert;
148   die "error inserting rate_prefix: $error for cc $countrycode prefix $prefix"
149     if $error;
150
151   $rx++;
152
153   #print '.' if $rx % 1000 == 0;
154 }
155 print "\n";
156
157 if ( $opt{d} ) {
158   dbh->rollback;
159   print STDERR "(dry run) ";
160 } else {
161   dbh->commit;
162 }
163
164 print "Inserted $rd rates for $rr regions with $rx prefixes in $rp rate plans\n";
165
166 1;
167
168 sub usage {
169   die "Usage: rate-ptelecom.import [ -d ] <user> profiledestinationrates.csv callratingprofiles.csv country.csv\n"
170 }
171