71513: Card tokenization [upgrade implemented]
[freeside.git] / bin / rate-domestic-flat.import
1 #!/usr/bin/perl
2
3 use strict;
4 use Text::CSV;
5 use FS::Misc::Getopt;
6 use FS::Record qw(qsearchs qsearch dbh);
7 use FS::rate;
8 use FS::rate_region;
9 use FS::rate_prefix;
10 use FS::rate_detail;
11
12 our %opt;
13 getopts('r:g:'); # ratename, granularity
14
15 $FS::UID::AutoCommit = 0;
16 my $dbh = dbh;
17
18 my $file = shift or usage();
19 open my $in, '<', $file or die "$file: $!\n";
20 my $csv = Text::CSV->new({ binary => 1, auto_diag => 2 });
21 # set header row
22 $csv->column_names($csv->getline($in));
23 # Format:
24 # Destination (regionname)
25 # BilledPrefix (prefix)
26 # RetailRate (per minute)
27
28 my $error;
29
30 my $granularity = $opt{g} || 1;
31
32 usage() unless $opt{r};
33 my $rate = qsearchs('rate', { 'ratename' => $opt{r} });
34 if (!$rate) {
35   $rate = FS::rate->new({ 'ratename' => $opt{r} });
36   $error = $rate->insert;
37   die $error if $error;
38 }
39
40 while (my $row = $csv->getline_hr($in)) {
41   print $csv->string;
42
43   my $region = qsearchs('rate_region', {
44       'regionname' => $row->{'Destination'}
45   });
46   if (!$region) {
47     $region = FS::rate_region->new({
48       'regionname' => $row->{'Destination'}
49     });
50     $error = $region->insert;
51     die $error if $error;
52   }
53
54   my $prefix = $row->{'BilledPrefix'};
55   $prefix =~ s/^1//;
56
57   my %prefix = (
58       'countrycode' => '1',
59       'npa'         => $prefix,
60   );
61   my $rate_prefix = qsearchs('rate_prefix', \%prefix);
62   if (!$rate_prefix) {
63     $rate_prefix = FS::rate_prefix->new(\%prefix);
64     $rate_prefix->set('regionnum', $region->regionnum);
65     $error = $rate_prefix->insert;
66   } else {
67     $rate_prefix->set('regionnum', $region->regionnum);
68     $error = $rate_prefix->replace;
69   }
70   die $error if $error;
71
72   # enough to identify the detail
73   my %detail = (
74     'ratenum'         => $rate->ratenum,
75     'dest_regionnum'  => $region->regionnum,
76     'cdrtypenum'      => '',
77     'ratetimenum'     => '',
78   );
79   my $dest_detail = qsearchs('rate_detail', \%detail);
80   # ProfileRate is 5 decimal places, same as rate_detail.min_charge
81   if (!$dest_detail) {
82     $dest_detail = FS::rate_detail->new({
83         %detail,
84         'min_included'    => 0,
85         'min_charge'      => $row->{RetailRate},
86         'sec_granularity' => $granularity,
87     });
88     $error = $dest_detail->insert;
89   } else {
90     local $FS::Record::nowarn_identical = 1;
91     $dest_detail->set('min_charge' => $row->{RetailRate});
92     $error = $dest_detail->replace;
93   }
94   die $error if $error;
95 }
96 dbh->commit;
97 print "Finished.\n";
98
99
100 sub usage {
101   die "Usage: rate-intl.import -r ratename
102                              [ -g granularity ]
103                               <user> <file>.csv\n\n";
104 }
105