donorLastGave: initial implementation.
This commit is contained in:
parent
f3a4ba8ef5
commit
a57415ff6d
1 changed files with 91 additions and 0 deletions
|
@ -1130,6 +1130,49 @@ sub findDonor($$) {
|
||||||
}
|
}
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
|
=begin donorLastGave
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item $self
|
||||||
|
|
||||||
|
Current object.
|
||||||
|
|
||||||
|
=item $donorId
|
||||||
|
|
||||||
|
Valid donor id number currently in the database. die() will occur if
|
||||||
|
the id number is not in the database already as a donor id.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
Returns an ISO 8601 formatted date of their last donation. undef will be
|
||||||
|
returned if the donor has never given (which should rarely be the case, but
|
||||||
|
it could happen).
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub donorLastGave($$) {
|
||||||
|
my($self, $donorId) = @_;
|
||||||
|
|
||||||
|
confess "lastGave: donorId, \"$donorId\" not found in supporter database"
|
||||||
|
unless $self->_verifyId($donorId);
|
||||||
|
|
||||||
|
$self->_readLedgerData() if not defined $self->{ledgerData};
|
||||||
|
|
||||||
|
my $ledgerEntityId = $self->getLedgerEntityId($donorId);
|
||||||
|
|
||||||
|
if (not defined $self->{ledgerData}{$ledgerEntityId} or
|
||||||
|
not defined $self->{ledgerData}{$ledgerEntityId}{__LAST_GAVE__} or
|
||||||
|
$self->{ledgerData}{$ledgerEntityId}{__LAST_GAVE__} eq '1975-01-01') {
|
||||||
|
return undef;
|
||||||
|
} else {
|
||||||
|
return $self->{ledgerData}{$ledgerEntityId}{__LAST_GAVE__};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
######################################################################
|
||||||
|
|
||||||
=back
|
=back
|
||||||
|
|
||||||
=head1 Non-Public Methods
|
=head1 Non-Public Methods
|
||||||
|
@ -1139,6 +1182,54 @@ use outside of this module.
|
||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
|
=item _readLedgerData
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub _readLedgerData($) {
|
||||||
|
my($self) = @_;
|
||||||
|
|
||||||
|
my @cmd = @{$self->{ledgerCmd}};
|
||||||
|
my %amountTable;
|
||||||
|
|
||||||
|
open(ALL, "-|", @cmd) or confess "unable to run command ledger command: @cmd: $!";
|
||||||
|
while (my $line = <ALL>) {
|
||||||
|
next if $line =~ /^\s*$/;
|
||||||
|
die "Invalid line in @cmd output:\n $line"
|
||||||
|
unless $line =~ /^\s*([^\d]+)\s+([\d\-]+)\s+(\S+)\s+\$\s*(\-?\s*[\d,\.]+)\s*$/;
|
||||||
|
my($type, $date, $entityId, $amount) = ($1, $2, $3, $4);
|
||||||
|
if (defined $self->{programTypeSearch}) {
|
||||||
|
if ($type =~ /$self->{programTypeSearch}{annual}/) {
|
||||||
|
$type = 'Annual';
|
||||||
|
} elsif ($type =~ /$self->{programTypeSearch}{monthly}/) {
|
||||||
|
$type = 'Monthly';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
die "Unknown type $type for $entityId from $line" if $type !~ /^(Monthly|Annual)$/ and defined $self->{programTypeSearch};
|
||||||
|
$amount =~ s/,//; $amount = abs($amount);
|
||||||
|
if (defined $amountTable{$entityId}{donations}{$date}) {
|
||||||
|
$amountTable{$entityId}{donations}{$date} += $amount;
|
||||||
|
} else {
|
||||||
|
$amountTable{$entityId}{donations}{$date} = $amount;
|
||||||
|
}
|
||||||
|
unless (defined $amountTable{$entityId}{__TOTAL__}) {
|
||||||
|
$amountTable{$entityId}{__TOTAL__} = 0.00;
|
||||||
|
$amountTable{$entityId}{__LAST_GAVE__} = '1975-01-01';
|
||||||
|
$amountTable{$entityId}{__FIRST_GAVE__} = '9999-12-31';
|
||||||
|
}
|
||||||
|
$amountTable{$entityId}{__TOTAL__} += $amount;
|
||||||
|
if ($date gt $amountTable{$entityId}{__LAST_GAVE__}) {
|
||||||
|
# Consider the "type" of the donor to be whatever type they were at last donation
|
||||||
|
$amountTable{$entityId}{__TYPE__} = $type;
|
||||||
|
$amountTable{$entityId}{__LAST_GAVE__} = $date;
|
||||||
|
}
|
||||||
|
$amountTable{$entityId}{__FIRST_GAVE__} = $date
|
||||||
|
if $date lt $amountTable{$entityId}{__FIRST_GAVE__};
|
||||||
|
}
|
||||||
|
close ALL; die "error($?) running command, @cmd: $!" unless $? == 0;
|
||||||
|
$self->{ledgerData} = \%amountTable;
|
||||||
|
}
|
||||||
|
|
||||||
=item DESTROY
|
=item DESTROY
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
Loading…
Reference in a new issue