Database/xyz/Functions/fn_GetCommissioningSystemList.sqladded
--liquibase formatted sql
--changeset agentneo:fn_GetCommissioningSystemList runOnChange:true stripComments:false endDelimiter:/
--comment: Create or replace xyz."fn_GetCommissioningSystemList"

------------------------------------------------------------------------------------
-- Created by:  AgentNeo
-- Created on:  10/07/2026
-- Description: Get a paginated list of non-deleted commissioning systems for a
--              given project, ordered by Id ASC for stable keyset pagination.
------------------------------------------------------------------------------------

DROP FUNCTION IF EXISTS xyz."fn_GetCommissioningSystemList";

CREATE OR REPLACE FUNCTION xyz."fn_GetCommissioningSystemList" (
    _projectId          UUID,
    _lastFetchedIndexId INTEGER DEFAULT NULL,
    _pageSize           INTEGER DEFAULT 1000
)
RETURNS TABLE (
    "Id"                    INTEGER,
    "CommissioningSystemId" UUID,
    "ProjectShardId"        INT,
    "SystemTypeId"          UUID,
    "Name"                  TEXT,
    "CreatedBy"             TEXT,
    "InsertedOn"            TIMESTAMP WITH TIME ZONE,
    "LastModifiedOn"        TIMESTAMP WITH TIME ZONE,
    "LastModifiedBy"        TEXT
)
AS $$
DECLARE
    -- project id map
    _projectShardId INT;
BEGIN
    -- get shard id from uuid
    SELECT xyz."fn_GetProjectShardId"(_projectId) INTO _projectShardId;

    RETURN QUERY
    SELECT
        cs."Id",
        cs."CommissioningSystemId",
        cs."ProjectShardId",
        cs."SystemTypeId",
        cs."Name",
        cs."CreatedBy",
        cs."InsertedOn",
        cs."LastModifiedOn",
        cs."LastModifiedBy"
    FROM xyz."CommissioningSystem" cs
    WHERE cs."ProjectShardId" = _projectShardId
      AND cs."IsDeleted"      = FALSE
      AND (
        CASE
            WHEN _lastFetchedIndexId IS NOT NULL THEN cs."Id" > _lastFetchedIndexId
            ELSE TRUE
        END
      )
    ORDER BY cs."Id" ASC
    LIMIT _pageSize;
END;
$$
LANGUAGE plpgsql;
/