UFN_PLEDGE_CALCULATERECEIPTAMOUNT

Return

Return Type
money

Parameters

Parameter Parameter Type Mode Description
@PLEDGEID uniqueidentifier IN
@AMOUNT money IN
@OVERPAYMENTAPPLICATIONTYPECODE tinyint IN

Definition

Copy


create function dbo.UFN_PLEDGE_CALCULATERECEIPTAMOUNT
(
    @PLEDGEID uniqueidentifier,
    @AMOUNT money,
  @OVERPAYMENTAPPLICATIONTYPECODE tinyint = null
)
returns money
as
begin

  if @OVERPAYMENTAPPLICATIONTYPECODE is null
    set @OVERPAYMENTAPPLICATIONTYPECODE = coalesce(dbo.UFN_PLEDGE_GETDEFAULTOVERPAYMENTAPPLICATIONCODE(), 255);
  if not @OVERPAYMENTAPPLICATIONTYPECODE in (0, 1, 255)
    set @OVERPAYMENTAPPLICATIONTYPECODE = 1;

   --Overpayment option to pay pledge balance, so pay first installment as usual, then pay from last installment forward

  if @OVERPAYMENTAPPLICATIONTYPECODE = 0
  begin
      --Find the minimum valid sequence number to be paid

      declare @MINSEQUENCE integer;
      select @MINSEQUENCE = min(INSTALLMENT.SEQUENCE
          from dbo.INSTALLMENTSPLIT
          inner join dbo.INSTALLMENT
              on INSTALLMENTSPLIT.INSTALLMENTID = INSTALLMENT.ID
          where
                        (
              dbo.UFN_INSTALLMENT_GETINSTALLMENTSPLITBALANCE(INSTALLMENTSPLIT.ID) > 0 or
                          (
                              -- WI 191314: $0 pledges can have $0 installments that need to be included

                              -- so the link between the pledge and payment isn't broken

                              INSTALLMENT.AMOUNT = 0 and
                              @AMOUNT = 0
                          )
            )
                        and INSTALLMENT.REVENUEID = @PLEDGEID;

      --Find a sequence number above valid installments for this pledge

      declare @PAYFIRSTSEQUENCE integer;
      select @PAYFIRSTSEQUENCE = (MAX(SEQUENCE) + 1) from [dbo].[UFN_PLEDGE_GETINSTALLMENTS](@PLEDGEID)

      declare INSTALLMENTCURSOR cursor local fast_forward for
          select
              INSTALLMENT.ID, 
              INSTALLMENT.TRANSACTIONAMOUNT as AMOUNT,
              dbo.UFN_INSTALLMENT_GETINSTALLMENTAMOUNTAPPLIED(INSTALLMENT.ID) as APPLIED,
              dbo.UFN_INSTALLMENT_GETINSTALLMENTBALANCE(INSTALLMENT.ID) [BALANCE],
              INSTALLMENT.TRANSACTIONRECEIPTAMOUNT as RECEIPTAMOUNT,
              case
                  when INSTALLMENT.TRANSACTIONRECEIPTAMOUNT > dbo.UFN_INSTALLMENT_GETINSTALLMENTBALANCE(INSTALLMENT.ID)
                      then INSTALLMENT.TRANSACTIONRECEIPTAMOUNT - dbo.UFN_INSTALLMENT_GETINSTALLMENTBALANCE(INSTALLMENT.ID)
                  else 0
              end as RECEIPTAPPLIED
          from
              dbo.INSTALLMENT
          where
              (
                  dbo.UFN_INSTALLMENT_GETINSTALLMENTBALANCE(INSTALLMENT.ID) > 0 or
                  (
                      -- WI 191314: $0 pledges can have $0 installments that need to be included

                      -- so the link between the pledge and payment isn't broken

                      INSTALLMENT.AMOUNT = 0 and
                      @AMOUNT = 0
                  )
              )
              and INSTALLMENT.REVENUEID = @PLEDGEID
          order by 
              case
                  --mark the first installment to pay with the highest sequence

                  when SEQUENCE = @MINSEQUENCE then @PAYFIRSTSEQUENCE
                  else SEQUENCE 
              end desc;
   end
  --No overpayment option or overpay to next installments, so pay installments in order

  else
  begin
      declare INSTALLMENTCURSOR cursor local fast_forward for
          select 
              INSTALLMENT.ID, 
              INSTALLMENT.TRANSACTIONAMOUNT as AMOUNT,
              dbo.UFN_INSTALLMENT_GETINSTALLMENTAMOUNTAPPLIED(INSTALLMENT.ID) as APPLIED,
              dbo.UFN_INSTALLMENT_GETINSTALLMENTBALANCE(INSTALLMENT.ID) [BALANCE],
              INSTALLMENT.TRANSACTIONRECEIPTAMOUNT as RECEIPTAMOUNT,
              case
                  when INSTALLMENT.TRANSACTIONRECEIPTAMOUNT > dbo.UFN_INSTALLMENT_GETINSTALLMENTBALANCE(INSTALLMENT.ID)
                      then INSTALLMENT.TRANSACTIONRECEIPTAMOUNT - dbo.UFN_INSTALLMENT_GETINSTALLMENTBALANCE(INSTALLMENT.ID)
                  else 0
              end as RECEIPTAPPLIED
          from
              dbo.INSTALLMENT
          where
              (
                  dbo.UFN_INSTALLMENT_GETINSTALLMENTBALANCE(ID) > 0 or
                  (
                      -- WI 191314: $0 pledges can have $0 installments that need to be included

                      -- so the link between the pledge and payment isn't broken

                      INSTALLMENT.AMOUNT = 0 and
                      @AMOUNT = 0
                  )
              )
              and INSTALLMENT.REVENUEID = @PLEDGEID
          order by
              SEQUENCE asc;
  end


  declare @INSTALLMENTID uniqueidentifier;
  declare @INSTALLMENTAMOUNT money;
  declare @INSTALLMENTAPPLIED money;
  declare @INSTALLMENTBALANCE money;
  declare @INSTALLMENTRECEIPTAMOUNT money;
  declare @INSTALLMENTRECEIPTAPPLIED money;

  declare @ROLLINGAMOUNT money = @AMOUNT;
  declare @INSTALLMENTAMOUNTTOPAY money = 0;
  declare @ROLLINGRECEIPTAMOUNT money = 0;

  open INSTALLMENTCURSOR;
  fetch next from INSTALLMENTCURSOR into @INSTALLMENTID, @INSTALLMENTAMOUNT, @INSTALLMENTAPPLIED, @INSTALLMENTBALANCE, @INSTALLMENTRECEIPTAMOUNT, @INSTALLMENTRECEIPTAPPLIED;
  while @@FETCH_STATUS = 0
  begin

    if @ROLLINGAMOUNT <= 0
      break;

    select
      @INSTALLMENTAMOUNTTOPAY = min(AMOUNT)
    from
      (values (@INSTALLMENTBALANCE), (@ROLLINGAMOUNT)) as ALLAMOUNTS(AMOUNT) ;

    if @INSTALLMENTAMOUNTTOPAY < @INSTALLMENTBALANCE
    begin
      declare @TOTALAMOUNTAPPLIED money = @INSTALLMENTAPPLIED + @INSTALLMENTAMOUNTTOPAY;
      declare @BENEFITAMOUNT money = @INSTALLMENTAMOUNT - @INSTALLMENTRECEIPTAMOUNT;

      select
        @ROLLINGRECEIPTAMOUNT = @ROLLINGRECEIPTAMOUNT + max(AMOUNT)
      from
        (values (@TOTALAMOUNTAPPLIED - @BENEFITAMOUNT - @INSTALLMENTRECEIPTAPPLIED), (0)) as ALLAMOUNTS(AMOUNT);
    end
    else
    begin
      set @ROLLINGRECEIPTAMOUNT = @ROLLINGRECEIPTAMOUNT + (@INSTALLMENTRECEIPTAMOUNT - @INSTALLMENTRECEIPTAPPLIED);
    end

    set @ROLLINGAMOUNT = @ROLLINGAMOUNT - @INSTALLMENTAMOUNTTOPAY;

    fetch next from INSTALLMENTCURSOR into @INSTALLMENTID, @INSTALLMENTAMOUNT, @INSTALLMENTAPPLIED, @INSTALLMENTBALANCE, @INSTALLMENTRECEIPTAMOUNT, @INSTALLMENTRECEIPTAPPLIED;
  end

  close INSTALLMENTCURSOR;
  deallocate INSTALLMENTCURSOR;

  return @ROLLINGRECEIPTAMOUNT;

end