UFN_RECURRINGGIFT_GETPAYMENTUIFIELDS

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@RECURRINGGIFTID uniqueidentifier IN
@NEXTINSTALLMENTDUE money IN
@PASTDUE money IN
@NEXTINSTALLMENTDATE date IN
@EFFECTIVEDATE datetime IN
@IGNOREPAYMENTID uniqueidentifier IN

Definition

Copy


CREATE function dbo.UFN_RECURRINGGIFT_GETPAYMENTUIFIELDS(
  @RECURRINGGIFTID uniqueidentifier,
  @NEXTINSTALLMENTDUE money,
  @PASTDUE money,
  @NEXTINSTALLMENTDATE date,
  @EFFECTIVEDATE datetime,
  @IGNOREPAYMENTID uniqueidentifier
)
returns table
as return
with BASE as (
  select OVERPAYMENTCODE,
         INSTALLMENTUNDERPAYMENTCODE,
         FIRSTINSTALLMENTCODE,
         APPLYTOPASTINSTALLMENTS,
         PASTBALANCEUNDERPAYMENTCODE,
         case when OVERPAYMENTCODE > 0 then
           case APPLYTOPASTINSTALLMENTS when 0 then @NEXTINSTALLMENTDUE else isnull(nullif(@PASTDUE,0),@NEXTINSTALLMENTDUE) end
         end as ACTIONABOVEAMOUNT,
         case when (INSTALLMENTUNDERPAYMENTCODE = 1 and @NEXTINSTALLMENTDATE <= cast(@EFFECTIVEDATE as date)) or INSTALLMENTUNDERPAYMENTCODE = 2 then
           case APPLYTOPASTINSTALLMENTS
             when 0 then
               case when PASTBALANCEUNDERPAYMENTCODE = 0 then @NEXTINSTALLMENTDUE
                   when @PASTDUE > @NEXTINSTALLMENTDUE then -1  -- underpayment action will happen no matter what

               end
             when 1 then
               case PASTBALANCEUNDERPAYMENTCODE
                 when 0 then -2   -- multiple amounts possible, create list below

                 else @PASTDUE
               end
           end
         end as ACTIONBELOWAMOUNT,
         ISRGPAYMENTHANDLINGBATCH
  from dbo.UFN_RECURRINGGIFTSETTING(case when @IGNOREPAYMENTID is null then null else @EFFECTIVEDATE end)
)
select ACTIONABOVEAMOUNT,
       OVERPAYMENTCODE,
       case
         when ACTIONBELOWAMOUNT = -2 then
           (
             -- get the balances of the individual installments

             -- SEQ will indicate the order money will be applied to the installments according to the rule

             select sum(i.BALANCE) as AMOUNT
             from (
               select b.BALANCE as BALANCE,
                      row_number() over(order by case when FIRSTINSTALLMENTCODE = 0 then i.DATE end,
                                                 case when FIRSTINSTALLMENTCODE = 1 then i.DATE end desc) SEQ
               from dbo.V_RECURRINGGIFTINSTALLMENT i
               cross apply (select case when @IGNOREPAYMENTID is null then i.BALANCE else dbo.UFN_RECURRINGGIFTINSTALLMENT_GETINSTALLMENTBALANCEIGNOREPAYMENT(i.ID, @IGNOREPAYMENTID) end BALANCE) as b
               where i.REVENUEID = @RECURRINGGIFTID
               and i.DATE <= cast(@EFFECTIVEDATE as date)
               and b.BALANCE > 0
             ) i
             -- join to NUMBERS table in order to add in the balances of all previous installments when determining the amount

             -- required to pay off any given installment (we don't want $5, $5, $5 in the XML, we want $5, $10, $15)

             -- In the $5/$5/$5 example, we will match rows for NUM 1, 2, and 3.  The row for NUM 1 will include only the first

             -- installment, summing to $5.  The row for NUM 2 will include the first two, summing to $10.  Etc.

             cross apply dbo.NUMBERS n
             where n.NUM > 0
             and i.SEQ <= n.NUM
             group by n.NUM having n.NUM <= max(i.SEQ)
             order by n.NUM
             for xml raw('ITEM'),type,elements,root('ACTIONBELOWAMOUNTS'),BINARY BASE64
           )
         when ACTIONBELOWAMOUNT is not null then
           (
             select ACTIONBELOWAMOUNT as AMOUNT
             for xml raw('ITEM'),type,elements,root('ACTIONBELOWAMOUNTS'),BINARY BASE64
           )
       end as ACTIONBELOWAMOUNTS,
       INSTALLMENTUNDERPAYMENTCODE,
       APPLYTOPASTINSTALLMENTS,
       PASTBALANCEUNDERPAYMENTCODE,
       ISRGPAYMENTHANDLINGBATCH
from BASE