UFN_GLACCOUNT_GETSEGMENTWORKTABLE
Returns the account structure segment work table
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@InputTable | UDT_MAPPEDVALUESFORGETACCOUNTS_2 | IN |
Definition
Copy
CREATE function dbo.UFN_GLACCOUNT_GETSEGMENTWORKTABLE(@InputTable UDT_MAPPEDVALUESFORGETACCOUNTS_2 readonly)
returns @SegmentsWorkTable table (ID uniqueidentifier, PDAccountStructureID uniqueidentifier, PDAccountSegmentValueID uniqueidentifier NULL, TransactionType tinyint, SegType tinyint, PRIMARY KEY (ID, PDAccountStructureID, TransactionType))
as begin
declare @NumSegments int = (select count(*) from dbo.PDACCOUNTSTRUCTURE as t1 inner join @InputTable as t2 on t1.PDACCOUNTSYSTEMID = t2.PDACCOUNTSYSTEMID )
declare @AccountCodeSegmentID uniqueidentifier = (select t1.ID from dbo.PDACCOUNTSTRUCTURE as t1 inner join @InputTable as t2 on t1.PDACCOUNTSYSTEMID = t2.PDACCOUNTSYSTEMID where t1.SEGMENTTYPE = 1)
declare @FinalTable table (ID uniqueidentifier, GLACCOUNTID uniqueidentifier, ACCOUNTNUMBER varchar(100), TransactionType tinyint, PRIMARY KEY (ID, TransactionType, GLACCOUNTID))
declare @InputLines table (ID uniqueidentifier, TableID uniqueidentifier, MappedID uniqueidentifier, PRIMARY KEY (ID, TableID))
declare @AccountCodeMappingTable table (ID uniqueidentifier, PDAccountStructureID uniqueidentifier, PDAccountSegmentValueID uniqueidentifier NULL, GLAccountID uniqueidentifier NULL, TransactionType tinyint, PRIMARY KEY (ID, TransactionType))
declare @AvailableAcctCodeMappings table (DEBITGLACCOUNTID uniqueidentifier, CREDITGLACCOUNTID uniqueidentifier, DEBITPDACCOUNTSEGMENTVALUEID uniqueidentifier, CREDITPDACCOUNTSEGMENTVALUEID uniqueidentifier,
PAYMENTMETHODID uniqueidentifier, APPLICATIONTYPEID uniqueidentifier, REVENUETYPEID uniqueidentifier, SUBTYPEID uniqueidentifier, PDACCOUNTCODEMAPOFFICEID uniqueidentifier, PDACCOUNTSYSTEMID uniqueidentifier)
insert into @AvailableAcctCodeMappings (DEBITGLACCOUNTID, CREDITGLACCOUNTID, DEBITPDACCOUNTSEGMENTVALUEID, CREDITPDACCOUNTSEGMENTVALUEID, PAYMENTMETHODID, APPLICATIONTYPEID, REVENUETYPEID, SUBTYPEID, PDACCOUNTCODEMAPOFFICEID, PDACCOUNTSYSTEMID)
select distinct t1.DEBITGLACCOUNTID, t1.CREDITGLACCOUNTID, t1.DEBITPDACCOUNTSEGMENTVALUEID, t1.CREDITPDACCOUNTSEGMENTVALUEID,
t2.ID as PAYMENTMETHODID, t3.ID as APPLICATIONTYPEID, t4.ID as REVENUETYPEID, t5.SUBTYPEID, t1.PDACCOUNTCODEMAPOFFICEID, t1.PDACCOUNTSYSTEMID
from PDACCOUNTCODEMAPPING t1
left join PDACCOUNTCODEMAPPAYMENTMETHODTYPE t2 on t1.PDACCOUNTCODEMAPOFFICEID = t2.PDACCOUNTCODEMAPOFFICEID and (t1.PAYMENTMETHOD & t2.NAMEID) > 0
left join PDACCOUNTCODEMAPAPPLICATIONTYPE t3 on t1.PDACCOUNTCODEMAPOFFICEID = t3.PDACCOUNTCODEMAPOFFICEID and (t1.APPLICATIONTYPE & t3.NAMEID) > 0
left join PDACCOUNTCODEMAPREVENUETYPE t4 on t1.PDACCOUNTCODEMAPOFFICEID = t4.PDACCOUNTCODEMAPOFFICEID and (t1.REVENUETYPE & t4.NAMEID) > 0
left join PDACCOUNTCODEMAPPINGSUBTYPE t5 on t1.ID = t5.PDACCOUNTCODEMAPPINGID and (t5.ADDITIONALSUBTYPE in (t2.ADDITIONALSUBTYPE, t3.ADDITIONALSUBTYPE, t4.ADDITIONALSUBTYPE)) -- Assumes ADDITIONALSUBTYPE values are unique for each type
where t1.PDACCOUNTCODEMAPOFFICEID in (select PDACCOUNTCODEMAPOFFICEID from @InputTable)
and t1.PDACCOUNTSYSTEMID in (select PDACCOUNTSYSTEMID from @InputTable)
insert into @AccountCodeMappingTable (ID, PDAccountStructureID, PDAccountSegmentValueid, GLAccountID, TransactionType)
select TV1.ID, V3.PDACCOUNTSTRUCTUREID,
case V3.TransactionType when 1 then case when COALESCE (V1.REVENUETYPEID,V1.PAYMENTMETHODID,V1.APPLICATIONTYPEID) is not null then V1.DEBITPDACCOUNTSEGMENTVALUEID else V2.DEBITPDACCOUNTSEGMENTVALUEID end when 2 then case when COALESCE (V1.REVENUETYPEID,V1.PAYMENTMETHODID,V1.APPLICATIONTYPEID) is not null then V1.CREDITPDACCOUNTSEGMENTVALUEID else V2.CREDITPDACCOUNTSEGMENTVALUEID end end,
case V3.TransactionType when 1 then case when COALESCE (V1.REVENUETYPEID,V1.PAYMENTMETHODID,V1.APPLICATIONTYPEID) is not null then V1.DEBITGLACCOUNTID else V2.DEBITGLACCOUNTID end when 2 then case when COALESCE (V1.REVENUETYPEID,V1.PAYMENTMETHODID,V1.APPLICATIONTYPEID) is not null then V1.CREDITGLACCOUNTID else V2.CREDITGLACCOUNTID end end,
V3.TransactionType
from @InputTable TV1
left join @AvailableAcctCodeMappings V1 on (V1.PaymentMethodID = TV1.PaymentMethodID or TV1.PaymentMethodID is null)
and (V1.APPLICATIONTYPEID = TV1.APPLICATIONTYPEID or TV1.APPLICATIONTYPEID is null)
and (V1.REVENUETYPEID = TV1.REVENUETYPEID or TV1.REVENUETYPEID is null or TV1.REVENUETYPEID = '00000000-0000-0000-0000-000000000000')
and (V1.SubTypeID = TV1.SubTypeID or TV1.SubTypeID is null)
and V1.PDACCOUNTCODEMAPOFFICEID = TV1.PDACCOUNTCODEMAPOFFICEID
and V1.PDACCOUNTSYSTEMID = TV1.PDACCOUNTSYSTEMID
left join @AvailableAcctCodeMappings V2 on (V2.PaymentMethodID = TV1.PaymentMethodID or TV1.PaymentMethodID is null)
and (V2.APPLICATIONTYPEID = TV1.APPLICATIONTYPEID or TV1.APPLICATIONTYPEID is null)
and (V2.REVENUETYPEID = TV1.REVENUETYPEID or TV1.REVENUETYPEID is null or TV1.REVENUETYPEID = '00000000-0000-0000-0000-000000000000')
and V2.SubTypeID = '99999999-9999-9999-9999-999999999999'
and V2.PDACCOUNTCODEMAPOFFICEID = TV1.PDACCOUNTCODEMAPOFFICEID
and V2.PDACCOUNTSYSTEMID = TV1.PDACCOUNTSYSTEMID
cross join (select @AccountCodeSegmentID as PDACCOUNTSTRUCTUREID, 1 as TransactionType union all select @AccountCodeSegmentID, 2) V3
--Accounts where account code mapping specifies the account number
insert into @FinalTable (ID, GLACCOUNTID, ACCOUNTNUMBER, TransactionType)
select t1.ID, GLAccountID, t2.ACCOUNTNUMBER, TransactionType
from @AccountCodeMappingTable t1
inner join dbo.GLACCOUNT t2 on t1.GLACCOUNTID = t2.ID
inner join @InputTable as t3 on t2.PDACCOUNTSYSTEMID = t3.PDACCOUNTSYSTEMID
--The next three steps translate the input arguments into PDACCOUNTSTRUCTUREID and PDACCOUNTSEGMENTVALUEID for each segment
--Insert the account code segments (1 each for debit (1) and credit (2))
insert into @SegmentsWorkTable (ID, PDAccountStructureID, PDAccountsegmentValueID, TransactionType, SegType)
select ID, PDAccountStructureID, PDAccountSegmentValueID, TransactionType, 1
from @AccountCodeMappingTable t1
where not exists (select * from @FinalTable where ID = t1.ID and TransactionType = t1.TransactionType)
if (@@RowCount > 0)
begin
--Table of the values I'm asking for
insert into @InputLines (ID, TableID, MappedID)
select ID, TABLEID, MAPPEDID
from @InputTable
UNPIVOT (TABLEID for WhichTable IN (SEGMENT02TABLEID,SEGMENT03TABLEID, SEGMENT04TABLEID, SEGMENT05TABLEID, SEGMENT06TABLEID, SEGMENT07TABLEID, SEGMENT08TABLEID, SEGMENT09TABLEID, SEGMENT10TABLEID, SEGMENT11TABLEID, SEGMENT12TABLEID, SEGMENT13TABLEID, SEGMENT14TABLEID, SEGMENT15TABLEID, SEGMENT16TABLEID, SEGMENT17TABLEID, SEGMENT18TABLEID, SEGMENT19TABLEID, SEGMENT20TABLEID, SEGMENT21TABLEID, SEGMENT22TABLEID, SEGMENT23TABLEID, SEGMENT24TABLEID, SEGMENT25TABLEID, SEGMENT26TABLEID, SEGMENT27TABLEID, SEGMENT28TABLEID, SEGMENT29TABLEID, SEGMENT30TABLEID)) as TABLEID
UNPIVOT (MAPPEDID for WhichTable2 IN (SEGMENT02ID, SEGMENT03ID, SEGMENT04ID, SEGMENT05ID, SEGMENT06ID, SEGMENT07ID, SEGMENT08ID, SEGMENT09ID, SEGMENT10ID, SEGMENT11ID, SEGMENT12ID, SEGMENT13ID, SEGMENT14ID, SEGMENT15ID, SEGMENT16ID, SEGMENT17ID, SEGMENT18ID, SEGMENT19ID, SEGMENT20ID, SEGMENT21ID, SEGMENT22ID, SEGMENT23ID, SEGMENT24ID, SEGMENT25ID, SEGMENT26ID, SEGMENT27ID, SEGMENT28ID, SEGMENT29ID, SEGMENT30ID)) as MAPPEDID
where left(WhichTable,9) = left(WhichTable2,9)
and MAPPEDID is not null
declare @SegmentMappedIds table(id uniqueidentifier, structid uniqueidentifier, mappedid uniqueidentifier, transactiontype tinyint, primary key(id, structid, transactiontype))
insert into @SegmentMappedIds
select IT.ID ,t1.ID, IL.MappedID, v3.TransactionType
from @InputTable as IT
inner join dbo.PDACCOUNTSTRUCTURE t1 on t1.SEGMENTTYPE = 3 and t1.PDACCOUNTSYSTEMID = IT.PDACCOUNTSYSTEMID
inner join dbo.PDACCOUNTTABLESAVAILABLEFORSEGMENT t2 on t1.PDACCOUNTTABLESAVAILABLEFORSEGMENTID = t2.ID
left join @InputLines IL on IL.TableID = t2.TABLEID
cross join (select 1 as TransactionType union all select 2 as TransactionType) V3
where not exists (select * from @FinalTable where ID = IT.ID and TransactionType = V3.TransactionType);
insert into @SegmentsWorkTable(ID, PDAccountStructureID, PDAccountSegmentValueID, TransactionType, SegType)
select s.id, sm.PDACCOUNTSTRUCTUREID, sm.PDACCOUNTSEGMENTVALUEID, s.transactiontype, 2
from dbo.PDACCOUNTSEGMENTMAPPING sm
inner join @SegmentMappedIds s on sm.PDACCOUNTSTRUCTUREID = s.structid and (sm.LONGDESCRIPTIONID = s.mappedid or (nullif(s.mappedid,'99999999-9999-9999-9999-999999999999') is null and sm.ISDEFAULT = 1))
--Insert the composite segments
if exists(select 1 from pdaccountstructure t1 inner join @InputTable as t2 on t1.PDACCOUNTSYSTEMID = t2.PDACCOUNTSYSTEMID where t1.segmenttype = 4)
with CTE (ID, PDAccountStructureID, Sequence, TableID)
as
(select IT.ID, t1.ID as PDAccountStructureID, t2.SEQUENCE, t3.TABLEID
from @InputTable IT inner join dbo.PDACCOUNTSTRUCTURE t1 on t1.SEGMENTTYPE = 4 and t1.PDACCOUNTSYSTEMID = IT.PDACCOUNTSYSTEMID
inner join dbo.PDCOMPOSITESEGMENTTABLELIST t2 on t1.PDACCOUNTTABLESAVAILABLEFORSEGMENTID = t2.PDCOMPOSITESEGMENTID
inner join dbo.PDACCOUNTTABLESAVAILABLEFORSEGMENT t3 on t2.PDACCOUNTTABLESAVAILABLEFORSEGMENTID = t3.ID)
insert into @SegmentsWorkTable(ID, PDAccountStructureID, PDAccountSegmentValueID, TransactionType, SegType)
select V1.ID, V1.PDAccountStructureID, t4.PDACCOUNTSEGMENTVALUEID, V3.TransactionType,2
from (select ID, PDAccountStructureID,
(select (''+cast(isnull(MAPPEDID,'99999999-9999-9999-9999-999999999999') as nchar(36)))
from CTE as CTE_2
left join @InputLines IL on CTE_2.ID = IL.ID and CTE_2.TableID = IL.TableID
where CTE_2.ID = CTE_1.ID and CTE_2.PDAccountStructureID = CTE_1.PDAccountStructureID
order by CTE_2.Sequence
for XML path('')) as MappedID
from CTE as CTE_1
group by ID, PDAccountStructureID) V1
inner join dbo.PDCOMPOSITESEGMENTMAPPING t4 on V1.PDACCOUNTSTRUCTUREID = t4.PDACCOUNTSTRUCTUREID and V1.MappedID = t4.COMPOSITESEGMENTKEY
cross join (select 1 as TransactionType union all select 2) V3
where not exists (select * from @FinalTable where ID = V1.ID and TransactionType = V3.TransactionType)
end
return
end