USP_DATAFORMTEMPLATE_EDIT_GIFTINKINDSALE

The save procedure used by the edit dataform template "Gift-in-Kind Sale Edit Data Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN The input ID parameter indicating the ID of the record being edited.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@SALEDATE datetime IN Date of sale
@SALEAMOUNT money IN Sale amount
@NUMBEROFUNITS int IN Units sold
@SALEPOSTDATE datetime IN GL post date
@SALEPOSTSTATUSCODE tinyint IN GL post status
@BASEEXCHANGERATEID uniqueidentifier IN Exchange rate ID
@EXCHANGERATE decimal(20, 8) IN Exchange rate
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.

Definition

Copy


                CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_GIFTINKINDSALE
                (
                    @ID uniqueidentifier,
                    @CHANGEAGENTID uniqueidentifier,
                    @SALEDATE datetime,
                    @SALEAMOUNT money,
                    @NUMBEROFUNITS integer,
                    @SALEPOSTDATE datetime,
                    @SALEPOSTSTATUSCODE tinyint,
                    @BASEEXCHANGERATEID uniqueidentifier,
                    @EXCHANGERATE decimal(20,8),
                    @CURRENTAPPUSERID uniqueidentifier = null
                )
                as
                    set nocount on

                    -- Check GL business rule for this account system and set to 'Do not post' if needed.

                    -- ****

                    declare @PDACCOUNTSYSTEMID uniqueidentifier;
                    select @PDACCOUNTSYSTEMID = PDACCOUNTSYSTEMID 
                    from dbo.PDACCOUNTSYSTEMFORREVENUE
                    where ID = @ID;

                    declare @ALLOWGLDISTRIBUTIONS bit;
                    set @ALLOWGLDISTRIBUTIONS = dbo.UFN_PDACCOUNTSYSTEM_ALLOWGLDISTRIBUTIONS(@PDACCOUNTSYSTEMID);
                    if @ALLOWGLDISTRIBUTIONS = 0 
                        begin
                            set @SALEPOSTSTATUSCODE = 2        -- Do not post

                            set @SALEPOSTDATE = null
                        end
                    -- ****


                    declare @CURRENTSALEPOSTSTATUSCODE tinyint
                    select
                        @CURRENTSALEPOSTSTATUSCODE = SALEPOSTSTATUSCODE
                    from dbo.GIFTINKINDSALE where ID = @ID

                    -- Verify the transaction hasn't already been posted            

                    if @CURRENTSALEPOSTSTATUSCODE = 0 -- Posted

                    begin
                        raiserror('GIFTINKINDSALEMUSTNOTBEPOSTED', 13, 1)
                        return 1                        
                    end

                    -- Raise error if the transaction is do not post but the gift-in-kind sale isn't do not post

                    if @SALEPOSTSTATUSCODE <> 2 and 
                        (    select top 1 DONOTPOST from dbo.GIFTINKINDSALE 
                            inner join dbo.REVENUEPAYMENTMETHOD on GIFTINKINDSALE.GIFTINKINDPAYMENTMETHODDETAILID = REVENUEPAYMENTMETHOD.ID
                            inner join dbo.REVENUE on REVENUEPAYMENTMETHOD.REVENUEID = REVENUE.ID
                            where GIFTINKINDSALE.ID = @ID) = 1
                    begin
                        raiserror('BBERR_TRANSACTIONDONOTPOSTSALEPOST', 13, 1)
                        return 1
                    end

                    --Don't allow a sale before the revenue date.

                    if @SALEDATE < 
                        (    select DATE from dbo.GIFTINKINDSALE 
                            inner join dbo.REVENUEPAYMENTMETHOD on GIFTINKINDSALE.GIFTINKINDPAYMENTMETHODDETAILID = REVENUEPAYMENTMETHOD.ID
                            inner join dbo.REVENUE on REVENUEPAYMENTMETHOD.REVENUEID = REVENUE.ID
                            where GIFTINKINDSALE.ID = @ID)
                    begin
                        raiserror('BBERR_SALEDATEBEFOREREVENUEDATE', 13, 1);
                        return 1;
                    end

                    --Don't allow a sale to post before the revenue date.

                    if @SALEPOSTDATE < 
                        (    select DATE from dbo.GIFTINKINDSALE 
                            inner join dbo.REVENUEPAYMENTMETHOD on GIFTINKINDSALE.GIFTINKINDPAYMENTMETHODDETAILID = REVENUEPAYMENTMETHOD.ID
                            inner join dbo.REVENUE on REVENUEPAYMENTMETHOD.REVENUEID = REVENUE.ID
                            where GIFTINKINDSALE.ID = @ID)                    
                    begin
                        raiserror('BBERR_SALEPOSTDATEBEFOREREVENUEDATE', 13, 1);
                        return 1;
                    end

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

                    declare @CURRENTDATE datetime
                    set @CURRENTDATE = getdate()

                    declare @UPDATEDISTRIBUTIONS bit = 0

                    begin try
                        declare
                            @ORGANIZATIONSALEAMOUNT money,
                            @BASESALEAMOUNT money,
                            @BASECURRENCYID uniqueidentifier,
                            @ORGANIZATIONEXCHANGERATEID uniqueidentifier,
                            @TRANSACTIONCURRENCYID uniqueidentifier,
                            @ORGANIZATIONCURRENCYID uniqueidentifier;

                        declare @OLDSPOTRATEID uniqueidentifier;

                        select
                            @TRANSACTIONCURRENCYID = GIFTINKINDSALE.TRANSACTIONCURRENCYID,
                            @BASECURRENCYID = GIFTINKINDSALE.BASECURRENCYID,
                            @OLDSPOTRATEID = 
                                case
                                    when CURRENCYEXCHANGERATE.TYPECODE = 2
                                    and not (@BASEEXCHANGERATEID = CURRENCYEXCHANGERATE.ID or (@BASEEXCHANGERATEID = '00000000-0000-0000-0000-000000000001' and @EXCHANGERATE = CURRENCYEXCHANGERATE.RATE))
                                        then CURRENCYEXCHANGERATE.ID
                                    else
                                        null
                                end
                        from
                            dbo.GIFTINKINDSALE
                            left join dbo.CURRENCYEXCHANGERATE on GIFTINKINDSALE.BASEEXCHANGERATEID = CURRENCYEXCHANGERATE.ID
                        where
                            GIFTINKINDSALE.ID = @ID;

                        --If the record uses a new spot rate, create it and set the rate ID.

                        if @BASEEXCHANGERATEID = '00000000-0000-0000-0000-000000000001'
                        begin

                            set @BASEEXCHANGERATEID = newid();

                            --Replace with call to USP_CURRENCYEXCHANGERATE_ENSURESPOTRATEEXISTS for PBI 102747 in the future

                            /*if not dbo.UFN_SECURITY_APPUSER_GRANTED_SYSTEMPRIVILEGE_IN_SYSTEMROLE(@CURRENTAPPUSERID,'911f104d-ba5f-4469-b0ae-184c879aea99') = 1
                                and not dbo.UFN_APPUSER_ISSYSADMIN(@CURRENTAPPUSERID) = 1
                            begin
                                raiserror('User does not have the right to add a new spot rate.', 13, 1);
                                return 1;
                            end*/

                            insert into dbo.CURRENCYEXCHANGERATE
                            (
                                ID, 
                                FROMCURRENCYID,
                                TOCURRENCYID,
                                RATE,
                                ASOFDATE,
                                TYPECODE,
                                SOURCECODEID,
                                ADDEDBYID, 
                                CHANGEDBYID, 
                                DATEADDED, 
                                DATECHANGED
                            )
                            values
                            (
                                @BASEEXCHANGERATEID,
                                @TRANSACTIONCURRENCYID,
                                @BASECURRENCYID,
                                @EXCHANGERATE,
                                @SALEDATE,
                                2,
                                null,
                                @CHANGEAGENTID,
                                @CHANGEAGENTID,
                                @CURRENTDATE,
                                @CURRENTDATE
                            );
                        end

                        exec dbo.USP_CURRENCY_GETCURRENCYVALUES @SALEAMOUNT, @SALEDATE, @BASECURRENCYID, @BASEEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASESALEAMOUNT output, @ORGANIZATIONCURRENCYID output, @ORGANIZATIONSALEAMOUNT output, @ORGANIZATIONEXCHANGERATEID output, 1; --Get an organization currency and exchange rate on the first call


                        -- check to see if sale amount, post date, or post status has changed

                        if exists (
                            select 1
                            from dbo.GIFTINKINDSALE 
                            where GIFTINKINDSALE.ID = @ID
                                and (TRANSACTIONSALEAMOUNT <> @SALEAMOUNT 
                                    or @SALEPOSTSTATUSCODE <> SALEPOSTSTATUSCODE 
                                    or @NUMBEROFUNITS <> NUMBEROFUNITS
                                    or @SALEPOSTDATE <> SALEPOSTDATE or SALEDATE is null
                                    or SALEAMOUNT <> @BASESALEAMOUNT 
                                    or ORGANIZATIONSALEAMOUNT <> @ORGANIZATIONSALEAMOUNT 
                                    or TRANSACTIONCURRENCYID <> @TRANSACTIONCURRENCYID 
                                    or BASECURRENCYID <> @BASECURRENCYID
                                    or BASEEXCHANGERATEID <> @BASEEXCHANGERATEID 
                                    or (BASEEXCHANGERATEID is null and @BASEEXCHANGERATEID is not null)
                                    or (BASEEXCHANGERATEID is not null and @BASEEXCHANGERATEID is null)
                                    or ORGANIZATIONEXCHANGERATEID <> @ORGANIZATIONEXCHANGERATEID
                                    or (ORGANIZATIONEXCHANGERATEID is null and @ORGANIZATIONEXCHANGERATEID is not null)
                                    or (ORGANIZATIONEXCHANGERATEID is not null and @ORGANIZATIONEXCHANGERATEID is null)
                                )
                        )        
                        set @UPDATEDISTRIBUTIONS = 1;

                        update dbo.FINANCIALTRANSACTION set
                                DATE = isnull(@SALEDATE,FINANCIALTRANSACTION.DATE),
                                BASEAMOUNT = @BASESALEAMOUNT,
                                TRANSACTIONAMOUNT = @SALEAMOUNT,
                                ORGAMOUNT = @ORGANIZATIONSALEAMOUNT,
                                POSTDATE = @SALEPOSTDATE,
                                POSTSTATUSCODE = case @SALEPOSTSTATUSCODE when 2 then 3 else 1 end,
                                TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID,
                                BASEEXCHANGERATEID = @BASEEXCHANGERATEID
                                DATECHANGED = @CURRENTDATE,
                                CHANGEDBYID = @CHANGEAGENTID
                            where
                                ID = @ID;

                            update dbo.GIFTINKINDSALE_EXT set
                                SALEDATE = @SALEDATE,
                                NUMBEROFUNITS = @NUMBEROFUNITS,
                                DATECHANGED = @CURRENTDATE,
                                CHANGEDBYID = @CHANGEAGENTID
                            where ID = @ID

                            update dbo.FINANCIALTRANSACTIONLINEITEM set
                                TRANSACTIONAMOUNT = @SALEAMOUNT,
                                ORGAMOUNT = @ORGANIZATIONSALEAMOUNT,
                                BASEAMOUNT = @BASESALEAMOUNT,
                                POSTDATE = @SALEPOSTDATE,
                                POSTSTATUSCODE = case @SALEPOSTSTATUSCODE when 2 then 3 else 1 end,
                                DATECHANGED = @CURRENTDATE,
                                CHANGEDBYID = @CHANGEAGENTID
                            where
                                FINANCIALTRANSACTIONID = @ID;  

                        if @UPDATEDISTRIBUTIONS = 1
                        begin
                            -- Cache CONTEXT INFO

                            declare @contextCache varbinary(128);
                            set @contextCache = CONTEXT_INFO();

                            if not @CHANGEAGENTID is null
                                set CONTEXT_INFO @CHANGEAGENTID;

                            delete from dbo.GIFTINKINDSALEGLDISTRIBUTION where GIFTINKINDSALEID = @ID and OUTDATED = 0;

                            -- Add new gift-in-kind detail GL distributions

                            if @SALEPOSTSTATUSCODE <> 2
                            begin
                                declare @REVENUEID uniqueidentifier
                                select @REVENUEID = REVENUEPAYMENTMETHOD.REVENUEID
                                from dbo.REVENUEPAYMENTMETHOD
                                inner join dbo.GIFTINKINDSALE on REVENUEPAYMENTMETHOD.ID = GIFTINKINDSALE.GIFTINKINDPAYMENTMETHODDETAILID
                                where GIFTINKINDSALE.ID = @ID

                                exec dbo.USP_SAVE_GIFTINKINDPAYMENTMETHODDETAILGLDISTRIBUTION @REVENUEID, @CHANGEAGENTID, @CURRENTDATE, @ID;
                            end

                            --Restore CONTEXT_INFO

                            if not @contextCache is null
                                set CONTEXT_INFO @contextCache;
                        end

                        if @OLDSPOTRATEID is not null
                        begin
                            exec dbo.USP_CURRENCYEXCHANGERATE_DELETEBYID_WITHCHANGEAGENTID @OLDSPOTRATEID, @CHANGEAGENTID;
                        end

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

                    return 0