freeside/FS/FS cust_pay_void.pm,NONE,1.1 cust_pay.pm,1.32,1.33

ivan ivan at pouncequick.420.am
Tue Jul 6 06:26:26 PDT 2004


Update of /home/cvs/cvsroot/freeside/FS/FS
In directory pouncequick:/tmp/cvs-serv19530/FS/FS

Modified Files:
	cust_pay.pm 
Added Files:
	cust_pay_void.pm 
Log Message:
add cust_pay_void table and payment voiding web ui part one

--- NEW FILE: cust_pay_void.pm ---
package FS::cust_pay_void; 
use strict;
use vars qw( @ISA );
use Business::CreditCard;
use FS::UID qw(getotaker);
use FS::Record qw(qsearchs); # dbh qsearch );
#use FS::cust_bill;
#use FS::cust_bill_pay;
#use FS::cust_pay_refund;
#use FS::cust_main;

@ISA = qw( FS::Record );

=head1 NAME

FS::cust_pay_void - Object methods for cust_pay_void objects

=head1 SYNOPSIS

  use FS::cust_pay_void;

  $record = new FS::cust_pay_void \%hash;
  $record = new FS::cust_pay_void { 'column' => 'value' };

  $error = $record->insert;

  $error = $new_record->replace($old_record);

  $error = $record->delete;

  $error = $record->check;

=head1 DESCRIPTION

An FS::cust_pay_void object represents a voided payment.  The following fields
are currently supported:

=over 4

=item paynum - primary key (assigned automatically for new payments)

=item custnum - customer (see L<FS::cust_main>)

=item paid - Amount of this payment

=item _date - specified as a UNIX timestamp; see L<perlfunc/"time">.  Also see
L<Time::Local> and L<Date::Parse> for conversion functions.

=item payby - `CARD' (credit cards), `CHEK' (electronic check/ACH),
`LECB' (phone bill billing), `BILL' (billing), or `COMP' (free)

=item payinfo - card number, check #, or comp issuer (4-8 lowercase alphanumerics; think username), respectively

=item paybatch - text field for tracking card processing

=item closed - books closed flag, empty or `Y'

=item void_date

=item reason

=back

=head1 METHODS

=over 4 

=item new HASHREF

Creates a new payment.  To add the payment to the databse, see L<"insert">.

=cut

sub table { 'cust_pay_void'; }

=item insert

Adds this voided payment to the database.

=item delete

Currently unimplemented.

=cut

sub delete {
  return "Can't delete voided payments!";
}

=item replace OLD_RECORD

Currently unimplemented.

=cut

sub replace {
   return "Can't modify voided payments!";
}

=item check

Checks all fields to make sure this is a valid voided payment.  If there is an
error, returns the error, otherwise returns false.  Called by the insert
method.

=cut

sub check {
  my $self = shift;

  my $error =
    $self->ut_numbern('paynum')
    || $self->ut_numbern('custnum')
    || $self->ut_money('paid')
    || $self->ut_number('_date')
    || $self->ut_textn('paybatch')
    || $self->ut_enum('closed', [ '', 'Y' ])
    || $self->ut_numbern('void_date')
    || $self->ut_textn('reason')
  ;
  return $error if $error;

  return "paid must be > 0 " if $self->paid <= 0;

  return "unknown cust_main.custnum: ". $self->custnum
    unless $self->invnum
           || qsearchs( 'cust_main', { 'custnum' => $self->custnum } );

  $self->void_date(time) unless $self->void_date;

  $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP)$/ or return "Illegal payby";
  $self->payby($1);

  #false laziness with cust_refund::check
  if ( $self->payby eq 'CARD' ) {
    my $payinfo = $self->payinfo;
    $payinfo =~ s/\D//g;
    $self->payinfo($payinfo);
    if ( $self->payinfo ) {
      $self->payinfo =~ /^(\d{13,16})$/
        or return "Illegal (mistyped?) credit card number (payinfo)";
      $self->payinfo($1);
      validate($self->payinfo) or return "Illegal credit card number";
      return "Unknown card type" if cardtype($self->payinfo) eq "Unknown";
    } else {
      $self->payinfo('N/A');
    }

  } else {
    $error = $self->ut_textn('payinfo');
    return $error if $error;
  }

  $self->otaker(getotaker);

  $self->SUPER::check;
}

=item cust_main

Returns the parent customer object (see L<FS::cust_main>).

=cut

sub cust_main {
  my $self = shift;
  qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
}

=item payinfo_masked

Returns a "masked" payinfo field with all but the last four characters replaced
by 'x'es.  Useful for displaying credit cards.

=cut

sub payinfo_masked {
  my $self = shift;
  my $payinfo = $self->payinfo;
  'x'x(length($payinfo)-4). substr($payinfo,(length($payinfo)-4));
}

=back

=head1 BUGS

Delete and replace methods.

=head1 SEE ALSO

L<FS::cust_pay>, L<FS::Record>, schema.html from the base documentation.

=cut

1;


Index: cust_pay.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/cust_pay.pm,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- cust_pay.pm	30 Jun 2004 18:19:44 -0000	1.32
+++ cust_pay.pm	6 Jul 2004 13:26:20 -0000	1.33
@@ -5,13 +5,13 @@
 use Date::Format;
 use Business::CreditCard;
 use Text::Template;
-use FS::UID qw( dbh );
-use FS::Record qw( dbh qsearch qsearchs dbh );
+use FS::Record qw( dbh qsearch qsearchs );
 use FS::Misc qw(send_email);
 use FS::cust_bill;
 use FS::cust_bill_pay;
 use FS::cust_pay_refund;
 use FS::cust_main;
+use FS::cust_pay_void;
 
 @ISA = qw( FS::Record );
 
@@ -207,10 +207,54 @@
 
 }
 
+=item void [ REASON ]
+
+Voids this payment: deletes the payment and all associated applications and
+adds a record of the voided payment to the FS::cust_pay_void table.
+
+=cut
+
+sub void {
+  my $self = shift;
+
+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  local $SIG{TSTP} = 'IGNORE';
+  local $SIG{PIPE} = 'IGNORE';
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  my $cust_pay_void = new FS::cust_pay_void ( {
+    map { $_ => $self->get($_) } $self->fields
+  } );
+  $cust_pay_void->reason(shift) if scalar(@_);
+  my $error = $cust_pay_void->insert;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $error = $self->delete;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+
+  '';
+
+}
+
 =item delete
 
 Deletes this payment and all associated applications (see L<FS::cust_bill_pay>),
-unless the closed flag is set.
+unless the closed flag is set.  In most cases, you want to use the void
+method instead to leave a record of the deleted payment.
 
 =cut
 
@@ -229,8 +273,8 @@
   local $FS::UID::AutoCommit = 0;
   my $dbh = dbh;
 
-  foreach my $cust_bill_pay ( $self->cust_bill_pay ) {
-    my $error = $cust_bill_pay->delete;
+  foreach my $app ( $self->cust_bill_pay, $self->cust_pay_refund ) {
+    my $error = $app->delete;
     if ( $error ) {
       $dbh->rollback if $oldAutoCommit;
       return $error;




More information about the freeside-commits mailing list