*** empty log message ***
[freeside.git] / httemplate / edit / part_bill_event.cgi
index 30a60ea..57eedbc 100755 (executable)
@@ -1,4 +1,4 @@
-<!-- mason kludge -->
+<!--mason kludge-->
 <%
 
 if ( $cgi->param('eventpart') && $cgi->param('eventpart') =~ /^(\d+)$/ ) {
@@ -20,54 +20,121 @@ if ( $query && $query =~ /^(\d+)$/ ) {
 } else {
   $part_bill_event ||= new FS::part_bill_event {};
 }
-$action ||= $part_bill_event->pkgpart ? 'Edit' : 'Add';
+$action ||= $part_bill_event->eventpart ? 'Edit' : 'Add';
 my $hashref = $part_bill_event->hashref;
 
-print header("$action Invoice Event Definition", menubar(
-  'Main Menu' => popurl(2),
-  'View all invoice events' => popurl(2). 'browse/part_bill_event.cgi',
-));
+%>
 
-print qq!<FONT SIZE="+1" COLOR="#ff0000">Error: !, $cgi->param('error'),
-      "</FONT>"
-  if $cgi->param('error');
+<%= include('/elements/header.html',
+      "$action Invoice Event Definition",
+      menubar(
+        'Main Menu' => popurl(2),
+        'View all invoice events' => popurl(2). 'browse/part_bill_event.cgi',
+      )
+    )
+%>
 
-print '<FORM ACTION="', popurl(1), 'process/part_bill_event.cgi" METHOD=POST>'.
-      '<INPUT TYPE="hidden" NAME="eventpart" VALUE="'.
-      $part_bill_event->eventpart  .'">';
-print "Invoice Event #", $hashref->{eventpart} ? $hashref->{eventpart} : "(NEW)";
+<% if ( $cgi->param('error') ) { %>
+  <FONT SIZE="+1" COLOR="#ff0000">Error: <%= $cgi->param('error') %></FONT>
+<% } %>
 
-print ntable("#cccccc",2), <<END;
-<TR><TD ALIGN="right">Payby</TD><TD><SELECT NAME="payby">
-END
+<FORM ACTION="<%= popurl(1) %>process/part_bill_event.cgi" METHOD=POST>
+<INPUT TYPE="hidden" NAME="eventpart" VALUE="<%= $part_bill_event->eventpart %>">
+Invoice Event #<%= $hashref->{eventpart} ? $hashref->{eventpart} : "(NEW)" %>
 
-for (qw(CARD CHEK LECB BILL COMP)) {
-  print qq!<OPTION VALUE="$_"!;
-  if ($part_bill_event->payby eq $_) {
-    print " SELECTED>$_</OPTION>";
-  } else {
-    print ">$_</OPTION>";
-  }
-}
+<%=  ntable("#cccccc",2) %>
 
-my $days = $hashref->{seconds}/86400;
+  <TR>
+    <TD ALIGN="right">Event name </TD>
+    <TD><INPUT TYPE="text" NAME="event" VALUE="<%= $hashref->{event} %>"></TD>
+  </TR>
 
-print <<END;
-</SELECT></TD></TR>
-<TR><TD ALIGN="right">Event</TD><TD><INPUT TYPE="text" NAME="event" VALUE="$hashref->{event}"></TD></TR>
-<TR><TD ALIGN="right">After</TD><TD><INPUT TYPE="text" NAME="days" VALUE="$days"> days</TD></TR>
-END
+  <TR>
+    <TD ALIGN="right">For </TD>
+    <TD>
+      <SELECT NAME="payby">
+
+        <% tie my %payby, 'Tie::IxHash', FS::payby->cust_payby2longname;
+           foreach my $payby ( keys %payby ) {
+        %>
+
+          <OPTION VALUE="<%= $payby %>"<%= ($part_bill_event->payby eq $payby) ? ' SELECTED' : '' %>><%= $payby{$payby} %></OPTION>
+
+        <% } %>
+
+      </SELECT> customers
+    </TD>
+  </TR>
+
+  <% my $days = $hashref->{seconds}/86400; %>
 
-print '<TR><TD ALIGN="right">Disabled</TD><TD>';
-print '<INPUT TYPE="checkbox" NAME="disabled" VALUE="Y"';
-print ' CHECKED' if $hashref->{disabled} eq "Y";
-print '>';
-print '</TD></TR>';
+  <TR>
+    <TD ALIGN="right">After</TD>
+    <TD><INPUT TYPE="text" NAME="days" VALUE="<%= $days %>"> days</TD>
+  </TR>
 
-print '<TR><TD ALIGN="right">Action</TD><TD>';
+  <TR>
+    <TD ALIGN="right">Test event</TD>
+    <TD>
+      <SELECT NAME="freq">
+
+        <% tie my %freq, 'Tie::IxHash', '1d' => 'daily', '1m' => 'monthly';
+           foreach my $freq ( keys %freq ) {
+        %>
+
+          <OPTION VALUE="<%= $freq %>"<%= ($part_bill_event->freq eq $freq) ? ' SELECTED' : '' %>><%= $freq{$freq} %></OPTION>
+
+        <% } %>
+
+      </SELECT>
+    </TD>
+  </TR>
+
+
+  <TR>
+    <TD ALIGN="right">Disabled</TD>
+    <TD>
+      <INPUT TYPE="checkbox" NAME="disabled" VALUE="Y"<%= $hashref->{disabled} eq 'Y' ? ' CHECKED' : '' %>>
+    </TD>
+  </TR>
+
+  <TR>
+    <TD VALIGN="top" ALIGN="right">Action</TD>
+    <TD>
+
+<%
 
 #print ntable();
 
+sub select_pkgpart {
+  my $label = shift;
+  my $plandata = shift;
+  my %selected = map { $_=>1 } split(/,\s*/, $plandata->{$label});
+  qq(<SELECT NAME="$label" MULTIPLE>).
+  join("\n", map {
+    '<OPTION VALUE="'. $_->pkgpart. '"'.
+    ( $selected{$_->pkgpart} ? ' SELECTED' : '' ).
+    '>'. $_->pkg. ' - '. $_->comment
+  } qsearch('part_pkg', { 'disabled' => '' } ) ).
+  '</SELECT>';
+}
+
+sub select_agentnum {
+  my $plandata = shift;
+  #my $agentnum = $plandata->{'agentnum'};
+  my %agentnums = map { $_=>1 } split(/,\s*/, $plandata->{'agentnum'});
+  '<SELECT NAME="agentnum" MULTIPLE>'.
+  join("\n", map {
+    '<OPTION VALUE="'. $_->agentnum. '"'.
+    ( $agentnums{$_->agentnum} ? ' SELECTED' : '' ).
+    '>'. $_->agent
+  } qsearch('agent', { 'disabled' => '' } ) ).
+  '</SELECT>';
+}
+
+my $conf = new FS::Conf;
+my $money_char = $conf->config('money_char') || '$';
+
 #this is pretty kludgy right here.
 tie my %events, 'Tie::IxHash',
 
@@ -84,6 +151,24 @@ tie my %events, 'Tie::IxHash',
     'code'   => '$cust_main->suspend();',
     'weight' => 10,
   },
+  'suspend-if-balance' => {
+    'name'   => 'Suspend if balance (this invoice and previous) over',
+    'code'   => '$cust_bill->cust_suspend_if_balance_over( %%%balanceover%%% );',
+    'html'   => " $money_char ". '<INPUT TYPE="text" SIZE="7" NAME="balanceover" VALUE="%%%balanceover%%%">',
+    'weight' => 10,
+  },
+  'suspend-if-pkgpart' => {
+    'name'   => 'Suspend packages',
+    'code'   => '$cust_main->suspend_if_pkgpart(%%%if_pkgpart%%%);',
+    'html'   => sub { &select_pkgpart('if_pkgpart', @_) },
+    'weight' => 10,
+  },
+  'suspend-unless-pkgpart' => {
+    'name'   => 'Suspend packages except',
+    'code'   => '$cust_main->suspend_unless_pkgpart(%%%unless_pkgpart%%%);',
+    'html'   => sub { &select_pkgpart('unless_pkgpart', @_) },
+    'weight' => 10,
+  },
   'cancel' => {
     'name'   => 'Cancel',
     'code'   => '$cust_main->cancel();',
@@ -114,6 +199,12 @@ tie my %events, 'Tie::IxHash',
     'weight' => 30,
   },
 
+  'realtime-lec' => {
+    'name' => 'Run phone bill ("LEC") billing with a <a href="http://search.cpan.org/search?mode=module&query=Business%3A%3AOnlinePayment">Business::OnlinePayment</a> realtime gateway',
+    'code' => '$cust_bill->realtime_lec();',
+    'weight' => 30,
+  },
+
   'batch-card' => {
     'name' => 'Add card to the pending credit card batch',
     'code' => '$cust_bill->batch_card();',
@@ -121,28 +212,75 @@ tie my %events, 'Tie::IxHash',
   },
 
   'send' => {
-    'name' => 'Send invoice (email/print)',
+    'name' => 'Send invoice (email/print/fax)',
     'code' => '$cust_bill->send();',
     'weight' => 50,
   },
 
   'send_alternate' => {
-    'name' => 'Send invoice (email/print) with alternate template',
+    'name' => 'Send invoice (email/print/fax) with alternate template',
     'code' => '$cust_bill->send(\'%%%templatename%%%\');',
     'html' =>
         '<INPUT TYPE="text" NAME="templatename" VALUE="%%%templatename%%%">',
     'weight' => 50,
   },
 
+  'send_if_newest' => {
+    'name' => 'Send invoice (email/print/fax) with alternate template, if it is still the newest invoice (useful for late notices - set to 31 days or later)',
+    'code' => '$cust_bill->send_if_newest(\'%%%if_newest_templatename%%%\');',
+    'html' =>
+        '<INPUT TYPE="text" NAME="if_newest_templatename" VALUE="%%%if_newest_templatename%%%">',
+    'weight' => 50,
+  },
+
+  'send_agent' => {
+    'name' => 'Send invoice (email/print/fax) ',
+    'code' => '$cust_bill->send(\'%%%agent_templatename%%%\', [ %%%agentnum%%% ], \'%%%agent_invoice_from%%%\');',
+    'html' => sub {
+        '<TABLE BORDER=0>
+          <TR>
+            <TD ALIGN="right">only for agent(s) </TD>
+            <TD>'. &select_agentnum(@_). '</TD>
+          </TR>
+          <TR>
+            <TD ALIGN="right">with template </TD>
+            <TD>
+              <INPUT TYPE="text" NAME="agent_templatename" VALUE="%%%agent_templatename%%%">
+            </TD>
+          </TR>
+          <TR>
+            <TD ALIGN="right">email From: </TD>
+            <TD>
+              <INPUT TYPE="text" NAME="agent_invoice_from" VALUE="%%%agent_invoice_from%%%">
+            </TD>
+          </TR>
+        </TABLE>';
+    },
+    'weight' => 50,
+  },
+
   'send_csv_ftp' => {
     'name' => 'Upload CSV invoice data to an FTP server',
-    'code' => '$cust_bill->send_csv( protocol => \'ftp\',
-                                     server   => \'%%%ftpserver%%%\',
-                                     username => \'%%%ftpusername%%%\',
-                                     password => \'%%%ftppassword%%%\',
-                                     dir      => \'%%%ftpdir%%%\'       );',
+    'code' => '$cust_bill->send_csv( protocol   => \'ftp\',
+                                     server     => \'%%%ftpserver%%%\',
+                                     username   => \'%%%ftpusername%%%\',
+                                     password   => \'%%%ftppassword%%%\',
+                                     dir        => \'%%%ftpdir%%%\',
+                                     \'format\' => \'%%%ftpformat%%%\',
+                                   );',
     'html' =>
-        '<TABLE BORDER=0><TR><TD ALIGN="right">FTP server: </TD>'.
+        '<TABLE BORDER=0>'.
+        '<TR><TD ALIGN="right">Format ("default" or "billco"): </TD>'.
+          '<TD>'.
+            '<!--'.
+            '<SELECT NAME="ftpformat">'.
+              '<OPTION VALUE="default">Default'.
+              '<OPTION VALUE="billco">Billco'.
+            '</SELECT>'.
+            '-->'.
+            '<INPUT TYPE="text" NAME="ftpformat" VALUE="%%%ftpformat%%%">'.
+          '</TD></TR>'.
+        '<TR><TD ALIGN="right">FTP server: </TD>'.
           '<TD><INPUT TYPE="text" NAME="ftpserver" VALUE="%%%ftpserver%%%">'.
           '</TD></TR>'.
         '<TR><TD ALIGN="right">FTP username: </TD><TD>'.
@@ -158,6 +296,71 @@ tie my %events, 'Tie::IxHash',
     'weight' => 50,
   },
 
+  'spool_csv' => {
+    'name' => 'Spool CSV invoice data',
+    'code' => '$cust_bill->spool_csv(
+                 \'format\' => \'%%%spoolformat%%%\',
+                 \'dest\'   => \'%%%spooldest%%%\',
+                 \'balanceover\' => \'%%%spoolbalanceover%%%\',
+                 \'agent_spools\' => \'%%%spoolagent_spools%%%\',
+               );',
+    'html' => sub {
+       my $plandata = shift;
+
+       my $html =
+       '<TABLE BORDER=0>'.
+       '<TR><TD ALIGN="right">Format: </TD>'.
+         '<TD>'.
+           '<SELECT NAME="spoolformat">';
+
+       foreach my $option (qw( default billco )) {
+         $html .= qq(<OPTION VALUE="$option");
+         $html .= ' SELECTED' if $option eq $plandata->{'spoolformat'};
+         $html .= ">\u$option";
+       }
+
+       $html .= 
+           '</SELECT>'.
+         '</TD></TR>'.
+       '<TR><TD ALIGN="right">For destination: </TD>'.
+         '<TD>'.
+           '<SELECT NAME="spooldest">';
+
+       tie my %dest, 'Tie::IxHash', 
+         ''      => '(all)',
+         'POST'  => 'Postal Mail',
+         'EMAIL' => 'Email',
+         'FAX'   => 'Fax',
+       ;
+
+       foreach my $dest (keys %dest) {
+         $html .= qq(<OPTION VALUE="$dest");
+         $html .= ' SELECTED' if $dest eq $plandata->{'spooldest'};
+         $html .= '>'. $dest{$dest};
+       }
+
+       $html .=
+           '</SELECT>'.
+         '</TD></TR>'.
+
+       '<TR>'.
+         '<TD ALIGN="right">if balance (this invoice and previous) over </TD>'.
+         '<TD>'.
+           "$money_char ".
+           '<INPUT TYPE="text" SIZE="7" NAME="spoolbalanceover" VALUE="%%%spoolbalanceover%%%">'.
+         '</TD>'.
+       '<TR><TD ALIGN="right">Individual per-agent spools? </TD>'.
+         '<TD><INPUT TYPE="checkbox" NAME="spoolagent_spools" VALUE="1" '.
+           ( $plandata->{'spoolagent_spools'} ? 'CHECKED' : '' ).
+           '>'.
+         '</TD></TR>'.
+       '</TABLE>';
+
+       $html;
+    },
+    'weight' => 50,
+  },
+
   'bill' => {
     'name' => 'Generate invoices (normally only used with a <i>Late Fee</i> event)',
     'code' => '$cust_main->bill();',
@@ -182,6 +385,9 @@ foreach my $event ( keys %events ) {
   my %plandata = map { /^(\w+) (.*)$/; ($1, $2); }
                    split(/\n/, $part_bill_event->plandata);
   my $html = $events{$event}{html};
+  if ( ref($html) eq 'CODE' ) {
+    $html = &{$html}(\%plandata);
+  }
   while ( $html =~ /%%%(\w+)%%%/ ) {
     my $field = $1;
     $html =~ s/%%%$field%%%/$plandata{$field}/;