fix A/R report
[freeside.git] / bin / convert-477-options
index 48a5264..be37b41 100755 (executable)
@@ -60,36 +60,45 @@ my @voip_option = (
   'media:Other'
 );
 
-my %num_to_formkey = map { $_->formvalue => $_->formkey }
-                      qsearch('fcc477map', {});
+my %num_to_formkey; # o2m
+foreach ( qsearch('fcc477map', {}) ) {
+  push @{ $num_to_formkey{$_->formvalue} ||= [] }, $_->formkey;
+}
 
 sub report_option_to_fcc_option {
   my $report_option_num = shift;
-  my $formkey = $num_to_formkey{$report_option_num}
+  my $formkeys = $num_to_formkey{$report_option_num}
     or return;
-  if      ($formkey =~ /^part1_column_option_(\d+)/) {
-    #download speed
-    return (broadband_downstream => $min_download_speed[$1]);
-  } elsif ($formkey =~ /^part1_row_option_(\d+)/) {
-    #upload speed
-    return (broadband_upstream   => $min_upload_speed[$1]);
-  } elsif ($formkey =~ /^part1_technology_option_(\d+)/) {
-    #broadband tech
-    return (is_broadband  => 1,
-            media         => $media_type[$1],
-            technology    => $technology[$1]);
-  } elsif ($formkey =~ /^part2a_row_option_(\d+)/) {
-    #local phone options
-    return (media => 'Copper', # sensible default
-            split(':', $phone_option[$1])
-           );
-  } elsif ($formkey =~ /^part2b_row_option_(\d+)/) {
-    #VoIP options (are all media types)
-    return (split(':', $voip_option[$1]));
-  } else {
-    warn "can't parse option with formkey '$formkey'\n";
-    return;
+  my @return;
+  foreach my $formkey (@$formkeys) {
+    if      ($formkey =~ /^part1_column_option_(\d+)/) {
+      #download speed
+      push @return, (broadband_downstream => $min_download_speed[$1]);
+    } elsif ($formkey =~ /^part1_row_option_(\d+)/) {
+      #upload speed
+      push @return, (broadband_upstream   => $min_upload_speed[$1]);
+    } elsif ($formkey =~ /^part1_technology_option_(\d+)/) {
+      #broadband tech
+      push @return, 
+             (is_broadband  => 1,
+              media         => $media_type[$1],
+              technology    => $technology[$1]);
+    } elsif ($formkey =~ /^part2a_row_option_(\d+)/) {
+      #local phone options
+      push @return,
+             (media => 'Copper', # sensible default
+              split(':', $phone_option[$1])
+             );
+    } elsif ($formkey =~ /^part2b_row_option_(\d+)/) {
+      #VoIP options (are all media types)
+      push @return, (split(':', $voip_option[$1]));
+    } elsif ($formkey =~ /^part5_report_option/) {
+      # ignore this
+    } else {
+      warn "can't parse option with formkey '$formkey'\n";
+    }
   }
+  @return;
 }
 
 for my $part_pkg (qsearch('part_pkg', { freq => {op => '!=', value => '0'}})) {
@@ -103,26 +112,32 @@ for my $part_pkg (qsearch('part_pkg', { freq => {op => '!=', value => '0'}})) {
     push @fcc_opts, report_option_to_fcc_option($num);
   }
   # other special stuff:
-  # FCC voice class (VoIP OTT, VoIP + broadband)
-  if ($part_pkg->fcc_voip_class == 1) {
-    push @fcc_opts, 'is_voip' => 1;
-  } elsif ( $part_pkg->fcc_voip_class == 2) {
-    push @fcc_opts, 'is_voip' => 1, 'is_broadband' => 1;
-  }
-  # DS0 equivalent lines
-  if ( $part_pkg->fcc_ds0s ) {
-    if ($part_pkg->fcc_voip_class) {
-      # there's no such thing as a VoIP DS0 equivalent, but this is
-      # what we used the field for
-      push @fcc_opts, 'voip_lines' => $part_pkg->fcc_ds0s;
+  # FCC voice class (VoIP OTT, VoIP + broadband, Wholesale VoIP, Local
+  # Exchange) and DS0 equivalent lines
+  my $sessions = $part_pkg->fcc_ds0s;
+
+  if ( $sessions ) { # then this is a voice package of some kind
+    if ($part_pkg->fcc_voip_class == 1) {
+      # VoIP OTT (connection not included)
+      push @fcc_opts, 'is_voip' => 1, 'voip_ott' => 1,
+                      'voip_sessions' => $sessions;
+    } elsif ( $part_pkg->fcc_voip_class == 2) {
+      # VoIP non-OTT; do not set is_broadband since the connection is not 
+      # necessarily general Internet access
+      push @fcc_opts, 'is_voip' => 1,
+                      'voip_sessions' => $sessions;
+    } elsif ( $part_pkg->fcc_voip_class == 3 ) {
+      # wholesale VoIP; apparently no longer reportable?
     } else {
-      push @fcc_opts, 'phone_lines' => $part_pkg->fcc_ds0s, 'is_phone' => 1;
+      # local exchange telephone
+      push @fcc_opts, 'is_phone' => 1,
+                      'phone_lines' => $sessions;
     }
   }
 
   my %fcc_opts = @fcc_opts;
   #print map {"\t$_\t".$fcc_opts{$_}."\n"} keys %fcc_opts;
-  my $error = $part_pkg->process_fcc_options(\%fcc_opts);
+  my $error = $part_pkg->set_fcc_options(\%fcc_opts);
   if ( $error ) {
     die "$error\n";
   }