USP_REVENUE_UPDATEWRITEOFFS

Parameters

Parameter Parameter Type Mode Description
@REVENUEID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@CURRENTDATE datetime IN
@ADJWRITEOFF_DATE datetime IN
@ADJWRITEOFF_POSTDATE datetime IN
@ADJWRITEOFF_REASONCODEID uniqueidentifier IN
@ADJWRITEOFF_DETAILS nvarchar(255) IN
@CLEARWRITEOFFGLDISTRIBUTION bit IN

Definition

Copy


CREATE procedure dbo.USP_REVENUE_UPDATEWRITEOFFS
(
    @REVENUEID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier,
    @CURRENTDATE datetime,
    @ADJWRITEOFF_DATE datetime = null,
    @ADJWRITEOFF_POSTDATE datetime = null,
    @ADJWRITEOFF_REASONCODEID uniqueidentifier = null,
    @ADJWRITEOFF_DETAILS nvarchar(255) = null,
  @CLEARWRITEOFFGLDISTRIBUTION bit = null
)
as 
begin
    set nocount on;

  declare @UPDATEINSTALLMENTWRITEOFFS bit = 1;

    if @ADJWRITEOFF_DATE is null and @ADJWRITEOFF_POSTDATE is null and @ADJWRITEOFF_REASONCODEID is null and @ADJWRITEOFF_DETAILS is null
    begin
        set @UPDATEINSTALLMENTWRITEOFFS = 0
    end

  set @CLEARWRITEOFFGLDISTRIBUTION=COALESCE(@CLEARWRITEOFFGLDISTRIBUTION,0);

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

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

    --cache the current Write-off info

    declare @WriteOffInstallmentAmounts table (WriteOffID uniqueidentifier, InstallmentID uniqueidentifier, WriteoffAmount money)
    insert into @WriteOffInstallmentAmounts (WriteOffID, InstallmentID, WriteoffAmount)
    select INSTALLMENTSPLITWRITEOFF.WRITEOFFID, INSTALLMENTSPLIT.INSTALLMENTID, sum(INSTALLMENTSPLITWRITEOFF.TRANSACTIONAMOUNT)
    from dbo.INSTALLMENTSPLIT inner join dbo.INSTALLMENTSPLITWRITEOFF on INSTALLMENTSPLIT.ID = INSTALLMENTSPLITWRITEOFF.INSTALLMENTSPLITID
    where INSTALLMENTSPLIT.PLEDGEID = @REVENUEID
    group by INSTALLMENTSPLITWRITEOFF.WRITEOFFID, INSTALLMENTSPLIT.INSTALLMENTID

  --Update writeoffs

  declare @WRITEOFFID uniqueidentifier;
  declare @WRITEOFFIDTABLE UDT_GENERICID;

  insert into @WRITEOFFIDTABLE
  select ID
  from dbo.FINANCIALTRANSACTION
  where PARENTID = @REVENUEID
  and TYPECODE = 20 --writeoff

  and DELETEDON is null;

  declare @WRITEOFFCURSOR cursor;
  set @WRITEOFFCURSOR = cursor local fast_forward for
  select ID
  from @WRITEOFFIDTABLE

  open @WRITEOFFCURSOR;
  fetch next from @WRITEOFFCURSOR 
    into @WRITEOFFID;

  while @@FETCH_STATUS = 0 
    begin
       declare @WRITEOFFINSTALLMENTS xml = (
            select 
                ID, 
                DATE,
                WRITEOFFINSTALLMENT.TRANSACTIONAMOUNT as AMOUNT,
                BALANCE,
                        t1.WRITEOFFAMOUNT,
                SEQUENCE,
                TRANSACTIONCURRENCYID
            from dbo.UFN_WRITEOFF_GETINSTALLMENTSFOREDIT(@WRITEOFFID) WRITEOFFINSTALLMENT left join @WriteOffInstallmentAmounts t1 on WRITEOFFINSTALLMENT.ID = t1.InstallmentID
            for xml raw('ITEM'),type,elements,root('INSTALLMENTS'),BINARY BASE64
        );

        declare @WRITEOFFTOTALAMOUNT money = (
            select sum(WRITEOFFAMOUNT) 
            from @WriteOffInstallmentAmounts 
            where WRITEOFFID =@WRITEOFFID
        );

            exec dbo.USP_INSTALLMENT_WRITEOFFINSTALLMENTS @WRITEOFFID, @WRITEOFFTOTALAMOUNT, @CHANGEAGENTID, @CURRENTDATE, 1, @WRITEOFFINSTALLMENTS;

          if @CLEARWRITEOFFGLDISTRIBUTION = 1
              exec dbo.USP_WRITEOFF_FIXSPLITS @WRITEOFFID, @REVENUEID, @CHANGEAGENTID, @CURRENTDATE;

      fetch next from @WRITEOFFCURSOR 
        into @WRITEOFFID;            

    end

  deallocate @WRITEOFFCURSOR;

  declare @ADJUSTEDWRITEOFFS table(WRITEOFFID uniqueidentifier, ADJUSTMENTID uniqueidentifier);

  /* Adjust any write-offs for this pledge. */
  if @CLEARWRITEOFFGLDISTRIBUTION = 1
    begin
      if exists (select 1 from dbo.JOURNALENTRY 
                      inner join dbo.JOURNALENTRY_EXT on JOURNALENTRY_EXT.ID = JOURNALENTRY.ID 
                      inner join dbo.FINANCIALTRANSACTIONLINEITEM on JOURNALENTRY.FINANCIALTRANSACTIONLINEITEMID = FINANCIALTRANSACTIONLINEITEM.ID
                      inner join dbo.FINANCIALTRANSACTION on FINANCIALTRANSACTIONLINEITEM.FINANCIALTRANSACTIONID = FINANCIALTRANSACTION.ID
                      where FINANCIALTRANSACTION.PARENTID = @REVENUEID
                      and FINANCIALTRANSACTION.TYPECODE = 20    --writeoff

                      and JOURNALENTRY_EXT.OUTDATED = 0  
                      and FINANCIALTRANSACTIONLINEITEM.TYPECODE = 0) --standard

        begin

          declare WRITEOFFCURSOR cursor local fast_forward for
          select WRITEOFF.ID from dbo.WRITEOFF where REVENUEID = @REVENUEID;

          open WRITEOFFCURSOR;
          fetch next from WRITEOFFCURSOR into @WRITEOFFID;

          while @@FETCH_STATUS = 0
            begin

              declare @WRITEOFFADJUSTMENTID uniqueidentifier=null;

              exec dbo.USP_SAVE_WRITEOFFADJUSTMENT @WRITEOFFID, @WRITEOFFADJUSTMENTID output, @CHANGEAGENTID, @CURRENTDATE, @ADJWRITEOFF_DATE, @ADJWRITEOFF_POSTDATE, @ADJWRITEOFF_DETAILS, @ADJWRITEOFF_REASONCODEID;

              --Save adjustment IDs for adjustment history

              insert into @ADJUSTEDWRITEOFFS(WRITEOFFID,ADJUSTMENTID) values (@WRITEOFFID,@WRITEOFFADJUSTMENTID);

              fetch next from WRITEOFFCURSOR into @WRITEOFFID;    

            end

          close WRITEOFFCURSOR;
          deallocate WRITEOFFCURSOR;

        end

    end

    -- Save the adjustment history for any write-offs

    if (select count(*) from @ADJUSTEDWRITEOFFS) > 0
      begin
        declare @HISTORYWRITEOFFID uniqueidentifier;
        declare @HISTORYADJUSTMENTID uniqueidentifier;

        /* Cursor to use for logging history adjustments */
        declare HISTORYCURSOR cursor local fast_forward for
        select WRITEOFFID, ADJUSTMENTID from @ADJUSTEDWRITEOFFS

        open HISTORYCURSOR;
        fetch next from HISTORYCURSOR into @HISTORYWRITEOFFID, @HISTORYADJUSTMENTID;

        while @@FETCH_STATUS = 0 
          begin
            if @HISTORYADJUSTMENTID is not null
              exec dbo.USP_ADJUSTMENTHISTORY_WRITEOFF_SAVEHISTORY @HISTORYWRITEOFFID, @CHANGEAGENTID, null, @HISTORYADJUSTMENTID;

            fetch next from HISTORYCURSOR into @HISTORYWRITEOFFID, @HISTORYADJUSTMENTID;
          end

        close HISTORYCURSOR;
        deallocate HISTORYCURSOR;

      end

    -- clear the user-defined gl distributions

    if (@CLEARWRITEOFFGLDISTRIBUTION = 1)
      begin
        delete from dbo.WRITEOFFGLDISTRIBUTION where WRITEOFFID in (select WO.ID from dbo.WRITEOFF WO where WO.REVENUEID = @REVENUEID) and OUTDATED = 0;

        -- Add new writeoff GL distributions if appropriate

        if exists(select ID
                  from dbo.FINANCIALTRANSACTION
                  where PARENTID = @REVENUEID
                  and TYPECODE = 20 --writeoff

                  and POSTSTATUSCODE=1 --not posted

                  and DELETEDON is null)
          begin
            if (dbo.UFN_VALID_BASICGL_INSTALLED() = 1
              begin
                exec dbo.USP_SAVE_PLEDGEWRITEOFFGLDISTRIBUTION @REVENUEID, @WRITEOFFIDTABLE, @CHANGEAGENTID, @CURRENTDATE;
              end
            else 
              begin
                exec dbo.USP_SAVE_WRITEOFFGLDISTRIBUTION @REVENUEID, @CHANGEAGENTID, @CURRENTDATE;
              end
          end
      end

end