+sub _rate_detail_factory {
+ my( $rate, $field ) = @_;
+ return sub {
+ my $rate_detail = $rate->dest_detail(shift)
+ || new FS::rate_detail { 'min_included' => 0,
+ 'min_charge' => 0,
+ 'min_cost' => 0,
+ 'sec_granularity' => 0,
+ };
+ my $value = $rate_detail->$field();
+ $field eq 'sec_granularity' ? $granularity{$value} : $value;
+ };
+}
+
+if ( $cgi->param('show_rates') ) {
+ foreach my $rate ( qsearch('rate', {}) ) {
+
+ my $label = $rate->ratenum.': '. $rate->ratename;
+ push @header, "$label: Included minutes/calls",
+ "$label: Charge per minute/call",
+ "$label: Granularity",
+ "$label: Usage class";
+
+ #closure me harder
+ push @fields, _rate_detail_factory($rate, 'min_included'),
+ _rate_detail_factory($rate, 'min_charge'),
+ _rate_detail_factory($rate, 'sec_granularity'),
+ _rate_detail_factory($rate, 'classnum');
+
+ push @links, ( ('') x 4 );
+ push @xls_format, ( ({}) x 4 );
+
+ }
+
+}
+
+sub countrycode2country {
+ my $cc = shift;
+
+ #exceptions to the below
+ return 'North America (NANPA)' if $cc eq '1';
+ #return 'Algeria' if $cc eq '214';
+ return 'Ascension Island' if $cc eq '247';
+ return 'Satellite / Maritime / Universal Personal' if $cc eq '87'; #? or 870..
+ return 'Inmarsat' if $cc eq '870';
+ return 'Global Mobile Satellite System' if $cc eq '881';
+ return 'International Networks' if $cc eq '882';
+ return 'International Networks' if $cc eq '883';
+
+ code2country(
+ Number::Phone::Country::phone2country("+$cc")
+ );
+}
+