USP_PLEDGE_UPDATEINSTALLMENT2

Update installments and linked payments.

Parameters

Parameter Parameter Type Mode Description
@PLEDGEID uniqueidentifier IN
@INSTALLMENTS xml IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTDATE datetime IN
@ADJPAYMENT_DATE datetime IN
@ADJPAYMENT_POSTDATE datetime IN
@ADJPAYMENT_REASONCODEID uniqueidentifier IN
@ADJPAYMENT_DETAILS nvarchar(255) IN

Definition

Copy


CREATE procedure dbo.USP_PLEDGE_UPDATEINSTALLMENT2
(
    @PLEDGEID uniqueidentifier,
    @INSTALLMENTS xml,
    @CHANGEAGENTID uniqueidentifier,
    @CURRENTDATE datetime,
    @ADJPAYMENT_DATE datetime,
    @ADJPAYMENT_POSTDATE datetime,
    @ADJPAYMENT_REASONCODEID uniqueidentifier,
    @ADJPAYMENT_DETAILS nvarchar(255)
)
as 
begin
    set nocount on;

    declare @INSTALLMENTSPLITS xml;

    if @CHANGEAGENTID is null  
        exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

    if @CURRENTDATE is null  
        set @CURRENTDATE = GetDate();

    --We need to make sure all of the installments have an ID so the child objects will update properly                                         

    declare @TempTbl table (
       [ID] uniqueidentifier,
       [DATE] datetime,
       [AMOUNT] money,
       [BALANCE] money,
       [APPLIED] money,
       [SEQUENCE] int,
       [SPLITID] uniqueidentifier,
       [SPLITDESIGNATIONID] uniqueidentifier,
       [SPLITAMOUNT] money,
       [REVENUESPLITID] uniqueidentifier);

    --case when T2.split.value('(ID)[1]','nvarchar(50)') = '' then null else T2.split.value('(ID)[1]','nvarchar(50)') end AS 'SPLITID',

    insert into @TempTbl
    SELECT
        T1.c.value('(ID)[1]','uniqueidentifier') AS 'ID',
        T1.c.value('(DATE)[1]','datetime') AS 'DATE',
        T1.c.value('(AMOUNT)[1]','money') AS 'AMOUNT',
        T1.c.value('(BALANCE)[1]','money') AS 'BALANCE',
        T1.c.value('(APPLIED)[1]','money') AS 'APPLIED',
        T1.c.value('(SEQUENCE)[1]','int') AS 'SEQUENCE',
        T2.split.value('(ID)[1]','nvarchar(50)') AS 'SPLITID',
        T2.split.value('(DESIGNATIONID)[1]','uniqueidentifier') AS 'SPLITDESIGNATIONID',
        T2.split.value('(AMOUNT)[1]','money') AS 'SPLITAMOUNT',
        T2.split.value('(REVENUESPLITID)[1]', 'uniqueidentifier') as 'REVENUESPLITID'
    from @INSTALLMENTS.nodes('/INSTALLMENTS/ITEM') T1(c)
    cross apply T1.c.nodes('./INSTALLMENTSPLITS/ITEM') as T2(split);

    declare @TempSeqTbl table (
       [ID] uniqueidentifier,
       [SEQUENCE] int);

    insert into @TempSeqTbl
    select newid() ID, MISSINGID.SEQUENCE
        from (select distinct SEQUENCE from @TempTbl where id is null) MISSINGID



    -- ** Work for PBI 40790 **

    declare @CONSTITUENTID uniqueidentifier
    declare @REVENUEID uniqueidentifier
    declare @DEPOSITID uniqueidentifier
    declare @APPLIEDAMOUNT money
    declare @DONOTPOST bit
    declare @REVENUEDATE datetime
    declare @UNAPPLIEDMATCHINGGIFTSPLITS xml
    declare @CREATEDSPLITS xml 
    declare @OVERPAYMENTAPPLICATIONTYPECODE tinyint 
    declare @APPLICATIONTYPE tinyint
    declare @AMOUNTPAID money 
    declare @ADJUSTMENTID uniqueidentifier
    declare @ADJ_POSTSTATUS tinyint
    declare @ADJUSTED bit

    -- Save the IDs for any payments that need to be updated. --

    declare @TempRevenue table (
      REVENUEID uniqueidentifier,
      RSPLITID uniqueidentifier,
      DEPOSITID uniqueidentifier,
      REVENUEAMOUNT money,
      REVENUEDATE datetime,
      POSTED bit,
      DONOTPOST bit,
      ADJUSTED bit,
      SEQUENCE int,
      OVERPAYMENTAPPLICATIONTYPECODE tinyint);

    insert into @TempRevenue 
    Select t3.REVENUEID, t3.ID, 
     (select DEPOSITID from BANKACCOUNTDEPOSITPAYMENT where ID = t3.REVENUEID),
      t3.AMOUNT, t4.DATE as REVENUEDATE, 
      dbo.UFN_REVENUE_ISPOSTED(t3.REVENUEID) as POSTED, t4.DONOTPOST, 
     (select Count(ID) from ADJUSTMENT s1 where s1.REVENUEID = t3.REVENUEID and POSTSTATUSCODE = 1 ) ADJUSTED,
      t0.SEQUENCE, t2.OVERPAYMENTAPPLICATIONTYPECODE
        from INSTALLMENT as t0
        inner join INSTALLMENTSPLIT as t1 on t0.ID = t1.INSTALLMENTID 
        inner join INSTALLMENTSPLITPAYMENT as t2 on t2.INSTALLMENTSPLITID = t1.ID 
        inner join REVENUESPLIT as t3 on t2.PAYMENTID = t3.ID 
        inner join REVENUE as t4 on t3.REVENUEID=t4.ID 
        left outer join @TempTbl as t5 on t1.ID = t5.SPLITID 
        where t0.REVENUEID = @PLEDGEID 
        and (t1.Amount <> IsNull(t5.SPLITAMOUNT,0) or t1.DESIGNATIONID <> IsNull(t5.SPLITDESIGNATIONID, '00000000-0000-0000-0000-000000000000'))

    -- Create adjustments for Posted Payments.

    declare POSTEDCURSOR cursor local fast_forward for
        Select distinct REVENUEID, ADJUSTED from @TempRevenue where POSTED = 1

    open POSTEDCURSOR;
    fetch next from POSTEDCURSOR into @REVENUEID, @ADJUSTED;
    while (@@FETCH_STATUS=0)
    begin
        set @ADJUSTMENTID = null
        set @ADJ_POSTSTATUS = 1 --< Revisit do we need to let User set this?


        -- Do not add a new adjustment if an unposted adjustment exists. ?

        IF @ADJUSTED = 0
            exec dbo.USP_SAVE_ADJUSTMENT  @REVENUEID, @ADJUSTMENTID output, @CHANGEAGENTID, @CURRENTDATE, @ADJPAYMENT_DATE
                    @ADJPAYMENT_POSTDATE, @ADJPAYMENT_DETAILS, default, @ADJPAYMENT_REASONCODEID,  @ADJ_POSTSTATUS;

        fetch next from POSTEDCURSOR into @REVENUEID, @ADJUSTED;
    end
    close POSTEDCURSOR;
    deallocate POSTEDCURSOR;

    -- Delete the Revenue Split records and distributions.

    Delete from REVENUESPLIT 
    where ID in (Select RSPLITID from @TempRevenue)

    -- Delete the Distributions for any Un-posted Payments.

    Delete from GLTRANSACTION 
    where POSTSTATUSCODE <> 1 and ID In
        (Select GLTRANSACTIONID from REVENUEGLDISTRIBUTION 
         where OUTDATED=0 and REVENUEID in (Select REVENUEID from @TempRevenue)) 

    Delete from REVENUEGLDISTRIBUTION 
    where OUTDATED=0 and REVENUEID in (Select REVENUEID from @TempRevenue
    -- ****


    -- Update installments 

    update a
    set ID = b.ID
    from @TempTbl a
    inner join @TempSeqTbl b
        on a.SEQUENCE = b.SEQUENCE;

    set @INSTALLMENTS = (select distinct
            ID, DATE, AMOUNT, BALANCE, APPLIED, SEQUENCE
        from @TempTbl
        for xml raw('ITEM'),type,elements,root('INSTALLMENTS'),BINARY BASE64);

    set @INSTALLMENTSPLITS = (select distinct
            SPLITID ID, ID INSTALLMENTID, SPLITDESIGNATIONID DESIGNATIONID, SPLITAMOUNT AMOUNT, REVENUESPLITID
        from @TempTbl
        for xml raw('ITEM'),type,elements,root('INSTALLMENTSPLITS'),BINARY BASE64);

    exec dbo.USP_INSTALLMENT_GETINSTALLMENTS_UPDATEFROMXML @PLEDGEID, @INSTALLMENTS, @CHANGEAGENTID, @CURRENTDATE;

    exec dbo.USP_PLEDGE_GETINSTALLMENTSPLITS_UPDATEFROMXML @PLEDGEID, @INSTALLMENTSPLITS, @CHANGEAGENTID, @CURRENTDATE;


    -- More Work for PBI 40790

    select @CONSTITUENTID=CONSTITUENTID from REVENUE where ID = @PLEDGEID 
    set @APPLICATIONTYPE = 2

    declare REVENUECURSOR cursor local fast_forward for
        Select REVENUEID, DEPOSITID, SUM(REVENUEAMOUNT), REVENUEDATE, DONOTPOST, OVERPAYMENTAPPLICATIONTYPECODE from @TempRevenue
        group by REVENUEID, DEPOSITID, REVENUEDATE, DONOTPOST, OVERPAYMENTAPPLICATIONTYPECODE

    open REVENUECURSOR;
    fetch next from REVENUECURSOR into @REVENUEID, @DEPOSITID, @APPLIEDAMOUNT, @REVENUEDATE, @DONOTPOST, @OVERPAYMENTAPPLICATIONTYPECODE;
    while (@@FETCH_STATUS=0)
    begin
        set @CREATEDSPLITS = null
        set @AMOUNTPAID = null

        -- Re-Add the Payment Split.

        exec dbo.USP_PLEDGE_ADDPAYMENT @REVENUEID, @PLEDGEID, @APPLIEDAMOUNT, @CONSTITUENTID, @REVENUEDATE, @UNAPPLIEDMATCHINGGIFTSPLITS, @APPLICATIONTYPE, @AMOUNTPAID output, @CURRENTDATE, @CHANGEAGENTID, @CREATEDSPLITS output, @OVERPAYMENTAPPLICATIONTYPECODE 

        if @DONOTPOST = 0
        begin
            -- Update the Distribution.

            exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @REVENUEID, @CHANGEAGENTID, @CURRENTDATE

            -- Update the distribution with the deposit info.

            if @DEPOSITID is not null  
                exec dbo.USP_BANKACCOUNTDEPOSIT_OVERWRITEPAYMENTDEBITACCOUNTS @REVENUEID, @DEPOSITID, @CHANGEAGENTID, @CURRENTDATE;
        end

        fetch next from REVENUECURSOR into @REVENUEID, @DEPOSITID, @APPLIEDAMOUNT, @REVENUEDATE, @DONOTPOST, @OVERPAYMENTAPPLICATIONTYPECODE;
    end
    close REVENUECURSOR;
    deallocate REVENUECURSOR;

end