UFN_SALESDEPOSITTEMPLATE_UNLINKEDRECONCILEDPAYMENTS_GETCASHDIFFERENCE_3
Return
Return Type |
---|
money |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SALESDEPOSITTEMPLATEID | uniqueidentifier | IN | |
@TRANSACTIONDATE | date | IN | |
@PAYMENTDATE | date | IN |
Definition
Copy
CREATE function dbo.UFN_SALESDEPOSITTEMPLATE_UNLINKEDRECONCILEDPAYMENTS_GETCASHDIFFERENCE_3
(
@SALESDEPOSITTEMPLATEID uniqueidentifier,
@TRANSACTIONDATE date,
@PAYMENTDATE date
)
returns money
as begin
declare @CASHDIFFERENCE money = 0
declare @SALESCHANNELOPTIONCODE tinyint
select @SALESCHANNELOPTIONCODE = SALESCHANNELOPTIONCODE
from dbo.SALESDEPOSITTEMPLATE
where ID = @SALESDEPOSITTEMPLATEID;
if dbo.UFN_SALESDEPOSITTEMPLATE_HASPAYMENTMETHOD(@SALESDEPOSITTEMPLATEID, 0) = 1
begin
if @TRANSACTIONDATE is not null
begin
declare @PAYMENTCASHTABLE table (
RECONCILIATIONID uniqueidentifier,
AMOUNT money,
GROUPPERIOD tinyint --0, Past; 1, Current; 2, Future
)
insert into @PAYMENTCASHTABLE
select
[RECONCILIATION].[ID],
coalesce(sum([REVENUE].[AMOUNT]), 0),
[GROUP].[PERIOD]
from dbo.[RECONCILIATION]
cross apply (
select PAYMENTID, RECONCILIATIONID, AMOUNT, DEPOSITED
from dbo.SALESORDERPAYMENT with (nolock)
where
SALESORDERPAYMENT.RECONCILIATIONID = RECONCILIATION.ID and
SALESORDERPAYMENT.DONOTRECONCILE = 0
union all
select PAYMENTID, RECONCILIATIONID, AMOUNT, DEPOSITED
from dbo.RESERVATIONSECURITYDEPOSITPAYMENT with (nolock)
where RESERVATIONSECURITYDEPOSITPAYMENT.RECONCILIATIONID = RECONCILIATION.ID
) as [SALESORDERPAYMENT]
inner join dbo.[REVENUE]
on [SALESORDERPAYMENT].[PAYMENTID] = [REVENUE].[ID]
inner join dbo.[REVENUEPAYMENTMETHOD]
on [REVENUE].[ID] = [REVENUEPAYMENTMETHOD].[REVENUEID]
cross apply (select datediff(day,@TRANSACTIONDATE,cast([REVENUE].[DATE] as date)) as [COMPARISON]) as [REVENUETOTRANDATE]
cross apply (
select case
when [REVENUETOTRANDATE].[COMPARISON] < 0 then 0
when [REVENUETOTRANDATE].[COMPARISON] = 0 then 1
when [REVENUETOTRANDATE].[COMPARISON] > 0 then 2
end as [PERIOD]
) as [GROUP]
where
[RECONCILIATION].[STATUSCODE] > 1 and RECONCILIATION.CASHOVERSHORTDEPOSITED = 0 and
[REVENUEPAYMENTMETHOD].[PAYMENTMETHODCODE] = 0
and (@SALESCHANNELOPTIONCODE = 0
or RECONCILIATION.CASHOVERSHORTSALESMETHODCODE in (select SALESMETHODTYPECODE from dbo.SALESDEPOSITTEMPLATESALESCHANNEL where SALESDEPOSITTEMPLATEID = @SALESDEPOSITTEMPLATEID))
and ((@PAYMENTDATE is null) or (CAST (RECONCILIATION.RECONCILIATIONDATE as DATE) <= @PAYMENTDATE))
group by RECONCILIATION.ID, [GROUP].[PERIOD]
declare @CREDITCASHTABLE table (
RECONCILIATIONID uniqueidentifier,
AMOUNT money,
GROUPPERIOD tinyint --0, Past; 1, Current; 2, Future
)
insert into @CREDITCASHTABLE
select
RECONCILIATION.ID,
coalesce(sum([CREDITPAYMENT].[AMOUNT]),0),
[GROUP].[PERIOD]
from dbo.[CREDITPAYMENT]
inner join dbo.[RECONCILIATION]
on [CREDITPAYMENT].[RECONCILIATIONID] = [RECONCILIATION].[ID]
cross apply (select datediff(day,@TRANSACTIONDATE,cast([CREDITPAYMENT].[DATEADDED] as date)) as [COMPARISON]) as [CREDITTOTRANDATE]
cross apply (
select case
when [CREDITTOTRANDATE].[COMPARISON] < 0 then 0
when [CREDITTOTRANDATE].[COMPARISON] = 0 then 1
when [CREDITTOTRANDATE].[COMPARISON] > 0 then 2
end as [PERIOD]
) as [GROUP]
where
[RECONCILIATION].[STATUSCODE] > 1 and RECONCILIATION.CASHOVERSHORTDEPOSITED = 0 and
[CREDITPAYMENT].[PAYMENTMETHODCODE] = 0
and (@SALESCHANNELOPTIONCODE = 0
or RECONCILIATION.CASHOVERSHORTSALESMETHODCODE in (select SALESMETHODTYPECODE from dbo.SALESDEPOSITTEMPLATESALESCHANNEL where SALESDEPOSITTEMPLATEID = @SALESDEPOSITTEMPLATEID))
and ((@PAYMENTDATE is null) or (CAST (RECONCILIATION.RECONCILIATIONDATE as DATE) <= @PAYMENTDATE))
group by RECONCILIATION.ID, [GROUP].[PERIOD]
declare @RECONCILIATIONS table (
ID uniqueidentifier,
TOTAL money,
GROUPPERIOD tinyint --0, Past; 1, Current; 2, Future
)
insert into @RECONCILIATIONS
select
[RECONCILIATION].[ID],
coalesce(PAYMENTCASH.AMOUNT, 0) - coalesce(CREDITCASH.AMOUNT, 0),
[GROUP].[PERIOD]
from dbo.[RECONCILIATION]
cross apply (
select 0 as [PERIOD]
union
select 1
union
select 2
) as [GROUP]
left join @PAYMENTCASHTABLE as [PAYMENTCASH] on
[RECONCILIATION].[ID] = [PAYMENTCASH].[RECONCILIATIONID] and
[GROUP].[PERIOD] = [PAYMENTCASH].[GROUPPERIOD]
left join @CREDITCASHTABLE as [CREDITCASH] on
[RECONCILIATION].[ID] = [CREDITCASH].[RECONCILIATIONID] and
[GROUP].[PERIOD] = [CREDITCASH].[GROUPPERIOD]
where
[RECONCILIATION].[STATUSCODE] > 1 and RECONCILIATION.CASHOVERSHORTDEPOSITED = 0 and
([PAYMENTCASH].[AMOUNT] is not null or [CREDITCASH].[AMOUNT] is not null)
and (@SALESCHANNELOPTIONCODE = 0
or RECONCILIATION.CASHOVERSHORTSALESMETHODCODE in (select SALESMETHODTYPECODE from dbo.SALESDEPOSITTEMPLATESALESCHANNEL where SALESDEPOSITTEMPLATEID = @SALESDEPOSITTEMPLATEID))
and ((@PAYMENTDATE is null) or (CAST (RECONCILIATION.RECONCILIATIONDATE as DATE) <= @PAYMENTDATE))
select @CASHDIFFERENCE = coalesce(sum(
case
--Translation: When there are no future payments/credits and the @TRANSACTIONDATE is the final day of this reconciliation, get that reconciliation's difference
when [FUTUREPERIOD].[TOTAL] is null and ([CURRENTPERIOD].[TOTAL] is not null or ([SUMTOCURRENT].[TOTAL] = 0 and cast([RECONCILIATION].[ORIGINALSUBMISSIONDATE] as date) = @TRANSACTIONDATE))
then [RECONCILIATION].[ACTUALCASH] - [SUMTOCURRENT].[TOTAL]
else 0
end)
,0)
from dbo.[RECONCILIATION]
outer apply(select TOTAL as [TOTAL] from @RECONCILIATIONS where GROUPPERIOD = 0 and [ID] = [RECONCILIATION].[ID]) as PRIORPERIOD
outer apply(select TOTAL as [TOTAL] from @RECONCILIATIONS where GROUPPERIOD = 1 and [ID] = [RECONCILIATION].[ID]) as CURRENTPERIOD
outer apply(select TOTAL as [TOTAL] from @RECONCILIATIONS where GROUPPERIOD = 2 and [ID] = [RECONCILIATION].[ID]) as FUTUREPERIOD
outer apply(select coalesce([PRIORPERIOD].[TOTAL],0) + coalesce([CURRENTPERIOD].[TOTAL],0) as [TOTAL]) as [SUMTOCURRENT]
where [RECONCILIATION].[STATUSCODE] > 1 and RECONCILIATION.CASHOVERSHORTDEPOSITED = 0
and (@SALESCHANNELOPTIONCODE = 0
or RECONCILIATION.CASHOVERSHORTSALESMETHODCODE in (select SALESMETHODTYPECODE from dbo.SALESDEPOSITTEMPLATESALESCHANNEL where SALESDEPOSITTEMPLATEID = @SALESDEPOSITTEMPLATEID))
and ((CAST (RECONCILIATION.RECONCILIATIONDATE as DATE) <= @PAYMENTDATE))
end
else
begin
declare @PAYMENTCASHTOTAL money = 0
declare @CREDITCASHTOTAL money = 0
declare @ACTUALCASHTOTAL money = 0
select @PAYMENTCASHTOTAL = coalesce(sum([REVENUE].[AMOUNT]), 0)
from dbo.[RECONCILIATION]
cross apply (
select ID, SALESORDERID, PAYMENTID, RECONCILIATIONID, AMOUNT, DEPOSITED
from dbo.SALESORDERPAYMENT with (nolock)
where
SALESORDERPAYMENT.RECONCILIATIONID = RECONCILIATION.ID and
SALESORDERPAYMENT.DONOTRECONCILE = 0
union all
select ID, RESERVATIONID as SALESORDERID, PAYMENTID, RECONCILIATIONID, AMOUNT, DEPOSITED
from dbo.RESERVATIONSECURITYDEPOSITPAYMENT with (nolock)
where RESERVATIONSECURITYDEPOSITPAYMENT.RECONCILIATIONID = RECONCILIATION.ID
) as SALESORDERPAYMENT
inner join dbo.[REVENUE]
on [SALESORDERPAYMENT].[PAYMENTID] = [REVENUE].[ID]
inner join dbo.[REVENUEPAYMENTMETHOD]
on [REVENUE].[ID] = [REVENUEPAYMENTMETHOD].[REVENUEID]
where
[RECONCILIATION].[STATUSCODE] > 1 and RECONCILIATION.CASHOVERSHORTDEPOSITED = 0 and
[REVENUEPAYMENTMETHOD].[PAYMENTMETHODCODE] = 0
and (
@SALESCHANNELOPTIONCODE = 0
or RECONCILIATION.CASHOVERSHORTSALESMETHODCODE in (select SALESMETHODTYPECODE from dbo.SALESDEPOSITTEMPLATESALESCHANNEL where SALESDEPOSITTEMPLATEID = @SALESDEPOSITTEMPLATEID)
)
and (
(@PAYMENTDATE is null)
or (
CAST(
(
SELECT
max(FT2.CALCULATEDDATE)
from
dbo.FINANCIALTRANSACTION FT2
left join dbo.SALESORDERPAYMENT SOP2 on FT2.ID = SOP2.PAYMENTID
left join dbo.RESERVATIONSECURITYDEPOSITPAYMENT RSDP2 on RSDP2.PAYMENTID = FT2.ID
inner join RECONCILIATION R2 on SOP2.RECONCILIATIONID = R2.ID or RSDP2.RECONCILIATIONID = R2.ID
where
R2.ID = RECONCILIATION.ID
) as DATE
) <= @PAYMENTDATE
)
)
select @CREDITCASHTOTAL = coalesce(sum([CREDITPAYMENT].[AMOUNT]),0)
from dbo.[RECONCILIATION]
inner join dbo.[CREDITPAYMENT]
on [CREDITPAYMENT].[RECONCILIATIONID] = [RECONCILIATION].[ID]
where
[RECONCILIATION].[STATUSCODE] > 1 and RECONCILIATION.CASHOVERSHORTDEPOSITED = 0 and
[CREDITPAYMENT].[PAYMENTMETHODCODE] = 0
and (@SALESCHANNELOPTIONCODE = 0
or RECONCILIATION.CASHOVERSHORTSALESMETHODCODE in (select SALESMETHODTYPECODE from dbo.SALESDEPOSITTEMPLATESALESCHANNEL where SALESDEPOSITTEMPLATEID = @SALESDEPOSITTEMPLATEID))
and ((@PAYMENTDATE is null) or CAST((SELECT max(FT2.CALCULATEDDATE)
from dbo.FINANCIALTRANSACTION FT2
left join dbo.SALESORDERPAYMENT SOP2 on FT2.ID = SOP2.PAYMENTID
left join dbo.RESERVATIONSECURITYDEPOSITPAYMENT RSDP2 on RSDP2.PAYMENTID = FT2.ID
inner join RECONCILIATION R2 on SOP2.RECONCILIATIONID = R2.ID or RSDP2.RECONCILIATIONID = R2.ID
where R2.ID = RECONCILIATION.ID) as DATE) <= @PAYMENTDATE)
select @ACTUALCASHTOTAL = coalesce(sum([ACTUALCASH]),0)
from dbo.[RECONCILIATION]
where [STATUSCODE] > 1 and RECONCILIATION.CASHOVERSHORTDEPOSITED = 0
and (@SALESCHANNELOPTIONCODE = 0
or RECONCILIATION.CASHOVERSHORTSALESMETHODCODE in (select SALESMETHODTYPECODE from dbo.SALESDEPOSITTEMPLATESALESCHANNEL where SALESDEPOSITTEMPLATEID = @SALESDEPOSITTEMPLATEID))
and ((@PAYMENTDATE is null) or (CAST (RECONCILIATION.ORIGINALSUBMISSIONDATE as DATE) <= @PAYMENTDATE))
set @CASHDIFFERENCE = @ACTUALCASHTOTAL - (@PAYMENTCASHTOTAL - @CREDITCASHTOTAL)
end
end
return @CASHDIFFERENCE
end