/*
    Get Goals with their GoalChanges
 */
USE IncentiveManager;

DECLARE @DEPARTMENT_ID INT = 63;
DECLARE @START_DATE DATETIME2 = '2022-01-01 00:00:00.0000000';

/*
    Goals are joined to the goal change table as seen below in the sample query
    Get all department goals for @DEPARTMENT_ID along with their changes in descending order where the start date is @START_DATE
    If no joining data is found in the goal change table for a goal it has not been changed since it was initially created
 */
SELECT *
FROM Goals g
         LEFT JOIN GoalChanges gc ON g.DepartmentId = gc.DepartmentId
    AND g.Product = gc.Product
    AND g.StartDate = gc.StartDate
    AND g.EndDate = gc.EndDate
    AND COALESCE(g.EmployeeId, '') = COALESCE(gc.PersonId, '')
WHERE g.StartDate = @START_DATE
  AND g.DepartmentId = @DEPARTMENT_ID
  AND g.EmployeeId IS NULL
  AND gc.PersonId IS NULL -- If g.EmployeeId and gc.PersonId are null then the goal and its changes belong to a department, not an individual user
ORDER BY gc.Created DESC;

/*
    Get all non home department payouts for @PRODUCT in @PAYOUT_PERIOD
 */

USE IncentiveManager;

DECLARE @PRODUCT VARCHAR(255) = 'GAPInsurance';
DECLARE @PAYOUT_PERIOD DATETIME2 = '2022-06-01 00:00:00.0000000';

WITH MultiplePayoutEmployees AS
         (SELECT pli.EmployeeId, pli.ActivityPeriod, COUNT(pli.EmployeeId) AS PayoutCount
          FROM PayoutLineItems pli
          WHERE pli.Product = @PRODUCT
          GROUP BY pli.EmployeeId, pli.ActivityPeriod
          HAVING COUNT(pli.EmployeeId) > 1)
SELECT DISTINCT au.FullName, pli.*
FROM MultiplePayoutEmployees mpe
         LEFT JOIN PayoutLineItems pli ON mpe.EmployeeId = pli.EmployeeId AND mpe.ActivityPeriod = pli.ActivityPeriod
         LEFT JOIN AppUser au ON pli.EmployeeId = au.EmployeeId
         LEFT JOIN DeptAssignments da ON pli.EmployeeId = da.EmployeeId
    AND pli.DepartmentId = da.DepartmentId
    AND @PAYOUT_PERIOD >= da.StartDate
    AND (da.EndDate IS NULL OR @PAYOUT_PERIOD <= da.EndDate)
WHERE pli.Product = @PRODUCT
  AND pli.ActivityPeriod = @PAYOUT_PERIOD
  AND da.IsHome = 0
ORDER BY pli.EmployeeId;

/*
    Delete all non home department payouts for @PRODUCT in @PAYOUT_PERIOD
 */
BEGIN TRANSACTION;

-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;

USE IncentiveManager;

DECLARE @PRODUCT VARCHAR(255) = 'GAPInsurance';
DECLARE @PAYOUT_PERIOD DATETIME2 = '2022-06-01 00:00:00.0000000';
DECLARE @TARGET_PAYOUT_IDS TABLE(ID INT);

SET NOCOUNT ON; -- Suppress unwanted count on var table insert
WITH MultiplePayoutEmployees AS
(SELECT pli.EmployeeId, pli.ActivityPeriod, COUNT(pli.EmployeeId) AS PayoutCount
FROM PayoutLineItems pli
WHERE pli.Product = @PRODUCT
GROUP BY pli.EmployeeId, pli.ActivityPeriod
HAVING COUNT(pli.EmployeeId) > 1),
TargetPayoutIds AS (SELECT pli.Id
FROM MultiplePayoutEmployees mpe
LEFT JOIN PayoutLineItems pli ON mpe.EmployeeId = pli.EmployeeId AND
mpe.ActivityPeriod = pli.ActivityPeriod
LEFT JOIN AppUser au ON pli.EmployeeId = au.EmployeeId
LEFT JOIN DeptAssignments da ON pli.EmployeeId = da.EmployeeId
AND pli.DepartmentId = da.DepartmentId
AND @PAYOUT_PERIOD >= da.StartDate
AND (da.EndDate IS NULL OR @PAYOUT_PERIOD <= da.EndDate)
WHERE pli.Product = @PRODUCT
AND pli.ActivityPeriod = @PAYOUT_PERIOD
AND da.IsHome = 0)
INSERT INTO @TARGET_PAYOUT_IDS SELECT Id FROM TargetPayoutIds;
SET NOCOUNT OFF; -- Re enable count after insert for DBA DELETE rows affected verification

-- SELECT * FROM @TARGET_PAYOUT_IDS;
-- SELECT * FROM ActivityPayouts WHERE PayoutLineItemId IN (SELECT * FROM @TARGET_PAYOUT_IDS);
-- SELECT * FROM PayoutLineItems WHERE Id IN (SELECT * FROM @TARGET_PAYOUT_IDS);

DELETE FROM ActivityPayouts WHERE PayoutLineItemId IN (SELECT * FROM @TARGET_PAYOUT_IDS);
DELETE FROM PayoutLineItems WHERE Id IN (SELECT * FROM @TARGET_PAYOUT_IDS);

/*
    Delete all duplicate goals for @BRANCH in @PAYOUT_PERIOD
 */

-- (20 rows affected)
BEGIN TRANSACTION;

-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;

USE IncentiveManager;

DECLARE @BRANCH VARCHAR(255) = '11';
DECLARE @PAYOUT_PERIOD DATETIME2 = '2022-08-01 00:00:00.0000000';

WITH MultipleGoalEmployees AS
(
SELECT g.EmployeeId, g.StartDate, g.Product, COUNT(g.EmployeeId) AS GoalCount
FROM Goals g
WHERE g.StartDate = @PAYOUT_PERIOD
GROUP BY g.EmployeeId, g.StartDate, g.Product
HAVING COUNT(g.EmployeeId) > 1
),
TargetItems AS(
    SELECT au.FullName, ROW_NUMBER() OVER (PARTITION BY g.EmployeeId, g.StartDate, g.Product ORDER BY g.LastUpdated ASC) AS RowRank, g.*
FROM MultipleGoalEmployees mge
LEFT JOIN AppUser au ON mge.EmployeeId = au.EmployeeId
LEFT JOIN Goals g ON mge.EmployeeId = g.EmployeeId
AND mge.Product = g.Product
AND mge.StartDate = g.StartDate
WHERE g.DepartmentId IN (@BRANCH)
)
DELETE FROM Goals WHERE Id IN(
SELECT ti.Id FROM TargetItems ti
WHERE ti.RowRank = 1
)

/*
    Sample Manual Data Update State Change Insert To Maintain Long Term Data Integrity
 */
INSERT INTO ActivityStateChanges (CreatedBy, Created, CreatedByType, ActivityId, State, Note, ActivityMatchId, AcceptedDate, CreatedByAppUserId)
VALUES ('Incentive Manager', GETUTCDATE(), 1, @TARGET_ACTIVITY_ID, 'Accepted', 'Auto-Decision: MBP Accepted', 0, @UPDATE_ACTIVITY_ACCEPTED_DATE, '00000000-0000-0000-0000-000000000000');

/*
    Remove @TARGET_ACTIVITY_ID from system, this should only be a last resort for data issues since the system is supposed to be auditable
*/

USE IncentiveManager;

DECLARE @TARGET_ACTIVITY_ID INT = 143613;

BEGIN TRANSACTION;

DELETE
FROM ActivityDetailUpdates
WHERE Id IN (SELECT adu.Id
             FROM Activity a
                      LEFT JOIN ActivityDetail ad ON a.Id = ad.ActivityRef
                      LEFT JOIN ActivityDetailUpdates adu ON ad.Id = adu.ActivityDetailId
             WHERE a.Id = @TARGET_ACTIVITY_ID);

DELETE
FROM ActivityDetail
WHERE Id IN (SELECT ad.Id
             FROM Activity a
                      LEFT JOIN ActivityDetail ad ON a.Id = ad.ActivityRef
             WHERE a.Id = @TARGET_ACTIVITY_ID);

DELETE
FROM dbo.ActivityMetaData
WHERE Id IN (SELECT amd.Id
             FROM Activity a
                      LEFT JOIN ActivityMetaData amd ON a.Id = amd.ActivityRef
             WHERE a.Id = @TARGET_ACTIVITY_ID);

DELETE
FROM ActivityStateChanges
WHERE Id IN (SELECT ad.Id
             FROM Activity a
                      LEFT JOIN ActivityStateChanges ad ON a.Id = ad.ActivityId
             WHERE a.Id = @TARGET_ACTIVITY_ID);

DELETE
FROM ActivityTransferActions
WHERE Id IN (SELECT ata.Id
             FROM Activity a
                      LEFT JOIN ActivityTransferActions ata ON a.Id = ata.RequestedActivityId OR a.Id = ata.NewActivityId
             WHERE a.Id = @TARGET_ACTIVITY_ID);

DELETE
FROM PayoutLineItems
WHERE Id IN (SELECT pli.Id
             FROM Activity a
                      LEFT JOIN ActivityPayouts ap ON a.Id = ap.ActivityId
                      LEFT JOIN PayoutLineItems pli ON ap.PayoutLineItemId = pli.Id
             WHERE a.Id = @TARGET_ACTIVITY_ID);

DELETE
FROM ActivityPayouts
WHERE ActivityId IN (SELECT ap.ActivityId
                     FROM Activity a
                              LEFT JOIN ActivityPayouts ap ON a.Id = ap.ActivityId
             WHERE a.Id = @TARGET_ACTIVITY_ID);

DELETE
FROM Activity
WHERE Id IN (SELECT a.Id
             FROM Activity a
             WHERE a.Id = @TARGET_ACTIVITY_ID);

ROLLBACK TRANSACTION;
-- COMMIT TRANSACTION;

/*
    Sample Query To Manually Enter AppUser
*/
DECLARE @USER_EMAIL VARCHAR(MAX) = 'EMPLOYEEEMAIL@LANDMARKCU.COM';
DECLARE @USER_ID UNIQUEIDENTIFIER = NEWID();

INSERT INTO IncentiveManager.dbo.AppUser (Id, AdEmail, PersonId, EmployeeId, CreatedBy, Created, CreatedByType, LastUpdatedBy, LastUpdated, LastUpdatedByType, HomeDepartment, BaseRole, ManagerKey, Role, FullName, Terminated, CreatedByAppUserId, LastUpdatedByAppUserId) VALUES (@USER_ID,@USER_EMAIL, 0, N'X099', N'Incentive Manager', N'2021-10-16 02:01:19.2424619', 1, N'Incentive Manager', N'2022-09-14 23:50:39.2427930', 1, N'HEADQUARTERS - INFORMATION TECHNOLOGY', N'SOFTWARE ENG', N'11519', N'Admin', N'DEPRATT, ANDREW', null, N'00000000-0000-0000-0000-000000000000', N'00000000-0000-0000-0000-000000000000');
INSERT INTO IncentiveManager.dbo.DeptAssignments (CreatedBy, Created, CreatedByType, LastUpdatedBy, LastUpdated, LastUpdatedByType, DepartmentId, StartDate, EndDate, Note, IsHome, Role, SlidingPayout, AppUserId, CreatedByAppUserId, LastUpdatedByAppUserId) VALUES (N'Incentive Manager', N'2021-10-16 02:01:19.2424607', 1, N'Incentive Manager', N'2022-09-14 23:50:39.2427934', 1, 2, N'2020-08-01 00:00:00.0000000', null, N'Auto Generated Home Assignment', 1, N'Admin', 100.00, @USER_ID, N'00000000-0000-0000-0000-000000000000', N'00000000-0000-0000-0000-000000000000');

/*
    Update @TARGET_ACTIVITY_ID and associated payouts along with the final state change to have a different payout period and accepted date
*/

USE IncentiveManager;

-- (1 row affected)
-- (1 row affected)
-- (1 row affected)
BEGIN TRANSACTION;
-- ROLLBACK TRANSACTION;
-- COMMIT TRANSACTION;

DECLARE @NEW_ACTIVITY_PERIOD DATETIME2 = '2022-11-01 00:00:00.0000000';
DECLARE @NEW_ACCEPTED_DATE DATETIME2 = '2022-11-29 12:00:00.0000000';
DECLARE @TARGET_ACTIVITY_ID INT = 177281;

UPDATE ActivityStateChanges SET AcceptedDate = @NEW_ACCEPTED_DATE
WHERE Id IN (SELECT TOP 1 ad.Id
             FROM Activity a
                      LEFT JOIN ActivityStateChanges ad ON a.Id = ad.ActivityId
             WHERE a.Id = @TARGET_ACTIVITY_ID
             AND ad.State = 'Accepted'
             ORDER BY ad.Created DESC);

UPDATE PayoutLineItems SET ActivityPeriod = @NEW_ACTIVITY_PERIOD
WHERE Id IN (SELECT pli.Id
             FROM Activity a
                      LEFT JOIN ActivityPayouts ap ON a.Id = ap.ActivityId
                      LEFT JOIN PayoutLineItems pli ON ap.PayoutLineItemId = pli.Id
             WHERE a.Id = @TARGET_ACTIVITY_ID);

UPDATE Activity SET Accepted = @NEW_ACCEPTED_DATE
WHERE Id IN (SELECT a.Id
             FROM Activity a
             WHERE a.Id = @TARGET_ACTIVITY_ID);

-- SELECT *
-- FROM ActivityStateChanges
-- WHERE Id IN (SELECT TOP 1 ad.Id
--              FROM Activity a
--                       LEFT JOIN ActivityStateChanges ad ON a.Id = ad.ActivityId
--              WHERE a.Id = @TARGET_ACTIVITY_ID
--              AND ad.State = 'Accepted'
--              ORDER BY ad.Created DESC);
-- SELECT *
-- FROM PayoutLineItems
-- WHERE Id IN (SELECT pli.Id
--              FROM Activity a
--                       LEFT JOIN ActivityPayouts ap ON a.Id = ap.ActivityId
--                       LEFT JOIN PayoutLineItems pli ON ap.PayoutLineItemId = pli.Id
--              WHERE a.Id = @TARGET_ACTIVITY_ID);
-- SELECT *
-- FROM Activity
-- WHERE Id IN (SELECT a.Id
--              FROM Activity a
--              WHERE a.Id = @TARGET_ACTIVITY_ID);

/*
    DELETE ActivityPayouts linked to @TARGET_ACTIVITY_ID so they can be recreated
*/

USE IncentiveManager;

-- (1 row affected)
BEGIN TRANSACTION;
-- ROLLBACK TRANSACTION;
-- COMMIT TRANSACTION;

DECLARE @TARGET_ACTIVITY_ID INT = 177281;

DELETE PayoutLineItems
WHERE Id IN (SELECT pli.Id
             FROM Activity a
                      LEFT JOIN ActivityPayouts ap ON a.Id = ap.ActivityId
                      LEFT JOIN PayoutLineItems pli ON ap.PayoutLineItemId = pli.Id
             WHERE a.Id = @TARGET_ACTIVITY_ID);

-- SELECT *
-- FROM PayoutLineItems
-- WHERE Id IN (SELECT pli.Id
--              FROM Activity a
--                       LEFT JOIN ActivityPayouts ap ON a.Id = ap.ActivityId
--                       LEFT JOIN PayoutLineItems pli ON ap.PayoutLineItemId = pli.Id
--              WHERE a.Id = @TARGET_ACTIVITY_ID);
-- SELECT *
-- FROM ActivityPayouts
-- WHERE ActivityId = @TARGET_ACTIVITY_ID;

/*
    UPDATE @TARGET_APPUSER_EMPLOYEE_ID to be @NEW_APPUSER_ROLE for local/QA dev
*/

DECLARE @TARGET_APPUSER_EMPLOYEE_ID VARCHAR(MAX) = '8675309';
DECLARE @NEW_APPUSER_ROLE VARCHAR(MAX) = 'Admin';

UPDATE AppUser
SET Role = @NEW_APPUSER_ROLE
WHERE Id IN (SELECT au.Id FROM AppUser au WHERE au.EmployeeId IN (@TARGET_APPUSER_EMPLOYEE_ID));
Update DeptAssignments
Set Role = @NEW_APPUSER_ROLE
WHERE Id IN (SELECT da.Id
                    FROM AppUser au
                             LEFT JOIN DeptAssignments da on au.Id = da.AppUserId
                    WHERE au.EmployeeId IN (@TARGET_APPUSER_EMPLOYEE_ID));
