allow sending email to specific contact classes, #33316
[freeside.git] / FS / FS / cust_main_Mixin.pm
index 645971c..94e6eaa 100644 (file)
@@ -380,6 +380,12 @@ HTML body
 
 Text body
 
+=item to_contact_classnum
+
+The customer contact class (or classes, as a comma-separated list) to send
+the message to. If unspecified, will be sent to any contacts that are marked
+as invoice destinations (the equivalent of specifying 'invoice').
+
 =back
 
 Returns an error message, or false for success.
@@ -403,6 +409,7 @@ sub email_search_result {
   my $subject = delete $param->{subject};
   my $html_body = delete $param->{html_body};
   my $text_body = delete $param->{text_body};
+  my $to_contact_classnum = delete $param->{to_contact_classnum};
   my $error = '';
 
   my $job = delete $param->{'job'}
@@ -455,10 +462,21 @@ sub email_search_result {
       %message = $msg_template->prepare(
         'cust_main' => $cust_main,
         'object'    => $obj,
+        'to_contact_classnum' => $to_contact_classnum,
       );
-    }
-    else {
-      my @to = $cust_main->invoicing_list_emailonly;
+
+    } else {
+      # 3.x: false laziness with msg_template.pm; on 4.x, all email notices
+      # are generated from templates and this case goes away
+      my @classes;
+      if ( $opt{'to_contact_classnum'} ) {
+        my $classnum = $opt{'to_contact_classnum'};
+        @classes = ref($classnum) ? @$classnum : split(',', $classnum);
+      }
+      if (!@classes) {
+        @classes = ( 'invoice' );
+      }
+      my @to = $cust_main->contact_list_email(@classes);
       next if !@to;
 
       %message = (
@@ -660,11 +678,25 @@ sub unsuspend_balance {
   my $maxbalance;
   if ($setting eq 'Zero') {
     $maxbalance = 0;
+
+  # kind of a pain to load/check all cust_bill instead of just open ones,
+  # but if for some reason payment gets applied to later bills before
+  # earlier ones, we still want to consider the later ones as allowable balance
   } elsif ($setting eq 'Latest invoice charges') {
     my @cust_bill = $cust_main->cust_bill();
     my $cust_bill = $cust_bill[-1]; #always want the most recent one
-    return unless $cust_bill;
-    $maxbalance = $cust_bill->charged || 0;
+    if ($cust_bill) {
+      $maxbalance = $cust_bill->charged || 0;
+    } else {
+      $maxbalance = 0;
+    }
+  } elsif ($setting eq 'Charges not past due') {
+    my $now = time;
+    $maxbalance = 0;
+    foreach my $cust_bill ($cust_main->cust_bill()) {
+      next unless $now <= ($cust_bill->due_date || $cust_bill->_date);
+      $maxbalance += $cust_bill->charged || 0;
+    }
   } elsif (length($setting)) {
     warn "Unrecognized unsuspend_balance setting $setting";
     return;