Fix tag assignment for multiple deposits [skip ci]

This commit is contained in:
James Cole
2016-12-09 14:50:28 +01:00
parent 122d988ed2
commit 35d105588b

View File

@@ -296,26 +296,47 @@ class TagRepository implements TagRepositoryInterface
Log::debug(sprintf('Tag #%d has %d journals to verify:', $tag->id, $journals->count())); Log::debug(sprintf('Tag #%d has %d journals to verify:', $tag->id, $journals->count()));
/** @var TransactionJournal $original */ /** @var TransactionJournal $existing */
foreach ($journals as $original) { foreach ($journals as $existing) {
Log::debug(sprintf('Now comparing new journal #%d to existing journal #%d', $journal->id, $original->id)); Log::debug(sprintf('Now existingcomparing new journal #%d to existing journal #%d', $journal->id, $existing->id));
// $checkAccount is the source_account for a withdrawal // $checkAccount is the source_account for a withdrawal
// $checkAccount is the destination_account for a deposit // $checkAccount is the destination_account for a deposit
$originalSources = join(',', array_unique(TransactionJournal::sourceAccountList($original)->pluck('id')->toArray())); $existingSources = join(',', array_unique(TransactionJournal::sourceAccountList($existing)->pluck('id')->toArray()));
$originalDestinations = join(',', array_unique(TransactionJournal::destinationAccountList($original)->pluck('id')->toArray())); $existingDestinations = join(',', array_unique(TransactionJournal::destinationAccountList($existing)->pluck('id')->toArray()));
if ($original->isWithdrawal() && $originalSources !== $journalDestinations) { if ($existing->isWithdrawal() && $existingSources !== $journalDestinations) {
Log::debug(sprintf('Original journal #%d is a withdrawal.', $original->id)); /*
Log::debug(sprintf('Journal #%d must have these destination accounts: %s', $journal->id, $originalSources)); * There can only be one withdrawal. And the source account(s) of the withdrawal
* must be the same as the destination of the deposit. Because any transaction that arrives
* here ($journal) must be a deposit.
*/
Log::debug(sprintf('Existing journal #%d is a withdrawal.', $existing->id));
Log::debug(sprintf('New journal #%d must have these destination accounts: %s', $journal->id, $existingSources));
Log::debug(sprintf('New journal #%d actually these destination accounts: %s', $journal->id, $journalDestinations));
Log::debug('So match is FALSE');
$match = false;
}
if ($existing->isDeposit() && $journal->isDeposit() && $existingDestinations !== $journalDestinations) {
/*
* There can be multiple deposits.
* They must have the destination the same as the other deposits.
*/
Log::debug(sprintf('Existing journal #%d is a deposit.', $existing->id));
Log::debug(sprintf('Journal #%d must have these destination accounts: %s', $journal->id, $existingDestinations));
Log::debug(sprintf('Journal #%d actually these destination accounts: %s', $journal->id, $journalDestinations)); Log::debug(sprintf('Journal #%d actually these destination accounts: %s', $journal->id, $journalDestinations));
Log::debug('So match is FALSE'); Log::debug('So match is FALSE');
$match = false; $match = false;
} }
if ($original->isDeposit() && $originalDestinations !== $journalSources) {
Log::debug(sprintf('Original journal #%d is a deposit.', $original->id)); if ($existing->isDeposit() && $journal->isWithdrawal() && $existingDestinations !== $journalSources) {
Log::debug(sprintf('Journal #%d must have these destination accounts: %s', $journal->id, $originalSources)); /*
Log::debug(sprintf('Journal #%d actually these destination accounts: %s', $journal->id, $journalDestinations)); * There can be one new withdrawal only. It must have the same source as the existing has destination.
*/
Log::debug(sprintf('Existing journal #%d is a deposit.', $existing->id));
Log::debug(sprintf('Journal #%d must have these source accounts: %s', $journal->id, $existingDestinations));
Log::debug(sprintf('Journal #%d actually these source accounts: %s', $journal->id, $journalSources));
Log::debug('So match is FALSE'); Log::debug('So match is FALSE');
$match = false; $match = false;