Expenditure Management Web Application Database

Sample Code (TSQL)

1. Procedure for Validating Transaction

                    

CREATE OR REPLACE PROCEDURE public.validate_n_transaction1(userid INT4)
AS $BODY$
DECLARE
    -- Declare Variables
    implementer INT;
    contractcount INT;
    chartofaccount INT;
    budgettype INT;
    healthfacility INT;
    curr INT;
    dupli INT;
    totalRec INT;
    totalInval INT;
    ExpenseZero INT;
    FieldCost INT;
    ManagementCost INT;
    InvalidChartOfAccount INT;
    InvalidFacility INT;
    InvalidICR INT;
    InvalidICR2 INT;
    InvalidFacilityforContract INT;
    ProvinceId INT;
    FacilityId INT;
    PartyId INT;
    PartyValidationForContract INT;
    ContractCode VARCHAR(50);
BEGIN
    -- Reset Reason field for the given user
    UPDATE public.Staging_NTransaction_slot1
    SET Reason = '?'
    WHERE Reason <> '?' 
        AND Reason IS NOT NULL 
        AND UserId = userid;

    -- Retrieve Contract Code
    SELECT DISTINCT ContractNo INTO ContractCode
    FROM public.Staging_NTransaction_slot1
    WHERE UserId = userid;

    -- Fetch Province ID linked to Contract
    SELECT provinceID INTO ProvinceId
    FROM public.contractProvince
    WHERE contractId IN (
        SELECT contractId
        FROM public.contractInfo
        WHERE contractCode IN (
            SELECT ContractNo
            FROM public.Staging_NTransaction_slot1  
            WHERE UserId = userid
        )
    );

    -- Count invalid records
    SELECT COUNT(*) INTO totalInval
    FROM public.Staging_NTransaction_slot1
    WHERE (Reason IS NOT NULL OR Reason = '?') 
        AND UserId = userid;

    -- Reset invalid reasons if they exist
    IF totalInval > 0 THEN
        UPDATE public.Staging_NTransaction_slot1
        SET Reason = NULL
        WHERE Reason = '?' 
            AND UserId = userid;
    END IF;

    -- Check Facility ID existence
    SELECT COUNT(*) INTO FacilityId
    FROM public.Staging_NTransaction_slot1
    WHERE FacilityId = 100000;

    -- Get Party ID from Contract
    SELECT leadId INTO PartyId
    FROM public.contractInfo
    WHERE contractCode = ContractCode;

    -- Count Invalid Implementers
    SELECT COUNT(*) INTO implementer
    FROM public.Staging_NTransaction_slot1
    WHERE Organization NOT IN (
        SELECT DISTINCT partyAbbrivation 
        FROM public.partyInfo
    ) AND UserId = userid;

    -- Count Invalid Contracts
    SELECT COUNT(*) INTO contractcount
    FROM public.Staging_NTransaction_slot1
    WHERE ContractNo NOT IN (
        SELECT contractCode 
        FROM public.contractInfo
        INNER JOIN public.partyInfo ON partyInfo.partyID = contractInfo.leadId
    ) AND UserId = userid;

    -- Count Invalid Budget Types
    SELECT COUNT(*) INTO budgettype
    FROM public.Staging_NTransaction_slot1
    WHERE ExpenseType NOT IN ('Field Cost', 'Management Cost')  
        AND UserId = userid;

    -- Validate Chart of Accounts
    SELECT COUNT(*) INTO chartofaccount
    FROM public.Staging_NTransaction_slot1
    WHERE ChartOfAccount NOT IN (
        SELECT coACode 
        FROM emis.coaMapping 
        WHERE Organization IN (
            SELECT partyAbbrivation 
            FROM public.partyInfo
        )
    ) AND UserId = userid;

    -- Validate Health Facilities
    SELECT COUNT(*) INTO healthfacility
    FROM public.Staging_NTransaction_slot1
    WHERE FacilityId NOT IN (
        SELECT facilityId 
        FROM public.facilityInfo
    ) AND UserId = userid;

    -- Validate Currency
    SELECT COUNT(*) INTO curr
    FROM public.Staging_NTransaction_slot1
    WHERE Currency NOT IN (
        SELECT currAbr 
        FROM emis.currencyInfo
    ) AND UserId = userid;

    -- Check if Expense is Zero or Negative
    SELECT COUNT(*) INTO ExpenseZero
    FROM public.Staging_NTransaction_slot1
    WHERE Expense <= 0 
        AND UserId = userid;

    -- Validate Field Cost Facility ID
    SELECT COUNT(*) INTO FieldCost
    FROM public.Staging_NTransaction_slot1
    WHERE FacilityId >= 100000 
        AND ExpenseType = 'Field Cost' 
        AND UserId = userid;

    -- Validate Management Cost Facility ID
    SELECT COUNT(*) INTO ManagementCost
    FROM public.Staging_NTransaction_slot1
    WHERE FacilityId < 100000 
        AND ExpenseType = 'Management Cost' 
        AND UserId = userid;

    -- Validate Chart of Accounts for incorrect mapping
    SELECT COUNT(*) INTO InvalidChartOfAccount
    FROM public.Staging_NTransaction_slot1
    WHERE ChartOfAccount IN (
        SELECT coACode 
        FROM emis.coaMapping 
        WHERE emisCoaId IN (
            SELECT coaId 
            FROM emis.chartOfAccounts 
            WHERE flagId IN (2, 3)
        )
    ) AND Expense > 0;

    -- Validate Invalid ICR values
    SELECT COUNT(*) INTO InvalidICR
    FROM public.Staging_NTransaction_slot1
    WHERE (ICR > 0.2 OR ICR < 0) 
        AND UserId = userid;

    -- Validate ICR linkage to contract
    SELECT COUNT(*) INTO InvalidICR2
    FROM public.Staging_NTransaction_slot1
    WHERE ICR NOT IN (
        SELECT indirectCostPerc 
        FROM public.contractInfo 
        WHERE TenantId IN (
            SELECT TenantId 
            FROM public.Users 
            WHERE UserId = userid
        )
    );

    -- Validate Facility-Contract Relationship
    SELECT COUNT(*) INTO InvalidFacilityforContract
    FROM public.Staging_NTransaction_slot1
    WHERE FacilityId NOT IN (
        SELECT FacilityId 
        FROM public.chkFacilityContractValidation1 
        WHERE provinceId = ProvinceId
    ) AND UserId = userid;

    -- Validate Implementer Name for Contract
    SELECT COUNT(*) INTO PartyValidationForContract
    FROM public.Staging_NTransaction_slot1
    WHERE Organization NOT IN (
        SELECT partyAbbrivation 
        FROM public.partyInfo 
        WHERE partyID = PartyId
    ) AND UserId = userid;

    -- Check for Duplicates
    SELECT COUNT(*) INTO dupli
    FROM public.Staging_NTransaction_slot1 stg
    WHERE stg.UserId = userid 
        AND (stg.Organization || stg.ContractNo || stg.FacilityId || stg.Currency || stg.ExpenseType || 
             stg.ChartOfAccount || stg.Year || stg.Month || stg.TenantId) 
        IN (SELECT prt.partyAbbrivation || con.contractCode || hf.facilityId || curr.currAbr || 
                   btype.budgetTypeName || comp.coACode || nt.Year || nt.Month || nt.TenantId 
            FROM emis.NewTransactions nt
            INNER JOIN emis.budgetType btype ON nt.BudgetTypeId = btype.budgetTypeId
            INNER JOIN public.partyInfo prt ON nt.PartyId = prt.partyID
            INNER JOIN public.facilityInfo hf ON nt.FacilityId = hf.facilityId
            INNER JOIN emis.currencyInfo curr ON nt.CurrId = curr.currId
            INNER JOIN public.contractInfo con ON nt.ContractId = con.contractId
            INNER JOIN emis.coaMapping comp ON prt.partyID = comp.partyId 
                                            AND nt.PartyId = comp.partyId 
                                            AND nt.EMISCoAId = comp.emisCoaId);

    -- Update Reason if Duplicate Exists
    IF dupli > 0 THEN
        UPDATE public.Staging_NTransaction_slot1
        SET Reason = 'This record already exists in the database!'
        WHERE UserId = userid 
            AND (Organization || ContractNo || FacilityId || Currency || ExpenseType || 
                 ChartOfAccount || Year || Month || TenantId) 
            IN (SELECT prt.partyAbbrivation || con.contractCode || hf.facilityId || curr.currAbr || 
                       btype.budgetTypeName || comp.coACode || nt.Year || nt.Month || nt.TenantId 
                FROM emis.NewTransactions nt
                INNER JOIN emis.budgetType btype ON nt.BudgetTypeId = btype.budgetTypeId
                INNER JOIN public.partyInfo prt ON nt.PartyId = prt.partyID
                INNER JOIN public.facilityInfo hf ON nt.FacilityId = hf.facilityId
                INNER JOIN emis.currencyInfo curr ON nt.CurrId = curr.currId
                INNER JOIN public.contractInfo con ON nt.ContractId = con.contractId
                INNER JOIN emis.coaMapping comp ON prt.partyID = comp.partyId 
                                                AND nt.PartyId = comp.partyId 
                                                AND nt.EMISCoAId = comp.emisCoaId);
    END IF;
END;
$BODY$
LANGUAGE plpgsql;
2. Validate and Insert Budget Records

                    
CREATE OR REPLACE PROCEDURE public.insbudget(userid INT4)
AS $BODY$
DECLARE 
    records INT;
    allrecords INT;
BEGIN
    -- Insert new budget records if they do not already exist
    INSERT INTO emis.budget (
        contractId, hfID, partyId, coaId, facilityTypeId, 
        budgetStartDate, budgetEndDate, noOfMonth, unitCost, 
        currencyId, noOfUnit, totalCost, ICR, TenantId, 
        UserId, budgetTypeId, BudgetUID, enteredBy, createdDate
    )
    SELECT 
        c.contractId,
        f.facilityId,
        p.partyID,
        cm.emisCoaId,
        f.facilityTypeId,
        sb.StartDate,
        sb.EndDate,
        sb.NoOfMonths,
        sb.UnitCost,
        ci.currId,
        sb.Units,
        sb.TotalCost,
        sb.IC,
        sb.TenantId,
        sb.UserId,
        bt.budgetTypeId,
        CONCAT(p.partyID, '-', f.facilityId, '-', sb.ChartOfAccount, '-', sb.Contract, '-', 
               TO_CHAR(sb.StartDate, 'YYYY-MM-DD'), '-', TO_CHAR(sb.EndDate, 'YYYY-MM-DD'), '-', 
               ci.currId, '-', bt.budgetTypeId) AS UID,
        sb.UserId,
        CURRENT_TIMESTAMP
    FROM emis.coaMapping cm
    INNER JOIN public.Staging_Budget sb ON cm.coACode = sb.ChartOfAccount
    INNER JOIN emis.currencyInfo ci ON sb.Currency = ci.currAbr
    INNER JOIN public.contractInfo c ON sb.Contract = c.contractCode
    INNER JOIN emis.budgetType bt ON sb.BudgetType = bt.budgetTypeName
    INNER JOIN public.facilityInfo f ON sb.HealthFacility = f.facilityId
    INNER JOIN public.partyInfo p ON cm.partyId = p.partyID
    WHERE sb.UserId = userid
    AND CONCAT(p.partyID, '-', f.facilityId, '-', sb.ChartOfAccount, '-', sb.Contract, '-', 
               TO_CHAR(sb.StartDate, 'YYYY-MM-DD'), '-', TO_CHAR(sb.EndDate, 'YYYY-MM-DD'), '-', 
               ci.currId, '-', bt.budgetTypeId) 
        NOT IN (SELECT BudgetUID FROM emis.budget);

    -- Validate and delete processed staging records
    SELECT COUNT(*) INTO records 
    FROM public.Staging_Budget 
    WHERE Reason IS NULL AND UserId = userid;
    
    SELECT COUNT(*) INTO allrecords 
    FROM public.Staging_Budget 
    WHERE Reason IS NULL;
        
    IF records = allrecords THEN
        -- If all records are valid, truncate the staging table
        TRUNCATE TABLE public.Staging_Budget;
    ELSE
        -- Otherwise, delete only the records belonging to the current user
        DELETE FROM public.Staging_Budget 
        WHERE UserId = userid;
    END IF;

END;
$BODY$
LANGUAGE plpgsql;
3. Consolidating Transaction Data Across Staging Tables

                    
SELECT 
    st1."FacilityId"::TEXT || TO_CHAR(st1."Year" * 100 + st1."Month", 'FM00000000') AS "FacilityId",
    st1."Organization",
    st1."ContractNo",
    st1."Currency",
    st1."Year",
    st1."Month",
    SUM(st1."Expense") AS "Expense",
    SUM(st1."Expense" * st1."ICR" / 100::DOUBLE PRECISION) AS "IndCost",
    SUM(st1."Expense") + SUM(st1."Expense" * st1."ICR" / 100::DOUBLE PRECISION) AS "Total",
    st1."TenantId",
    fi."facilityId" || '-' || fi."hfName" AS "Facility",
    ft."facTypeShort" AS "FacilityType"
FROM "facilityTypes" ft
JOIN "facilityInfo" fi ON ft."facTypeCode" = fi."facilityTypeId"
JOIN "Staging_NTransaction_slot1" st1 ON fi."facilityId" = st1."FacilityId"
GROUP BY 
    st1."FacilityId", st1."Currency", st1."TenantId", st1."ContractNo", 
    st1."Organization", fi."facilityId", fi."hfName", ft."facTypeShort", 
    st1."Year", st1."Month"

UNION ALL

SELECT 
    st2."FacilityId"::TEXT || TO_CHAR(st2."Year" * 100 + st2."Month", 'FM00000000') AS "FacilityId",
    st2."Organization",
    st2."ContractNo",
    st2."Currency",
    st2."Year",
    st2."Month",
    SUM(st2."Expense") AS "Expense",
    SUM(st2."Expense" * st2."ICR" / 100::DOUBLE PRECISION) AS "IndCost",
    SUM(st2."Expense") + SUM(st2."Expense" * st2."ICR" / 100::DOUBLE PRECISION) AS "Total",
    st2."TenantId",
    fi."facilityId" || '-' || fi."hfName" AS "Facility",
    ft."facTypeShort" AS "FacilityType"
FROM "facilityTypes" ft
JOIN "facilityInfo" fi ON ft."facTypeCode" = fi."facilityTypeId"
JOIN "Staging_NTransaction_slot2" st2 ON fi."facilityId" = st2."FacilityId"
GROUP BY 
    st2."FacilityId", st2."Currency", st2."TenantId", st2."ContractNo", 
    st2."Organization", fi."facilityId", fi."hfName", ft."facTypeShort", 
    st2."Year", st2."Month"

UNION ALL

SELECT 
    st3."FacilityId"::TEXT || TO_CHAR(st3."Year" * 100 + st3."Month", 'FM00000000') AS "FacilityId",
    st3."Organization",
    st3."ContractNo",
    st3."Currency",
    st3."Year",
    st3."Month",
    SUM(st3."Expense") AS "Expense",
    SUM(st3."Expense" * st3."ICR" / 100::DOUBLE PRECISION) AS "IndCost",
    SUM(st3."Expense") + SUM(st3."Expense" * st3."ICR" / 100::DOUBLE PRECISION) AS "Total",
    st3."TenantId",
    fi."facilityId" || '-' || fi."hfName" AS "Facility",
    ft."facTypeShort" AS "FacilityType"
FROM "facilityTypes" ft
JOIN "facilityInfo" fi ON ft."facTypeCode" = fi."facilityTypeId"
JOIN "Staging_NTransaction_slot3" st3 ON fi."facilityId" = st3."FacilityId"
GROUP BY 
    st3."FacilityId", st3."Currency", st3."TenantId", st3."ContractNo", 
    st3."Organization", fi."facilityId", fi."hfName", ft."facTypeShort", 
    st3."Year", st3."Month"

UNION ALL

SELECT 
    st4."FacilityId"::TEXT || TO_CHAR(st4."Year" * 100 + st4."Month", 'FM00000000') AS "FacilityId",
    st4."Organization",
    st4."ContractNo",
    st4."Currency",
    st4."Year",
    st4."Month",
    SUM(st4."Expense") AS "Expense",
    SUM(st4."Expense" * st4."ICR" / 100::DOUBLE PRECISION) AS "IndCost",
    SUM(st4."Expense") + SUM(st4."Expense" * st4."ICR" / 100::DOUBLE PRECISION) AS "Total",
    st4."TenantId",
    fi."facilityId" || '-' || fi."hfName" AS "Facility",
    ft."facTypeShort" AS "FacilityType"
FROM "facilityTypes" ft
JOIN "facilityInfo" fi ON ft."facTypeCode" = fi."facilityTypeId"
JOIN "Staging_NTransaction_slot4" st4 ON fi."facilityId" = st4."FacilityId"
GROUP BY 
    st4."FacilityId", st4."Currency", st4."TenantId", st4."ContractNo", 
    st4."Organization", fi."facilityId", fi."hfName", ft."facTypeShort", 
    st4."Year", st4."Month";