This commit is contained in:
James Cole 2023-01-16 06:54:57 +01:00
parent d4f1b9a1bc
commit a753fde2f1
No known key found for this signature in database
GPG Key ID: B49A324B7EAD6D80
3 changed files with 13 additions and 5 deletions

View File

@ -46,5 +46,8 @@ class CategoryDestroyService
// also delete all relations between categories and transactions:
DB::table('category_transaction')->where('category_id', (int)$category->id)->delete();
// delete references to category from recurring transactions.
DB::table('rt_meta')->where('name', 'category_id')->where('value', $category->id)->delete();
}
}

View File

@ -294,7 +294,7 @@ trait RecurringTransactionTrait
return;
}
$transaction->recurrenceTransactionMeta()->where('name', 'category_name')->delete();
$meta = $transaction->recurrenceTransactionMeta()->where('name', 'category_id')->first();
if (null === $meta) {
$meta = new RecurrenceTransactionMeta();

View File

@ -224,9 +224,10 @@ class RecurrenceUpdateService
*/
private function updateTransactions(Recurrence $recurrence, array $transactions): void
{
Log::debug('Now in updateTransactions()');
$originalCount = $recurrence->recurrenceTransactions()->count();
if (0 === count($transactions)) {
// wont drop transactions, rather avoid.
// won't drop transactions, rather avoid.
return;
}
// user added or removed repetitions, delete all and recreate:
@ -240,12 +241,13 @@ class RecurrenceUpdateService
$currencyFactory = app(TransactionCurrencyFactory::class);
// loop all and try to match them:
if ($originalCount === count($transactions)) {
Log::debug('Loop and find');
Log::debug(sprintf('Count is equal (%d), update transactions.', $originalCount));
foreach ($transactions as $current) {
$match = $this->matchTransaction($recurrence, $current);
if (null === $match) {
throw new FireflyException('Cannot match recurring transaction to existing transaction. Not sure what to do. Break.');
}
// complex loop to find currency:
$currency = null;
$foreignCurrency = null;
if (array_key_exists('currency_id', $current) || array_key_exists('currency_code', $current)) {
@ -267,7 +269,7 @@ class RecurrenceUpdateService
$current['foreign_currency_id'] = (int)$foreignCurrency->id;
}
// update fields
// update fields that are part of the recurring transaction itself.
$fields = [
'source_id' => 'source_id',
'destination_id' => 'destination_id',
@ -293,11 +295,13 @@ class RecurrenceUpdateService
// reset category if name is set but empty:
// can be removed when v1 is retired.
if (array_key_exists('category_name', $current) && '' === (string)$current['category_name']) {
Log::debug('Category name is submitted but is empty. Set category to be empty.');
$current['category_name'] = null;
$current['category_id'] = 0;
}
if (array_key_exists('category_id', $current)) {
Log::debug(sprintf('Category ID is submitted, set category to be %d.', (int)$current['category_id']));
$this->setCategory($match, (int)$current['category_id']);
}
@ -319,9 +323,10 @@ class RecurrenceUpdateService
*/
private function matchTransaction(Recurrence $recurrence, array $data): ?RecurrenceTransaction
{
Log::debug('Now in matchTransaction()');
$originalCount = $recurrence->recurrenceTransactions()->count();
if (1 === $originalCount) {
Log::debug('Return the first one');
Log::debug('Return the first one.');
return $recurrence->recurrenceTransactions()->first();
}