avoid infinite looping on bad CDRs in voip_inbound, from #16723
[freeside.git] / FS / FS / part_pkg / voip_inbound.pm
index f4e5183..9054f7b 100644 (file)
@@ -227,19 +227,22 @@ sub calc_usage {
   ) {
     my $svc_phone = $cust_svc->svc_x;
 
-    foreach my $cdr ( $svc_phone->get_cdrs(
+    my $cdr_search = $svc_phone->psearch_cdrs(
       'inbound'        => 1,
       'default_prefix' => $self->option('default_prefix'),
       'status'         => '', # unprocessed only
       'for_update'     => 1,
-      )
-    ) {
+    );
+    $cdr_search->limit(1000);
+    $cdr_search->increment(0);
+    while ( my $cdr = $cdr_search->fetch ) {
 
       my $reason = $self->check_chargable( $cdr,
                                            'option_cache' => \%opt_cache,
                                          );
       if ( $reason ) {
         warn "not charging for CDR ($reason)\n" if $DEBUG;
+        $cdr_search->adjust(1);
         next;
       }
 
@@ -310,6 +313,8 @@ sub calc_usage {
       die $error if $error;
       $formatter->append($cdr);
 
+      $cdr_search->adjust(1) if $cdr->freesidestatus eq '';
+
     } #$cdr
   } # $cust_svc
 #  unshift @$details, { format => 'C',