USP_DATAFORMTEMPLATE_EDIT_POSTEDGRANTAWARD_4

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@DATE datetime IN
@AMOUNT money IN
@POSTSTATUSCODE tinyint IN
@POSTDATE datetime IN
@SPLITS xml IN
@FREQUENCYCODE tinyint IN
@NUMBEROFINSTALLMENTS int IN
@NEXTTRANSACTIONDATE datetime IN
@INSTALLMENTS xml IN
@DONOTACKNOWLEDGE bit IN
@CATEGORYCODEID uniqueidentifier IN
@ADJUSTMENTDATE datetime IN
@ADJUSTMENTPOSTDATE datetime IN
@ADJUSTMENTREASON nvarchar(300) IN
@ISREIMBURSABLE bit IN
@OPPORTUNITYID uniqueidentifier IN
@BASECURRENCYID uniqueidentifier IN
@TRANSACTIONCURRENCYID uniqueidentifier IN
@BASEEXCHANGERATEID uniqueidentifier IN
@EXCHANGERATE decimal(20, 8) IN
@HADSPOTRATE bit IN
@RATECHANGED bit IN
@ADJUSTMENTREASONCODEID uniqueidentifier IN
@ADJPAYMENT_DATE datetime IN
@ADJPAYMENT_POSTDATE datetime IN
@ADJPAYMENT_REASONCODEID uniqueidentifier IN
@ADJPAYMENT_DETAILS nvarchar(255) IN
@UPDATERECOGNITIONOPTION tinyint IN

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_POSTEDGRANTAWARD_4 (
  @ID uniqueidentifier
  ,@CHANGEAGENTID uniqueidentifier = null
  ,@DATE datetime
  ,@AMOUNT money
  ,@POSTSTATUSCODE tinyint
  ,@POSTDATE datetime
  ,@SPLITS xml
  ,@FREQUENCYCODE tinyint
  ,@NUMBEROFINSTALLMENTS int
  ,@NEXTTRANSACTIONDATE datetime
  ,@INSTALLMENTS xml
  ,@DONOTACKNOWLEDGE bit
  ,@CATEGORYCODEID uniqueidentifier
  ,@ADJUSTMENTDATE datetime
  ,@ADJUSTMENTPOSTDATE datetime
  ,@ADJUSTMENTREASON nvarchar(300)
  ,@ISREIMBURSABLE bit
  ,@OPPORTUNITYID uniqueidentifier
  ,@BASECURRENCYID uniqueidentifier
  ,@TRANSACTIONCURRENCYID uniqueidentifier
  ,@BASEEXCHANGERATEID uniqueidentifier
  ,@EXCHANGERATE decimal(20, 8)
  ,@HADSPOTRATE bit
  ,@RATECHANGED bit
  ,@ADJUSTMENTREASONCODEID uniqueidentifier
  ,@ADJPAYMENT_DATE datetime
  ,@ADJPAYMENT_POSTDATE datetime
  ,@ADJPAYMENT_REASONCODEID uniqueidentifier
  ,@ADJPAYMENT_DETAILS nvarchar(255)
  ,@UPDATERECOGNITIONOPTION tinyint
  )
as
set nocount on;

declare @EMPTYGUID uniqueidentifier = '00000000-0000-0000-0000-000000000000';
if @CHANGEAGENTID is null
  exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

declare @CURRENTDATE datetime;

set @CURRENTDATE = getdate();

begin try
  declare @SUM money;
  declare @COUNT int;
  declare @ADJUST bit;
  declare @ADJUSTMENTID uniqueidentifier;
  declare @REACKNOWLEDGEFIELDCHANGED bit;
  declare @CLEARGLDISTRIBUTION bit;

  set @ADJUST = 0;
  set @ADJUSTMENTID = null;
  set @CLEARGLDISTRIBUTION = 0;
  set @REACKNOWLEDGEFIELDCHANGED = 0;

  declare @contextCache varbinary(128);
  -- Multicurrency - If the revenue previously used a spot rate, but

  -- its rate has changed, store the old rate's ID, so we can remove it later.

  declare @OLDSPOTRATE uniqueidentifier

  if @HADSPOTRATE = 1
    and @RATECHANGED = 1
  begin
    select @OLDSPOTRATE = BASEEXCHANGERATEID
    from dbo.REVENUE
    where ID = @ID
  end

  --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()

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

  --Multicurrency - Retrieve and calculate the necessary multicurrency values.                

  declare @BASEAMOUNT money;
  declare @ORGANIZATIONCURRENCYID uniqueidentifier;
  declare @ORGANIZATIONAMOUNT money;
  declare @ORGANIZATIONEXCHANGERATEID uniqueidentifier;

  exec dbo.USP_CURRENCY_GETCURRENCYVALUES @AMOUNT
    ,@DATE
    ,@BASECURRENCYID
    ,@BASEEXCHANGERATEID
    ,@TRANSACTIONCURRENCYID output
    ,@BASEAMOUNT output
    ,@ORGANIZATIONCURRENCYID output
    ,@ORGANIZATIONAMOUNT output
    ,@ORGANIZATIONEXCHANGERATEID output
    ,1;

  exec dbo.USP_REVENUESPLIT_VALIDATESPLITS @SPLITS = @SPLITS
    ,@REVENUEAMOUNT = @AMOUNT
    ,@REVENUEID = @ID
    ,@TRANSACTIONCURRENCYID = @TRANSACTIONCURRENCYID;

  select @SUM = sum(AMOUNT)
    ,@COUNT = count(AMOUNT)
  from dbo.UFN_INSTALLMENT_GETINSTALLMENTS_2_FROMITEMLISTXML(@INSTALLMENTS);

  if @COUNT = 0
    raiserror (
        'INSTALLMENTCOUNT'
        ,13
        ,1
        );

  if @SUM <> @AMOUNT
    raiserror (
        'INSTALLMENTSUM'
        ,13
        ,1
        );

  /* You can only edit posted grant awards here */
  if not exists (
      select 1
      from dbo.REVENUEPOSTED
      where REVENUEPOSTED.ID = @ID
      )
    raiserror (
        'You cannot edit an unposted grant award.'
        ,13
        ,1
        );

  if dbo.UFN_INSTALLMENT_DATESOVERLAP(@INSTALLMENTS) = 1
    raiserror (
        'Installment dates are out of sequence.'
        ,13
        ,1
        );

  if (
      select count(INSTALLMENT.ID)
      from dbo.INSTALLMENT
      inner join dbo.UFN_INSTALLMENT_GETINSTALLMENTS_2_FROMITEMLISTXML(@INSTALLMENTS) XMLINST on INSTALLMENT.ID = XMLINST.ID
      where XMLINST.AMOUNT < XMLINST.APPLIED
      ) > 0
    raiserror (
        'GRANTAWARDPAYMENT_INSTALLMENTAPPLIED'
        ,13
        ,1
        );

    if exists (
        select 1
        from dbo.INSTALLMENT
        inner join dbo.UFN_INSTALLMENT_GETINSTALLMENTS_2_FROMITEMLISTXML(@INSTALLMENTS) XMLINST on INSTALLMENT.ID = XMLINST.ID
        where XMLINST.Date < @DATE
        )
      raiserror (
          'CK_INSTALLMENT_STARTDATEVALID2'
          ,13
          ,1
          );  

  declare @DONOTPOST bit;

  set @DONOTPOST = case @POSTSTATUSCODE
      when 2
        then 1
      else 0
      end;

  /* Check if currency values changed */
  if exists (
      select 1
      from dbo.REVENUE
      where REVENUE.ID = @ID
        and (
          REVENUE.TRANSACTIONAMOUNT <> @AMOUNT
          or REVENUE.AMOUNT <> @BASEAMOUNT
          or REVENUE.ORGANIZATIONAMOUNT <> @ORGANIZATIONAMOUNT
          or REVENUE.BASEEXCHANGERATEID <> @BASEEXCHANGERATEID
          or REVENUE.ORGANIZATIONEXCHANGERATEID <> @ORGANIZATIONEXCHANGERATEID
          or REVENUE.TRANSACTIONCURRENCYID <> @TRANSACTIONCURRENCYID
          or REVENUE.BASECURRENCYID <> @BASECURRENCYID
          )
      )
  begin
    set @ADJUST = 1;
    set @CLEARGLDISTRIBUTION = 1;
  end

  -- check to see if designations have changed

  if dbo.UFN_CHECKDETAIL_SPLITSCHANGED(@ID, @SPLITS) = 1
  begin
    set @ADJUST = 1;
    set @CLEARGLDISTRIBUTION = 1;
    set @REACKNOWLEDGEFIELDCHANGED = 1;
  end

  -- check to see if installments have changed

  if @CLEARGLDISTRIBUTION = 0
  begin
    if dbo.UFN_CHECKDETAIL_INSTALLMENTSCHANGED(@ID, @INSTALLMENTS) = 1
    begin
      set @ADJUST = 1;
      set @CLEARGLDISTRIBUTION = 1;
    end
  end

  declare @OLDCATEGORYCODEID uniqueidentifier

  select top 1 @OLDCATEGORYCODEID = REVENUECATEGORY.GLREVENUECATEGORYMAPPINGID
  from dbo.REVENUECATEGORY
  inner join dbo.REVENUESPLIT on REVENUECATEGORY.ID = REVENUESPLIT.ID
  where REVENUESPLIT.REVENUEID = @ID;

  /* Check if revenue category changed */
  if (
      @CATEGORYCODEID is null
      and @OLDCATEGORYCODEID is not null
      )
    or (
      @CATEGORYCODEID is not null
      and @OLDCATEGORYCODEID is null
      )
    or (@CATEGORYCODEID <> @OLDCATEGORYCODEID)
  begin
    set @ADJUST = 1;
    set @CLEARGLDISTRIBUTION = 1;
  end

  /* Already adjusted */
  if @ADJUST = 0
    if (
        select COUNT(ADJUSTMENT.ID)
        from dbo.ADJUSTMENT
        where REVENUEID = @ID
          and POSTSTATUSCODE = 1
        ) > 0
      set @ADJUST = 1

  /* If there was a change to GL related data log an adjustment */
  if @ADJUST = 1
  begin
    if @ADJUSTMENTREASONCODEID is null
      raiserror (
          'BBERR_ADJUSTMENTREASONCODEIDREQUIRED'
          ,13
          ,1
          )

    exec dbo.USP_SAVE_ADJUSTMENT @ID
      ,@ADJUSTMENTID output
      ,@CHANGEAGENTID
      ,@CURRENTDATE
      ,@ADJUSTMENTDATE
      ,@ADJUSTMENTPOSTDATE
      ,@ADJUSTMENTREASON
      ,default
      ,@ADJUSTMENTREASONCODEID;
  end

  -- check to see if the revenue record needs to be re-acknowledged                            

  if (
      coalesce((
          select top 1 REACKNOWLEDGEREVENUE
          from dbo.ACKNOWLEDGEMENTPREFERENCE
          ), 0)
      ) = 1
  begin
    -- check to see if amount have changed

    if @REACKNOWLEDGEFIELDCHANGED = 0
      if (
          select count(REVENUE.ID)
          from dbo.REVENUE
          where REVENUE.ID = @ID
            and TRANSACTIONAMOUNT = @AMOUNT
          ) = 0
        set @REACKNOWLEDGEFIELDCHANGED = 1;

    -- if a field has changed, mark the revenue letters for this record out of date, if necessary

    if @REACKNOWLEDGEFIELDCHANGED = 1
      exec dbo.USP_REVENUELETTER_SETREACKNOWLEDGEMENTS @ID
        ,@CHANGEAGENTID;
  end

  update dbo.REVENUE
  set [DATE] = @DATE
    ,DONOTPOST = @DONOTPOST
    ,POSTDATE = @POSTDATE
    ,AMOUNT = @BASEAMOUNT
    ,DONOTACKNOWLEDGE = @DONOTACKNOWLEDGE
    ,CHANGEDBYID = @CHANGEAGENTID
    ,DATECHANGED = @CURRENTDATE
    ,ISREIMBURSABLE = @ISREIMBURSABLE
    ,BASECURRENCYID = @BASECURRENCYID
    ,ORGANIZATIONAMOUNT = @ORGANIZATIONAMOUNT
    ,TRANSACTIONAMOUNT = @AMOUNT
    ,BASEEXCHANGERATEID = @BASEEXCHANGERATEID
    ,ORGANIZATIONEXCHANGERATEID = @ORGANIZATIONEXCHANGERATEID
  where ID = @ID;

  update dbo.REVENUESCHEDULE
  set FREQUENCYCODE = @FREQUENCYCODE
    ,NUMBEROFINSTALLMENTS = @COUNT
    ,NEXTTRANSACTIONDATE = @NEXTTRANSACTIONDATE
    ,CHANGEDBYID = @CHANGEAGENTID
    ,DATECHANGED = @CURRENTDATE
  from dbo.REVENUESCHEDULE
  where REVENUESCHEDULE.ID = @ID;

  -- Cache the old split and recognition values for recognition updates

  declare @OLDSPLITS xml = dbo.UFN_REVENUE_GETSPLITS_2_TOITEMLISTXML(@ID);
  declare @OLDRECOGNITIONS xml = dbo.UFN_REVENUE_GETRECOGNITIONS_FORREVENUE_TOITEMLISTXML(@ID);

  declare @SPLITSCHANGED bit

  set @SPLITSCHANGED = dbo.UFN_CHECKDETAIL_SPLITSCHANGED(@ID, @SPLITS)
  -- Multicurrency - Process the splits xml to calculate the base and organization amounts and place them in proper nodes.

  set @SPLITS = dbo.UFN_REVENUESPLIT_CONVERTAMOUNTSINXML(@SPLITS, @BASECURRENCYID, @ORGANIZATIONEXCHANGERATEID, @TRANSACTIONCURRENCYID, @BASEEXCHANGERATEID);

  exec dbo.USP_REVENUE_GETSPLITS_2_UPDATEFROMXML @ID
    ,@SPLITS
    ,@CHANGEAGENTID
    ,@CURRENTDATE;

  -- Update recognition credits based on user selected option

  exec dbo.USP_REVENUE_UPDATERECOGNITION @ID
    ,@OLDSPLITS
    ,@UPDATERECOGNITIONOPTION
    ,@CHANGEAGENTID
    ,@CURRENTDATE
    ,@OLDRECOGNITIONS;

  exec dbo.USP_REVENUE_UPDATESOLICITORS @ID
    ,@CHANGEAGENTID
    ,@CURRENTDATE;

  -- Multicurrency - Pass in multicurrency information so we can convert the amount in the xml 

  -- once installment splits are pulled out of their installments.

    -- writeoffs without a payment will use pledge reason codes so that reversals fire correctly

    declare @ADJ_DATE datetime = ISNULL(@ADJPAYMENT_DATE,@ADJUSTMENTDATE);
    declare @ADJ_POSTDATE datetime = ISNULL(@ADJPAYMENT_POSTDATE,@ADJUSTMENTPOSTDATE);
    declare @ADJ_REASONCODEID uniqueidentifier = ISNULL(NULLIF(@ADJPAYMENT_REASONCODEID,@EMPTYGUID),@ADJUSTMENTREASONCODEID); 
    declare @ADJ_REASON nvarchar(300) = ISNULL(@ADJPAYMENT_DETAILS,@ADJUSTMENTREASON);  

  exec dbo.USP_PLEDGE_UPDATEINSTALLMENT3 @ID
    ,@INSTALLMENTS
    ,@CHANGEAGENTID
    ,@CURRENTDATE
    ,@ADJ_DATE
    ,@ADJ_POSTDATE
    ,@ADJ_REASONCODEID
    ,@ADJ_REASON
    ,@BASECURRENCYID
    ,@ORGANIZATIONEXCHANGERATEID
    ,@TRANSACTIONCURRENCYID
    ,@BASEEXCHANGERATEID;

  exec dbo.USP_REVENUECATEGORY_UPDATESPLITS @ID
    ,@CATEGORYCODEID
    ,@CHANGEAGENTID
    ,@CURRENTDATE;

  if (@OPPORTUNITYID is not null)
    and (@OPPORTUNITYID <> '00000000-0000-0000-0000-000000000000')
  begin
    -- Only update if opportunity is newly associated.

    if not exists (
        select REVENUEOPPORTUNITY.ID
        from dbo.REVENUEOPPORTUNITY
        inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = REVENUEOPPORTUNITY.ID
        where REVENUEID = @ID
          and OPPORTUNITYID = @OPPORTUNITYID
        )
    begin
      --Pull in default solicitors before changing the opportunity record.

      exec dbo.USP_REVENUE_PULLSOLICITORSFROMOPPORTUNITY @ID
        ,@OPPORTUNITYID
        ,@CHANGEAGENTID
        ,@CURRENTDATE

      delete REVENUEOPPORTUNITY
      from dbo.REVENUEOPPORTUNITY
      inner join dbo.REVENUESPLIT on REVENUESPLIT.ID = REVENUEOPPORTUNITY.ID
      where REVENUESPLIT.REVENUEID = @ID

      insert into dbo.REVENUEOPPORTUNITY (
        ID
        ,OPPORTUNITYID
        ,ADDEDBYID
        ,CHANGEDBYID
        ,DATEADDED
        ,DATECHANGED
        )
      select ID
        ,@OPPORTUNITYID
        ,@CHANGEAGENTID
        ,@CHANGEAGENTID
        ,@CURRENTDATE
        ,@CURRENTDATE
      from dbo.REVENUESPLIT
      where REVENUEID = @ID

      exec dbo.USP_OPPORTUNITY_UPDATEACCEPTEDSTATUS @OPPORTUNITYID
        ,@DATE
        ,@CHANGEAGENTID
        ,@CURRENTDATE
    end
  end
  else
  begin
    exec dbo.USP_REVENUE_PULLSOLICITORSFROMFUNDINGREQUEST_ONLYNEWSPLITS @SPLITS
      ,@ID
      ,@CHANGEAGENTID
      ,@CURRENTDATE;
  end


  --MMR not sure we still need this?

  --exec dbo.USP_PLEDGE_FIXDEPENDENTSPLITS @ID

    --,@CHANGEAGENTID

    --,@CURRENTDATE;


  /* USP_PLEDGE_UPDATEINSTALLMENT3 has to update the writeoffs, so USP_REVENUE_UPDATEWRITEOFFS should not be called
  exec dbo.USP_REVENUE_UPDATEWRITEOFFS @ID
    ,@CHANGEAGENTID
    ,@CURRENTDATE
    ,@ADJPAYMENT_DATE
    ,@ADJPAYMENT_POSTDATE
    ,@ADJPAYMENT_REASONCODEID
    ,@ADJPAYMENT_DETAILS
    ,@CLEARGLDISTRIBUTION
  */
  -- clear the user-defined gl distributions

  if @CLEARGLDISTRIBUTION = 1
  begin
    -- Clear GL

    delete
    from dbo.REVENUEGLDISTRIBUTION
    where REVENUEID = @ID
      and OUTDATED = 0;

    -- Add new GL distributions

    if @POSTSTATUSCODE <> 2
      exec dbo.USP_SAVE_REVENUEGLDISTRIBUTION @ID
        ,@CHANGEAGENTID
        ,@CURRENTDATE;
  end

  exec dbo.USP_PLEDGE_VALIDATE @ID;

  if @SPLITSCHANGED = 1
    exec dbo.USP_PLEDGE_CLEARANDADDCAMPAIGNS @ID
      ,null
      ,@CHANGEAGENTID
      ,@CURRENTDATE;

  if @ADJUST = 1 /*call USP_ADJUSTMENTHISTORY_REVENUE_SAVEHISTORY after the revenue tables are updated */
    exec dbo.USP_ADJUSTMENTHISTORY_REVENUE_SAVEHISTORY @ID
      ,@CHANGEAGENTID
      ,null
      ,@ADJUSTMENTID;

  -- Multicurrency - If we stored an old spot rate earlier, now is the time to remove it.

  if @OLDSPOTRATE is not null
  begin
    --RobertDi 11/23/2010 - The currency exchange rate may be used elsewhere.

    begin try
      delete CURRENCYEXCHANGERATE
      where ID = @OLDSPOTRATE
    end try

    begin catch
    end catch
  end
end try

begin catch
  --reset CONTEXT_INFO to previous value

  if not @contextCache is null
    set CONTEXT_INFO @contextCache;

  exec dbo.USP_RAISE_ERROR;

  return 1;
end catch

--reset CONTEXT_INFO to previous value

if not @contextCache is null
  set CONTEXT_INFO @contextCache;

return 0;