From b3e89186120b1f90cc1c49aaa561a7574e734eef Mon Sep 17 00:00:00 2001 From: Shreya Date: Thu, 3 Sep 2026 12:04:19 +0530 Subject: [PATCH] fix(import): scope duplicate detection to target account and normalize currency comparison - Fixes duplicate detection incorrectly matching activities across different accounts (IS_DUPLICATE flag on wrong account's activities). When an accountId is specified in the import, the duplicate check now only considers existing activities within that same account. - Fixes identical activities being persisted without a duplicate error by normalizing null/undefined currency values before comparison. Strict equality (null === undefined) silently failed to match activities where currency was stored as null in the DB but arrived as undefined from the import DTO. Fixes #7728 Fixes #7406 --- apps/api/src/app/import/import.service.ts | 27 ++++++++++++----------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 5f202f4ac..1bf1d6b88 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -1075,19 +1075,20 @@ export class ImportService { const date = parseISO(dateString); const isDuplicate = existingActivities.some((activity) => { - return ( - (activity.comment || null) === (comment || null) && - (activity.currency === currency || - activity.assetProfile.currency === currency) && - activity.assetProfile.dataSource === dataSource && - isSameSecond(activity.date, date) && - activity.fee === fee && - activity.quantity === quantity && - activity.assetProfile.symbol === symbol && - activity.type === type && - activity.unitPrice === unitPrice - ); - }); + return ( + (!accountId || activity.accountId === accountId) && + (activity.comment || null) === (comment || null) && + ((activity.currency || null) === (currency || null) || + activity.assetProfile.currency === currency) && + activity.assetProfile.dataSource === dataSource && + isSameSecond(activity.date, date) && + activity.fee === fee && + activity.quantity === quantity && + activity.assetProfile.symbol === symbol && + activity.type === type && + activity.unitPrice === unitPrice + ); +}); const error: ActivityError = isDuplicate ? { code: 'IS_DUPLICATE' }