UFN_REVENUE_GENERATEUNREALIZEDGAINLOSSGLDISTRIBUTION
Generates unrealized currency gain/loss GL distributions from the account code mappings defined in the system for the given revenue record.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@REVENUEID | uniqueidentifier | IN | |
@POSTDATE | datetime | IN |
Definition
Copy
CREATE function dbo.UFN_REVENUE_GENERATEUNREALIZEDGAINLOSSGLDISTRIBUTION
(
@REVENUEID uniqueidentifier,
@POSTDATE datetime = null
)
returns @DISTRIBUTIONS table
(
REVENUEID uniqueidentifier,
TRANSACTIONTYPECODE tinyint,
POSTDATE datetime,
POSTSTATUSCODE tinyint,
ACCOUNTSTRING nvarchar(255),
PROJECT nvarchar(255),
AMOUNT money,
REFERENCE nvarchar(255),
ERRORMESSAGE nvarchar(max),
PAYMENTMETHODCODE tinyint,
REVENUETRANSACTIONTYPECODE tinyint,
ACCOUNTID uniqueidentifier,
REVENUESPLITID uniqueidentifier,
BASECURRENCYID uniqueidentifier,
ORGANIZATIONAMOUNT money,
MAPPEDVALUES xml
)
as begin
declare @TRANSACTIONTYPECODE tinyint;
--If we are using legacy GL, don't return any distributions
if dbo.UFN_GLACCOUNT_EXISTS() = 0
return;
if @POSTDATE is null set @POSTDATE = getdate();
select
@TRANSACTIONTYPECODE = TRANSACTIONTYPECODE
from
dbo.REVENUE with (nolock)
where
REVENUE.ID = @REVENUEID;
--Pledge
if @TRANSACTIONTYPECODE = 1
begin
declare @FISCALYEARID uniqueidentifier = dbo.UFN_GLFISCALYEAR_GETIDFROMDATE();
declare @REVALGAINLOSS table
(
INSTALLMENTID uniqueidentifier,
DESIGNATIONID uniqueidentifier,
BASEGAINLOSS money,
ORGANIZATIONGAINLOSS money,
ISGAIN bit
)
insert into @REVALGAINLOSS
(
INSTALLMENTID,
DESIGNATIONID,
BASEGAINLOSS,
ORGANIZATIONGAINLOSS,
ISGAIN
)
select
INSTALLMENTSPLIT.INSTALLMENTID,
INSTALLMENTSPLIT.DESIGNATIONID,
BASEGAINLOSS,
ORGANIZATIONGAINLOSS,
ISGAIN
from dbo.UFN_PLEDGE_GETINSTALLMENTSPLITREVALUATIONGAINLOSS(@REVENUEID) GAINLOSS
inner join INSTALLMENTSPLIT on INSTALLMENTSPLIT.ID = GAINLOSS.INSTALLMENTSPLITID;
--Need to handle the case where there is no fiscal year by inserting a dummy row.
--Otherwise the transaction is successfully created with no distributions
if @FISCALYEARID is null
begin
insert into @DISTRIBUTIONS
(
REVENUEID,
ERRORMESSAGE,
POSTSTATUSCODE
)
values
(
@REVENUEID,
'Post date must be in an open period.',
1
);
return;
end
-- Pledge installments inside the open period.
if dbo.UFN_INSTALLMENT_CURRENTYEAR(@REVENUEID, @FISCALYEARID, 1) = 1
begin
--Get all installments in the open period
with OPENPERIOD_INSTALLMENTS(INSTALLMENTID) as
(
select
INSTALLMENT.ID
from
dbo.INSTALLMENT
inner join dbo.INSTALLMENTSPLIT on INSTALLMENT.ID = INSTALLMENTSPLIT.INSTALLMENTID
inner join dbo.REVENUE on INSTALLMENT.REVENUEID = REVENUE.ID
inner join dbo.REVENUESPLIT on REVENUE.ID = REVENUESPLIT.REVENUEID
where
REVENUE.ID = @REVENUEID
and REVENUESPLIT.DESIGNATIONID = INSTALLMENTSPLIT.DESIGNATIONID
and INSTALLMENT.DATE between
(
select min(STARTDATE) from dbo.GLFISCALPERIOD where GLFISCALYEARID = @FISCALYEARID
)
and
(
select max(ENDDATE) from dbo.GLFISCALPERIOD where GLFISCALYEARID = @FISCALYEARID
)
),
GAINLOSS_CTE(DESIGNATIONID,BASEGAINLOSS,ORGANIZATIONGAINLOSS) as (
--Get the sum of the gains and losses
select
DESIGNATIONID,
sum
(
case [REVALGAINLOSS].ISGAIN
when 1 then [REVALGAINLOSS].BASEGAINLOSS
else ([REVALGAINLOSS].BASEGAINLOSS * -1)
end
) as BASEGAINLOSS
,
sum
(
case [REVALGAINLOSS].ISGAIN
when 1 then [REVALGAINLOSS].ORGANIZATIONGAINLOSS
else ([REVALGAINLOSS].ORGANIZATIONGAINLOSS * -1)
end
) as ORGANIZATIONGAINLOSS
from @REVALGAINLOSS [REVALGAINLOSS]
where
[REVALGAINLOSS].INSTALLMENTID in
(
select INSTALLMENTID from OPENPERIOD_INSTALLMENTS
)
--If the installment has a gain in base amount and loss in org amount (or vice versa), we need to return 2 rows.
--Otherwise, return the gains or losses on the same row.
group by
[REVALGAINLOSS].DESIGNATIONID, [REVALGAINLOSS].ISGAIN
)
insert into @DISTRIBUTIONS
(
REVENUEID,
TRANSACTIONTYPECODE,
POSTDATE,
POSTSTATUSCODE,
ACCOUNTSTRING,
PROJECT,
AMOUNT,
REFERENCE,
ERRORMESSAGE,
PAYMENTMETHODCODE,
REVENUETRANSACTIONTYPECODE,
ACCOUNTID,
REVENUESPLITID,
BASECURRENCYID,
ORGANIZATIONAMOUNT,
MAPPEDVALUES
)
select
REVENUE.ID,
--The currency gain/loss account is always stored as the debit in PDACCOUNTCODEMAPPING.
--If we have a currency gain, we need to credit the gain/loss account and debit the receivable account,
--thus the need to switch the TRANSACTIONTYPECODE below.
case when (GAINLOSS_CTE.BASEGAINLOSS > 0) or (GAINLOSS_CTE.ORGANIZATIONGAINLOSS > 0)
then
case [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE
when 1 then 0 else 1
end
else [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE
end as TRANSACTIONTYPECODE,
case when UNREALIZEDGAINLOSSADJUSTMENT.ID is null then @POSTDATE
else UNREALIZEDGAINLOSSADJUSTMENT.POSTDATE
end as POSTDATE,
case when UNREALIZEDGAINLOSSADJUSTMENT.ID is null then
(
case when REVENUE.DONOTPOST = 1
then 2
when exists (select 1 from dbo.UNREALIZEDGAINLOSSGLDISTRIBUTION where REVENUEID = @REVENUEID)
then 0 -- Posted
else
1 -- Not posted
end
)
else
UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE
end as POSTSTATUSCODE,
[GAINLOSSGLACCOUNT].ACCOUNTSTRING,
[GAINLOSSGLACCOUNT].PROJECTCODE as PROJECT,
abs(GAINLOSS_CTE.BASEGAINLOSS) as AMOUNT,
case
when [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE = 0 and ((GAINLOSS_CTE.BASEGAINLOSS > 0) or (GAINLOSS_CTE.ORGANIZATIONGAINLOSS > 0))
then dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Currency gain', CODES.REVENUETYPE)
when [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE = 0 and not ((GAINLOSS_CTE.BASEGAINLOSS > 0) or (GAINLOSS_CTE.ORGANIZATIONGAINLOSS > 0))
then dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Currency loss', CODES.REVENUETYPE)
else
dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Commitment revaluation', CODES.REVENUETYPE)
end as REFERENCE,
[GAINLOSSGLACCOUNT].ERRORMESSAGE,
REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE, -- TODO: PAYMENTMETHOD?????
REVENUE.TRANSACTIONTYPECODE as REVENUETRANSACTIONTYPECODE,
[GAINLOSSGLACCOUNT].ACCOUNTID as ACCOUNTID,
REVENUESPLIT.ID as REVENUESPLITID,
REVENUESPLIT.BASECURRENCYID,
abs(GAINLOSS_CTE.ORGANIZATIONGAINLOSS) as ORGANIZATIONAMOUNT,
GAINLOSSGLACCOUNT.MAPPEDVALUES
from
dbo.REVENUE
inner join dbo.REVENUEPAYMENTMETHOD with (nolock) on REVENUE.ID = REVENUEPAYMENTMETHOD.REVENUEID
inner join dbo.REVENUESPLIT with (nolock) on REVENUE.ID = REVENUESPLIT.REVENUEID
left join dbo.UNREALIZEDGAINLOSSADJUSTMENT with (nolock) on REVENUE.ID = UNREALIZEDGAINLOSSADJUSTMENT.REVENUEID and UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE <> 0
inner join GAINLOSS_CTE on GAINLOSS_CTE.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
cross join
(
select '207' as PAYMENTMETHODCODE, 'Currency gain' AS PAYMENTMETHOD, 'All' as REVENUETYPE, '205' as REVENUETYPECODE
union all
select '208' as PAYMENTMETHODCODE, 'Currency loss' AS PAYMENTMETHOD, 'All' as REVENUETYPE, '205' as REVENUETYPECODE
) as CODES
cross apply dbo.UFN_REVENUE_GENERATEGLACCOUNT(REVENUESPLIT.ID, CODES.REVENUETYPECODE, CODES.REVENUETYPECODE, CODES.REVENUETYPECODE, CODES.PAYMENTMETHODCODE, REVENUESPLIT.DESIGNATIONID) as [GAINLOSSGLACCOUNT]
where
REVENUE.ID = @REVENUEID
and REVENUE.TRANSACTIONTYPECODE = 1
and REVENUE.DONOTPOST = 0
and not (GAINLOSS_CTE.BASEGAINLOSS = 0 and GAINLOSS_CTE.ORGANIZATIONGAINLOSS = 0)
and(
(CODES.PAYMENTMETHODCODE = 207 and (GAINLOSS_CTE.BASEGAINLOSS > 0 or GAINLOSS_CTE.ORGANIZATIONGAINLOSS > 0)) -- Currency Gain
or
(CODES.PAYMENTMETHODCODE = 208 and (GAINLOSS_CTE.BASEGAINLOSS < 0 or GAINLOSS_CTE.ORGANIZATIONGAINLOSS < 0)) -- Currency Loss
)
end
-- Pledge installments outside the open period.
if dbo.UFN_INSTALLMENT_CURRENTYEAR(@REVENUEID, @FISCALYEARID, 0) = 1
begin
--Get all installments outside the open period
with OUTSIDEOPENPERIOD_INSTALLMENTS(INSTALLMENTID) as
(
select
INSTALLMENT.ID
from
dbo.INSTALLMENT
inner join dbo.INSTALLMENTSPLIT on INSTALLMENT.ID = INSTALLMENTSPLIT.INSTALLMENTID
inner join dbo.REVENUE on INSTALLMENT.REVENUEID = REVENUE.ID
inner join dbo.REVENUESPLIT on REVENUE.ID = REVENUESPLIT.REVENUEID
where
REVENUE.ID = @REVENUEID
and REVENUESPLIT.DESIGNATIONID = INSTALLMENTSPLIT.DESIGNATIONID
and INSTALLMENT.DATE not between
(
select min(STARTDATE) from dbo.GLFISCALPERIOD where GLFISCALYEARID = @FISCALYEARID
)
and
(
select max(ENDDATE) from dbo.GLFISCALPERIOD where GLFISCALYEARID = @FISCALYEARID
)
),
GAINLOSS_CTE(DESIGNATIONID,BASEGAINLOSS,ORGANIZATIONGAINLOSS) as (
--Get the sum of the gains and losses
select
DESIGNATIONID,
sum
(
case [REVALGAINLOSS].ISGAIN
when 1 then [REVALGAINLOSS].BASEGAINLOSS
else ([REVALGAINLOSS].BASEGAINLOSS * -1)
end
) as BASEGAINLOSS,
sum
(
case [REVALGAINLOSS].ISGAIN
when 1 then [REVALGAINLOSS].ORGANIZATIONGAINLOSS
else ([REVALGAINLOSS].ORGANIZATIONGAINLOSS * -1)
end
) as ORGANIZATIONGAINLOSS
from
@REVALGAINLOSS [REVALGAINLOSS]
where
[REVALGAINLOSS].INSTALLMENTID in
(
select INSTALLMENTID from OUTSIDEOPENPERIOD_INSTALLMENTS
)
--If the installment has a gain in base amount and loss in org amount (or vice versa), we need to return 2 rows.
--Otherwise, return the gains or losses on the same row.
group by
[REVALGAINLOSS].DESIGNATIONID,[REVALGAINLOSS].ISGAIN
)
insert into @DISTRIBUTIONS
(
REVENUEID,
TRANSACTIONTYPECODE,
POSTDATE,
POSTSTATUSCODE,
ACCOUNTSTRING,
PROJECT,
AMOUNT,
REFERENCE,
ERRORMESSAGE,
PAYMENTMETHODCODE,
REVENUETRANSACTIONTYPECODE,
ACCOUNTID,
REVENUESPLITID,
BASECURRENCYID,
ORGANIZATIONAMOUNT,
MAPPEDVALUES
)
select
REVENUE.ID,
--The currency gain/loss account is always stored as the debit in PDACCOUNTCODEMAPPING.
--If we have a currency gain, we need to credit the gain/loss account and debit the receivable account,
--thus the need to switch the TRANSACTIONTYPECODE below.
case when (GAINLOSS_CTE.BASEGAINLOSS > 0) or (GAINLOSS_CTE.ORGANIZATIONGAINLOSS > 0)
then
case [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE
when 1 then 0 else 1
end
else [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE
end as TRANSACTIONTYPECODE,
case when UNREALIZEDGAINLOSSADJUSTMENT.ID is null then @POSTDATE
else UNREALIZEDGAINLOSSADJUSTMENT.POSTDATE
end as POSTDATE,
case when UNREALIZEDGAINLOSSADJUSTMENT.ID is null then
(
case when REVENUE.DONOTPOST = 1
then 2
when exists (select 1 from dbo.UNREALIZEDGAINLOSSGLDISTRIBUTION where REVENUEID = @REVENUEID)
then 0 -- Posted
else
1 -- Not posted
end
)
else
UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE
end as POSTSTATUSCODE,
[GAINLOSSGLACCOUNT].ACCOUNTSTRING,
[GAINLOSSGLACCOUNT].PROJECTCODE as PROJECT,
abs(GAINLOSS_CTE.BASEGAINLOSS) as AMOUNT,
case
when [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE = 0 and ((GAINLOSS_CTE.BASEGAINLOSS > 0) or (GAINLOSS_CTE.ORGANIZATIONGAINLOSS > 0))
then dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Currency gain', CODES.REVENUETYPE)
when [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE = 0 and not ((GAINLOSS_CTE.BASEGAINLOSS > 0) or (GAINLOSS_CTE.ORGANIZATIONGAINLOSS > 0))
then dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Currency loss', CODES.REVENUETYPE)
else
dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Commitment revaluation', CODES.REVENUETYPE)
end as REFERENCE,
[GAINLOSSGLACCOUNT].ERRORMESSAGE,
REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE, -- TODO: PAYMENTMETHOD?????
REVENUE.TRANSACTIONTYPECODE as REVENUETRANSACTIONTYPECODE,
[GAINLOSSGLACCOUNT].ACCOUNTID as ACCOUNTID,
REVENUESPLIT.ID as REVENUESPLITID,
REVENUESPLIT.BASECURRENCYID,
abs(GAINLOSS_CTE.ORGANIZATIONGAINLOSS) as ORGANIZATIONAMOUNT,
GAINLOSSGLACCOUNT.MAPPEDVALUES
from
dbo.REVENUE
inner join dbo.REVENUEPAYMENTMETHOD with (nolock) on REVENUE.ID = REVENUEPAYMENTMETHOD.REVENUEID
inner join dbo.REVENUESPLIT with (nolock) on REVENUE.ID = REVENUESPLIT.REVENUEID
left join dbo.UNREALIZEDGAINLOSSADJUSTMENT with (nolock) on REVENUE.ID = UNREALIZEDGAINLOSSADJUSTMENT.REVENUEID and UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE <> 0
inner join GAINLOSS_CTE on GAINLOSS_CTE.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
cross join
(
select '207' as PAYMENTMETHODCODE, 'Currency gain' AS PAYMENTMETHOD, 'All' as REVENUETYPE, '206' as REVENUETYPECODE
union all
select '208' as PAYMENTMETHODCODE, 'Currency loss' AS PAYMENTMETHOD, 'All' as REVENUETYPE, '206' as REVENUETYPECODE
) as CODES
cross apply dbo.UFN_REVENUE_GENERATEGLACCOUNT(REVENUESPLIT.ID, CODES.REVENUETYPECODE, CODES.REVENUETYPECODE, CODES.REVENUETYPECODE, CODES.PAYMENTMETHODCODE, REVENUESPLIT.DESIGNATIONID) as [GAINLOSSGLACCOUNT]
where
REVENUE.ID = @REVENUEID
and REVENUE.TRANSACTIONTYPECODE = 1
and not (GAINLOSS_CTE.BASEGAINLOSS = 0 and GAINLOSS_CTE.ORGANIZATIONGAINLOSS = 0)
and
(
(CODES.PAYMENTMETHODCODE = 207 and (GAINLOSS_CTE.BASEGAINLOSS > 0 or GAINLOSS_CTE.ORGANIZATIONGAINLOSS > 0)) -- Currency Gain
or
(CODES.PAYMENTMETHODCODE = 208 and (GAINLOSS_CTE.BASEGAINLOSS < 0 or GAINLOSS_CTE.ORGANIZATIONGAINLOSS < 0)) -- Currency Loss
)
end
end
--Grant awards
if (@TRANSACTIONTYPECODE = 6)
begin
insert into @DISTRIBUTIONS
(
REVENUEID,
TRANSACTIONTYPECODE,
POSTDATE,
POSTSTATUSCODE,
ACCOUNTSTRING,
PROJECT,
AMOUNT,
REFERENCE,
ERRORMESSAGE,
PAYMENTMETHODCODE,
REVENUETRANSACTIONTYPECODE,
ACCOUNTID,
REVENUESPLITID,
BASECURRENCYID,
ORGANIZATIONAMOUNT
)
select
REVENUE.ID,
--The currency gain/loss account is always stored as the debit in PDACCOUNTCODEMAPPING.
--If we have a currency gain, we need to credit the gain/loss account and debit the receivable account,
--thus the need to switch the TRANSACTIONTYPECODE below.
case when ([REVALGAINLOSS].ISGAIN = 1)
then
case [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE
when 1 then 0 else 1
end
else [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE
end as TRANSACTIONTYPECODE,
case when UNREALIZEDGAINLOSSADJUSTMENT.ID is null then @POSTDATE
else UNREALIZEDGAINLOSSADJUSTMENT.POSTDATE
end as POSTDATE,
case when UNREALIZEDGAINLOSSADJUSTMENT.ID is null then
(
case when REVENUE.DONOTPOST = 1
then 2
when exists (select 1 from dbo.UNREALIZEDGAINLOSSGLDISTRIBUTION where REVENUEID = @REVENUEID)
then 0 -- Posted
else
1 -- Not posted
end
)
else
UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE
end as POSTSTATUSCODE,
[GAINLOSSGLACCOUNT].ACCOUNTSTRING,
[GAINLOSSGLACCOUNT].PROJECTCODE as PROJECT,
[REVALGAINLOSS].BASEGAINLOSS as AMOUNT,
case
when [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE = 0 and ([REVALGAINLOSS].ISGAIN = 1)
then dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Currency gain', CODES.REVENUETYPE)
when [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE = 0 and ([REVALGAINLOSS].ISGAIN = 0)
then dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Currency loss', CODES.REVENUETYPE)
else
dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Commitment revaluation', CODES.REVENUETYPE)
end as REFERENCE,
[GAINLOSSGLACCOUNT].ERRORMESSAGE,
REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE,
REVENUE.TRANSACTIONTYPECODE as REVENUETRANSACTIONTYPECODE,
[GAINLOSSGLACCOUNT].ACCOUNTID as ACCOUNTID,
REVENUESPLIT.ID as REVENUESPLITID,
REVENUESPLIT.BASECURRENCYID,
[REVALGAINLOSS].ORGANIZATIONGAINLOSS as ORGANIZATIONAMOUNT
from
dbo.REVENUE with (nolock)
inner join dbo.REVENUESPLIT with (nolock) on REVENUE.ID = REVENUESPLIT.REVENUEID
inner join dbo.REVENUEPAYMENTMETHOD with (nolock) on REVENUE.ID = REVENUEPAYMENTMETHOD.REVENUEID
left join dbo.UNREALIZEDGAINLOSSADJUSTMENT with (nolock) on REVENUE.ID = UNREALIZEDGAINLOSSADJUSTMENT.REVENUEID and UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE <> 0
cross apply dbo.UFN_PLEDGE_GETSPLITREVALUATIONGAINLOSS(@REVENUEID) [REVALGAINLOSS]
cross join
(
select '207' as PAYMENTMETHODCODE, 'Currency gain' AS PAYMENTMETHOD, 'All' as REVENUETYPE, '207' as REVENUETYPECODE
union all
select '208' as PAYMENTMETHODCODE, 'Currency loss' AS PAYMENTMETHOD, 'All' as REVENUETYPE, '207' as REVENUETYPECODE
) as CODES
cross apply dbo.UFN_REVENUE_GENERATEGLACCOUNT(REVENUESPLIT.ID, CODES.REVENUETYPECODE, CODES.REVENUETYPECODE, CODES.REVENUETYPECODE, CODES.PAYMENTMETHODCODE, REVENUESPLIT.DESIGNATIONID) as [GAINLOSSGLACCOUNT]
where
(REVENUE.ID = @REVENUEID)
and REVALGAINLOSS.SPLITID = REVENUESPLIT.ID
and not ([REVALGAINLOSS].BASEGAINLOSS = 0 and [REVALGAINLOSS].ORGANIZATIONGAINLOSS = 0)
and
(
(CODES.PAYMENTMETHODCODE = 207 and [REVALGAINLOSS].ISGAIN = 1) -- Currency Gain
or
(CODES.PAYMENTMETHODCODE = 208 and [REVALGAINLOSS].ISGAIN = 0) -- Currency Loss
)
end
--Planned gifts
if (@TRANSACTIONTYPECODE = 4)
begin
insert into @DISTRIBUTIONS
(
REVENUEID,
TRANSACTIONTYPECODE,
POSTDATE,
POSTSTATUSCODE,
ACCOUNTSTRING,
PROJECT,
AMOUNT,
REFERENCE,
ERRORMESSAGE,
PAYMENTMETHODCODE,
REVENUETRANSACTIONTYPECODE,
ACCOUNTID,
REVENUESPLITID,
BASECURRENCYID,
ORGANIZATIONAMOUNT
)
select
REVENUE.ID as REVENUEID,
--The currency gain/loss account is always stored as the debit in PDACCOUNTCODEMAPPING.
--If we have a currency gain, we need to credit the gain/loss account and debit the receivable account,
--thus the need to switch the TRANSACTIONTYPECODE below.
case when ([REVALGAINLOSS].ISGAIN = 1)
then
case [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE
when 1 then 0 else 1
end
else [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE
end as TRANSACTIONTYPECODE,
case when UNREALIZEDGAINLOSSADJUSTMENT.ID is null then @POSTDATE
else UNREALIZEDGAINLOSSADJUSTMENT.POSTDATE
end as POSTDATE,
case when UNREALIZEDGAINLOSSADJUSTMENT.ID is null then
(
case when REVENUE.DONOTPOST = 1
then 2
when exists (select 1 from dbo.UNREALIZEDGAINLOSSGLDISTRIBUTION where REVENUEID = @REVENUEID)
then 0 -- Posted
else
1 -- Not posted
end
)
else
UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE
end as POSTSTATUSCODE,
[GAINLOSSGLACCOUNT].ACCOUNTSTRING,
[GAINLOSSGLACCOUNT].PROJECTCODE as PROJECT,
[REVALGAINLOSS].BASEGAINLOSS as AMOUNT,
case
when [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE = 0 and ([REVALGAINLOSS].ISGAIN = 1)
then dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Currency gain', CODES.REVENUETYPE)
when [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE = 0 and ([REVALGAINLOSS].ISGAIN = 0)
then dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Currency loss', CODES.REVENUETYPE)
else
dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Commitment revaluation', CODES.REVENUETYPE)
end as REFERENCE,
[GAINLOSSGLACCOUNT].ERRORMESSAGE,
REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE,
REVENUE.TRANSACTIONTYPECODE as REVENUETRANSACTIONTYPECODE,
[GAINLOSSGLACCOUNT].ACCOUNTID as ACCOUNTID,
REVENUESPLIT.ID as REVENUESPLITID,
PLANNEDGIFTDESIGNATION.BASECURRENCYID,
[REVALGAINLOSS].ORGANIZATIONGAINLOSS as ORGANIZATIONAMOUNT
from
dbo.REVENUE with (nolock)
inner join dbo.PLANNEDGIFTREVENUE with (nolock) on REVENUE.ID = PLANNEDGIFTREVENUE.REVENUEID
inner join dbo.REVENUESPLIT with (nolock) on REVENUE.ID = REVENUESPLIT.REVENUEID
inner join dbo.REVENUEPAYMENTMETHOD with (nolock) on REVENUE.ID = REVENUEPAYMENTMETHOD.REVENUEID
inner join dbo.PLANNEDGIFTDESIGNATION with (nolock) on PLANNEDGIFTREVENUE.ID = PLANNEDGIFTDESIGNATION.PLANNEDGIFTID and REVENUESPLIT.DESIGNATIONID = PLANNEDGIFTDESIGNATION.DESIGNATIONID
left join dbo.UNREALIZEDGAINLOSSADJUSTMENT with (nolock) on REVENUE.ID = UNREALIZEDGAINLOSSADJUSTMENT.REVENUEID and UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE <> 0
cross apply dbo.UFN_PLEDGE_GETSPLITREVALUATIONGAINLOSS(@REVENUEID) [REVALGAINLOSS]
cross join
(
select '207' as PAYMENTMETHODCODE, 'Currency gain' AS PAYMENTMETHOD, 'All' as REVENUETYPE, '208' as REVENUETYPECODE
union all
select '208' as PAYMENTMETHODCODE, 'Currency loss' AS PAYMENTMETHOD, 'All' as REVENUETYPE, '208' as REVENUETYPECODE
) as CODES
cross apply dbo.UFN_REVENUE_GENERATEGLACCOUNT(REVENUESPLIT.ID, CODES.REVENUETYPECODE, CODES.REVENUETYPECODE, CODES.REVENUETYPECODE, CODES.PAYMENTMETHODCODE, REVENUESPLIT.DESIGNATIONID) as [GAINLOSSGLACCOUNT]
where
REVENUE.ID = @REVENUEID
and REVALGAINLOSS.SPLITID = REVENUESPLIT.ID
and not ([REVALGAINLOSS].BASEGAINLOSS = 0 and [REVALGAINLOSS].ORGANIZATIONGAINLOSS = 0)
and
(
(CODES.PAYMENTMETHODCODE = 207 and [REVALGAINLOSS].ISGAIN = 1) -- Currency Gain
or
(CODES.PAYMENTMETHODCODE = 208 and [REVALGAINLOSS].ISGAIN = 0) -- Currency Loss
)
--Additions
insert into @DISTRIBUTIONS
(
REVENUEID,
TRANSACTIONTYPECODE,
POSTDATE,
POSTSTATUSCODE,
ACCOUNTSTRING,
PROJECT,
AMOUNT,
REFERENCE,
ERRORMESSAGE,
PAYMENTMETHODCODE,
REVENUETRANSACTIONTYPECODE,
ACCOUNTID,
REVENUESPLITID,
BASECURRENCYID,
ORGANIZATIONAMOUNT
)
select
REVENUE.ID as REVENUEID,
--The currency gain/loss account is always stored as the debit in PDACCOUNTCODEMAPPING.
--If we have a currency gain, we need to credit the gain/loss account and debit the receivable account,
--thus the need to switch the TRANSACTIONTYPECODE below.
case
when ([REVALGAINLOSS].ISGAIN = 1) then
case [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE
when 1 then 0
else 1
end
else [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE
end as TRANSACTIONTYPECODE,
case
when UNREALIZEDGAINLOSSADJUSTMENT.ID is null then @POSTDATE
else UNREALIZEDGAINLOSSADJUSTMENT.POSTDATE
end as POSTDATE,
case
when UNREALIZEDGAINLOSSADJUSTMENT.ID is null then
(case
when REVENUE.DONOTPOST = 1 then 2
when exists (select 1 from dbo.UNREALIZEDGAINLOSSGLDISTRIBUTION where REVENUEID = @REVENUEID) then 0 -- Posted
else 1 -- Not posted
end)
else
UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE
end as POSTSTATUSCODE,
[GAINLOSSGLACCOUNT].ACCOUNTSTRING,
[GAINLOSSGLACCOUNT].PROJECTCODE as PROJECT,
[REVALGAINLOSS].BASEGAINLOSS as AMOUNT,
case
when [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE = 0 and ([REVALGAINLOSS].ISGAIN = 1) then
dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Currency gain', CODES.REVENUETYPE)
when [GAINLOSSGLACCOUNT].TRANSACTIONTYPECODE = 0 and ([REVALGAINLOSS].ISGAIN = 0) then
dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Currency loss', CODES.REVENUETYPE)
else
dbo.UFN_POSTTOGLPROCESS_GETJOURNALREFERENCE (REVENUESPLIT.ID, 'Commitment revaluation', CODES.REVENUETYPE)
end as REFERENCE,
[GAINLOSSGLACCOUNT].ERRORMESSAGE,
REVENUEPAYMENTMETHOD.PAYMENTMETHODCODE,
REVENUE.TRANSACTIONTYPECODE as REVENUETRANSACTIONTYPECODE,
[GAINLOSSGLACCOUNT].ACCOUNTID as ACCOUNTID,
REVENUESPLIT.ID as REVENUESPLITID,
PLANNEDGIFTADDITIONDESIGNATION.BASECURRENCYID,
[REVALGAINLOSS].ORGANIZATIONGAINLOSS as ORGANIZATIONAMOUNT
from
dbo.REVENUE with (nolock)
inner join
dbo.PLANNEDGIFTADDITIONREVENUE with (nolock) on PLANNEDGIFTADDITIONREVENUE.REVENUEID = REVENUE.ID
inner join
dbo.REVENUESPLIT with (nolock) on REVENUESPLIT.REVENUEID = REVENUE.ID
inner join
dbo.REVENUEPAYMENTMETHOD with (nolock) on REVENUEPAYMENTMETHOD.REVENUEID = REVENUE.ID
inner join
dbo.PLANNEDGIFTADDITIONDESIGNATION with (nolock) on PLANNEDGIFTADDITIONDESIGNATION.PLANNEDGIFTADDITIONID = PLANNEDGIFTADDITIONREVENUE.ID and PLANNEDGIFTADDITIONDESIGNATION.DESIGNATIONID = REVENUESPLIT.DESIGNATIONID
left join
dbo.UNREALIZEDGAINLOSSADJUSTMENT with (nolock) on REVENUE.ID = UNREALIZEDGAINLOSSADJUSTMENT.REVENUEID and UNREALIZEDGAINLOSSADJUSTMENT.POSTSTATUSCODE <> 0
cross apply
dbo.UFN_PLEDGE_GETSPLITREVALUATIONGAINLOSS(@REVENUEID) [REVALGAINLOSS]
cross join
(
select '207' as PAYMENTMETHODCODE, 'Currency gain' AS PAYMENTMETHOD, 'All' as REVENUETYPE, '208' as REVENUETYPECODE
union all
select '208' as PAYMENTMETHODCODE, 'Currency loss' AS PAYMENTMETHOD, 'All' as REVENUETYPE, '208' as REVENUETYPECODE
) as CODES
cross apply
dbo.UFN_REVENUE_GENERATEGLACCOUNT(REVENUESPLIT.ID, CODES.REVENUETYPECODE, CODES.REVENUETYPECODE, CODES.REVENUETYPECODE, CODES.PAYMENTMETHODCODE, REVENUESPLIT.DESIGNATIONID) as [GAINLOSSGLACCOUNT]
where
REVENUE.ID = @REVENUEID and
REVALGAINLOSS.SPLITID = REVENUESPLIT.ID and
not ([REVALGAINLOSS].BASEGAINLOSS = 0 and [REVALGAINLOSS].ORGANIZATIONGAINLOSS = 0) and
((CODES.PAYMENTMETHODCODE = 207 and [REVALGAINLOSS].ISGAIN = 1) or -- Currency Gain
(CODES.PAYMENTMETHODCODE = 208 and [REVALGAINLOSS].ISGAIN = 0)) -- Currency Loss
end
return;
end