USP_FINANCIALTRANSACTION_LINEITEMAPPLICATIONS_APPLYMULTIPLE

Creates an one or more applications between two line items.

Parameters

Parameter Parameter Type Mode Description
@APPLICATIONS xml IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


            CREATE procedure dbo.USP_FINANCIALTRANSACTION_LINEITEMAPPLICATIONS_APPLYMULTIPLE
                (
                    @APPLICATIONS xml,
                    @CHANGEAGENTID uniqueidentifier = null
                )
            as
            begin
                set nocount on;

                /*
                 *
                 * NOTE: Rules about transaction types and subledger specific details should be handled in a subledger
                 *          application sproc that calls this sproc.
                 *
                 */

                begin try
                    -- Get a table with the new applications in it.

                    declare @APPLICATIONSTABLE table
                    (
                        ID uniqueidentifier NOT NULL,
                        SOURCELINEITEMID uniqueidentifier NOT NULL,
                        TARGETLINEITEMID uniqueidentifier NOT NULL,
                        AMOUNT money NOT NULL,
                        POSTDATE datetime NULL,
                        POSTSTATUSCODE tinyint NOT NULL
                    )

                    insert into @APPLICATIONSTABLE
                        (ID,
                        SOURCELINEITEMID,
                        TARGETLINEITEMID,
                        AMOUNT,
                        POSTDATE,
                        POSTSTATUSCODE)
                    select isnull(ID, newid()),
                            SOURCELINEITEMID,
                            TARGETLINEITEMID,
                            AMOUNT,
                            POSTDATE,
                            POSTSTATUSCODE
                    from dbo.UFN_FINANCIALTRANSACTION_LINEITEMAPPLICATIONS_FROMITEMLISTXML(@APPLICATIONS);


                    -- Check basic application rules


                    -- Do not allow zero dollar or negative applications

                    if (exists (select APPLICATIONSTABLE.ID 
                                from @APPLICATIONSTABLE as APPLICATIONSTABLE
                                where APPLICATIONSTABLE.AMOUNT <= 0))
                        raiserror('ERR_LINEITEMAPPLICATION_AMOUNTMUSTBEGREATERTHANZERO', 13,1);

                    -- Cannot apply from a deleted source line item or a source line item that is not a standard line item

                    if (exists (select FINANCIALTRANSACTIONLINEITEM.ID
                                from dbo.FINANCIALTRANSACTIONLINEITEM
                                    inner join @APPLICATIONSTABLE as APPLICATIONSTABLE
                                        on APPLICATIONSTABLE.SOURCELINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
                                where (not FINANCIALTRANSACTIONLINEITEM.DELETEDON is null) or
                                         (FINANCIALTRANSACTIONLINEITEM.TYPECODE != 0)))
                        raiserror('ERR_LINEITEMAPPLICATION_SOURCELINEITEMDELETEDORNOTSTANDARD', 13,1);

                    -- Cannot apply to a deleted line item or a line item that is not a standard line item

                    if (exists (select FINANCIALTRANSACTIONLINEITEM.ID
                                from dbo.FINANCIALTRANSACTIONLINEITEM
                                    inner join @APPLICATIONSTABLE as APPLICATIONSTABLE
                                        on APPLICATIONSTABLE.TARGETLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
                                where (not FINANCIALTRANSACTIONLINEITEM.DELETEDON is null) or
                                         (FINANCIALTRANSACTIONLINEITEM.TYPECODE != 0)))
                         raiserror('ERR_LINEITEMAPPLICATION_TARGETLINEITEMDELETEDORNOTSTANDARD', 13,1);

                    -- Amount applied cannot exceed amount left to apply for source line item.

                    if (exists
                        (select FINANCIALTRANSACTIONLINEITEM.ID        
                         from dbo.FINANCIALTRANSACTIONLINEITEM
                            inner join (select APPLICATIONSTABLE_INNER1.SOURCELINEITEMID,
                                               APPLICATIONSTABLE_INNER1.AMOUNT
                                         from @APPLICATIONSTABLE as APPLICATIONSTABLE_INNER1

                                         union

                                         select EXISTINGAPPLICATIONLINEITEM.SOURCELINEITEMID,
                                                EXISTINGAPPLICATIONLINEITEM.TRANSACTIONAMOUNT
                                         from dbo.FINANCIALTRANSACTIONLINEITEM as EXISTINGAPPLICATIONLINEITEM
                                            left outer join @APPLICATIONSTABLE as APPLICATIONSTABLE_INNER2
                                                on APPLICATIONSTABLE_INNER2.ID = EXISTINGAPPLICATIONLINEITEM.ID
                                         where (APPLICATIONSTABLE_INNER2.ID is null) and 
                                                (EXISTINGAPPLICATIONLINEITEM.TYPECODE = 2) and
                                                (EXISTINGAPPLICATIONLINEITEM.DELETEDON is null) and
                                                (EXISTINGAPPLICATIONLINEITEM.SOURCELINEITEMID in (select SOURCELINEITEMID from @APPLICATIONSTABLE))) as FINANCIALTRANSACTIONLINEITEM_APPLICATIONAMOUNTS
                                on FINANCIALTRANSACTIONLINEITEM.ID =FINANCIALTRANSACTIONLINEITEM_APPLICATIONAMOUNTS.SOURCELINEITEMID
                         group by FINANCIALTRANSACTIONLINEITEM.ID, 
                                    FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT
                         having  FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT < sum(isnull(FINANCIALTRANSACTIONLINEITEM_APPLICATIONAMOUNTS.AMOUNT, 0))))
                         raiserror('ERR_LINEITEMAPPLICATION_AMOUNTEXCEEDSAMOUNTLEFTTOAPPLY', 13,1);

                    -- Amount applied cannot exceed amount left to be applied to for target line item.

                    if (exists
                        (select FINANCIALTRANSACTIONLINEITEM.ID        
                          from dbo.FINANCIALTRANSACTIONLINEITEM
                            inner join (select APPLICATIONSTABLE_INNER1.TARGETLINEITEMID,
                                                APPLICATIONSTABLE_INNER1.AMOUNT
                                         from @APPLICATIONSTABLE as APPLICATIONSTABLE_INNER1

                                         union

                                         select EXISTINGAPPLICATIONLINEITEM.TARGETLINEITEMID,
                                                EXISTINGAPPLICATIONLINEITEM.TRANSACTIONAMOUNT
                                         from dbo.FINANCIALTRANSACTIONLINEITEM as EXISTINGAPPLICATIONLINEITEM
                                            left outer join @APPLICATIONSTABLE as APPLICATIONSTABLE_INNER2
                                                on APPLICATIONSTABLE_INNER2.ID = EXISTINGAPPLICATIONLINEITEM.ID
                                         where (APPLICATIONSTABLE_INNER2.ID is null) and
                                                (EXISTINGAPPLICATIONLINEITEM.TYPECODE = 2) and
                                                (EXISTINGAPPLICATIONLINEITEM.DELETEDON is null) and
                                                (EXISTINGAPPLICATIONLINEITEM.TARGETLINEITEMID in (select TARGETLINEITEMID from @APPLICATIONSTABLE))) as FINANCIALTRANSACTIONLINEITEM_APPLICATIONAMOUNTS
                                on FINANCIALTRANSACTIONLINEITEM.ID =FINANCIALTRANSACTIONLINEITEM_APPLICATIONAMOUNTS.TARGETLINEITEMID
                         group by FINANCIALTRANSACTIONLINEITEM.ID, 
                                     FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT
                         having  FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT < sum(isnull(FINANCIALTRANSACTIONLINEITEM_APPLICATIONAMOUNTS.AMOUNT, 0))))
                         raiserror('ERR_LINEITEMAPPLICATION_AMOUNTEXCEEDSAMOUNTLEFTTOAPPLYTO', 13,1);

                    -- Get the change agent

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

                    -- Get the current date

                    declare @CURRENTDATE datetime;
                    set @CURRENTDATE = getdate();

                    -- Actually add the application


                    -- Update the existing line item applications

                    update dbo.FINANCIALTRANSACTIONLINEITEM
                    set 
                        SOURCELINEITEMID = APPLICATIONSTABLE.SOURCELINEITEMID,
                        TARGETLINEITEMID = APPLICATIONSTABLE.TARGETLINEITEMID,
                        TRANSACTIONAMOUNT = APPLICATIONSTABLE.AMOUNT,
                        BASEAMOUNT = APPLICATIONSTABLE.AMOUNT,
                        ORGAMOUNT = APPLICATIONSTABLE.AMOUNT,
                        POSTDATE = APPLICATIONSTABLE.POSTDATE,
                        POSTSTATUSCODE = APPLICATIONSTABLE.POSTSTATUSCODE,
                        DATECHANGED = @CURRENTDATE,
                        CHANGEDBYID = @CHANGEAGENTID
                    from @APPLICATIONSTABLE as APPLICATIONSTABLE
                    where (FINANCIALTRANSACTIONLINEITEM.ID = APPLICATIONSTABLE.ID) and 
                            ((APPLICATIONSTABLE.SOURCELINEITEMID != FINANCIALTRANSACTIONLINEITEM.SOURCELINEITEMID) or
                             (APPLICATIONSTABLE.TARGETLINEITEMID != FINANCIALTRANSACTIONLINEITEM.TARGETLINEITEMID) or
                             (APPLICATIONSTABLE.AMOUNT != FINANCIALTRANSACTIONLINEITEM.TRANSACTIONAMOUNT) or
                             (APPLICATIONSTABLE.POSTDATE != FINANCIALTRANSACTIONLINEITEM.POSTDATE) or 
                             (APPLICATIONSTABLE.POSTSTATUSCODE != FINANCIALTRANSACTIONLINEITEM.POSTSTATUSCODE))

                    -- Remove anything that already exists as a line item

                    delete from @APPLICATIONSTABLE
                    from @APPLICATIONSTABLE as APPLICATIONSTABLE
                        left outer join FINANCIALTRANSACTIONLINEITEM 
                            on FINANCIALTRANSACTIONLINEITEM.ID = APPLICATIONSTABLE.ID
                    where (not FINANCIALTRANSACTIONLINEITEM.ID is null);

                    -- Next the line item that is the application

                    insert into dbo.FINANCIALTRANSACTIONLINEITEM
                        (ID, 
                        FINANCIALTRANSACTIONID,
                        TRANSACTIONAMOUNT,
                        BASEAMOUNT,
                        ORGAMOUNT,
                        VISIBLE, 
                        TYPECODE, 
                        DELETEDON, 
                        POSTDATE,
                        POSTSTATUSCODE,
                        SOURCELINEITEMID, 
                        TARGETLINEITEMID, 
                        DATEADDED, 
                        ADDEDBYID, 
                        DATECHANGED, 
                        CHANGEDBYID)
                    select APPLICATIONSTABLE.ID,
                            FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID,
                            APPLICATIONSTABLE.AMOUNT,
                            APPLICATIONSTABLE.AMOUNT,
                            APPLICATIONSTABLE.AMOUNT,
                            1, -- VISIBLE

                            2, -- TYPECODE: Application

                            NULL, -- DELETEDON,

                            APPLICATIONSTABLE.POSTDATE,
                            APPLICATIONSTABLE.POSTSTATUSCODE,
                            APPLICATIONSTABLE.SOURCELINEITEMID,
                         APPLICATIONSTABLE.TARGETLINEITEMID,
                            @CURRENTDATE
                            @CHANGEAGENTID
                            @CURRENTDATE
                            @CHANGEAGENTID
                    from @APPLICATIONSTABLE as APPLICATIONSTABLE
                        inner join dbo.FINANCIALTRANSACTIONLINEITEM
                            on APPLICATIONSTABLE.SOURCELINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID

                    /*
                     *
                     * NOTE: Distributions should be handled here!
                     *
                     */

                end try

                begin catch
                    exec dbo.USP_RAISE_ERROR;
                    return 1;
                end catch

                return 0;
            end