USP_DATAFORMTEMPLATE_EDIT_PLEDGEWRITEOFFBATCHROWCOMMIT

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@BATCHROWID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@WRITEOFFTOTALAMOUNT money IN
@DATE datetime IN
@POSTSTATUSCODE tinyint IN
@POSTDATE datetime IN
@REASONCODEID uniqueidentifier IN
@REASON nvarchar(300) IN
@INSTALLMENTS xml IN
@RECOGNITIONCREDITS xml IN
@RECOGNITIONCREDITADJUSTMENTCODE tinyint IN
@PLEDGEAMOUNTMINUSWRITEOFFS money IN

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_PLEDGEWRITEOFFBATCHROWCOMMIT (
    @ID uniqueidentifier
    ,@BATCHROWID uniqueidentifier
    ,@CHANGEAGENTID uniqueidentifier
    ,@WRITEOFFTOTALAMOUNT money
    ,@DATE datetime
    ,@POSTSTATUSCODE tinyint
    ,@POSTDATE datetime
    ,@REASONCODEID uniqueidentifier
    ,@REASON nvarchar(300)
    ,@INSTALLMENTS xml
    ,@RECOGNITIONCREDITS xml
    ,@RECOGNITIONCREDITADJUSTMENTCODE tinyint
    ,@PLEDGEAMOUNTMINUSWRITEOFFS money
    )
as
set nocount on;

declare @REVENUEID uniqueidentifier = @ID;
declare @WRITEOFFID uniqueidentifier = NewID ();

declare @CONSTITUENTSECURITY bit = (select CONSTITUENTSECURITY from dbo.REVENUEBATCHCONSTITUENTSECURITY); 
if @CONSTITUENTSECURITY = 1
begin
  declare @BATCHOWNERID uniqueidentifier;
  declare @CONSTITUENTID uniqueidentifier;
  select 
    @BATCHOWNERID = BATCH.APPUSERID, @CONSTITUENTID=C.CONSTITUENTID 
  from 
    dbo.BATCH
    inner join dbo.BATCHPLEDGEWRITEOFF on BATCH.ID = BATCHPLEDGEWRITEOFF.BATCHID
    inner join dbo.FINANCIALTRANSACTION C on BATCHPLEDGEWRITEOFF.REVENUEID=C.ID    
  where 
    BATCHPLEDGEWRITEOFF.ID = @BATCHROWID;

  if dbo.UFN_CONSTITUENT_CANAPPUSERMODIFY(@CONSTITUENTID, @BATCHOWNERID) = 0
    begin
      raiserror('BBERR_CONSTITUENTSECURITY',13,1);
    end
end

-- we have to reformat the installments to remove the batchinstallment.ID field and replace it with the installmentid

if @INSTALLMENTS IS NOT NULL
    set @INSTALLMENTS = (
            select INSTALLMENTID as ID
                ,date
                ,TRANSACTIONAMOUNT as AMOUNT
                ,BALANCE
                ,WRITEOFFAMOUNT
                ,SEQUENCE
                ,TRANSACTIONCURRENCYID
            from dbo.UFN_PLEDGEWRITEOFFBATCH_GETINSTALLMENTS_FROMITEMLISTXML(@INSTALLMENTS
            for xml raw('ITEM')
                ,type
                ,elements
                ,root('INSTALLMENTS')
                ,binary BASE64
            );

set @RECOGNITIONCREDITADJUSTMENTCODE = COALESCE(@RECOGNITIONCREDITADJUSTMENTCODE, 3);

-- RECOGNITIONCREDITADJUSTMENTCODES.ReduceRecognitionCreditsByProportionalAmount

if (@RECOGNITIONCREDITADJUSTMENTCODE = 0)
begin
    set @RECOGNITIONCREDITS = (
            select REVENUERECOGNITION.ID
                ,FINANCIALTRANSACTIONLINEITEM.ID as REVENUESPLITID
                ,dbo.UFN_DESIGNATION_BUILDNAME(REVENUESPLIT_EXT.DESIGNATIONID) as DESIGNATIONNAME
                ,CONSTITUENT.name as CONSTITUENTNAME
                ,REVENUERECOGNITIONTYPECODE.DESCRIPTION as RECOGNITIONCREDITTYPE
                ,REVENUERECOGNITION.EFFECTIVEDATE
                ,REVENUERECOGNITION.AMOUNT as ORIGINALAMOUNT
                ,(REVENUERECOGNITION.AMOUNT * (@PLEDGEAMOUNTMINUSWRITEOFFS - @WRITEOFFTOTALAMOUNT)) / @PLEDGEAMOUNTMINUSWRITEOFFS as ADJUSTEDAMOUNT
                ,REVENUERECOGNITION.BASECURRENCYID
            from dbo.FINANCIALTRANSACTION
            inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
            inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
            inner join dbo.REVENUERECOGNITION on FINANCIALTRANSACTIONLINEITEM.ID = REVENUERECOGNITION.REVENUESPLITID
            inner join dbo.CONSTITUENT on REVENUERECOGNITION.CONSTITUENTID = CONSTITUENT.ID
            left join dbo.REVENUERECOGNITIONTYPECODE on REVENUERECOGNITION.REVENUERECOGNITIONTYPECODEID = REVENUERECOGNITIONTYPECODE.ID
            where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @REVENUEID
                and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1
            order by DESIGNATIONNAME
                ,REVENUESPLITID
            for xml raw('ITEM')
                ,type
                ,elements
                ,root('RECOGNITIONCREDITS')
                ,binary BASE64
            );
end

-- RECOGNITIONCREDITADJUSTMENTCODES.ReduceRecognitionCreditsByWriteOffAmount 

if (@RECOGNITIONCREDITADJUSTMENTCODE = 1)
begin
    declare @PRORATEDAMOUNTS table (
        ID uniqueidentifier
        ,AMOUNT money
        )
    -- adjust splits for new amount

    declare @CURRENTAMOUNT decimal(30, 5);
    declare @WEIGHT decimal(30, 10);
    declare @tempID uniqueidentifier;
    declare @ORIGINALAMOUNT decimal(30, 5);

  SELECT @ORIGINALAMOUNT=COALESCE(TRANSACTIONAMOUNT,0) FROM dbo.FINANCIALTRANSACTION WHERE ID=@REVENUEID;

    declare @NEWAMOUNT decimal(30, 5) = COALESCE (
        @WRITEOFFTOTALAMOUNT
        ,0
        );

    -- Load return table with current amounts to prorate

    insert into @PRORATEDAMOUNTS (
        AMOUNT
        ,ID
        )
    select FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT [AMOUNT]
          ,FINANCIALTRANSACTIONLINEITEM.ID
                from dbo.FINANCIALTRANSACTIONLINEITEM
                inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
                inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
                where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @REVENUEID
                    and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                    and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1;

    -- Loop through and calculate new split amounts

    declare AMOUNTSTOPRORATECURSOR cursor local fast_forward
    for
    select ID
        ,AMOUNT
    from @PRORATEDAMOUNTS;

    open AMOUNTSTOPRORATECURSOR;

    fetch next
    from AMOUNTSTOPRORATECURSOR
    into @tempID
        ,@WEIGHT;

    while @@FETCH_STATUS = 0
    begin
        if @ORIGINALAMOUNT <> 0
            set @CURRENTAMOUNT = (@WEIGHT / @ORIGINALAMOUNT) * @NEWAMOUNT;
        else
            set @CURRENTAMOUNT = 0;

        update @PRORATEDAMOUNTS
        set AMOUNT = @CURRENTAMOUNT
        where ID = @tempID;

        set @NEWAMOUNT = @NEWAMOUNT + @CURRENTAMOUNT;
        set @ORIGINALAMOUNT = @ORIGINALAMOUNT + @WEIGHT;

        fetch next
        from AMOUNTSTOPRORATECURSOR
        into @tempID
            ,@WEIGHT;
    end

    close AMOUNTSTOPRORATECURSOR;

    deallocate AMOUNTSTOPRORATECURSOR;

    set @RECOGNITIONCREDITS = (
            select REVENUERECOGNITION.ID
                ,FINANCIALTRANSACTIONLINEITEM.ID as REVENUESPLITID
                ,dbo.UFN_DESIGNATION_BUILDNAME(REVENUESPLIT_EXT.DESIGNATIONID) as DESIGNATIONNAME
                ,CONSTITUENT.name as CONSTITUENTNAME
                ,REVENUERECOGNITIONTYPECODE.DESCRIPTION as RECOGNITIONCREDITTYPE
                ,REVENUERECOGNITION.EFFECTIVEDATE
                ,REVENUERECOGNITION.AMOUNT as ORIGINALAMOUNT
                ,case when REVENUERECOGNITION.AMOUNT > COALESCE(P.AMOUNT, 0) then REVENUERECOGNITION.AMOUNT - COALESCE(P.AMOUNT, 0) else 0 end as ADJUSTEDAMOUNT
                ,REVENUERECOGNITION.BASECURRENCYID
            from dbo.FINANCIALTRANSACTION
            inner join dbo.REVENUE_EXT on FINANCIALTRANSACTION.ID = REVENUE_EXT.ID
            inner join dbo.FINANCIALTRANSACTIONLINEITEM on FINANCIALTRANSACTION.ID = FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID
            inner join dbo.REVENUESPLIT_EXT on FINANCIALTRANSACTIONLINEITEM.ID = REVENUESPLIT_EXT.ID
            inner join dbo.REVENUERECOGNITION on FINANCIALTRANSACTIONLINEITEM.ID = REVENUERECOGNITION.REVENUESPLITID
            inner join dbo.CONSTITUENT on REVENUERECOGNITION.CONSTITUENTID = CONSTITUENT.ID
            left join dbo.REVENUERECOGNITIONTYPECODE on REVENUERECOGNITION.REVENUERECOGNITIONTYPECODEID = REVENUERECOGNITIONTYPECODE.ID
            left join @PRORATEDAMOUNTS P on FINANCIALTRANSACTIONLINEITEM.ID = P.ID
            where FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @REVENUEID
                and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
                and FINANCIALTRANSACTIONLINEITEM.TYPECODE <> 1
            order by DESIGNATIONNAME
                ,REVENUESPLITID
            for xml raw('ITEM')
                ,type
                ,elements
                ,root('RECOGNITIONCREDITS')
                ,binary BASE64
            );
end

begin try
  declare @BATCHID uniqueidentifier;
  select @BATCHID = BATCHID
  from dbo.BATCHPLEDGEWRITEOFF
  where ID = @BATCHROWID;

    exec dbo.USP_DATAFORMTEMPLATE_ADD_PLEDGEWRITEOFF_3 @ID = @WRITEOFFID
        ,@CHANGEAGENTID = @CHANGEAGENTID
        ,@REVENUEID = @REVENUEID
        ,@DATE = @DATE
        ,@WRITEOFFTOTALAMOUNT = @WRITEOFFTOTALAMOUNT
        ,@POSTSTATUSCODE = @POSTSTATUSCODE
        ,@POSTDATE = @POSTDATE
        ,@REASON = @REASON
        ,@INSTALLMENTS = @INSTALLMENTS
        ,@REASONCODEID = @REASONCODEID
        ,@RECOGNITIONCREDITS = @RECOGNITIONCREDITS
    ,@BATCHID = @BATCHID
    ;

    --the following is not necessary for the actual commit, it is just housekeeping to make the committed batch look like it did when the user committed (otherwise, it will be too up-to-date)

    -- RECOGNITIONCREDITADJUSTMENTCODES.DoNotAdjust

    if (@RECOGNITIONCREDITADJUSTMENTCODE <> 3)
    begin
        declare @CURRENTDATE datetime = getdate();
      delete from dbo.BATCHPLEDGEWRITEOFFRECOGNITIONCREDITS where BATCHPLEDGEWRITEOFFID=@BATCHROWID;
      insert into dbo.BATCHPLEDGEWRITEOFFRECOGNITIONCREDITS (BATCHPLEDGEWRITEOFFID, REVENUESPLITID, AMOUNT, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED) select @BATCHROWID, REVENUESPLITID, ADJUSTEDAMOUNT, @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE from dbo.UFN_PLEDGEWRITEOFFBATCH_GETRECOGNITIONCREDITS_FROMITEMLISTXML(@RECOGNITIONCREDITS);    
    end

end try

begin catch
    exec.dbo.USP_RAISE_ERROR;

    return 1;
end catch

return 0;