USP_REVENUE_GETBENEFITS_5_UPDATEFROMXML

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@XML xml IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN
@ADJUSTMENTID uniqueidentifier IN
@ADJUSTMENTPOSTDATE datetime IN

Definition

Copy


            create procedure dbo.USP_REVENUE_GETBENEFITS_5_UPDATEFROMXML
            (
                @REVENUEID uniqueidentifier,
                @XML xml,
                @CHANGEAGENTID uniqueidentifier = null,
                @CHANGEDATE datetime = null,
                @ADJUSTMENTID uniqueidentifier = null,
                @ADJUSTMENTPOSTDATE datetime = null
            )
            as
            set nocount on;

            if @CHANGEAGENTID is null
                exec USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

            if @CHANGEDATE is null 
                set @CHANGEDATE = getdate();

            -- build a temporary table containing the values from the XML

            declare @TempTbl table
            (
                [BASECURRENCYID] uniqueidentifier,
                [BASEEXCHANGERATEID] uniqueidentifier,
                [BENEFITID] uniqueidentifier,
                [DETAILS] nvarchar(255),
                [ID] uniqueidentifier,
                [ORGANIZATIONEXCHANGERATEID] uniqueidentifier,
                [ORGANIZATIONTOTALVALUE] money,
                [PERCENTAPPLICABLEAMOUNT] money,
                [QUANTITY] int,
                [REVENUESPLITID] uniqueidentifier,
                [SEQUENCE] int,
                [TRANSACTIONCURRENCYID] uniqueidentifier,
                [TRANSACTIONTOTALVALUE] money,
                [UNITVALUE] money,
                [VALUEPERCENT] decimal(20, 4),
                [SENDBENEFITCODE] tinyint,
                [BENEFITTYPECODE] tinyint,
                [SOURCELINEITEMID] uniqueidentifier,
                [IDEXISTS] bit
            );

            --Expenses

            insert into @TempTbl
            select
                temp.[BASECURRENCYID],
                temp.[BASEEXCHANGERATEID],
                temp.[BENEFITID],
                left(temp.[DETAILS], 255),
                case
                    when temp.[ID] is null or temp.[ID] = '00000000-0000-0000-0000-000000000000' then newid()
                    else temp.[ID]
                end,
                temp.[ORGANIZATIONEXCHANGERATEID],
                temp.[ORGANIZATIONTOTALVALUE],
                coalesce(temp.[PERCENTAPPLICABLEAMOUNT], 0.00),
                coalesce(temp.[QUANTITY], 0),
                temp.[REVENUESPLITID],
                temp.[SEQUENCE],
                temp.[TRANSACTIONCURRENCYID],
                temp.[TRANSACTIONTOTALVALUE],
                coalesce(temp.[UNITVALUE], 0.00),
                coalesce(temp.[VALUEPERCENT], 0.00),
                B.[SENDBENEFITCODE],
                1,
                null,
                case
                    when exists (select top 1 ID from dbo.FINANCIALTRANSACTIONLINEITEM where ID = temp.ID or SOURCELINEITEMID = temp.ID) then 1
                    else 0
                end
            from dbo.UFN_REVENUE_GETBENEFITS_3_FROMITEMLISTXML(@XML) temp
                inner join dbo.BENEFIT B on B.ID = temp.BENEFITID;

            --Liabilities

            insert into @TempTbl
            select
                temp.[BASECURRENCYID],
                temp.[BASEEXCHANGERATEID],
                temp.[BENEFITID],
                temp.[DETAILS],
                case
                    when LI.[ID] is null or LI.[ID] = '00000000-0000-0000-0000-000000000000' then newid()
                    else LI.[ID]
                end,
                temp.[ORGANIZATIONEXCHANGERATEID],
                temp.[ORGANIZATIONTOTALVALUE],
                coalesce(temp.[PERCENTAPPLICABLEAMOUNT], 0.00),
                coalesce(temp.[QUANTITY], 0),
                temp.[REVENUESPLITID],
                temp.[SEQUENCE],
                temp.[TRANSACTIONCURRENCYID],
                temp.[TRANSACTIONTOTALVALUE],
                coalesce(temp.[UNITVALUE], 0.00),
                coalesce(temp.[VALUEPERCENT], 0.00),
                temp.[SENDBENEFITCODE],
                2,
                temp.ID,
                case
                    when exists (select top 1 ID from dbo.FINANCIALTRANSACTIONLINEITEM where ID = temp.ID or SOURCELINEITEMID = temp.ID) then 1
                    else 0
                end
            from @TempTbl temp
                left join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.SOURCELINEITEMID = temp.ID
                left join dbo.REVENUEBENEFIT_EXT RBX on RBX.ID = LI.ID
            where
                temp.[SENDBENEFITCODE] = 1
                and (RBX.ID is null or RBX.BENEFITTYPECODE = 2)
                and (select TYPECODE from dbo.FINANCIALTRANSACTION FT where FT.ID = @REVENUEID) = 1
                and LI.DELETEDON is null;

            if @@Error <> 0
                return 1;

            declare @REVENUEBASECURRENCYID uniqueidentifier = null;
            select @REVENUEBASECURRENCYID = REVENUE_EXT.NONPOSTABLEBASECURRENCYID
            from dbo.FINANCIALTRANSACTION inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
            where FINANCIALTRANSACTION.ID = @REVENUEID;

            if @REVENUEBASECURRENCYID is null
            begin
                select @REVENUEBASECURRENCYID = V.BASECURRENCYID
                from dbo.V_BASECURRENCYFORFINANCIALTRANSACTION_I V with (noexpand)
                where FINANCIALTRANSACTIONID = @REVENUEID;
            end

            declare @ADJUSTMENTPOSTSTATUSCODE tinyint;
            if not @ADJUSTMENTID is null
            begin
             select top 1
                 @ADJUSTMENTPOSTSTATUSCODE = A.POSTSTATUSCODE,
                 @ADJUSTMENTPOSTDATE = A.POSTDATE
             from dbo.BENEFITADJUSTMENT A
             where A.ID = @ADJUSTMENTID
             order by A.DATEADDED desc;
            end


            --danwar check for initial adjustment of payment record and set to match

            declare @INITIALADJUSTMENTID uniqueidentifier
            select top 1
                @INITIALADJUSTMENTID = LIA.ID
            from
                dbo.FINANCIALTRANSACTIONLINEITEM LI
                inner join dbo.FINANCIALTRANSACTIONLINEITEMADJUSTMENT LIA on LIA.ID = LI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
            where
                LIA.ADJUSTMENTREASONCODEID is null 
                and LI.FINANCIALTRANSACTIONID = @REVENUEID
                and LI.POSTSTATUSCODE = 2 and LI.TYPECODE = 0;

            if (select count(*)
                from @TempTbl [T]
                inner join dbo.BENEFIT on BENEFIT.ID = [T].BENEFITID
                where BENEFIT.BASECURRENCYID <> @REVENUEBASECURRENCYID
                and BENEFIT.USEPERCENT <> 1) > 0
            begin
                raiserror('BBERR_BENEFIT_BASECURRENCY_NOTEQUAL_REVENUE_BASECURRENCY', 13, 1);
                return 1;
            end

            declare @contextCache varbinary(128);
            declare @e int;

            -- cache current context information

            set @contextCache = CONTEXT_INFO();

            -- set CONTEXT_INFO to @CHANGEAGENTID 

            if not @CHANGEAGENTID is null
                set CONTEXT_INFO @CHANGEAGENTID;

            declare @LINEITEMSTODELETE table (ID uniqueidentifier)
            insert into @LINEITEMSTODELETE
            select
                LI.ID
            from
                dbo.FINANCIALTRANSACTION FT
                inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.FINANCIALTRANSACTIONID = FT.ID
                inner join dbo.REVENUEBENEFIT_EXT RBX on RBX.ID = LI.ID
                left join dbo.FINANCIALTRANSACTIONLINEITEM REVERSALS on REVERSALS.REVERSEDLINEITEMID = LI.ID
                left join @TempTbl T on T.ID = LI.ID
            where
                T.ID is null
                and LI.POSTSTATUSCODE <> 2
                -- Bug#257538, 257565 & 257622 - We don't require ADJUSTMENTID check in normal condition.

                -- These checks were added for bug#218452/242312/254641.

                -- Earlier version of this SP USP_REVENUE_GETBENEFITS_3_UPDATEFROMXML was not having ADJUSTMENTID parameter.

                -- So if ADJUSTMENTID is not supplied we can safely assume that its not required.

                and (@ADJUSTMENTID is null or LI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID <> @ADJUSTMENTID)
                and LI.DELETEDON is null --if they've already been deleted, ignore them

                and FT.ID = @REVENUEID
                and RBX.BENEFITTYPECODE in (1, 2)
                and REVERSALS.ID is null;

            --also delete backouts for liabilities to delete

            insert into @LINEITEMSTODELETE
            select
                LI.ID
            from
                @LINEITEMSTODELETE L
                inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.SOURCELINEITEMID = L.ID;

            -- delete any items that no longer exist in the XML table

            if exists (select top 1 1 from @LINEITEMSTODELETE)
            begin
                delete from dbo.[FINANCIALTRANSACTIONLINEITEM]
                where [FINANCIALTRANSACTIONLINEITEM].ID in (select ID from @LINEITEMSTODELETE);
            end

            delete from @LINEITEMSTODELETE;

            insert into @LINEITEMSTODELETE
            select
                LI.ID
            from
                dbo.FINANCIALTRANSACTION FT
                inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.FINANCIALTRANSACTIONID = FT.ID
                inner join dbo.REVENUEBENEFIT_EXT RBX on RBX.ID = LI.ID
                left join @TempTbl T on T.ID = LI.ID
            where
                T.ID is null
                and (LI.POSTSTATUSCODE = 2 or LI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = @ADJUSTMENTID)
                and LI.DELETEDON is null --if they've already been deleted, ignore them

                and FT.ID = @REVENUEID
                and RBX.BENEFITTYPECODE in (1, 2);

            --also delete backouts for liabilities to delete

            insert into @LINEITEMSTODELETE
            select
                LI.ID
            from
                @LINEITEMSTODELETE L
                inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.SOURCELINEITEMID = L.ID
            where
                LI.DELETEDON is null; --if they've already been deleted, ignore them


            -- hide any line items that have been waived or removed but were previously posted

            if exists (select top 1 1 from @LINEITEMSTODELETE)
            begin
                update LI set
                    POSTSTATUSCODE =
                        case
                            when LI.POSTSTATUSCODE = 1 then 3    -- Change 'not posted' to 'do not post'

                            else LI.POSTSTATUSCODE
                        end,
                    FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = @ADJUSTMENTID,
                    DELETEDON = @CHANGEDATE
                from
                    @LINEITEMSTODELETE L
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = L.ID;
            end

            select @e=@@error;

            -- reset CONTEXT_INFO to previous value 

            if not @contextCache is null
                set CONTEXT_INFO @contextCache;

            if @e <> 0
                return 2;

            if exists( select * from @TempTbl where QUANTITY < 0 )
                raiserror('CK_REVENUEBENEFIT_QUANTITY_NONNEGATIVE', 16, 1);

            if exists( select * from @TempTbl where not (UNITVALUE=0 or VALUEPERCENT=0) )
                raiserror('CK_REVENUEBENEFIT_UNITVALUE_VALUEPERCENT', 16, 1);

            if exists( select * from @TempTbl where (VALUEPERCENT < 0) )
                raiserror('CK_REVENUEBENEFIT_VALUEPERCENT_NONNEGATIVE', 16, 1);

            if exists(select 1 from @TempTbl where UNITVALUE < 0)
                raiserror('CK_REVENUEBENEFIT_VALUE_NONNEGATIVE', 16, 1);

            if exists(select * from @TempTbl where PERCENTAPPLICABLEAMOUNT < 0 )
                raiserror('CK_REVENUEBENEFIT_PERCENTAPPLICABLEAMOUNT_NONNEGATIVE', 16, 1);

            if exists(select * from @TempTbl where TRANSACTIONTOTALVALUE < 0 )
                raiserror('CK_REVENUEBENEFIT_TRANSACTIONTOTALVALUE_NONNEGATIVE', 16, 1);

            if exists(select * from @TempTbl where ORGANIZATIONTOTALVALUE < 0 )
                raiserror('CK_REVENUEBENEFIT_ORGANIZATIONTOTALVALUE_NONNEGATIVE', 16, 1);

            -- Since we're updating existing records, we can ignore those that don't exist

            if exists (select top 1 ID from @TempTbl where IDEXISTS = 1)
            begin
                update LI set
                    DESCRIPTION = temp.DETAILS
                    ,ORGAMOUNT = temp.ORGANIZATIONTOTALVALUE
                    ,QUANTITY = cast(temp.QUANTITY as decimal(20,4))
                    ,SEQUENCE = temp.SEQUENCE
                    ,TRANSACTIONAMOUNT = temp.TRANSACTIONTOTALVALUE
                    ,BASEAMOUNT = cast((temp.QUANTITY * temp.UNITVALUE) + (temp.PERCENTAPPLICABLEAMOUNT * temp.VALUEPERCENT/100) as money)
                    ,UNITVALUE = temp.UNITVALUE
                    ,CHANGEDBYID = @CHANGEAGENTID
                    ,DATECHANGED = @CHANGEDATE
                    ,FINANCIALTRANSACTIONLINEITEMADJUSTMENTID = isnull(@ADJUSTMENTID, @INITIALADJUSTMENTID)
                    ,POSTSTATUSCODE = case when @ADJUSTMENTPOSTSTATUSCODE is null then LI.POSTSTATUSCODE else case @ADJUSTMENTPOSTSTATUSCODE when 2 then 3 else 1 end end
                    ,POSTDATE = isnull(@ADJUSTMENTPOSTDATE, LI.POSTDATE)
                from @TempTbl temp
                inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on (LI.ID = temp.ID or LI.SOURCELINEITEMID = temp.ID)
                where
                    (LI.POSTSTATUSCODE <> 2) and
                    (([LI].[DESCRIPTION]<>temp.[DETAILS]) or
                    ([LI].[ORGAMOUNT]<>temp.[ORGANIZATIONTOTALVALUE]) or
                    ([LI].[QUANTITY]<>temp.[QUANTITY]) or
                    ([LI].[SEQUENCE]<>temp.[SEQUENCE]) or
                    ([LI].[TRANSACTIONAMOUNT]<>temp.[TRANSACTIONTOTALVALUE]) or
                    ([LI].[UNITVALUE]<>temp.[UNITVALUE]) or
                    (@ADJUSTMENTPOSTSTATUSCODE <> [LI].POSTSTATUSCODE) or
                    (@ADJUSTMENTPOSTDATE <> [LI].POSTDATE) or
                    (@ADJUSTMENTID <> LI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID));

                --delete any Journal Entries for DNP line items

                delete from dbo.JOURNALENTRY where FINANCIALTRANSACTIONLINEITEMID in
                    (select
                        LI.ID
                    from
                        @TempTbl temp
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on LI.ID = temp.ID
                    where LI.POSTSTATUSCODE = 3);

                if @ADJUSTMENTID is null
                begin
                    update EXT set
                        BENEFITID = temp.BENEFITID
                        ,PERCENTAPPLICABLEAMOUNT = temp.PERCENTAPPLICABLEAMOUNT
                        ,REVENUESPLITID = temp.REVENUESPLITID
                        ,VALUEPERCENT = temp.VALUEPERCENT
                        ,CHANGEDBYID = @CHANGEAGENTID
                        ,DATECHANGED = @CHANGEDATE
                    from @TempTbl temp
                    inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on (LI.ID = temp.ID or LI.SOURCELINEITEMID = temp.ID)
                    inner join dbo.REVENUEBENEFIT_EXT EXT on temp.ID = EXT.ID
                    where
                            LI.POSTSTATUSCODE <> 2 and
                            (([EXT].[BENEFITID]<>temp.[BENEFITID]) or 
                            ([EXT].[PERCENTAPPLICABLEAMOUNT]<>temp.[PERCENTAPPLICABLEAMOUNT]) or 
                            ([EXT].[REVENUESPLITID]<>temp.[REVENUESPLITID]) or 
                            ([EXT].[VALUEPERCENT]<>temp.[VALUEPERCENT]));
                end
                else
                begin
                    update EXT set
                        BENEFITID = temp.BENEFITID
                        ,PERCENTAPPLICABLEAMOUNT = temp.PERCENTAPPLICABLEAMOUNT
                        ,REVENUESPLITID = temp.REVENUESPLITID
                        ,VALUEPERCENT = temp.VALUEPERCENT
                        ,CHANGEDBYID = @CHANGEAGENTID
                        ,DATECHANGED = @CHANGEDATE
                    from @TempTbl temp
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM LI on (LI.ID = temp.ID or LI.SOURCELINEITEMID = temp.ID)
                        inner join dbo.REVENUEBENEFIT_EXT EXT on temp.ID = EXT.ID
                    where
                        (([EXT].[BENEFITID]<>temp.[BENEFITID]) or
                        ([EXT].[PERCENTAPPLICABLEAMOUNT]<>temp.[PERCENTAPPLICABLEAMOUNT]) or
                        ([EXT].[REVENUESPLITID]<>temp.[REVENUESPLITID]) or
                        ([EXT].[VALUEPERCENT]<>temp.[VALUEPERCENT]));
                end

                if @@Error <> 0
                    return 3;
            end

            -- insert new items

            if exists (select top 1 1 from @TempTbl where IDEXISTS = 0)
            begin
                insert into dbo.FINANCIALTRANSACTIONLINEITEM
                (
                    ID
                    ,FINANCIALTRANSACTIONID
                    ,TRANSACTIONAMOUNT
                    ,BASEAMOUNT
                    ,ORGAMOUNT
                    ,QUANTITY
                    ,UNITVALUE
                    ,VISIBLE
                    ,DESCRIPTION
                    ,SEQUENCE
                    ,TYPECODE
                    ,POSTDATE
                    ,POSTSTATUSCODE
                    ,FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
                    ,SOURCELINEITEMID
                    ,ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                )
                select
                    temp.ID
                    ,@REVENUEID
                    ,isnull(temp.TRANSACTIONTOTALVALUE, 0)
                    ,cast((temp.QUANTITY * temp.UNITVALUE) + (temp.PERCENTAPPLICABLEAMOUNT * temp.VALUEPERCENT/100) as money)                
                    ,isnull(temp.ORGANIZATIONTOTALVALUE, 0)
                    ,isnull(temp.QUANTITY, 0)
                    ,isnull(temp.UNITVALUE, 0)
                    ,0
                    ,isnull(temp.DETAILS,'')
                    ,isnull(temp.SEQUENCE,0)
                    ,3
                    ,isnull(@ADJUSTMENTPOSTDATE, FT.POSTDATE)
                    ,case
                        when @ADJUSTMENTPOSTSTATUSCODE is null then
                            case FT.PostStatusCode
                                when 3 then 3
                                else 1
                            end
                        else
                            case @ADJUSTMENTPOSTSTATUSCODE
                                when 2 then 3
                                else 1
                            end
                    end
                    ,@ADJUSTMENTID
                    ,case temp.BENEFITTYPECODE when 1 then null when 2 then temp.SOURCELINEITEMID end
                    ,@CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE
                from @TempTbl as [temp]
                inner join dbo.FINANCIALTRANSACTION FT on FT.ID = @REVENUEID
                where temp.IDEXISTS = 0;

                insert into dbo.REVENUEBENEFIT_EXT
                (
                    ID
                    ,BENEFITID
                    ,SENDBENEFIT
                    ,PERCENTAPPLICABLEAMOUNT
                    ,VALUEPERCENT
                    ,REVENUESPLITID
                    ,BENEFITTYPECODE
                    ,ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
                )
                select
                    temp.ID
                    ,temp.BENEFITID
                    ,temp.SENDBENEFITCODE
                    ,isnull(temp.PERCENTAPPLICABLEAMOUNT, 0)
                    ,isnull(temp.VALUEPERCENT, 0)
                    ,temp.REVENUESPLITID
                    ,temp.BENEFITTYPECODE
                    ,@CHANGEAGENTID, @CHANGEAGENTID, @CHANGEDATE, @CHANGEDATE
                from @TempTbl as [temp]
                    inner join dbo.FINANCIALTRANSACTION FT on FT.ID = @REVENUEID
                where temp.IDEXISTS = 0;

                if @@Error <> 0
                    return 4;
            end
            return 0;