fix(network): update network statistics and tree documentation
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 10m15s
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 10m15s
- Updated README to reflect the new documentation location. - Refactored GetNetworkStatisticsQueryHandler to improve method naming and logic for loading package holder counts. - Enhanced GetNetworkStatisticsResponseDto and NetworkTreeDto to clarify the purpose of leg total properties. - Updated Protobuf definitions to align with the new response structure for network statistics. - Removed obsolete SQL scripts related to user package purchases and DayaLoan contracts cleanup.
This commit is contained in:
@@ -0,0 +1,431 @@
|
||||
/*
|
||||
DIAGNOSTIC ONLY — no data changes (read-only)
|
||||
|
||||
Trace WrongDaya→Manual FixUsers ledger via UserWalletHistory:
|
||||
WalletHistory → CreatedBy/LastModifiedBy (mobile) → User → Wallet
|
||||
→ Transaction (RefrenceId / CreatedBy-as-TxId / Tx.CreatedBy mobile)
|
||||
→ UPP / ManualPayment / PurchaseMethod
|
||||
|
||||
Known IDs from manual CSV exports (UserWalletHistories*.csv, Transactions.csv):
|
||||
WH: 102-108,122,138-142,292-295,118-121,124,201
|
||||
Tx: 23-31,42-46,56-59,68,107-110
|
||||
|
||||
RefrenceId=0 rule (ChargeUserWallets.sql):
|
||||
RefId = 'manualy' + original ChangeLogId. After id remap, WH.RefrenceId may be 0.
|
||||
For Ref=0 rows, assume Tx exists ONLY if CreatedBy is numeric AND that Tx has RefId manualy%.
|
||||
Do NOT infer Tx from mobile alone or from manualy{N} suffix alone.
|
||||
|
||||
See also: 10-Diagnose_Manualy_Transaction_Map.sql
|
||||
|
||||
Run on staging, review Verdict + RecommendedAction per user before any fix script.
|
||||
*/
|
||||
|
||||
SET NOCOUNT ON;
|
||||
|
||||
DECLARE @FixUsers TABLE (UserId BIGINT PRIMARY KEY);
|
||||
INSERT INTO @FixUsers (UserId) VALUES
|
||||
(2),(7),(8),(9),(10),(11),(12),(13),(40),(41),(43),(45),(47),
|
||||
(52),(58),(69),(71),(72),(74),(75),(87),(88),(89),(90),(91),(93),
|
||||
(96),(99),(103),(105),(106),(111),(113),(115),(116),(119),(121),
|
||||
(125),(130),(142),(162),(169),(170),(171),(172),(175),(176);
|
||||
|
||||
-- Known WalletHistory / Transaction ids from CSV exports (for cross-check)
|
||||
DECLARE @KnownWh TABLE (WalletHistoryId BIGINT PRIMARY KEY);
|
||||
INSERT INTO @KnownWh (WalletHistoryId) VALUES
|
||||
(102),(103),(104),(105),(106),(107),(108),(122),
|
||||
(138),(139),(140),(141),(142),
|
||||
(292),(293),(294),(295),
|
||||
(118),(119),(120),(121),(124),(201);
|
||||
|
||||
DECLARE @KnownTx TABLE (TransactionId BIGINT PRIMARY KEY);
|
||||
INSERT INTO @KnownTx (TransactionId) VALUES
|
||||
(23),(24),(25),(26),(28),(29),(30),(31),
|
||||
(42),(43),(44),(45),(46),
|
||||
(56),(57),(58),(59),(68),
|
||||
(107),(108),(109),(110);
|
||||
|
||||
DECLARE @TargetUserCount INT = (SELECT COUNT(*) FROM @FixUsers);
|
||||
PRINT CONCAT('FixUsers scope: ', @TargetUserCount);
|
||||
|
||||
------------------------------------------------------------
|
||||
-- 1) WalletHistories found BY mobile in CreatedBy / LastModifiedBy
|
||||
-- (starts from WH — user request)
|
||||
------------------------------------------------------------
|
||||
PRINT '=== 1) WalletHistory → User via CreatedBy/LastModifiedBy mobile ===';
|
||||
|
||||
SELECT
|
||||
h.Id AS WalletHistoryId,
|
||||
h.WalletId,
|
||||
h.RefrenceId AS WhRefrenceId,
|
||||
h.ChangeValue,
|
||||
h.ChangeDiscountValue,
|
||||
h.Created AS WhCreated,
|
||||
h.CreatedBy AS WhCreatedBy,
|
||||
h.LastModifiedBy AS WhLastModifiedBy,
|
||||
u.Id AS UserId,
|
||||
u.Mobile,
|
||||
u.FirstName,
|
||||
u.LastName,
|
||||
u.PackagePurchaseMethod AS UserMethod,
|
||||
CASE WHEN kwh.WalletHistoryId IS NOT NULL THEN 1 ELSE 0 END AS InKnownWhCsv,
|
||||
CASE
|
||||
WHEN u.Id IS NULL THEN N'NO_USER_FOR_MOBILE'
|
||||
WHEN f.UserId IS NULL THEN N'USER_NOT_IN_FIX_SCOPE'
|
||||
ELSE N'IN_FIX_SCOPE'
|
||||
END AS ScopeStatus
|
||||
FROM CMS.UserWalletHistories h
|
||||
LEFT JOIN CMS.Users u ON u.IsDeleted = 0
|
||||
AND u.Mobile IN (
|
||||
NULLIF(LTRIM(RTRIM(h.CreatedBy)), N''),
|
||||
NULLIF(LTRIM(RTRIM(h.LastModifiedBy)), N'')
|
||||
)
|
||||
LEFT JOIN @FixUsers f ON f.UserId = u.Id
|
||||
LEFT JOIN @KnownWh kwh ON kwh.WalletHistoryId = h.Id
|
||||
WHERE h.IsDeleted = 0
|
||||
AND (
|
||||
(h.CreatedBy LIKE N'09%' AND LEN(h.CreatedBy) >= 10)
|
||||
OR (h.LastModifiedBy LIKE N'09%' AND LEN(h.LastModifiedBy) >= 10)
|
||||
)
|
||||
ORDER BY h.Id;
|
||||
|
||||
------------------------------------------------------------
|
||||
-- 2) All WalletHistories for FixUsers (via Wallet → User)
|
||||
------------------------------------------------------------
|
||||
PRINT '=== 2) All WalletHistory rows for FixUsers ===';
|
||||
|
||||
SELECT
|
||||
f.UserId,
|
||||
u.Mobile,
|
||||
u.FirstName,
|
||||
u.LastName,
|
||||
u.PackagePurchaseMethod AS UserMethod,
|
||||
w.Id AS WalletId,
|
||||
h.Id AS WalletHistoryId,
|
||||
h.RefrenceId AS WhRefrenceId,
|
||||
h.ChangeValue,
|
||||
h.ChangeDiscountValue,
|
||||
h.Created AS WhCreated,
|
||||
h.CreatedBy AS WhCreatedBy,
|
||||
h.LastModifiedBy AS WhLastModifiedBy,
|
||||
CASE WHEN kwh.WalletHistoryId IS NOT NULL THEN 1 ELSE 0 END AS InKnownWhCsv,
|
||||
CASE WHEN h.RefrenceId IS NULL OR h.RefrenceId = 0 THEN N'WH_NO_REF' ELSE N'WH_HAS_REF' END AS WhRefStatus
|
||||
FROM @FixUsers f
|
||||
INNER JOIN CMS.Users u ON u.Id = f.UserId AND u.IsDeleted = 0
|
||||
INNER JOIN CMS.UserWallets w ON w.UserId = f.UserId AND w.IsDeleted = 0
|
||||
INNER JOIN CMS.UserWalletHistories h ON h.WalletId = w.Id AND h.IsDeleted = 0
|
||||
LEFT JOIN @KnownWh kwh ON kwh.WalletHistoryId = h.Id
|
||||
ORDER BY f.UserId, h.Id;
|
||||
|
||||
------------------------------------------------------------
|
||||
-- 3) Per-user ledger verdict (WH + Tx + UPP)
|
||||
------------------------------------------------------------
|
||||
PRINT '=== 3) Per-user ledger verdict ===';
|
||||
|
||||
;WITH UserWh AS (
|
||||
SELECT
|
||||
f.UserId,
|
||||
COUNT(*) AS WalletHistoryCount,
|
||||
SUM(CASE WHEN h.RefrenceId IS NULL OR h.RefrenceId = 0 THEN 1 ELSE 0 END) AS WhMissingRefCount,
|
||||
SUM(CASE WHEN kwh.WalletHistoryId IS NOT NULL THEN 1 ELSE 0 END) AS KnownCsvWhCount,
|
||||
MAX(h.Id) AS LatestWhId,
|
||||
MAX(h.RefrenceId) AS LatestWhRefId
|
||||
FROM @FixUsers f
|
||||
INNER JOIN CMS.UserWallets w ON w.UserId = f.UserId AND w.IsDeleted = 0
|
||||
LEFT JOIN CMS.UserWalletHistories h ON h.WalletId = w.Id AND h.IsDeleted = 0
|
||||
LEFT JOIN @KnownWh kwh ON kwh.WalletHistoryId = h.Id
|
||||
GROUP BY f.UserId
|
||||
),
|
||||
UserTxViaWh AS (
|
||||
SELECT
|
||||
uw.UserId,
|
||||
COUNT(DISTINCT t.Id) AS TxViaWhRefCount,
|
||||
MAX(t.Id) AS SampleTxViaWhRef
|
||||
FROM UserWh uw
|
||||
INNER JOIN CMS.UserWallets w ON w.UserId = uw.UserId AND w.IsDeleted = 0
|
||||
INNER JOIN CMS.UserWalletHistories h ON h.WalletId = w.Id AND h.IsDeleted = 0
|
||||
INNER JOIN CMS.Transactions t ON t.Id = h.RefrenceId AND t.IsDeleted = 0
|
||||
GROUP BY uw.UserId
|
||||
),
|
||||
UserTxViaMobile AS (
|
||||
SELECT
|
||||
f.UserId,
|
||||
COUNT(DISTINCT t.Id) AS TxViaMobileCount,
|
||||
MAX(t.Id) AS SampleTxViaMobile
|
||||
FROM @FixUsers f
|
||||
INNER JOIN CMS.Users u ON u.Id = f.UserId AND u.IsDeleted = 0
|
||||
INNER JOIN CMS.Transactions t ON t.IsDeleted = 0
|
||||
AND (t.CreatedBy = u.Mobile OR t.LastModifiedBy = u.Mobile)
|
||||
GROUP BY f.UserId
|
||||
),
|
||||
UserTxViaCreatedByHint AS (
|
||||
-- WH.CreatedBy stores Tx Id when RefrenceId=0 failed to update (UserWalletHistories2.csv).
|
||||
-- Only count when hinted Tx exists AND is manualy% (may still be wrong user — verify mobile).
|
||||
SELECT
|
||||
f.UserId,
|
||||
COUNT(DISTINCT t.Id) AS TxViaWhCreatedByHintCount,
|
||||
MAX(t.Id) AS SampleTxViaHint
|
||||
FROM @FixUsers f
|
||||
INNER JOIN CMS.UserWallets w ON w.UserId = f.UserId AND w.IsDeleted = 0
|
||||
INNER JOIN CMS.UserWalletHistories h ON h.WalletId = w.Id AND h.IsDeleted = 0
|
||||
INNER JOIN CMS.Transactions t ON t.Id = TRY_CAST(h.CreatedBy AS BIGINT)
|
||||
AND t.IsDeleted = 0 AND t.RefId LIKE N'manualy%'
|
||||
WHERE (h.RefrenceId IS NULL OR h.RefrenceId = 0)
|
||||
AND TRY_CAST(h.CreatedBy AS BIGINT) > 0
|
||||
GROUP BY f.UserId
|
||||
),
|
||||
UserTxViaManualyMobile AS (
|
||||
-- Informational only — NOT used alone for Ref=0 WH linking
|
||||
SELECT
|
||||
f.UserId,
|
||||
COUNT(DISTINCT t.Id) AS TxViaManualyMobileCount,
|
||||
MAX(t.Id) AS SampleManualyTxViaMobile
|
||||
FROM @FixUsers f
|
||||
INNER JOIN CMS.Users u ON u.Id = f.UserId AND u.IsDeleted = 0
|
||||
INNER JOIN CMS.Transactions t ON t.IsDeleted = 0
|
||||
AND t.RefId LIKE N'manualy%'
|
||||
AND u.Mobile IN (
|
||||
NULLIF(LTRIM(RTRIM(t.CreatedBy)), N''),
|
||||
NULLIF(LTRIM(RTRIM(t.LastModifiedBy)), N'')
|
||||
)
|
||||
GROUP BY f.UserId
|
||||
),
|
||||
UserUpp AS (
|
||||
SELECT
|
||||
f.UserId,
|
||||
COUNT(*) AS UppCount,
|
||||
SUM(CASE WHEN upp.PurchaseMethod = 1 THEN 1 ELSE 0 END) AS UppDayaCount,
|
||||
SUM(CASE WHEN upp.PurchaseMethod = 3 THEN 1 ELSE 0 END) AS UppManualCount,
|
||||
MAX(upp.TransactionId) AS LatestUppTxId
|
||||
FROM @FixUsers f
|
||||
LEFT JOIN CMS.UserPackagePurchases upp
|
||||
ON upp.UserId = f.UserId AND upp.IsDeleted = 0
|
||||
GROUP BY f.UserId
|
||||
),
|
||||
UserMp AS (
|
||||
SELECT
|
||||
f.UserId,
|
||||
COUNT(*) AS ManualPaymentCount,
|
||||
MAX(mp.TransactionId) AS LatestMpTxId
|
||||
FROM @FixUsers f
|
||||
LEFT JOIN CMS.ManualPayments mp
|
||||
ON mp.UserId = f.UserId AND mp.IsDeleted = 0
|
||||
GROUP BY f.UserId
|
||||
)
|
||||
SELECT *
|
||||
FROM (
|
||||
SELECT
|
||||
f.UserId,
|
||||
u.Mobile,
|
||||
u.FirstName,
|
||||
u.LastName,
|
||||
u.PackagePurchaseMethod AS UserMethod,
|
||||
ISNULL(uwh.WalletHistoryCount, 0) AS WalletHistoryCount,
|
||||
ISNULL(uwh.WhMissingRefCount, 0) AS WhMissingRefCount,
|
||||
ISNULL(uwh.KnownCsvWhCount, 0) AS KnownCsvWhCount,
|
||||
uwh.LatestWhId,
|
||||
uwh.LatestWhRefId,
|
||||
ISNULL(utw.TxViaWhRefCount, 0) AS TxViaWhRefCount,
|
||||
utw.SampleTxViaWhRef,
|
||||
ISNULL(utm.TxViaMobileCount, 0) AS TxViaMobileCount,
|
||||
utm.SampleTxViaMobile,
|
||||
ISNULL(uth.TxViaWhCreatedByHintCount, 0) AS TxViaWhCreatedByHintCount,
|
||||
uth.SampleTxViaHint,
|
||||
ISNULL(utmm.TxViaManualyMobileCount, 0) AS TxViaManualyMobileCount,
|
||||
utmm.SampleManualyTxViaMobile,
|
||||
ISNULL(uu.UppCount, 0) AS UppCount,
|
||||
ISNULL(uu.UppDayaCount, 0) AS UppDayaCount,
|
||||
uu.LatestUppTxId,
|
||||
ISNULL(ump.ManualPaymentCount, 0) AS ManualPaymentCount,
|
||||
ump.LatestMpTxId,
|
||||
CASE
|
||||
WHEN ISNULL(uwh.WalletHistoryCount, 0) = 0 THEN N'NO_WALLET_HISTORY'
|
||||
WHEN ISNULL(uwh.WhMissingRefCount, 0) > 0
|
||||
AND ISNULL(uth.TxViaWhCreatedByHintCount, 0) > 0 THEN N'WH_REF_BROKEN_FIX_VIA_CREATEDBY_HINT'
|
||||
WHEN ISNULL(uwh.WhMissingRefCount, 0) > 0
|
||||
AND ISNULL(utmm.TxViaManualyMobileCount, 0) > 0 THEN N'WH_REF_BROKEN_MANUALY_TX_BY_MOBILE_REVIEW'
|
||||
WHEN ISNULL(uwh.WhMissingRefCount, 0) > 0 THEN N'WH_REF_BROKEN_NO_TX_HINT'
|
||||
WHEN ISNULL(utw.TxViaWhRefCount, 0) > 0
|
||||
AND ISNULL(uu.UppCount, 0) = 0 THEN N'HAS_WH+TX_NEED_UPP'
|
||||
WHEN ISNULL(utw.TxViaWhRefCount, 0) > 0
|
||||
AND ISNULL(uu.UppDayaCount, 0) > 0 THEN N'HAS_WH+TX_UPP_DAYA_FIX_METHOD'
|
||||
WHEN ISNULL(utw.TxViaWhRefCount, 0) > 0 THEN N'OK_WH+TX'
|
||||
WHEN ISNULL(utm.TxViaMobileCount, 0) > 0 THEN N'TX_BY_MOBILE_WH_LINK_UNCLEAR'
|
||||
ELSE N'NEEDS_MANUAL_REVIEW'
|
||||
END AS Verdict,
|
||||
CASE
|
||||
WHEN ISNULL(uwh.WalletHistoryCount, 0) = 0 THEN N'Create WH+Tx+UPP (or find hidden WH by mobile)'
|
||||
WHEN ISNULL(uwh.WhMissingRefCount, 0) > 0
|
||||
AND ISNULL(uth.TxViaWhCreatedByHintCount, 0) > 0 THEN N'Link WH.RefrenceId to manualy Tx from CreatedBy hint only'
|
||||
WHEN ISNULL(uwh.WhMissingRefCount, 0) > 0
|
||||
AND ISNULL(utmm.TxViaManualyMobileCount, 0) > 0 THEN N'manualy Tx exists by mobile but WH hint missing — manual review'
|
||||
WHEN ISNULL(uwh.WhMissingRefCount, 0) > 0 THEN N'No Tx hint — do NOT assume Tx exists; review charge log'
|
||||
WHEN ISNULL(utw.TxViaWhRefCount, 0) > 0 AND ISNULL(uu.UppCount, 0) = 0 THEN N'Create UPP Manual(3) reusing Tx'
|
||||
WHEN ISNULL(uu.UppDayaCount, 0) > 0 OR u.PackagePurchaseMethod = 1 THEN N'Fix PurchaseMethod 1→3 only'
|
||||
ELSE N'Likely OK — verify PurchaseMethod'
|
||||
END AS RecommendedAction
|
||||
FROM @FixUsers f
|
||||
INNER JOIN CMS.Users u ON u.Id = f.UserId AND u.IsDeleted = 0
|
||||
LEFT JOIN UserWh uwh ON uwh.UserId = f.UserId
|
||||
LEFT JOIN UserTxViaWh utw ON utw.UserId = f.UserId
|
||||
LEFT JOIN UserTxViaMobile utm ON utm.UserId = f.UserId
|
||||
LEFT JOIN UserTxViaCreatedByHint uth ON uth.UserId = f.UserId
|
||||
LEFT JOIN UserTxViaManualyMobile utmm ON utmm.UserId = f.UserId
|
||||
LEFT JOIN UserUpp uu ON uu.UserId = f.UserId
|
||||
LEFT JOIN UserMp ump ON ump.UserId = f.UserId
|
||||
) q
|
||||
ORDER BY
|
||||
CASE q.Verdict
|
||||
WHEN N'OK_WH+TX' THEN 9
|
||||
WHEN N'HAS_WH+TX_UPP_DAYA_FIX_METHOD' THEN 8
|
||||
ELSE 1
|
||||
END,
|
||||
q.UserId;
|
||||
|
||||
------------------------------------------------------------
|
||||
-- 4) Summary counts by Verdict
|
||||
------------------------------------------------------------
|
||||
PRINT '=== 4) Summary by Verdict ===';
|
||||
|
||||
;WITH PerUser AS (
|
||||
SELECT
|
||||
f.UserId,
|
||||
u.PackagePurchaseMethod AS UserMethod,
|
||||
ISNULL(uwh.Cnt, 0) AS WhCnt,
|
||||
ISNULL(uwh.BadRefCnt, 0) AS WhBadRefCnt,
|
||||
ISNULL(utw.Cnt, 0) AS TxViaWhCnt,
|
||||
ISNULL(utm.Cnt, 0) AS TxViaMobileCnt,
|
||||
ISNULL(uth.Cnt, 0) AS TxViaHintCnt,
|
||||
ISNULL(uu.Cnt, 0) AS UppCnt
|
||||
FROM @FixUsers f
|
||||
INNER JOIN CMS.Users u ON u.Id = f.UserId AND u.IsDeleted = 0
|
||||
OUTER APPLY (
|
||||
SELECT COUNT(*) AS Cnt,
|
||||
SUM(CASE WHEN h.RefrenceId IS NULL OR h.RefrenceId = 0 THEN 1 ELSE 0 END) AS BadRefCnt
|
||||
FROM CMS.UserWallets w
|
||||
INNER JOIN CMS.UserWalletHistories h ON h.WalletId = w.Id AND h.IsDeleted = 0
|
||||
WHERE w.UserId = f.UserId AND w.IsDeleted = 0
|
||||
) uwh
|
||||
OUTER APPLY (
|
||||
SELECT COUNT(DISTINCT t.Id) AS Cnt
|
||||
FROM CMS.UserWallets w
|
||||
INNER JOIN CMS.UserWalletHistories h ON h.WalletId = w.Id AND h.IsDeleted = 0
|
||||
INNER JOIN CMS.Transactions t ON t.Id = h.RefrenceId AND t.IsDeleted = 0
|
||||
WHERE w.UserId = f.UserId AND w.IsDeleted = 0
|
||||
) utw
|
||||
OUTER APPLY (
|
||||
SELECT COUNT(DISTINCT t.Id) AS Cnt
|
||||
FROM CMS.Transactions t
|
||||
WHERE t.IsDeleted = 0
|
||||
AND (t.CreatedBy = u.Mobile OR t.LastModifiedBy = u.Mobile)
|
||||
) utm
|
||||
OUTER APPLY (
|
||||
SELECT COUNT(DISTINCT t.Id) AS Cnt
|
||||
FROM CMS.UserWallets w
|
||||
INNER JOIN CMS.UserWalletHistories h ON h.WalletId = w.Id AND h.IsDeleted = 0
|
||||
INNER JOIN CMS.Transactions t ON t.Id = TRY_CAST(h.CreatedBy AS BIGINT)
|
||||
AND t.IsDeleted = 0 AND t.RefId LIKE N'manualy%'
|
||||
WHERE w.UserId = f.UserId AND w.IsDeleted = 0
|
||||
AND (h.RefrenceId IS NULL OR h.RefrenceId = 0)
|
||||
AND TRY_CAST(h.CreatedBy AS BIGINT) > 0
|
||||
) uth
|
||||
OUTER APPLY (
|
||||
SELECT COUNT(*) AS Cnt
|
||||
FROM CMS.UserPackagePurchases upp
|
||||
WHERE upp.UserId = f.UserId AND upp.IsDeleted = 0
|
||||
) uu
|
||||
),
|
||||
Verdicts AS (
|
||||
SELECT
|
||||
UserId,
|
||||
CASE
|
||||
WHEN WhCnt = 0 THEN N'NO_WALLET_HISTORY'
|
||||
WHEN WhBadRefCnt > 0 AND TxViaHintCnt > 0 THEN N'WH_REF_BROKEN_FIX_VIA_CREATEDBY_HINT'
|
||||
WHEN WhBadRefCnt > 0 THEN N'WH_REF_BROKEN_NO_TX_HINT'
|
||||
WHEN TxViaWhCnt > 0 AND UppCnt = 0 THEN N'HAS_WH+TX_NEED_UPP'
|
||||
WHEN TxViaWhCnt > 0 THEN N'OK_WH+TX'
|
||||
WHEN TxViaMobileCnt > 0 THEN N'TX_BY_MOBILE_WH_LINK_UNCLEAR'
|
||||
ELSE N'NEEDS_MANUAL_REVIEW'
|
||||
END AS Verdict
|
||||
FROM PerUser
|
||||
)
|
||||
SELECT Verdict, COUNT(*) AS UserCount
|
||||
FROM Verdicts
|
||||
GROUP BY Verdict
|
||||
ORDER BY UserCount DESC;
|
||||
|
||||
------------------------------------------------------------
|
||||
-- 5) Known CSV Tx ids — exist in DB? linked to WH/UPP?
|
||||
------------------------------------------------------------
|
||||
PRINT '=== 5) Known Transaction IDs from CSV ===';
|
||||
|
||||
SELECT
|
||||
kt.TransactionId,
|
||||
CASE WHEN t.Id IS NULL THEN N'MISSING_IN_DB' ELSE N'EXISTS' END AS TxStatus,
|
||||
t.Amount,
|
||||
t.Description,
|
||||
t.RefId,
|
||||
t.CreatedBy AS TxCreatedBy,
|
||||
t.LastModifiedBy AS TxLastModifiedBy,
|
||||
u.Id AS UserByMobile,
|
||||
u.Mobile,
|
||||
h.Id AS LinkedWalletHistoryId,
|
||||
h.WalletId,
|
||||
h.RefrenceId AS WhRefrenceId,
|
||||
upp.UserId AS UppUserId,
|
||||
upp.PurchaseMethod AS UppMethod
|
||||
FROM @KnownTx kt
|
||||
LEFT JOIN CMS.Transactions t ON t.Id = kt.TransactionId
|
||||
LEFT JOIN CMS.Users u ON u.IsDeleted = 0
|
||||
AND u.Mobile IN (NULLIF(t.CreatedBy, N''), NULLIF(t.LastModifiedBy, N''))
|
||||
LEFT JOIN CMS.UserWalletHistories h ON h.IsDeleted = 0 AND h.RefrenceId = kt.TransactionId
|
||||
LEFT JOIN CMS.UserPackagePurchases upp ON upp.IsDeleted = 0 AND upp.TransactionId = kt.TransactionId
|
||||
ORDER BY kt.TransactionId;
|
||||
|
||||
------------------------------------------------------------
|
||||
-- 6) Known CSV WH ids — RefrenceId vs CreatedBy hint vs mobile
|
||||
------------------------------------------------------------
|
||||
PRINT '=== 6) Known WalletHistory IDs from CSV ===';
|
||||
|
||||
SELECT
|
||||
kw.WalletHistoryId,
|
||||
h.WalletId,
|
||||
h.RefrenceId AS WhRefrenceId,
|
||||
h.ChangeValue,
|
||||
h.CreatedBy AS WhCreatedBy,
|
||||
h.LastModifiedBy AS WhLastModifiedBy,
|
||||
w.UserId AS WalletUserId,
|
||||
u.Mobile AS WalletUserMobile,
|
||||
u_by_mobile.Id AS UserByWhMobile,
|
||||
u_by_mobile.Mobile AS MatchedMobile,
|
||||
t_ref.Id AS TxByRefrenceId,
|
||||
t_ref.Description AS TxByRefDescription,
|
||||
t_hint.Id AS TxByCreatedByHint,
|
||||
t_hint.RefId AS TxByHintRefId,
|
||||
t_hint.Description AS TxByHintDescription,
|
||||
TRY_CAST(
|
||||
SUBSTRING(t_hint.RefId, LEN(N'manualy') + 1, 20)
|
||||
AS BIGINT
|
||||
) AS ManualyOriginalChangeLogId,
|
||||
CASE
|
||||
WHEN h.Id IS NULL THEN N'WH_MISSING_IN_DB'
|
||||
WHEN t_ref.Id IS NOT NULL AND t_ref.RefId LIKE N'manualy%' THEN N'WH_LINKED_TO_MANUALY_TX'
|
||||
WHEN t_ref.Id IS NOT NULL THEN N'WH_LINKED_TO_OTHER_TX'
|
||||
WHEN t_hint.Id IS NOT NULL AND t_hint.RefId LIKE N'manualy%' THEN N'WH_REF_BROKEN_USE_CREATEDBY_HINT'
|
||||
WHEN TRY_CAST(h.CreatedBy AS BIGINT) > 0 AND t_hint.Id IS NULL THEN N'WH_HINT_TX_MISSING'
|
||||
WHEN u_by_mobile.Id IS NOT NULL THEN N'WH_MOBILE_ONLY_NO_AUTO_LINK'
|
||||
ELSE N'WH_ORPHAN_REVIEW'
|
||||
END AS WhLinkStatus
|
||||
FROM @KnownWh kw
|
||||
LEFT JOIN CMS.UserWalletHistories h ON h.Id = kw.WalletHistoryId AND h.IsDeleted = 0
|
||||
LEFT JOIN CMS.UserWallets w ON w.Id = h.WalletId AND w.IsDeleted = 0
|
||||
LEFT JOIN CMS.Users u ON u.Id = w.UserId AND u.IsDeleted = 0
|
||||
LEFT JOIN CMS.Users u_by_mobile ON u_by_mobile.IsDeleted = 0
|
||||
AND u_by_mobile.Mobile IN (
|
||||
NULLIF(LTRIM(RTRIM(h.CreatedBy)), N''),
|
||||
NULLIF(LTRIM(RTRIM(h.LastModifiedBy)), N'')
|
||||
)
|
||||
LEFT JOIN CMS.Transactions t_ref ON t_ref.Id = h.RefrenceId AND t_ref.IsDeleted = 0
|
||||
LEFT JOIN CMS.Transactions t_hint ON t_hint.Id = TRY_CAST(h.CreatedBy AS BIGINT) AND t_hint.IsDeleted = 0
|
||||
ORDER BY kw.WalletHistoryId;
|
||||
|
||||
PRINT 'Done (diagnostic only — no changes).';
|
||||
Reference in New Issue
Block a user