*** empty log message ***
authorivan <ivan>
Tue, 31 Jan 2006 11:02:54 +0000 (11:02 +0000)
committerivan <ivan>
Tue, 31 Jan 2006 11:02:54 +0000 (11:02 +0000)
FS/FS/Schema.pm
FS/FS/payby.pm [new file with mode: 0644]
FS/MANIFEST
FS/t/payby.t [new file with mode: 0644]
htetc/handler.pl
httemplate/browse/part_bill_event.cgi
httemplate/edit/part_bill_event.cgi

index a0637f5..33d0fd6 100644 (file)
@@ -307,6 +307,7 @@ sub tables_hashref {
     'part_bill_event' => {
       'columns' => [
         'eventpart',    'serial',  '', '',
+        'freq',        'varchar',       'NULL',     $char_d,
         'payby',       'char',  '', 4,
         'event',       'varchar',           '',     $char_d,
         'eventcode',    @perl_type,
diff --git a/FS/FS/payby.pm b/FS/FS/payby.pm
new file mode 100644 (file)
index 0000000..3d43dff
--- /dev/null
@@ -0,0 +1,125 @@
+package FS::payby;
+
+use strict;
+use vars qw(%hash);
+use Tie::IxHash;
+
+=head1 NAME
+
+FS::payby - Object methods for payment type records
+
+=head1 SYNOPSIS
+
+  use FS::payby;
+
+  #for now...
+
+  my @payby = FS::payby->payby;
+
+  tie my %payby, 'Tie::IxHash', FS::payby->payby2longname
+
+  my @cust_payby = FS::payby->cust_payby;
+
+  tie my %payby, 'Tie::IxHash', FS::payby->cust_payby2longname
+
+=head1 DESCRIPTION
+
+Payment types.
+
+=head1 METHODS
+
+=over 4 
+
+=item
+
+=cut
+
+tie %hash, 'Tie::IxHash',
+  'CARD' => {
+    tinyname  => 'card',
+    shortname => 'Credit card',
+    longname  => 'Credit card (automatic)',
+  },
+  'DCRD' => {
+    tinyname  => 'card',
+    shortname => 'Credit card',
+    longname  => 'Credit card (on-demand)',
+    cust_pay  => 'CARD', #this is a customer type only, payments are CARD...
+  },
+  'CHEK' => {
+    tinyname  => 'check',
+    shortname => 'Electronic check',
+    longname  => 'Electronic check (automatic)',
+  },
+  'DCHK' => {
+    tinyname  => 'check',
+    shortname => 'Electronic check',
+    longname  => 'Electronic check (on-demand)',
+    cust_pay  => 'CHEK', #this is a customer type only, payments are CHEK...
+  },
+  'LECB' => {
+    tinyname  => 'phone bill',
+    shortname => 'Phone bill billing',
+    longname  => 'Phone bill billing',
+  },
+  'BILL' => {
+    tinyname  => 'billing',
+    shortname => 'Billing',
+    longname  => 'Billing',
+  },
+  'CASH' => {
+    tinyname  => 'cash',
+    shortname => 'Cash', # initial payment, then billing
+    longname  => 'Cash',
+    cust_main => 'BILL', #this is a payment type only, customers go to BILL...
+  },
+  'WEST' => {
+    tinyname  => 'western union',
+    shortname => 'Western Union', # initial payment, then billing
+    longname  => 'Western Union',
+    cust_main => 'BILL', #this is a payment type only, customers go to BILL...
+  },
+  'MCRD' => { #not the same as DCRD
+    tinyname  => 'card',
+    shortname => 'Manual credit card', # initial payment, then billing
+    longname  => 'Manual credit card', 
+    cust_main => 'BILL', #this is a payment type only, customers go to BILL...
+  },
+  'COMP' => {
+    tinyname  => 'comp',
+    shortname => 'Complimentary',
+    longname  => 'Complimentary',
+  },
+;
+
+sub payby {
+  keys %hash;
+}
+
+sub payby2longname {
+  my $self = shift;
+  map { $_ => $hash{$_}->{longname} } $self->payby;
+}
+
+sub cust_payby {
+  my $self = shift;
+  grep { ! exists $hash{$_}->{cust_main} } self->payby;
+}
+
+sub cust_payby2longname {
+  my $self = shift;
+  map { $_ => $hash{$_}->{longname} } $self->cust_payby;
+}
+
+=back
+
+=head1 BUGS
+
+This should eventually be an actual database table.
+
+=head1 SEE ALSO
+
+=cut
+
+1;
+
index c8f10f2..d8adfb9 100644 (file)
@@ -125,6 +125,7 @@ FS/part_svc.pm
 FS/part_svc_column.pm
 FS/part_svc_router.pm
 FS/part_virtual_field.pm
+FS/payby.pm
 FS/pkg_class.pm
 FS/pkg_svc.pm
 FS/rate.pm
@@ -259,6 +260,7 @@ t/part_pop_local.t
 t/part_referral.t
 t/part_svc.t
 t/part_svc_column.t
+t/payby.t
 t/pkg_class.t
 t/pkg_svc.t
 t/port.t
diff --git a/FS/t/payby.t b/FS/t/payby.t
new file mode 100644 (file)
index 0000000..7430bc8
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::payby;
+$loaded=1;
+print "ok 1\n";
index 2f2b0af..06060b2 100644 (file)
@@ -171,6 +171,7 @@ sub handler
       use FS::payment_gateway;
       use FS::agent_payment_gateway;
       use FS::XMLRPC;
+      use FS::payby;
 
       if ( %%%RT_ENABLED%%% ) {
         eval '
index 5a89516..0b6d0cb 100755 (executable)
@@ -1,6 +1,4 @@
-<!-- mason kludge -->
 <% 
-
 my %search;
 if ( $cgi->param('showdisabled') ) {
   %search = ();
@@ -10,13 +8,15 @@ if ( $cgi->param('showdisabled') ) {
 
 my @part_bill_event = qsearch('part_bill_event', \%search );
 my $total = scalar(@part_bill_event);
-
 %>
+
 <%= include("/elements/header.html",'Invoice Event Listing', menubar( 'Main Menu' => $p) ) %>
 
-    Invoice events are actions taken on overdue invoices.<BR><BR>
+    Invoice events are actions taken on open invoices.<BR><BR>
+
 <A HREF="<%= $p %>edit/part_bill_event.cgi"><I>Add a new invoice event</I></A>
 <BR><BR>
+
 <%= $total %> events
 <%= $cgi->param('showdisabled')
       ? do { $cgi->param('showdisabled', 0);
@@ -24,48 +24,93 @@ my $total = scalar(@part_bill_event);
       : do { $cgi->param('showdisabled', 1);
              '( <a href="'. $cgi->self_url. '">show disabled events</a> )'; }
 %>
-<%= table() %>
-  <TR>
-    <TH COLSPAN=<%= $cgi->param('showdisabled') ? 2 : 3 %>>Event</TH>
-    <TH>Payby</TH>
-    <TH>After</TH>
-    <TH>Action</TH>
-    <TH>Options</TH>
-    <TH>Code</TH>
-  </TR>
+<BR><BR>
+
+<% tie my %payby, 'Tie::IxHash', FS::payby->cust_payby2longname;
+   tie my %freq, 'Tie::IxHash', '1d' => 'daily', '1m' => 'monthly';
+   foreach my $payby ( keys %payby ) {
+     my $oldfreq = '';
+
+     my @payby_part_bill_event =  grep { $payby eq $_->payby }
+                                  sort {    $a->seconds   <=> $b->seconds
+                                         || $a->weight    <=> $b->weight
+                                         || $a->eventpart <=> $b->eventpart
+                                       }
+                                  @part_bill_event;
 
-<% foreach my $part_bill_event ( sort {    $a->payby     cmp $b->payby
-                                        || $a->seconds   <=> $b->seconds
-                                        || $a->weight    <=> $b->weight
-                                        || $a->eventpart <=> $b->eventpart
-                                      } @part_bill_event ) {
-     my $url = "${p}edit/part_bill_event.cgi?". $part_bill_event->eventpart;
-     use Time::Duration;
-     my $delay = duration_exact($part_bill_event->seconds);
-     my $plandata = $part_bill_event->plandata;
-     $plandata =~ s/\n/<BR>/go;
 %>
-  <TR>
-    <TD><A HREF="<%= $url %>">
-      <%= $part_bill_event->eventpart %></A></TD>
-<% unless ( $cgi->param('showdisabled') ) { %>
-    <TD>
-      <%= $part_bill_event->disabled ? 'DISABLED' : '' %></TD>
-<% } %>
-    <TD><A HREF="<%= $url %>">
-      <%= $part_bill_event->event %></A></TD>
-    <TD>
-      <%= $part_bill_event->payby %></TD>
-    <TD>
-      <%= $delay %></TD>
-    <TD>
-      <%= $part_bill_event->plan %></TD>
-    <TD>
-      <%= $plandata %></TD>
-    <TD><FONT SIZE="-1">
-      <%= $part_bill_event->eventcode %></FONT></TD>
-  </TR>
+
+  <% if ( @payby_part_bill_event ) { %>
+
+    <%= include('/elements/table-grid.html') %>
+  
+    <% my $bgcolor1 = '#eeeeee';
+       my $bgcolor2 = '#ffffff';
+       my $bgcolor;
+    %>
+  
+    <%
+       foreach my $part_bill_event ( @payby_part_bill_event ) {
+         my $url = "${p}edit/part_bill_event.cgi?". $part_bill_event->eventpart;
+         my $delay = duration_exact($part_bill_event->seconds);
+         ( my $plandata = $part_bill_event->plandata ) =~ s/\n/<BR>/go;
+         my $freq = $part_bill_event->freq || '1d';
+    %>
+  
+      <% if ( $oldfreq ne $freq ) { %>
+  
+        <TR>
+          <TH CLASS="grid" BGCOLOR="#999999" COLSPAN=<%= $cgi->param('showdisabled') ? 7 : 8 %>><%= ucfirst($freq{$freq}) %> event tests for <FONT SIZE="+1"><I><%= $payby{$payby} %> customers</I></FONT></TH>
+        </TR>
+      
+        <TR>
+          <TH CLASS="grid" BGCOLOR="#cccccc" COLSPAN=<%= $cgi->param('showdisabled') ? 2 : 3 %>>Event</TH>
+          <TH CLASS="grid" BGCOLOR="#cccccc">After</TH>
+          <TH CLASS="grid" BGCOLOR="#cccccc">Action</TH>
+          <TH CLASS="grid" BGCOLOR="#cccccc">Options</TH>
+          <TH CLASS="grid" BGCOLOR="#cccccc">Code</TH>
+        </TR>
+  
+        <%
+           $oldfreq = $freq;
+           $bgcolor = '';
+        %>
+  
+      <% } %>
+  
+      <%
+         if ( $bgcolor eq $bgcolor1 ) {
+            $bgcolor = $bgcolor2;
+          } else {
+            $bgcolor = $bgcolor1;
+          }
+      %>
+  
+      <TR>
+        <TD CLASS="grid" BGCOLOR="<%= $bgcolor %>"><A HREF="<%= $url %>">
+          <%= $part_bill_event->eventpart %></A></TD>
+    <% unless ( $cgi->param('showdisabled') ) { %>
+        <TD CLASS="grid" BGCOLOR="<%= $bgcolor %>">
+          <%= $part_bill_event->disabled ? 'DISABLED' : '' %></TD>
+    <% } %>
+        <TD CLASS="grid" BGCOLOR="<%= $bgcolor %>"><A HREF="<%= $url %>">
+          <%= $part_bill_event->event %></A></TD>
+        <TD CLASS="grid" BGCOLOR="<%= $bgcolor %>">
+          <%= $delay %></TD>
+        <TD CLASS="grid" BGCOLOR="<%= $bgcolor %>">
+          <%= $part_bill_event->plan %></TD>
+        <TD CLASS="grid" BGCOLOR="<%= $bgcolor %>">
+          <%= $plandata %></TD>
+        <TD CLASS="grid" BGCOLOR="<%= $bgcolor %>"><FONT SIZE="-1">
+          <%= $part_bill_event->eventcode %></FONT></TD>
+      </TR>
+    <% } %>
+    </TABLE>
+    <BR><BR>
+
+  <% } %>
+
 <% } %>
-</TABLE>
+
 </BODY>
 </HTML>
index 32ca47a..57eedbc 100755 (executable)
@@ -1,4 +1,4 @@
-<!-- mason kludge -->
+<!--mason kludge-->
 <%
 
 if ( $cgi->param('eventpart') && $cgi->param('eventpart') =~ /^(\d+)$/ ) {
@@ -23,48 +23,86 @@ if ( $query && $query =~ /^(\d+)$/ ) {
 $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 DCRD CHEK DCHK 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();
 
@@ -113,7 +151,7 @@ tie my %events, 'Tie::IxHash',
     'code'   => '$cust_main->suspend();',
     'weight' => 10,
   },
-  'suspend' => {
+  '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%%%">',
@@ -174,13 +212,13 @@ 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%%%">',
@@ -188,7 +226,7 @@ tie my %events, 'Tie::IxHash',
   },
 
   'send_if_newest' => {
-    'name' => 'Send invoice (email/print) with alternate template, if it is still the newest invoice (useful for late notices - set to 31 days or later)',
+    '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%%%">',
@@ -196,7 +234,7 @@ tie my %events, 'Tie::IxHash',
   },
 
   'send_agent' => {
-    'name' => 'Send invoice (email/print) ',
+    'name' => 'Send invoice (email/print/fax) ',
     'code' => '$cust_bill->send(\'%%%agent_templatename%%%\', [ %%%agentnum%%% ], \'%%%agent_invoice_from%%%\');',
     'html' => sub {
         '<TABLE BORDER=0>
@@ -263,6 +301,7 @@ tie my %events, 'Tie::IxHash',
     'code' => '$cust_bill->spool_csv(
                  \'format\' => \'%%%spoolformat%%%\',
                  \'dest\'   => \'%%%spooldest%%%\',
+                 \'balanceover\' => \'%%%spoolbalanceover%%%\',
                  \'agent_spools\' => \'%%%spoolagent_spools%%%\',
                );',
     'html' => sub {
@@ -303,6 +342,13 @@ tie my %events, 'Tie::IxHash',
        $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' : '' ).