]> Dogcows Code - chaz/homebank2ledger/commitdiff
Version 0.009
authorCharles McGarvey <chazmcgarvey@brokenzipper.com>
Sat, 15 Jan 2022 23:41:15 +0000 (16:41 -0700)
committerCharles McGarvey <chazmcgarvey@brokenzipper.com>
Sat, 15 Jan 2022 23:41:15 +0000 (16:41 -0700)
18 files changed:
Changes
MANIFEST
META.json
META.yml
Makefile.PL
README
bin/homebank2ledger
lib/App/HomeBank2Ledger.pm
lib/App/HomeBank2Ledger/Formatter.pm
lib/App/HomeBank2Ledger/Formatter/Beancount.pm
lib/App/HomeBank2Ledger/Formatter/Ledger.pm
lib/App/HomeBank2Ledger/Ledger.pm
lib/App/HomeBank2Ledger/Util.pm
lib/File/HomeBank.pm
t/00-report-prereqs.t
xt/author/distmeta.t [moved from xt/release/distmeta.t with 100% similarity]
xt/author/eol.t
xt/author/no-tabs.t

diff --git a/Changes b/Changes
index 81ca6b8d28654e3f0bb33bdac0938d640b227c73..f6a4c11503d8f594e16196da6ed5230d5124551f 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,9 @@
 Revision history for App-HomeBank2Ledger.
 
 Revision history for App-HomeBank2Ledger.
 
+0.009     2022-01-15 16:40:58-07:00 America/Denver
+  * Use posting dates for internal transfers where the transactions have
+    different dates.
+
 0.008     2020-05-02 13:06:06-06:00 MST7MDT
   * Add file_version method to File::HomeBank.
   * Fix matching internal transfers for files generated by HomeBank 5.4.
 0.008     2020-05-02 13:06:06-06:00 MST7MDT
   * Add file_version method to File::HomeBank.
   * Fix matching internal transfers for files generated by HomeBank 5.4.
index 7d0f5eb2027baaa81b733030e17d6bc8087d9168..d01c7eecf5b568c2f1cf0417571a262048806e03 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,4 +1,4 @@
-# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.014.
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.024.
 Changes
 LICENSE
 MANIFEST
 Changes
 LICENSE
 MANIFEST
@@ -18,6 +18,7 @@ t/00-compile.t
 t/00-report-prereqs.dd
 t/00-report-prereqs.t
 xt/author/critic.t
 t/00-report-prereqs.dd
 t/00-report-prereqs.t
 xt/author/critic.t
+xt/author/distmeta.t
 xt/author/eol.t
 xt/author/minimum-version.t
 xt/author/no-tabs.t
 xt/author/eol.t
 xt/author/minimum-version.t
 xt/author/no-tabs.t
@@ -27,4 +28,3 @@ xt/author/pod-syntax.t
 xt/author/portability.t
 xt/release/consistent-version.t
 xt/release/cpan-changes.t
 xt/author/portability.t
 xt/release/consistent-version.t
 xt/release/cpan-changes.t
-xt/release/distmeta.t
index 62b9e97429a2995dce917158683a2b8833bd48c3..a7845802cdc5eaa0e4d671d94e8750e657a1e615 100644 (file)
--- a/META.json
+++ b/META.json
@@ -4,7 +4,7 @@
       "Charles McGarvey <chazmcgarvey@brokenzipper.com>"
    ],
    "dynamic_config" : 0,
       "Charles McGarvey <chazmcgarvey@brokenzipper.com>"
    ],
    "dynamic_config" : 0,
-   "generated_by" : "Dist::Zilla version 6.014, CPAN::Meta::Converter version 2.150010",
+   "generated_by" : "Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010",
    "license" : [
       "mit"
    ],
    "license" : [
       "mit"
    ],
    "provides" : {
       "App::HomeBank2Ledger" : {
          "file" : "lib/App/HomeBank2Ledger.pm",
    "provides" : {
       "App::HomeBank2Ledger" : {
          "file" : "lib/App/HomeBank2Ledger.pm",
-         "version" : "0.008"
+         "version" : "0.009"
       },
       "App::HomeBank2Ledger::Formatter" : {
          "file" : "lib/App/HomeBank2Ledger/Formatter.pm",
       },
       "App::HomeBank2Ledger::Formatter" : {
          "file" : "lib/App/HomeBank2Ledger/Formatter.pm",
-         "version" : "0.008"
+         "version" : "0.009"
       },
       "App::HomeBank2Ledger::Formatter::Beancount" : {
          "file" : "lib/App/HomeBank2Ledger/Formatter/Beancount.pm",
       },
       "App::HomeBank2Ledger::Formatter::Beancount" : {
          "file" : "lib/App/HomeBank2Ledger/Formatter/Beancount.pm",
-         "version" : "0.008"
+         "version" : "0.009"
       },
       "App::HomeBank2Ledger::Formatter::Ledger" : {
          "file" : "lib/App/HomeBank2Ledger/Formatter/Ledger.pm",
       },
       "App::HomeBank2Ledger::Formatter::Ledger" : {
          "file" : "lib/App/HomeBank2Ledger/Formatter/Ledger.pm",
-         "version" : "0.008"
+         "version" : "0.009"
       },
       "App::HomeBank2Ledger::Ledger" : {
          "file" : "lib/App/HomeBank2Ledger/Ledger.pm",
       },
       "App::HomeBank2Ledger::Ledger" : {
          "file" : "lib/App/HomeBank2Ledger/Ledger.pm",
-         "version" : "0.008"
+         "version" : "0.009"
       },
       "App::HomeBank2Ledger::Util" : {
          "file" : "lib/App/HomeBank2Ledger/Util.pm",
       },
       "App::HomeBank2Ledger::Util" : {
          "file" : "lib/App/HomeBank2Ledger/Util.pm",
-         "version" : "0.008"
+         "version" : "0.009"
       },
       "File::HomeBank" : {
          "file" : "lib/File/HomeBank.pm",
       },
       "File::HomeBank" : {
          "file" : "lib/File/HomeBank.pm",
-         "version" : "0.008"
+         "version" : "0.009"
       }
    },
    "release_status" : "stable",
       }
    },
    "release_status" : "stable",
          "web" : "https://github.com/chazmcgarvey/homebank2ledger"
       }
    },
          "web" : "https://github.com/chazmcgarvey/homebank2ledger"
       }
    },
-   "version" : "0.008",
+   "version" : "0.009",
    "x_authority" : "cpan:CCM",
    "x_generated_by_perl" : "v5.28.0",
    "x_authority" : "cpan:CCM",
    "x_generated_by_perl" : "v5.28.0",
-   "x_serialization_backend" : "Cpanel::JSON::XS version 4.15",
+   "x_serialization_backend" : "Cpanel::JSON::XS version 4.25",
    "x_spdx_expression" : "MIT"
 }
 
    "x_spdx_expression" : "MIT"
 }
 
index e1aa9b6278409a513805718b59dc77c48dc9f342..e29ada59314466330b77f865943776c72f7b067c 100644 (file)
--- a/META.yml
+++ b/META.yml
@@ -11,7 +11,7 @@ build_requires:
 configure_requires:
   ExtUtils::MakeMaker: '0'
 dynamic_config: 0
 configure_requires:
   ExtUtils::MakeMaker: '0'
 dynamic_config: 0
-generated_by: 'Dist::Zilla version 6.014, CPAN::Meta::Converter version 2.150010'
+generated_by: 'Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010'
 license: mit
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
 license: mit
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -27,25 +27,25 @@ no_index:
 provides:
   App::HomeBank2Ledger:
     file: lib/App/HomeBank2Ledger.pm
 provides:
   App::HomeBank2Ledger:
     file: lib/App/HomeBank2Ledger.pm
-    version: '0.008'
+    version: '0.009'
   App::HomeBank2Ledger::Formatter:
     file: lib/App/HomeBank2Ledger/Formatter.pm
   App::HomeBank2Ledger::Formatter:
     file: lib/App/HomeBank2Ledger/Formatter.pm
-    version: '0.008'
+    version: '0.009'
   App::HomeBank2Ledger::Formatter::Beancount:
     file: lib/App/HomeBank2Ledger/Formatter/Beancount.pm
   App::HomeBank2Ledger::Formatter::Beancount:
     file: lib/App/HomeBank2Ledger/Formatter/Beancount.pm
-    version: '0.008'
+    version: '0.009'
   App::HomeBank2Ledger::Formatter::Ledger:
     file: lib/App/HomeBank2Ledger/Formatter/Ledger.pm
   App::HomeBank2Ledger::Formatter::Ledger:
     file: lib/App/HomeBank2Ledger/Formatter/Ledger.pm
-    version: '0.008'
+    version: '0.009'
   App::HomeBank2Ledger::Ledger:
     file: lib/App/HomeBank2Ledger/Ledger.pm
   App::HomeBank2Ledger::Ledger:
     file: lib/App/HomeBank2Ledger/Ledger.pm
-    version: '0.008'
+    version: '0.009'
   App::HomeBank2Ledger::Util:
     file: lib/App/HomeBank2Ledger/Util.pm
   App::HomeBank2Ledger::Util:
     file: lib/App/HomeBank2Ledger/Util.pm
-    version: '0.008'
+    version: '0.009'
   File::HomeBank:
     file: lib/File/HomeBank.pm
   File::HomeBank:
     file: lib/File/HomeBank.pm
-    version: '0.008'
+    version: '0.009'
 requires:
   Carp: '0'
   Exporter: '0'
 requires:
   Carp: '0'
   Exporter: '0'
@@ -65,7 +65,7 @@ resources:
   bugtracker: https://github.com/chazmcgarvey/homebank2ledger/issues
   homepage: https://github.com/chazmcgarvey/homebank2ledger
   repository: https://github.com/chazmcgarvey/homebank2ledger.git
   bugtracker: https://github.com/chazmcgarvey/homebank2ledger/issues
   homepage: https://github.com/chazmcgarvey/homebank2ledger
   repository: https://github.com/chazmcgarvey/homebank2ledger.git
-version: '0.008'
+version: '0.009'
 x_authority: cpan:CCM
 x_generated_by_perl: v5.28.0
 x_serialization_backend: 'YAML::Tiny version 1.73'
 x_authority: cpan:CCM
 x_generated_by_perl: v5.28.0
 x_serialization_backend: 'YAML::Tiny version 1.73'
index adfe83e25e432f1d86712bc7ac6a792825e28197..97b7b12208e1d149a88e75239dbd48b8cf4b3035 100644 (file)
@@ -1,4 +1,4 @@
-# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.014.
+# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.024.
 use strict;
 use warnings;
 
 use strict;
 use warnings;
 
@@ -41,7 +41,7 @@ my %WriteMakefileArgs = (
     "IPC::Open3" => 0,
     "Test::More" => 0
   },
     "IPC::Open3" => 0,
     "Test::More" => 0
   },
-  "VERSION" => "0.008",
+  "VERSION" => "0.009",
   "test" => {
     "TESTS" => "t/*.t"
   }
   "test" => {
     "TESTS" => "t/*.t"
   }
diff --git a/README b/README
index 9a40d413453d06f00ac239afaae136a39bccd094..26491733889a1f61498eba80dc6903e0b7782ab7 100644 (file)
--- a/README
+++ b/README
@@ -4,7 +4,7 @@ NAME
 
 VERSION
 
 
 VERSION
 
-    version 0.008
+    version 0.009
 
 SYNOPSIS
 
 
 SYNOPSIS
 
@@ -19,8 +19,8 @@ DESCRIPTION
 
     homebank2ledger converts HomeBank <http://homebank.free.fr/> files to a
     format usable by Ledger <https://www.ledger-cli.org/>. It can also
 
     homebank2ledger converts HomeBank <http://homebank.free.fr/> files to a
     format usable by Ledger <https://www.ledger-cli.org/>. It can also
-    convert directly to the similar Beancount <http://furius.ca/beancount/>
-    format.
+    convert directly to the similar Beancount
+    <https://beancount.github.io/docs/index.html> format.
 
     This software is EXPERIMENTAL, in early development. Its interface may
     change without notice.
 
     This software is EXPERIMENTAL, in early development. Its interface may
     change without notice.
index a3ffbf806c6de6f599b90dc3bd1bbe5940b5c613..2bfd51aaec1bf0282c390188081ae180ff18d754 100644 (file)
@@ -10,7 +10,7 @@ use strict;
 
 use App::HomeBank2Ledger;
 
 
 use App::HomeBank2Ledger;
 
-our $VERSION = '0.008'; # VERSION
+our $VERSION = '0.009'; # VERSION
 
 App::HomeBank2Ledger->main(@ARGV);
 
 
 App::HomeBank2Ledger->main(@ARGV);
 
@@ -26,7 +26,7 @@ homebank2ledger - A tool to convert HomeBank files to Ledger format
 
 =head1 VERSION
 
 
 =head1 VERSION
 
-version 0.008
+version 0.009
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
@@ -41,7 +41,7 @@ version 0.008
 
 F<homebank2ledger> converts L<HomeBank|http://homebank.free.fr/> files to a format usable by
 L<Ledger|https://www.ledger-cli.org/>. It can also convert directly to the similar
 
 F<homebank2ledger> converts L<HomeBank|http://homebank.free.fr/> files to a format usable by
 L<Ledger|https://www.ledger-cli.org/>. It can also convert directly to the similar
-L<Beancount|http://furius.ca/beancount/> format.
+L<Beancount|https://beancount.github.io/docs/index.html> format.
 
 This software is B<EXPERIMENTAL>, in early development. Its interface may change without notice.
 
 
 This software is B<EXPERIMENTAL>, in early development. Its interface may change without notice.
 
index bad0a39611626cafa8c1a1565a379710f30876dd..5a22d6234eb35b277adc5cf7df29d6a2b2bbf2e8 100644 (file)
@@ -11,7 +11,7 @@ use File::HomeBank;
 use Getopt::Long 2.38 qw(GetOptionsFromArray);
 use Pod::Usage;
 
 use Getopt::Long 2.38 qw(GetOptionsFromArray);
 use Pod::Usage;
 
-our $VERSION = '0.008'; # VERSION
+our $VERSION = '0.009'; # VERSION
 
 my %ACCOUNT_TYPES = (   # map HomeBank account types to Ledger accounts
     bank        => 'Assets:Bank',
 
 my %ACCOUNT_TYPES = (   # map HomeBank account types to Ledger accounts
     bank        => 'Assets:Bank',
@@ -264,10 +264,12 @@ sub convert_homebank_to_ledger {
         my $memo    = $transaction->{wording} || '';
         my $payee   = $homebank->find_payee_by_key($transaction->{payee});
         my $tags    = _split_tags($transaction->{tags});
         my $memo    = $transaction->{wording} || '';
         my $payee   = $homebank->find_payee_by_key($transaction->{payee});
         my $tags    = _split_tags($transaction->{tags});
+        my $date    = $transaction->{date};
 
         my @postings;
 
         push @postings, {
 
         my @postings;
 
         push @postings, {
+            date        => $date,
             account     => $account->{ledger_name},
             amount      => $amount,
             commodity   => $commodities{$account->{currency}},
             account     => $account->{ledger_name},
             amount      => $amount,
             commodity   => $commodities{$account->{currency}},
@@ -294,9 +296,11 @@ sub convert_homebank_to_ledger {
             $seen{$transaction->{transfer_key}}++        if $transaction->{transfer_key};
             $seen{$paired_transaction->{transfer_key}}++ if $paired_transaction->{transfer_key};
 
             $seen{$transaction->{transfer_key}}++        if $transaction->{transfer_key};
             $seen{$paired_transaction->{transfer_key}}++ if $paired_transaction->{transfer_key};
 
+            my $paired_date  = $paired_transaction && $paired_transaction->{date};
             my $paired_payee = $homebank->find_payee_by_key($paired_transaction->{payee});
 
             push @postings, {
             my $paired_payee = $homebank->find_payee_by_key($paired_transaction->{payee});
 
             push @postings, {
+                date        => $paired_date,
                 account     => $dst_account->{ledger_name},
                 amount      => $paired_transaction->{amount} || -$transaction->{amount},
                 commodity   => $commodities{$dst_account->{currency}},
                 account     => $dst_account->{ledger_name},
                 amount      => $paired_transaction->{amount} || -$transaction->{amount},
                 commodity   => $commodities{$dst_account->{currency}},
@@ -330,7 +334,7 @@ sub convert_homebank_to_ledger {
                 };
             }
         }
                 };
             }
         }
-        else {  # with or without category
+        else {  # normal transaction with or without category
             my $amount          = -$transaction->{amount};
             my $category        = $homebank->find_category_by_key($transaction->{category});
             my $other_account   = $category   ? $category->{ledger_name}
             my $amount          = -$transaction->{amount};
             my $category        = $homebank->find_category_by_key($transaction->{category});
             my $other_account   = $category   ? $category->{ledger_name}
@@ -356,7 +360,7 @@ sub convert_homebank_to_ledger {
         }
 
         $ledger->add_transactions({
         }
 
         $ledger->add_transactions({
-            date        => $transaction->{date},
+            date        => $date,
             payee       => $payee->{name},
             memo        => $memo,
             postings    => \@postings,
             payee       => $payee->{name},
             memo        => $memo,
             postings    => \@postings,
@@ -445,7 +449,7 @@ App::HomeBank2Ledger - A tool to convert HomeBank files to Ledger format
 
 =head1 VERSION
 
 
 =head1 VERSION
 
-version 0.008
+version 0.009
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
index de179e3a8040b561dae7c632b800ab789bc1e6f9..fb2059b99bce791b4bb36dcbca295b697a226626 100644 (file)
@@ -9,7 +9,7 @@ use Module::Load;
 use Module::Pluggable search_path   => [__PACKAGE__],
                       sub_name      => 'available_formatters';
 
 use Module::Pluggable search_path   => [__PACKAGE__],
                       sub_name      => 'available_formatters';
 
-our $VERSION = '0.008'; # VERSION
+our $VERSION = '0.009'; # VERSION
 
 sub _croak { require Carp; Carp::croak(@_) }
 
 
 sub _croak { require Carp; Carp::croak(@_) }
 
@@ -59,7 +59,7 @@ App::HomeBank2Ledger::Formatter - Abstract class for formatting a ledger
 
 =head1 VERSION
 
 
 =head1 VERSION
 
-version 0.008
+version 0.009
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
index a7a66bf87c056cb067b5c76b9e7eb3499300910b..8cdcb1c8c4cccfa3fdca9ef4ae19db2480097eac 100644 (file)
@@ -11,7 +11,7 @@ use Scalar::Util qw(looks_like_number);
 
 use parent 'App::HomeBank2Ledger::Formatter';
 
 
 use parent 'App::HomeBank2Ledger::Formatter';
 
-our $VERSION = '0.008'; # VERSION
+our $VERSION = '0.009'; # VERSION
 
 my %STATUS_SYMBOLS = (
     cleared => '*',
 
 my %STATUS_SYMBOLS = (
     cleared => '*',
@@ -117,7 +117,7 @@ sub _format_transaction {
     my $date        = $transaction->{date};
     my $status      = $transaction->{status};
     my $payee       = $transaction->{payee} || '';
     my $date        = $transaction->{date};
     my $status      = $transaction->{status};
     my $payee       = $transaction->{payee} || '';
-    my $memo        = $transaction->{memo}  || '';
+    my $memo        = $transaction->{note} // $transaction->{memo} // '';
     my @postings    = @{$transaction->{postings}};
 
     my @out;
     my @postings    = @{$transaction->{postings}};
 
     my @out;
@@ -165,9 +165,10 @@ sub _format_transaction {
         push @line, '  ';
         if (defined $posting->{amount}) {
             push @line, $self->_format_amount($posting->{amount}, $posting->{commodity});
         push @line, '  ';
         if (defined $posting->{amount}) {
             push @line, $self->_format_amount($posting->{amount}, $posting->{commodity});
-            my $lot_price = $posting->{lot_price};
-            my $lot_date  = $posting->{lot_date};
-            my $lot_ref   = $posting->{lot_ref};
+            my $lot = $posting->{lot} || {};
+            my $lot_price = $lot->{price} // $posting->{lot_price};
+            my $lot_date  = $lot->{date}  // $posting->{lot_date};
+            my $lot_ref   = $lot->{ref}   // $posting->{lot_ref};
             if ($lot_price || $lot_date || $lot_ref) {
                 push @line, ' {',
                             join(', ',
             if ($lot_price || $lot_date || $lot_ref) {
                 push @line, ' {',
                             join(', ',
@@ -301,11 +302,11 @@ App::HomeBank2Ledger::Formatter::Beancount - Beancount formatter
 
 =head1 VERSION
 
 
 =head1 VERSION
 
-version 0.008
+version 0.009
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
-This is a formatter for L<Beancount|http://furius.ca/beancount/>.
+This is a formatter for L<Beancount|https://beancount.github.io/docs/index.html>.
 
 =head1 METHODS
 
 
 =head1 METHODS
 
index dcae0ddbd27e12843ec05bcc4695a85561fdb14a..7385165ba73be40a2975b195395c973378054338 100644 (file)
@@ -10,7 +10,7 @@ use App::HomeBank2Ledger::Util qw(commify rtrim);
 
 use parent 'App::HomeBank2Ledger::Formatter';
 
 
 use parent 'App::HomeBank2Ledger::Formatter';
 
-our $VERSION = '0.008'; # VERSION
+our $VERSION = '0.009'; # VERSION
 
 my %STATUS_SYMBOLS = (
     cleared => '*',
 
 my %STATUS_SYMBOLS = (
     cleared => '*',
@@ -131,16 +131,18 @@ sub _format_transaction {
 
     my $account_width = $self->account_width;
 
 
     my $account_width = $self->account_width;
 
-    my $date        = $transaction->{date};
-    my $status      = $transaction->{status};
-    my $payee       = $self->_format_string($transaction->{payee} || '');
-    my $memo        = $self->_format_string($transaction->{memo}  || '');
-    my @postings    = @{$transaction->{postings}};
+    my $date        = $transaction->{date} or _croak 'Transaction date is required';
+    my $aux_date    = $transaction->{aux_date} || $transaction->{effective_date} || '';
+    my $status      = $transaction->{status} // '';
+    my $code        = $transaction->{code};
+    my $payee       = $self->_format_string($transaction->{payee});
+    my $note        = $self->_format_string($transaction->{note} // $transaction->{memo});
+    my @postings    = @{$transaction->{postings} || _croak 'At least one transaction posting is required'};
 
     my @out;
 
     # figure out the Ledger transaction status
 
     my @out;
 
     # figure out the Ledger transaction status
-    my $status_symbol = $STATUS_SYMBOLS{$status || ''};
+    my $status_symbol = $STATUS_SYMBOLS{$status};
     if (!$status_symbol) {
         my %posting_statuses = map { ($_->{status} || '') => 1 } @postings;
         if (keys(%posting_statuses) == 1) {
     if (!$status_symbol) {
         my %posting_statuses = map { ($_->{status} || '') => 1 } @postings;
         if (keys(%posting_statuses) == 1) {
@@ -149,17 +151,28 @@ sub _format_transaction {
         }
     }
 
         }
     }
 
-    $payee =~ s/(?:  )|\t;/ ;/g;    # don't turn into a memo
+    $aux_date = '' if $date eq $aux_date;
+    $code =~ s/[\(\)]+// if defined $code;
+    $payee =~ s/(?:  )|\t;/ ;/g if defined $payee;    # don't turn into a note
 
 
-    push @out, sprintf('%s%s%s%s', $date,
-        $status_symbol && " ${status_symbol}",
-        $payee         && " $payee",
-        $memo          && "  ; $memo",
+    my $has_code = defined $code && $code ne '';
+    my $has_payee = defined $payee && $payee ne '';
+    my $has_note = defined $note && $note ne '';
+
+    push @out, join('', $date,
+        $aux_date               && "=${aux_date}",
+        $status_symbol          && " ${status_symbol}",
+        $has_code               && " (${code})",
+        $has_payee              && " ${payee}",
+        $has_note && $has_payee && "  ; ${note}",
     );
     );
+    if ($has_note && !$has_payee) {
+        push @out, "    ; ${note}";
+    }
 
     my $metadata = $transaction->{metadata} || {};
     for my $key (sort keys %$metadata) {
 
     my $metadata = $transaction->{metadata} || {};
     for my $key (sort keys %$metadata) {
-        my $value = $self->_format_string($metadata->{$key});
+        my $value = $self->_format_string($metadata->{$key}) ;
         push @out, "    ; ${key}: ${value}";
     }
 
         push @out, "    ; ${key}: ${value}";
     }
 
@@ -176,15 +189,21 @@ sub _format_transaction {
         push @line, '  ';
         if (defined $posting->{amount}) {
             push @line, $self->_format_amount($posting->{amount}, $posting->{commodity});
         push @line, '  ';
         if (defined $posting->{amount}) {
             push @line, $self->_format_amount($posting->{amount}, $posting->{commodity});
-            if (my $price = $posting->{lot_price}) {
-                my $is_fixed = $posting->{lot_fixed};
+            my $lot = $posting->{lot} || {};
+            if (my $lot_price = $lot->{price} // $posting->{lot_price}) {
+                my $is_fixed = $lot_price->{fixed} // $posting->{lot_fixed};
                 my $fixed_symbol = $is_fixed ? '=' : '';
                 push @line, " {${fixed_symbol}",
                 my $fixed_symbol = $is_fixed ? '=' : '';
                 push @line, " {${fixed_symbol}",
-                            $self->_format_amount($price->{amount}, $price->{commodity}),
+                            $self->_format_amount($lot_price->{amount}, $lot_price->{commodity}),
                             '}';
             }
                             '}';
             }
-            if (my $lot_date = $posting->{lot_date}) {
-                push @line, " [$posting->{lot_date}]";
+            if (my $lot_date = $lot->{date} // $posting->{lot_date}) {
+                push @line, " [${lot_date}]";
+            }
+            if (my $lot_note = $self->_format_string($lot->{note} // $posting->{lot_note} // '')) {
+                $lot_note =~ s/[\(\)]+//;   # cleanup
+                $lot_note =~ s/^\@+//;
+                push @line, " (${lot_note})" if $lot_note;
             }
             if (my $cost = $posting->{total_cost} // $posting->{cost}) {
                 my $is_total = defined $posting->{total_cost};
             }
             if (my $cost = $posting->{total_cost} // $posting->{cost}) {
                 my $is_total = defined $posting->{total_cost};
@@ -193,9 +212,22 @@ sub _format_transaction {
                             $self->_format_amount($cost->{amount}, $cost->{commodity});
             }
         }
                             $self->_format_amount($cost->{amount}, $cost->{commodity});
             }
         }
-        if (my $note = $posting->{note}) {
-            $note = $self->_format_string($note);
-            push @line, "  ; $note" if $note ne $memo;
+        my $posting_date        = $posting->{date} || '';
+        my $posting_aux_date    = $posting->{aux_date} || '';
+        my $posting_note        = $self->_format_string($posting->{note} // $posting->{memo} // '');
+        $posting_date       = '' if $posting_date eq $date;
+        $posting_aux_date   = '' if $posting_aux_date eq $aux_date;
+        $posting_note       = '' if $has_note && $posting_note eq $note;
+        my $has_posting_note = defined $posting_note && $posting_note ne '';
+        if ($posting_date || $posting_aux_date || $has_posting_note) {
+            if ($posting_date || $posting_aux_date) {
+                $posting_note = sprintf('[%s%s]%s',
+                    $posting_date,
+                    $posting_aux_date && "=${posting_aux_date}",
+                    $has_posting_note && " ${posting_note}",
+                );
+            }
+            push @line, "  ; ${posting_note}";
         }
 
         push @out, join('', @line);
         }
 
         push @out, join('', @line);
@@ -206,9 +238,8 @@ sub _format_transaction {
             push @out, "      ; ${key}: ${value}";
         }
 
             push @out, "      ; ${key}: ${value}";
         }
 
-        if (my $posting_payee = $posting->{payee}) {
-            $posting_payee = $self->_format_string($posting_payee);
-            push @out, "      ; Payee: $posting_payee" if $posting_payee ne $payee;
+        if (my $posting_payee = $self->_format_string($posting->{payee} // '')) {
+            push @out, "      ; Payee: $posting_payee" if !$has_payee || $posting_payee ne $payee;
         }
 
         if (my @tags = @{$posting->{tags} || []}) {
         }
 
         if (my @tags = @{$posting->{tags} || []}) {
@@ -223,7 +254,7 @@ sub _format_transaction {
 
 sub _format_string {
     my $self = shift;
 
 sub _format_string {
     my $self = shift;
-    my $str  = shift;
+    my $str  = shift // return;
     $str =~ s/\v//g;
     return $str;
 }
     $str =~ s/\v//g;
     return $str;
 }
@@ -271,7 +302,7 @@ App::HomeBank2Ledger::Formatter::Ledger - Ledger formatter
 
 =head1 VERSION
 
 
 =head1 VERSION
 
-version 0.008
+version 0.009
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
index 98b84d11c8b38e93a6f70fe599a6fd784c36e475..f3aadf32ee5f429c2eaf1c9709441eb89eecbc26 100644 (file)
@@ -5,7 +5,7 @@ package App::HomeBank2Ledger::Ledger;
 use warnings;
 use strict;
 
 use warnings;
 use strict;
 
-our $VERSION = '0.008'; # VERSION
+our $VERSION = '0.009'; # VERSION
 
 
 sub new {
 
 
 sub new {
@@ -63,7 +63,7 @@ App::HomeBank2Ledger::Ledger - Ledger data representation
 
 =head1 VERSION
 
 
 =head1 VERSION
 
-version 0.008
+version 0.009
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
@@ -94,7 +94,7 @@ accounts. Examples:
 
 =item *
 
 
 =item *
 
-"Liabilities:Credit Card:CapitalOne"
+"Liabilities:Credit Card:Capital One"
 
 =back
 
 
 =back
 
@@ -123,9 +123,11 @@ This is a hashref like this:
 
     {
         date        => '2019-06-12',        # required
 
     {
         date        => '2019-06-12',        # required
-        payee       => 'Malcolm Reynolds',  # required
+        aux_date    => '2019-06-13',        # optional
         status      => 'cleared',           # optional; can be "cleared" or "pending"
         status      => 'cleared',           # optional; can be "cleared" or "pending"
-        memo        => 'Medical supplies',  # optional
+        code        => '1234',              # optional
+        payee       => 'Malcolm Reynolds',  # required
+        note        => 'Medical supplies',  # optional
         postings    => [                    # required
             {
                 account     => 'Some Account',  # required
         postings    => [                    # required
             {
                 account     => 'Some Account',  # required
@@ -141,9 +143,20 @@ This is a hashref like this:
                     frac    => 2,
                 },
                 payee       => 'Somebody',      # optional
                     frac    => 2,
                 },
                 payee       => 'Somebody',      # optional
-                memo        => 'Whatever',      # optional
+                note        => 'Whatever',      # optional
                 status      => 'pending',       # optional; can be "cleared" or "pending"
                 tags        => [qw(niska train-job)],
                 status      => 'pending',       # optional; can be "cleared" or "pending"
                 tags        => [qw(niska train-job)],
+                lot         => {                # optional
+                    date        => '2019-01-28',
+                    price       => {
+                        amount      => '15.00',
+                        commodity   => { ... },
+                    },
+                },
+                cost        => {                # optional
+                    amount      => '10.00',
+                    commodity   => { ... },
+                },
             },
             ...
         ],
             },
             ...
         ],
index 7034fe2e8da2213aad8d36a5d4e45453536b760e..28622282b4c9ad715fc9bf8838358a94a9ef0aca 100644 (file)
@@ -6,7 +6,7 @@ use strict;
 
 use Exporter qw(import);
 
 
 use Exporter qw(import);
 
-our $VERSION = '0.008'; # VERSION
+our $VERSION = '0.009'; # VERSION
 
 our @EXPORT_OK = qw(commify rtrim);
 
 
 our @EXPORT_OK = qw(commify rtrim);
 
@@ -42,7 +42,7 @@ App::HomeBank2Ledger::Util - Miscellaneous utility functions
 
 =head1 VERSION
 
 
 =head1 VERSION
 
-version 0.008
+version 0.009
 
 =head1 FUNCTIONS
 
 
 =head1 FUNCTIONS
 
index 363fb3f2b47c35ec15a15bef34625eef6b25d74c..70278c04e455e5312dca48b0d14a94fca3cfffa9 100644 (file)
@@ -12,7 +12,7 @@ use Time::Piece;
 use XML::Entities;
 use XML::Parser::Lite;
 
 use XML::Entities;
 use XML::Parser::Lite;
 
-our $VERSION = '0.008'; # VERSION
+our $VERSION = '0.009'; # VERSION
 
 our @EXPORT_OK = qw(parse_string parse_file);
 
 
 our @EXPORT_OK = qw(parse_string parse_file);
 
@@ -502,7 +502,7 @@ File::HomeBank - Parse HomeBank files
 
 =head1 VERSION
 
 
 =head1 VERSION
 
-version 0.008
+version 0.009
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
index c72183a1bebf16b344dc1a660fee5207cee16e05..c3a94ca1da25657cbfbae83860d3d64ac9c030ff 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
 use strict;
 use warnings;
 
-# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.027
+# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.028
 
 use Test::More tests => 1;
 
 
 use Test::More tests => 1;
 
@@ -188,6 +188,6 @@ if ( @dep_errors ) {
     );
 }
 
     );
 }
 
-pass;
+pass('Reported prereqs');
 
 # vim: ts=4 sts=4 sw=4 et:
 
 # vim: ts=4 sts=4 sw=4 et:
similarity index 100%
rename from xt/release/distmeta.t
rename to xt/author/distmeta.t
index 4aadb993a326e02b37ff116a899292e388282ce9..56e263b5483f96d75f401d023dea07d6460962f5 100644 (file)
@@ -19,6 +19,7 @@ my @files = (
     't/00-report-prereqs.dd',
     't/00-report-prereqs.t',
     'xt/author/critic.t',
     't/00-report-prereqs.dd',
     't/00-report-prereqs.t',
     'xt/author/critic.t',
+    'xt/author/distmeta.t',
     'xt/author/eol.t',
     'xt/author/minimum-version.t',
     'xt/author/no-tabs.t',
     'xt/author/eol.t',
     'xt/author/minimum-version.t',
     'xt/author/no-tabs.t',
@@ -27,8 +28,7 @@ my @files = (
     'xt/author/pod-syntax.t',
     'xt/author/portability.t',
     'xt/release/consistent-version.t',
     'xt/author/pod-syntax.t',
     'xt/author/portability.t',
     'xt/release/consistent-version.t',
-    'xt/release/cpan-changes.t',
-    'xt/release/distmeta.t'
+    'xt/release/cpan-changes.t'
 );
 
 eol_unix_ok($_, { trailing_whitespace => 1 }) foreach @files;
 );
 
 eol_unix_ok($_, { trailing_whitespace => 1 }) foreach @files;
index 591a0dce52b05625468397273402d872c6e83775..d875ae940dee979381960f8210b5d4690724f7fe 100644 (file)
@@ -19,6 +19,7 @@ my @files = (
     't/00-report-prereqs.dd',
     't/00-report-prereqs.t',
     'xt/author/critic.t',
     't/00-report-prereqs.dd',
     't/00-report-prereqs.t',
     'xt/author/critic.t',
+    'xt/author/distmeta.t',
     'xt/author/eol.t',
     'xt/author/minimum-version.t',
     'xt/author/no-tabs.t',
     'xt/author/eol.t',
     'xt/author/minimum-version.t',
     'xt/author/no-tabs.t',
@@ -27,8 +28,7 @@ my @files = (
     'xt/author/pod-syntax.t',
     'xt/author/portability.t',
     'xt/release/consistent-version.t',
     'xt/author/pod-syntax.t',
     'xt/author/portability.t',
     'xt/release/consistent-version.t',
-    'xt/release/cpan-changes.t',
-    'xt/release/distmeta.t'
+    'xt/release/cpan-changes.t'
 );
 
 notabs_ok($_) foreach @files;
 );
 
 notabs_ok($_) foreach @files;
This page took 0.047671 seconds and 4 git commands to generate.