App-GnuCash-MembershipUtils
view release on metacpan or search on metacpan
bin/gc-members-generate-invoices view on Meta::CPAN
#!/usr/bin/env perl
##----------------------------------------------------------------------------
## :mode=perl:indentSize=2:tabSize=2:noTabs=true:
##****************************************************************************
## NOTES:
## * Before comitting this file to the repository, ensure Perl Critic can be
## invoked at the HARSH [3] level with no errors
##****************************************************************************
use strict;
use warnings;
use feature qw( say state );
## Cannot use Find::Bin because script may be invoked as an
## argument to another script, so instead we use __FILE__
use File::Basename qw(dirname fileparse basename);
use File::Spec;
## Add script directory
use lib File::Spec->catdir(File::Spec->splitdir(dirname(__FILE__)));
## Add script directory/lib
use lib File::Spec->catdir(File::Spec->splitdir(dirname(__FILE__)), qq{lib});
## Add script directory/../lib
bin/gc-members-generate-invoices view on Meta::CPAN
if ($error) {
printf STDERR "Error opening GnuCash file: %s\n", $error;
exit(1);
}
my $warning;
($error, $warning) = validate_accounts_in_config({
schema => $schema,
config => $config,
});
say STDERR $warning if ($warning);
if ($error) {
say STDERR $error;
exit(1);
}
my @members = get_all_members({
active_only => 1,
schema => $schema,
config => $config,
debug => $gOptions{debug},
});
bin/gc-members-generate-invoices view on Meta::CPAN
if (open my $fh, ">:encoding(utf8)", $gOptions{outfile}) {
for my $member (@members) {
my %inv = (
%inv_template,
id => sprintf("%06d", $next_inv_id++),
owner_id => $member->{id},
account => $member->{membership_account},
price => $member->{membership_amount},
desc => join(" - ", grep { length } ($member->{membership_type}, $gOptions{memo})),
);
$csv->say ($fh, [ map { $inv{$_} } @CSV_COLUMNS ]);
}
close($fh);
} else {
say STDERR "Error writing '$gOptions{outfile}': $!";
exit(1);
}
## use critic
# "First Invoice: '%06d'"
printf("Last Invoice: '%06d'\n", --$next_inv_id);
exit(0);
__END__
__DATA__
bin/gc-members-list view on Meta::CPAN
if ($error) {
printf STDERR "Error opening GnuCahs file: %s\n", $error;
exit(1);
}
my $warning;
($error, $warning) = validate_accounts_in_config({
schema => $schema,
config => $config,
});
say STDERR $warning if ($warning);
if ($error) {
say STDERR $error;
exit(1);
}
my @members = get_all_members({
active_only => !$gOptions{all},
schema => $schema,
config => $config,
debug => $gOptions{debug},
});
if ($gOptions{debug}) {
say pp(\@members);
}
my @columns = qw( name );
push(@columns, qw( active )) if ($gOptions{all});
push(@columns, qw( membership_type membership_amount));
my @widths;
for my $column (@columns) {
say "Assembling values for the '$column' field..." if ($gOptions{debug});
my @values = (
map { $_->{$column} } @members
);
push(@values, $column);
say pp(\@values) if ($gOptions{debug});
push(@widths, max_length(@values));
}
my $header = "",
my $uline = "";
for my $idx (0 .. $#columns) {
$header .= sprintf("%*s ", -1 * $widths[$idx], title_case($columns[$idx]));
$uline .= ("-" x $widths[$idx]) . " ";
}
say $header;
say $uline;
for my $member (@members) {
my $line = "";
for my $idx (0 .. $#columns) {
$line .= sprintf("%*s ", -1 * $widths[$idx], $member->{$columns[$idx]});
}
say $line;
}
exit(0);
__END__
__DATA__
##----------------------------------------------------------------------------
## By placing the POD in the DATA section, we can use
( run in 1.116 second using v1.01-cache-2.11-cpan-a1f116cd669 )