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

------------------------------------------------------------------------------------
-- Created by:  AgentNeo
-- Created on:  07/07/2026
-- Description: Insert a new asset type and return the created row.
--              Raises an exception if the commissioning workflow does not exist
--              in the same project.
------------------------------------------------------------------------------------

DROP FUNCTION IF EXISTS xyz."fn_InsertAssetType";

CREATE OR REPLACE FUNCTION xyz."fn_InsertAssetType" (
    _projectId               UUID,
    _commissioningWorkflowId UUID,
    _name                    TEXT,
    _createdBy               TEXT
)
RETURNS TABLE (
    "AssetTypeId"             UUID,
    "CommissioningWorkflowId" UUID,
    "Name"                    TEXT,
    "CreatedBy"               TEXT,
    "InsertedOn"              TIMESTAMP WITH TIME ZONE,
    "LastModifiedOn"          TIMESTAMP WITH TIME ZONE,
    "LastModifiedBy"          TEXT
)
AS $$
DECLARE
    -- project id map
    _projectShardId INT;
    _newAssetTypeId UUID;
BEGIN
    -- get shard id from uuid
    SELECT xyz."fn_GetProjectShardId"(_projectId) INTO _projectShardId;

    -- validate commissioning workflow exists in this project
    IF NOT EXISTS (
        SELECT 1 FROM xyz."CommissioningWorkflow" AS cw
        WHERE cw."ProjectShardId"          = _projectShardId
          AND cw."CommissioningWorkflowId" = _commissioningWorkflowId
    ) THEN
        RAISE EXCEPTION 'CommissioningWorkflow with id % not found in project', _commissioningWorkflowId;
    END IF;

    _newAssetTypeId := GEN_RANDOM_UUID();

    INSERT INTO xyz."AssetType" (
        "AssetTypeId",
        "ProjectShardId",
        "CommissioningWorkflowId",
        "Name",
        "CreatedBy"
    )
    VALUES (
        _newAssetTypeId,
        _projectShardId,
        _commissioningWorkflowId,
        _name,
        _createdBy
    );

    RETURN QUERY
    SELECT * FROM xyz."fn_GetAssetType"(_projectId, _newAssetTypeId);
END;
$$
LANGUAGE plpgsql;
/