USP_DATAFORMTEMPLATE_EDIT_STOCKSALE_2

The save procedure used by the edit dataform template "Stock Sale Edit 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
@FEE money IN Fees
@NUMBEROFUNITS decimal(20, 3) IN Units sold
@LOWPRICE decimal(19, 4) IN Low
@MEDIANPRICE decimal(19, 4) IN Median
@HIGHPRICE decimal(19, 4) IN High
@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_STOCKSALE_2
                    (
                        @ID uniqueidentifier,
                        @CHANGEAGENTID uniqueidentifier,
                        @SALEDATE datetime,
                        @SALEAMOUNT money,
                        @FEE money,
                        @NUMBEROFUNITS decimal(20,3),
                        @LOWPRICE decimal(19,4),
                        @MEDIANPRICE decimal(19,4),
                        @HIGHPRICE decimal(19,4),
                        @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.STOCKSALE where ID = @ID

                        -- Verify the transaction hasn't already been posted            

                        if @CURRENTSALEPOSTSTATUSCODE = 0 -- Posted

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

                        if @LOWPRICE < 0
                        begin
                            raiserror('BBERR_LOWPRICEPERSHARENEGATIVE', 13, 1)
                            return 1
                        end

                        if @MEDIANPRICE < 0
                        begin
                            raiserror('BBERR_MEDIANPRICEPERSHARENEGATIVE', 13, 1)
                            return 1
                        end

                        if @HIGHPRICE < 0
                        begin
                            raiserror('BBERR_HIGHPRICEPERSHARENEGATIVE', 13, 1)
                            return 1
                        end

                        -- Raise error if the transaction is do not post but the stock sale isn't do not post

                        if @SALEPOSTSTATUSCODE <> 2 and 
                            (    select top 1 DONOTPOST from dbo.STOCKSALE 
                                inner join dbo.REVENUEPAYMENTMETHOD on STOCKSALE.STOCKDETAILID = REVENUEPAYMENTMETHOD.ID
                                inner join dbo.REVENUE on REVENUEPAYMENTMETHOD.REVENUEID = REVENUE.ID
                                where STOCKSALE.ID = @ID) = 1
                        begin
                            raiserror('BBERR_TRANSACTIONDONOTPOSTSALEPOST', 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,
                                @ORGANIZATIONFEE money,
                                @ORGANIZATIONLOWPRICE decimal(19,4),
                                @ORGANIZATIONMEDIANPRICE decimal(19,4),
                                @ORGANIZATIONHIGHPRICE decimal(19,4),
                                @BASESALEAMOUNT money,
                                @BASEFEE money,
                                @BASELOWPRICE decimal(19,4),
                                @BASEMEDIANPRICE decimal(19,4),
                                @BASEHIGHPRICE decimal(19,4),
                                @BASECURRENCYID uniqueidentifier,
                                @ORGANIZATIONEXCHANGERATEID uniqueidentifier,
                                @TRANSACTIONCURRENCYID uniqueidentifier,
                                @ORGANIZATIONCURRENCYID uniqueidentifier;

                            declare @OLDSPOTRATEID uniqueidentifier;

                            select
                                @TRANSACTIONCURRENCYID = STOCKSALE.TRANSACTIONCURRENCYID,
                                @BASECURRENCYID = STOCKSALE.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.STOCKSALE
                                left join dbo.CURRENCYEXCHANGERATE on STOCKSALE.BASEEXCHANGERATEID = CURRENCYEXCHANGERATE.ID
                            where
                                STOCKSALE.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

                            exec dbo.USP_CURRENCY_GETCURRENCYVALUES @FEE, @SALEDATE, @BASECURRENCYID, @BASEEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASEFEE output, @ORGANIZATIONCURRENCYID, @ORGANIZATIONFEE output, @ORGANIZATIONEXCHANGERATEID, 0;
                            exec dbo.USP_CURRENCY_GETCURRENCYVALUES @LOWPRICE, @SALEDATE, @BASECURRENCYID, @BASEEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASELOWPRICE output, @ORGANIZATIONCURRENCYID, @ORGANIZATIONLOWPRICE output, @ORGANIZATIONEXCHANGERATEID, 0;
                            exec dbo.USP_CURRENCY_GETCURRENCYVALUES @MEDIANPRICE, @SALEDATE, @BASECURRENCYID, @BASEEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASEMEDIANPRICE output, @ORGANIZATIONCURRENCYID, @ORGANIZATIONMEDIANPRICE output, @ORGANIZATIONEXCHANGERATEID, 0;
                            exec dbo.USP_CURRENCY_GETCURRENCYVALUES @HIGHPRICE, @SALEDATE, @BASECURRENCYID, @BASEEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASEHIGHPRICE output, @ORGANIZATIONCURRENCYID, @ORGANIZATIONHIGHPRICE output, @ORGANIZATIONEXCHANGERATEID, 0;

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

                            if exists (
                                select 1
                                from dbo.STOCKSALE 
                                where STOCKSALE.ID = @ID
                                    and (TRANSACTIONSALEAMOUNT <> @SALEAMOUNT 
                                        or TRANSACTIONFEE <> @FEE 
                                        or @SALEPOSTSTATUSCODE <> SALEPOSTSTATUSCODE 
                                        or @SALEPOSTDATE <> SALEPOSTDATE or SALEDATE is null
                                        or SALEAMOUNT <> @BASESALEAMOUNT 
                                        or FEE <> @BASEFEE
                                        or ORGANIZATIONSALEAMOUNT <> @ORGANIZATIONSALEAMOUNT 
                                        or ORGANIZATIONFEE <> @ORGANIZATIONFEE
                                        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)
                                        or NUMBEROFUNITS != @NUMBEROFUNITS
                                    )
                            )
                                set @UPDATEDISTRIBUTIONS = 1;


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

                            update dbo.STOCKSALE_EXT set
                                SALEDATE = @SALEDATE,
                                FEE = @BASEFEE,
                                NUMBEROFUNITS = @NUMBEROFUNITS,
                                LOWPRICE = @BASELOWPRICE,
                                MEDIANPRICE = @BASEMEDIANPRICE,
                                HIGHPRICE = @BASEHIGHPRICE,
                                ORGANIZATIONFEE = @ORGANIZATIONFEE,
                                ORGANIZATIONLOWPRICE = @ORGANIZATIONLOWPRICE,
                                ORGANIZATIONMEDIANPRICE = @ORGANIZATIONMEDIANPRICE,
                                ORGANIZATIONHIGHPRICE = @ORGANIZATIONHIGHPRICE,
                                TRANSACTIONFEE = @FEE,
                                TRANSACTIONLOWPRICE = @LOWPRICE,
                                TRANSACTIONMEDIANPRICE = @MEDIANPRICE,
                                TRANSACTIONHIGHPRICE = @HIGHPRICE,
                                DATECHANGED = @CURRENTDATE,
                                CHANGEDBYID = @CHANGEAGENTID
                            where ID = @ID

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

                            if @UPDATEDISTRIBUTIONS = 1
                            begin
                                --Clear GL

                                --Cache CONTEXT INFO

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

                                if not @CHANGEAGENTID is null
                                    set CONTEXT_INFO @CHANGEAGENTID;

                                delete from dbo.STOCKSALEGLDISTRIBUTION where STOCKSALEID = @ID and OUTDATED = 0;

                                -- Add new stock detail GL distributions

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

                                    exec dbo.USP_SAVE_STOCKDETAILGLDISTRIBUTION @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