+ my $ledger = shift;
+
+ $account = $self->_format_account($account);
+
+ my $oldest = $self->{oldest_transaction_by_account};
+ if (!$oldest) {
+ # build index
+ for my $transaction (@{$ledger->transactions}) {
+ for my $posting (@{$transaction->{postings}}) {
+ my $account = $self->_format_account($posting->{account});
+
+ if ($transaction->{date} lt ($oldest->{$account}{date} || '9999-99-99')) {
+ $oldest->{$account} = $transaction;
+ }
+ }
+ }
+
+ $self->{oldest_transaction_by_account} = $oldest;
+ }
+
+ return $oldest->{$account};
+}
+
+sub _find_oldest_transaction_by_commodity {
+ my $self = shift;
+ my $commodity = shift;
+ my $ledger = shift;
+
+ my $oldest = $self->{oldest_transaction_by_commodity};
+ if (!$oldest) {
+ # build index
+ for my $transaction (@{$ledger->transactions}) {
+ for my $posting (@{$transaction->{postings}}) {
+ my $symbol = $posting->{commodity}{symbol};
+ next if !$symbol;
+
+ if ($transaction->{date} lt ($oldest->{$symbol}{date} || '9999-99-99')) {
+ $oldest->{$symbol} = $transaction;
+ }
+ }
+ }
+
+ $self->{oldest_transaction_by_commodity} = $oldest;
+ }
+
+ return $oldest->{$commodity->{symbol}};