Files
CMS/src/dbbkup/6-Fix_WrongDaya_ToManual_PurchaseMethod.sql
T
masoodafar-web 612d6fd141
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 10m15s
fix(network): update network statistics and tree documentation
- 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.
2026-08-28 18:55:48 +03:30

548 lines
19 KiB
Transact-SQL

/*
Fix users wrongly marked DayaLoan who were manually charged (RefId LIKE 'manualy%').
Scope: ONLY users linked to manualy transactions — NOT the full 47-user WrongDaya list.
Real Daya users (RefId LIKE 'C4%') are excluded automatically.
Actions:
- PurchaseMethod 1→3 on Users / Club / Cycle / UPP
- Clear HasReceivedDayaCredit / DayaCreditReceivedAt
- Soft-delete stub DayaLoanContracts (unprocessed, no Tx)
- Fix broken WH.RefrenceId where CreatedBy hint points to existing manualy Tx
- Create missing UPP Manual(3) reusing existing manualy Tx (never create new Tx)
- Create missing WH rows only when Tx exists but no WH links to it (history-only, no charge)
RefrenceId=0 rule:
Tx is resolved ONLY via numeric CreatedBy hint when that Tx exists with RefId manualy%.
Mobile-only or manualy{N} suffix alone is NOT used to assume a Tx exists.
PackagePurchaseMethod: None=0, DayaLoan=1, DirectPurchase=2, Manual=3
Defaults to ROLLBACK. Uncomment COMMIT after verifying PRINT output.
Run 10-Diagnose_Manualy_Transaction_Map.sql first.
*/
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRAN;
DECLARE @Now DATETIME2 = SYSUTCDATETIME();
DECLARE @BasePackageId BIGINT;
DECLARE @BasePackagePrice BIGINT;
SELECT TOP (1)
@BasePackageId = Id,
@BasePackagePrice = Price
FROM CMS.Packages
WHERE IsDeleted = 0 AND IsBasePackage = 1
ORDER BY Id;
IF @BasePackageId IS NULL
THROW 50001, 'Base package not found.', 1;
------------------------------------------------------------
-- Scope: users linked to manualy transactions
-- (duplicate WH→Tx links exist from migration; rank by mobile match + charge amount + date)
------------------------------------------------------------
DECLARE @ManualyUsers TABLE (
UserId BIGINT NOT NULL PRIMARY KEY,
ManualyTxId BIGINT NULL,
LinkSource NVARCHAR(50) NULL
);
SELECT t.Id AS TxId, t.RefId, t.Amount, t.PaymentDate, t.CreatedBy, t.LastModifiedBy
INTO #ManualyTx
FROM CMS.Transactions t
WHERE t.IsDeleted = 0 AND t.RefId LIKE N'manualy%';
SELECT
mt.TxId,
w.UserId,
h.Id AS WhId,
h.ChangeValue,
CASE
WHEN NULLIF(LTRIM(RTRIM(mt.CreatedBy)), N'') LIKE N'09%'
AND u.Mobile = NULLIF(LTRIM(RTRIM(mt.CreatedBy)), N'') THEN 1
WHEN NULLIF(LTRIM(RTRIM(mt.LastModifiedBy)), N'') LIKE N'09%'
AND u.Mobile = NULLIF(LTRIM(RTRIM(mt.LastModifiedBy)), N'') THEN 1
ELSE 0
END AS MobileMatch,
CASE WHEN h.ChangeValue >= mt.Amount THEN 1 ELSE 0 END AS FullCharge,
ABS(DATEDIFF(SECOND, h.Created, mt.PaymentDate)) AS TimeDeltaSec
INTO #WhLinks
FROM #ManualyTx mt
INNER JOIN CMS.UserWalletHistories h ON h.RefrenceId = mt.TxId AND h.IsDeleted = 0
INNER JOIN CMS.UserWallets w ON w.Id = h.WalletId AND w.IsDeleted = 0
INNER JOIN CMS.Users u ON u.Id = w.UserId AND u.IsDeleted = 0;
SELECT UserId, TxId, WhId, MobileMatch, FullCharge,
ROW_NUMBER() OVER (
PARTITION BY TxId
ORDER BY MobileMatch DESC, FullCharge DESC, TimeDeltaSec ASC, WhId ASC
) AS rn
INTO #BestWhPerTx
FROM #WhLinks;
INSERT INTO @ManualyUsers (UserId, ManualyTxId, LinkSource)
SELECT b.UserId, b.TxId, N'WH_REF_BEST'
FROM #BestWhPerTx b
WHERE b.rn = 1
AND (b.MobileMatch = 1 OR b.FullCharge = 1);
INSERT INTO @ManualyUsers (UserId, ManualyTxId, LinkSource)
SELECT DISTINCT w.UserId, t.Id, N'WH_CREATEDBY_HINT'
FROM CMS.UserWalletHistories h
INNER JOIN CMS.UserWallets w ON w.Id = h.WalletId AND w.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%'
INNER JOIN CMS.Users u ON u.Id = w.UserId AND u.IsDeleted = 0
WHERE h.IsDeleted = 0
AND (h.RefrenceId IS NULL OR h.RefrenceId = 0)
AND TRY_CAST(h.CreatedBy AS BIGINT) > 0
AND (
NULLIF(LTRIM(RTRIM(t.CreatedBy)), N'') NOT LIKE N'09%'
OR u.Mobile IN (
NULLIF(LTRIM(RTRIM(t.CreatedBy)), N''),
NULLIF(LTRIM(RTRIM(t.LastModifiedBy)), N'')
)
)
AND NOT EXISTS (SELECT 1 FROM @ManualyUsers m WHERE m.UserId = w.UserId);
INSERT INTO @ManualyUsers (UserId, ManualyTxId, LinkSource)
SELECT DISTINCT u.Id, t.Id, N'TX_MOBILE'
FROM CMS.Transactions t
INNER JOIN CMS.Users u ON u.IsDeleted = 0
AND u.Mobile IN (
NULLIF(LTRIM(RTRIM(t.CreatedBy)), N''),
NULLIF(LTRIM(RTRIM(t.LastModifiedBy)), N'')
)
WHERE t.IsDeleted = 0 AND t.RefId LIKE N'manualy%'
AND NOT EXISTS (SELECT 1 FROM @ManualyUsers m WHERE m.UserId = u.Id);
-- Txs without mobile on row: keep best full-charge WH only (early batch 23-31)
INSERT INTO @ManualyUsers (UserId, ManualyTxId, LinkSource)
SELECT b.UserId, b.TxId, N'WH_REF_NO_MOBILE'
FROM #BestWhPerTx b
INNER JOIN #ManualyTx mt ON mt.TxId = b.TxId
WHERE b.rn = 1
AND b.FullCharge = 1
AND (NULLIF(LTRIM(RTRIM(mt.CreatedBy)), N'') IS NULL OR NULLIF(LTRIM(RTRIM(mt.CreatedBy)), N'') NOT LIKE N'09%')
AND (NULLIF(LTRIM(RTRIM(mt.LastModifiedBy)), N'') IS NULL OR NULLIF(LTRIM(RTRIM(mt.LastModifiedBy)), N'') NOT LIKE N'09%')
AND NOT EXISTS (SELECT 1 FROM @ManualyUsers m WHERE m.UserId = b.UserId);
DROP TABLE #BestWhPerTx;
DROP TABLE #WhLinks;
DROP TABLE #ManualyTx;
DECLARE @ScopeCount INT = (SELECT COUNT(*) FROM @ManualyUsers);
PRINT CONCAT('manualy scope users: ', @ScopeCount);
PRINT CONCAT('BasePackageId=', @BasePackageId, ' Price=', @BasePackagePrice);
SELECT mu.UserId, u.Mobile, u.FirstName, u.LastName,
u.PackagePurchaseMethod, mu.ManualyTxId, mu.LinkSource
FROM @ManualyUsers mu
INNER JOIN CMS.Users u ON u.Id = mu.UserId AND u.IsDeleted = 0
ORDER BY mu.UserId;
------------------------------------------------------------
-- Preview
------------------------------------------------------------
SELECT 'Users with manualy Tx resolved' AS CheckName, COUNT(*) AS Cnt
FROM @ManualyUsers WHERE ManualyTxId IS NOT NULL
UNION ALL
SELECT 'Users in scope without resolved Tx', COUNT(*)
FROM @ManualyUsers WHERE ManualyTxId IS NULL
UNION ALL
SELECT 'Broken WH rows fixable via CreatedBy hint', COUNT(*)
FROM CMS.UserWalletHistories h
INNER JOIN CMS.UserWallets w ON w.Id = h.WalletId AND w.IsDeleted = 0
INNER JOIN @ManualyUsers mu ON mu.UserId = w.UserId
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.IsDeleted = 0
AND (h.RefrenceId IS NULL OR h.RefrenceId = 0)
AND TRY_CAST(h.CreatedBy AS BIGINT) > 0
UNION ALL
SELECT 'Missing UPP in scope', COUNT(*)
FROM @ManualyUsers mu
WHERE NOT EXISTS (
SELECT 1 FROM CMS.UserPackagePurchases upp
WHERE upp.UserId = mu.UserId AND upp.IsDeleted = 0
);
------------------------------------------------------------
-- 1) Fix broken WH.RefrenceId (CreatedBy hint → existing manualy Tx)
------------------------------------------------------------
UPDATE h
SET
h.RefrenceId = t.Id,
h.LastModified = @Now
FROM CMS.UserWalletHistories h
INNER JOIN CMS.UserWallets w ON w.Id = h.WalletId AND w.IsDeleted = 0
INNER JOIN @ManualyUsers mu ON mu.UserId = w.UserId
INNER JOIN CMS.Transactions t ON t.Id = TRY_CAST(h.CreatedBy AS BIGINT)
AND t.IsDeleted = 0
AND t.RefId LIKE N'manualy%'
AND t.PaymentStatus = 0
WHERE h.IsDeleted = 0
AND (h.RefrenceId IS NULL OR h.RefrenceId = 0)
AND TRY_CAST(h.CreatedBy AS BIGINT) > 0;
PRINT CONCAT('WalletHistory RefrenceId fixed: ', @@ROWCOUNT);
------------------------------------------------------------
-- 2) Users — DayaLoan → Manual
------------------------------------------------------------
UPDATE u
SET
u.PackagePurchaseMethod = 3,
u.HasReceivedDayaCredit = 0,
u.DayaCreditReceivedAt = NULL,
u.LastModified = @Now
FROM CMS.Users u
INNER JOIN @ManualyUsers mu ON mu.UserId = u.Id
WHERE u.IsDeleted = 0
AND (
u.PackagePurchaseMethod = 1
OR u.HasReceivedDayaCredit = 1
OR u.DayaCreditReceivedAt IS NOT NULL
);
PRINT CONCAT('Users updated: ', @@ROWCOUNT);
------------------------------------------------------------
-- 3) ClubMemberships
------------------------------------------------------------
UPDATE m
SET m.PurchaseMethod = 3, m.LastModified = @Now
FROM CMS.ClubMemberships m
INNER JOIN @ManualyUsers mu ON mu.UserId = m.UserId
WHERE m.IsDeleted = 0 AND m.PurchaseMethod IN (0, 1);
PRINT CONCAT('ClubMemberships updated: ', @@ROWCOUNT);
------------------------------------------------------------
-- 4) ClubMembershipCycles
------------------------------------------------------------
UPDATE c
SET c.PurchaseMethod = 3, c.LastModified = @Now
FROM CMS.ClubMembershipCycles c
INNER JOIN @ManualyUsers mu ON mu.UserId = c.UserId
WHERE c.IsDeleted = 0 AND c.PurchaseMethod IN (0, 1);
PRINT CONCAT('ClubMembershipCycles updated: ', @@ROWCOUNT);
------------------------------------------------------------
-- 5) UserPackagePurchases (existing rows Daya → Manual)
------------------------------------------------------------
UPDATE upp
SET upp.PurchaseMethod = 3, upp.LastModified = @Now
FROM CMS.UserPackagePurchases upp
INNER JOIN @ManualyUsers mu ON mu.UserId = upp.UserId
WHERE upp.IsDeleted = 0 AND upp.PurchaseMethod = 1;
PRINT CONCAT('UserPackagePurchases updated: ', @@ROWCOUNT);
------------------------------------------------------------
-- 6) Soft-delete stub DayaLoanContracts
------------------------------------------------------------
UPDATE d
SET d.IsDeleted = 1, d.LastModified = @Now
FROM CMS.DayaLoanContracts d
INNER JOIN @ManualyUsers mu ON mu.UserId = d.UserId
WHERE d.IsDeleted = 0
AND d.IsProcessed = 0
AND d.TransactionId IS NULL
AND d.ProcessedDate IS NULL;
PRINT CONCAT('DayaLoanContracts soft-deleted (stubs): ', @@ROWCOUNT);
------------------------------------------------------------
-- 7) Resolve best manualy Tx per user (post WH fix)
------------------------------------------------------------
;WITH TxCandidates AS (
SELECT mu.UserId, t.Id AS TxId, N'WH_REF' AS Src, 1 AS Pri
FROM @ManualyUsers mu
INNER JOIN CMS.UserWallets w ON w.UserId = mu.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 AND t.RefId LIKE N'manualy%' AND t.PaymentStatus = 0
UNION ALL
SELECT mu.UserId, t.Id, N'WH_HINT', 2
FROM @ManualyUsers mu
INNER JOIN CMS.UserWallets w ON w.UserId = mu.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%' AND t.PaymentStatus = 0
WHERE (h.RefrenceId IS NULL OR h.RefrenceId = 0)
AND TRY_CAST(h.CreatedBy AS BIGINT) > 0
UNION ALL
SELECT mu.UserId, t.Id, N'TX_MOBILE', 3
FROM @ManualyUsers mu
INNER JOIN CMS.Users u ON u.Id = mu.UserId AND u.IsDeleted = 0
INNER JOIN CMS.Transactions t ON t.IsDeleted = 0
AND t.RefId LIKE N'manualy%' AND t.PaymentStatus = 0
AND u.Mobile IN (
NULLIF(LTRIM(RTRIM(t.CreatedBy)), N''),
NULLIF(LTRIM(RTRIM(t.LastModifiedBy)), N'')
)
UNION ALL
SELECT mu.UserId, mu.ManualyTxId, mu.LinkSource, 4
FROM @ManualyUsers mu
WHERE mu.ManualyTxId IS NOT NULL
),
BestTx AS (
SELECT UserId, TxId, Src,
ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY Pri, TxId DESC) AS rn
FROM TxCandidates
WHERE TxId IS NOT NULL
)
SELECT
mu.UserId,
bt.TxId,
bt.Src AS TxSource,
COALESCE(NULLIF(cm.LastPackageId, 0), NULLIF(cm.FirstPackageId, 0), @BasePackageId) AS PackageId,
COALESCE(t.Amount, @BasePackagePrice) AS Amount,
COALESCE(t.PaymentDate, cm.ActivatedAt, @Now) AS PurchasedAt
INTO #ManualyUppPlan
FROM @ManualyUsers mu
LEFT JOIN BestTx bt ON bt.UserId = mu.UserId AND bt.rn = 1
LEFT JOIN CMS.Transactions t ON t.Id = bt.TxId AND t.IsDeleted = 0
LEFT JOIN CMS.ClubMemberships cm ON cm.UserId = mu.UserId AND cm.IsDeleted = 0
WHERE NOT EXISTS (
SELECT 1 FROM CMS.UserPackagePurchases upp
WHERE upp.UserId = mu.UserId AND upp.IsDeleted = 0
);
DECLARE @UppPlanCount INT = (SELECT COUNT(*) FROM #ManualyUppPlan);
PRINT CONCAT('UPP to create: ', @UppPlanCount);
SELECT UserId, TxId, TxSource, PackageId, Amount, PurchasedAt,
CASE WHEN TxId IS NULL THEN N'SKIP_NO_MANUALY_TX' ELSE N'CREATE_UPP' END AS PlanAction
FROM #ManualyUppPlan
ORDER BY UserId;
DECLARE @UserId BIGINT;
DECLARE @TxId BIGINT;
DECLARE @PackageId BIGINT;
DECLARE @Amount BIGINT;
DECLARE @PurchasedAt DATETIME2;
DECLARE @CreatedUpp INT = 0;
DECLARE @SkippedNoTx INT = 0;
DECLARE curUpp CURSOR LOCAL FAST_FORWARD FOR
SELECT UserId, TxId, PackageId, Amount, PurchasedAt
FROM #ManualyUppPlan;
OPEN curUpp;
FETCH NEXT FROM curUpp INTO @UserId, @TxId, @PackageId, @Amount, @PurchasedAt;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @TxId IS NULL OR @PackageId IS NULL OR @Amount IS NULL OR @Amount <= 0
BEGIN
SET @SkippedNoTx = @SkippedNoTx + 1;
END
ELSE
BEGIN
INSERT INTO CMS.UserPackagePurchases
(
UserId, PackageId, PurchaseMethod, PurchasedAt, Amount,
OrderId, TransactionId, Created, CreatedBy, LastModified, LastModifiedBy, IsDeleted
)
VALUES
(
@UserId, @PackageId, 3,
@PurchasedAt, @Amount,
NULL, @TxId, @PurchasedAt, NULL, @PurchasedAt, NULL, 0
);
SET @CreatedUpp = @CreatedUpp + 1;
END
FETCH NEXT FROM curUpp INTO @UserId, @TxId, @PackageId, @Amount, @PurchasedAt;
END
CLOSE curUpp;
DEALLOCATE curUpp;
DROP TABLE #ManualyUppPlan;
PRINT CONCAT('UPP created: ', @CreatedUpp, ' | Skipped (no manualy Tx): ', @SkippedNoTx);
------------------------------------------------------------
-- 8) Missing WH for resolved manualy Tx (history-only, no wallet charge)
------------------------------------------------------------
;WITH TxCandidates AS (
SELECT mu.UserId, t.Id AS TxId, 1 AS Pri
FROM @ManualyUsers mu
INNER JOIN CMS.UserWallets w ON w.UserId = mu.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 AND t.RefId LIKE N'manualy%'
UNION ALL
SELECT mu.UserId, t.Id, 2
FROM @ManualyUsers mu
INNER JOIN CMS.Users u ON u.Id = mu.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'')
)
),
BestTx AS (
SELECT UserId, TxId,
ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY Pri, TxId DESC) AS rn
FROM TxCandidates
)
SELECT
bt.UserId,
bt.TxId,
w.Id AS WalletId,
COALESCE(t.Amount, @BasePackagePrice) AS Amount,
COALESCE(t.PaymentDate, @Now) AS HistoryAt,
COALESCE(
NULLIF(cm.LastPackageId, 0),
NULLIF(cm.FirstPackageId, 0),
@BasePackageId
) AS PackageId,
CAST(ROUND(COALESCE(t.Amount, @BasePackagePrice) * COALESCE(p.DiscountMultiplier, 2.0), 0) AS BIGINT) AS DiscountAmount,
COALESCE(w.NetworkBalance, 0) AS NetworkBalance
INTO #WhToCreate
FROM BestTx bt
INNER JOIN CMS.Transactions t ON t.Id = bt.TxId AND t.IsDeleted = 0
LEFT JOIN CMS.UserWallets w ON w.UserId = bt.UserId AND w.IsDeleted = 0
LEFT JOIN CMS.ClubMemberships cm ON cm.UserId = bt.UserId AND cm.IsDeleted = 0
LEFT JOIN CMS.Packages p ON p.Id = COALESCE(
NULLIF(cm.LastPackageId, 0),
NULLIF(cm.FirstPackageId, 0),
@BasePackageId
) AND p.IsDeleted = 0
WHERE bt.rn = 1
AND NOT EXISTS (
SELECT 1
FROM CMS.UserWalletHistories h
INNER JOIN CMS.UserWallets wh ON wh.Id = h.WalletId AND wh.IsDeleted = 0
WHERE wh.UserId = bt.UserId
AND h.IsDeleted = 0
AND h.RefrenceId = bt.TxId
);
DECLARE @WhPlanCount INT = (SELECT COUNT(*) FROM #WhToCreate);
PRINT CONCAT('WalletHistory to create (no charge): ', @WhPlanCount);
SELECT UserId, TxId, WalletId, Amount, HistoryAt, N'CREATE_HISTORY_ONLY' AS PlanAction
FROM #WhToCreate
ORDER BY UserId;
DECLARE @WalletId BIGINT;
DECLARE @DiscountAmount BIGINT;
DECLARE @HistoryAt DATETIME2;
DECLARE @NetworkBalance BIGINT;
DECLARE @CreatedWh INT = 0;
DECLARE curWh CURSOR LOCAL FAST_FORWARD FOR
SELECT UserId, TxId, WalletId, Amount, PackageId, DiscountAmount, HistoryAt, NetworkBalance
FROM #WhToCreate;
OPEN curWh;
FETCH NEXT FROM curWh INTO
@UserId, @TxId, @WalletId, @Amount, @PackageId, @DiscountAmount, @HistoryAt, @NetworkBalance;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @WalletId IS NULL
BEGIN
INSERT INTO CMS.UserWallets
(UserId, Balance, NetworkBalance, DiscountBalance, WalletMode, Created, LastModified, IsDeleted)
VALUES (@UserId, 0, 0, 0, 0, @HistoryAt, @HistoryAt, 0);
SET @WalletId = SCOPE_IDENTITY();
SET @NetworkBalance = 0;
END
INSERT INTO CMS.UserWalletHistories
(
WalletId, CurrentBalance, ChangeValue, CurrentNetworkBalance, ChangeNerworkValue,
CurrentDiscountBalance, ChangeDiscountValue, IsIncrease, RefrenceId, PackageId,
Created, CreatedBy, LastModified, LastModifiedBy, IsDeleted
)
VALUES
(
@WalletId, 0, @Amount, @NetworkBalance, 0,
0, @DiscountAmount, 1, @TxId, @PackageId,
@HistoryAt, NULL, @HistoryAt, NULL, 0
);
SET @CreatedWh = @CreatedWh + 1;
FETCH NEXT FROM curWh INTO
@UserId, @TxId, @WalletId, @Amount, @PackageId, @DiscountAmount, @HistoryAt, @NetworkBalance;
END
CLOSE curWh;
DEALLOCATE curWh;
DROP TABLE #WhToCreate;
PRINT CONCAT('WalletHistory created (no charge): ', @CreatedWh);
------------------------------------------------------------
-- Verify
------------------------------------------------------------
SELECT 'Users still Daya in scope' AS CheckName, COUNT(*) AS Cnt
FROM CMS.Users u
INNER JOIN @ManualyUsers mu ON mu.UserId = u.Id
WHERE u.IsDeleted = 0 AND u.PackagePurchaseMethod = 1
UNION ALL
SELECT 'Still missing UPP in scope', COUNT(*)
FROM @ManualyUsers mu
WHERE NOT EXISTS (
SELECT 1 FROM CMS.UserPackagePurchases upp
WHERE upp.UserId = mu.UserId AND upp.IsDeleted = 0
)
UNION ALL
SELECT 'Broken WH Ref=0 with valid hint remaining', COUNT(*)
FROM CMS.UserWalletHistories h
INNER JOIN CMS.UserWallets w ON w.Id = h.WalletId AND w.IsDeleted = 0
INNER JOIN @ManualyUsers mu ON mu.UserId = w.UserId
WHERE h.IsDeleted = 0
AND (h.RefrenceId IS NULL OR h.RefrenceId = 0)
AND TRY_CAST(h.CreatedBy AS BIGINT) > 0
AND EXISTS (
SELECT 1 FROM CMS.Transactions t
WHERE t.Id = TRY_CAST(h.CreatedBy AS BIGINT)
AND t.IsDeleted = 0 AND t.RefId LIKE N'manualy%'
)
UNION ALL
SELECT 'Active stub Daya contracts in scope', COUNT(*)
FROM CMS.DayaLoanContracts d
INNER JOIN @ManualyUsers mu ON mu.UserId = d.UserId
WHERE d.IsDeleted = 0
AND d.IsProcessed = 0
AND d.TransactionId IS NULL
AND d.ProcessedDate IS NULL;
SELECT u.Id AS UserId, u.Mobile, u.FirstName, u.LastName,
u.PackagePurchaseMethod,
(SELECT COUNT(*) FROM CMS.UserPackagePurchases upp
WHERE upp.UserId = u.Id AND upp.IsDeleted = 0) AS UppCnt,
(SELECT COUNT(*) FROM CMS.UserWalletHistories h
INNER JOIN CMS.UserWallets w ON w.Id = h.WalletId
WHERE w.UserId = u.Id AND h.IsDeleted = 0) AS WhCnt
FROM CMS.Users u
INNER JOIN @ManualyUsers mu ON mu.UserId = u.Id
WHERE u.IsDeleted = 0
ORDER BY u.Id;
ROLLBACK;
-- COMMIT;
PRINT 'Done (rolled back by default).';