USP_CONTROLACCOUNT_VALIDATE
Validates control account settings before saving.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | |
@DATAELEMENTS | xml | IN | |
@ALLOWJOURNALENTRY | bit | IN | |
@ACCOUNTTYPECODE | tinyint | IN | |
@BANKACCOUNTID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.USP_CONTROLACCOUNT_VALIDATE @ID uniqueidentifier, @DATAELEMENTS xml, @ALLOWJOURNALENTRY bit, @ACCOUNTTYPECODE tinyint, @BANKACCOUNTID uniqueidentifier
as
begin
declare @COUNT int
set nocount on;
declare @PDACCOUNTSYSTEMID uniqueidentifier
set @PDACCOUNTSYSTEMID = '4B121C2C-CCE6-440D-894C-EA0DEF80D50B'
declare @ACCOUNTCODESTRUCTUREID uniqueidentifier
set @ACCOUNTCODESTRUCTUREID = (select ID from dbo.PDACCOUNTSTRUCTURE where PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID and ISBASICGL = 0 and ELEMENTDEFINITIONCODE = 1)
declare @ERRORMSG nvarchar(4000), @CLOSINGELEMENTID uniqueidentifier, @CLOSINGELEMENTVALUEID uniqueidentifier, @CLOSINGELEMENTNAME nvarchar(100)
select @CLOSINGELEMENTID = ID, @CLOSINGELEMENTNAME = DESCRIPTION from dbo.PDACCOUNTSTRUCTURE where CLOSINGELEMENT = 1 and ISBASICGL = 0 and PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID;
create table #DE (ID uniqueidentifier, DATAELEMENTID uniqueidentifier, ACCOUNTSTRUCTUREID uniqueidentifier);
insert #DE select ID, DATAELEMENTID, ACCOUNTSTRUCTUREID from
dbo.UFN_CONTROLACCOUNT_GETDATAELEMENTS_FROMITEMLISTXML(@DATAELEMENTS);
select @CLOSINGELEMENTVALUEID = DATAELEMENTID from #DE where ACCOUNTSTRUCTUREID = @CLOSINGELEMENTID
declare @SEPARATOR nvarchar(1);
select top 1 @SEPARATOR = SEPARATOR from dbo.PDACCOUNTSTRUCTURE where PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID and ISBASICGL = 0;
--make sure at least one ledger account exists that matches the subsidiary ledger account
declare @ACCOUNTSTRING nvarchar(130)
set @ACCOUNTSTRING =
(select
isnull(SHORTDESCRIPTION+@SEPARATOR,'%'+@SEPARATOR)
from
dbo.PDACCOUNTSTRUCTURE
left join #DE T1 on T1.ACCOUNTSTRUCTUREID = PDACCOUNTSTRUCTURE.ID
left join dbo.PDACCOUNTSEGMENTVALUE on T1.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID
where
PDACCOUNTSTRUCTURE.ELEMENTTYPECODE = 1
and ISBASICGL = 0
and PDACCOUNTSYSTEMID = @PDACCOUNTSYSTEMID
order by
PDACCOUNTSTRUCTURE.SEGMENTSEQUENCE
for xml path(''),type).value('.','nvarchar(130)')
set @ACCOUNTSTRING = substring(@ACCOUNTSTRING, 1, len(@ACCOUNTSTRING)-1)
if (select count(1) from dbo.GLACCOUNT where ACCOUNTSTRING like @ACCOUNTSTRING) = 0
begin
raiserror('ERR_CONTROLACCOUNT_ACCOUNTDOESNOTEXIST',13,1);
return 1;
end
-- AP Summary and AP discount
if @ACCOUNTTYPECODE =1 or @ACCOUNTTYPECODE = 2
begin
--Only one subsidiary ledger account can have the closing element masked
if not exists (select ID from #DE where ACCOUNTSTRUCTUREID = @CLOSINGELEMENTID)
begin
if exists (select ID from dbo.CONTROLACCOUNT where ID <> @ID and ACCOUNTTYPECODE = @ACCOUNTTYPECODE and SYSTEMID = '777AE8A1-67F4-474F-8474-E16F41EE0EC4' and ID not in
(select distinct unPvt.ID from
(select ID, DATAELEMENT1ID, DATAELEMENT2ID, DATAELEMENT3ID, DATAELEMENT4ID, DATAELEMENT5ID, DATAELEMENT6ID, DATAELEMENT7ID, DATAELEMENT8ID, DATAELEMENT9ID, DATAELEMENT10ID,
DATAELEMENT11ID, DATAELEMENT12ID, DATAELEMENT13ID, DATAELEMENT14ID, DATAELEMENT15ID, DATAELEMENT16ID, DATAELEMENT17ID, DATAELEMENT18ID, DATAELEMENT19ID, DATAELEMENT20ID,
DATAELEMENT21ID, DATAELEMENT22ID, DATAELEMENT23ID, DATAELEMENT24ID, DATAELEMENT25ID, DATAELEMENT26ID, DATAELEMENT27ID, DATAELEMENT28ID, DATAELEMENT29ID, DATAELEMENT30ID
from dbo.CONTROLACCOUNT
where SYSTEMID = '777AE8A1-67F4-474F-8474-E16F41EE0EC4' and ACCOUNTTYPECODE = @ACCOUNTTYPECODE
and ID <> @ID) p
unpivot
(DATAELEMENTID for dColumn in
(DATAELEMENT1ID, DATAELEMENT2ID, DATAELEMENT3ID, DATAELEMENT4ID, DATAELEMENT5ID, DATAELEMENT6ID, DATAELEMENT7ID, DATAELEMENT8ID, DATAELEMENT9ID, DATAELEMENT10ID,
DATAELEMENT11ID, DATAELEMENT12ID, DATAELEMENT13ID, DATAELEMENT14ID, DATAELEMENT15ID, DATAELEMENT16ID, DATAELEMENT17ID, DATAELEMENT18ID, DATAELEMENT19ID, DATAELEMENT20ID,
DATAELEMENT21ID, DATAELEMENT22ID, DATAELEMENT23ID, DATAELEMENT24ID, DATAELEMENT25ID, DATAELEMENT26ID, DATAELEMENT27ID, DATAELEMENT28ID, DATAELEMENT29ID, DATAELEMENT30ID)) as unPvt
inner join dbo.PDACCOUNTSEGMENTVALUE on unPvt.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID
where PDACCOUNTSEGMENTVALUE.PDACCOUNTSTRUCTUREID = @CLOSINGELEMENTID))
begin
raiserror('ERR_CONTROLACCOUNT_CLOSINGELEMENTREQUIRED',13,1);
return 1;
end
end
--If account code is closing element, only two Payables summary accounts allowed, one of which needs to be "Allow journal entry"
if @CLOSINGELEMENTID = @ACCOUNTCODESTRUCTUREID
begin
select @COUNT = COUNT(1) from dbo.CONTROLACCOUNT where SYSTEMID = '777AE8A1-67F4-474F-8474-E16F41EE0EC4' and ID <> @ID and ACCOUNTTYPECODE = @ACCOUNTTYPECODE
if @COUNT >= 2
begin
raiserror('ERR_CONTROLACCOUNT_PAYABLES_MAX2',13,1);
return 1;
end
if @COUNT = 1
begin
if (select COUNT(1) from dbo.CONTROLACCOUNT where SYSTEMID = '777AE8A1-67F4-474F-8474-E16F41EE0EC4' and ID <> @ID and ALLOWJOURNALENTRY = @ALLOWJOURNALENTRY and ACCOUNTTYPECODE = @ACCOUNTTYPECODE) >= 1
begin
raiserror('ERR_CONTROLACCOUNT_ONEALLOWJOURNALENTRY',13,1);
return 1;
end
end
end
--a closing value can only be used once
set @COUNT = 0
select @COUNT = COUNT(1) from
(select ID, DATAELEMENT1ID, DATAELEMENT2ID, DATAELEMENT3ID, DATAELEMENT4ID, DATAELEMENT5ID, DATAELEMENT6ID, DATAELEMENT7ID, DATAELEMENT8ID, DATAELEMENT9ID, DATAELEMENT10ID,
DATAELEMENT11ID, DATAELEMENT12ID, DATAELEMENT13ID, DATAELEMENT14ID, DATAELEMENT15ID, DATAELEMENT16ID, DATAELEMENT17ID, DATAELEMENT18ID, DATAELEMENT19ID, DATAELEMENT20ID,
DATAELEMENT21ID, DATAELEMENT22ID, DATAELEMENT23ID, DATAELEMENT24ID, DATAELEMENT25ID, DATAELEMENT26ID, DATAELEMENT27ID, DATAELEMENT28ID, DATAELEMENT29ID, DATAELEMENT30ID
from dbo.CONTROLACCOUNT
where SYSTEMID = '777AE8A1-67F4-474F-8474-E16F41EE0EC4' and ACCOUNTTYPECODE = @ACCOUNTTYPECODE
and ID <> @ID) p
unpivot
(DATAELEMENTID for dColumn in
(DATAELEMENT1ID, DATAELEMENT2ID, DATAELEMENT3ID, DATAELEMENT4ID, DATAELEMENT5ID, DATAELEMENT6ID, DATAELEMENT7ID, DATAELEMENT8ID, DATAELEMENT9ID, DATAELEMENT10ID,
DATAELEMENT11ID, DATAELEMENT12ID, DATAELEMENT13ID, DATAELEMENT14ID, DATAELEMENT15ID, DATAELEMENT16ID, DATAELEMENT17ID, DATAELEMENT18ID, DATAELEMENT19ID, DATAELEMENT20ID,
DATAELEMENT21ID, DATAELEMENT22ID, DATAELEMENT23ID, DATAELEMENT24ID, DATAELEMENT25ID, DATAELEMENT26ID, DATAELEMENT27ID, DATAELEMENT28ID, DATAELEMENT29ID, DATAELEMENT30ID)) as unPvt
where unPvt.DATAELEMENTID = @CLOSINGELEMENTVALUEID
if @COUNT > 0
begin
raiserror('ERR_CONTROLACCOUNT_CLOSINGELEMENT_ONEALLOWJOURNALENTRY',13,1);
return 1;
end
end
-- Treasury
if @ACCOUNTTYPECODE =3
begin
--Only one subsidiary ledger account can have the closing element masked per bank account
if not exists (select ID from #DE where ACCOUNTSTRUCTUREID = @CLOSINGELEMENTID)
begin
if exists (select CA.ID from dbo.CONTROLACCOUNT CA join dbo.CONTROLACCOUNTTREASURY CAT on CAT.ID = CA.ID where CAT.BANKACCOUNTID = @BANKACCOUNTID and CA.ID <> @ID and ACCOUNTTYPECODE = @ACCOUNTTYPECODE and SYSTEMID = 'C276668E-26D1-4714-95B8-C0BC18E308EF' and CA.ID not in
(select distinct unPvt.ID from
(select CONTROLACCOUNT.ID, DATAELEMENT1ID, DATAELEMENT2ID, DATAELEMENT3ID, DATAELEMENT4ID, DATAELEMENT5ID, DATAELEMENT6ID, DATAELEMENT7ID, DATAELEMENT8ID, DATAELEMENT9ID, DATAELEMENT10ID,
DATAELEMENT11ID, DATAELEMENT12ID, DATAELEMENT13ID, DATAELEMENT14ID, DATAELEMENT15ID, DATAELEMENT16ID, DATAELEMENT17ID, DATAELEMENT18ID, DATAELEMENT19ID, DATAELEMENT20ID,
DATAELEMENT21ID, DATAELEMENT22ID, DATAELEMENT23ID, DATAELEMENT24ID, DATAELEMENT25ID, DATAELEMENT26ID, DATAELEMENT27ID, DATAELEMENT28ID, DATAELEMENT29ID, DATAELEMENT30ID
from dbo.CONTROLACCOUNT
join dbo.CONTROLACCOUNTTREASURY on CONTROLACCOUNTTREASURY.ID = CONTROLACCOUNT.ID
where SYSTEMID = 'C276668E-26D1-4714-95B8-C0BC18E308EF' and ACCOUNTTYPECODE = @ACCOUNTTYPECODE
and CONTROLACCOUNTTREASURY.BANKACCOUNTID = @BANKACCOUNTID and CONTROLACCOUNT.ID <> @ID) p
unpivot
(DATAELEMENTID for dColumn in
(DATAELEMENT1ID, DATAELEMENT2ID, DATAELEMENT3ID, DATAELEMENT4ID, DATAELEMENT5ID, DATAELEMENT6ID, DATAELEMENT7ID, DATAELEMENT8ID, DATAELEMENT9ID, DATAELEMENT10ID,
DATAELEMENT11ID, DATAELEMENT12ID, DATAELEMENT13ID, DATAELEMENT14ID, DATAELEMENT15ID, DATAELEMENT16ID, DATAELEMENT17ID, DATAELEMENT18ID, DATAELEMENT19ID, DATAELEMENT20ID,
DATAELEMENT21ID, DATAELEMENT22ID, DATAELEMENT23ID, DATAELEMENT24ID, DATAELEMENT25ID, DATAELEMENT26ID, DATAELEMENT27ID, DATAELEMENT28ID, DATAELEMENT29ID, DATAELEMENT30ID)) as unPvt
inner join dbo.PDACCOUNTSEGMENTVALUE on unPvt.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID
where PDACCOUNTSEGMENTVALUE.PDACCOUNTSTRUCTUREID = @CLOSINGELEMENTID))
if exists (select CA.ID from dbo.CONTROLACCOUNT CA join dbo.CONTROLACCOUNTTREASURY CAT on CAT.ID = CA.ID where CAT.BANKACCOUNTID = @BANKACCOUNTID and CA.ID <> @ID and ACCOUNTTYPECODE = 3)
begin
raiserror('ERR_CONTROLACCOUNT_CLOSINGELEMENTREQUIRED',13,1);
return 1;
end
end
--a closing value can only be used once per bank account
set @COUNT = 0
select @COUNT = COUNT(1) from
(select CA.ID, DATAELEMENT1ID, DATAELEMENT2ID, DATAELEMENT3ID, DATAELEMENT4ID, DATAELEMENT5ID, DATAELEMENT6ID, DATAELEMENT7ID, DATAELEMENT8ID, DATAELEMENT9ID, DATAELEMENT10ID,
DATAELEMENT11ID, DATAELEMENT12ID, DATAELEMENT13ID, DATAELEMENT14ID, DATAELEMENT15ID, DATAELEMENT16ID, DATAELEMENT17ID, DATAELEMENT18ID, DATAELEMENT19ID, DATAELEMENT20ID,
DATAELEMENT21ID, DATAELEMENT22ID, DATAELEMENT23ID, DATAELEMENT24ID, DATAELEMENT25ID, DATAELEMENT26ID, DATAELEMENT27ID, DATAELEMENT28ID, DATAELEMENT29ID, DATAELEMENT30ID
from dbo.CONTROLACCOUNT CA join dbo.CONTROLACCOUNTTREASURY CAT on CAT.ID = CA.ID
where CAT.BANKACCOUNTID = @BANKACCOUNTID and SYSTEMID = 'C276668E-26D1-4714-95B8-C0BC18E308EF'
and ACCOUNTTYPECODE = 3
and CA.ID <> @ID) p
unpivot
(DATAELEMENTID for dColumn in
(DATAELEMENT1ID, DATAELEMENT2ID, DATAELEMENT3ID, DATAELEMENT4ID, DATAELEMENT5ID, DATAELEMENT6ID, DATAELEMENT7ID, DATAELEMENT8ID, DATAELEMENT9ID, DATAELEMENT10ID,
DATAELEMENT11ID, DATAELEMENT12ID, DATAELEMENT13ID, DATAELEMENT14ID, DATAELEMENT15ID, DATAELEMENT16ID, DATAELEMENT17ID, DATAELEMENT18ID, DATAELEMENT19ID, DATAELEMENT20ID,
DATAELEMENT21ID, DATAELEMENT22ID, DATAELEMENT23ID, DATAELEMENT24ID, DATAELEMENT25ID, DATAELEMENT26ID, DATAELEMENT27ID, DATAELEMENT28ID, DATAELEMENT29ID, DATAELEMENT30ID)) as unPvt
where unPvt.DATAELEMENTID = @CLOSINGELEMENTVALUEID
if @COUNT > 0
begin
raiserror('ERR_CONTROLACCOUNT_CLOSINGELEMENT_ONEALLOWJOURNALENTRY',13,1);
return 1;
end
--If account code is closing element, only two treasury accounts allowed per bank account, one of which needs to be "Allow journal entry"
if @CLOSINGELEMENTID = @ACCOUNTCODESTRUCTUREID
begin
select @COUNT = COUNT(1) from dbo.CONTROLACCOUNT CA join dbo.CONTROLACCOUNTTREASURY CAT on CAT.ID = CA.ID where CAT.BANKACCOUNTID = @BANKACCOUNTID and SYSTEMID = 'C276668E-26D1-4714-95B8-C0BC18E308EF' and CA.ID <> @ID and ACCOUNTTYPECODE = 3
if @COUNT >= 2
begin
raiserror('ERR_CONTROLACCOUNT_TREASURY_MAX2',13,1);
return 1;
end
if @COUNT = 1
begin
if (select COUNT(1) from dbo.CONTROLACCOUNT CA join dbo.CONTROLACCOUNTTREASURY CAT on CAT.ID = CA.ID where CAT.BANKACCOUNTID = @BANKACCOUNTID and SYSTEMID = 'C276668E-26D1-4714-95B8-C0BC18E308EF' and CA.ID <> @ID and ALLOWJOURNALENTRY = @ALLOWJOURNALENTRY and ACCOUNTTYPECODE = 3) >= 1
begin
raiserror('ERR_CONTROLACCOUNT_ONEALLOWJOURNALENTRY',13,1);
return 1;
end
end
-- the same treasury account cannot be used on more than one bank account
if (select COUNT(1) from dbo.CONTROLACCOUNT CA
join dbo.PDACCOUNTSEGMENTVALUE DE on CA.DATAELEMENT1ID = DE.ID
join dbo.CONTROLACCOUNTTREASURY CAT on CAT.ID = CA.ID
where CAT.BANKACCOUNTID <> @BANKACCOUNTID and SYSTEMID = 'C276668E-26D1-4714-95B8-C0BC18E308EF'
and DE.ID = @CLOSINGELEMENTVALUEID--CA.DATAELEMENT1ID
and CA.ID <> @ID and ACCOUNTTYPECODE = 3) > 0
begin
raiserror('ERR_CONTROLACCOUNT_ACCOUNTUNIQUE',13,1);
return 1;
end
end
end
--If account is used in uposted batch, must have "Allow use in journal entry" checked
if @ALLOWJOURNALENTRY = 0 and exists (select 1 from
dbo.JOURNALENTRY JE
cross apply (
select count(1) as cnt from
(select DATAELEMENTID from dbo.UFN_JOURNALENTRYELEMENTS(je.id, 0)
except
select dataelementid from #DE) el1
) EL
inner join dbo.FINANCIALTRANSACTIONLINEITEM FLI on JE.FINANCIALTRANSACTIONLINEITEMID = FLI.ID
where FLI.POSTSTATUSCODE = 1 and cnt = 0 )
begin
raiserror('ERR_CONTROLACCOUNT_UNCLOSEDBATCH',13,1);
return 1;
end
drop table #DE
return 0;
end