Unify piggy bank events. Does not save a link to the journal (yet)

This commit is contained in:
James Cole
2022-12-11 07:17:59 +01:00
parent f33f9c797b
commit 44af5473a8
13 changed files with 237 additions and 172 deletions

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Factory;
use FireflyIII\Events\ChangedPiggyBankAmount;
use FireflyIII\Models\PiggyBank;
use FireflyIII\Models\PiggyBankEvent;
use FireflyIII\Models\TransactionJournal;
@@ -40,22 +41,20 @@ class PiggyBankEventFactory
/**
* @param TransactionJournal $journal
* @param PiggyBank|null $piggyBank
*
* @return PiggyBankEvent|null
*/
public function create(TransactionJournal $journal, ?PiggyBank $piggyBank): ?PiggyBankEvent
public function create(TransactionJournal $journal, ?PiggyBank $piggyBank): void
{
Log::debug(sprintf('Now in PiggyBankEventCreate for a %s', $journal->transactionType->type));
if (null === $piggyBank) {
Log::debug('Piggy bank is null');
return null;
return;
}
if (TransactionType::TRANSFER !== $journal->transactionType->type) {
Log::info(sprintf('Will not connect %s #%d to a piggy bank.', $journal->transactionType->type, $journal->id));
return null;
return;
}
/** @var PiggyBankRepositoryInterface $piggyRepos */
@@ -66,20 +65,17 @@ class PiggyBankEventFactory
if (null === $repetition) {
Log::error(sprintf('No piggy bank repetition on %s!', $journal->date->format('Y-m-d')));
return null;
return;
}
Log::debug('Found repetition');
$amount = $piggyRepos->getExactAmount($piggyBank, $repetition, $journal);
if (0 === bccomp($amount, '0')) {
Log::debug('Amount is zero, will not create event.');
return null;
return;
}
// amount can be negative.
$piggyRepos->addAmountToRepetition($repetition, $amount);
$event = $piggyRepos->createEventWithJournal($piggyBank, $amount, $journal);
Log::debug(sprintf('Created piggy bank event #%d', $event->id));
return $event;
}
}

View File

@@ -92,7 +92,7 @@ class TransactionJournalFactory
/**
* Store a new (set of) transaction journals.
*
* @param array $data
* @param array $data
*
* @return Collection
* @throws DuplicateTransactionException
@@ -143,7 +143,7 @@ class TransactionJournalFactory
}
/**
* @param NullArrayObject $row
* @param NullArrayObject $row
*
* @return TransactionJournal|null
* @throws DuplicateTransactionException
@@ -160,11 +160,11 @@ class TransactionJournalFactory
$type = $this->typeRepository->findTransactionType(null, $row['type']);
$carbon = $row['date'] ?? today(config('app.timezone'));
$order = $row['order'] ?? 0;
$currency = $this->currencyRepository->findCurrency((int) $row['currency_id'], $row['currency_code']);
$currency = $this->currencyRepository->findCurrency((int)$row['currency_id'], $row['currency_code']);
$foreignCurrency = $this->currencyRepository->findCurrencyNull($row['foreign_currency_id'], $row['foreign_currency_code']);
$bill = $this->billRepository->findBill((int) $row['bill_id'], $row['bill_name']);
$bill = $this->billRepository->findBill((int)$row['bill_id'], $row['bill_name']);
$billId = TransactionType::WITHDRAWAL === $type->type && null !== $bill ? $bill->id : null;
$description = (string) $row['description'];
$description = (string)$row['description'];
/** Manipulate basic fields */
$carbon->setTimezone(config('app.timezone'));
@@ -237,7 +237,7 @@ class TransactionJournalFactory
$transactionFactory->setForeignCurrency($foreignCurrency);
$transactionFactory->setReconciled($row['reconciled'] ?? false);
try {
$negative = $transactionFactory->createNegative((string) $row['amount'], (string) $row['foreign_amount']);
$negative = $transactionFactory->createNegative((string)$row['amount'], (string)$row['foreign_amount']);
} catch (FireflyException $e) {
Log::error('Exception creating negative transaction.');
Log::error($e->getMessage());
@@ -256,7 +256,7 @@ class TransactionJournalFactory
$transactionFactory->setForeignCurrency($foreignCurrency);
$transactionFactory->setReconciled($row['reconciled'] ?? false);
try {
$transactionFactory->createPositive((string) $row['amount'], (string) $row['foreign_amount']);
$transactionFactory->createPositive((string)$row['amount'], (string)$row['foreign_amount']);
} catch (FireflyException $e) {
Log::error('Exception creating positive transaction.');
Log::error($e->getMessage());
@@ -294,7 +294,7 @@ class TransactionJournalFactory
}
/**
* @param NullArrayObject $row
* @param NullArrayObject $row
*
* @return string
* @throws JsonException
@@ -306,10 +306,8 @@ class TransactionJournalFactory
unset($dataRow['import_hash_v2'], $dataRow['original_source']);
$json = json_encode($dataRow, JSON_THROW_ON_ERROR);
if (false === $json) {
$json = json_encode((string) microtime(), JSON_THROW_ON_ERROR);
$json = json_encode((string)microtime(), JSON_THROW_ON_ERROR);
Log::error(sprintf('Could not hash the original row! %s', json_last_error_msg()), $dataRow);
}
$hash = hash('sha256', $json);
Log::debug(sprintf('The hash is: %s', $hash), $dataRow);
@@ -320,7 +318,7 @@ class TransactionJournalFactory
/**
* If this transaction already exists, throw an error.
*
* @param string $hash
* @param string $hash
*
* @throws DuplicateTransactionException
* @throws JsonException
@@ -353,7 +351,7 @@ class TransactionJournalFactory
}
/**
* @param NullArrayObject $data
* @param NullArrayObject $data
*
* @throws FireflyException
*/
@@ -366,10 +364,10 @@ class TransactionJournalFactory
// validate source account.
$array = [
'id' => $data['source_id'] ? (int) $data['source_id'] : null,
'name' => $data['source_name'] ? (string) $data['source_name'] : null,
'iban' => $data['source_iban'] ? (string) $data['source_iban'] : null,
'number' => $data['source_number'] ? (string) $data['source_number'] : null,
'id' => $data['source_id'] ? (int)$data['source_id'] : null,
'name' => $data['source_name'] ? (string)$data['source_name'] : null,
'iban' => $data['source_iban'] ? (string)$data['source_iban'] : null,
'number' => $data['source_number'] ? (string)$data['source_number'] : null,
];
$validSource = $this->accountValidator->validateSource($array);
@@ -381,10 +379,10 @@ class TransactionJournalFactory
// validate destination account
$array = [
'id' => $data['destination_id'] ? (int) $data['destination_id'] : null,
'name' => $data['destination_name'] ? (string) $data['destination_name'] : null,
'iban' => $data['destination_iban'] ? (string) $data['destination_iban'] : null,
'number' => $data['destination_number'] ? (string) $data['destination_number'] : null,
'id' => $data['destination_id'] ? (int)$data['destination_id'] : null,
'name' => $data['destination_name'] ? (string)$data['destination_name'] : null,
'iban' => $data['destination_iban'] ? (string)$data['destination_iban'] : null,
'number' => $data['destination_number'] ? (string)$data['destination_number'] : null,
];
$validDestination = $this->accountValidator->validateDestination($array);
@@ -395,10 +393,10 @@ class TransactionJournalFactory
}
/**
* @param string $type
* @param TransactionCurrency|null $currency
* @param Account $source
* @param Account $destination
* @param string $type
* @param TransactionCurrency|null $currency
* @param Account $source
* @param Account $destination
*
* @return TransactionCurrency
*/
@@ -413,8 +411,8 @@ class TransactionJournalFactory
}
/**
* @param TransactionCurrency|null $currency
* @param Account $account
* @param TransactionCurrency|null $currency
* @param Account $account
*
* @return TransactionCurrency
* @throws FireflyException
@@ -437,8 +435,8 @@ class TransactionJournalFactory
/**
* Set foreign currency to NULL if it's the same as the normal currency:
*
* @param TransactionCurrency|null $currency
* @param TransactionCurrency|null $foreignCurrency
* @param TransactionCurrency|null $currency
* @param TransactionCurrency|null $foreignCurrency
*
* @return TransactionCurrency|null
*/
@@ -455,9 +453,9 @@ class TransactionJournalFactory
}
/**
* @param string $type
* @param TransactionCurrency|null $foreignCurrency
* @param Account $destination
* @param string $type
* @param TransactionCurrency|null $foreignCurrency
* @param Account $destination
*
* @return TransactionCurrency|null
*/
@@ -471,7 +469,7 @@ class TransactionJournalFactory
}
/**
* @param string $description
* @param string $description
*
* @return string
*/
@@ -486,7 +484,7 @@ class TransactionJournalFactory
* Force the deletion of an entire set of transaction journals and their meta object in case of
* an error creating a group.
*
* @param Collection $collection
* @param Collection $collection
*/
private function forceDeleteOnError(Collection $collection): void
{
@@ -500,7 +498,7 @@ class TransactionJournalFactory
}
/**
* @param Transaction $transaction
* @param Transaction $transaction
*/
private function forceTrDelete(Transaction $transaction): void
{
@@ -516,8 +514,8 @@ class TransactionJournalFactory
/**
* Link a piggy bank to this journal.
*
* @param TransactionJournal $journal
* @param NullArrayObject $data
* @param TransactionJournal $journal
* @param NullArrayObject $data
*/
private function storePiggyEvent(TransactionJournal $journal, NullArrayObject $data): void
{
@@ -528,7 +526,7 @@ class TransactionJournalFactory
return;
}
$piggyBank = $this->piggyRepository->findPiggyBank((int) $data['piggy_bank_id'], $data['piggy_bank_name']);
$piggyBank = $this->piggyRepository->findPiggyBank((int)$data['piggy_bank_id'], $data['piggy_bank_name']);
if (null !== $piggyBank) {
$this->piggyEventFactory->create($journal, $piggyBank);
@@ -540,8 +538,8 @@ class TransactionJournalFactory
}
/**
* @param TransactionJournal $journal
* @param NullArrayObject $transaction
* @param TransactionJournal $journal
* @param NullArrayObject $transaction
*/
private function storeMetaFields(TransactionJournal $journal, NullArrayObject $transaction): void
{
@@ -551,16 +549,16 @@ class TransactionJournalFactory
}
/**
* @param TransactionJournal $journal
* @param NullArrayObject $data
* @param string $field
* @param TransactionJournal $journal
* @param NullArrayObject $data
* @param string $field
*/
protected function storeMeta(TransactionJournal $journal, NullArrayObject $data, string $field): void
{
$set = [
'journal' => $journal,
'name' => $field,
'data' => (string) ($data[$field] ?? ''),
'data' => (string)($data[$field] ?? ''),
];
//Log::debug(sprintf('Going to store meta-field "%s", with value "%s".', $set['name'], $set['data']));
@@ -571,7 +569,7 @@ class TransactionJournalFactory
}
/**
* @param bool $errorOnHash
* @param bool $errorOnHash
*/
public function setErrorOnHash(bool $errorOnHash): void
{
@@ -584,7 +582,7 @@ class TransactionJournalFactory
/**
* Set the user.
*
* @param User $user
* @param User $user
*/
public function setUser(User $user): void
{