USP_RECORDOPERATION_RESERVATIONKEEPOVERAGE

Parameters

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

Definition

Copy


CREATE procedure dbo.USP_RECORDOPERATION_RESERVATIONKEEPOVERAGE
(
    @ID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier
)
as
    set nocount on;

    declare @CURRENTDATE datetime = getdate();
    declare @SALESORDERSTATUSCODE tinyint;
    declare @SALESORDERTRANSACTIONID uniqueidentifier;
    declare @SALESORDERCONSTITUENTID uniqueidentifier;
    declare @SALESORDERTRANSACTIONDATE datetime;
    declare @SALESORDERPOSTSTATUSCODE tinyint;
    declare @RESERVATIONNAME nvarchar(100);

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

    select
        @SALESORDERSTATUSCODE = SALESORDER.STATUSCODE,
        @SALESORDERTRANSACTIONID = SALESORDER.REVENUEID,
        @SALESORDERCONSTITUENTID = SALESORDER.CONSTITUENTID,
        @SALESORDERTRANSACTIONDATE = SALESORDER.TRANSACTIONDATE,
        @SALESORDERPOSTSTATUSCODE = coalesce(FINANCIALTRANSACTION.POSTSTATUSCODE, 1),
        @RESERVATIONNAME = RESERVATION.NAME
    from
        dbo.SALESORDER
    inner join
        dbo.RESERVATION on RESERVATION.ID = SALESORDER.ID
    left join
        dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTION.ID = SALESORDER.REVENUEID
    where
        SALESORDER.ID = @ID;

    declare @LATESTADJUSTMENTRECORDID uniqueidentifier;

    select top 1
        @LATESTADJUSTMENTRECORDID = LI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
    from
        dbo.FINANCIALTRANSACTIONLINEITEM as LI
    inner join
        dbo.FINANCIALTRANSACTIONLINEITEMADJUSTMENT as LIADJUSTMENT on LIADJUSTMENT.ID = LI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID
    where
        LI.FINANCIALTRANSACTIONID = @SALESORDERTRANSACTIONID
        and LI.FINANCIALTRANSACTIONLINEITEMADJUSTMENTID is not null
        and LI.DELETEDON is null
        and LI.TYPECODE = 0  -- Standard

    order by
        LIADJUSTMENT.DATE desc;

    begin try
        if @SALESORDERSTATUSCODE is null begin
            raiserror('BBERR_RESERVATIONKEEPOVERAGE_RESERVATIONNOTFOUND', 13, 1);
        end

        if @SALESORDERSTATUSCODE <> 1 begin  -- Complete

            raiserror('BBERR_RESERVATIONKEEPOVERAGE_RESERVATIONNOTCOMPLETED', 13, 1);
        end

        declare @OVERAGEPAYMENTS table (
            ID uniqueidentifier,
            OVERAGEAMOUNT money,
            NEWOVERAGEKEPTLINEITEMID uniqueidentifier,
            NEWJOURNALENTRYID uniqueidentifier
        );

        insert into @OVERAGEPAYMENTS (
            ID,
            OVERAGEAMOUNT,
            NEWOVERAGEKEPTLINEITEMID,
            NEWJOURNALENTRYID
        )
        select
            SALESORDERPAYMENT.PAYMENTID,
            AMOUNTS.OVERAGE,
            newid(),
            newid()
        from
            dbo.SALESORDERPAYMENT
        outer apply
            dbo.UFN_PAYMENT_AMOUNTS(SALESORDERPAYMENT.PAYMENTID) as AMOUNTS
        where
            SALESORDERPAYMENT.SALESORDERID = @ID
            and AMOUNTS.OVERAGE > 0;

        if @@rowcount = 0 begin
            raiserror('BBERR_RESERVATIONKEEPOVERAGE_NOOVERAGEPAYMENTS', 13, 1);
        end

        declare @ALLOWGLDISTRIBUTIONS bit;
        select @ALLOWGLDISTRIBUTIONS = ALLOWGLDISTRIBUTIONS from dbo.UFN_PDACCOUNTSYSTEM_DEFAULTORSYSTEM();

        declare @POSTDATE date;
        declare @POSTSTATUSCODE tinyint = 3;  -- Do not post


        set @POSTDATE = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEFROMUTC(getutcdate());
        if @ALLOWGLDISTRIBUTIONS = 1 
        begin
            set @POSTSTATUSCODE = 1;  -- Not posted

        end

        declare @ORDEROVERAGELINEITEMID uniqueidentifier = newid();
        declare @TOTALOVERAGEAMOUNT money;

        select @TOTALOVERAGEAMOUNT = sum(OVERAGEAMOUNT)
        from @OVERAGEPAYMENTS;

        -- Financial Transactions aren't created for $0 orders so we will need to create one if one doesn't exist

        if @SALESORDERTRANSACTIONID is null begin
            set @SALESORDERTRANSACTIONID = newid();
            exec dbo.USP_SALESORDER_ADDREVENUE @ID, @SALESORDERTRANSACTIONID, @SALESORDERTRANSACTIONDATE, @SALESORDERCONSTITUENTID, @CHANGEAGENTID, @CURRENTDATE;
        end

        -- Add a single overage line item to the order transaction

        insert into dbo.FINANCIALTRANSACTIONLINEITEM (
            ID,
            FINANCIALTRANSACTIONID,
            FINANCIALTRANSACTIONLINEITEMADJUSTMENTID,
            TRANSACTIONAMOUNT,
            BASEAMOUNT,
            ORGAMOUNT,
            DESCRIPTION,
            POSTDATE,
            POSTSTATUSCODE,
            UNITVALUE,
            DATEADDED,
            DATECHANGED,
            ADDEDBYID,
            CHANGEDBYID
        )
        values (
            @ORDEROVERAGELINEITEMID,
            @SALESORDERTRANSACTIONID,
            @LATESTADJUSTMENTRECORDID,
            @TOTALOVERAGEAMOUNT,
            @TOTALOVERAGEAMOUNT,
            @TOTALOVERAGEAMOUNT,
            @RESERVATIONNAME + ' - Overage',
            @POSTDATE,
            @POSTSTATUSCODE,
            @TOTALOVERAGEAMOUNT,
            @CURRENTDATE,
            @CURRENTDATE,
            @CHANGEAGENTID,
            @CHANGEAGENTID
        );

        insert into dbo.REVENUESPLIT_EXT (
            ID,
            TYPECODE,
            APPLICATIONCODE,
            DATEADDED,
            DATECHANGED,
            ADDEDBYID,
            CHANGEDBYID
        )
        values (
            @ORDEROVERAGELINEITEMID,
            20,  -- Overage

            11,  -- Miscellaneous

            @CURRENTDATE,
            @CURRENTDATE,
            @CHANGEAGENTID,
            @CHANGEAGENTID
        )

        -- Add a "Do not post" line item to each payment containing an overage

        -- with a source of the order overage line item

        insert into dbo.FINANCIALTRANSACTIONLINEITEM (
            ID,
            FINANCIALTRANSACTIONID,
            SOURCELINEITEMID,
            TRANSACTIONAMOUNT,
            BASEAMOUNT,
            ORGAMOUNT,
            DESCRIPTION,
            POSTDATE,
            POSTSTATUSCODE,
            UNITVALUE,
            VISIBLE,
            DATEADDED,
            DATECHANGED,
            ADDEDBYID,
            CHANGEDBYID
        )
        select
            NEWOVERAGEKEPTLINEITEMID,
            ID,
            @ORDEROVERAGELINEITEMID,
            OVERAGEAMOUNT,
            OVERAGEAMOUNT,
            OVERAGEAMOUNT,
            @RESERVATIONNAME + ' - Overage',
            @POSTDATE,                            --So we know when the overage was kept

            3,  -- Do not post

            OVERAGEAMOUNT,
            0,
            @CURRENTDATE,
            @CURRENTDATE,
            @CHANGEAGENTID,
            @CHANGEAGENTID
        from
            @OVERAGEPAYMENTS;

        insert into dbo.REVENUESPLIT_EXT (
            ID,
            TYPECODE,
            APPLICATIONCODE,
            DATEADDED,
            DATECHANGED,
            ADDEDBYID,
            CHANGEDBYID
        )
        select
            NEWOVERAGEKEPTLINEITEMID,
            20,  -- Overage

            10,  -- Order

            @CURRENTDATE,
            @CURRENTDATE,
            @CHANGEAGENTID,
            @CHANGEAGENTID
        from
            @OVERAGEPAYMENTS;

        if @ALLOWGLDISTRIBUTIONS = 1 begin
            declare @JOURNAL nvarchar(50) = 'Blackbaud Enterprise';

            declare @DISTRIBUTIONS table (
                ACCOUNTID uniqueidentifier,
                TRANSACTIONTYPECODE tinyint,
                TRANSACTIONCURRENCYID uniqueidentifier,
                REFERENCE nvarchar(255),
                MAPPEDVALUES xml,
                PROJECT nvarchar(100),
                ACCOUNT nvarchar(100),
                BASEEXCHANGERATEID uniqueidentifier,
                ORGANIZATIONEXCHANGERATEID uniqueidentifier,
                GLPAYMENTMETHODREVENUETYPEMAPPINGID uniqueidentifier,
                ERRORMESSAGE nvarchar(max)
            );

            insert into @DISTRIBUTIONS (
                ACCOUNTID,
                TRANSACTIONTYPECODE,
                TRANSACTIONCURRENCYID,
                REFERENCE,
                MAPPEDVALUES,
                PROJECT,
                ACCOUNT,
                BASEEXCHANGERATEID,
                ORGANIZATIONEXCHANGERATEID,
                GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                ERRORMESSAGE
            )
            select
                ACCOUNTID,
                TRANSACTIONTYPECODE,
                TRANSACTIONCURRENCYID,
                REFERENCE,
                MAPPEDVALUES,
                PROJECT,
                ACCOUNTSTRING,
                BASEEXCHANGERATEID,
                ORGANIZATIONEXCHANGERATEID,
                GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                nullif(ERRORMESSAGE, '')
            from
                dbo.UFN_REVENUE_GENERATEGLDISTRIBUTION_FORSINGLEREVENUE(@SALESORDERTRANSACTIONID)
            where
                REVENUESPLITID = @ORDEROVERAGELINEITEMID;

            declare @ERRORMESSAGE nvarchar(max);
            select top 1 @ERRORMESSAGE = ERRORMESSAGE from @DISTRIBUTIONS where ERRORMESSAGE is not null and ACCOUNTID is null;

            if @ERRORMESSAGE is not null begin
                raiserror('%s', 13, 1, @ERRORMESSAGE);
            end
            else begin    
                insert into dbo.GLACCOUNTMAPPINGERROR (
                    TRANSACTIONID,
                    TRANSACTIONTYPECODE,
                    ERRORMESSAGE,
                    MAPPEDVALUES,
                    ADDEDBYID,
                    CHANGEDBYID,
                    DATEADDED,
                    DATECHANGED
                )
                select distinct
                    @ID,
                    5,  -- Order

                    ERRORMESSAGE,
                    convert(nvarchar(max), MAPPEDVALUES),
                    @CHANGEAGENTID,
                    @CHANGEAGENTID,
                    @CURRENTDATE,
                    @CURRENTDATE
                from
                    @DISTRIBUTIONS
                where
                    ERRORMESSAGE is not null;
            end

            -- Insert overage credit journal entry

            declare @OVERAGECREDITID uniqueidentifier = newid();

            insert into dbo.JOURNALENTRY (
                ID,
                FINANCIALTRANSACTIONLINEITEMID,
                TRANSACTIONTYPECODE,
                SUBLEDGERTYPECODE,
                TRANSACTIONAMOUNT,
                BASEAMOUNT,
                ORGAMOUNT,
                COMMENT,
                POSTDATE,
                GLACCOUNTID,
                TRANSACTIONCURRENCYID,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select
                @OVERAGECREDITID,
                @ORDEROVERAGELINEITEMID,
                1,  -- Credit

                1,  -- Credit

                @TOTALOVERAGEAMOUNT,
                @TOTALOVERAGEAMOUNT,
                @TOTALOVERAGEAMOUNT,
                REFERENCE,
                @POSTDATE,
                ACCOUNTID,
                TRANSACTIONCURRENCYID,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from
                @DISTRIBUTIONS
            where
                TRANSACTIONTYPECODE = 1;  -- Credit


            insert into dbo.JOURNALENTRY_EXT (
                ID,
                DISTRIBUTIONTABLEID,
                PROJECT,
                JOURNAL,
                PRECALCORGANIZATIONEXCHANGERATEID,
                PRECALCBASEEXCHANGERATEID,
                ACCOUNT,
                GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select
                @OVERAGECREDITID,
                @OVERAGECREDITID,
                PROJECT,
                @JOURNAL,
                ORGANIZATIONEXCHANGERATEID,
                BASEEXCHANGERATEID,
                ACCOUNT,
                GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from
                @DISTRIBUTIONS
            where
                TRANSACTIONTYPECODE = 1;  -- Credit


            -- Insert overage debit journal entries

            insert into dbo.JOURNALENTRY (
                ID,
                FINANCIALTRANSACTIONLINEITEMID,
                TRANSACTIONTYPECODE,
                SUBLEDGERTYPECODE,
                TRANSACTIONAMOUNT,
                BASEAMOUNT,
                ORGAMOUNT,
                COMMENT,
                POSTDATE,
                GLACCOUNTID,
                TRANSACTIONCURRENCYID,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select
                OVERAGEPAYMENTS.NEWJOURNALENTRYID,
                @ORDEROVERAGELINEITEMID,
                0,  -- Debit

                0,  -- Debit

                OVERAGEPAYMENTS.OVERAGEAMOUNT,
                OVERAGEPAYMENTS.OVERAGEAMOUNT,
                OVERAGEPAYMENTS.OVERAGEAMOUNT,
                REFERENCE,
                @POSTDATE,
                JOURNALENTRY.GLACCOUNTID,
                JOURNALENTRY.TRANSACTIONCURRENCYID,
                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from
                @OVERAGEPAYMENTS as OVERAGEPAYMENTS
            inner join
                dbo.FINANCIALTRANSACTIONLINEITEM as OVERAGEPAYMENTLINEITEMS on OVERAGEPAYMENTLINEITEMS.FINANCIALTRANSACTIONID = OVERAGEPAYMENTS.ID
            inner join
                dbo.REVENUESPLIT_EXT as OVERAGEPAYMENTLINEITEMSEXTENSION on OVERAGEPAYMENTLINEITEMSEXTENSION.ID = OVERAGEPAYMENTLINEITEMS.ID
            inner join
                dbo.JOURNALENTRY on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = OVERAGEPAYMENTLINEITEMS.ID
            outer apply
                @DISTRIBUTIONS as DISTRIBUTIONS
            where
                OVERAGEPAYMENTLINEITEMSEXTENSION.TYPECODE = 19  -- Unearned revenue

                and JOURNALENTRY.TRANSACTIONTYPECODE = 1  -- Credit

                and DISTRIBUTIONS.TRANSACTIONTYPECODE = 0  -- Debit

                and OVERAGEPAYMENTLINEITEMS.DELETEDON is null
                and OVERAGEPAYMENTLINEITEMS.TYPECODE = 0  -- Standard


            insert into dbo.JOURNALENTRY_EXT (
                ID,
                PROJECT,
                JOURNAL,
                TABLENAMECODE,
                DISTRIBUTIONTABLEID,
                GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                ACCOUNT,
                PRECALCPOSTSTATUSCODE,
                ADDEDBYID,
                CHANGEDBYID,
                DATEADDED,
                DATECHANGED
            )
            select
                OVERAGEPAYMENTS.NEWJOURNALENTRYID,
                DISTRIBUTIONS.PROJECT,
                @JOURNAL,
                1,  -- REVENUEGLDISTRIBUTION

                OVERAGEPAYMENTS.NEWJOURNALENTRYID,
                JOURNALENTRY_EXT.GLPAYMENTMETHODREVENUETYPEMAPPINGID,
                GLACCOUNT.ACCOUNTNUMBER,
                1,  -- Not posted

                @CHANGEAGENTID,
                @CHANGEAGENTID,
                @CURRENTDATE,
                @CURRENTDATE
            from
                @OVERAGEPAYMENTS as OVERAGEPAYMENTS
            inner join
                dbo.FINANCIALTRANSACTIONLINEITEM as OVERAGEPAYMENTLINEITEMS on OVERAGEPAYMENTLINEITEMS.FINANCIALTRANSACTIONID = OVERAGEPAYMENTS.ID
            inner join
                dbo.REVENUESPLIT_EXT as OVERAGEPAYMENTLINEITEMSEXTENSION on OVERAGEPAYMENTLINEITEMSEXTENSION.ID = OVERAGEPAYMENTLINEITEMS.ID
            inner join
                dbo.JOURNALENTRY on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = OVERAGEPAYMENTLINEITEMS.ID
            inner join
                dbo.JOURNALENTRY_EXT on JOURNALENTRY_EXT.ID = JOURNALENTRY.ID
            inner join
                dbo.GLACCOUNT on GLACCOUNT.ID = JOURNALENTRY.GLACCOUNTID
            outer apply
                @DISTRIBUTIONS as DISTRIBUTIONS
            where
                OVERAGEPAYMENTLINEITEMSEXTENSION.TYPECODE = 19  -- Unearned revenue

                and JOURNALENTRY.TRANSACTIONTYPECODE = 1  -- Credit

                and DISTRIBUTIONS.TRANSACTIONTYPECODE = 0  -- Debit

                and OVERAGEPAYMENTLINEITEMS.DELETEDON is null
                and OVERAGEPAYMENTLINEITEMS.TYPECODE = 0  -- Standard

        end
    end try

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

    return 0;