USP_RESERVATIONREFUNDADD_SAVE

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT
@PAYMENTID uniqueidentifier IN
@REFUNDPAYMENTMETHODCODE tinyint IN
@REFUNDAMOUNT money IN
@CREDITREASONCODEID uniqueidentifier IN
@CURRENTAPPUSERID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTDATE datetime IN
@CREDITCARDPAYMENTTRANSACTIONID uniqueidentifier INOUT
@CREDITPAYMENTID uniqueidentifier INOUT
@REFUNDOTHERPAYMENTMETHODCODEID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_RESERVATIONREFUNDADD_SAVE
(
    @ID uniqueidentifier = null output,
    @PAYMENTID uniqueidentifier,
    @REFUNDPAYMENTMETHODCODE tinyint,
    @REFUNDAMOUNT money,
    @CREDITREASONCODEID uniqueidentifier = null,
    @CURRENTAPPUSERID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier = null,
    @CURRENTDATE datetime = null,
    @CREDITCARDPAYMENTTRANSACTIONID uniqueidentifier = null output,
    @CREDITPAYMENTID uniqueidentifier = null output,
    @REFUNDOTHERPAYMENTMETHODCODEID uniqueidentifier = null    
)
as
begin
    if @ID is null
        set @ID = newid();

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

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

    declare @CONSTITUENTID uniqueidentifier;
    declare @CURRENTDATETIMEOFFSET datetimeoffset;
    set @CURRENTDATETIMEOFFSET = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULTDATEWITHTIMEOFFSET(getutcdate(), 1);

    declare @PDACCOUNTSYSTEMID uniqueidentifier;
    declare @ALLOWGLDISTRIBUTIONS bit;
    declare @POSTSTATUSCODE tinyint;
    declare @POSTDATE datetime;

    select
        @PDACCOUNTSYSTEMID = ID,
        @ALLOWGLDISTRIBUTIONS = ALLOWGLDISTRIBUTIONS,
        @POSTSTATUSCODE = (case when ALLOWGLDISTRIBUTIONS = 1 then 1 else 3 end)
    from
        dbo.UFN_PDACCOUNTSYSTEM_DEFAULTORSYSTEM()

     if @POSTSTATUSCODE = 3
        set @POSTDATE = null
     else
        set @POSTDATE = @CURRENTDATE

    declare @CURRENCYID uniqueidentifier;
    select @CURRENCYID = ID from dbo.CURRENCY where ISORGANIZATIONCURRENCY = 1;

    begin try
        if (@PAYMENTID is null)
            raiserror('You must enter a payment to refund.', 13, 1);

        if (@REFUNDAMOUNT <= 0)
            raiserror('The amount refunded must be greater than zero.', 13, 1);    

        --    Payment method codes

        --            <EnumValue ID="0" Translation="Cash"/>

        --            <EnumValue ID="1" Translation="Check"/>

        --            <EnumValue ID="2" Translation="Credit card"/>

        --            <EnumValue ID="3" Translation="Direct debit"/>

        --            <EnumValue ID="4" Translation="Stock"/>

        --            <EnumValue ID="5" Translation="Property"/>

        --            <EnumValue ID="6" Translation="Gift-in-kind"/>

        --            <EnumValue ID="9" Translation="None"/>

        --            <EnumValue ID="10" Translation="Other"/>

        --            <EnumValue ID="11" Translation="Standing order"/>



        if (@REFUNDPAYMENTMETHODCODE in (3,4,5,6,9,11))
            raiserror('This refund method cannot be refunded.', 13, 1);

        declare @PAYMENTMETHODCODE tinyint;
        declare @PAYMENTDATEADDED date;
        declare @AMOUNTLEFTTOREFUND money;
        declare @SALESORDERID uniqueidentifier;
        declare @RESERVATIONNAME nvarchar(100);

        select
            @PAYMENTMETHODCODE = REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE,
            @PAYMENTDATEADDED = REVENUEPAYMENTMETHOD.DATEADDED,
            @SALESORDERID = SALESORDER.ID,
            @AMOUNTLEFTTOREFUND = TOTALS.OVERAGE,
            @CONSTITUENTID = SALESORDER.CONSTITUENTID,
            @RESERVATIONNAME = RESERVATION.NAME
        from
            dbo.SALESORDERPAYMENT
        inner join
            dbo.REVENUEPAYMENTMETHOD on REVENUEPAYMENTMETHOD.REVENUEID = SALESORDERPAYMENT.PAYMENTID
        inner join
            dbo.SALESORDER on SALESORDERPAYMENT.SALESORDERID = SALESORDER.ID
        inner join
            dbo.RESERVATION on RESERVATION.ID = SALESORDER.ID
        outer apply 
            dbo.UFN_PAYMENT_AMOUNTS(SALESORDERPAYMENT.PAYMENTID) TOTALS
        where 
            SALESORDERPAYMENT.PAYMENTID = @PAYMENTID

        if @PAYMENTMETHODCODE = 2 begin  -- Credit card

            set @CREDITCARDPAYMENTTRANSACTIONID = dbo.UFN_FINANCIALTRANSACTION_GETBBPSTRANSACTIONID(@PAYMENTID);

            if @CREDITCARDPAYMENTTRANSACTIONID is null
                raiserror('The credit card must be processed to issue a refund.', 16, 1);
        end

        if @AMOUNTLEFTTOREFUND <= 0 or @REFUNDAMOUNT > @AMOUNTLEFTTOREFUND
            raiserror('The amount specified to refund is larger than the payment amount left to refund.', 13, 1);

        if @PAYMENTMETHODCODE <> 2 and @REFUNDPAYMENTMETHODCODE = 2
            raiserror('The refunded payment must be a credit card.', 13, 1);

        -- insert into FT, FTL, CIE, CP

        insert into dbo.FINANCIALTRANSACTION
        (
            ID,
            TRANSACTIONAMOUNT,
            BASEAMOUNT,
            ORGAMOUNT,
            TYPECODE,
            PDACCOUNTSYSTEMID,
            TRANSACTIONCURRENCYID,
            DATE,
            POSTDATE,
            POSTSTATUSCODE, 
            PARENTID,
            APPUSERID,
            CONSTITUENTID,
            DATEADDED,
            DATECHANGED,
            ADDEDBYID,
            CHANGEDBYID
        )
        values
        (
            @ID,
            @REFUNDAMOUNT,
            @REFUNDAMOUNT,
            @REFUNDAMOUNT,
            23, --Refund

            @PDACCOUNTSYSTEMID,
            @CURRENCYID,
            @CURRENTDATETIMEOFFSET,
            @POSTDATE,
            @POSTSTATUSCODE,
            (select REVENUEID from dbo.SALESORDER where ID = @SALESORDERID),
            @CURRENTAPPUSERID,
            @CONSTITUENTID,
            @CURRENTDATE
            @CURRENTDATE
            @CHANGEAGENTID
            @CHANGEAGENTID
        );

        insert into dbo.CREDIT_EXT
        (
            ID,
            SALESORDERID,
            CREDITREASONCODEID,
            DATEADDED,
            DATECHANGED,
            ADDEDBYID,
            CHANGEDBYID
        )
        values 
        (
            @ID,
            @SALESORDERID,
            @CREDITREASONCODEID,
            @CURRENTDATE
            @CURRENTDATE
            @CHANGEAGENTID
            @CHANGEAGENTID
        );

        if @CREDITPAYMENTID is null
            set @CREDITPAYMENTID = newid();

        insert into dbo.CREDITPAYMENT
        (
            ID,
            CREDITID,
            APPUSERID,
            CREDITPAYMENTDATEWITHTIMEOFFSET,
            AMOUNT,
            PAYMENTMETHODCODE,
            OTHERPAYMENTMETHODCODEID,
            REVENUEID,
            REVENUESPLITID,
            REFUNDPROCESSED,
        --  DESCRIPTION,

            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
        )
        values
        (
            @CREDITPAYMENTID,
            @ID,
            @CURRENTAPPUSERID,
            @CURRENTDATETIMEOFFSET,
            @REFUNDAMOUNT,
            @REFUNDPAYMENTMETHODCODE,
            case when @REFUNDPAYMENTMETHODCODE = 10
                then @REFUNDOTHERPAYMENTMETHODCODEID
            else
                null
            end,
            @PAYMENTID,
            null,
            case when @REFUNDPAYMENTMETHODCODE = 2 
                then 0
            else 
                1
            end,
        --    Descriptive stuff goes here

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

        if @REFUNDPAYMENTMETHODCODE = 1
        begin
            insert into dbo.CREDITPAYMENTCHECKPAYMENTMETHODDETAIL
            (
                ID,
                DATEADDED,
                DATECHANGED,
                ADDEDBYID,
                CHANGEDBYID
            )
            values
            (
                @CREDITPAYMENTID,
                @CURRENTDATE,
                @CURRENTDATE,
                @CHANGEAGENTID,
                @CHANGEAGENTID
            )
        end


        declare    @FINANCIALTRANSACTIONLINEITEMID uniqueidentifier;
        set @FINANCIALTRANSACTIONLINEITEMID = newid();

        declare @SOURCELINEITEMID uniqueidentifier;
        select 
            top 1 @SOURCELINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID 
        from 
            dbo.FINANCIALTRANSACTIONLINEITEM
        inner join
            dbo.REVENUESPLIT_EXT on REVENUESPLIT_EXT.ID = FINANCIALTRANSACTIONLINEITEM.ID
        where 
            FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = @PAYMENTID 
            and FINANCIALTRANSACTIONLINEITEM.VISIBLE = 1 
            and FINANCIALTRANSACTIONLINEITEM.DELETEDON is null
            and REVENUESPLIT_EXT.TYPECODE = 19; -- unearned revenue



        -- Add Reservation Name to Description

        insert into dbo.FINANCIALTRANSACTIONLINEITEM
        (
            ID,
            FINANCIALTRANSACTIONID,
            UNITVALUE,
            QUANTITY,
            TRANSACTIONAMOUNT,
            BASEAMOUNT,
            ORGAMOUNT,
            TYPECODE,
            POSTDATE,
            SOURCELINEITEMID,
            DESCRIPTION,
            POSTSTATUSCODE,
            ADDEDBYID, 
            CHANGEDBYID, 
            DATEADDED, 
            DATECHANGED
        )
        values
        (
            @FINANCIALTRANSACTIONLINEITEMID,
            @ID,
            @REFUNDAMOUNT,
            1,
            @REFUNDAMOUNT,
            @REFUNDAMOUNT,
            @REFUNDAMOUNT,
            0,  -- Standard

            @POSTDATE,
            @SOURCELINEITEMID,
            @RESERVATIONNAME,
            @POSTSTATUSCODE,
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
        );

        insert into dbo.CREDITITEM_EXT
        (
            ID,
            CREDITID,
            TYPECODE,
            ADDEDBYID, 
            CHANGEDBYID, 
            DATEADDED, 
            DATECHANGED
        )
        values
        (
            @FINANCIALTRANSACTIONLINEITEMID,
            @ID,
            255, -- Unearned revenue

            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
        );

        if @ALLOWGLDISTRIBUTIONS = 1
            exec dbo.USP_REFUND_CREATEGLDISTRIBUTION_GROUPSALES @CREDITPAYMENTID, @CHANGEAGENTID, @CURRENTDATE

    end try

    begin catch
        exec dbo.USP_RAISE_ERROR
        return 1
    end catch

end