summaryrefslogtreecommitdiff
path: root/contrib/non-profit-audit-reports/cash-receipts-and-disbursments-journals.plx
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/non-profit-audit-reports/cash-receipts-and-disbursments-journals.plx')
-rwxr-xr-xcontrib/non-profit-audit-reports/cash-receipts-and-disbursments-journals.plx90
1 files changed, 58 insertions, 32 deletions
diff --git a/contrib/non-profit-audit-reports/cash-receipts-and-disbursments-journals.plx b/contrib/non-profit-audit-reports/cash-receipts-and-disbursments-journals.plx
index 2ad18a44..cb19a19e 100755
--- a/contrib/non-profit-audit-reports/cash-receipts-and-disbursments-journals.plx
+++ b/contrib/non-profit-audit-reports/cash-receipts-and-disbursments-journals.plx
@@ -4,7 +4,7 @@
# Script to generate a General Ledger report that accountants like
# using Ledger.
#
-# Copyright (C) 2011, 2012 Bradley M. Kuhn
+# Copyright (C) 2011, 2012, 2013 Bradley M. Kuhn
#
# This program gives you software freedom; you can copy, modify, convey,
# and/or redistribute it under the terms of the GNU General Public License
@@ -21,6 +21,7 @@
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor
# Boston, MA 02110-1301, USA.
+
use strict;
use warnings;
@@ -76,21 +77,14 @@ die "bad one day less" if $oneDayLess->parse("- 1 day");
$formattedEndDate = $formattedEndDate->calc($oneDayLess);
$formattedEndDate = $formattedEndDate->printf("%Y/%m/%d");
-foreach my $acct (@accounts) {
- next unless ($acct =~ /^(?:Assets|Liabilities)/);
-
- my $acctFilename = LedgerAcctToFilename($acct);
+foreach my $typeData ({ name => 'disbursements', query => 'a<=0' },
+ { name => 'receipts', query => 'a>0' }) {
+ my $fileNameBase = $typeData->{name};
- foreach my $typeData ({ name => 'disbursements', query => 'a<=0' },
- { name => 'receipts', query => 'a>0' }) {
- my $fileNameBase = $acctFilename . '-' . $typeData->{name};
+ open(CSV_OUT, ">", "$fileNameBase.csv") or die "unable to open $fileNameBase.csv: $!";
- open(TEXT_OUT, ">", "$fileNameBase.txt") or die "unable to open $fileNameBase.txt: $!";
- open(CSV_OUT, ">", "$fileNameBase.csv") or die "unable to open $fileNameBase.csv: $!";
-
- print TEXT_OUT "\n\nACCOUNT: $acct\nFROM: $beginDate TO $formattedEndDate\n\n";
- print CSV_OUT "\n\"ACCOUNT:\",\"$acct\"\n\"PERIOD START:\",\"$beginDate\"\n\"PERIOD END:\",\"$formattedEndDate\"\n";
- print CSV_OUT '"DATE","CHECK NUM","NAME","ACCOUNT","AMOUNT"';
+ foreach my $acct (sort { $a cmp $b } @accounts) {
+ next unless ($acct =~ /^(?:Assets|Liabilities)/);
my @entryLedgerOpts = ('-l', $typeData->{query},
'-b', $beginDate, '-e', $endDate, @otherLedgerOpts, 'print', $acct);
@@ -106,38 +100,70 @@ foreach my $acct (@accounts) {
goto SKIP_REGISTER_COMMANDS if (-z $tempFile);
- my @txtRegLedgerOpts = ('-f', $tempFile, '-V', '-F',
- "%(date) %-.70P %-.10C %-.80A %18t\n", '-w', '--sort', 'd',
- '-b', $beginDate, '-e', $endDate, 'reg');
+ print CSV_OUT "\"ACCOUNT:\",\"$acct\"\n\"PERIOD START:\",\"$beginDate\"\n\"PERIOD END:\",\"$formattedEndDate\"\n";
+ print CSV_OUT '"DATE","CHECK NUM","NAME","ACCOUNT","AMOUNT"';
- my $formatString = '\n"%(date)","%C","%P","%A","%t"\n%/"","","","%A","%t"';
+ my $formatString = '\n"%(date)","%C","%P","%A","%t"';
+ my $tagStrings = "";
foreach my $tagField (qw/Receipt Invoice Statement Contract PurchaseOrder Approval Check IncomeDistributionAnalysis CurrencyRate/) {
print CSV_OUT ',"', $tagField, '"';
- $formatString .= ',"link:%(tag(\'' . $tagField . '\'))"';
+ $tagStrings .= ',"link:%(tag(\'' . $tagField . '\'))"';
}
- $formatString .= "\n";
- print CSV_OUT "\n";
- my @csvRegLedgerOpts = ('-f', $tempFile, '-V', '-F', $formatString, '-w', '--sort', 'd',
- '-b', $beginDate, '-e', $endDate, 'reg');
-
+ $formatString .= $tagStrings . '\n%/"","","","%A","%t"' . $tagStrings . '\n';
- open(TXT_DATA, "-|", $LEDGER_CMD, @txtRegLedgerOpts)
- or die "unable to run ledger command for $fileNameBase.txt: $!";
+ # I thought '--sort', 'd', '--sort-xact', 'a', should
+ # have worked below for a good sort. Then I tried
+ # rather than '--sort', "d,n,a", which didn't work either.
+ # I opened a bug: http://bugs.ledger-cli.org/show_bug.cgi?id=901
- while (my $line = <TXT_DATA>) { print TEXT_OUT $line; }
- close(TEXT_OUT); die "Error read write text out to $fileNameBase.txt: $!" unless $? == 0;
+ my @csvRegLedgerOpts = ('-f', $tempFile, '-V', '-F', $formatString, '-w', '--sort', 'd',
+ '-b', $beginDate, '-e', $endDate, 'reg');
open(CSV_DATA, "-|", $LEDGER_CMD, @csvRegLedgerOpts)
or die "unable to run ledger command for $fileNameBase.csv: $!";
- while (my $line = <CSV_DATA>) { $line =~ s/"link:"/""/g; print CSV_OUT $line; }
- close(CSV_DATA); die "Error read from csv ledger command $!" unless $? == 0;
+ my($curDepositDate, $curDepositTotal);
+
+ while (my $line = <CSV_DATA>) {
+ $line =~ s/"link:"/""/g;
+
+ my $date = $line; chomp $date;
+ $date =~ s/^\s*"([^"]*)"\s*,.*$/$1/;
+ if (defined $date and $date !~ /^\s*$/ and
+ defined $curDepositDate and ($date ne $curDepositDate or
+ ($date eq $curDepositDate and $line !~ /DEPOSIT[\s\-]+BRANCH/))) {
+ print CSV_OUT "\"$curDepositDate\",\"SUBTOTAL\",\"BRANCH DEPOSIT TOTAL:\",\"\",\"\$$curDepositTotal\"\n\n";
+ $curDepositTotal = $curDepositDate = undef;
+ }
+ if ($line =~ /DEPOSIT[\s\-]+BRANCH/) {
+ if (not defined $curDepositDate) {
+ $curDepositDate = $line; chomp $curDepositDate;
+ $curDepositDate =~ s/^\s*"([^"]+)"\s*,.*$/$1/;
+ }
+ }
+ # This is a bit of a hack because I can't ssume that the line with the
+ # description on it has the account name in it.
+ if (defined $curDepositDate and $line =~ /$acct/) {
+ my $amt = $line;
+ chomp $amt;
+ $amt =~ s/^\s*"[^"]*","[^"]*","[^"]*","[^"]*","\$\s*([^"]*)".*$/$1/;
+ $amt =~ s/,//g;
+
+ $curDepositTotal = 0.0 unless defined $curDepositTotal;
+ $curDepositTotal += $amt;
+ }
+ print CSV_OUT $line;
+ }
+ # Catch potential last Deposit subtotal
+ print CSV_OUT "\n\"$curDepositDate\",\"SUBTOTAL\",\"BRANCH DEPOSIT TOTAL:\",\"\",\"\$$curDepositTotal\"\n\n"
+ if (defined $curDepositDate);
+ close(CSV_DATA); die "Error read from csv ledger command $!" unless $? == 0;
+ print CSV_OUT "pagebreak\n";
SKIP_REGISTER_COMMANDS:
- close(TXT_DATA); die "Error read from txt ledger command $!" unless $? == 0;
- close(CSV_OUT); die "Error read write csv out to $fileNameBase.csv: $!" unless $? == 0;
unlink($tempFile);
}
+ close(CSV_OUT); die "Error read write csv out to $fileNameBase.csv: $!" unless $? == 0;
}
###############################################################################
#