USP_BALANCINGENTRY_VALIDATE

Validates the balancing elements before saving.

Parameters

Parameter Parameter Type Mode Description
@DEBITXML xml IN
@CREDITXML xml IN
@DEBITTOXML xml IN
@CREDITTOXML xml IN
@BALANCINGENTRYID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_BALANCINGENTRY_VALIDATE(
@DEBITXML xml,@CREDITXML xml,@DEBITTOXML xml,@CREDITTOXML xml,@BALANCINGENTRYID uniqueidentifier)
as
begin

  declare @TempTbl table (
     [BALANCINGENTRYTYPECODE] tinyint,
     [DATAELEMENTID] uniqueidentifier,
     [ID] uniqueidentifier)

  insert into @TempTbl select 
      1,
      [DATAELEMENTID],
      [ID] 
  from dbo.UFN_BALANCINGENTRY_GETELEMENTSDEBITFROM_FROMITEMLISTXML(@DEBITXML)

  insert into @TempTbl select 
      2,
      [DATAELEMENTID],
      [ID] 
  from dbo.UFN_BALANCINGENTRY_GETELEMENTSCREDITFROM_FROMITEMLISTXML(@CREDITXML)

  insert into @TempTbl select 
      3,
      [DATAELEMENTID],
      [ID] 
  from dbo.UFN_BALANCINGENTRY_GETELEMENTSDEBITTO_FROMITEMLISTXML(@DEBITTOXML)

  insert into @TempTbl select 
      4,
      [DATAELEMENTID],
      [ID] 
  from dbo.UFN_BALANCINGENTRY_GETELEMENTSCREDITTO_FROMITEMLISTXML(@CREDITTOXML)

  declare @COUNT int

  select @Count =  COUNT(distinct(a.DATAELEMENTID))
  from @TempTbl as a join 
    dbo.PDACCOUNTSEGMENTVALUE as b on a.DATAELEMENTID = b.ID
    join dbo.PDACCOUNTSTRUCTURE as c on c.ID = b.PDACCOUNTSTRUCTUREID
  where CLOSINGELEMENT = 1 and BALANCINGENTRYTYPECODE in (1,2

 if @COUNT <> 2
     begin
        raiserror('ERR_UNIQUE_CLOSINGELEMENT',13,1);
        return 1;
    end

  --make sure this isn't a duplicate

  declare @TempTbl2 table (
   [BALANCINGENTRYTYPECODE] tinyint,
   [BALANCINGENTRYID] uniqueidentifier,
   [DATAELEMENTID] uniqueidentifier)

  declare @DEBITELEMENTCOUNT int
  declare @CREDITELEMENTCOUNT int
  set @DEBITELEMENTCOUNT = (select count(1) from @TempTbl where BALANCINGENTRYTYPECODE = 1)
  set @CREDITELEMENTCOUNT = (select count(1) from @TempTbl where BALANCINGENTRYTYPECODE = 2)

  insert into @TempTbl2 (BALANCINGENTRYTYPECODE, BALANCINGENTRYID, DATAELEMENTID)
  select unPvt.BALANCINGENTRYTYPECODE, unPvt.BALANCINGENTRYID, unPvt.DATAELEMENTID
  from
      (select BALANCINGENTRYTYPECODE, BALANCINGENTRYID, 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.BALANCINGENTRYELEMENT 
    where BALANCINGENTRYID <> @BALANCINGENTRYID
    and BALANCINGENTRYTYPECODE in (1,2)) 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

  --remove balancing entries that don't have the same number of elements defined as the debit/credit being saved

  delete from @TempTbl2
  where BALANCINGENTRYID in 
    (select BALANCINGENTRYID from (select BALANCINGENTRYID, count(1) as ElementCount
    from @TempTbl2
    where BALANCINGENTRYTYPECODE = 1
    group by BALANCINGENTRYID) t
    where t.ElementCount <> @DEBITELEMENTCOUNT)
  or BALANCINGENTRYID in
    (select BALANCINGENTRYID from (select BALANCINGENTRYID, count(1) as ElementCount
    from @TempTbl2
    where BALANCINGENTRYTYPECODE = 2
    group by BALANCINGENTRYID) t
    where t.ElementCount <> @CREDITELEMENTCOUNT)

  if exists (select 1 
    from
    (select BALANCINGENTRYID from 
      (select BALANCINGENTRYID, count(1) as MatchingDataElementCount
       from @TempTbl2
       where DATAELEMENTID in (select DATAELEMENTID from @TempTbl where BALANCINGENTRYTYPECODE = 1)
       and BALANCINGENTRYTYPECODE = 1
       group by BALANCINGENTRYID) t
       where MatchingDataElementCount = @DEBITELEMENTCOUNT) debit
    inner join 
    (select BALANCINGENTRYID from 
      (select BALANCINGENTRYID, count(1) as MatchingDataElementCount
       from @TempTbl2
       where DATAELEMENTID in (select DATAELEMENTID from @TempTbl where BALANCINGENTRYTYPECODE = 2)
       and BALANCINGENTRYTYPECODE = 2
       group by BALANCINGENTRYID) t
       where MatchingDataElementCount = @CREDITELEMENTCOUNT) credit
    on debit.BALANCINGENTRYID = credit.BALANCINGENTRYID)
  begin
        raiserror('ERR_UNIQUE_BALANCINGENTRY',13,1);
        return 1;      
  end

  declare @SEPARATOR nvarchar(1);
  select top 1 @SEPARATOR = SEPARATOR from dbo.PDACCOUNTSTRUCTURE;

  declare @ACCOUNTSTRUCTURECOUNT int
  select @ACCOUNTSTRUCTURECOUNT = count(1) from dbo.PDACCOUNTSTRUCTURE where ELEMENTTYPECODE = 1
  --if an account is fully defined make sure that account exists

  if @ACCOUNTSTRUCTURECOUNT = 
      (select count(1) from @TempTbl T1
      inner join dbo.PDACCOUNTSEGMENTVALUE on T1.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID
      inner join dbo.PDACCOUNTSTRUCTURE on PDACCOUNTSEGMENTVALUE.PDACCOUNTSTRUCTUREID = PDACCOUNTSTRUCTURE.ID
      where PDACCOUNTSTRUCTURE.ELEMENTTYPECODE = 1 and T1.BALANCINGENTRYTYPECODE = 1)
  begin
    declare @DEBITACCOUNTSTRING nvarchar(130)
    set @DEBITACCOUNTSTRING =
    (select
      coalesce(SHORTDESCRIPTION+@SEPARATOR, '')
    from 
      @TempTbl T1
      inner join dbo.PDACCOUNTSEGMENTVALUE on T1.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID
      inner join dbo.PDACCOUNTSTRUCTURE on PDACCOUNTSEGMENTVALUE.PDACCOUNTSTRUCTUREID = PDACCOUNTSTRUCTURE.ID
    where
      PDACCOUNTSTRUCTURE.ELEMENTTYPECODE = 1 and T1.BALANCINGENTRYTYPECODE = 1
    order by
      PDACCOUNTSTRUCTURE.SEGMENTSEQUENCE
    for xml path(''),type).value('.','nvarchar(130)')
    set @DEBITACCOUNTSTRING = substring(@DEBITACCOUNTSTRING, 1, len(@DEBITACCOUNTSTRING)-1)

    if (select count(1) from dbo.GLACCOUNT where ACCOUNTSTRING = @DEBITACCOUNTSTRING) = 0
    begin
      raiserror('ERR_BALANCINGENTRY_DEBITACCOUNTDOESNOTEXIST',13,1);
      return 1;
    end
  end

  --if an account is fully defined make sure that account exists

  if @ACCOUNTSTRUCTURECOUNT = 
      (select count(1) from @TempTbl T1
      inner join dbo.PDACCOUNTSEGMENTVALUE on T1.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID
      inner join dbo.PDACCOUNTSTRUCTURE on PDACCOUNTSEGMENTVALUE.PDACCOUNTSTRUCTUREID = PDACCOUNTSTRUCTURE.ID
      where PDACCOUNTSTRUCTURE.ELEMENTTYPECODE = 1 and T1.BALANCINGENTRYTYPECODE = 2)
  begin
    declare @CREDITACCOUNTSTRING nvarchar(130)
    set @CREDITACCOUNTSTRING =
    (select
      coalesce(SHORTDESCRIPTION+@SEPARATOR, '')
    from 
      @TempTbl T1
      inner join dbo.PDACCOUNTSEGMENTVALUE on T1.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID
      inner join dbo.PDACCOUNTSTRUCTURE on PDACCOUNTSEGMENTVALUE.PDACCOUNTSTRUCTUREID = PDACCOUNTSTRUCTURE.ID
    where
      PDACCOUNTSTRUCTURE.ELEMENTTYPECODE = 1 and T1.BALANCINGENTRYTYPECODE = 2
    order by
      PDACCOUNTSTRUCTURE.SEGMENTSEQUENCE
    for xml path(''),type).value('.','nvarchar(130)')
    set @CREDITACCOUNTSTRING = substring(@CREDITACCOUNTSTRING, 1, len(@CREDITACCOUNTSTRING)-1)

    if (select count(1) from dbo.GLACCOUNT where ACCOUNTSTRING = @CREDITACCOUNTSTRING) = 0
    begin
      raiserror('ERR_BALANCINGENTRY_CREDITACCOUNTDOESNOTEXIST',13,1);
      return 1;
    end
  end

  --make sure the account specified exists

  declare @DEBITTOACCOUNTSTRING nvarchar(130)
  set @DEBITTOACCOUNTSTRING =
  (select
    coalesce(SHORTDESCRIPTION+@SEPARATOR, '')
  from 
    @TempTbl T1
    inner join dbo.PDACCOUNTSEGMENTVALUE on T1.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID
    inner join dbo.PDACCOUNTSTRUCTURE on PDACCOUNTSEGMENTVALUE.PDACCOUNTSTRUCTUREID = PDACCOUNTSTRUCTURE.ID
  where
    PDACCOUNTSTRUCTURE.ELEMENTTYPECODE = 1 and T1.BALANCINGENTRYTYPECODE = 3
  order by
    PDACCOUNTSTRUCTURE.SEGMENTSEQUENCE
  for xml path(''),type).value('.','nvarchar(130)')
  set @DEBITTOACCOUNTSTRING = substring(@DEBITTOACCOUNTSTRING, 1, len(@DEBITTOACCOUNTSTRING)-1)

  if (select count(1) from dbo.GLACCOUNT where ACCOUNTSTRING = @DEBITTOACCOUNTSTRING) = 0
  begin
    raiserror('ERR_BALANCINGENTRY_DEBITTOACCOUNTDOESNOTEXIST',13,1);
    return 1;
  end

  --make sure the account specified exists

  declare @CREDITTOACCOUNTSTRING nvarchar(130)
  set @CREDITTOACCOUNTSTRING =
  (select
    coalesce(SHORTDESCRIPTION+@SEPARATOR, '')
  from 
    @TempTbl T1
    inner join dbo.PDACCOUNTSEGMENTVALUE on T1.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID
    inner join dbo.PDACCOUNTSTRUCTURE on PDACCOUNTSEGMENTVALUE.PDACCOUNTSTRUCTUREID = PDACCOUNTSTRUCTURE.ID
  where
    PDACCOUNTSTRUCTURE.ELEMENTTYPECODE = 1 and T1.BALANCINGENTRYTYPECODE = 4
  order by
    PDACCOUNTSTRUCTURE.SEGMENTSEQUENCE
  for xml path(''),type).value('.','nvarchar(130)')
  set @CREDITTOACCOUNTSTRING = substring(@CREDITTOACCOUNTSTRING, 1, len(@CREDITTOACCOUNTSTRING)-1)

  if (select count(1) from dbo.GLACCOUNT where ACCOUNTSTRING = @CREDITTOACCOUNTSTRING) = 0
  begin
    raiserror('ERR_BALANCINGENTRY_CREDITTOACCOUNTDOESNOTEXIST',13,1);
    return 1;
  end

  -- Verify account codes are in the same category

  declare @DEBITCATEGORY tinyint, @CREDITCATEGORY tinyint, @VALID bit
  select
    @DEBITCATEGORY = CATEGORYCODE
  from
    dbo.UFN_BALANCINGENTRY_GETELEMENTSDEBITTO_FROMITEMLISTXML(@DEBITTOXML) T1
    inner join dbo.PDACCOUNTSEGMENTVALUE on T1.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID and PDACCOUNTSEGMENTVALUE.TYPECODE=1
    inner join dbo.ACCOUNTCODE on ACCOUNTCODE.ID = PDACCOUNTSEGMENTVALUE.ID

  select
    @CREDITCATEGORY = CATEGORYCODE
  from
    dbo.UFN_BALANCINGENTRY_GETELEMENTSCREDITTO_FROMITEMLISTXML(@CREDITTOXML) T1
    inner join dbo.PDACCOUNTSEGMENTVALUE on T1.DATAELEMENTID = PDACCOUNTSEGMENTVALUE.ID and PDACCOUNTSEGMENTVALUE.TYPECODE=1
    inner join dbo.ACCOUNTCODE on ACCOUNTCODE.ID = PDACCOUNTSEGMENTVALUE.ID

  set @VALID = 
  case 
    when @DEBITCATEGORY in (1,2,3) then 
      case when @CREDITCATEGORY in (1,2,3) then 1 else 0 end
    when @DEBITCATEGORY in (4,5) then
      case when @CREDITCATEGORY in (4,5) then 1 else 0 end
    else 0
  end

  if @VALID <> 1
  begin
    raiserror('ERR_BALANCINGENTRY_ACCOUNTCATEGORIES',13,1);
    return 1;
  end

  return 0;
end