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 )