USP_FINANCIALTRANSACTION_APPLIACTION_CREATE_1099DISTRIBUTION

Creates a 1099 distribution for the financial transaction application.

Parameters

Parameter Parameter Type Mode Description
@DISBURSEMENTPROCESSID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_FINANCIALTRANSACTION_APPLIACTION_CREATE_1099DISTRIBUTION(
    @DISBURSEMENTPROCESSID uniqueidentifier
    ,@CHANGEAGENTID uniqueidentifier
)
as
    set nocount on

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

  declare @CURRENTDATE datetime
  set @CURRENTDATE = getdate() 

  declare @FTD table(
    ID uniqueidentifier
    ,AMOUNT money
    ,BOXNUMBER1099ID uniqueidentifier
    ,STATEID uniqueidentifier
    ,FINANCIALTRANSACTIONID uniqueidentifier
    ,TYPECODE int
  )

  insert into @FTD
  select RESULTS.FTAID, RESULTS.AMOUNT, FTD.BOXNUMBER1099ID, FTD.STATEID, FTD.FINANCIALTRANSACTIONID, RESULTS.TYPECODE
  from (
      select FTD.ID, FTA.ID [FTAID], FT.TYPECODE
    ,CASE WHEN FT.TYPECODE = 101 THEN 1 ELSE -1 END * ROUND((FTD.AMOUNT * SUM(FTA.AMOUNT) / FT.TRANSACTIONAMOUNT), 2) [AMOUNT]
      from dbo.FINANCIALTRANSACTION1099DISTRIBUTION FTD
      inner join dbo.FINANCIALTRANSACTION FT on FT.ID = FTD.FINANCIALTRANSACTIONID
      inner join dbo.FINANCIALTRANSACTIONSCHEDULE FTS on FTS.FINANCIALTRANSACTIONID = FT.ID and FTS.DELETED = 0
      inner join dbo.FINANCIALTRANSACTIONAPPLICATION FTA on FTA.FINANCIALTRANSACTIONSCHEDULEID = FTS.ID
      inner join dbo.BANKACCOUNTTRANSACTION_EXT BATEXT on BATEXT.ID = FTA.FINANCIALTRANSACTIONID
      where BATEXT.DISBURSEMENTPROCESSID = @DISBURSEMENTPROCESSID and FTA.STATUSCODE = 1
      group by FTA.ID, FTD.ID, FTD.AMOUNT, FT.TRANSACTIONAMOUNT, FT.TYPECODE) RESULTS
  inner join dbo.FINANCIALTRANSACTION1099DISTRIBUTION FTD on FTD.ID = RESULTS.ID

    insert into dbo.FINANCIALTRANSACTIONAPPLICATION1099DISTRIBUTION
    (
        ID
        ,FINANCIALTRANSACTIONAPPLICATIONID
        ,BOXNUMBER1099ID
        ,STATEID
        ,AMOUNT
        ,SEQUENCE
        ,DATEADDED
        ,DATECHANGED
        ,CHANGEDBYID
        ,ADDEDBYID
    )
    SELECT
        NEWID()
        ,FTA.ID
        ,FTD.BOXNUMBER1099ID
        ,FTD.STATEID
        ,ROUND(FTD.AMOUNT, 2)
        ,ROW_NUMBER() over (partition by FTD.BOXNUMBER1099ID, FTD.STATEID, FTA.FINANCIALTRANSACTIONID order by FTA.ID)
        ,@CURRENTDATE
        ,@CURRENTDATE
        ,@CHANGEAGENTID
        ,@CHANGEAGENTID
    FROM dbo.BANKACCOUNTTRANSACTION_EXT BATE
    inner join dbo.FINANCIALTRANSACTIONAPPLICATION FTA on BATE.ID = FTA.FINANCIALTRANSACTIONID
    inner join @FTD FTD on FTD.ID = FTA.ID
    where BATE.DISBURSEMENTPROCESSID = @DISBURSEMENTPROCESSID and FTA.STATUSCODE = 1 and ((FTD.TYPECODE = 101 and FTD.AMOUNT > 0) or (FTD.TYPECODE = 102))

    declare @DIFFERENCE table 
    (
        FINANCIALTRANSACTIONID uniqueidentifier
        ,DIFF money
        ,BOXNUMBER1099ID uniqueidentifier
        ,STATEID uniqueidentifier
    );

    --Get the amount that the 1099 distribution needs to be adjusted by for each disbursement based on box number and state

    insert into @DIFFERENCE
    (
        FINANCIALTRANSACTIONID
        ,DIFF
        ,BOXNUMBER1099ID
        ,STATEID
    )
    select FTS.FINANCIALTRANSACTIONID, ISNULL(DISTRIBUTION.AMOUNT, 0) - CASE WHEN DISTRIBUTION.TYPECODE = 101 THEN 1 ELSE -1 END * SUM(FTAD.AMOUNT) DIFF, DISTRIBUTION.BOXNUMBER1099ID, DISTRIBUTION.STATEID
    from dbo.FINANCIALTRANSACTIONAPPLICATION1099DISTRIBUTION FTAD
    inner join dbo.FINANCIALTRANSACTIONAPPLICATION FTA on FTA.ID = FTAD.FINANCIALTRANSACTIONAPPLICATIONID
    inner join dbo.FINANCIALTRANSACTIONSCHEDULE FTS on FTA.FINANCIALTRANSACTIONSCHEDULEID = FTS.ID and FTS.DELETED = 0
    inner join (select FT.ID, DISTRIBUTIONAMOUNT.AMOUNT, DISTRIBUTIONAMOUNT.BOXNUMBER1099ID, DISTRIBUTIONAMOUNT.STATEID, FT.TYPECODE
    from dbo.FINANCIALTRANSACTION FT
    inner join (select FT.ID, CASE WHEN FT.TYPECODE = 101 THEN 1 ELSE -1 END * SUM(FTD.AMOUNT) [AMOUNT], FTD.BOXNUMBER1099ID, FTD.STATEID
        from dbo.FINANCIALTRANSACTION FT
        inner join dbo.FINANCIALTRANSACTION1099DISTRIBUTION FTD on FT.ID = FTD.FINANCIALTRANSACTIONID
        left outer join dbo.INVOICE I on I.ID = FT.ID
        left outer join dbo.CREDITMEMO CM on CM.ID = FT.ID
        where ISNULL(I.DISBURSEMENTPROCESSID, CM.DISBURSEMENTPROCESSID) = @DISBURSEMENTPROCESSID 
        group by FT.ID, FTD.BOXNUMBER1099ID, FTD.STATEID, FT.TYPECODE
            ) DISTRIBUTIONAMOUNT on DISTRIBUTIONAMOUNT.ID = FT.ID
    inner join (select FT.ID
        from dbo.FINANCIALTRANSACTIONAPPLICATION FTA
        inner join dbo.FINANCIALTRANSACTIONSCHEDULE FTS on FTA.FINANCIALTRANSACTIONSCHEDULEID = FTS.ID and FTS.DELETED = 0
        inner join dbo.FINANCIALTRANSACTION FT on FT.ID = FTS.FINANCIALTRANSACTIONID
        left outer join dbo.INVOICE I on I.ID = FT.ID
        left outer join dbo.CREDITMEMO CM on CM.ID = FT.ID
        where ISNULL(I.DISBURSEMENTPROCESSID, CM.DISBURSEMENTPROCESSID) = @DISBURSEMENTPROCESSID and FTA.STATUSCODE = 1
        group by FT.ID, FT.TRANSACTIONAMOUNT
        having (SUM(FTA.AMOUNT) = FT.TRANSACTIONAMOUNT)
            ) APPLICATIONS on APPLICATIONS.ID = FT.ID
    ) DISTRIBUTION on DISTRIBUTION.ID = FTS.FINANCIALTRANSACTIONID and FTAD.BOXNUMBER1099ID = DISTRIBUTION.BOXNUMBER1099ID and (FTAD.STATEID = DISTRIBUTION.STATEID or (FTAD.STATEID is null and DISTRIBUTION.STATEID is null))
    group by FTS.FINANCIALTRANSACTIONID, DISTRIBUTION.AMOUNT, DISTRIBUTION.BOXNUMBER1099ID, DISTRIBUTION.STATEID, DISTRIBUTION.TYPECODE
    HAVING SUM(FTAD.AMOUNT) != DISTRIBUTION.AMOUNT

    update dbo.FINANCIALTRANSACTIONAPPLICATION1099DISTRIBUTION
    set AMOUNT = FTAD.AMOUNT + isnull(DIFFERENCE.DIFF, 0)
    from FINANCIALTRANSACTIONAPPLICATION1099DISTRIBUTION FTAD
    inner join dbo.FINANCIALTRANSACTIONAPPLICATION FTA on FTA.ID = FTAD.FINANCIALTRANSACTIONAPPLICATIONID
    inner join dbo.BANKACCOUNTTRANSACTION_EXT BATE on FTA.FINANCIALTRANSACTIONID = BATE.ID
    inner join dbo.FINANCIALTRANSACTIONSCHEDULE FTS on FTS.ID = FTA.FINANCIALTRANSACTIONSCHEDULEID and FTS.DELETED = 0
    inner join @DIFFERENCE DIFFERENCE on DIFFERENCE.FINANCIALTRANSACTIONID = FTS.FINANCIALTRANSACTIONID and DIFFERENCE.BOXNUMBER1099ID = FTAD.BOXNUMBER1099ID and (DIFFERENCE.STATEID = FTAD.STATEID or (DIFFERENCE.STATEID is null and FTAD.STATEID is null))
    where FTAD.SEQUENCE = 1 and BATE.DISBURSEMENTPROCESSID = @DISBURSEMENTPROCESSID and (FTAD.AMOUNT + isnull(DIFFERENCE.DIFF, 0)) > 0

    delete from dbo.FINANCIALTRANSACTIONAPPLICATION1099DISTRIBUTION
    where ID in (
        select FTAD.ID
        from dbo.FINANCIALTRANSACTIONAPPLICATION1099DISTRIBUTION FTAD
        inner join dbo.FINANCIALTRANSACTIONAPPLICATION FTA on FTA.ID = FTAD.FINANCIALTRANSACTIONAPPLICATIONID
        inner join dbo.BANKACCOUNTTRANSACTION_EXT BATE on FTA.FINANCIALTRANSACTIONID = BATE.ID
        inner join dbo.FINANCIALTRANSACTIONSCHEDULE FTS on FTS.ID = FTA.FINANCIALTRANSACTIONSCHEDULEID and FTS.DELETED = 0
        inner join @DIFFERENCE DIFFERENCE on DIFFERENCE.FINANCIALTRANSACTIONID = FTS.FINANCIALTRANSACTIONID and DIFFERENCE.BOXNUMBER1099ID = FTAD.BOXNUMBER1099ID and (DIFFERENCE.STATEID = FTAD.STATEID or (DIFFERENCE.STATEID is null and FTAD.STATEID is null))
        where FTAD.SEQUENCE = 1 and BATE.DISBURSEMENTPROCESSID = @DISBURSEMENTPROCESSID and (FTAD.AMOUNT + isnull(DIFFERENCE.DIFF, 0)) <= 0)