MKT20180103 JISIFE51 000 0102
/*
Je-li pro identifikaci investičního nástroje použit ISIN (JIS51_01.BCP2139
je vyplněn), musí být použit validní ISIN.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS51_01
  , I0003
  from \tJIS51_01
  where BCP2139 is not null
  and e.is_isin(BCP2139)=s.GC_NO
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE51 000 0103
/*
Musí být vyplněn právě jeden z údajů Identifikace zákazníka (právnické
osoby) nebo Identifikace zákazníka (fyzické osoby). V případě zákazníka -
právnické osoby musí být vyplněn alespoň jeden z údajů (JIS51_01.BCP2146,
JIS51_01.BCP2147) společně s údajem (JIS51_01.BCP2148). V případě zákazníka
- fyzické osoby musí být vyplněn údaj (JIS51_01.BCP2149) společně s právě
jedním z údajů (JIS51_01.BCP2150, JIS51_01.BCP2151) a zároveň také oba údaje
(JIS51_01.BCP2152, JIS51_01.BCP2153).
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS51_01
  , I0003
  from \tJIS51_01
  where nvl2(BCP2148, 1, 0)=nvl2(BCP2149, 1, 0)
  or (
    BCP2148 is not null
    and nvl2(BCP2146||BCP2147, 1, 0)=0
  ) or (
    BCP2149 is not null
    and (
      nvl2(BCP2150, 1, 0)=nvl2(BCP2151, 1, 0)
      or BCP2152 is null
      or BCP2153 is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE51 000 0105
/*
Je-li pro identifikaci zákazníka - právnické osoby použit LEI kód
((JIS51_01.BCP2146) je vyplněný), pak hodnota údaje musí být validní LEI
kód. Je-li pro identifikaci zákazníka - právnické osoby použito IČ
((JIS51_01.BCP2147) je vyplněný), pak hodnota údaje musí být validní IČ.
Je-li pro identifikaci zahraniční právnické osoby (JIS51_01.P1125 <> CZ)
(v poli JIS51_01.BCP2147) použit náhradní identifikátor složený z LEI
vykazující osoby + interní ID, prvních 20 znaků řetězce musí být LEI
vykazující osoby a interní ID musí být neprázdný řetězec.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS51_01
  , I0003
  from \tJIS51_01
  where (
    BCP2146 is not null
    and e.is_lei(BCP2146)=s.GC_NO
  ) or (
    BCP2147 is not null
    and P1125='CZ'
    and e.is_crn(BCP2147)=s.GC_NO
  ) or (
    BCP2147 is not null
    and P1125!='CZ'
    and (
      substr(BCP2147, 1, 20)!='\L'
      or substr(BCP2147, 21) is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE51 000 0106
/*
Je-li vyplněn údaj Identifikační kód fyzické osoby (JIS51_01.BCP2149), pak
musí první 2 znaky obsahovat validní kód země dle ISO 3166-1 alpha-2. Je-li
kód země Česká republika (CZ) a Typ identifikačního kódu fyzické osoby 1
(JIS51_01.BCP2150 = NIDN), pak hodnota identifikátoru (JIS51_01.BCP2149) od
3. znaku musí být validní RČ. Pokud je Typ identifikačního kódu fyzické
osoby 1 (JIS51_01.BCP2150 = CCPT), pak identifikátor (JIS51_01.BCP2149) musí
obsahovat 3 - 35 znaků. Pokud je k identifikaci FO použit CONCAT
(JIS51_01.BCP2151 = CONCAT), pak identifikátor (JIS51_01.BCP2149), musí
obsahovat právě 20 znaků, přičemž 3. - 10. znak musí být validní datum
narození ve tvaru RRRRMMDD, 11. a 16. znak musí být velké písmeno a zbylé
znaky velká písmena nebo #.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS51_01
  , I0003
  from \tJIS51_01
  where BCP2149 is not null
  and (
    substr(BCP2149, 1, 2) not in (select id from ey)
    or (
      BCP2150='NIDN'
      and substr(BCP2149, 1, 2)='CZ'
      and e.is_bcn(substr(BCP2149, 3))=s.GC_NO
    ) or (
      BCP2150='CCPT'
      and 0=case substr(BCP2149, 1, 2)
        when 'FI' then regexp_instr(BCP2149, '^[0-9A-Z+-]{3,35}$')
        when 'LV' then regexp_instr(BCP2149, '^[0-9A-Z-]{3,35}$')
        else regexp_instr(BCP2149, '^[0-9A-Z]{3,35}$') end
    ) or (
      BCP2151='CONCAT'
      and (
        regexp_instr(BCP2149
        , '^[A-Z]{2}[0-9]{8}[A-Z][A-Z#]{4}[A-Z][A-Z#]{4}$')=0
        or e.is_date(substr(BCP2149, 3, 8), 'yyyymmdd')=s.GC_NO
      )
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE51 000 0109
/*
Je-li pro identifikaci emitenta použit LEI kód (JIS51_01.BCP2144 je
vyplněný), pak hodnota údaje musí být validní LEI kód. Je-li pro
identifikaci českého (JIS51_01. P0125 = CZ) emitenta použito IČ
(JIS51_01.BCP2182 je vyplněný), pak hodnota údaje musí být validní IČ. Pokud
se jedná o emitenta směnky nebo dluhopisu (JIS51_01.P0088 = 311, 312, 13,
149, 17, 199), pak může být v poli JIS51_01.BCP2182 použit náhradní
identifikátor složený z LEI vykazující osoby + identifikace osoby emitenta,
kde prvních 20 znaků řetězce musí být LEI vykazující osoby a identifikace
osoby emitenta musí být neprázdný řetězec. Pro zahraničního emitenta
(JIS51_01.P0125 <> CZ) lze v poli JIS51_01.BCP2182 použít pouze náhradní
identifikátor složený z LEI vykazující osoby + interní ID, kde prvních 20
znaků řetězce musí být LEI vykazující osoby a interní ID musí být neprázdný
řetězec.
*/
begin
  \i
  \s
    \k
  , I0003 d -- m.gke
  , \aJIS51_01
  , I0003
  from \tJIS51_01
  where (
    BCP2144 is not null
    and e.is_lei(BCP2144)=s.GC_NO
  ) or (
    BCP2182 is not null
    and P0125='CZ'
    and (
      length(BCP2182)<8
      or (
        length(BCP2182)=8
        and e.is_crn(BCP2182)=s.GC_NO
      ) or length(BCP2182) between 9 and 20
      or (
        length(BCP2182)>20
        and P0088 not in ('13', '149', '17', '199', '311', '312')
      ) or (
        length(BCP2182)>20
        and P0088 in ('13', '149', '17', '199', '311', '312')
        and substr(BCP2182, 1, 20)!='\L'
      )
    )
  ) or (
    BCP2182 is not null
    and P0125!='CZ'
    and (
      substr(BCP2182, 1, 20)!='\L'
      or substr(BCP2182, 21) is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE51 000 0110
/*
Kombinace hodnot údajů Identifikace investičního nástroje (JIS51_01.BCP2139,
JIS51_01.BCP2141, JIS51_01.BCP2142), Měna emise cenného papíru
(JIS51_01.P0019), Identifikace zákazníka (JIS51_01.BCP2146,
JIS51_01.BCP2147, JIS51_01.BCP2149), Typ vztahu na zákazníka
(JIS51_01.P1505) a Měna účtu zákazníka (JIS51_01.BCP2195) musí být unikátní
v rámci výskytu.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS51_01
  , I0003
  from (\m0 -- if mmt_=m.MT_CHANGE then
      select
        x.*
      , count(*) over (
          partition by
            BCP2139
          , BCP2141
          , BCP2142
          , P0019
          , BCP2146
          , BCP2147
          , BCP2149
          , P1505
          , BCP2195
        ) as c
      from (
          select *
          from (
              select
                x.*
              , row_number() over (
                  partition by I0003 order by pri desc) as rowno
              from (
                  select
                    I0003
                  , BCP2139
                  , BCP2141
                  , BCP2142
                  , P0019
                  , BCP2146
                  , BCP2147
                  , BCP2149
                  , P1505
                  , BCP2195
                  , 1 pri
                  from
                    \tJIS51_01
                  union all
                  select
                    h.I0003
                  , r.BCP2139
                  , r.BCP2141
                  , r.BCP2142
                  , r.P0019
                  , r.BCP2146
                  , r.BCP2147
                  , r.BCP2149
                  , r.P1505
                  , r.BCP2195
                  , 0
                  from
                    rJIS51_01h h
                  , rJIS51_01 r
                  , mi
                  where h.I0003 not in (select I0003 from \dJIS51_01)
                  and h.mi_=mi.ii
                  and mi.mis_=m.IS_CURRENT
                  and mi.mo_=\o
                  and h.r_=r.ii
                ) x
            )
          where rowno=1
        ) x
    )
  where pri=1 and c>1
  \f;\m1 -- else
      select
        I0003
      , count(*) over (
          partition by
            BCP2139
          , BCP2141
          , BCP2142
          , P0019
          , BCP2146
          , BCP2147
          , BCP2149
          , P1505
          , BCP2195
        ) as c
      from \tJIS51_01
    )
  where c>1
  \f;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20180103 JISIFE51 000 0121
/*
Pro hodnoty údaje Druh cenného papíru = dluhové (JIS51_01.P0088 =
111|112|12|13|141|142|149|15|41|42|17|199|311|312|36) musí být podíl hodnot
údajů Množství v nominální hodnotě (JIS51_01.BCP2184) (v Kč nebo po převodu
na Kč) a Účetní hodnota (netto) v Kč (JIS51_01.BCP2007) v intervalu 50 až
150%.*/
declare
  c pls_integer;
  o mo.id%type;
begin
--                                                /load new exchange rates/
  select mo.id into o
  from
    mi
  , mo
  where mi.ii=\u
  and mi.mo_=mo.ii;
  c:=s.ir('exr.ii'); -- lock
  insert into exr
  select
    c+rownum
  , kod_meny
  , datum_plat
  , mnozstvi
  , kurs_stred
  from apldata.kursycnb_all
  where id_kursu=31
  and datum_plat=o
  and kod_meny in (
    select P0019 from \tJIS51_01
    where P0088 in (
        '111', '112', '12', '13', '141'
      , '142', '149', '15', '41', '42'
      , '17', '199', '311', '312', '36'
    ) and not (
      substr(P0088, 1, 2)='19'
      and regexp_instr(BCP2157, 'CERTIFIKAT', 1, 1, 0, 'i')!=0
    )
  )
  and (
        kod_meny
      , datum_plat
    ) not in (
      select
        r
      , d
      from exr where d=o
    );
  if sql%rowcount>0 then s.iw('exr.ii', c+sql%rowcount); commit;
  else rollback; end if;
--                                                                  /check/
  \i
  \s
    \k
  , I0003
  , \aJIS51_01
  , I0003
  from (
      select
        I0003
      , (nvl(BCP2184, 0)+1e-6)*nvl(exr.m, 1)/nvl(exr.q, 1)
        /(BCP2007+1e-6) as n
      from
        \tJIS51_01
      , exr
      where P0088 in (
          '111', '112', '12', '13', '141'
        , '142', '149', '15', '41', '42'
        , '17', '199', '311', '312', '36'
      ) and not (
        substr(P0088, 1, 2)='19'
        and regexp_instr(BCP2157, 'CERTIFIKAT', 1, 1, 0, 'i')!=0
      )
      and P0019=exr.r(+)
      and o=exr.d(+)
    )
  where n not between .5 and 1.5
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE51 000 0131
/*
Rušený záznam nebyl nahlášen.
*/
begin\m0 -- if mmt_=m.MT_CHANGE then
  \i
  \s
    \k
  , I0003
  , \aJIS51_01
  , I0003
  from \dJIS51_01
  where I0003 not in (
      select h.I0003
      from
        rJIS51_01h h
      , mi
      where h.mi_=mi.ii
      and mi.mo_=\o
      and mi.mis_=m.IS_CURRENT
    )
  \f;\m1 -- else
  declare c char(1); begin select 'x' into c from dual where 0=1;
  exception when no_data_found then null; end;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20180103 JISIFE52 000 0103
/*
Musí být vyplněn právě jeden z údajů Identifikace zákazníka (právnické
osoby) nebo Identifikace zákazníka (fyzické osoby). V případě zákazníka -
právnické osoby musí být vyplněn alespoň jeden z údajů (JIS52_01.BCP2131,
JIS52_01.BCP2132) společně s údajem (JIS52_01.BCP2133). V případě zákazníka
- fyzické osoby musí být vyplněn údaj (JIS52_01.BCP2134) společně s právě
jedním z údajů (JIS52_01.BCP2135, JIS52_01.BCP2136) a zároveň také oba údaje
(JIS52_01.BCP2137, JIS52_01.BCP2138).
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS52_01
  , I0003
  from \tJIS52_01
  where nvl2(BCP2133, 1, 0)=nvl2(BCP2134, 1, 0)
  or (
    BCP2133 is not null
    and nvl2(BCP2131||BCP2132, 1, 0)=0
  ) or (
    BCP2134 is not null
    and (
      nvl2(BCP2135, 1, 0)=nvl2(BCP2136, 1, 0)
      or BCP2137 is null
      or BCP2138 is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE52 000 0105
/*
Je-li pro identifikaci zákazníka - právnické osoby použit LEI kód
((JIS52_01.BCP2131) je vyplněný), pak hodnota údaje musí být validní LEI
kód. Je-li pro identifikaci zákazníka - právnické osoby použito IČ
((JIS52_01.BCP2132) je vyplněný), pak hodnota údaje musí být validní IČ.
Je-li pro identifikaci zahraniční právnické osoby (JIS52_01.P1125 <> CZ)
(v poli JIS52_01.BCP2132) použit náhradní identifikátor složený z LEI
vykazující osoby + interní ID, prvních 20 znaků řetězce musí být LEI
vykazující osoby a interní ID musí být neprázdný řetězec.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS52_01
  , I0003
  from \tJIS52_01
  where (
    BCP2131 is not null
    and e.is_lei(BCP2131)=s.GC_NO
  ) or (
    BCP2132 is not null
    and P1125='CZ'
    and e.is_crn(BCP2132)=s.GC_NO
  ) or (
    BCP2132 is not null
    and P1125!='CZ'
    and (
      substr(BCP2132, 1, 20)!='\L'
      or substr(BCP2132, 21) is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE52 000 0106
/*
Je-li vyplněn údaj Identifikační kód fyzické osoby (JIS52_01.BCP2134), pak
musí první 2 znaky obsahovat validní kód země dle ISO 3166-1 alpha-2. Je-li
kód země Česká republika (CZ) a Typ identifikačního kódu fyzické osoby 1
(JIS52_01.BCP2135 = NIDN), pak hodnota identifikátoru (JIS52_01.BCP2134) od
3. znaku musí být validní RČ. Pokud je Typ identifikačního kódu fyzické
osoby 1 (JIS52_01.BCP2135 = CCPT), pak identifikátor (JIS52_01.BCP2134) musí
obsahovat 3 - 35 znaků. Pokud je k identifikaci FO použit CONCAT
(JIS52_01.BCP2136 = CONCAT), pak identifikátor (JIS52_01.BCP2134), musí
obsahovat právě 20 znaků, přičemž 3. - 10. znak musí být validní datum
narození ve tvaru RRRRMMDD, 11. a 16. znak musí být velké písmeno a zbylé
znaky velká písmena nebo #.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS52_01
  , I0003
  from \tJIS52_01
  where BCP2134 is not null
  and (
    substr(BCP2134, 1, 2) not in (select id from ey)
    or (
      BCP2135='NIDN'
      and substr(BCP2134, 1, 2)='CZ'
      and e.is_bcn(substr(BCP2134, 3))=s.GC_NO
    ) or (
      BCP2135='CCPT'
      and 0=case substr(BCP2134, 1, 2)
        when 'FI' then regexp_instr(BCP2134, '^[0-9A-Z+-]{3,35}$')
        when 'LV' then regexp_instr(BCP2134, '^[0-9A-Z-]{3,35}$')
        else regexp_instr(BCP2134, '^[0-9A-Z]{3,35}$') end
    ) or (
      BCP2136='CONCAT'
      and (
        regexp_instr(BCP2134
        , '^[A-Z]{2}[0-9]{8}[A-Z][A-Z#]{4}[A-Z][A-Z#]{4}$')=0
        or e.is_date(substr(BCP2134, 3, 8), 'yyyymmdd')=s.GC_NO
      )
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE52 000 0108
/*
Je-li pro identifikaci investičního nástroje použit ISIN (JIS52_01.BCP2127
je vyplněný), pak hodnota údaje musí být validní ISIN."
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS52_01
  , I0003
  from \tJIS52_01
  where BCP2127 is not null
  and e.is_isin(BCP2127)=s.GC_NO
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE52 000 0109
/*
Kombinace hodnot údajů Identifikace investičního nástroje (JIS52_01.BCP2127,
JIS52_01.BCP2128, JIS52_01.BCP2129, JIS52_01.BCP2130), Identifikace
zákazníka (JIS52_01.BCP2131, JIS52_01.BCP2132, JIS52_01.BCP2134), Měna
(JIS52_01.P0019) a Typ vztahu na zákazníka (JIS52_01.P1505) musí být
unikátní v rámci výskytu.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS52_01
  , I0003
  from (\m0 -- if mmt_=m.MT_CHANGE then
      select
        x.*
      , count(*) over (
          partition by
            BCP2127
          , BCP2128
          , BCP2129
          , BCP2130
          , P0019
          , BCP2131
          , BCP2132
          , BCP2134
          , P1505
        ) as c
      from (
          select *
          from (
              select
                x.*
              , row_number() over (
                  partition by I0003 order by pri desc) as rowno
              from (
                  select
                    I0003
                  , BCP2127
                  , BCP2128
                  , BCP2129
                  , BCP2130
                  , P0019
                  , BCP2131
                  , BCP2132
                  , BCP2134
                  , P1505
                  , 1 pri
                  from
                    \tJIS52_01
                  union all
                  select
                    h.I0003
                  , r.BCP2127
                  , r.BCP2128
                  , r.BCP2129
                  , r.BCP2130
                  , r.P0019
                  , r.BCP2131
                  , r.BCP2132
                  , r.BCP2134
                  , r.P1505
                  , 0
                  from
                    rJIS52_01h h
                  , rJIS52_01 r
                  , mi
                  where h.I0003 not in (select I0003 from \dJIS52_01)
                  and h.mi_=mi.ii
                  and mi.mis_=m.IS_CURRENT
                  and mi.mo_=\o
                  and h.r_=r.ii
                ) x
            )
          where rowno=1
        ) x
    )
  where pri=1 and c>1
  \f;\m1 -- else
      select
        I0003
      , count(*) over (
          partition by
            BCP2127
          , BCP2128
          , BCP2129
          , BCP2130
          , P0019
          , BCP2131
          , BCP2132
          , BCP2134
          , P1505
        ) as c
      from \tJIS52_01
    )
  where c>1
  \f;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20180103 JISIFE52 000 0110
/*
Rušený záznam nebyl nahlášen.
*/
begin\m0 -- if mmt_=m.MT_CHANGE then
  \i
  \s
    \k
  , I0003
  , \aJIS52_01
  , I0003
  from \dJIS52_01
  where I0003 not in (
      select h.I0003
      from
        rJIS52_01h h
      , mi
      where h.mi_=mi.ii
      and mi.mo_=\o
      and mi.mis_=m.IS_CURRENT
    )
  \f;\m1 -- else
  declare c char(1); begin select 'x' into c from dual where 0=1;
  exception when no_data_found then null; end;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20180103 JISIFE53 000 0103
/*
Musí být vyplněn právě jeden z údajů Identifikace zákazníka (právnické
osoby) nebo Identifikace zákazníka (fyzické osoby). V případě zákazníka -
právnické osoby musí být vyplněn alespoň jeden z údajů (JIS53_01.BCP2118,
JIS53_01.BCP2119) společně s údajem (JIS53_01.BCP2120). V případě zákazníka
- fyzické osoby musí být vyplněn údaj (JIS53_01.BCP2121) společně s právě
jedním z údajů (JIS53_01.BCP2122, JIS53_01.BCP2123) a zároveň také oba údaje
(JIS53_01.BCP2124, JIS53_01.BCP2125).
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS53_01
  , I0003
  from \tJIS53_01
  where nvl2(BCP2120, 1, 0)=nvl2(BCP2121, 1, 0)
  or (
    BCP2120 is not null
    and nvl2(BCP2118||BCP2119, 1, 0)=0
  ) or (
    BCP2121 is not null
    and (
      nvl2(BCP2122, 1, 0)=nvl2(BCP2123, 1, 0)
      or BCP2124 is null
      or BCP2125 is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE53 000 0105
/*
Je-li pro identifikaci zákazníka - právnické osoby použit LEI kód
((JIS53_01.BCP2118) je vyplněný), pak hodnota údaje musí být validní LEI
kód. Je-li pro identifikaci zákazníka - právnické osoby použito IČ
((JIS53_01.BCP2119) je vyplněný), pak hodnota údaje musí být validní IČ.
Je-li pro identifikaci zahraniční právnické osoby (JIS53_01.P1125 <> CZ)
(v poli JIS53_01.BCP2119) použit náhradní identifikátor složený z LEI
vykazující osoby + interní ID, prvních 20 znaků řetězce musí být LEI
vykazující osoby a interní ID musí být neprázdný řetězec.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS53_01
  , I0003
  from \tJIS53_01
  where (
    BCP2118 is not null
    and e.is_lei(BCP2118)=s.GC_NO
  ) or (
    BCP2119 is not null
    and P1125='CZ'
    and e.is_crn(BCP2119)=s.GC_NO
  ) or (
    BCP2119 is not null
    and P1125!='CZ'
    and (
      substr(BCP2119, 1, 20)!='\L'
      or substr(BCP2119, 21) is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE53 000 0106
/*
Je-li vyplněn údaj Identifikační kód fyzické osoby (JIS53_01.BCP2121), pak
musí první 2 znaky obsahovat validní kód země dle ISO 3166-1 alpha-2. Je-li
kód země Česká republika (CZ) a Typ identifikačního kódu fyzické osoby 1
(JIS53_01.BCP2122 = NIDN), pak hodnota identifikátoru (JIS53_01.BCP2121) od
3. znaku musí být validní RČ. Pokud je Typ identifikačního kódu fyzické
osoby 1 (JIS53_01.BCP2122 = CCPT), pak identifikátor (JIS53_01.BCP2121) musí
obsahovat 3 - 35 znaků. Pokud je k identifikaci FO použit CONCAT
(JIS53_01.BCP2123 = CONCAT), pak identifikátor (JIS53_01.BCP2121), musí
obsahovat právě 20 znaků, přičemž 3. - 10. znak musí být validní datum
narození ve tvaru RRRRMMDD, 11. a 16. znak musí být velké písmeno a zbylé
znaky velká písmena nebo #.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS53_01
  , I0003
  from \tJIS53_01
  where BCP2121 is not null
  and (
    substr(BCP2121, 1, 2) not in (select id from ey)
    or (
      BCP2122='NIDN'
      and substr(BCP2121, 1, 2)='CZ'
      and e.is_bcn(substr(BCP2121, 3))=s.GC_NO
    ) or (
      BCP2122='CCPT'
      and 0=case substr(BCP2121, 1, 2)
        when 'FI' then regexp_instr(BCP2121, '^[0-9A-Z+-]{3,35}$')
        when 'LV' then regexp_instr(BCP2121, '^[0-9A-Z-]{3,35}$')
        else regexp_instr(BCP2121, '^[0-9A-Z]{3,35}$') end
    ) or (
      BCP2123='CONCAT'
      and (
        regexp_instr(BCP2121
        , '^[A-Z]{2}[0-9]{8}[A-Z][A-Z#]{4}[A-Z][A-Z#]{4}$')=0
        or e.is_date(substr(BCP2121, 3, 8), 'yyyymmdd')=s.GC_NO
      )
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE53 000 0107
/*
Kombinace hodnot údajů Identifikace zákazníka (JIS53_01.BCP2118,
JIS53_01.BCP2119, JIS53_01.BCP2121), Typ vztahu na zákazníka
(JIS53_01.P1505) a Měna (JIS53_01.P0019) musí být unikátní v rámci výskytu.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS53_01
  , I0003
  from (\m0 -- if mmt_=m.MT_CHANGE then
      select
        x.*
      , count(*) over (
          partition by
            BCP2118
          , BCP2119
          , BCP2121
          , P0019
          , P1505
        ) as c
      from (
          select *
          from (
              select
                x.*
              , row_number() over (
                  partition by I0003 order by pri desc) as rowno
              from (
                  select
                    I0003
                  , BCP2118
                  , BCP2119
                  , BCP2121
                  , P0019
                  , P1505
                  , 1 pri
                  from
                    \tJIS53_01
                  union all
                  select
                    h.I0003
                  , r.BCP2118
                  , r.BCP2119
                  , r.BCP2121
                  , r.P0019
                  , r.P1505
                  , 0
                  from
                    rJIS53_01h h
                  , rJIS53_01 r
                  , mi
                  where h.I0003 not in (select I0003 from \dJIS53_01)
                  and h.mi_=mi.ii
                  and mi.mis_=m.IS_CURRENT
                  and mi.mo_=\o
                  and h.r_=r.ii
                ) x
            )
          where rowno=1
        ) x
    )
  where pri=1 and c>1
  \f;\m1 -- else
      select
        I0003
      , count(*) over (
          partition by
            BCP2118
          , BCP2119
          , BCP2121
          , P0019
          , P1505
        ) as c
      from \tJIS53_01
    )
  where c>1
  \f;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20180103 JISIFE53 000 0108
/*
Rušený záznam nebyl nahlášen.
*/
begin\m0 -- if mmt_=m.MT_CHANGE then
  \i
  \s
    \k
  , I0003
  , \aJIS53_01
  , I0003
  from \dJIS53_01
  where I0003 not in (
      select h.I0003
      from
        rJIS53_01h h
      , mi
      where h.mi_=mi.ii
      and mi.mo_=\o
      and mi.mis_=m.IS_CURRENT
    )
  \f;\m1 -- else
  declare c char(1); begin select 'x' into c from dual where 0=1;
  exception when no_data_found then null; end;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20180103 JISIFE54 000 0102
/*
Je-li pro identifikaci investičního nástroje použit ISIN (JIS54_01.BCP2170
je vyplněný), pak hodnota údaje musí být validní ISIN.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS54_01
  , I0003
  from \tJIS54_01
  where BCP2170 is not null
  and e.is_isin(BCP2170)=s.GC_NO
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE54 000 0103
/*
Musí být vyplněn právě jeden z údajů Identifikace zákazníka (právnické
osoby) nebo Identifikace zákazníka (fyzické osoby). V případě zákazníka -
právnické osoby musí být vyplněn alespoň jeden z údajů (JIS54_01.BCP2159,
JIS54_01.BCP2160) společně s údajem (JIS54_01.BCP2161). V případě fyzické
osoby musí být vyplněn údaj (JIS54_01.BCP2162) společně s právě jedním z
údajů (JIS54_01.BCP2163, JIS54_01.BCP2164) a zároveň také oba údaje
(JIS54_01.BCP2165, JIS54_01.BCP2166).
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS54_01
  , I0003
  from \tJIS54_01
  where nvl2(BCP2161, 1, 0)=nvl2(BCP2162, 1, 0)
  or (
    BCP2161 is not null
    and nvl2(BCP2159||BCP2160, 1, 0)=0
  ) or (
    BCP2162 is not null
    and (
      nvl2(BCP2163, 1, 0)=nvl2(BCP2164, 1, 0)
      or BCP2165 is null
      or BCP2166 is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE54 000 0105
/*
Je-li pro identifikaci zákazníka - právnické osoby použit LEI kód
((JIS54_01.BCP2159) je vyplněný), pak hodnota údaje musí být validní LEI
kód. Je-li pro identifikaci zákazníka - právnické osoby použito IČ
((JIS54_01.BCP2160) je vyplněný), pak hodnota údaje musí být validní IČ.
Je-li pro identifikaci zahraniční právnické osoby (v poli JIS54_01.BCP2160)
použit náhradní identifikátor složený z LEI vykazující osoby + interní ID,
prvních 20 znaků řetězce musí být LEI vykazující osoby a interní ID musí být
neprázdný řetězec.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS54_01
  , I0003
  from \tJIS54_01
  where (
    BCP2159 is not null
    and e.is_lei(BCP2159)=s.GC_NO
  ) or nvl(length(BCP2160), 0) between 1 and 7
  or (
    nvl(length(BCP2160), 0)=8
    and e.is_crn(BCP2160)=s.GC_NO
  ) or nvl(length(BCP2160), 0) between 9 and 20
  or (
    nvl(length(BCP2160), 0)>20
    and substr(BCP2160, 1, 20)!='\L'
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE54 000 0106
/*
Je-li vyplněn údaj Identifikační kód fyzické osoby (JIS54_01.BCP2162), pak
musí první 2 znaky obsahovat validní kód země dle ISO 3166-1 alpha-2. Je-li
kód země Česká republika (CZ) a Typ identifikačního kódu fyzické osoby 1
(JIS54_01.BCP2163 = NIDN), pak hodnota identifikátoru (JIS54_01.BCP2162) od
3. znaku musí být validní RČ. Pokud je Typ identifikačního kódu fyzické
osoby 1 (JIS54_01.BCP2163 = CCPT), pak identifikátor (JIS54_01.BCP2162) musí
obsahovat 3 - 35 znaků. Pokud je k identifikaci FO použit CONCAT
(JIS54_01.BCP2164 = CONCAT), pak identifikátor (JIS54_01.BCP2162), musí
obsahovat právě 20 znaků, přičemž 3. - 10. znak musí být validní datum
narození ve tvaru RRRRMMDD, 11. a 16. znak musí být velké písmeno a zbylé
znaky velká písmena nebo #.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS54_01
  , I0003
  from \tJIS54_01
  where BCP2162 is not null
  and (
    substr(BCP2162, 1, 2) not in (select id from ey)
    or (
      BCP2163='NIDN'
      and substr(BCP2162, 1, 2)='CZ'
      and e.is_bcn(substr(BCP2162, 3))=s.GC_NO
    ) or (
      BCP2163='CCPT'
      and 0=case substr(BCP2162, 1, 2)
        when 'FI' then regexp_instr(BCP2162, '^[0-9A-Z+-]{3,35}$')
        when 'LV' then regexp_instr(BCP2162, '^[0-9A-Z-]{3,35}$')
        else regexp_instr(BCP2162, '^[0-9A-Z]{3,35}$') end
    ) or (
      BCP2164='CONCAT'
      and (
        regexp_instr(BCP2162
        , '^[A-Z]{2}[0-9]{8}[A-Z][A-Z#]{4}[A-Z][A-Z#]{4}$')=0
        or e.is_date(substr(BCP2162, 3, 8), 'yyyymmdd')=s.GC_NO
      )
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE54 000 0109
/*
Rušený záznam nebyl nahlášen.
*/
begin\m0 -- if mmt_=m.MT_CHANGE then
  \i
  \s
    \k
  , I0003
  , \aJIS54_01
  , I0003
  from \dJIS54_01
  where I0003 not in (
      select h.I0003
      from
        rJIS54_01h h
      , mi
      where h.mi_=mi.ii
      and mi.mo_=\o
      and mi.mis_=m.IS_CURRENT
    )
  \f;\m1 -- else
  declare c char(1); begin select 'x' into c from dual where 0=1;
  exception when no_data_found then null; end;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20180103 JISIFE54 000 0902
/*
Technologická rezerva - generální upozornění.
Záznam není v rámci výskytu unikátní. Prověřit možnou duplicitu.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS54_01
  , I0003
  from (\m0 -- if mmt_=m.MT_CHANGE then
      select
        x.*
      , count(*) over (partition by md5) as c
      from (
          select *
          from (
              select
                x.*
              , row_number() over (
                  partition by I0003 order by pri desc) as rowno
              from (
                  select
                    I0003
                  , md5
                  , 1 pri
                  from
                    \tJIS54_01
                  union all
                  select
                    h.I0003
                  , r.md5
                  , 0
                  from
                    rJIS54_01h h
                  , rJIS54_01 r
                  , mi
                  where h.I0003 not in (select I0003 from \dJIS54_01)
                  and h.mi_=mi.ii
                  and mi.mis_=m.IS_CURRENT
                  and mi.mo_=\o
                  and h.r_=r.ii
                ) x
            )
          where rowno=1
        ) x
    )
  where pri=1 and c>1
  \f;\m1 -- else
      select
        I0003
      , count(*) over (partition by md5) as c
      from \tJIS54_01
    )
  where c>1
  \f;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20180103 JISIFE55 000 0101
/*
Musí být vyplněn právě jeden z údajů Identifikace zákazníka (právnické
osoby) nebo Identifikace zákazníka (fyzické osoby). V případě zákazníka -
právnické osoby musí být vyplněn alespoň jeden z údajů (JIS55_01.BCP2186,
JIS55_01.BCP2187) společně s údajem (JIS55_01.BCP2188). V případě zákazníka
- fyzické osoby musí být vyplněn údaj (JIS55_01.BCP2189) společně s právě
jedním z údajů (JIS55_01.BCP2190, JIS55_01.BCP2191) a zároveň také oba údaje
(JIS55_01.BCP2192, JIS55_01.BCP2193).
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS55_01
  , I0003
  from \tJIS55_01
  where nvl2(BCP2188, 1, 0)=nvl2(BCP2189, 1, 0)
  or (
    BCP2188 is not null
    and nvl2(BCP2186||BCP2187, 1, 0)=0
  ) or (
    BCP2189 is not null
    and (
      nvl2(BCP2190, 1, 0)=nvl2(BCP2191, 1, 0)
      or BCP2192 is null
      or BCP2193 is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE55 000 0103
/*
Je-li pro identifikaci zákazníka - právnické osoby použit LEI kód
((JIS55_01.BCP2186) je vyplněný), pak hodnota údaje musí být validní LEI
kód. Je-li pro identifikaci zákazníka - právnické osoby použito IČ
((JIS55_01.BCP2187) je vyplněný), pak hodnota údaje musí být validní IČ.
Je-li pro identifikaci zahraniční právnické osoby (v poli JIS55_01.BCP2187)
použit náhradní identifikátor složený z LEI vykazující osoby + interní ID,
prvních 20 znaků řetězce musí být LEI vykazující osoby a interní ID musí být
neprázdný řetězec.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS55_01
  , I0003
  from \tJIS55_01
  where (
    BCP2186 is not null
    and e.is_lei(BCP2186)=s.GC_NO
  ) or nvl(length(BCP2187), 0) between 1 and 7
  or (
    nvl(length(BCP2187), 0)=8
    and e.is_crn(BCP2187)=s.GC_NO
  ) or nvl(length(BCP2187), 0) between 9 and 20
  or (
    nvl(length(BCP2187), 0)>20
    and substr(BCP2187, 1, 20)!='\L'
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE55 000 0104
/*
Je-li vyplněn údaj Identifikační kód fyzické osoby (JIS55_01.BCP2189), pak
musí první 2 znaky obsahovat validní kód země dle ISO 3166-1 alpha-2. Je-li
kód země Česká republika (CZ) a Typ identifikačního kódu fyzické osoby 1
(JIS55_01.BCP2190 = NIDN), pak hodnota identifikátoru (JIS55_01.BCP2189) od
3. znaku musí být validní RČ. Pokud je Typ identifikačního kódu fyzické
osoby 1 (JIS55_01.BCP2190 = CCPT), pak identifikátor (JIS55_01.BCP2189) musí
obsahovat 3 - 35 znaků. Pokud je k identifikaci FO použit CONCAT
(JIS55_01.BCP2191 = CONCAT), pak identifikátor (JIS55_01.BCP2189) musí
obsahovat právě 20 znaků, přičemž 3. - 10. znak musí být validní datum
narození ve tvaru RRRRMMDD, 11. a 16. znak musí být velké písmeno a zbylé
znaky velká písmena nebo #.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS55_01
  , I0003
  from \tJIS55_01
  where BCP2189 is not null
  and (
    substr(BCP2189, 1, 2) not in (select id from ey)
    or (
      BCP2190='NIDN'
      and substr(BCP2189, 1, 2)='CZ'
      and e.is_bcn(substr(BCP2189, 3))=s.GC_NO
    ) or (
      BCP2190='CCPT'
      and 0=case substr(BCP2189, 1, 2)
        when 'FI' then regexp_instr(BCP2189, '^[0-9A-Z+-]{3,35}$')
        when 'LV' then regexp_instr(BCP2189, '^[0-9A-Z-]{3,35}$')
        else regexp_instr(BCP2189, '^[0-9A-Z]{3,35}$') end
    ) or (
      BCP2191='CONCAT'
      and (
        regexp_instr(BCP2189
        , '^[A-Z]{2}[0-9]{8}[A-Z][A-Z#]{4}[A-Z][A-Z#]{4}$')=0
        or e.is_date(substr(BCP2189, 3, 8), 'yyyymmdd')=s.GC_NO
      )
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 JISIFE55 000 0106
/*
Rušený záznam nebyl nahlášen.
*/
begin\m0 -- if mmt_=m.MT_CHANGE then
  \i
  \s
    \k
  , I0003
  , \aJIS55_01
  , I0003
  from \dJIS55_01
  where I0003 not in (
      select h.I0003
      from
        rJIS55_01h h
      , mi
      where h.mi_=mi.ii
      and mi.mo_=\o
      and mi.mis_=m.IS_CURRENT
    )
  \f;\m1 -- else
  declare c char(1); begin select 'x' into c from dual where 0=1;
  exception when no_data_found then null; end;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20180103 JISIFE55 000 0902
/*
Technologická rezerva - generální upozornění.
Záznam není v rámci výskytu unikátní. Prověřit možnou duplicitu.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS55_01
  , I0003
  from (\m0 -- if mmt_=m.MT_CHANGE then
      select
        x.*
      , count(*) over (partition by md5) as c
      from (
          select *
          from (
              select
                x.*
              , row_number() over (
                  partition by I0003 order by pri desc) as rowno
              from (
                  select
                    I0003
                  , md5
                  , 1 pri
                  from
                    \tJIS55_01
                  union all
                  select
                    h.I0003
                  , r.md5
                  , 0
                  from
                    rJIS55_01h h
                  , rJIS55_01 r
                  , mi
                  where h.I0003 not in (select I0003 from \dJIS55_01)
                  and h.mi_=mi.ii
                  and mi.mis_=m.IS_CURRENT
                  and mi.mo_=\o
                  and h.r_=r.ii
                ) x
            )
          where rowno=1
        ) x
    )
  where pri=1 and c>1
  \f;\m1 -- else
      select
        I0003
      , count(*) over (partition by md5) as c
      from \tJIS55_01
    )
  where c>1
  \f;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20180103 PERFIM30 000 0101
/*
Hodnota údaje Identifikace osoby (PERF30_11.RFD0002, PERF30_11.RFD0003,
PERF30_11.RFD0005, PERF30_11.RFD0134) musí být unikátní v rámci výskytu.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aPERF30_11
  , T0019
  from (
      select
        T0019
      , count(*) over (
          partition by
            RFD0002
          , RFD0003
          , RFD0005
          , RFD0134
        ) as c
      from \tPERF30_11
    )
  where c>1
  \f; :1:=sql%rowcount;
end;

MKT20180103 PERFIM30 000 0102
/*
V případě, že byla osoba již dříve nahlášena, některé z hodnot údajů o dané
osobě musí být odlišné od předchozího hlášení.
*/
declare
  o mo%rowtype;
begin
  select * into o from mo where ii=\o;
  \i
  \s
    \k
  , d
  , \aPERF30_11
  , T0019
  from (
      with qp as ( -- previous
        select /*+ materialize */
          pid
        , md5
        , f
        from (
            select
              RFD0002||s.BS||RFD0003||s.BS||RFD0005||s.BS||RFD0134 pid
            , md5
            , mi.id f
            , row_number() over (
                partition by
                  RFD0002||s.BS||RFD0003||s.BS||RFD0005||s.BS||RFD0134
                order by mo.id desc -- see qx
              ) as rowno
            from
              rperf30_11 r
            , rperf30_11h h
            , mi
            , mo
            , md
            where r.ii=h.r_
            and h.mi_=mi.ii
            and mi.mis_=m.IS_CURRENT
            and mi.mo_=mo.ii
            and mo.mp_=\p
            and mo.md_=md.ii
            and md.id='PERFIM30'
            and mo.id<o.id -- see qx
          )
        where rowno=1
      ), qx as ( -- next
        select /*+ materialize */
          pid
        , md5
        , f
        from (
            select
              RFD0002||s.BS||RFD0003||s.BS||RFD0005||s.BS||RFD0134 pid
            , md5
            , mi.id f
            , row_number() over (
                partition by
                  RFD0002||s.BS||RFD0003||s.BS||RFD0005||s.BS||RFD0134
                order by mo.id -- see qp
              ) as rowno
            from
              rperf30_11 r
            , rperf30_11h h
            , mi
            , mo
            , md
            where r.ii=h.r_
            and h.mi_=mi.ii
            and mi.mis_=m.IS_CURRENT
            and mi.mo_=mo.ii
            and mo.mp_=\p
            and mo.md_=md.ii
            and md.id='PERFIM30'
            and mo.id>o.id -- see qp
          )
        where rowno=1
      ), qo as ( -- old
        select /*+ materialize */
          RFD0002||s.BS||RFD0003||s.BS||RFD0005||s.BS||RFD0134 pid
        , T0019
        , mi.id f
        from
          rperf30_11 r
        , rperf30_11h h
        , mi
        where r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=\o
      ), qn as ( -- new
        select /*+ materialize */
          RFD0002||s.BS||RFD0003||s.BS||RFD0005||s.BS||RFD0134 pid
        , T0019
        , md5
        from \tPERF30_11
      )
      select
        '(file.'||f||',T0019.'||T0019||')' d
      , T0019
      from (
          select
            T0019
          , f
          from
            qn
          , qp
          where qn.pid=qp.pid
          and qn.md5=qp.md5
          union all
          select
            T0019
          , f
          from
            qn
          , qx
          where qn.pid=qx.pid
          and qn.md5=qx.md5
        )
      union all
      select
        '(file.'||d.f||',T0019.'||T0019||')' d
      , -1 -- unsaveable - no reference in h.mi_
      from (
          select * from qo where pid not in (select pid from qn)
        ) d -- diff
      , qp
      , qx
      where d.pid=qp.pid
      and d.pid=qx.pid
      and qp.md5=qx.md5
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 PERFIM30 000 0103
/*
Je-li vyplněn údaj Původní identifikační kód fyzické osoby
(PERF30_11.RFD0135), potom hodnota tohoto údaje musela být již dříve
nahlášená prostřednictvím údaje Identifikační kód fyzické osoby
(PERF30_11.RFD0005). Je-li vyplněn údaj Identifikační kód fyzické osoby
(PERF30_11.RFD0005) a jedná se o změnu/opravu jakéhokoli dříve nahlášeného
údaje daného záznamu, nesmí být měněn záznam, na který je prostřednictvím
jiného platně přijatého PERF30_11.RFD0135 odkazováno v některém z časově
následujících výskytů.
*/
declare
  c pls_integer; -- count
  ec stp.id%type:='__\e.102.ec'; -- error count
  o mo%rowtype;
  u mi%rowtype;
  sn stp.id%type:='__\e.102.sn'; -- step No
begin
  select * into o from mo where ii=\o;
  select * into u from mi where ii=\u;
  if s.pg(sn, s.GC_NO) is null then
    \i
    \s
      \k
    , '(T0019.'||T0019||')'
    , \aPERF30_11
    , T0019
    from \tPERF30_11 n -- new
    , (
        select RFD0135 from \tPERF30_11 where RFD0135 is not null
        minus
        select RFD0005
        from
          rperf30_11 r
        , rperf30_11h h
        , mi
        , mo
        , md
        where r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='PERFIM30'
        and mo.id<o.id
        and RFD0005 is not null
      ) o -- old
    where n.RFD0135=o.RFD0135
    \f; s.ps(ec, sql%rowcount); s.ps(sn, '0');
    commit; end if;
  if s.pg(sn)='0' and u.mmt_=m.MT_CORRECTION then
    \i
    \s
      \k
    , '(file.'||mi.id||',T0019.'||T0019||')'
    , \aPERF30_11
    , -1 -- unsaveable - no reference in h.mi_
    from (
        with q as (
select /*+ materialize */
  RFD0135
, P0053
from (
    select
      r.RFD0135
    , mo.id P0053
    , row_number() over (partition by r.RFD0135 order by mo.id) as rowno
    from
      rperf30_11 r
    , rperf30_11h h
    , mi
    , mo
    , md
    , (
        select RFD0005
        from
          rperf30_11 r
        , rperf30_11h h
        , mi
        where r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=\o
        and RFD0005 is not null
        minus
        select RFD0005 from \tPERF30_11 where RFD0005 is not null
      ) d
    where r.ii=h.r_
    and h.mi_=mi.ii
    and mi.mis_=m.IS_CURRENT
    and mi.mo_=mo.ii
    and mo.mp_=\p
    and mo.md_=md.ii
    and md.id='PERFIM30'
    and mo.id>o.id
    and r.RFD0135=d.RFD0005
  )
where rowno=1
        )
        select RFD0135 from q
        minus
        select r.RFD0135
        from
          rperf30_11 r
        , rperf30_11h h
        , mi
        , mo
        , md
        , q
        where r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_!=o.ii
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='PERFIM30'
        and mo.id<q.P0053
        and r.RFD0005=q.RFD0135
      ) m -- miss
    , rperf30_11 r
    , rperf30_11h h
    , mi
    where r.ii=h.r_
    and h.mi_=mi.ii
    and mi.mis_=m.IS_CURRENT
    and mi.mo_=\o
    and r.RFD0005=m.RFD0135
    \f; s.ps(ec, sql%rowcount+s.pg(ec)); s.ps(sn, '1');
    commit; end if; :1:=s.pg(ec); s.pd(ec); s.pd(sn);
end;

MKT20180103 PERFIM30 000 0104
/*
Údaj identifikace osoby musí být vždy vyplněn, a to následujícím způsobem: v
případě právnické osoby musí být vyplněn alespoň jeden z údajů
(PERF30_11.RFD0002, PERF30_11.RFD0003) společně s údajem
(PERF30_11.RFD0004). V případě fyzické osoby musí být vyplněn údaj
(PERF30_11.RFD0005) společně s právě jedním z údajů (PERF30_11.RFD0006,
PERF30_11.RFD0007) a zároveň také všechny údaje (PERF30_11.RFD0008,
PERF30_11.RFD0009, PERF30_11.RFD0010).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aPERF30_11
  , T0019
  from \tPERF30_11
  where nvl2(RFD0002||RFD0003, 1, 0)=nvl2(RFD0005, 1, 0)
  or (
    RFD0002||RFD0003 is not null
    and RFD0004 is null
  ) or (
    RFD0005 is not null
    and (
      nvl2(RFD0006, 1, 0)=nvl2(RFD0007, 1, 0)
      or RFD0008 is null
      or RFD0009 is null
      or RFD0010 is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 PERFIM30 000 0201
/*
Je-li pro identifikaci právnické osoby použit LEI kód ((PERF30_11.RFD0002)
je vyplněný), pak hodnota údaje musí být validní LEI kód. Je-li pro
identifikaci právnické osoby použito IČ ((PERF30_11.RFD0003) je vyplněný),
pak hodnota údaje musí být validní IČ. Je-li pro identifikaci zahraniční
právnické osoby (PER30_11.RFD0014 <> CZ) (v poli PER30_11.RFD0003) použit
náhradní identifikátor složený z LEI vykazující osoby + interní ID, prvních
20 znaků řetězce musí být LEI vykazující osoby a interní ID musí být
neprázdný řetězec.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aPERF30_11
  , T0019
  from \tPERF30_11
  where (
    RFD0002 is not null
    and e.is_lei(RFD0002)=s.GC_NO
  ) or (
    RFD0003 is not null
    and RFD0014='CZ'
    and e.is_crn(RFD0003)=s.GC_NO
  ) or (
    RFD0003 is not null
    and RFD0014!='CZ'
    and (
      substr(RFD0003, 1, 20)!='\L'
      or substr(RFD0003, 21) is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 PERFIM30 000 0202
/*
Je-li vyplněn údaj Identifikační kód fyzické osoby (PERF30_11.RFD0005), pak
musí první 2 znaky obsahovat validní kód země dle ISO 3166-1 alpha-2. Je-li
kód země Česká republika (CZ) a Typ identifikačního kódu fyzické osoby 1
(PERF30_11.RFD0006 = NIDN), pak hodnota identifikátoru (PERF30_11.RFD0005)
od 3. znaku musí být validní RČ. Pokud je Typ identifikačního kódu fyzické
osoby 1 (PERF30_11.RFD0006 = CCPT), pak identifikátor (PERF30_11.RFD0005)
musí obsahovat 3 - 35 znaků. Pokud je k identifikaci FO použit CONCAT
(PERF30_11.RFD0007 = CONCAT), pak identifikátor (PERF30_11.RFD0005), musí
obsahovat právě 20 znaků, přičemž 3. - 10. znak musí být datum narození
shodné s datem narození uvedeným v poli (PERF30_11.RFD0008), 11. a 16. znak
musí být velké písmeno a zbylé znaky velká písmena nebo #.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aPERF30_11
  , T0019
  from \tPERF30_11
  where RFD0005 is not null
  and (
    substr(RFD0005, 1, 2) not in (select id from ey)
    or (
      RFD0006='NIDN'
      and substr(RFD0005, 1, 2)='CZ'
      and e.is_bcn(substr(RFD0005, 3))=s.GC_NO
    ) or (
      RFD0006='CCPT'
      and 0=case substr(RFD0005, 1, 2)
        when 'FI' then regexp_instr(RFD0005, '^[0-9A-Z+-]{3,35}$')
        when 'LV' then regexp_instr(RFD0005, '^[0-9A-Z-]{3,35}$')
        else regexp_instr(RFD0005, '^[0-9A-Z]{3,35}$') end
    ) or (
      RFD0007='CONCAT'
      and (
        regexp_instr(RFD0005
        , '^[A-Z]{2}[0-9]{8}[A-Z][A-Z#]{4}[A-Z][A-Z#]{4}$')=0
        or substr(RFD0005, 3, 8)!=nvl(to_char(RFD0008, s.FMT_CMPDATE), 'x')
      )
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 PERFIM30 000 0203
/*
Hodnota údaje Datum narození PERF30_11.RFD0008 nesmí být z budoucnosti.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aPERF30_11
  , T0019
  from
    \tPERF30_11
  , (select id P0053 from mo where ii=\o)
  where RFD0008 is not null
  and P0053<RFD0008
  \f; :1:=sql%rowcount;
end;

MKT20180103 PERFIM30 000 0901
/*
Technologická rezerva - generální chyba.
  HEX RULE
 ---- ----------------------------------------------------------------------
   1. Záznam není v rámci výskytu unikátní. Prověřit možnou duplicitu
      (T0019).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||',rule.'||sum(hex)||')'
  , \aPERF30_11
  , T0019
  from (
      select
        T0019
      , 1 hex
      from \tPERF30_11 group by T0019 having count(*)>1
      -- union all
    )
  group by T0019
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0104
/*
Musí být vyplněn buď údaj Pevná sazba (REFF10_11.RFD0050) nebo právě jeden z
údajů identifikující pohyblivou úrokovou sazbu (REFF10_11.RFD0051,
REFF10_11.RFD0052, REFF10_11.RFD0053) spolu s údaji o době splatnosti a
rozpětí bazických bodů (REFF10_11.RFD0054, REFF10_11.RFD0055,
REFF10_11.RFD0056) anebo žádný z výše uvedených údajů.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11
  where RFD0050||RFD0051||RFD0052||RFD0053||RFD0054||RFD0055||RFD0056
    is not null
  and (
    nvl2(RFD0050, 1, 0)=nvl2(RFD0051||RFD0052||RFD0053, 1, 0)
    or (
      RFD0051||RFD0052||RFD0053 is not null
      and (
        nvl2(RFD0051, 1, 0)+nvl2(RFD0052, 1, 0)+nvl2(RFD0053, 1, 0)!=1
        or RFD0054 is null
        or RFD0055 is null
        or RFD0056 is null
      )
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0105
/*
Musí být vyplněn buď právě jeden z údajů Identifikace podkladového nástroje
(jeden nástroj) (REFF10_11.RFD0060, REFF10_11.RFD0061, REFF10_11.RFD0062,
REFF10_11.RFD0063, REFF10_11.RFD0064) nebo právě jeden z údajů
identifikující podkladový index (REFF10_11.RFD0068, REFF10_11.RFD0069,
REFF10_11.RFD0070) anebo žádný. Údaj Název podkladového nástroje
(REFF10_11.RFD0065) může být vyplněn pouze tehdy, když je vyplněn právě
jeden údaj z množiny (REFF10_11.RFD0060, REFF10_11.RFD0061,
REFF10_11.RFD0062, REFF10_11.RFD0063, REFF10_11.RFD0064). Údaje o splatnosti
podkladového indexu (REFF10_11.RFD0071, REFF10_11.RFD0072) mohou být
vyplněny buď právě oba anebo žádný a mohou být vyplněny pouze tehdy, když je
vyplněn právě jeden údaj z množiny (REFF10_11.RFD0068, REFF10_11.RFD0069,
REFF10_11.RFD0070).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11
  where RFD0060||RFD0061||RFD0062||RFD0063||RFD0064||RFD0065||RFD0068
    ||RFD0069||RFD0070||RFD0071||RFD0072 is not null
  and (
    1!=nvl2(RFD0060, 1, 0)+nvl2(RFD0061, 1, 0)+nvl2(RFD0062, 1, 0)
      +nvl2(RFD0063, 1, 0)+nvl2(RFD0064, 1, 0)+nvl2(RFD0068, 1, 0)
      +nvl2(RFD0069, 1, 0)+nvl2(RFD0070, 1, 0)
    or (
      RFD0060||RFD0061||RFD0062||RFD0063||RFD0064 is null
      and RFD0065 is not null
    ) or (
      RFD0068||RFD0069||RFD0070 is null
      and RFD0071||RFD0072 is not null
    ) or (
      RFD0068||RFD0069||RFD0070 is not null
      and nvl2(RFD0071, 1, 0)+nvl2(RFD0072, 1, 0)=1
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0106
/*
Je-li REFF10_11.RFD0113 Hlášení nástroje podle čl. 26 nařízení (EU) č.
600/2014 (MIFIR) = false pak musí být vyplněn právě jeden z údajů Realizační
cena (REFF10_11.RFD0082, REFF10_11.RFD0084, REFF10_11.RFD0085,
REFF10_11.RFD0086, REFF10_11.RFD0087). Je-li vyplněn údaj
(REFF10_11.RFD0082), pak musí být vyplněn také údaj (REFF10_11.RFD0083);
jinak tento údaj musí být prázdný. Údaj (REFF10_11.RFD0088) může být vyplněn
pouze tehdy, když je vyplněn údaj (REFF10_11.RFD0087). Kontrola platí pouze
pro opce a warranty (BA0088=6211, 6212, 6221, 6222 a 623).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11
  where RFD0039 in ('6211', '6212', '6221', '6222', '623')
  and RFD0113='false'
  and (
    1!=nvl2(RFD0082, 1, 0)+nvl2(RFD0084, 1, 0)+nvl2(RFD0085, 1, 0)
      +nvl2(RFD0086, 1, 0)+nvl2(RFD0087, 1, 0)
    or nvl2(RFD0082, 1, 0)=nvl2(RFD0083, 0, 1)
    or (
      RFD0087 is null
      and RFD0088 is not null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0107
/*
Je-li REFF10_11.RFD0113 Hlášení nástroje podle čl. 26 nařízení (EU) č.
600/2014 (MIFIR) = false pak je- li vyplněn údaj Podprodukt pro třídu
podkladových aktiv (REFF10_11.RFD0092), pak musí být vyplněn také údaj
Základní produkt pro třídu podkladových aktiv (REFF10_11.RFD0091). Je-li
vyplněn údaj Další podprodukt pro třídu podkladových aktiv
(REFF10_11.RFD0093), pak musí být vyplněn také údaj Podprodukt pro třídu
podkladových aktiv (REFF10_11.RFD0092).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11
  where RFD0113='false'
  and (
    (
      RFD0092 is not null
      and RFD0091 is null
    ) or (
      RFD0093 is not null
      and RFD0092 is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0108
/*
Musí být vyplněn buď údaj Pevná sazba komponenty 1 (REFF10_11.RFD0101) nebo
právě jeden z údajů Název referenční sazby (REFF10_11.RFD0096,
REFF10_11.RFD0097) anebo žádný. Údaje o době trvání smlouvy o úrokové sazbě
(REFF10_11.RFD0098, REFF10_11.RFD0099) mohou být vyplněny buď právě oba
anebo žádný a mohou být vyplněny pouze tehdy, když je vyplněn právě jeden
údaj z množiny (REFF10_11.RFD0096, REFF10_11.RFD0097).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11
  where RFD0101||RFD0096||RFD0097||RFD0098||RFD0099 is not null
  and (
    1!=nvl2(RFD0101, 1, 0)+nvl2(RFD0096, 1, 0)+nvl2(RFD0097, 1, 0)
    or nvl2(RFD0098, 1, 0)=nvl2(RFD0099, 0, 1)
    or (
      RFD0098||RFD0099 is not null
      and RFD0096||RFD0097 is null
    )
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0109
/*
Musí být vyplněn buď údaj Pevná sazba komponenty 2 (REFF10_11.RFD0102) nebo
právě jeden z údajů Pohyblivá sazba komponenty 2 (REFF10_11.RFD0103,
REFF10_11.RFD0104) anebo žádný. Údaje o době trvání smlouvy o úrokové sazbě
komponenty 2 (REFF10_11.RFD0105, REFF10_11.RFD0106) mohou být vyplněny buď
právě oba anebo žádný a mohou být vyplněny pouze tehdy, když je vyplněn
právě jeden údaj z množiny (REFF10_11.RFD0103, REFF10_11.RFD0104).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11
  where RFD0102||RFD0103||RFD0104||RFD0105||RFD0106 is not null
  and (
    1!=nvl2(RFD0102, 1, 0)+nvl2(RFD0103, 1, 0)+nvl2(RFD0104, 1, 0)
    or nvl2(RFD0105, 1, 0)=nvl2(RFD0106, 0, 1)
    or (
      RFD0105||RFD0106 is not null
      and RFD0103||RFD0104 is null
    )
  )\f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0110
/*
Je-li REFF10_11.RFD0113 Hlášení nástroje podle čl. 26 nařízení (EU) č.
600/2014 (MIFIR) = false pak musí být vyplněn právě jeden z údajů
Identifikace podkladového nástroje (koš) (REFF10_21.RFD0073,
REFF10_21.RFD0074, REFF10_21.RFD0075, REFF10_21.RFD0076, REFF10_21.RFD0077).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||a21.T0019||',T0021.'||a21.T0021||')'
  , \aREFF10_21
  , a21.T0019+a21.T0021*power(10, m.SZ_T0019)
  from
    \tREFF10_11 a11
  , \tREFF10_21 a21
  where RFD0113='false'
  and a11.T0019=a21.T0019
  and 1!=nvl2(RFD0073, 1, 0)+nvl2(RFD0074, 1, 0)+nvl2(RFD0075, 1, 0)
    +nvl2(RFD0076, 1, 0)+nvl2(RFD0077, 1, 0)
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0201
/*
Je-li REFF10_11.RFD0113 Hlášení nástroje podle čl. 26 nařízení (EU) č.
600/2014 (MIFIR) = false pak hodnota údaje Identifikace investičního
nástroje (REFF10_11.RFD0033, REFF10_11.RFD0034, REFF10_11.RFD0035,
REFF10_11.RFD0036) musí být unikátní v rámci výskytu.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from (
      select
        T0019
      , count(*) over (
          partition by
            RFD0033
          , RFD0034
          , RFD0035
          , RFD0036
        ) as c
      from \tREFF10_11
      where RFD0113='false'
    )
  where c>1
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0202
/*
V případě, že byl nástroj již dříve nahlášen, některé z hodnot údajů o daném
nástroji musí být odlišné od předchozího hlášení.
*/
declare
  o mo%rowtype;
begin
  select * into o from mo where ii=\o;
  \i
  \s
    \k
  , d
  , \aREFF10_11
  , T0019
  from (
      with qp as ( -- previous
        select /*+ materialize */
          pid
        , utl_raw.concat(md5_11, md5_21) md5
        , f
        from (
            select
              RFD0033||s.BS||RFD0034||s.BS||RFD0035||s.BS||RFD0036 pid
            , r11.md5 md5_11
            , mi.id f
            , row_number() over (
                partition by
                  RFD0033||s.BS||RFD0034||s.BS||RFD0035||s.BS||RFD0036
                order by mo.id desc -- see qx
              ) as rowno
            , listagg(r21.md5) within group (order by r21.md5)
              over (partition by h21.mi_, h21.T0019) as md5_21
            from
              rreff10_11 r11
            , rreff10_11h h11
            , rreff10_21 r21
            , rreff10_21h h21
            , mi
            , mo
            , md
            where r11.ii=h11.r_
            and h11.mi_=mi.ii
            and r21.ii(+)=h21.r_
            and h21.mi_(+)=mi.ii
            and h11.T0019=h21.T0019(+)
            and mi.mis_=m.IS_CURRENT
            and mi.mo_=mo.ii
            and mo.mp_=\p
            and mo.md_=md.ii
            and md.id='REFFIM10'
            and mo.id<o.id -- see qx
          )
        where rowno=1
      ), qx as ( -- next
        select /*+ materialize */
          pid
        , utl_raw.concat(md5_11, md5_21) md5
        , f
        from (
            select
              RFD0033||s.BS||RFD0034||s.BS||RFD0035||s.BS||RFD0036 pid
            , r11.md5 md5_11
            , mi.id f
            , row_number() over (
                partition by
                  RFD0033||s.BS||RFD0034||s.BS||RFD0035||s.BS||RFD0036
                order by mo.id -- see qp
              ) as rowno
            , listagg(r21.md5) within group (order by r21.md5)
              over (partition by h21.mi_, h21.T0019) as md5_21
            from
              rreff10_11 r11
            , rreff10_11h h11
            , rreff10_21 r21
            , rreff10_21h h21
            , mi
            , mo
            , md
            where r11.ii=h11.r_
            and h11.mi_=mi.ii
            and r21.ii(+)=h21.r_
            and h21.mi_(+)=mi.ii
            and h11.T0019=h21.T0019(+)
            and mi.mis_=m.IS_CURRENT
            and mi.mo_=mo.ii
            and mo.mp_=\p
            and mo.md_=md.ii
            and md.id='REFFIM10'
            and mo.id>o.id -- see qp
          )
        where rowno=1
      ), qo as ( -- old
        select /*+ materialize */
          RFD0033||s.BS||RFD0034||s.BS||RFD0035||s.BS||RFD0036 pid
        , T0019
        , mi.id f
        from
          rreff10_11 r
        , rreff10_11h h
        , mi
        where r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=\o
      ), qn as ( -- new
        select /*+ materialize */
          pid -- uniqueness is not guaranteed
        , utl_raw.concat(md5_11, md5_21) md5
        , T0019
        from (
            select
              RFD0033||s.BS||RFD0034||s.BS||RFD0035||s.BS||RFD0036 pid
            , a11.md5 md5_11
            , a11.T0019
            , row_number() over (
                partition by
                  a11.T0019
                , RFD0033||s.BS||RFD0034||s.BS||RFD0035||s.BS||RFD0036
                order by a11.T0019
              ) as rowno
            , listagg(a21.md5) within group (order by a21.md5)
              over (partition by a21.T0019) as md5_21
            from
              \tREFF10_11 a11
            , \tREFF10_21 a21
            where a11.T0019=a21.T0019(+)
          )
        where rowno=1
      )

MKT20180103 REFFIM10 000 0202

      select
        '(file.'||f||',T0019.'||T0019||')' d
      , T0019
      from (
          select
            T0019
          , f
          from
            qn
          , qp
          where qn.pid=qp.pid
          and qn.md5=qp.md5
          union all
          select
            T0019
          , f
          from
            qn
          , qx
          where qn.pid=qx.pid
          and qn.md5=qx.md5
        )
      union all
      select
        '(file.'||d.f||',T0019.'||T0019||')' d
      , -1 -- unsaveable - no reference in h.mi_
      from (
          select * from qo where pid not in (select pid from qn)
        ) d -- diff
      , qp
      , qx
      where d.pid=qp.pid
      and d.pid=qx.pid
      and qp.md5=qx.md5
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0203
/*
Hodnota Pořadí (REFF10_21.T0019), která se vyskytuje v DO REFF10_21, se musí
v rámci výskytu vyskytovat v DO REFF10_11 (REFF10_11.T0019) a údaje
Identifikace podkladového nástroje (jeden nástroj) (REFF10_11.RFD0060,
REFF10_11.RFD0061, REFF10_11.RFD0062, REFF10_11.RFD0063, REFF10_11.RFD0064)
a Název podkladového nástroje (jeden nástroj) (REFF10_11.RFD0065) musí být
prázdné.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_21
  , T0019+T0021*power(10, m.SZ_T0019)
  from (
      select
        T0019
      , T0021
      from \tREFF10_21
      where T0019 not in (select T0019 from \tREFF10_11)
      union
      select
        a21.T0019
      , a21.T0021
      from
        \tREFF10_11 a11
      , \tREFF10_21 a21
      where a11.T0019=a21.T0019
      and RFD0060||RFD0061||RFD0062||RFD0063||RFD0064||RFD0065 is not null
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0301
/*
Údaje klasifikující třídy podkladových aktiv komoditních derivátů
(REFF10_11.RFD0091, REFF10_11.RFD0092, REFF10_11.RFD0093) musí být vyplněny
výhradně v souladu s Tabulkou 2 v Příloze 1 Nařízení Komise v přenesené
pravomoci (EU) 2017/585, kterým se doplňuje nařízení Evropského parlamentu a
Rady (EU) č. 600/2014 (RTS 23).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11
  where (
    RFD0091='AGRI'
    and nvl(instr('GROS|SOFT|POTA|OOLI|DIRY|FRST|SEAF|LSTK|GRIN', RFD0092)
      , 0)=0
  ) or (
    RFD0091='NRGY'
    and nvl(instr('ELEC|NGAS|OILP|COAL|INRG|RNNG|LGHT|DIST', RFD0092), 0)=0
  ) or (
    RFD0091='ENVR'
    and nvl(instr('EMIS|WTHR|CRBR', RFD0092), 0)=0
  ) or (
    RFD0091='FRGT'
    and nvl(instr('WETF|DRYF|CSHP', RFD0092), 0)=0
  ) or (
    RFD0091='FRTL'
    and nvl(instr('AMMO|DAPH|PTSH|SLPH|UREA|UAAN', RFD0092), 0)=0
  ) or (
    RFD0091='INDP'
    and nvl(instr('CSTR|MFTG', RFD0092), 0)=0
  ) or (
    RFD0091='METL'
    and nvl(instr('NPRM|PRME', RFD0092), 0)=0
  ) or (
    RFD0091='PAPR'
    and nvl(instr('CBRD|NSPT|PULP|RCVP', RFD0092), 0)=0
  ) or (
    RFD0091='POLY'
    and nvl(instr('PLST', RFD0092), 0)=0
  ) or (
    RFD0092='GROS'
    and nvl(instr('FWHT|SOYB|CORN|RPSD|RICE|OTHR', RFD0093), 0)=0
  ) or (
    RFD0092='SOFT'
    and nvl(instr('CCOA|ROBU|WHSG|BRWN|OTHR', RFD0093), 0)=0
  ) or (
    RFD0092='OOLI'
    and nvl(instr('LAMP', RFD0093), 0)=0
  ) or (
    RFD0092='GRIN'
    and nvl(instr('MWHT', RFD0093), 0)=0
  ) or (
    RFD0092='ELEC'
    and nvl(instr('BSLD|FITR|PKLD|OFFP|OTHR', RFD0093), 0)=0
  ) or (
    RFD0092='NGAS'
    and nvl(instr('GASP|LNGG|NBPG|NCGG|TTFG', RFD0093), 0)=0
  ) or (
    RFD0092='OILP'
    and nvl(instr('BAKK|BDSL|BRNT|BRNX|CNDA|COND|DSEL|DUBA|ESPO|ETHA|FUEL|'
        ||'FOIL|GOIL|GSLN|HEAT|JTFL|KERO|LLSO|MARS|NAPH|NGLO|TAPI|URAL|WTIO'
      , RFD0093), 0)=0
  ) or (
    RFD0092='EMIS'
    and nvl(instr('CERE|ERUE|EUAE|EUAA|OTHR', RFD0093), 0)=0
  ) or (
    RFD0092='WETF'
    and nvl(instr('TNKR', RFD0093), 0)=0
  ) or (
    RFD0092='DRYF'
    and nvl(instr('DBCR', RFD0093), 0)=0
  ) or (
    RFD0092='NPRM'
    and nvl(instr('ALUM|ALUA|CBLT|COPR|IRON|LEAD|MOLY|NASC|NICK|STEL|TINN|'
        ||'ZINC|OTHR', RFD0093), 0)=0
  ) or (
    RFD0092='PRME'
    and nvl(instr('GOLD|SLVR|PTNM|PLDM|OTHR', RFD0093), 0)=0
  )
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0302
/*
Je-li údaj Identifikační kód finančního nástroje - ISIN (REFF10_11.DRF0033)
vyplněný, hodnota musí být validní ISIN.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11
  where RFD0033 is not null
  and e.is_isin(RFD0033)=s.GC_NO
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0303
/*
Je-li údaj Klasifikace investičního nástroje (REFF10_11.RFD0038) vyplněný,
musí se jednat o validní CFI kód v souladu s ISO 10962 a nejménně první dva
znaky nesmějí mít hodnotu "X".
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11
  where RFD0038 is not null
  and RFD0038 not in (select id from ec)
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0306
/*
Je-li vyplněný údaj Identifikátor emitenta nebo provozovatele obchodního
systému - LEI (REFF10_11.RFD0044), pak musí být hodnota validní LEI kód.
Je-li pro českého emitenta (REFF10_11. RFD0041 = CZ) vyplněný údaj
Identifikátor emitenta nebo provozovatele obchodního systému - IČ
(REFF10_11.RFD0131), pak musí být hodnota validní IČ. Pokud se jedná o
emitenta směnky nebo dluhopisu (REFF10_11.RFD0039 = 311, 312, 13, 149, 17,
199), pak může být v poli REFF10_11.RFD0131 použit náhradní identifikátor
složený z LEI vykazující osoby + identifikace osoby emitenta, kde prvních
20 znaků řetězce musí být LEI vykazující osoby a identifikace osoby emitenta
musí být neprázdný řetězec. Pro zahraničního emitenta (REFF10_11. RFD0041 <>
CZ) lze v poli REFF10_11.RFD0131 použít pouze náhradní identifikátor složený
z LEI vykazující osoby + interní ID, kde prvních 20 znaků řetězce musí být
LEI vykazující osoby a interní ID musí být neprázdný řetězec.
\#include
*/
declare e mk.e%type;
begin e:=m.gke('MKT20180103', 'JISIFE51', '000', '0109', '00');
  e:=replace(e, 'BCP2144', 'RFD0044');
  e:=replace(e, 'BCP2182', 'RFD0131');
  e:=replace(e, 'I0003 d', '''(T0019.''||T0019||'')''');
  e:=replace(e, 'I0003', 'T0019');
  e:=replace(e, 'JIS51_01', 'REFF10_11');
  e:=replace(e, 'P0088', 'RFD0039');
  :1:=replace(e, 'P0125', 'RFD0041');
end;

MKT20180103 REFFIM10 000 0307
/*
Je-li údaj Identifikátor indexu/referenční hodnoty dluhopisu s pohyblivou
úrokovou sazbou (REFF10_11.RFD0051) vyplněný, hodnota musí být validní ISIN.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11
  where RFD0051 is not null
  and e.is_isin(RFD0051)=s.GC_NO
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0308
/*
Je-li údaj Identifikace podkladového nástroje - ISIN (REFF10_11.RFD0060 nebo
REFF10_21.RFD0073) vyplněný, hodnota musí být validní ISIN.
*/
begin
  \i
  \s
    \k
  , d
  , ma_
  , T0021_T0019
  from (
      select
        '(T0019.'||T0019||')' d
      , \aREFF10_11 ma_
      , T0019 T0021_T0019
      from \tREFF10_11
      where RFD0060 is not null
      and e.is_isin(RFD0060)=s.GC_NO
      union all
      select
        '(T0019.'||T0019||',T0021.'||T0021||')'
      , \aREFF10_21
      , T0019+T0021*power(10, m.SZ_T0019)
      from \tREFF10_21
      where RFD0073 is not null
      and e.is_isin(RFD0073)=s.GC_NO
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0309
/*
Je-li údaj Identifikace podkladového indexu (REFF10_11.RFD0068) vyplněný,
hodnota musí být validní ISIN.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11
  where RFD0068 is not null
  and e.is_isin(RFD0068)=s.GC_NO
  \f; :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0314
/*
Je-li REFF10_11.RFD0113 Hlášení nástroje podle čl. 26 nařízení (EU) č.
600/2014 (MIFIR) = false pak (je-li hodnota údaje Typ podkladového aktiva <>
Investiční nástroj bez podkladového aktiva (REFF10_11.RFD0066 <> 99) a
zároveň je-li hodnota údaje Typ podkladového aktiva <> Měna
(REFF10_11.RFD0066 <> 28)) musí být vyplněn některý z údajů Identifikace
podkladového nástroje (jeden nástroj) (REFF10_11.RFD0060, REFF10_11.RFD0061,
REFF10_11.RFD0062, REFF10_11.RFD0063, REFF10_11.RFD0064), Identifikace
podkladového nástroje (koš) (REFF10_21.RFD0073, REFF10_21.RFD0074,
REFF10_21.RFD0075, REFF10_21.RFD0076, REFF10_21.RFD0077) nebo Název
podkladového indexu (REFF10_11.RFD0069, REFF10_11.RFD0070). Pro hodnotu
údaje Typ podkladového aktiva = Investiční nástroj bez podkladového aktiva
(REFF10_11.RFD0066 = 99) nesmí být vyplněn žádný z výše uvedených údajů.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||a11.T0019||')'
  , \aREFF10_11
  , a11.T0019
  from
    \tREFF10_11 a11
  , \tREFF10_21 a21
  where a11.T0019=a21.T0019(+)
  and RFD0113='false'
  and (
    (
      RFD0066 not in ('28', '99')
      and RFD0060||RFD0061||RFD0062||RFD0063||RFD0064||RFD0068||RFD0069
          ||RFD0070||RFD0073||RFD0074||RFD0075||RFD0076||RFD0077 is null
    ) or (
      RFD0066='99'
      and RFD0060||RFD0061||RFD0062||RFD0063||RFD0064||RFD0068||RFD0069
          ||RFD0070||RFD0073||RFD0074||RFD0075||RFD0076||RFD0077 is not null
    )
  )
  \f;
  :1:=sql%rowcount;
end;

MKT20180103 REFFIM10 000 0901
/*
Technologická rezerva - generální chyba.
  HEX RULE
 ---- ----------------------------------------------------------------------
   1. Záznam není v rámci výskytu v DO REFF10_11 unikátní. Prověřit možnou
      duplicitu (T0019).
   2. Záznam není v rámci výskytu v DO REFF10_21 unikátní. Prověřit možnou
      duplicitu (T0019, T0021).
*/
begin
  \i
  \s
    \k
  , d||',rule.'||sum(hex)||')'
  , ma_
  , T0021_T0019
  from (
      select
        '(T0019.'||T0019 d
      , 1 hex
      , \aREFF10_11 ma_
      , T0019 T0021_T0019
      from \tREFF10_11 group by T0019 having count(*)>1
      union all
      select
        '(T0019.'||T0019||',T0021.'||T0021
      , 2
      , \aREFF10_21
      , T0019+T0021*power(10, m.SZ_T0019)
      from (
          select
            T0019
          , T0021
          from \tREFF10_21
          group by
            T0019
          , T0021
          having count(*)>1
        )
    )
  group by
    d
  , ma_
  , T0021_T0019
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0101
/*
Kombinace hodnot údajů Referenční číslo obchodu (TRAF11_11.R0011) a
Identifikační kód subjektu provádějícího obchod (TRAF11_11.R0012) musí být
globálně unikátní.
*/
begin
  \i
  \s
    \k
  , '(R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - see kind of check
  from (
      select
        R0011
      , R0012
      from (
select
  R0011
, R0012
from \tTRAF11_11
union all
select
  R0011
, R0012
from
  rtraf11_11 r
, rtraf11_11h h
, mi
, mo
, md
where r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id='TRAFIM11'
and mo.ii!=\o
        )
      group by
        R0011
      , R0012
      having count(*)>1
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0103
/*
PK: Je-li Hlášení TREM (TRAF11_11.FIM0156) = true, potom kombinace hodnot
údajů Referenční číslo obchodu (TRAF11_11.R0011) a Identifikační kód
subjektu provádějícího obchod (TRAF11_11.R0012) musí být nalezena v rámci
množiny obchodů zaslaných výkazem TRAFIM10 se statusem Accepted, Canceled
nebo Pending - kontrola oproti množině hodnot údajů (TRAF10_11.R0011,
TRAF10_11.R0012).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q as (
        select /*+ materialize */
          R0011
        , R0012
        , mi.id f
        from
          rtraf11_11 r
        , rtraf11_11h h
        , mi
        , mo
        , md
        where FIM0156='true'
        and r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='TRAFIM11'
        and mo.ii!=\o
        and mi.t between rd-DEPTH and rd
        union all
        select
          R0011
        , R0012
        , null
        from \tTRAF11_11 where FIM0156='true'
      )
      select q.*
      from
        q
      , (
select
  R0011
, R0012
from q
minus
select
  R0011
, R0012
from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  from (
      select
        r.R0011
      , r.R0012
      , f.s
      , f.rt
      , row_number() over (
          partition by h.ii order by f.rt desc) as rowno
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      where r.ii=h.r_
      and h.ii=f.h_
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
  )
where rowno=1
and s in ('ACPT', 'CNCL', 'PDNG', 'RCVD')
        ) d -- diff
      where q.R0011=d.R0011
      and q.R0012=d.R0012
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0104
/*
PK: Kombinace hodnot údajů výkazu TRAFIM10 Referenční číslo obchodu
(TRAF10_11.R0011) a Identifikační kód subjektu provádějícího obchod
(TRAF10_11.R0012) obchodů se statusem Accepted nebo Pending musí být
nalezena v rámci množiny hodnot údajů (TRAF11_11.R0011, TRAF11_11.R0012) a
musí platit Hlášení TREM (TRAF11_11.FIM0156) = true.
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q as (
        select /*+ materialize */
          R0011
        , R0012
        , f
        from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , f
  from (
      select
        R0011
      , R0012
      , f.s
      , f.rt
      , row_number() over (partition by h.ii order by f.rt desc)
        as rowno
      , case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      , mi
      , mo
      , mp
      , mf
      where r.ii=h.r_
      and h.ii=f.h_
      and h.mi_=mi.ii
      and mi.t between rd-DEPTH and rd
      and mi.mo_=mo.ii
      and mo.mp_=mp.ii
      and mp.lei='\L'
      and mi.bs=mf.ii(+)
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
)
        where rowno=1
        and s in ('ACPT', 'PDNG', 'RCVD')
      )
      select q.*
      from
        q
      , (
select
  R0011
, R0012
from q
minus
select * from (
    select
      R0011
    , R0012
    from
      rtraf11_11 r
    , rtraf11_11h h
    , mi
    , mo
    , md
    where FIM0156='true'
    and r.ii=h.r_
    and h.mi_=mi.ii
    and mi.mis_=m.IS_CURRENT
    and mi.mo_=mo.ii
    and mo.mp_=\p
    and mo.md_=md.ii
    and md.id='TRAFIM11'
    and mo.ii!=\o
    union all
    select
      R0011
    , R0012
    from \tTRAF11_11 where FIM0156='true'
  )
        ) d -- diff
      where q.R0011=d.R0011
      and q.R0012=d.R0012
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0105
/*
PK: Je-li Hlášení TREM (TRAF11_11.FIM0156) = false, potom kombinace hodnot
údajů Referenční číslo obchodu (TRAF11_11.R0011) a Identifikační kód
subjektu provádějícího obchod (TRAF11_11.R0012) musí být nalezena v rámci
množiny obchodů zaslaných výkazem TRAFIM20 - kontrola oproti množině hodnot
údajů (TRAF20_11.R0011, TRAF20_11.R0012).
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0103', '00')
    , 'traf10', 'traf20'), '0156=''true''', '0156=''false''');
end;

MKT20180103 TRAFIM11 000 0106
/*
PK: Kombinace hodnot údajů výkazu TRAFIM20 Referenční číslo obchodu
(TRAF20_11.R0011) a Identifikační kód subjektu provádějícího obchod
(TRAF20_11.R0012) musí být nalezena v rámci množiny hodnot údajů
(TRAF11_11.R0011, TRAF11_11.R0012) a musí platit Hlášení TREM
(TRAF11_11.FIM0156) = false.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0104', '00')
    , 'traf10', 'traf20'), '0156=''true''', '0156=''false''');
end;

MKT20180103 TRAFIM11 000 0108
/*
PK: Obsahuje-li údaj Číslo pokynu - nákup (TRAF11_11.FIM0140) číslo pokynu
(tedy pokud je vyplněno a zároveň (TRAF11_11.FIM0140 <> BEZ_POKYNU|VLASTNI
|UCET_IS|KOTACE)), potom kombinace hodnot údajů Identifikační kód subjektu
provádějícího obchod (TRAF11_11.R0012) a Číslo pokynu - nákup
(TRAF11_11.FIM0140) musí být nalezena v rámci množiny pokynů zaslaných
výkazem TRAFIM30 - kontrola oproti množině hodnot údajů (TRAF30_11.R0015,
TRAF30_11.R0014). Dále se musí jednat o nákupní pokyn (TRAF30_11.FIM0256 =
BUYI).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',FIM0140.'||FIM0140||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q as (
        select /*+ materialize */
          FIM0140
        , R0012
        , mi.id f
        from
          rtraf11_11 r
        , rtraf11_11h h
        , mi
        , mo
        , md
        where FIM0140 is not null
        and FIM0140 not in ('BEZ_POKYNU', 'KOTACE', 'UCET_IS', 'VLASTNI')
        and r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='TRAFIM11'
        and mo.ii!=\o
        and mi.t between rd-DEPTH and rd
        union all
        select
          FIM0140
        , R0012
        , null
        from \tTRAF11_11
        where FIM0140 is not null
        and FIM0140 not in ('BEZ_POKYNU', 'KOTACE', 'UCET_IS', 'VLASTNI')
      )
      select q.*
      from
        q
      , (
select
  FIM0140
, R0012
from q
minus
select
  R0014
, R0015
from
  rtraf30_11 r
, rtraf30_11h h
, mi
, mo
, md
where FIM0256='BUYI'
and r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=m.IS_CURRENT
and mi.mo_=mo.ii
and mo.md_=md.ii
and md.id='TRAFIM30'
and mo.mp_=\p
        ) d -- diff
      where q.FIM0140=d.FIM0140
      and q.R0012=d.R0012
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0109
/*
PK: Obsahuje-li údaj Číslo pokynu - prodej (TRAF11_11.FIM0141) číslo pokynu
(tedy pokud je vyplněno a zároveň (TRAF11_11.FIM0141 <> BEZ_POKYNU|VLASTNI
|UCET_IS|KOTACE)), potom kombinace hodnot údajů Identifikační kód subjektu
provádějícího obchod (TRAF11_11.R0012) a Číslo pokynu - prodej
(TRAF11_11.FIM0141) musí být nalezena v rámci množiny pokynů zaslaných
výkazem TRAFIM30 - kontrola oproti množině hodnot údajů (TRAF30_11.R0015,
TRAF30_11.R0014). Dále se musí jednat o prodejní pokyn (TRAF30_11.FIM0256 =
SELL).
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0108', '00')
    , 'BUYI', 'SELL'), 'FIM0140', 'FIM0141');
end;

MKT20180103 TRAFIM11 000 0110
/*
PK: Jsou-li ve výkazu TRAFIM10 údaje Identifikační kód nástroje 1
(TRAF10_11.FIM0065) a Identifikační kód nástroje 2 (TRAF10_11.FIM0066)
prázdné, potom musí být vyplněn právě jeden z údajů Identifikace
investičního nástroje (TRAF11_11.FIM0151, TRAF11_11.FIM0152,
TRAF11_11.FIM0153).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||t10.R0012||',R0011.'||t10.R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      select
        R0011
      , R0012
      , f
      from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , f
  , x
  from (
      select
        R0011
      , R0012
      , f.s
      , f.rt
      , row_number() over (partition by h.ii order by f.rt desc)
        as rowno
      , case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
      , FIM0065||FIM0066 x
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      , mi
      , mo
      , mp
      , mf
      where r.ii=h.r_
      and h.ii=f.h_
      and h.mi_=mi.ii
      and mi.t between rd-DEPTH and rd
      and mi.mo_=mo.ii
      and mo.mp_=mp.ii
      and mp.lei='\L'
      and mi.bs=mf.ii(+)
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
        )
      where rowno=1
      and s in ('ACPT', 'PDNG', 'RCVD')
      and x is null
    ) t10
  , (
      select
        R0011
      , R0012
      , FIM0151
      , FIM0152
      , FIM0153
      from
        rtraf11_11 r
      , rtraf11_11h h
      , mi
      , mo
      , md
      where r.ii=h.r_
      and h.mi_=mi.ii
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM11'
      and mo.ii!=\o
      union all
      select
        R0011
      , R0012
      , FIM0151
      , FIM0152
      , FIM0153
      from \tTRAF11_11
    ) t11
  where t10.R0011=t11.R0011
  and t10.R0012=t11.R0012
  and nvl2(FIM0151, 1, 0)+nvl2(FIM0152, 1, 0)+nvl2(FIM0153, 1, 0)!=1
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0111
/*
PK: Jsou-li ve výkazu TRAFIM10 údaje Identifikační kód nástroje 1
(TRAF10_11.FIM0065) a Identifikační kód nástroje 2 (TRAF10_11.FIM0066)
prázdné, potom množina hodnot údajů Identifikace investičního nástroje
(TRAF11_11.FIM0151, TRAF11_11.FIM0152, TRAF11_11.FIM0153) musí být nalezena
v rámci množiny nástrojů zaslaných výkazem REFFIM10 - kontrola oproti
množině hodnot údajů (REFF10_11.RFD0034, REFF10_11.RFD0035,
REFF10_11.RFD0036).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q10 as (
        select /*+ materialize */
          R0011
        , R0012
        , f
        from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , f
  , x
  from (
      select
        R0011
      , R0012
      , f.s
      , f.rt
      , row_number() over (partition by h.ii order by f.rt desc)
        as rowno
      , case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
      , FIM0065||FIM0066 x
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      , mi
      , mo
      , mp
      , mf
      where r.ii=h.r_
      and h.ii=f.h_
      and h.mi_=mi.ii
      and mi.t between rd-DEPTH and rd
      and mi.mo_=mo.ii
      and mo.mp_=mp.ii
      and mp.lei='\L'
      and mi.bs=mf.ii(+)
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
)
        where rowno=1
        and s in ('ACPT', 'PDNG', 'RCVD')
        and x is null
      ), q11 as (
        select /*+ materialize */
          R0011
        , R0012
        , FIM0151||s.BS||FIM0152||s.BS||FIM0153 x
        from
          rtraf11_11 r
        , rtraf11_11h h
        , mi
        , mo
        , md
        where r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='TRAFIM11'
        and mo.ii!=\o
        and FIM0151||FIM0152||FIM0153 is not null
        union all
        select
          R0011
        , R0012
        , FIM0151||s.BS||FIM0152||s.BS||FIM0153
        from \tTRAF11_11
        where FIM0151||FIM0152||FIM0153 is not null
      )
      select q10.*
      from (
select q11.x
from
  q10
, q11
where q10.R0011=q11.R0011
and q10.R0012=q11.R0012
minus
select RFD0034||s.BS||RFD0035||s.BS||RFD0036
from
  rreff10_11 r
, rreff10_11h h
, mi
, mo
, md
where r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id='REFFIM10'
and RFD0034||RFD0035||RFD0036 is not null
        ) q
      , q10
      , q11
      where q10.R0011=q11.R0011
      and q10.R0012=q11.R0012
      and q11.x=q.x
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0112
/*
PK: Je-li ve výkazu TRAFIM10 údaj Identifikační kód nástroje 1
(TRAF10_11.FIM0065) nebo údaj Identifikační kód nástroje 2
(TRAF10_11.FIM0066) vyplněný, potom musí být údaje Identifikace investičního
nástroje (TRAF11_11.FIM0151, TRAF11_11.FIM0152, TRAF11_11.FIM0153) prázdné.
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||t10.R0012||',R0011.'||t10.R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      select
        R0011
      , R0012
      , f
      from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , f
  , x
  from (
      select
        R0011
      , R0012
      , f.s
      , f.rt
      , row_number() over (partition by h.ii order by f.rt desc)
        as rowno
      , case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
      , FIM0065||FIM0066 x
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      , mi
      , mo
      , mp
      , mf
      where r.ii=h.r_
      and h.ii=f.h_
      and h.mi_=mi.ii
      and mi.t between rd-DEPTH and rd
      and mi.mo_=mo.ii
      and mo.mp_=mp.ii
      and mp.lei='\L'
      and mi.bs=mf.ii(+)
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
        )
      where rowno=1
      and s in ('ACPT', 'PDNG', 'RCVD')
      and x is not null
    ) t10
  , (
      select
        R0011
      , R0012
      from
        rtraf11_11 r
      , rtraf11_11h h
      , mi
      , mo
      , md
      where r.ii=h.r_
      and h.mi_=mi.ii
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM11'
      and mo.ii!=\o
      and FIM0151||FIM0152||FIM0153 is not null
      union all
      select
        R0011
      , R0012
      from \tTRAF11_11
      where FIM0151||FIM0152||FIM0153 is not null
    ) t11
  where t10.R0011=t11.R0011
  and t10.R0012=t11.R0012
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0113
/*
PK: Je-li ve výkazu TRAFIM10 údaj Identifikační kód nástroje 1
(TRAF10_11.FIM0065) nebo údaj Identifikační kód nástroje 2
(TRAF10_11.FIM0066) vyplněný, potom hodnota údaje (TRAF10_11.FIM0065) nebo
(TRAF10_11.FIM0066) musí být nalezena v rámci množiny nástrojů zaslaných
výkazem REFFIM10 - kontrola oproti hodnotám údaje (REFF10_11.RFD0033).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q10 as (
        select /*+ materialize */
          R0011
        , R0012
        , f
        , x
        from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , f
  , x
  from (
      select
        R0011
      , R0012
      , f.s
      , f.rt
      , row_number() over (partition by h.ii order by f.rt desc)
        as rowno
      , case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
      , FIM0065||FIM0066 x
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      , mi
      , mo
      , mp
      , mf
      where r.ii=h.r_
      and h.ii=f.h_
      and h.mi_=mi.ii
      and mi.t between rd-DEPTH and rd
      and mi.mo_=mo.ii
      and mo.mp_=mp.ii
      and mp.lei='\L'
      and mi.bs=mf.ii(+)
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
)
        where rowno=1
        and s in ('ACPT', 'PDNG', 'RCVD')
        and x is not null
      )
      select q10.*
      from (
select x from q10
minus
select RFD0033
from
  rreff10_11 r
, rreff10_11h h
, mi
, mo
, md
where r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id='REFFIM10'
and RFD0033 is not null
        ) q
      , q10
      where q10.x=q.x
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0114
/*
PK: Jsou-li ve výkazu TRAFIM20 údaje Identifikační kód nástroje 1
(TRAF20_11.FIM0065) a Identifikační kód nástroje 2 (TRAF20_11.FIM0066)
prázdné nebo obsahují-li předepsanou dummy hodnotu, potom musí být vyplněn
právě jeden z údajů Identifikace investičního nástroje (TRAF11_11.FIM0151,
TRAF11_11.FIM0152, TRAF11_11.FIM0153).
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0110', '00')
    , 'traf10', 'traf20')
  , 'x is null'
  , 'nvl(x, m.DV_ISIN)=m.DV_ISIN');
end;

MKT20180103 TRAFIM11 000 0115
/*
PK: Jsou-li ve výkazu TRAFIM20 údaje Identifikační kód nástroje 1
(TRAF20_11.FIM0065) a Identifikační kód nástroje 2 (TRAF20_11.FIM0066)
prázdné nebo obsahují-li předepsanou dummy hodnotu, potom množina hodnot
údajů Identifikace investičního nástroje (TRAF11_11.FIM0151,
TRAF11_11.FIM0152, TRAF11_11.FIM0153) musí být nalezena v rámci množiny
nástrojů zaslaných výkazem REFFIM10 - kontrola oproti množině hodnot údajů
(REFF10_11.RFD0034, REFF10_11.RFD0035, REFF10_11.RFD0036).
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0111', '00')
    , 'traf10', 'traf20')
  , 'x is null'
  , 'nvl(x, m.DV_ISIN)=m.DV_ISIN');
end;

MKT20180103 TRAFIM11 000 0116
/*
PK: Je-li ve výkazu TRAFIM20 údaj Identifikační kód nástroje 1
(TRAF20_11.FIM0065) nebo údaj Identifikační kód nástroje 2
(TRAF20_11.FIM0066) řádně vyplněný (hodnota není dummy), potom musí být
údaje Identifikace investičního nástroje (TRAF11_11.FIM0151,
TRAF11_11.FIM0152, TRAF11_11.FIM0153) prázdné.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0112', '00')
    , 'traf10', 'traf20')
  , 'x is not null'
  , 'nvl(x, m.DV_ISIN)!=m.DV_ISIN');
end;

MKT20180103 TRAFIM11 000 0117
/*
PK: Je-li ve výkazu TRAFIM20 údaj Identifikační kód nástroje 1
(TRAF20_11.FIM0065) nebo údaj Identifikační kód nástroje 2
(TRAF20_11.FIM0066) řádně vyplněný (hodnota není dummy), potom hodnota údaje
(TRAF20_11.FIM0065) nebo (TRAF20_11.FIM0066) musí být nalezena v rámci
množiny nástrojů zaslaných výkazem REFFIM10 - kontrola oproti hodnotám údaje
(REFF10_11.RFD0033).
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0113', '00')
    , 'traf10', 'traf20')
  , 'x is not null'
  , 'nvl(x, m.DV_ISIN)!=m.DV_ISIN');
end;

MKT20180103 TRAFIM11 000 0118
/*
PK: Hodnota údaje Autor čísla obchodu (TRAF11_11.FIM0138) musí být nalezena
v rámci množiny osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám
údaje (PERF30_11.RFD0002) - nebo v seznamu obchodních systémů EHP.
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q as (
        select /*+ materialize */
          R0011
        , R0012
        , mi.id f
        , FIM0138 x
        from
          rtraf11_11 r
        , rtraf11_11h h
        , mi
        , mo
        , md
        where FIM0156='true'
        and r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='TRAFIM11'
        and mo.ii!=\o
        and mi.t between rd-DEPTH and rd
        union all
        select
          R0011
        , R0012
        , null
        , FIM0138
        from \tTRAF11_11
        where FIM0156='true'
      )
      select q.*
      from
        q
      , (
select x from q
minus
select RFD0002
from
  rperf30_11 r
, rperf30_11h h
, mi
, mo
, md
where r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id='PERFIM30'
and RFD0002 is not null
minus
select em.id
from
  em
, ey
where em.y=ey.id
and em.c in ('M', 'O', 'R', 'S')
and ey.eea=s.GC_YES
        ) d -- diff
      where q.x=d.x
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0119
/*
PK: Je-li ve výkazu TRAFIM10 Kupující - nabyvatel identifikován pomocí LEI
kódu (TRAF10_21.FIM0004) nebo pomocí identifikátoru FO (TRAF10_21.FIM0009),
potom musí být nalezen v rámci množiny osob zaslaných výkazem PERFIM30 -
kontrola oproti hodnotám údaje (PERF30_11.RFD0002) v případě LEI kódu nebo
oproti hodnotám údaje (PERF30_11.RFD0005) v případě identifikátoru FO. V
případě použití identifikátoru FO se dále musí shodovat použitý typ tohoto
identifikátoru - kontrola množiny hodnot údajů (TRAF10_21.FIM0010,
TRAF10_21.FIM0011) oproti množině hodnot údajů (PERF30_11.RFD0006,
PERF30_11.RFD0007).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q10 as (
        select /*+ materialize */
          R0011
        , R0012
        , f
        , x
        from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , f
  , x
  , xf
  from (
      select
        R0011
      , R0012
      , f.s
      , f.rt
      , row_number() over (partition by h.ii order by f.rt desc)
        as rowno
      , case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
      , FIM0004||s.BS||FIM0009||s.BS||FIM0010||s.BS||FIM0011 x
      , FIM0004||FIM0009 xf -- flag
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      , rtraf10_21 r21
      , rtraf10_21h h21
      , mi
      , mo
      , mp
      , mf
      where r.ii=h.r_
      and h.ii=f.h_
      and h.mi_=mi.ii
      and mi.t between rd-DEPTH and rd
      and mi.mo_=mo.ii
      and mo.mp_=mp.ii
      and mp.lei='\L'
      and mi.bs=mf.ii(+)
      and h.ii=h21.h_
      and h21.r_=r21.ii
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
)
        where rowno=1
        and s in ('ACPT', 'PDNG', 'RCVD')
        and xf is not null
      )
      select q10.*
      from (
select x from q10
minus
select RFD0002||s.BS||RFD0005||s.BS||RFD0006||s.BS||RFD0007
from
  rperf30_11 r
, rperf30_11h h
, mi
, mo
, md
where r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id='PERFIM30'
and RFD0002||RFD0005 is not null
        ) q
      , q10
      where q10.x=q.x
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0120
/*
PK: Je-li ve výkazu TRAFIM10 Kupující - rozhodovatel identifikován pomocí
LEI kódu (TRAF10_22.FIM0014) nebo pomocí identifikátoru FO
(TRAF10_22.FIM0018), potom musí být nalezen v rámci množiny osob zaslaných
výkazem PERFIM30 - kontrola oproti hodnotám údaje (PERF30_11.RFD0002) v
případě LEI kódu nebo oproti hodnotám údaje (PERF30_11.RFD0005) v případě
identifikátoru FO. V případě použití identifikátoru FO se dále musí shodovat
použitý typ tohoto identifikátoru - kontrola množiny hodnot údajů
(TRAF10_22.FIM0019, TRAF10_22.FIM0020) oproti množině hodnot údajů
(PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type:=m.gke('MKT20180103', 'TRAFIM11', '000', '0119', '00');
begin
  e:=replace(e, '10_21', '10_22');
  e:=replace(e, 'FIM0004', 'FIM0014');
  e:=replace(e, 'FIM0009', 'FIM0018');
  e:=replace(e, 'FIM0010', 'FIM0019');
  :1:=replace(e, 'FIM0011', 'FIM0020');
end;

MKT20180103 TRAFIM11 000 0121
/*
PK: Je-li ve výkazu TRAFIM10 Prodávající - pozbyvatel identifikován pomocí
LEI kódu (TRAF10_23.FIM0021) nebo pomocí identifikátoru FO
(TRAF10_23.FIM0026), potom musí být nalezen v rámci množiny osob zaslaných
výkazem PERFIM30 - kontrola oproti hodnotám údaje (PERF30_11.RFD0002) v
případě LEI kódu nebo oproti hodnotám údaje (PERF30_11.RFD0005) v případě
identifikátoru FO. V případě použití identifikátoru FO se dále musí shodovat
použitý typ tohoto identifikátoru - kontrola množiny hodnot údajů
(TRAF10_23.FIM0027, TRAF10_23.FIM0028) oproti množině hodnot údajů
(PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type:=m.gke('MKT20180103', 'TRAFIM11', '000', '0119', '00');
begin
  e:=replace(e, '10_21', '10_23');
  e:=replace(e, 'FIM0004', 'FIM0021');
  e:=replace(e, 'FIM0009', 'FIM0026');
  e:=replace(e, 'FIM0010', 'FIM0027');
  :1:=replace(e, 'FIM0011', 'FIM0028');
end;

MKT20180103 TRAFIM11 000 0122
/*
PK: Je-li ve výkazu TRAFIM10 Prodávající - rozhodovatel identifikován pomocí
LEI kódu (TRAF10_24.FIM0031) nebo pomocí identifikátoru FO
(TRAF10_24.FIM0035), potom musí být nalezen v rámci množiny osob zaslaných
výkazem PERFIM30 - kontrola oproti hodnotám údaje (PERF30_11.RFD0002) v
případě LEI kódu nebo oproti hodnotám údaje (PERF30_11.RFD0005) v případě
identifikátoru FO. V případě použití identifikátoru FO se dále musí shodovat
použitý typ tohoto identifikátoru - kontrola množiny hodnot údajů
(TRAF10_24.FIM0036, TRAF10_24.FIM0037) oproti množině hodnot údajů
(PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type:=m.gke('MKT20180103', 'TRAFIM11', '000', '0119', '00');
begin
  e:=replace(e, '10_21', '10_24');
  e:=replace(e, 'FIM0004', 'FIM0031');
  e:=replace(e, 'FIM0009', 'FIM0035');
  e:=replace(e, 'FIM0010', 'FIM0036');
  :1:=replace(e, 'FIM0011', 'FIM0037');
end;

MKT20180103 TRAFIM11 000 0123
/*
PK: Je-li ve výkazu TRAFIM10 vyplněn Identifikační kód osoby činící
investiční rozhodnutí v rámci podniku (TRAF10_11.FIM0123), potom musí být
nalezen v rámci množiny osob zaslaných výkazem PERFIM30 - kontrola oproti
hodnotám údaje (PERF30_11.RFD0005).Dále se musí shodovat použitý typ
identifikátoru - kontrola množiny hodnot údajů (TRAF10_11.FIM0124,
TRAF10_11.FIM0125) oproti množině hodnot údajů (PERF30_11.RFD0006,
PERF30_11.RFD0007).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q10 as (
        select /*+ materialize */
          R0011
        , R0012
        , f
        , x
        from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , f
  , x
  , FIM0123
  from (
      select
        R0011
      , R0012
      , f.s
      , f.rt
      , row_number() over (partition by h.ii order by f.rt desc)
        as rowno
      , case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
      , FIM0123||s.BS||FIM0124||s.BS||FIM0125 x
      , FIM0123
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      , mi
      , mo
      , mp
      , mf
      where r.ii=h.r_
      and h.ii=f.h_
      and h.mi_=mi.ii
      and mi.t between rd-DEPTH and rd
      and mi.mo_=mo.ii
      and mo.mp_=mp.ii
      and mp.lei='\L'
      and mi.bs=mf.ii(+)
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
)
        where rowno=1
        and s in ('ACPT', 'PDNG', 'RCVD')
        and FIM0123 is not null
      )
      select q10.*
      from (
select x from q10
minus
select RFD0005||s.BS||RFD0006||s.BS||RFD0007
from
  rperf30_11 r
, rperf30_11h h
, mi
, mo
, md
where r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id='PERFIM30'
and RFD0005 is not null
        ) q
      , q10
      where q10.x=q.x
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0124
/*
PK: Je-li ve výkazu TRAFIM10 vyplněn Identifikační kód osoby provádějící
obchod v rámci podniku (TRAF10_11.FIM0128), potom musí být nalezen v rámci
množiny osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0005).Dále se musí shodovat použitý typ identifikátoru -
kontrola množiny hodnot údajů (TRAF10_11.FIM0129, TRAF10_11.FIM0130) oproti
množině hodnot údajů (PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type:=m.gke('MKT20180103', 'TRAFIM11', '000', '0123', '00');
begin
  e:=replace(e, 'FIM0123', 'FIM0128');
  e:=replace(e, 'FIM0124', 'FIM0129');
  :1:=replace(e, 'FIM0125', 'FIM0130');
end;

MKT20180103 TRAFIM11 000 0125
/*
PK: Je-li ve výkazu TRAFIM10 vyplněn Identifikační kód předávajícího podniku
pro kupujícího (TRAF10_11.FIM0039), potom musí být nalezen v rámci množiny
osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0002).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q10 as (
        select /*+ materialize */
          R0011
        , R0012
        , f
        , x
        from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , f
  , x
  from (
      select
        R0011
      , R0012
      , f.s
      , f.rt
      , row_number() over (partition by h.ii order by f.rt desc)
        as rowno
      , case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
      , FIM0039 x
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      , mi
      , mo
      , mp
      , mf
      where r.ii=h.r_
      and h.ii=f.h_
      and h.mi_=mi.ii
      and mi.t between rd-DEPTH and rd
      and mi.mo_=mo.ii
      and mo.mp_=mp.ii
      and mp.lei='\L'
      and mi.bs=mf.ii(+)
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
)
        where rowno=1
        and s in ('ACPT', 'PDNG', 'RCVD')
        and x is not null
      )
      select q10.*
      from (
select x from q10
minus
select RFD0002
from
  rperf30_11 r
, rperf30_11h h
, mi
, mo
, md
where r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id='PERFIM30'
and RFD0002 is not null
        ) q
      , q10
      where q10.x=q.x
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0126
/*
PK: Je-li ve výkazu TRAFIM10 vyplněn Identifikační kód předávajícího podniku
pro prodávajícího (TRAF10_11.FIM0040), potom musí být nalezen v rámci
množiny osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0002).
\#include
*/
begin :1:=replace(
    m.gke('MKT20180103', 'TRAFIM11', '000', '0125', '00')
  , 'FIM0039', 'FIM0040');
end;

MKT20180103 TRAFIM11 000 0127
/*
PK: Je-li ve výkazu TRAFIM20 Kupující - nabyvatel identifikován pomocí řádně
vyplněného (hodnota není dummy) LEI kódu (TRAF20_21.FIM0004) nebo pomocí
identifikátoru FO (TRAF20_21.FIM0009), potom musí být nalezen v rámci
množiny osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0002) v případě LEI kódu nebo oproti hodnotám údaje
(PERF30_11.RFD0005) v případě identifikátoru FO. V případě použití
identifikátoru FO se dále musí shodovat použitý typ tohoto identifikátoru -
kontrola množiny hodnot údajů (TRAF20_21.FIM0010, TRAF20_21.FIM0011) oproti
množině hodnot údajů (PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
begin :1:=replace(
      replace(m.gke('MKT20180103', 'TRAFIM11', '000', '0119', '00')
    , 'traf10', 'traf20')
  , 'FIM0004', 'case FIM0004 when m.DV_LEI then null else FIM0004 end');
end;

MKT20180103 TRAFIM11 000 0128
/*
PK: Je-li ve výkazu TRAFIM20 Kupující - rozhodovatel identifikován pomocí
LEI kódu (TRAF20_22.FIM0014) nebo pomocí identifikátoru FO
(TRAF20_22.FIM0018), potom musí být nalezen v rámci množiny osob zaslaných
výkazem PERFIM30 - kontrola oproti hodnotám údaje (PERF30_11.RFD0002) v
případě LEI kódu nebo oproti hodnotám údaje (PERF30_11.RFD0005) v případě
identifikátoru FO. V případě použití identifikátoru FO se dále musí shodovat
použitý typ tohoto identifikátoru - kontrola množiny hodnot údajů
(TRAF20_22.FIM0019, TRAF20_22.FIM0020) oproti množině hodnot údajů
(PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM11', '000', '0120', '00')
  using out e; :1:=replace(e, 'traf10', 'traf20');
end;

MKT20180103 TRAFIM11 000 0129
/*
PK: Je-li ve výkazu TRAFIM20 Prodávající - pozbyvatel identifikován pomocí
řádně vyplněného (hodnota není dummy) LEI kódu (TRAF20_23.FIM0021) nebo
pomocí identifikátoru FO (TRAF20_23.FIM0026), potom musí být nalezen v rámci
množiny osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0002) v případě LEI kódu nebo oproti hodnotám údaje
(PERF30_11.RFD0005) v případě identifikátoru FO. V případě použití
identifikátoru FO se dále musí shodovat použitý typ tohoto identifikátoru -
kontrola množiny hodnot údajů (TRAF20_23.FIM0027, TRAF20_23.FIM0028) oproti
množině hodnot údajů (PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM11', '000', '0121', '00')
  using out e; :1:=replace(replace(e, 'traf10', 'traf20')
    , 'FIM0021', 'case FIM0021 when m.DV_LEI then null else FIM0021 end');
end;

MKT20180103 TRAFIM11 000 0130
/*
PK: Je-li ve výkazu TRAFIM20 Prodávající - rozhodovatel identifikován pomocí
LEI kódu (TRAF20_24.FIM0031) nebo pomocí identifikátoru FO
(TRAF20_24.FIM0035), potom musí být nalezen v rámci množiny osob zaslaných
výkazem PERFIM30 - kontrola oproti hodnotám údaje (PERF30_11.RFD0002) v
případě LEI kódu nebo oproti hodnotám údaje (PERF30_11.RFD0005) v případě
identifikátoru FO. V případě použití identifikátoru FO se dále musí shodovat
použitý typ tohoto identifikátoru - kontrola množiny hodnot údajů
(TRAF20_24.FIM0036, TRAF20_24.FIM0037) oproti množině hodnot údajů
(PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM11', '000', '0122', '00')
  using out e; :1:=replace(e, 'traf10', 'traf20');
end;

MKT20180103 TRAFIM11 000 0131
/*
PK: Je-li ve výkazu TRAFIM20 vyplněn Identifikační kód osoby činící
investiční rozhodnutí v rámci podniku (TRAF20_11.FIM0123), potom musí být
nalezen v rámci množiny osob zaslaných výkazem PERFIM30 - kontrola oproti
hodnotám údaje (PERF30_11.RFD0005).Dále se musí shodovat použitý typ
identifikátoru - kontrola množiny hodnot údajů (TRAF20_11.FIM0124,
TRAF20_11.FIM0125) oproti množině hodnot údajů (PERF30_11.RFD0006,
PERF30_11.RFD0007).
\#include
*/
begin :1:=replace(m.gke('MKT20180103', 'TRAFIM11', '000', '0123', '00')
  , 'traf10', 'traf20');
end;

MKT20180103 TRAFIM11 000 0132
/*
PK: Je-li ve výkazu TRAFIM20 vyplněn Identifikační kód osoby provádějící
obchod v rámci podniku (TRAF20_11.FIM0128), potom musí být nalezen v rámci
množiny osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0005).Dále se musí shodovat použitý typ identifikátoru -
kontrola množiny hodnot údajů (TRAF20_11.FIM0129, TRAF20_11.FIM0130) oproti
množině hodnot údajů (PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM11', '000', '0124', '00')
  using out e; :1:=replace(e, 'traf10', 'traf20');
end;

MKT20180103 TRAFIM11 000 0133
/*
PK: Je-li ve výkazu TRAFIM20 vyplněn Identifikační kód předávajícího podniku
pro kupujícího (TRAF20_11.FIM0039), potom musí být nalezen v rámci množiny
osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0002).
\#include
*/
begin :1:=replace(m.gke('MKT20180103', 'TRAFIM11', '000', '0125', '00')
  , 'traf10', 'traf20');
end;

MKT20180103 TRAFIM11 000 0134
/*
PK: Je-li ve výkazu TRAFIM20 vyplněn Identifikační kód předávajícího podniku
pro prodávajícího (TRAF20_11.FIM0040), potom musí být nalezen v rámci
množiny osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0002).
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM11', '000', '0126', '00')
  using out e; :1:=replace(e, 'traf10', 'traf20');
end;

MKT20180103 TRAFIM11 000 0135
/*
PK: Obsahuje-li hodnota údaje Kupující - LEI kód nabyvatele anebo ústřední
protistrany ve výkazu TRAFIM20 (TRAF20_21.FIM0004) předepsaný dummy LEI kód,
potom údaj Kupující - IČ nabyvatele (TRAF11_11.FIM0410) musí být vyplněný a
musí být nalezen v rámci množiny osob zaslaných výkazem PERFIM30 - kontrola
oproti hodnotám údaje (PERF30_11.RFD0003).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q20 as (
        select /*+ materialize */
          R0011
        , R0012
        , f
        , FIM0004
        from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , f
  , FIM0004
  from (
      select
        R0011
      , R0012
      , f.s
      , f.rt
      , row_number() over (partition by h.ii order by f.rt desc)
        as rowno
      , case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
      , FIM0004
      from
        rtraf20_11 r
      , rtraf20_11h h
      , rtraf20_11f f
      , rtraf20_21 r21
      , rtraf20_21h h21
      , mi
      , mo
      , mp
      , mf
      where r.ii=h.r_
      and h.ii=f.h_
      and h.mi_=mi.ii
      and mi.t between rd-DEPTH and rd
      and mi.mo_=mo.ii
      and mo.mp_=mp.ii
      and mp.lei='\L'
      and mi.bs=mf.ii(+)
      and h.ii=h21.h_
      and h21.r_=r21.ii
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
)
        where rowno=1
        and s in ('ACPT', 'PDNG', 'RCVD')
        and FIM0004=m.DV_LEI
      ), q as (
        select /*+ materialize */
          q20.R0011
        , q20.R0012
        , nvl(FIM0410, q20.R0011||s.BS||q20.R0012) x
        , q20.f
        from
          rtraf11_11 r
        , rtraf11_11h h
        , mi
        , mo
        , md
        , q20
        where r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='TRAFIM11'
        and mo.ii!=\o
        and q20.R0011=r.R0011
        and q20.R0012=r.R0012
        union all
        select
          q20.R0011
        , q20.R0012
        , nvl(FIM0410, q20.R0011||s.BS||q20.R0012)
        , q20.f
        from
          \tTRAF11_11 r
        , q20
        where q20.R0011=r.R0011
        and q20.R0012=r.R0012
      )
      select q.*
      from (
select x from q
minus
select RFD0003
from
  rperf30_11 r
, rperf30_11h h
, mi
, mo
, md
where r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id='PERFIM30'
and RFD0003 is not null
        ) d -- diff
      , q
      where q.x=d.x
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0136
/*
PK: Obsahuje-li hodnota údaje Prodávající - LEI kód pozbyvatele anebo
ústřední protistrany ve výkazu TRAFIM20 (TRAF20_23.FIM0021) předepsaný dummy
LEI kód, potom údaj Prodávající - IČ pozbyvatele (TRAF11_11.FIM0411) musí
být vyplněný a musí být nalezen v rámci množiny osob zaslaných výkazem
PERFIM30 - kontrola oproti hodnotám údaje (PERF30_11.RFD0003).
\#include
*/
declare e mk.e%type:=m.gke('MKT20180103', 'TRAFIM11', '000', '0135', '00');
begin
  e:=replace(e, '20_21', '20_23');
  e:=replace(e, 'FIM0004', 'FIM0021');
  :1:=replace(e, 'FIM0410', 'FIM0411');
end;

MKT20180103 TRAFIM11 000 0201
/*
PK: (pro Číslo pokynu - nákup, (TRAF11_11.FIM0140 <> BEZ_POKYNU|VLASTNI
|UCET_IS|KOTACE)) Pokud se nejedná o situaci, kdy Postavení
(TRAF10_11.FIM0042)=DEAL a Subjekt provádějící obchod je Kupující
- nabyvatel (TRAF10_21.R0012=TRAF10_21.FIM0004), pak hodnoty množiny
identifikátorů osoby Kupující - nabyvatel (TRAF10_21.FIM0004,
TRAF10_21.FIM0009, TRAF10_21.FIM0010, TRAF10_21.FIM0011, TRAF10_21.FIM0012)
ve výkazu TRAFIM10 se musí shodovat s hodnotami množiny identifikátorů osoby
Zákazník (TRAF30_11.FIM0303, TRAF30_11.FIM0304, TRAF30_11.FIM0305,
TRAF30_11.FIM0306, TRAF30_11.FIM0252) ve výkazu TRAFIM30.
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q10 as (
        select /*+ materialize */
          R0011
        , R0012
        , f
        , x
        from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , f
  , x
  from (
      select
        R0011
      , R0012
      , f.s
      , f.rt
      , row_number() over (partition by h.ii order by f.rt desc)
        as rowno
      , case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
      , FIM0004||s.BS||FIM0009||s.BS||FIM0010||s.BS||FIM0011||s.BS||FIM0012 x
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      , rtraf10_21 r21
      , rtraf10_21h h21
      , mi
      , mo
      , mp
      , mf
      where r.ii=h.r_
      and h.ii=f.h_
      and h.mi_=mi.ii
      and mi.t between rd-DEPTH and rd
      and mi.mo_=mo.ii
      and mo.mp_=mp.ii
      and mp.lei='\L'
      and mi.bs=mf.ii(+)
      and h.ii=h21.h_
      and h21.r_=r21.ii
      and (
        FIM0042!='DEAL'
        or R0012!=FIM0004
      )
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
)
        where rowno=1
        and s in ('ACPT', 'PDNG', 'RCVD')
      ), q as (
        select /*+ materialize */
          q10.R0011
        , q10.R0012
        , q10.x||s.BS||FIM0140 x
        , q10.f
        from
          rtraf11_11 r
        , rtraf11_11h h
        , mi
        , mo
        , md
        , q10
        where FIM0140 is not null
        and FIM0140 not in ('BEZ_POKYNU', 'KOTACE', 'UCET_IS', 'VLASTNI')
        and r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='TRAFIM11'
        and mo.ii!=\o
        and q10.R0011=r.R0011
        and q10.R0012=r.R0012
        union all
        select
          q10.R0011
        , q10.R0012
        , q10.x||s.BS||FIM0140
        , q10.f
        from
          \tTRAF11_11 r
        , q10
        where FIM0140 is not null
        and FIM0140 not in ('BEZ_POKYNU', 'KOTACE', 'UCET_IS', 'VLASTNI')
        and q10.R0011=r.R0011
        and q10.R0012=r.R0012
      )
      select q.*
      from
        (
select x from q
minus
select
  FIM0303||s.BS||FIM0304||s.BS||FIM0305||s.BS||FIM0306||s.BS
  ||FIM0252||s.BS||R0014
from
  rtraf30_11 r
, rtraf30_11h h
, mi
, mo
, md
where r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=m.IS_CURRENT
and mi.mo_=mo.ii
and mo.md_=md.ii
and md.id='TRAFIM30'
and mo.mp_=\p
        ) d -- diff
      , q
      where q.x=d.x
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0202
/*
PK: (pro Číslo pokynu - prodej, (TRAF11_11.FIM0141 <> BEZ_POKYNU|VLASTNI
|UCET_IS|KOTACE)) Pokud se nejedná o situaci, kdy Postavení
(TRAF10_11.FIM0042) =?DEAL? a Subjekt provádějící obchod je Prodávající
- pozbyvatel (TRAF10_23.R0012 = TRAF10_23.FIM0021), pak hodnoty množiny
identifikátorů osoby Prodávající - pozbyvatel (TRAF10_23.FIM0021,
TRAF10_23.FIM0026, TRAF10_23.FIM0027, TRAF10_23.FIM0028, TRAF10_23.FIM0029)
ve výkazu TRAFIM10 se musí shodovat s hodnotami množiny identifikátorů osoby
Zákazník (TRAF30_11.FIM0303, TRAF30_11.FIM0304, TRAF30_11.FIM0305,
TRAF30_11.FIM0306, TRAF30_11.FIM0252) ve výkazu TRAFIM30.
\#include
*/
begin :1:=replace(replace(replace(replace(
          m.gke('MKT20180103', 'TRAFIM11', '000', '0201', '00')
        , 'FIM0140', 'FIM0141')
      , '10_21', '10_23')
    , 'FIM0004||s.BS||FIM0009||s.BS||FIM0010||s.BS||FIM0011||s.BS||FIM0012'
    , 'FIM0021||s.BS||FIM0026||s.BS||FIM0027||s.BS||FIM0028||s.BS||FIM0029')
  , 'FIM0004', 'FIM0021');
end;

MKT20180103 TRAFIM11 000 0203
/*
PK: (pro Číslo pokynu - nákup, (TRAF11_11.FIM0140 <> BEZ_POKYNU|VLASTNI
|UCET_IS|KOTACE)) Pokud se nejedná o situaci, kdy Postavení
(TRAF20_11.FIM0042) =?DEAL? a Subjekt provádějící obchod je Kupující
- nabyvatel (TRAF20_21.R0012 = TRAF20_21.FIM0004), pak hodnoty množiny
identifikátorů osoby Kupující - nabyvatel (TRAF20_21.FIM0004,
TRAF20_21.FIM0009, TRAF20_21.FIM0010, TRAF20_21.FIM0011, TRAF20_21.FIM0012)
ve výkazu TRAFIM20 (případná dummy hodnota LEI bude v této kontrole
nahrazena hodnotou NULL) se musí shodovat s hodnotami množiny identifikátorů
osoby Zákazník (TRAF30_11.FIM0303, TRAF30_11.FIM0304, TRAF30_11.FIM0305,
TRAF30_11.FIM0306, TRAF30_11.FIM0252) ve výkazu TRAFIM30.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0201', '00')
    , 'traf10', 'traf20')
  , 'FIM0004||'
  , 'case FIM0004 when m.DV_LEI then null else FIM0004 end||');
end;

MKT20180103 TRAFIM11 000 0204
/*
PK: (pro Číslo pokynu - prodej, (TRAF11_11.FIM0141 <> BEZ_POKYNU|VLASTNI
|UCET_IS|KOTACE)) Pokud se nejedná o situaci, kdy Postavení
(TRAF20_11.FIM0042) =?DEAL? a Subjekt provádějící obchod je Prodávající
- pozbyvatel (TRAF20_23.R0012 = TRAF20_23.FIM0021), pak hodnoty množiny
identifikátorů osoby Prodávající - pozbyvatel (TRAF20_23.FIM0021,
TRAF20_23.FIM0026, TRAF20_23.FIM0027, TRAF20_23.FIM0028, TRAF20_23.FIM0029)
ve výkazu TRAFIM20 (případná dummy hodnota LEI bude v této kontrole
nahrazena hodnotou NULL) se musí shodovat s hodnotami množiny identifikátorů
osoby Zákazník (TRAF30_11.FIM0303, TRAF30_11.FIM0304, TRAF30_11.FIM0305,
TRAF30_11.FIM0306, TRAF30_11.FIM0252) ve výkazu TRAFIM30.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM11', '000', '0202', '00')
  using out e; e:=replace(e, 'traf10', 'traf20');
  :1:=replace(e, 'FIM0021||'
  , 'case FIM0021 when m.DV_LEI then null else FIM0021 end||');
end;

MKT20180103 TRAFIM11 000 0205
/*
PK: (pro Číslo pokynu - nákup, (TRAF11_11.FIM0141 <> BEZ_POKYNU|VLASTNI
|UCET_IS|KOTACE)) Hodnoty množiny identifikátorů Identifikační kód nástroje
/ Identifikace investičního nástroje (TRAF10_11.FIM0065|TRAF10_11.FIM0066,
TRAF11_11.FIM0151, TRAF11_11.FIM0152, TRAF11_11.FIM0153) ve výkazech
TRAFIM10 a TRAFIM11 se musí shodovat s hodnotami množiny identifikátorů
Idenitifikace investičního nástroje (TRAF30_11.FIM0255, TRAF30_11.FIM0307,
TRAF30_11.FIM0308, TRAF30_11.FIM0309) ve výkazu TRAFIM30.
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q10 as (
        select /*+ materialize */
          R0011
        , R0012
        , f
        , x
        from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , f
  , x
  from (
      select
        R0011
      , R0012
      , f.s
      , f.rt
      , row_number() over (partition by h.ii order by f.rt desc)
        as rowno
      , case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
      , FIM0065||FIM0066 x
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      , mi
      , mo
      , mp
      , mf
      where r.ii=h.r_
      and h.ii=f.h_
      and h.mi_=mi.ii
      and mi.t between rd-DEPTH and rd
      and mi.mo_=mo.ii
      and mo.mp_=mp.ii
      and mp.lei='\L'
      and mi.bs=mf.ii(+)
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
)
        where rowno=1
        and s in ('ACPT', 'PDNG', 'RCVD')
      ), q as (
        select /*+ materialize */
          q10.R0011
        , q10.R0012
        , q10.x||s.BS||FIM0151||s.BS||FIM0152||s.BS||FIM0153||s.BS||FIM0140
          as x
        , q10.f
        from
          rtraf11_11 r
        , rtraf11_11h h
        , mi
        , mo
        , md
        , q10
        where FIM0140 is not null
        and FIM0140 not in ('BEZ_POKYNU', 'KOTACE', 'UCET_IS', 'VLASTNI')
        and r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='TRAFIM11'
        and mo.ii!=\o
        and q10.R0011=r.R0011
        and q10.R0012=r.R0012
        union all
        select
          q10.R0011
        , q10.R0012
        , q10.x||s.BS||FIM0151||s.BS||FIM0152||s.BS||FIM0153||s.BS||FIM0140
        , q10.f
        from
          \tTRAF11_11 r
        , q10
        where FIM0140 is not null
        and FIM0140 not in ('BEZ_POKYNU', 'KOTACE', 'UCET_IS', 'VLASTNI')
        and q10.R0011=r.R0011
        and q10.R0012=r.R0012
      )
      select q.*
      from (
select x from q
minus
select FIM0255||s.BS||FIM0307||s.BS||FIM0308||s.BS||FIM0309
  ||s.BS||R0014
from
  rtraf30_11 r
, rtraf30_11h h
, mi
, mo
, md
where FIM0256='BUYI'
and r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id='TRAFIM30'
        ) d -- diff
      , q
      where q.x=d.x
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0206
/*
PK: (pro Číslo pokynu - prodej, (TRAF11_11.FIM0141 <> BEZ_POKYNU|VLASTNI
|UCET_IS|KOTACE)) Hodnoty množiny identifikátorů Identifikační kód nástroje
/ Identifikace investičního nástroje (TRAF10_11.FIM0065|TRAF10_11.FIM0066,
TRAF11_11.FIM0151, TRAF11_11.FIM0152, TRAF11_11.FIM0153) ve výkazech
TRAFIM10 a TRAFIM11 se musí shodovat s hodnotami množiny identifikátorů
Idenitifikace investičního nástroje (TRAF30_11.FIM0255, TRAF30_11.FIM0307,
TRAF30_11.FIM0308, TRAF30_11.FIM0309) ve výkazu TRAFIM30.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0205', '00')
    , 'BUYI', 'SELL'), 'FIM0140', 'FIM0141');
end;

MKT20180103 TRAFIM11 000 0207
/*
PK: (pro Číslo pokynu - nákup, (TRAF11_11.FIM0140 <> BEZ_POKYNU|VLASTNI
|UCET_IS|KOTACE)) Hodnoty množiny identifikátorů Identifikační kód nástroje
/ Identifikace investičního nástroje (TRAF20_11.FIM0065|TRAF20_11.FIM0066,
TRAF11_11.FIM0151, TRAF11_11.FIM0152, TRAF11_11.FIM0153) ve výkazech
TRAFIM20 (případná dummy hodnota ISIN bude v této kontrole nahrazena
hodnotou NULL) a TRAFIM11 se musí shodovat s hodnotami množiny
identifikátorů Idenitifikace investičního nástroje (TRAF30_11.FIM0255,
TRAF30_11.FIM0307, TRAF30_11.FIM0308, TRAF30_11.FIM0309) ve výkazu TRAFIM30
a Ukazatel nákupu/prodeje (TRAF30_11.FIM0256) je roven BUYI.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0205', '00')
    , 'traf10', 'traf20')
  , 'FIM0065||FIM0066'
  , 'case FIM0065||FIM0066 when m.DV_ISIN then null'
    ||' else FIM0065||FIM0066 end');
end;

MKT20180103 TRAFIM11 000 0208
/*
PK: (pro Číslo pokynu - prodej, (TRAF11_11.FIM0141 <> BEZ_POKYNU|VLASTNI
|UCET_IS|KOTACE)) Hodnoty množiny identifikátorů Identifikační kód nástroje
/ Identifikace investičního nástroje (TRAF20_11.FIM0065|TRAF20_11.FIM0066,
TRAF11_11.FIM0151, TRAF11_11.FIM0152, TRAF11_11.FIM0153) ve výkazech
TRAFIM20 (případná dummy hodnota ISIN bude v této kontrole nahrazena
hodnotou NULL) a TRAFIM11 se musí shodovat s hodnotami množiny
identifikátorů Idenitifikace investičního nástroje (TRAF30_11.FIM0255,
TRAF30_11.FIM0307, TRAF30_11.FIM0308, TRAF30_11.FIM0309) ve výkazu TRAFIM30
a Ukazatel nákupu/prodeje (TRAF30_11.FIM0256) je roven SELL.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM11', '000', '0207', '00')
  using out e; e:=replace(e, 'BUYI', 'SELL');
  :1:=replace(e, 'FIM0140', 'FIM0141');
end;

MKT20180103 TRAFIM11 000 0209
/*
PK: Je-li Obchod s investičními nástroji podle čl. 26 nařízení MiFIR
(TRAF11_11.FIM0156) = true, potom pro hodnotu údaje Typ transakce <>
převod|derivát (TRAF11_11.FIM0142 <> 161|162|163|321|329|33) musí platit
pro vyplněné hodnoty údajů týkajících se ceny obchodu ve výkazu TRAFIM10
následující omezení: hodnota údaje (TRAF10_11.FIM0051 <> false nebo
nevyplněna) a zároveň hodnota údaje (TRAF10_11.FIM0052 > 0 nebo nevyplněna)
a zároveň hodnota údaje (TRAF10_11.FIM0054 > 0 nebo nevyplněna).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q as (
        select /*+ materialize */
          R0011
        , R0012
        , mi.id f
        from
          rtraf11_11 r
        , rtraf11_11h h
        , mi
        , mo
        , md
        where FIM0142 not in ('161', '162', '163', '321', '329', '33')
        and FIM0156='true'
        and r.ii=h.r_
        and h.mi_=mi.ii
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='TRAFIM11'
        and mo.ii!=\o
        and mi.t between rd-DEPTH and rd
        union all
        select
          R0011
        , R0012
        , null
        from
          \tTRAF11_11 r
        where FIM0142 not in ('161', '162', '163', '321', '329', '33')
        and FIM0156='true'
      )
      select q.*
      from
        q
      , (
select
  R0011
, R0012
from q
minus
select
  R0011
, R0012
from (
    select
      R0011
    , R0012
    , s
    , row_number() over (
        partition by R0011, R0012 order by rt desc) as rowno
    , FIM0051
    , FIM0052
    , FIM0054
    from (
        select
          r.R0011
        , r.R0012
        , f.s
        , f.rt
        , row_number() over (
            partition by h.ii order by f.rt desc) as rowno
        , FIM0051
        , FIM0052
        , FIM0054
        from
          rtraf10_11 r
        , rtraf10_11h h
        , rtraf10_11f f
        where r.ii=h.r_
        and h.ii=f.h_
      )
    where rowno=1
    and s not in ('RJCT', 'RMVD')
  )
where rowno=1
and s in ('ACPT', 'CNCL', 'PDNG', 'RCVD')
and nvl(FIM0051, 'true')='true'
and to_number(nvl(FIM0052, '1')
  , '99999999999d9999999999'
  , 'nls_numeric_characters=''.,''')>0
and to_number(nvl(FIM0054, '1')
  , '99999999999999999d99999999999999999'
  , 'nls_numeric_characters=''.,''')>0
        ) d -- diff
      where q.R0011=d.R0011
      and q.R0012=d.R0012
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0210
/*
PK: Je-li Obchod s investičními nástroji podle čl. 26 nařízení MiFIR
(TRAF11_11.FIM0156) = false, potom pro hodnotu údaje Typ transakce <>
převod|derivát (TRAF11_11.FIM0142 <> 161|162|163|321|329|33) musí platit
pro vyplněné hodnoty údajů týkajících se ceny obchodu ve výkazu TRAFIM20
následující omezení: hodnota údaje (TRAF20_11.FIM0051 <> false nebo
nevyplněna) a zároveň hodnota údaje (TRAF20_11.FIM0052 > 0 nebo nevyplněna)
a zároveň hodnota údaje (TRAF20_11.FIM0054 > 0 nebo nevyplněna).
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0209', '00')
    , 'traf10', 'traf20'), '0156=''true''', '0156=''false''');
end;

MKT20180103 TRAFIM11 000 0211
/*
PK: Je-li Obchod s investičními nástroji podle čl. 26 nařízení MiFIR
(TRAF11_11.FIM0156) = true, potom pro hodnotu údaje Typ transakce <>
převod|derivát (TRAF11_11.FIM0142 <> 161|162|163|321|329|33) musí být
hodnota údaje Předpokládaný den vypořádání (TRAF11_11.FIM0145 >= datumová
část údaje Datum a čas obchodování ve výkazu TRAFIM10 (TRAF10_11.FIM0041)).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||t10.R0012||',R0011.'||t10.R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      select
        R0011
      , R0012
      , mi.id f
      , FIM0145
      from
        rtraf11_11 r
      , rtraf11_11h h
      , mi
      , mo
      , md
      where FIM0142 not in ('161', '162', '163', '321', '329', '33')
      and FIM0156='true'
      and r.ii=h.r_
      and h.mi_=mi.ii
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM11'
      and mo.ii!=\o
      and mi.t between rd-DEPTH and rd
      union all
      select
        R0011
      , R0012
      , null
      , FIM0145
      from
        \tTRAF11_11 r
      where FIM0142 not in ('161', '162', '163', '321', '329', '33')
      and FIM0156='true'
    ) t11
  , (
      select
        R0011
      , R0012
      , fim0041
      from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , fim0041
  from (
      select
        r.R0011
      , r.R0012
      , f.s
      , f.rt
      , row_number() over (
          partition by h.ii order by f.rt desc) as rowno
      , to_date(substr(r.FIM0041, 1, 10), s.FMT_ISODATE) fim0041
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      where r.ii=h.r_
      and h.ii=f.h_
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
        )
      where rowno=1
      and s in ('ACPT', 'CNCL', 'PDNG', 'RCVD')
    ) t10
  where t10.R0011=t11.R0011
  and t10.R0012=t11.R0012
  and t10.fim0041>t11.FIM0145
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0212
/*
PK: Je-li Obchod s investičními nástroji podle čl. 26 nařízení MiFIR
(TRAF11_11.FIM0156) = true, potom pro hodnotu údaje Typ transakce =
převod|derivát (TRAF11_11.FIM0142 = 161|162|163|321|329|33) musí být
hodnota údaje Předpokládaný den vypořádání (TRAF11_11.FIM0145 >= datumová
část údaje Datum a čas obchodování ve výkazu TRAFIM10 (TRAF10_11.FIM0041)).
\#include
*/
begin :1:=replace(m.gke('MKT20180103', 'TRAFIM11', '000', '0211', '00')
  , 'FIM0142 not in', 'FIM0142 in');
end;

MKT20180103 TRAFIM11 000 0213
/*
PK: Je-li Obchod s investičními nástroji podle čl. 26 nařízení MiFIR
(TRAF11_11.FIM0156) = false, potom pro hodnotu údaje Typ transakce <>
převod|derivát (TRAF11_11.FIM0142 <> 161|162|163|321|329|33) musí být
hodnota údaje Předpokládaný den vypořádání (TRAF11_11.FIM0145 >= datumová
část údaje Datum a čas obchodování ve výkazu TRAFIM10 (TRAF10_11.FIM0041)).
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0211', '00')
    , 'traf10', 'traf20'), '0156=''true''', '0156=''false''');
end;

MKT20180103 TRAFIM11 000 0214
/*
PK: Je-li Obchod s investičními nástroji podle čl. 26 nařízení MiFIR
(TRAF11_11.FIM0156) = false, potom pro hodnotu údaje Typ transakce =
převod|derivát (TRAF11_11.FIM0142 = 161|162|163|321|329|33) musí být hodnota
údaje Předpokládaný den vypořádání (TRAF11_11.FIM0145 >= datumová část údaje
Datum a čas obchodování ve výkazu TRAFIM20 (TRAF20_11.FIM0041)).
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM11', '000', '0212', '00')
  using out e; e:=replace(e, '0156=''true''', '0156=''false''');
  :1:=replace(e, 'traf10', 'traf20');
end;

MKT20180103 TRAFIM11 000 0217
/*
PK: Je-li Obchod s investičními nástroji podle čl. 26 nařízení MiFIR
(TRAF11_11.FIM0156) = true, potom pro hodnoty údajů Číslo pokynu - nákup
(TRAF11_11.FIM0140 = VLASTNI) nebo Číslo pokynu - prodej (TRAF11_11.FIM0141
= VLASTNI) musí údaj ve výkazu TRAFIM10 Postavení = Obchodování na vlastní
účet (TRAF10_11.FIM0042 = DEAL).
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||t10.R0012||',R0011.'||t10.R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      select
        R0011
      , R0012
      , mi.id f
      from
        rtraf11_11 r
      , rtraf11_11h h
      , mi
      , mo
      , md
      where FIM0156='true'
      and (
        FIM0140='VLASTNI'
        or FIM0141='VLASTNI'
      ) and r.ii=h.r_
      and h.mi_=mi.ii
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM11'
      and mo.ii!=\o
      and mi.t between rd-DEPTH and rd
      union all
      select
        R0011
      , R0012
      , null
      from
        \tTRAF11_11 r
      where FIM0156='true'
      and (
        FIM0140='VLASTNI'
        or FIM0141='VLASTNI'
      )
    ) t11
  , (
      select
        R0011
      , R0012
      , FIM0042
      from (
  select
    R0011
  , R0012
  , s
  , row_number() over (
      partition by R0011, R0012 order by rt desc) as rowno
  , FIM0042
  from (
      select
        r.R0011
      , r.R0012
      , f.s
      , f.rt
      , row_number() over (
          partition by h.ii order by f.rt desc) as rowno
      , FIM0042
      from
        rtraf10_11 r
      , rtraf10_11h h
      , rtraf10_11f f
      where r.ii=h.r_
      and h.ii=f.h_
    )
  where rowno=1
  and s not in ('RJCT', 'RMVD')
        )
      where rowno=1
      and s in ('ACPT', 'CNCL', 'PDNG', 'RCVD')
    ) t10
  where t10.R0011=t11.R0011
  and t10.R0012=t11.R0012
  and nvl(t10.FIM0042, 'x')!='DEAL'
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0218
/*
PK: Je-li Obchod s investičními nástroji podle čl. 26 nařízení MiFIR
(TRAF11_11.FIM0156) = false, potom pro hodnoty údajů Číslo pokynu - nákup
(TRAF11_11.FIM0140 = VLASTNI) nebo Číslo pokynu - prodej (TRAF11_11.FIM0141
= VLASTNI) musí údaj ve výkazu TRAFIM20 Postavení = Obchodování na vlastní
účet (TRAF20_11.FIM0042 = DEAL).
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM11', '000', '0217', '00')
    , 'traf10', 'traf20'), '0156=''true''', '0156=''false''');
end;

MKT20180103 TRAFIM11 000 0221
/*
PK:K zaslanému hromadnému obchodu ve výkazu TRAFIM10 nebyly nalezeny dílčí
obchody. Kontrola se provádí pro zaslaný hromadný obchod.
****************************************************************************
* Dále se použije text KK 222, kde se zamění řetězec TRAF20 za TRAF10.     *
* Případně se použije text KK 221 dostupný na https://apl.cnb.cz/ewi/.     *
****************************************************************************
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  ec stp.id%type:='__\e.221.ec'; -- error count
  q varchar2(3000 byte); -- query
  rd date:=sysdate; -- reference date
begin
  q:='
\i
\s
  \k
, ''(''||nvl2(f, ''file.''||f||'','', null)
  ||''R0012.''||R0012||'',R0011.''||R0011||'')''
, \aTRAF11_11
, ''00'' -- unsaveable - no reference in h.mi_
from (
    with q as (
      select /*+ materialize */
        q10.R0011
      , q10.R0012
      , f
      , x
      from
        (
select
  R0011
, R0012
, f
from (
    select
      R0011
    , R0012
    , s
    , row_number() over (
        partition by R0011, R0012 order by rt desc) as rowno
    , f
    , FIM0012
    from (
        select
          R0011
        , R0012
        , f.s
        , f.rt
        , row_number() over (partition by h.ii order by f.rt desc) as rowno
        , case when mi.mct_=hextoraw(''44'') then mf.n else mi.id end f
        , FIM0012
        from
          rtraf10_11 r
        , rtraf10_11h h
        , rtraf10_11f f
        , rtraf10_21 r21
        , rtraf10_21h h21
        , mi
        , mo
        , mp
        , mf
        where r.ii=h.r_
        and h.ii=f.h_
        and h.mi_=mi.ii
        and mi.t between :1 and :2
        and mi.mo_=mo.ii
        and mo.mp_=mp.ii
        and mp.lei=''\L''
        and mi.bs=mf.ii(+)
        and h.ii=h21.h_
        and h21.r_=r21.ii
      )
    where rowno=1
    and s not in (''RJCT'', ''RMVD'')
  )
where rowno=1
and s in (''ACPT'', ''PDNG'', ''RCVD'')
and FIM0012=''INTC''
        ) q10
      , (
select
  R0011
, R0012
, substr(FIM0140, 1, 15) x
from
  rtraf11_11 r
, rtraf11_11h h
, mi
, mo
, md
where substr(FIM0140, -5)=''00000''
and r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=''A'' -- m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id=''TRAFIM11''
and mo.ii!=\o
union all
select
  R0011
, R0012
, substr(FIM0140, 1, 15)
from \tTRAF11_11
where substr(FIM0140, -5)=''00000''
        ) q11
      where q10.R0011=q11.R0011
      and q10.R0012=q11.R0012
    )
    select
      R0011
    , R0012
    , f
    from
      q
    , (
        select x from q
        minus
        select x
        from (
  select x
  from (
      select substr(FIM0140, 1, 15) x
      from
        rtraf11_11 r
      , rtraf11_11h h
      , mi
      , mo
      , md
      where FIM0140 is not null
      and substr(FIM0140, -5)!=''00000''
      and r.ii=h.r_
      and h.mi_=mi.ii
      and mi.mis_=''A'' -- m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id=''TRAFIM11''
      and mo.ii!=\o
      union all
      select substr(FIM0140, 1, 15)
      from \tTRAF11_11
      where FIM0140 is not null
      and substr(FIM0140, -5)!=''00000''
    )
  group by x having count(*)>1
)
      ) d -- diff
    where q.x=d.x
  )
\f';
  if s.pg(ec, s.GC_NO) is null then
    execute immediate q using rd-DEPTH, rd;
    s.ps(ec, sql%rowcount); commit; end if;
  q:=replace(q, 'traf10_21', 'traf10_23');
  q:=replace(q, 'FIM0012', 'FIM0029');
  q:=replace(q, 'FIM0140', 'FIM0141');
  execute immediate q using rd-DEPTH, rd;
  :1:=sql%rowcount+s.pg(ec); s.pd(ec);
  /* commit/rollback will be executed by caller */
end;

MKT20180103 TRAFIM11 000 0222
/*
PK:K zaslanému hromadnému obchodu ve výkazu TRAFIM20 nebyly nalezeny dílčí
obchody. Kontrola se provádí pro zaslaný hromadný obchod. Hromadný obchod
(na straně nakupujícího) má v TRAFIM20 hodnotu údaje TRAF20_21.FIM0012 =
INTC a zároveň má v TRAFIM11 (vazba do TRAFIM20 přes (TRAF20_11.R0011,
TRAF20_11.R0012) = (TRAF11_11.R0011, TRAF11_11.R0012)) v poli Číslo pokynu
- Nákup (TRAF11_11.FIM0140) posledních 5 číslic "00000". Pro takový hromadný
obchod se kontroluje, zda existují alespoň další 2 záznamy ve výskytu
TRAFIM11 (dílčí obchody), které mají v poli Číslo pokynu - Nákup
(TRAF11_11.FIM0140) prvních 15 znaků shodných s hodnotou Číslo pokynu -
Nákup (TRAF11_11.FIM0140) hromadného obchodu. Hromadný obchod (na straně
prodávajícího) má v TRAFIM20 hodnotu údaje TRAF20_23.FIM0029 = INTC zároveň
má v TRAFIM11 (vazba do TRAFIM20 přes (TRAF20_11.R0011, TRAF20_11.R0012) =
(TRAF11_11.R0011, TRAF11_11.R0012)) v poli Číslo pokynu - Prodej
(TRAF11_11.FIM0141) posledních 5 číslic "00000". Pro takový hromadný obchod
se kontroluje, zda existují alespoň další 2 záznamy ve výskytu TRAFIM11
(dílčí obchody), které mají v poli Číslo pokynu - Prodej (TRAF11_11.FIM0141)
prvních 15 znaků shodných s hodnotou Číslo pokynu - Prodej
(TRAF11_11.FIM0141) hromadného obchodu.
\#include
*/
begin :1:=replace(m.gke('MKT20180103', 'TRAFIM11', '000', '0221', '00')
  , 'traf10', 'traf20');
end;

MKT20180103 TRAFIM11 000 0223
/*
Hodnota údaje Autor čísla obchodu (TRAF11_11.FIM0138) musí být LEI
vykazujícího subjektu nebo MIC regulovaného trhu.
*/
begin
  \i
  \s
    \k
  , '(R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - see kind of check
  from \tTRAF11_11
  where FIM0138 not in (select id from em where c in ('M', 'O', 'R', 'S'))
  and FIM0138!=R0012
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM11 000 0902
/*
PK: Je-li ve výkazu TRAFIM20 údaj Identifikační kód nástroje 1
(TRAF20_11.FIM0065) vyplněný a v rámci množiny nástrojů zaslaných výkazem
REFFIM10 je pro tento nástroj (kontrola oproti hodnotám údaje
REFF10_11.RFD0033) hodnota REFF10_11.RFD0113 Hlášení nástroje podle čl. 26
nařízení (EU) č. 600/2014 (MIFIR) = true, pak musí být tento nástroj nalezen
v referenčních datech FIRDS.
*/
declare
  DEPTH pls_integer:=s.pg('m.t11-waiting-time');
  rd date:=sysdate; -- reference date
begin
  \i
  \s
    \k
  , '('||nvl2(f, 'file.'||f||',', null)
    ||'R0012.'||R0012||',R0011.'||R0011||')'
  , \aTRAF11_11
  , '00' -- unsaveable - no reference in h.mi_
  from (
      with q as (
        select /*+ materialize */
          R0011
        , R0012
        , f
        , fim0041
        , FIM0065
        from (
  select
    R0011
  , R0012
  , f
  , fim0041
  , FIM0065
  from (
      select
        R0011
      , R0012
      , s
      , row_number() over (
          partition by R0011, R0012 order by rt desc) as rowno
      , f
      , fim0041
      , FIM0065
      from (
select
  R0011
, R0012
, f.s
, f.rt
, row_number() over (partition by h.ii order by f.rt desc)
  as rowno
, case when mi.mct_=hextoraw('44') then mf.n else mi.id end f
, to_date(substr(r.FIM0041, 1, 10), s.FMT_ISODATE) fim0041
, FIM0065
from
  rtraf20_11 r
, rtraf20_11h h
, rtraf20_11f f
, mi
, mo
, mp
, mf
where r.ii=h.r_
and h.ii=f.h_
and h.mi_=mi.ii
and mi.t between rd-DEPTH and rd
and mi.mo_=mo.ii
and mo.mp_=mp.ii
and mp.lei='\L'
and mi.bs=mf.ii(+)
        )
      where rowno=1
      and s!='RJCT'
    )
  where rowno=1
  and s='ACPT'
  and FIM0065 is not null
), (
  select RFD0033
  from (
      select
        RFD0033
      , RFD0113
      , row_number() over (partition by RFD0033 order by mi.t desc) as rowno
      from
        rreff10_11 r
      , rreff10_11h h
      , mi
      , mo
      , md
      where RFD0033 is not null
      and r.ii=h.r_
      and h.mi_=mi.ii
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='REFFIM10'
    )
  where RFD0113='true'
  and rowno=1
)
        where FIM0065=RFD0033
      )
      select * from q
      minus
      select q.*
      from
        q
      , eim
      where FIM0065=eim.id
      --and fim0041 between eim.vf and eim.vt
    )
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM20 000 0001

/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: Create XML file. Part 3 of 4.
\#include
*/
begin :1:=replace(m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '11')
  , '\tTRAF10', '\tTRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_32: T0019 out of range of TRAF10_11.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '08')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF20_11+TRAF20_51: Duplicity of T0019.
\#include
*/
begin :1:=replace(m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '00')
  , 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001

/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: Create XML file. Part 2 of 4.
\#include
*/
begin :1:=replace(m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '10')
  , '\tTRAF10', '\tTRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_21: T0019 out of range of TRAF10_11.
\#include
*/
begin :1:=replace(m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '03')
  , 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_23: T0019 out of range of TRAF10_11.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '05')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_31: T0019 out of range of TRAF10_11.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '07')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_35: T0019 out of range of TRAF10_11.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '0b')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_41: T0019 out of range of TRAF10_11.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '0d')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: Create XML file. Part 1 of 4.
\#include
*/
begin :1:=replace(m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '0f')
  , '\tTRAF10', '\tTRAF20');
end;

MKT20180103 TRAFIM20 000 0001

/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: Create XML file. Part 4 of 4.
\#include
*/
begin :1:=replace(m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '12')
  , '\tTRAF10', '\tTRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_24: T0019 out of range of TRAF10_11.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '06')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_33: T0019 out of range of TRAF10_11.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '09')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_21: A mandatory row is missing.
\#include
*/
begin :1:=replace(m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '01')
  , 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_23: A mandatory row is missing.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '02')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_22: T0019 out of range of TRAF10_11.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '04')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_34: T0019 out of range of TRAF10_11.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '0a')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_36: T0019 out of range of TRAF10_11.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '0c')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 000 0001
/*
FIL-105: Kontrola oproti ESMA XML schématu
  CT_MTS: TRAF10_11-TRAF10_42: T0019 out of range of TRAF10_11.
\#include
*/
declare e mk.e%type; begin
  execute immediate m.gke('MKT20180103', 'TRAFIM10', '000', '0001', '0e')
  using out e; :1:=replace(e, 'TRAF10', 'TRAF20');
end;

MKT20180103 TRAFIM20 110 0023
/*
CON-023: "If the report is a new transaction, the transaction reference
number shall pertain to a single transaction per the executing entity, i.e.
the same transaction reference number has not been used before or pertains
to a transaction that has been cancelled (the last accepted report with this
transaction reference number was a cancellation report)."
Part 1 of 2. Fragment 1 of 3. The first item of the Set 1.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0023', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0023
/*
CON-023: "If the report is a new transaction, the transaction reference
number shall pertain to a single transaction per the executing entity, i.e.
the same transaction reference number has not been used before or pertains
to a transaction that has been cancelled (the last accepted report with this
transaction reference number was a cancellation report)."
Part 2 of 2. Fragment 1 of 3. The first item of the Set 1.
\#include
*/
begin :1:=replace(replace(replace(
        m.gke('MKT20180103', 'TRAFIM10', '110', '0023', '01')
      , 'TRAF10', 'TRAF20'), 'traf10', 'traf20'), 'k_RCVD', 'k_UNKN');
end;

MKT20180103 TRAFIM20 110 0024
/*
CON-024: "If the report is a cancellation report, a transaction with the
same transaction reference number should have been reported by the executing
entity before."
Fragment 2 of 3.
*/

MKT20180103 TRAFIM20 110 0025
/*
CON-025: "If the report is a cancellation report, this transaction should be
an active transaction (there was no cancellation report following the last
accepted new transaction report for this transaction reference number)."
Fragment 3 of 3.
*/

MKT20180103 TRAFIM20 110 0040
/*
CON-040: "Where field 5 is populated with 'true', this field shall be
populated with a LEI accurately formatted and in the LEI database included
in the GLEIF database maintained by the Central Operating Unit.
1. The status of the LEI shall be 'Issued', 'Pending transfer' or
'Pending archival'.
2. The InitialRegistrationDate of the LEI shall be equal or before the
trading date.
3. The EntityStatus shall be Active or if the EntityStatus is Inactive, the
LastUpdateDate shall be equal or after the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0040', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0041
/*
CON-041: "Where field 5 is populated with 'false', this field shall be
populated with a LEI accurately formatted and in the LEI database included
in the GLEIF database maintained by the Central Operating Unit.
1. The status of the LEI shall be 'Issued', 'Pending transfer' 'Pending
archival' or 'Lapsed'.
2. The InitialRegistrationDate of the LEI shall be equal or before the
trading date.
3. The EntityStatus shall be Active or if the EntityStatus is Inactive, the
LastUpdateDate shall be equal or after the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0041', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0060
/*
CON-060: "This field shall be populated with a LEI accurately formatted and
in the LEI database included in the GLEIF database maintained by the Central
Operating Unit.
1. The status of the LEI shall be "Issued", "Lapsed", "Pending transfer" or
"Pending archival"; 2. The InitialRegistrationDate of the LEI shall be equal
or before the submission date; 3. The EntityStatus shall be Active or if the
EntityStatus is Inactive, the LastUpdateDate shall be equal or after the
submission date".
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0060', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0070
/*
Pokud není v poli TRAF20_21.FIM0004 vyplněn Dummy LEI 123456DUMMY000000000
pak:
CON-070: "If LEI is used, this field shall be populated with a LEI
accurately formatted and in the LEI database included in the GLEIF database
maintained by the Central Operating Unit.
1. The status of the LEI shall be 'Issued', 'Lapsed', 'Pending
transfer' or 'Pending archival'.
2. The InitialRegistrationDate of the LEI shall be equal or before the
trading date.
3. The EntityStatus shall be Active or if the EntityStatus is Inactive, the
LastUpdateDate shall be equal or after the trading date."
\#include
*/
declare e mk.e%type:=m.gke('MKT20180103', 'TRAFIM10', '110', '0070', '00');
begin
  e:=regexp_replace(e, '-- \\#begin.*\\#end', null, 1, 1, 'n');
  e:=regexp_replace(e, 'TRAF10', 'TRAF20');
  e:=regexp_replace(e, 'traf10', 'traf20');
  :1:=regexp_replace(e, 'r21.FIM0004 is not null'
  , 'r21.FIM0004 is not null and r21.FIM0004!=m.DV_LEI');
end;

MKT20180103 TRAFIM20 110 0071
/*
CON-071: "If national identifier is used, the first 2 characters of the
national identification code should be an ISO 3166 country code that was
valid at the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0071', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0072
/*
CON-072: "If MIC code is used, it should be a valid ISO 10383 MIC code
indicating a trading venue that was active at the trading date, excluding
special MIC codes 'XXXX' and 'XOFF'."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0072', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0073
/*
CON-073: "If the CONCAT code is used, the birthdate in the CONCAT code
should be the same as the birthdate populated in field 11."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0073', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0074
/*
CON-074: "In case the CONCAT code is used, the following characters are only
allowed: Capital Latin letters, Numbers, #. It should be a string of exactly
20 characters where first two characters are letters, the next 8 characters
are numbers and the remaining characters are letters or #, where 11th and
16th character are letters.
In case national identification number or passport number is used, the
following characters are only allowed: capital Latin letters (A-Z), numbers
(0-9) as well as '+' and '-' in case the identifier starts with "FI" and "-"
when the identifier starts with "LV". It can be a string of 3 to 35
characters, where first two characters are letters."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0074', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0080
/*
CON-080: "If populated, it should be an ISO 3166 country code that was valid
at the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0080', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0120
/*
CON-120: "If LEI is used, this field shall be populated with a LEI
accurately formatted and in the LEI database included in the GLEIF database
maintained by the Central Operating Unit.
1. The status of the LEI shall be 'Issued', 'Lapsed', 'Pending
transfer' or 'Pending archival'.
2. The InitialRegistrationDate of the LEI shall be equal or before the
trading date.
3. The EntityStatus shall be Active or if the EntityStatus is Inactive, the
LastUpdateDate shall be equal or after the trading date."
\#include
*/
declare e mk.e%type:=m.gke('MKT20180103', 'TRAFIM10', '110', '0120', '00');
begin
  e:=regexp_replace(e, '-- \\#begin.*\\#end', null, 1, 1, 'n');
  e:=regexp_replace(e, 'TRAF10', 'TRAF20');
  :1:=regexp_replace(e, 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0121
/*
CON-121: "If national identifier is used, the first 2 characters of the
national identification code should be an ISO 3166 country code that was
valid at the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0121', '00')
      , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0122
/*
CON-122: "If the CONCAT code is used, the birthdate in the CONCAT code
should be the same as the birthdate populated in field 15."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0122', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0123
/*
CON-123: "In case the CONCAT code is used, the following characters are only
allowed: Capital Latin letters, Numbers, #. It should be a string of exactly
20 characters where first two characters are letters, the next 8 characters
are numbers and the remaining characters are letters or #, where 11th and
16th character are letters.
In case national identification number or passport number is used, the
following characters are only allowed: capital Latin letters (A-Z), numbers
(0-9) as well as '+' and '-' in case the identifier starts with "FI" and "-"
when the identifier starts with "LV". It can be a string of 3 to 35
characters, where first two characters are letters."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0123', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0160
/*
Pokud není v poli TRAF20_21.FIM0021 vyplněn Dummy LEI 123456DUMMY000000000
pak:
CON-160: "If LEI is used, this field shall be populated with a LEI
accurately formatted and in the LEI database included in the GLEIF database
maintained by the Central Operating Unit.
1. The status of the LEI shall be 'Issued', 'Lapsed', 'Pending
transfer' or 'Pending archival'.
2. The InitialRegistrationDate of the LEI shall be equal or before the
trading date.
3. The EntityStatus shall be Active or if the EntityStatus is Inactive, the
LastUpdateDate shall be equal or after the trading date."
\#include
*/
begin :1:=replace(replace(replace(
        m.gke('MKT20180103', 'TRAFIM10', '110', '0160', '00')
      , 'TRAF10', 'TRAF20'), 'traf10', 'traf20')
  , 'r23.FIM0021 is not null'
  , 'r23.FIM0021 is not null and r23.FIM0021!=m.DV_LEI');
end;

MKT20180103 TRAFIM20 110 0161
/*
CON-161: "If national identifier is used, the first 2 characters of the
national identification code should be an ISO 3166 country code that was
valid at the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0161', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0162
/*
CON-162: "If MIC code is used, it should be a valid ISO 10383 MIC code
indicating a trading venue that was active at the trading date, excluding
special MIC codes 'XXXX' and 'XOFF'."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0162', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0163
/*
CON-163: "If the CONCAT code is used, the birthdate in the CONCAT code
should be the same as the birthdate populated in field 20."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0163', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0164
/*
CON-164: "In case the CONCAT code is used, the following characters are only
allowed: Capital Latin letters, Numbers, #. It should be a string of exactly
20 characters where first two characters are letters, the next 8 characters
are numbers and the remaining characters are letters or #, where 11th and
16th character are letters.
In case national identification number or passport number is used, the
following characters are only allowed: capital Latin letters (A-Z), numbers
(0-9) as well as '+' and '-' in case the identifier starts with "FI" and "-"
when the identifier starts with "LV". It can be a string of 3 to 35
characters, where first two characters are letters."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0164', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0170
/*
CON-170: "If populated, it should be an ISO 3166 country code that was valid
at the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0170', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0210
/*
CON-210: "If LEI is used, this field shall be populated with a LEI
accurately formatted and in the LEI database included in the GLEIF database
maintained by the Central Operating Unit.
1. The status of the LEI shall be 'Issued', 'Lapsed', 'Pending
transfer' or 'Pending archival'.
2. The InitialRegistrationDate of the LEI shall be equal or before the
trading date.
3. The EntityStatus shall be Active or if the EntityStatus is Inactive, the
LastUpdateDate shall be equal or after the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0210', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0211
/*
CON-211: "If national identifier is used, the first 2 characters of the
national identification code should be an ISO 3166 country code that was
valid at the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0211', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0212
/*
CON-212: "If the CONCAT code is used, the birthdate in the CONCAT code
should be the same as the birthdate populated in field 24."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0212', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0213
/*
CON-213: "In case the CONCAT code is used, the following characters are only
allowed: Capital Latin letters, Numbers, #. It should be a string of exactly
20 characters where first two characters are letters, the next 8 characters
are numbers and the remaining characters are letters or #, where 11th and
16th character are letters.
In case national identification number or passport number is used, the
following characters are only allowed: capital Latin letters (A-Z), numbers
(0-9) as well as '+' and '-' in case the identifier starts with "FI" and "-"
when the identifier starts with "LV". It can be a string of 3 to 35
characters, where first two characters are letters."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0213', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0251
/*
CON-251: "When the executing entity is dealing on its own account or matched
principal basis (value 'DEAL' or 'MTCH' populated in field 29) this field
must be populated with 'false'."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0251', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0260
/*
CON-260: "This field shall be populated with a LEI accurately formatted and
in the LEI database included in the GLEIF database maintained by the Central
Operating Unit.
1. The status of the LEI shall be 'Issued', 'Lapsed', 'Pending
transfer' or 'Pending archival'.
2. The InitialRegistrationDate of the LEI shall be equal or before the
trading date.
3. The EntityStatus shall be Active or if the EntityStatus is Inactive, the
LastUpdateDate shall be equal or after the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0260', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0270
/*
CON-270: "This field shall be populated with a LEI accurately formatted and
in the LEI database included in the GLEIF database maintained by the Central
Operating Unit.
1. The status of the LEI shall be 'Issued', 'Lapsed', 'Pending
transfer' or 'Pending archival'.
2. The InitialRegistrationDate of the LEI shall be equal or before the
trading date.
3. The EntityStatus shall be Active or if the EntityStatus is Inactive, the
LastUpdateDate shall be equal or after the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0270', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0280
/*
CON-280: "Trading date time must be the same or before the system date
time."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0280', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0281
/*
CON-281: "Trading date cannot be earlier than the agreed date of the first
trading date to be reported under MiFIR or earlier than 5 years before the
current date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0281', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0290
/*
CON-290: "When using 'DEAL' Buyer Identification or Seller Identification or
both of them should be identical with the executing entity identification
code."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0290', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0310
/*
CON-310: "A valid ISO 4217 currency code that was active at the trading date
or is a pre-EURO currency should be populated.
The following special currency codes are not allowed: XAG, XAU, XBA, XBB,
XBC, XBD, XDR, XEU, XFU, XPD, XPT, XXX."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0310', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0340
/*
CON-340: "A valid ISO 4217 currency code that was active at the trading date
should be populated.
The following special currency codes are not allowed: XAG, XAU, XBA, XBB,
XBC, XBD, XDR, XEU, XFU, XPD, XPT, XXX. "
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0340', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0360
/*
CON-360: "The reported code should be a valid ISO 10383 MIC code that was
active at the trading date"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0360', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0370
/*
CON-370: "This field is mandatory where: Field 36 is an EEA trading venue or
trading platform outside the Union"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0370', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0371
/*
CON-371: "If populated, it should be an ISO 3166 country code that was valid
at the trading date"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0371', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0390
/*
CON-390: "A valid ISO 4217 currency code that was active at the trading date
should be populated.
The following special currency codes are not allowed: XAG, XAU, XBA, XBB,
XBC, XBD, XDR, XEU, XFU, XPD, XPT, XXX."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0390', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0410
/*
Pokud není v poli TRAF20_11.FIM0065 nebo TRAF20_11.FIM0066 vyplněna DUMMY
hodnota ISIN: DUMMY0000000 pak:
CON-410: "The check digit of the ISIN code should be valid according to the
algorithm of ISIN validation, as defined in the ISO 6166:2013 standard,
Annex C Formula for computing the modulus 10 double-add-double" check
digit."
\#include
*/
declare e mk.e%type:=m.gke('MKT20180103', 'TRAFIM10', '110', '0410', '00');
begin
  e:=replace(e, 'TRAF10', 'TRAF20');
  e:=replace(e, 'traf10', 'traf20');
  :1:=replace(e, 'FIM0065||FIM0066 is not null'
  , 'FIM0065||FIM0066 is not null and FIM0065||FIM0066!=m.DV_ISIN');
end;

MKT20180103 TRAFIM20 110 0570
/*
CON-570: "Field must be always populated where the entity deals on own
account (i.e. value 'DEAL' populated in field 29) and the firm does not act
as a receiving firm (fields 26 or 27 are not populated)."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0570', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0571
/*
CON-571: "Field should not be populated in reports where the transmitting
firm identification code is not populated for the buyer or seller (fields 26
and 27) and the firm deals on a matched principal capacity (i.e. value
'MTCH' populated in field 29) or an any other capacity (i.e. value 'AOTC'
populated in field 29) unless the decision maker field is populated with the
LEI of the executing entity."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0571', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0572
/*
CON-572: "Investment decision identifier should not be populated in reports
where the firm deals on a matched principal capacity (i.e. value 'MTCH'
populated in field 29) or an any other capacity (i.e. value 'AOTC' populated
in field 29) and the transmitting firm identification code is populated for
the buyer and/or seller unless the decision maker field is populated with
the LEI of the transmitting firm."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0572', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0573
/*
CON-573: "If national identifier is used, the first 2 characters of the
national identification code should be an ISO 3166 country code that was
valid at the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0573', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0574
/*
CON-574: "In case the CONCAT code is used, the following characters are only
allowed: Capital Latin letters, Numbers, #. It should be a string of exactly
20 characters where first two characters are letters, the next 8 characters
are numbers and the remaining characters are letters or #, where 11th and
16th character are letters.
In case national identification number or passport number is used, the
following characters are only allowed: capital Latin letters (A-Z), numbers
(0-9) as well as '+' and '-' in case the identifier starts with "FI" and "-"
when the identifier starts with "LV". It can be a string of 3 to 35
characters, where first two characters are letters."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0574', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0580
/*
CON-580: "If populated, it should be an ISO 3166 country code that was valid
at the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0580', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0590
/*
CON-590: "If national identifier is used, the first 2 characters of the
national identification code should be an ISO 3166 country code that was
valid at the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0590', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0591
/*
CON-591: "In case the CONCAT code is used, the following characters are only
allowed: Capital Latin letters, Numbers, #. It should be a string of exactly
20 characters where first two characters are letters, the next 8 characters
are numbers and the remaining characters are letters or #, where 11th and
16th character are letters.
In case national identification number or passport number is used, the
following characters are only allowed: capital Latin letters (A-Z), numbers
(0-9) as well as '+' and '-' in case the identifier starts with "FI" and "-"
when the identifier starts with "LV". It can be a string of 3 to 35
characters, where first two characters are letters."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0591', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 110 0600
/*
CON-600: "If populated, it should be an ISO 3166 country code that was valid
at the trading date."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '110', '0600', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 120 0030
/*
CON-030: "This field must not be populated where field 36 is populated with
a non-EEA Trading Venue or 'XXXX' or 'XOFF'. "
The first item of the Set 2.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '120', '0030', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 120 0610
/*
CON-610: "This field should NOT be populated where:
1. Field 36 is 'XOFF', 'XXXX' or a non-EEA venue"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '120', '0610', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 130 0411
/*
Pokud není v poli TRAF20_11.FIM0065 vyplněna DUMMY hodnota ISIN:
DUMMY0000000 pak:
CON-411: "The instrument should be present in reference data for the trading
date for the following transactions:
1. The transaction is executed on a trading venue within EEA (MIC code in
field 36 belongs to a trading venue within the EEA);
2. The transaction is an OTC transaction in instrument admitted to trading
(field 36 populated with 'XOFF') and field 47 and 48 are not populated;
3. The transaction is executed on a SI or an organised trading platform
outside EEA and field 47 and 48 are not populated.
In the case of transactions on EEA venues (point 1 above), the instrument
should be valid on the particular trading venue where the transaction was
executed. In the case of the other transactions (point 2 and 3), the
instrument should be valid on any (at least one) EEA trading venue or SI.
If no more than 7 days has passed after the transaction submission (i.e. it
is the 7th day or before) the transaction shall be pending."
The first item of the Set 3.
Part 1 of 2. Fragment 1 of 2.
\#include
*/
begin :1:=replace(replace(replace(replace(
          m.gke('MKT20180103', 'TRAFIM10', '130', '0411', '00')
        , 'TRAF10', 'TRAF20'), 'traf10', 'traf20'), 'fim0041<rd', '0=0')
      , 'FIM0065 is not null'
      , 'FIM0065 is not null and FIM0065!=m.DV_ISIN');
end;

MKT20180103 TRAFIM20 130 0411
/*
CON-411: Part 2 of 2.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '130', '0411', '01')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 130 0412
/*
Pokud není v poli TRAF20_11.FIM0065 vyplněna DUMMY hodnota ISIN:
DUMMY0000000 pak:
CON-412: "The instrument should be present in reference data for the trading
date for the following transactions:
1. The transaction is executed on a trading venue within EEA (MIC code in
field 36 belongs to a trading venue within the EEA);
2. The transaction is an OTC transaction in instrument admitted to trading
(field 36 populated with 'XOFF') and field 47 and 48 are not populated;
3. The transaction is executed on a SI or an organised trading platform
outside EEA and field 47 and 48 are not populated.
In the case of transactions on EEA venues (point 1 above), the instrument
should be valid on the particular trading venue where the transaction was
executed. In the case of the other transactions (point 2 and 3), the
instrument should be valid on any (at least one) EEA trading venue or SI.
If at least 7 days has passed after the transaction submission (i.e. it is
the 8th day after the submission) the transaction shall be rejected."
Fragment 2 of 2.
*/

MKT20180103 TRAFIM20 140 0331
/*
CON-331: "In case the CFI code is available in the instrument reference data
(transaction in an instruments admitted to trading):
For debt instruments, i.e. where CFI of the instrument in the reference data
is D*****, where the quantity is reported in unit terms, the reported price
shall not be in percentage terms. "
The first item of the Set 4.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '140', '0331', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 140 0351
/*
CON-351: "In case the CFI code is available in the instrument reference data
(transaction in an instruments admitted to trading):
The field is mandatory for debt instruments, i.e. CFI of the instrument in
the reference data is DB**** (Bonds)"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '140', '0351', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 140 0381
/*
CON-381: "In case the CFI code is available in the instrument reference data
(transaction in an instruments admitted to trading):
Field is mandatory where the CFI of the instrument in the reference data is
SC**** (CDS)"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '140', '0381', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 140 0640
/*
CON-640: "Field is mandatory for commodity derivative transaction where the
instrument reported in field 41 is classified in instrument reference data
as commodity derivative (i.e. field 4 in instrument reference data is
populated with 'true')."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '140', '0640', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 150 0470
/*
CON-470: "The check digit of the ISIN code should be valid according to the
algorithm of ISIN validation, as defined in the ISO 6166:2013 standard,
Annex C Formula for computing the modulus 10 double-add-double check digit."
The first item of the Set 5.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '150', '0470', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 150 0473
/*
CON-473: "For swap transactions one or two underlying instruments should be
reported with the direction indication (+/-)."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '150', '0473', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 160 0361
/*
CON-361: "If the instrument reported in field 41 is present in reference
data, 'XXXX' cannot be reported in field 36."
The first item of the Set 6.
*/
declare
  k_UNKN mk.ii%type:=0; -- unknown
begin
  \i
  \s
    \k
  , 'The reported MIC code is incorrect'
  , \aTRAF20_11
  , h.ii
  from
    rtraf20_11 r
  , rtraf20_11h h
  , \e x
  , eim
  where r.ii=h.r_
  and h.mi_=\u
  and h.ii=x.h_
  and x.mk_=k_UNKN
  and FIM0058='XXXX'
  and nvl(FIM0065, FIM0066)=eim.id
  and to_date(substr(FIM0041, 1, 10), s.FMT_ISODATE) between eim.vf
    and eim.vt;
  :1:=sql%rowcount;
end;

MKT20180103 TRAFIM20 160 0471
/*
CON-471: Part 2 of 2.
\#include
*/
begin :1:=replace(replace(replace(
        m.gke('MKT20180103', 'TRAFIM10', '160', '0471', '01')
      , 'TRAF10', 'TRAF20'), 'traf10', 'traf20'), 'fim0041<rd', '0=0');
end;

MKT20180103 TRAFIM20 160 0471
/*
CON-471:
"The underlying instrument should be present in reference data for the
trading date for the following transactions:
1. The transaction is an OTC transaction:
a) field 36 is populated with 'XXXX'; and b) the underlying instrument is
not an index;
2. The transaction was executed on a non-EEA organised trading platform:
a) field 36 is populated with a non-EEA MIC code or 'XOFF'; and b) the
instrument (field 41) is not populated or populated with an instrument that
is not present in the reference data; and
c) the underlying instrument is not an index;
In the case of baskets, if more than one basket constituent is populated,
all of them should be present in the instrument reference data.
Where the submitting entity populates not only the reportable components but
also non-reportable ones, the report is pended and, after the 7 calendar
days, rejected (unless the non-reportable components become reportable
within that 7 calendar day period).
If no more than 7 days has passed after the transaction submission (i.e. it
is the 7th day or before) the transaction shall be pending."
Part 1 of 2.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '160', '0471', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 160 0472
/*
CON-472: "
The underlying instrument should be present in reference data for the
trading date for the following transactions:
1. The transaction is an OTC transaction:
a) field 36 is populated with 'XXXX'; and
b) the underlying instrument is not an index;
2. The transaction was executed on a non-EEA organised trading platform:
a) field 36 is populated with a non-EEA MIC code or 'XOFF'; and
b) the instrument (field 41) is not populated or populated with an
instrument that is not present in the reference data; and
c) the underlying instrument is not an index;
In the case of baskets, if more than one basket constituent is populated,
all of them should be present in the instrument reference data.
Where the submitting entity populates not only the reportable components but
also non-reportable ones, the report is pended and, after the 7 calendar
days, rejected (unless the non-reportable components become reportable
within that 7 calendar day period).
If at least 7 days has passed after the transaction submission (i.e. it is
the 8th day after the submission) the transaction shall be rejected."
*/

MKT20180103 TRAFIM20 170 0440
/*
CON-440: "A valid ISO 4217 currency code that was active at the trading date
or is a pre-EURO currency should be populated.
The following special currency codes are not allowed: XAG, XAU, XBA, XBB,
XBC, XBD, XDR, XEU, XFU, XPD, XPT, XXX."
The first item of the Set 7.
\#include
*/
begin :1:=replace(replace(replace(
        m.gke('MKT20180103', 'TRAFIM10', '170', '0440', '00')
      , 'TRAF10', 'TRAF20'), 'traf10', 'traf20')
  , 'begin', 'begin
  declare
    e varchar2(32767 byte); -- expression
    skr stp.id%type:=''__\e.440.skr''; -- save check result
                                       -- after check No. 472
  begin
    if s.pg(skr, s.GC_NO) is null then s.ps(skr, ''0'');
      select xt into e from me
      where id=''m.save-check-results-T10-general'';
      e:=replace(e, chr(92)||''C0'', ''true'');
      e:=replace(e, chr(92)||''K'', ''\K'');
      e:=replace(e, chr(92)||''S'', ''RJCT'');
      e:=replace(e, chr(92)||''a'', ''\aTRAF20_11'');
      e:=replace(e, chr(92)||''e'', ''\e'');
      e:=replace(e, chr(92)||''t'', ''rtraf20_11'');
      e:=replace(e, chr(92)||''x'', null);
      s.uei(e); commit; end if;
    s.pd(skr);
  end;
');
end;

MKT20180103 TRAFIM20 170 0450
/*
CON-450: "Field can be only populated when field 44 was also populated."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '170', '0450', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 170 0451
/*
CON-451: "A valid ISO 4217 currency code that was active at the trading date
or is a pre-EURO currency should be populated.
The following special currency codes are not allowed: XAG, XAU, XBA, XBB,
XBC, XBD, XDR, XEU, XFU, XPD, XPT, XXX."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '170', '0451', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 170 0520
/*
CON-520: "A valid ISO 4217 currency code that was active at the trading date
should be populated.
The following special currency codes are not allowed: XAG, XAU, XBA, XBB,
XBC, XBD, XDR, XEU, XFU, XPD, XPT, XXX."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '170', '0520', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 170 0541
/*
CON-541: "The maturity date should be equal or later than the trading day
(field 28)."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '170', '0541', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 170 0552
/*
CON-552: "The expiry date should be equal or later than the trading day
(field 28)."
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '170', '0552', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0330
/*
CON-330: "In case the CFI code is reported in field 43 (transaction in a
financial instrument that is not admitted to trading):
For debt instruments, i.e. CFI reported in field 43 is D*****, where the
quantity is reported in unit terms, the reported price shall not be in
percentage terms. "
The first item of the Set 8.
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0330', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0350
/*
CON-350: "In case the CFI code is reported in field 43 (transaction in a
financial instrument that is not admitted to trading):
The field is mandatory for debt instruments, i.e. CFI reported in field 43
is DB**** (Bonds)"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0350', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0380
/*
CON-380: "In case the CFI code is reported in field 43 (transaction in a
derivative instrument that is not admitted to trading):
Field is mandatory where the CFI reported in field 43 is SC**** (CDS)"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0380', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0441
/*
CON-441: "Field is mandatory where Field 43 is populated with:
1. Other instruments with the following CFI attributes: O*****, S*****,
C*****, R*****, F*****, E*****, D*****, H*****, J*****"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0441', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0481
/*
CON-481: "This field should not be populated where field 43 is populated
with:
1. Debt instruments with the following CFI attributes: DB****, DT****,
DY****
2. Other instruments with the following CFI attributes: E*****"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0481', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0500
/*
CON-500: "Field is mandatory where field 43 is populated with:
1. Options with the following CFI attributes: O***** or H*****
2. Warrants with the following CFI attributes: RW****"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0500', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0501
/*
CON-501: "This field should not be populated where field 43 is populated
with:
1. Instruments with the following CFI attributes: F*****, S*****, E*****,
C*****, D*****, J*****"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0501', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0510
/*
CON-510: "Field is mandatory where field 43 is populated with:
1. Options with the following CFI attributes: O***** or H*****
2. Warrants with the following CFI attributes: RW****"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0510', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0511
/*
CON-511: "This field should not be populated where field 43 is populated
with:
1. Instruments with the following CFI attributes: F*****, S*****, E*****,
C*****, D*****, J*****"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0511', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0530
/*
CON-530: "Field is mandatory where field 43 is populated with:
1. Options with the following CFI attributes: O***** or H*****
2. Warrants with the following CFI attributes: RW****"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0530', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0531
/*
CON-531: "This field should not be populated where field 43 is populated
with:
1. Instruments with the following CFI attributes: F*****, S*****, E*****,
C*****, D*****, J*****"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0531', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0540
/*
CON-540: "This field is mandatory where field 43 is populated with
1. D*****"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0540', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0542
/*
CON-542: "This field should not be populated where field 43 is populated
with:
1. Instruments with the following CFI attributes: R*****, O*****, F*****,
S*****, E*****, C*****, H*****, J*****"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0542', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 180 0551
/*
CON-551: "This field is should not be populated where field 43 is populated
with:
1. Instruments with the following CFI attributes: E*****, C*****, D*****"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '180', '0551', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM20 190 0012
/*
Stavová kontrola - ESMA stav "Accepted"
\#include
*/
begin :1:=replace(replace(
      m.gke('MKT20180103', 'TRAFIM10', '190', '0012', '00')
    , 'TRAF10', 'TRAF20'), 'traf10', 'traf20');
end;

MKT20180103 TRAFIM30 000 0101
/*
Pro záznam hlášený jako nový (TRAF30_11.P0570 = NEWO) se údaj Přijetí pokynu
- datum (TRAF30_11.FIM0240) musí shodovat s výskytovým parametrem Stav ke
dni (TRAFIM30.P0053).
*/
declare
  P0053 mo.id%type;
begin
  select id into P0053 from mo where ii=\o;
  if P0053 between to_date('2018-11-09', s.FMT_ISODATE)
  and to_date('2018-11-12', s.FMT_ISODATE) then :1:=0; return; end if;
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where P0570='NEWO'
  and FIM0240!=P0053
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0102
/*
Musí být vyplněn právě jeden z údajů Identifikační kód zadavatele (právnické
osoby) nebo Identifikační kód zadavatele (fyzické osoby). V případě
zadavatele - PO musí být vyplněn alespoň jeden z údajů (TRAF30_11.FIM0247,
TRAF30_11.FIM0421); v případě zadavatele - FO musí být vyplněn údaj
(TRAF30_11.FIM0248) spolu s právě jedním z údajů (TRAF30_11.FIM0249,
TRAF30_11.FIM0250).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where nvl2(FIM0247||FIM0421, 1, 0)+nvl2(FIM0248, 1, 0)!=1
  or (
    FIM0248 is not null
    and nvl2(FIM0249, 1, 0)=nvl2(FIM0250, 1, 0)
  ) \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0104
/*
Musí být vyplněn právě jeden z údajů Identifikační kód zákazníka (právnické
osoby), Identifikační kód zákazníka (fyzické osoby) nebo údaj o obchodu na
souhrnný účet. V případě zákazníka - PO musí být vyplněn alespoň jeden z
údajů (TRAF30_11.FIM0303, TRAF30_11.FIM0422); v případě zákazníka - FO musí
být vyplněn údaj (TRAF30_11.FIM0304) spolu s právě jedním z údajů
(TRAF30_11.FIM0305, TRAF30_11.FIM0306; pro obchod na souhrnný účet musí být
vyplněn údaj (TRAF30_11.FIM0252).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where
    nvl2(FIM0303||FIM0422, 1, 0)+nvl2(FIM0304, 1, 0)+nvl2(FIM0252, 1, 0)!=1
  or (
    FIM0304 is not null
    and nvl2(FIM0305, 1, 0)=nvl2(FIM0306, 1, 0)
  ) \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0109
/*
Musí být vyplněn právě jeden z údajů Identifikační kód požadované
protistrany (právnické osoby) nebo Identifikační kód požadované protistrany
(fyzické osoby) anebo žádný. Je-li údaj Identifikační kód požadované
protistrany vyplněný, potom musí být vyplněný následujícím způsobem: pro PO
musí být vyplněn alespoň jeden z údajů (TRAF30_11.FIM0264,
TRAF30_11.FIM0423); pro FO musí být vyplněn údaj (TRAF30_11.FIM0266) spolu s
právě jedním z údajů (TRAF30_11.FIM0267, TRAF30_11.FIM0268; pro obchodní
systém musí být vyplněn údaj (TRAF30_11.FIM0265).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where
    nvl2(FIM0264||FIM0423, 1, 0)+nvl2(FIM0266, 1, 0)+nvl2(FIM0265, 1, 0)>1
  or (
    FIM0266 is not null
    and nvl2(FIM0267, 1, 0)=nvl2(FIM0268, 1, 0)
  ) \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0113
/*
Je-li Typ vztahu (TRAF30_11.FIM0301 = 04), potom musí být vyplněn právě
jeden z údajů Identifikační kód osoby přijímající pokyn v rámci podniku
(TRAF30_11.FIM0281, TRAF30_11.FIM0417). Je-li vyplněn (TRAF30_11.FIM0281),
pak musí být vyplněn také právě jeden z údajů (TRAF30_11.FIM0282,
TRAF30_11.FIM0283); jinak tyto dva údaje musí být prázdné.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where FIM0301='04'
  and (
    nvl2(FIM0281, 1, 0)=nvl2(FIM0417, 1, 0)
    or (
      FIM0281 is not null
      and nvl2(FIM0282, 1, 0)=nvl2(FIM0283, 1, 0)
    ) or (
      FIM0417 is not null
      and nvl2(FIM0282, 1, 0)+nvl2(FIM0283, 1, 0)>0
    )
  ) \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0114
/*
Musí být vyplněn právě jeden z údajů Identifikační kód osoby odpovědné za
provedení pokynu v rámci podniku (TRAF30_11.FIM0284, TRAF30_11.FIM0418).
Je-li vyplněn (TRAF30_11.FIM0284), pak musí být vyplněn také právě jeden z
údajů (TRAF30_11.FIM0285, TRAF30_11.FIM0286); jinak tyto dva údaje musí být
prázdné.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where nvl2(FIM0284, 1, 0)=nvl2(FIM0418, 1, 0)
  or (
    FIM0284 is not null
    and nvl2(FIM0285, 1, 0)=nvl2(FIM0286, 1, 0)
  ) or (
    FIM0418 is not null
    and nvl2(FIM0285, 1, 0)+nvl2(FIM0286, 1, 0)>0
  ) \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0115
/*
Je-li Typ vztahu (TRAF30_11.FIM0301 = 08|10), potom musí být vyplněn údaj
Identifikační kód osoby činící investiční rozhodnutí v rámci podniku
(TRAF30_11.FIM0313) spolu s právě jedním z údajů (TRAF30_11.FIM0314,
TRAF30_11.FIM0315); jinak tyto údaje musí být prázdné.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where (
    regexp_instr(FIM0301, '^(08|10)$')=1
    and FIM0313 is null
  ) or (
    FIM0313 is not null
    and nvl2(FIM0314, 1, 0)=nvl2(FIM0315, 1, 0)
  ) or (
    regexp_instr(FIM0301, '^(08|10)$')=0
    and nvl2(FIM0313||FIM0314||FIM0315, 1, 0)>0
  ) \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0118
/*
Odpovídá-li hodnota údaje Identifikace trhu, kterému byla objednávka předána
(TRAF30_31.FIM0294) českému obchodnímu systému, potom musí být údaj
Identifikační kód objednávky v obchodním systému (TRAF30_31.FIM0293)
vyplněný.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||',T0021.'||T0021||')'
  , \aTRAF30_31
  , T0019+T0021*power(10, m.SZ_T0019)
  from
    \tTRAF30_31
  , em
  where FIM0294=em.id
  and em.y='CZ'
  and FIM0293 is null
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0201
/*
Hodnota údaje Pořadí (TRAF30_11.T0019) musí být unikátní v rámci DO
TRAF30_11 a výskytu. Hodnota údaje Pořadí (TRAF30_21.T0019) musí být
unikátní v rámci DO TRAF30_21 a výskytu. Hodnota údaje Pořadí
(TRAF30_21.T0019) musí být unikátní v rámci DO TRAF30_21 a výskytu.
Kombinace hodnota údajů Pořadí a Pořadí v rámci DO (TRAF30_31.T0019 a
TRAF30_31.T0021) musí být unikátní v rámci DO TRAF30_31 a výskytu.
Kombinace hodnota údajů Pořadí a Pořadí v rámci DO (TRAF30_32.T0019 a
TRAF30_32.T0021) musí být unikátní v rámci DO TRAF30_32 a výskytu.
*/
declare
  ec stp.id%type:='__\e.201.ec'; -- error count
  sn stp.id%type:='__\e.201.sn'; -- step No
begin
  if s.pg(sn, s.GC_NO) is null then
    \i
    \s
      \k
    , '(T0019.'||T0019||')'
    , \aTRAF30_11
    , T0019
    from (select T0019 from \tTRAF30_11 group by T0019 having count(*)>1)
    \f; s.ps(ec, sql%rowcount); s.ps(sn, '0'); commit; end if;
  if s.pg(sn)='0' and s.pg(ec)<\F then
    \i
    \s
      \k
    , '(T0019.'||T0019||')'
    , \aTRAF30_21
    , T0019
    from (select T0019 from \tTRAF30_21 group by T0019 having count(*)>1)
    \f; s.ps(ec, sql%rowcount+s.pg(ec)); s.ps(sn, '1'); commit; end if;
  if s.pg(sn)='1' and s.pg(ec)<\F then
    \i
    \s
      \k
    , '(T0019.'||T0019||',T0021.'||T0021||')'
    , \aTRAF30_31
    , T0019+T0021*power(10, m.SZ_T0019)
    from (
        select
          T0019
        , T0021
        from \tTRAF30_31
        group by
          T0019
        , T0021
        having count(*)>1
      )
    \f; s.ps(ec, sql%rowcount+s.pg(ec)); s.ps(sn, '2'); commit; end if;
  if s.pg(sn)='2' and s.pg(ec)<\F then
    \i
    \s
      \k
    , '(T0019.'||T0019||',T0021.'||T0021||')'
    , \aTRAF30_32
    , T0019+T0021*power(10, m.SZ_T0019)
    from (
        select
          T0019
        , T0021
        from \tTRAF30_32
        group by
          T0019
        , T0021
        having count(*)>1
      )
      \f; s.ps(ec, sql%rowcount+s.pg(ec)); s.ps(sn, '3'); commit; end if;
  :1:=s.pg(ec); s.pd(ec); s.pd(sn);
  /* commit/rollback will be executed by caller */
end;

MKT20180103 TRAFIM30 000 0202
/*
Záznam hlášený jako nový (TRAF30_11.P0570 = NEWO) nesmí být již dříve
nahlášen. Kontroluje se množina hodnot údajů Identifikační kód pokynu
(TRAF30_11.R0014) a Identifikace subjektu, který pokyn přijal
(TRAF30_11.R0015). V případě zasílání Opravy na platný výskyt je nutné
zachovat všechny záznamy (TRAF30_11.P0570 = NEWO), které jsou již odkazovány
z (TRAF30_11.R0014, TRAF30_11.R0015, TRAF30_11.P0570 = AMNDO|CORRO). Odkazy
jsou možné z libovolného výskytu.
*/
declare
  ec stp.id%type:='__\e.202.ec'; -- error count
  sn stp.id%type:='__\e.202.sn'; -- step No
begin
--                                                             /duplicates/
  if s.pg(sn, s.GC_NO) is null then
    \i
    \s
      \k
    , '(T0019.'||T0019||')'
    , \aTRAF30_11
    , T0019
    from \tTRAF30_11
    where (R0014, R0015) in
      (
        select * from (
  select
    R0014
  , R0015
  from
    rtraf30_11h h
  , rtraf30_11 r
  , mi
  , mo
  , md
  where h.r_=r.ii
  and r.P0570='NEWO'
  and h.mi_=mi.ii
  and mi.mis_=m.IS_CURRENT
  and mi.mo_=mo.ii
  and mo.mp_=\p
  and mo.md_=md.ii
  and md.id='TRAFIM30'
  and mo.ii!=\o
  union all
  select
    R0014
  , R0015
  from \tTRAF30_11
  where P0570='NEWO'
          )
        group by
          R0014
        , R0015
        having count(*)>1
      )
    and P0570='NEWO'
    \f; s.ps(ec, sql%rowcount); s.ps(sn, '0'); commit; end if;
--                                                        /lost references/
  if s.pg(sn)='0' and s.pg(ec)<\F then
    \i
    \s
      \k
    , '(R0014.'||R0014||',R0015.'||R0015||')'
    , \aTRAF30_11
    , -1 -- unsaveable - no reference in h.mi_
    from
      (
        select
          nr.R0014
        , nr.R0015
        from
          rtraf30_11h nh
        , rtraf30_11 nr
        , rtraf30_11h ah
        , rtraf30_11 ar
        , mi
        , mo
        , md
        , (
            select * from mi where mo_=\o
            and mis_=m.IS_CURRENT
          ) u
        where nh.mi_=u.ii
        and nh.r_=nr.ii
        and nr.P0570='NEWO'
        and ah.r_=ar.ii
        and ar.P0570 in ('AMNDO', 'CORRO')
        and ah.mi_=mi.ii
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='TRAFIM30'
        and mo.ii!=\o
        and nr.R0014=ar.R0014
        and nr.R0015=ar.R0015
        minus
        select
          R0014
        , R0015
        from \tTRAF30_11
        where P0570='NEWO'
      )
    \f; s.ps(ec, sql%rowcount+s.pg(ec)); s.ps(sn, '1'); commit; end if;
  :1:=s.pg(ec); s.pd(ec); s.pd(sn);
  /* commit/rollback will be executed by caller */
end;

MKT20180103 TRAFIM30 000 0203
/*
Záznam hlášený jako změna (TRAF30_11.P0570 = AMNDO|CORRO) musí být již dříve
nahlášen jako nový a zároveň nesmí být již dříve zrušený. Kontroluje se
množina hodnot údajů (TRAF30_11.R0014, TRAF30_11.R0015). Dále se musí
shodovat hodnoty údajů Přijetí pokynu - datum (TRAF30_11.FIM0240) a Přijetí
pokynu - čas (TRAF30_11.FIM0241) v záznamu hlášeném jako změna s hodnotami
údajů Přijetí pokynu - datum (TRAF30_11.FIM0240) a Přijetí pokynu - čas
(TRAF30_11.FIM0241) v dříve nahlášeném záznamu.
*/
declare
  ec stp.id%type:='__\e.203.ec'; -- error count
  sn stp.id%type:='__\e.203.sn'; -- step No
begin
--                                                         /NEWO not found/
  if s.pg(sn, s.GC_NO) is null then
    \i
    \s
      \k
    , '(T0019.'||T0019||')'
    , \aTRAF30_11
    , T0019
    from
      \tTRAF30_11 a
    , (
        select
          R0014
        , R0015
        , FIM0240
        , FIM0241
        from \tTRAF30_11 where P0570 in ('AMNDO', 'CORRO')
        minus
        select
          R0014
        , R0015
        , FIM0240
        , FIM0241
        from \tTRAF30_11 where P0570='NEWO'
        minus
        select
          R0014
        , R0015
        , FIM0240
        , FIM0241
        from
          rtraf30_11h h
        , rtraf30_11 r
        , mi
        , mo
        , md
        where h.mi_=mi.ii
        and h.r_=r.ii
        and r.P0570='NEWO'
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='TRAFIM30'
        and mo.ii!=\o
      ) n
    where a.P0570 in ('AMNDO', 'CORRO')
    and n.R0014=a.R0014
    and n.R0015=a.R0015
    and n.FIM0240=a.FIM0240
    and n.FIM0241=a.FIM0241
    \f; s.ps(ec, sql%rowcount); s.ps(sn, '0'); commit; end if;
--                                          /AMNDO|CORRO invalid timestamp/
  if s.pg(sn)='0' and s.pg(ec)<\F then
    \i
    \s
      \k
    , '(T0019.'||T0019||')'
    , \aTRAF30_11
    , T0019
    from (
        select
          a.T0019
        from
          \tTRAF30_11 a
        , (
            select
              R0014
            , R0015
            , FIM0290
            , FIM0291
            from \tTRAF30_21
            where FIM0290 is not null
            and FIM0291 is not null
            union all
            select
              R0014
            , R0015
            , FIM0290
            , FIM0291
            from
              rtraf30_21h h
            , rtraf30_21 r
            , mi
            , mo
            , md
            where h.mi_=mi.ii
            and h.r_=r.ii
            and mi.mis_=m.IS_CURRENT
            and mi.mo_=mo.ii
            and mo.mp_=\p
            and mo.md_=md.ii
            and md.id='TRAFIM30'
            and mo.ii!=\o
            and r.FIM0290 is not null
            and r.FIM0291 is not null
          ) c
        where a.P0570 in ('AMNDO', 'CORRO')
        and a.R0014=c.R0014
        and a.R0015=c.R0015
        and
          to_timestamp(to_char(a.FIM0240, s.FMT_ISODATE)||'+'||a.FIM0241
          , s.FMT_ISOSTAMP)>
          to_timestamp(to_char(c.FIM0290, s.FMT_ISODATE)||'+'||c.FIM0291
          , s.FMT_ISOSTAMP)
        minus select T0021_T0019 from \e where mk_=\k
      )
    \f; s.ps(ec, sql%rowcount+s.pg(ec)); s.ps(sn, '1'); commit; end if;
  :1:=s.pg(ec); s.pd(ec); s.pd(sn);
  /* commit/rollback will be executed by caller */
end;

MKT20180103 TRAFIM30 000 0204
/*
Je-li záznam hlášený jako změna (TRAF30_11.P0570 = AMNDO|CORRO), pak musí
být vyplněny údaje Přijetí změny pokynu - datum (TRAF30_11.FIM0242) a
Přijetí změny pokynu - čas (TRAF30_11.FIM0243) a tato množina hodnot údajů
(TRAF30_11.FIM0242, TRAF30_11.FIM0243) musí být unikátní pro všechny zaslané
změny týkající se jednoho pokynu - kontroluje se kombinace hodnot údajů
Identifikační kód pokynu (TRAF30_11.R0014) a Identifikace subjektu, který
pokyn přijal (TRAF30_11.R0015).

pokyn přijal (TRAF30_11.R0015). Je-li záznam hlášený jako nový
(TRAF30_11.P0570 = NEWO), pak musí být údaje (TRAF30_11.FIM0242,
TRAF30_11.FIM0243) prázdné.

pokyn přijal (TRAF30_11.R0015). Je-li záznam hlášený jako nový
(TRAF30_11.P0570 = NEWO), pak musí být údaje (TRAF30_11.FIM0242,
TRAF30_11.FIM0243) prázdné nebo se musí Přijetí změny pokynu - datum
(TRAF30_11.FIM0242) shodovat s výskytovým parametrem Stav ke dni
(TRAFIM30.P0053).

*/
declare
  P0053 mo.id%type;
begin
  select id into P0053 from mo where ii=\o;
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from (
--                                             /AMNDO|CORRO timestamp null/
      select T0019 from \tTRAF30_11
      where P0570 in ('AMNDO', 'CORRO')
      and (
        FIM0242 is null
        or FIM0243 is null
      ) union all
--                                        /AMNDO|CORRO timestamp duplicate/
      select a.T0019
      from
        \tTRAF30_11 a
      , rtraf30_11h h
      , rtraf30_11 r
      , mi
      , mo
      , md
      where h.mi_=mi.ii
      and h.r_=r.ii
      and r.P0570 in ('AMNDO', 'CORRO')
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM30'
      and mo.ii!=\o
      and a.R0014=r.R0014
      and a.R0015=r.R0015
      and a.FIM0242=r.FIM0242
      and a.FIM0243=r.FIM0243
      and a.P0570 in ('AMNDO', 'CORRO')
      union all
--                          /NEWO timestamp date is not equal to occurence/
      select T0019
      from \tTRAF30_11
      where P0570='NEWO'
      and FIM0242 is not null
      and FIM0242!=P0053
      union all
--                                        /NEWO timestamp time is not null/
      select T0019
      from \tTRAF30_11
      where P0570='NEWO'
      and FIM0242 is null
      and FIM0243 is not null
    ) \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0205
/*
Záznam hlášený jako rušený (v DO TRAF30_21) musí být již dříve nahlášen jako
nový (TRAF30_11.P0570 = NEWO) a zároveň nesmí být již dříve zrušený.
Kontroluje se množina hodnot údajů (TRAF30_11.R0014, TRAF30_11.R0015) v DO
TRAF30_11 a (TRAF30_21.R0014, TRAF30_21.R0015) v DO TRAF30_21. V případě
zasílání Opravy na platný výskyt je nutné zachovat všechny záznamy
(TRAF30_11.P0570 = NEWO), které jsou již odkazovány z (TRAF30_21.R0014,
TRAF30_21.R0015). Odkazy jsou možné z libovolného výskytu.
*/
declare
  ec stp.id%type:='__\e.205.ec'; -- error count
  sn stp.id%type:='__\e.205.sn'; -- step No
begin
--                                                         /NEWO not found/
  if s.pg(sn, s.GC_NO) is null then
    \i
    \s
      \k
    , '(T0019.'||T0019||')'
    , \aTRAF30_21
    , T0019
    from
      \tTRAF30_21 c
    , (
        select
          R0014
        , R0015
        from \tTRAF30_21
        minus
        select
          R0014
        , R0015
        from \tTRAF30_11 where P0570='NEWO'
        minus
        select
          R0014
        , R0015
        from
          rtraf30_11h h
        , rtraf30_11 r
        , mi
        , mo
        , md
        where h.mi_=mi.ii
        and h.r_=r.ii
        and r.P0570='NEWO'
        and mi.mis_=m.IS_CURRENT
        and mi.mo_=mo.ii
        and mo.mp_=\p
        and mo.md_=md.ii
        and md.id='TRAFIM30'
        and mo.ii!=\o
      ) n
    where n.R0014=c.R0014
    and n.R0015=c.R0015
    \f; s.ps(ec, sql%rowcount); s.ps(sn, '0'); commit; end if;
--                                                             /duplicates/
  if s.pg(sn)='0' and s.pg(ec)<\F then
    \i
    \s
      \k
    , '(T0019.'||T0019||')'
    , \aTRAF30_21
    , T0019
    from (
        select T0019
        from \tTRAF30_21
        where (R0014, R0015) in
(
  select * from (
      select
        R0014
      , R0015
      from
        rtraf30_21h h
      , rtraf30_21 r
      , mi
      , mo
      , md
      where h.r_=r.ii
      and h.mi_=mi.ii
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM30'
      and mo.ii!=\o
      union all
      select
        R0014
      , R0015
      from \tTRAF30_21
    )
  group by
    R0014
  , R0015
  having count(*)>1
)
        minus select T0021_T0019 from \e where mk_=\k
      )
    \f; s.ps(ec, sql%rowcount+s.pg(ec)); s.ps(sn, '1'); commit; end if;
  :1:=s.pg(ec); s.pd(ec); s.pd(sn);
  /* commit/rollback will be executed by caller */
end;

MKT20180103 TRAFIM30 000 0206
/*
Kombinace hodnot Identifikační kód pokynu (TRAF30_31.R0014) a Identifikace
subjektu, který pokyn přijal (TRAF30_31.R0015), která se vyskytuje v DO
TRAF30_31, se musí v rámci výskytu vyskytovat v DO TRAF30_11
(TRAF30_11.R0014 a TRAF30_11.R0015).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||',T0021.'||T0021||')'
  , \aTRAF30_31
  , T0019+T0021*power(10, m.SZ_T0019)
  from
    \tTRAF30_31 a
  , (
      select
        R0014
      , R0015
      from \tTRAF30_31
      minus
      select
        R0014
      , R0015
      from \tTRAF30_11
    ) x
  where a.R0014=x.R0014
  and a.R0015=x.R0015
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0207
/*
Kombinace hodnot Identifikační kód pokynu (TRAF30_32.R0014) a Identifikace
subjektu, který pokyn přijal (TRAF30_32.R0015), která se vyskytuje v DO
TRAF30_32, se musí v rámci výskytu vyskytovat v DO TRAF30_11
(TRAF30_11.R0014 a TRAF30_11.R0015).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||',T0021.'||T0021||')'
  , \aTRAF30_32
  , T0019+T0021*power(10, m.SZ_T0019)
  from
    \tTRAF30_32 a
  , (
      select
        R0014
      , R0015
      from \tTRAF30_32
      minus
      select
        R0014
      , R0015
      from \tTRAF30_11
    ) x
  where a.R0014=x.R0014
  and a.R0015=x.R0015
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0208
/*
Je-li ve výkazu TRAFIM30 Požadovaná protistrana identifikována pomocí MIC
kódu (TRAF30_11.FIM0265), pak tento kód musí být nalezen v seznamu
obchodních systémů.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where FIM0265 is not null
  and FIM0265 not in (select em.id from em)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0209
/*
Hodnota údaje Identifikace trhu, kterému byla objednávka předána
(TRAF30_31.FIM0294) musí být nalezena v seznamu obchodních systémů.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_31
  , T0019
  from \tTRAF30_31
  where nvl(FIM0294, '-') not in (select em.id from em)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0304
/*
Hodnota údaje Přijetí pokynu - datum (TRAF30_11.FIM0240) nesmí být z
budoucnosti.
*/
declare
  P0053 mo.id%type;
begin
  select id into P0053 from mo where ii=\o;
  if P0053 between to_date('2018-11-09', s.FMT_ISODATE)
  and to_date('2018-11-12', s.FMT_ISODATE) then :1:=0; return; end if;
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where FIM0240>P0053
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0310
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 <> 38|40|42) a pokud je záznam
hlášený jako změna (TRAF30_11.P0570 = AMNDO|CORRO), pak hodnota údaje
Přijetí změny pokynu - datum (TRAF30_11.FIM0242) musí být >= hodnotě údaje
Přijetí pokynu - datum (TRAF30_11.FIM0240) a zároveň je-li (
TRAF30_11.FIM0242 = TRAF30_11.FIM0240), pak hodnota údaje Přijetí změny
pokynu - čas (TRAF30_11.FIM0243) musí být >= hodnota údaje Přijetí pokynu -
čas (TRAF30_11.FIM0241).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where P0570 in ('AMNDO', 'CORRO')
  and regexp_instr(FIM0302, '^(38|40|42)$')=0
  and
    to_timestamp(to_char(FIM0240, s.FMT_ISODATE)||'+'||FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(
      nvl(to_char(FIM0242, s.FMT_ISODATE), s.GC_DT2K)
      ||'+'||nvl(FIM0243, s.GC_TM00)
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0311
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 = 38|40|42) a pokud je záznam
hlášený jako změna (TRAF30_11.P0570 = AMNDO|CORRO), pak hodnota údaje
Přijetí změny pokynu - datum (TRAF30_11.FIM0242) musí být >= hodnotě údaje
Přijetí pokynu - datum (TRAF30_11.FIM0240) a zároveň je-li (
TRAF30_11.FIM0242 = TRAF30_11.FIM0240), pak hodnota údaje Přijetí změny
pokynu - čas (TRAF30_11.FIM0243) musí být >= hodnota údaje Přijetí pokynu -
čas (TRAF30_11.FIM0241).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where P0570 in ('AMNDO', 'CORRO')
  and regexp_instr(FIM0302, '^(38|40|42)$')=1
  and to_timestamp(to_char(FIM0240, s.FMT_ISODATE)||'+'||FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(
      nvl(to_char(FIM0242, s.FMT_ISODATE), s.GC_DT2K)
      ||'+'||nvl(FIM0243, s.GC_TM00)
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0312
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 <> 38|40|42) a pokud jsou údaje
(TRAF30_21.FIM0288, TRAF30_21.FIM0289) vyplněné, pak hodnota údaje Přijetí
zrušení pokynu - datum (TRAF30_21.FIM0288) musí být >= hodnotě údaje Přijetí
pokynu - datum (TRAF30_11.FIM0240) a zároveň je-li (TRAF30_21.FIM0288 =
TRAF30_11.FIM0240), pak Přijetí zrušení pokynu - čas (TRAF30_21.FIM0289)
musí být >= hodnota údaje Přijetí pokynu - čas (TRAF30_11.FIM0241). Kontrola
se provádí mezi záznamem hlášeným jako rušení v DO TRAF30_21 a záznamem
hlášeným jako nový (TRAF30_11.P0570 = NEWO) v DO TRAF30_11 - kontroluje se
množina hodnot údajů (TRAF30_11.R0014, TRAF30_11.R0015) v DO TRAF30_11 a
(TRAF30_21.R0014, TRAF30_21.R0015) v DO TRAF30_21.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_21
  , T0019
  from
    \tTRAF30_21 c
  , (
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from \tTRAF30_11
      where P0570='NEWO'
      and regexp_instr(FIM0302, '^(38|40|42)$')=0
      union all
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from
        rtraf30_11h h
      , rtraf30_11 r
      , mi
      , mo
      , md
      where h.mi_=mi.ii
      and h.r_=r.ii
      and r.P0570='NEWO'
      and regexp_instr(r.FIM0302, '^(38|40|42)$')=0
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM30'
      and mo.ii!=\o
    ) n
  where c.FIM0288 is not null
  and c.FIM0289 is not null
  and c.R0014=n.R0014
  and c.R0015=n.R0015
  and
    to_timestamp(to_char(n.FIM0240, s.FMT_ISODATE)||'+'||n.FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(
      nvl(to_char(c.FIM0288, s.FMT_ISODATE), s.GC_DT2K)
      ||'+'||nvl(c.FIM0289, s.GC_TM00)
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0313
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 = 38|40|42) a pokud jsou údaje
(TRAF30_21.FIM0288, TRAF30_21.FIM0289) vyplněné, pak hodnota údaje Přijetí
zrušení pokynu - datum (TRAF30_21.FIM0288) musí být >= hodnotě údaje Přijetí
pokynu - datum (TRAF30_11.FIM0240) a zároveň je-li (TRAF30_21.FIM0288 =
TRAF30_11.FIM0240), pak Přijetí zrušení pokynu - čas (TRAF30_21.FIM0289)
musí být >= hodnota údaje Přijetí pokynu - čas (TRAF30_11.FIM0241). Kontrola
se provádí mezi záznamem hlášeným jako rušení v DO TRAF30_21 a záznamem
hlášeným jako nový (TRAF30_11.P0570 = NEWO) v DO TRAF30_11 - kontroluje se
množina hodnot údajů (TRAF30_11.R0014, TRAF30_11.R0015) v DO TRAF30_11 a
(TRAF30_21.R0014, TRAF30_21.R0015) v DO TRAF30_21.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_21
  , T0019
  from
    \tTRAF30_21 c
  , (
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from \tTRAF30_11
      where P0570='NEWO'
      and regexp_instr(FIM0302, '^(38|40|42)$')=1
      union all
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from
        rtraf30_11h h
      , rtraf30_11 r
      , mi
      , mo
      , md
      where h.mi_=mi.ii
      and h.r_=r.ii
      and r.P0570='NEWO'
      and regexp_instr(r.FIM0302, '^(38|40|42)$')=1
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM30'
      and mo.ii!=\o
    ) n
  where c.FIM0288 is not null
  and c.FIM0289 is not null
  and c.R0014=n.R0014
  and c.R0015=n.R0015
  and
    to_timestamp(to_char(n.FIM0240, s.FMT_ISODATE)||'+'||n.FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(
      nvl(to_char(c.FIM0288, s.FMT_ISODATE), s.GC_DT2K)
      ||'+'||nvl(c.FIM0289, s.GC_TM00)
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0314
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 <> 38|40|42) musí být hodnota
údaje Předání zrušení pokynu - datum (TRAF30_21.FIM0290) >= hodnotě údaje
Přijetí pokynu - datum (TRAF30_11.FIM0240) a zároveň je-li
(TRAF30_21.FIM0290 = TRAF30_11.FIM0240), pak Předání zrušení pokynu - čas
(TRAF30_21.FIM0291) musí být >= hodnotě údaje Přijetí pokynu - čas
(TRAF30_11.FIM0241). Kontrola se provádí mezi záznamem hlášeným jako rušení
v DO TRAF30_21 a záznamem hlášeným jako nový (TRAF30_11.P0570 = NEWO) v DO
TRAF30_11 - kontroluje se množina hodnot údajů (TRAF30_11.R0014,
TRAF30_11.R0015) v DO TRAF30_11 a (TRAF30_21.R0014, TRAF30_21.R0015) v DO
TRAF30_21.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_21
  , T0019
  from (
      select
        T0019
      , R0014
      , R0015
      , FIM0290
      , FIM0291
      from \tTRAF30_21
      where FIM0290 is not null
      and FIM0291 is not null
    ) c
  , (
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from \tTRAF30_11
      where P0570='NEWO'
      and regexp_instr(FIM0302, '^(38|40|42)$')=0
      union all
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from
        rtraf30_11h h
      , rtraf30_11 r
      , mi
      , mo
      , md
      where h.mi_=mi.ii
      and h.r_=r.ii
      and r.P0570='NEWO'
      and regexp_instr(r.FIM0302, '^(38|40|42)$')=0
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM30'
      and mo.ii!=\o
    ) n
  where c.R0014=n.R0014
  and c.R0015=n.R0015
  and
    to_timestamp(to_char(n.FIM0240, s.FMT_ISODATE)||'+'||n.FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(to_char(c.FIM0290, s.FMT_ISODATE)||'+'||c.FIM0291
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0315
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 = 38|40|42) musí být hodnota údaje
Předání zrušení pokynu - datum (TRAF30_21.FIM0290) >= hodnotě údaje Přijetí
pokynu - datum (TRAF30_11.FIM0240) a zároveň je-li (TRAF30_21.FIM0290 =
TRAF30_11.FIM0240), pak Předání zrušení pokynu - čas (TRAF30_21.FIM0291)
musí být >= hodnotě údaje Přijetí pokynu - čas (TRAF30_11.FIM0241). Kontrola
se provádí mezi záznamem hlášeným jako rušení v DO TRAF30_21 a záznamem
hlášeným jako nový (TRAF30_11.P0570 = NEWO) v DO TRAF30_11 - kontroluje se
množina hodnot údajů (TRAF30_11.R0014, TRAF30_11.R0015) v DO TRAF30_11 a
(TRAF30_21.R0014, TRAF30_21.R0015) v DO TRAF30_21.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_21
  , T0019
  from (
      select
        T0019
      , R0014
      , R0015
      , FIM0290
      , FIM0291
      from \tTRAF30_21
      where FIM0290 is not null
      and FIM0291 is not null
    ) c
  , (
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from \tTRAF30_11
      where P0570='NEWO'
      and regexp_instr(FIM0302, '^(38|40|42)$')=1
      union all
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from
        rtraf30_11h h
      , rtraf30_11 r
      , mi
      , mo
      , md
      where h.mi_=mi.ii
      and h.r_=r.ii
      and r.P0570='NEWO'
      and regexp_instr(r.FIM0302, '^(38|40|42)$')=1
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM30'
      and mo.ii!=\o
    ) n
  where c.R0014=n.R0014
  and c.R0015=n.R0015
  and
    to_timestamp(to_char(n.FIM0240, s.FMT_ISODATE)||'+'||n.FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(to_char(c.FIM0290, s.FMT_ISODATE)||'+'||c.FIM0291
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0317
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 <> 38|40|42) a pokud jsou údaje
(TRAF30_11.FIM0277, TRAF30_11.FIM0278) vyplněné, pak hodnota údaje
Zveřejnění pokynu - datum (TRAF30_11.FIM0277) musí být >= hodnotě údaje
Přijetí pokynu - datum (TRAF30_11.FIM0240) a zároveň je-li
(TRAF30_11.FIM0277 = TRAF30_11.FIM0240), pak hodnota údaje Zveřejnění pokynu
- čas (TRAF30_11.FIM0278) musí být >= hodnotě údaje Přijetí pokynu - čas
(TRAF30_11.FIM0241).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where regexp_instr(FIM0302, '^(38|40|42)$')=0
  and FIM0277 is not null
  and FIM0278 is not null
  and to_timestamp(to_char(FIM0240, s.FMT_ISODATE)||'+'||FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(
      nvl(to_char(FIM0277, s.FMT_ISODATE), s.GC_DT2K)
      ||'+'||nvl(FIM0278, s.GC_TM00)
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0318
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 = 38|40|42) a pokud jsou údaje
(TRAF30_11.FIM0277, TRAF30_11.FIM0278) vyplněné, pak hodnota údaje
Zveřejnění pokynu - datum (TRAF30_11.FIM0277) musí být >= hodnotě údaje
Přijetí pokynu - datum (TRAF30_11.FIM0240) a zároveň je-li
(TRAF30_11.FIM0277 = TRAF30_11.FIM0240), pak hodnota údaje Zveřejnění pokynu
- čas (TRAF30_11.FIM0278) musí být >= hodnotě údaje Přijetí pokynu - čas
(TRAF30_11.FIM0241).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from \tTRAF30_11
  where regexp_instr(FIM0302, '^(38|40|42)$')=1
  and FIM0277 is not null
  and FIM0278 is not null
  and
    to_timestamp(to_char(FIM0240, s.FMT_ISODATE)||'+'||FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(
      nvl(to_char(FIM0277, s.FMT_ISODATE), s.GC_DT2K)
      ||'+'||nvl(FIM0278, s.GC_TM00)
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0319
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 <> 38|40|42) musí být hodnota
údaje Předání pokynu - datum (TRAF30_32.FIM0279) >= hodnotě údaje Přijetí
pokynu - datum (TRAF30_11.FIM0240) a zároveň je-li (TRAF30_32.FIM0279 =
TRAF30_11.FIM0240), pak Předání pokynu - čas (TRAF30_32.FIM0280) musí být >=
hodnotě údaje Přijetí pokynu - čas (TRAF30_11.FIM0241). Kontrola se provádí
mezi záznamem hlášeným v DO TRAF30_32 a záznamem hlášeným jako nový
(TRAF30_11.P0570 = NEWO) v DO TRAF30_11 - kontroluje se množina hodnot údajů
(TRAF30_11.R0014, TRAF30_11.R0015) v DO TRAF30_11 a (TRAF30_32.R0014,
TRAF30_32.R0015) v DO TRAF30_32.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||',T0021.'||T0021||')'
  , \aTRAF30_32
  , T0019+T0021*power(10, m.SZ_T0019)
  from
    \tTRAF30_32 x
  , (
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from \tTRAF30_11
      where P0570='NEWO'
      and regexp_instr(FIM0302, '^(38|40|42)$')=0
      union all
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from
        rtraf30_11h h
      , rtraf30_11 r
      , mi
      , mo
      , md
      where h.mi_=mi.ii
      and h.r_=r.ii
      and r.P0570='NEWO'
      and regexp_instr(r.FIM0302, '^(38|40|42)$')=0
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM30'
      and mo.ii!=\o
    ) n
  where x.R0014=n.R0014
  and x.R0015=n.R0015
  and
    to_timestamp(to_char(n.FIM0240, s.FMT_ISODATE)||'+'||n.FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(to_char(x.FIM0279, s.FMT_ISODATE)||'+'||x.FIM0280
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0320
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 = 38|40|42) musí být hodnota údaje
Předání pokynu - datum (TRAF30_32.FIM0279) >= hodnotě údaje Přijetí pokynu -
datum (TRAF30_11.FIM0240) a zároveň je-li (TRAF30_32.FIM0279 =
TRAF30_11.FIM0240), pak Předání pokynu - čas (TRAF30_32.FIM0280) musí být >=
hodnotě údaje Přijetí pokynu - čas (TRAF30_11.FIM0241). Kontrola se provádí
mezi záznamem hlášeným v DO TRAF30_32 a záznamem hlášeným jako nový
(TRAF30_11.P0570 = NEWO) v DO TRAF30_11 - kontroluje se množina hodnot údajů
(TRAF30_11.R0014, TRAF30_11.R0015) v DO TRAF30_11 a (TRAF30_32.R0014,
TRAF30_32.R0015) v DO TRAF30_32.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||',T0021.'||T0021||')'
  , \aTRAF30_32
  , T0019+T0021*power(10, m.SZ_T0019)
  from
    \tTRAF30_32 x
  , (
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from \tTRAF30_11
      where P0570='NEWO'
      and regexp_instr(FIM0302, '^(38|40|42)$')=1
      union all
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from
        rtraf30_11h h
      , rtraf30_11 r
      , mi
      , mo
      , md
      where h.mi_=mi.ii
      and h.r_=r.ii
      and r.P0570='NEWO'
      and regexp_instr(r.FIM0302, '^(38|40|42)$')=1
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM30'
      and mo.ii!=\o
    ) n
  where x.R0014=n.R0014
  and x.R0015=n.R0015
  and
    to_timestamp(to_char(n.FIM0240, s.FMT_ISODATE)||'+'||n.FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(to_char(x.FIM0279, s.FMT_ISODATE)||'+'||x.FIM0280
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0321
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 <> 38|40|42) musí být hodnota
údaje Vložení objednávky - datum (TRAF30_31.FIM0419) >= hodnotě údaje
Přijetí pokynu - datum (TRAF30_11.FIM0240) a zároveň je-li
(TRAF30_31.FIM0419 = TRAF30_11.FIM0240), pak Vložení objednávky - čas
(TRAF30_31.FIM0420) musí být >= hodnotě údaje Přijetí pokynu - čas
(TRAF30_11.FIM0241). Kontrola se provádí mezi záznamem hlášeným v DO
TRAF30_31 a záznamem hlášeným jako nový (TRAF30_11.P0570 = NEWO) v DO
TRAF30_11 - kontroluje se množina hodnot údajů (TRAF30_11.R0014,
TRAF30_11.R0015) v DO TRAF30_11 a (TRAF30_31.R0014, TRAF30_31.R0015) v DO
TRAF30_31.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||',T0021.'||T0021||')'
  , \aTRAF30_31
  , T0019+T0021*power(10, m.SZ_T0019)
  from
    \tTRAF30_31 x
  , (
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from \tTRAF30_11
      where P0570='NEWO'
      and regexp_instr(FIM0302, '^(38|40|42)$')=0
      union all
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from
        rtraf30_11h h
      , rtraf30_11 r
      , mi
      , mo
      , md
      where h.mi_=mi.ii
      and h.r_=r.ii
      and r.P0570='NEWO'
      and regexp_instr(r.FIM0302, '^(38|40|42)$')=0
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM30'
      and mo.ii!=\o
    ) n
  where x.R0014=n.R0014
  and x.R0015=n.R0015
  and
    to_timestamp(to_char(n.FIM0240, s.FMT_ISODATE)||'+'||n.FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(to_char(x.FIM0419, s.FMT_ISODATE)||'+'||x.FIM0420
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0322
/*
Pro hodnotu Typ pokynu (TRAF30_11.FIM0302 = 38|40|42) musí být hodnota údaje
Vložení objednávky - datum (TRAF30_31.FIM0419) >= hodnotě údaje Přijetí
pokynu - datum (TRAF30_11.FIM0240) a zároveň je-li (TRAF30_31.FIM0419 =
TRAF30_11.FIM0240), pak Vložení objednávky - čas (TRAF30_31.FIM0420) musí
být >= hodnotě údaje Přijetí pokynu - čas (TRAF30_11.FIM0241). Kontrola se
provádí mezi záznamem hlášeným v DO TRAF30_31 a záznamem hlášeným jako nový
(TRAF30_11.P0570 = NEWO) v DO TRAF30_11 - kontroluje se množina hodnot údajů
(TRAF30_11.R0014, TRAF30_11.R0015) v DO TRAF30_11 a (TRAF30_31.R0014,
TRAF30_31.R0015) v DO TRAF30_31.
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||',T0021.'||T0021||')'
  , \aTRAF30_31
  , T0019+T0021*power(10, m.SZ_T0019)
  from
    \tTRAF30_31 x
  , (
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from \tTRAF30_11
      where P0570='NEWO'
      and regexp_instr(FIM0302, '^(38|40|42)$')=1
      union all
      select
        R0014
      , R0015
      , FIM0240
      , FIM0241
      from
        rtraf30_11h h
      , rtraf30_11 r
      , mi
      , mo
      , md
      where h.mi_=mi.ii
      and h.r_=r.ii
      and r.P0570='NEWO'
      and regexp_instr(r.FIM0302, '^(38|40|42)$')=1
      and mi.mis_=m.IS_CURRENT
      and mi.mo_=mo.ii
      and mo.mp_=\p
      and mo.md_=md.ii
      and md.id='TRAFIM30'
      and mo.ii!=\o
    ) n
  where x.R0014=n.R0014
  and x.R0015=n.R0015
  and to_timestamp(to_char(n.FIM0240, s.FMT_ISODATE)||'+'||n.FIM0241
    , s.FMT_ISOSTAMP)>
    to_timestamp(to_char(x.FIM0419, s.FMT_ISODATE)||'+'||x.FIM0420
    , s.FMT_ISOSTAMP)
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0323
/*
K zaslanému hromadnému pokynu (hodnota údaje Identifikační kód zákazníka
(TRAF30_11.FIM0252 = INTC) nebyly v rámci výskytu nalezeny dílčí pokyny.
Kontroluje se shoda prvních 15 znaků údaje Číslo pokynu (TRAF30_11.R0014).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aTRAF30_11
  , T0019
  from
    \tTRAF30_11 h
  , (
      select
        substr(R0014, 1, 15) R0014_
      , R0015
      from \tTRAF30_11
      where FIM0252='INTC'
      minus
      select
        substr(R0014, 1, 15)
      , R0015
      from \tTRAF30_11
      where nvl(FIM0252, '-')!='INTC'
    ) x
  where substr(h.R0014, 1, 15)=x.R0014_
  and h.R0015=x.R0015
  and h.FIM0252='INTC'
  \f; :1:=sql%rowcount;
end;

MKT20180103 TRAFIM30 000 0324
/* \#virtual \#include */
begin :1:=m.gke('MKT20190101', 'TRAFIM30', '000', '0324', '00');
end;

MKT20180103 TRAFIM30 000 0324
/* \#virtual \#include */
begin :1:=m.gke('MKT20190101', 'TRAFIM30', '000', '0324', '01');
end;

MKT20180103 TRAFIM30 000 0325
/* \#virtual \#include */
declare e mk.e%type; begin execute immediate
  m.gke('MKT20190101', 'TRAFIM30', '000', '0325', '00') using out e; :1:=e;
end;

MKT20180103 TRAFIM30 000 0325
/* \#virtual \#include */
declare e mk.e%type; begin execute immediate
  m.gke('MKT20190101', 'TRAFIM30', '000', '0325', '01') using out e; :1:=e;
end;

MKT20180103 TRAFIM30 000 0326
/* \#virtual \#include */
declare e mk.e%type; begin execute immediate
  m.gke('MKT20190101', 'TRAFIM30', '000', '0326', '00') using out e; :1:=e;
end;

MKT20180103 TRAFIM30 000 0326
/* \#virtual \#include */
declare e mk.e%type; begin execute immediate
  m.gke('MKT20190101', 'TRAFIM30', '000', '0326', '01') using out e; :1:=e;
end;

MKT20180103 TRAFIM30 000 0327
/* \#virtual \#include */
begin :1:=m.gke('MKT20190101', 'TRAFIM30', '000', '0327', '00');
end;

MKT20180103 TRAFIM30 000 0328
/* \#virtual \#include */
declare e mk.e%type; begin execute immediate
  m.gke('MKT20190101', 'TRAFIM30', '000', '0328', '00') using out e; :1:=e;
end;

MKT20180103 TRAFIM30 000 0329
/* \#virtual \#include */
declare e mk.e%type; begin execute immediate
  m.gke('MKT20190101', 'TRAFIM30', '000', '0329', '00') using out e; :1:=e;
end;

MKT20180103 TRAFIM30 000 0330
/* \#virtual \#include */
begin :1:=m.gke('MKT20190101', 'TRAFIM30', '000', '0330', '00');
end;

MKT20180103 TRAFIM30 000 0331
/* \#virtual \#include */
begin :1:=m.gke('MKT20190101', 'TRAFIM30', '000', '0331', '00');
end;

MKT20180103 TRAFIM30 000 0902
/*
Technologická rezerva - generální upozornění.
  HEX RULE
 ---- ----------------------------------------------------------------------
   1. Vazba TRAFIM30 na PERFIM30 - KK101
 0324 Identifikační kód zadavatele (TRAF30_11.FIM0247, TRAF30_11.FIM0421,
      TRAF30_11.FIM0248) ve výkazu TRAFIM30 musí být nalezen v rámci množiny
      osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
      (PERF30_11.RFD0002) v případě LEI kódu, oproti hodnotám údaje
      (PERF30_11.RFD0003) v případě IČ nebo oproti hodnotám údaje
      (PERF30_11.RFD0005) v případě identifikátoru FO. V případě použití
      identifikátoru FO se dále musí shodovat použitý typ tohoto
      identifikátoru - kontrola množiny hodnot údajů (TRAF30_11.FIM0249,
      TRAF30_11.FIM0250) oproti množině hodnot údajů (PERF30_11.RFD0006,
      PERF30_11.RFD0007).
   2. Vazba TRAFIM30 na PERFIM30 - KK102
 0325 Pokud se nejedná o převzetí koncového zákazníka
      (TRAF30_11.FIM0253=false) pak Identifikační kód zákazníka
      (TRAF30_11.FIM0303, TRAF30_11.FIM0422, TRAF30_11.FIM0304) ve výkazu
      TRAFIM30 musí být nalezen v rámci množiny osob zaslaných výkazem
      PERFIM30 - kontrola oproti hodnotám údaje (PERF30_11.RFD0002) v
      případě LEI kódu, oproti hodnotám údaje (PERF30_11.RFD0003) v
      případě IČ nebo oproti hodnotám údaje (PERF30_11.RFD0005) v případě
      identifikátoru FO. V případě použití identifikátoru FO se dále musí
      shodovat použitý typ tohoto identifikátoru - kontrola množiny hodnot
      údajů (TRAF30_11.FIM0305, TRAF30_11.FIM0306) oproti množině hodnot
      údajů (PERF30_11.RFD0006, PERF30_11.RFD0007).
   4. Vazba TRAFIM30 na PERFIM30 - KK103
 0326 Je-li ve výkazu TRAFIM30 Požadovaná protistrana identifikována pomocí
      LEI kódu (TRAF30_11.FIM0264), IČ (TRAF30_11.FIM0423) nebo pomocí
      identifikátoru FO (TRAF30_11.FIM0266), potom musí být nalezena v rámci
      množiny osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám
      údaje (PERF30_11.RFD0002) v případě LEI kódu, oproti hodnotám údaje
      (PERF30_11.RFD0003) v případě IČ nebo oproti hodnotám údaje
      (PERF30_11.RFD0005) v případě identifikátoru FO. V případě použití
      identifikátoru FO se dále musí shodovat použitý typ tohoto
      identifikátoru - kontrola množiny hodnot údajů (TRAF30_11.FIM0267,
      TRAF30_11.FIM0268) oproti množině hodnot údajů (PERF30_11.RFD0006,
      PERF30_11.RFD0007).
   8. Vazba TRAFIM30 na PERFIM30 - KK104
 0327 Je-li vyplněný Identifikační kód osoby přijímající pokyn v rámci
      podniku (TRAF30_11.FIM0281), potom musí být nalezen v rámci množiny
      osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
      (PERF30_11.RFD0005) - a zároveň se musí shodovat použitý typ
      identifikátoru - kontrola množiny hodnot údajů (TRAF30_11.FIM0282,
      TRAF30_11.FIM0283) oproti množině hodnot údajů (PERF30_11.RFD0006,
      PERF30_11.RFD0007).
  16. Vazba TRAFIM30 na PERFIM30 - KK105
 0328 Je-li vyplněný Identifikační kód osoby odpovědné za provedení pokynu
      v rámci podniku (TRAF30_11.FIM0284), potom musí být nalezen v rámci
      množiny osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám
      údaje (PERF30_11.RFD0005) - a zároveň se musí shodovat použitý typ
      identifikátoru - kontrola množiny hodnot údajů (TRAF30_11.FIM0285,
      TRAF30_11.FIM0286) oproti množině hodnot údajů (PERF30_11.RFD0006,
      PERF30_11.RFD0007).

MKT20180103 TRAFIM30 000 0902

  32. Vazba TRAFIM30 na PERFIM30 - KK106
 0329 Je-li vyplněný Identifikační kód osoby činící investiční rozhodnutí v
      rámci podniku (TRAF30_11.FIM0313), potom musí být nalezen v rámci
      množiny osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám
      údaje (PERF30_11.RFD0005) a zároveň se musí shodovat použitý typ
      identifikátoru - kontrola množiny hodnot údajů (TRAF30_11.FIM0314,
      TRAF30_11.FIM0315) oproti množině hodnot údajů (PERF30_11.RFD0006,
      PERF30_11.RFD0007).
  64. Vazba TRAFIM30 na PERFIM30 - KK107
 0330 Identifikace subjektu, kterému byl pokyn předán (TRAF30_32.FIM0296)
      musí být nalezen v rámci množiny subjektů zaslaných výkazem PERFIM30 -
      kontrola oproti hodnotám údaje PERF30_11.RFD0002.
 128. Vazba TRAFIM30 na REFFIM10 - KK101
 0331 Množina hodnot údajů Identifikace investičního nástroje
      (TRAF30_11.FIM0255, TRAF30_11.FIM0307, TRAF30_11.FIM0308,
      TRAF30_11.FIM0309) musí být nalezena v rámci množiny nástrojů
      zaslaných výkazem REFFIM10 - kontrola oproti množině hodnot údajů
      (REFF10_11.RFD0033, REFF10_11.RFD0034, REFF10_11.RFD0035,
      REFF10_11.RFD0036).
*/
declare
  type t_k is table of mk.ii%type index by pls_integer;
  ec stp.id%type:='__\e.902.ec'; -- error count
  k t_k;
  sn stp.id%type:='__\e.902.sn'; -- step No
begin
  if s.pg(sn, s.GC_NO) is null then
    s.ugs('\e'); s.ps(sn, '0'); commit; end if;
  if s.pg(sn)='0' then
    \i
    \s
      \k
    , replace(x.d, ')', ',rule.'||sum(
        case mk.id
        when '0324' then 1
        when '0325' then 2
        when '0326' then 4
        when '0327' then 8
        when '0328' then 16
        when '0329' then 32
        when '0330' then 64
        when '0331' then 128
        end)||')')
    , \aTRAF30_11
    , -1 -- unsaveable - no reference in h.mi_
    from
      \e x
    , mk
    where x.mk_=mk.ii
    and mk.id between '0324' and '0331'
    group by x.d \f; s.ps(ec, sql%rowcount); s.ps(sn, '1'); commit; end if;
  if s.pg(sn)='1' then
    select distinct x.mk_ bulk collect into k
    from
      \e x
    , mk
    where x.mk_=mk.ii
    and mk.id between '0324' and '0331';
    if k.count>0 then
      forall i in k.first..k.last delete \e where mk_=k(i); end if;
    :1:=s.pg(ec); s.pd(ec); s.pd(sn); end if;
    /* commit/rollback will be executed by caller */
end;

MKT20190101 JISIFE51 000 0102
INHERIT

MKT20190101 JISIFE51 000 0103
INHERIT

MKT20190101 JISIFE51 000 0105
INHERIT

MKT20190101 JISIFE51 000 0106
INHERIT

MKT20190101 JISIFE51 000 0109
INHERIT

MKT20190101 JISIFE51 000 0110
INHERIT

MKT20190101 JISIFE51 000 0121
INHERIT

MKT20190101 JISIFE51 000 0131
INHERIT

MKT20190101 JISIFE52 000 0103
INHERIT

MKT20190101 JISIFE52 000 0105
INHERIT

MKT20190101 JISIFE52 000 0106
INHERIT

MKT20190101 JISIFE52 000 0108
INHERIT

MKT20190101 JISIFE52 000 0109
INHERIT

MKT20190101 JISIFE52 000 0110
INHERIT

MKT20190101 JISIFE53 000 0103
INHERIT

MKT20190101 JISIFE53 000 0105
INHERIT

MKT20190101 JISIFE53 000 0106
INHERIT

MKT20190101 JISIFE53 000 0107
INHERIT

MKT20190101 JISIFE53 000 0108
INHERIT

MKT20190101 JISIFE54 000 0102
INHERIT

MKT20190101 JISIFE54 000 0103
INHERIT

MKT20190101 JISIFE54 000 0105
INHERIT

MKT20190101 JISIFE54 000 0106
INHERIT

MKT20190101 JISIFE54 000 0109
INHERIT

MKT20190101 JISIFE54 000 0110
/*
Záznam s výjimkou parametru RID není v rámci výskytu unikátní. Možná
duplicita záznamu.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS54_01
  , I0003
  from (\m0 -- if mmt_=m.MT_CHANGE then
      select
        x.*
      , count(*) over (partition by md5) as c
      from (
          select *
          from (
              select
                x.*
              , row_number() over (
                  partition by I0003 order by pri desc) as rowno
              from (
                  select
                    I0003
                  , md5
                  , 1 pri
                  from
                    \tJIS54_01
                  union all
                  select
                    h.I0003
                  , r.md5
                  , 0
                  from
                    rJIS54_01h h
                  , rJIS54_01 r
                  , mi
                  where h.I0003 not in (select I0003 from \dJIS54_01)
                  and h.mi_=mi.ii
                  and mi.mis_=m.IS_CURRENT
                  and mi.mo_=\o
                  and h.r_=r.ii
                ) x
            )
          where rowno=1
        ) x
    )
  where pri=1 and c>1
  \f;\m1 -- else
      select
        I0003
      , count(*) over (partition by md5) as c
      from \tJIS54_01
    )
  where c>1
  \f;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20190101 JISIFE55 000 0101
INHERIT

MKT20190101 JISIFE55 000 0103
INHERIT

MKT20190101 JISIFE55 000 0104
INHERIT

MKT20190101 JISIFE55 000 0106
INHERIT

MKT20190101 JISIFE55 000 0107
/*
Záznam s výjimkou parametru RID není v rámci výskytu unikátní. Možná
duplicita záznamu.
*/
begin
  \i
  \s
    \k
  , I0003
  , \aJIS55_01
  , I0003
  from (\m0 -- if mmt_=m.MT_CHANGE then
      select
        x.*
      , count(*) over (partition by md5) as c
      from (
          select *
          from (
              select
                x.*
              , row_number() over (
                  partition by I0003 order by pri desc) as rowno
              from (
                  select
                    I0003
                  , md5
                  , 1 pri
                  from
                    \tJIS55_01
                  union all
                  select
                    h.I0003
                  , r.md5
                  , 0
                  from
                    rJIS55_01h h
                  , rJIS55_01 r
                  , mi
                  where h.I0003 not in (select I0003 from \dJIS55_01)
                  and h.mi_=mi.ii
                  and mi.mis_=m.IS_CURRENT
                  and mi.mo_=\o
                  and h.r_=r.ii
                ) x
            )
          where rowno=1
        ) x
    )
  where pri=1 and c>1
  \f;\m1 -- else
      select
        I0003
      , count(*) over (partition by md5) as c
      from \tJIS55_01
    )
  where c>1
  \f;\m2 -- end if
  :1:=sql%rowcount;
end;

MKT20190101 PERFIM30 000 0101
INHERIT

MKT20190101 PERFIM30 000 0102
INHERIT

MKT20190101 PERFIM30 000 0103
INHERIT

MKT20190101 PERFIM30 000 0104
INHERIT

MKT20190101 PERFIM30 000 0201
INHERIT

MKT20190101 PERFIM30 000 0202
INHERIT

MKT20190101 PERFIM30 000 0203
INHERIT

MKT20190101 PERFIM30 000 0204
/*
Záznam není v rámci výskytu unikátní. Prověřit možnou duplicitu (T0019).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aPERF30_11
  , T0019
  from \tPERF30_11 group by T0019 having count(*)>1
  \f; :1:=sql%rowcount;
end;

MKT20190101 REFFIM10 000 0104
INHERIT

MKT20190101 REFFIM10 000 0105
INHERIT

MKT20190101 REFFIM10 000 0106
INHERIT

MKT20190101 REFFIM10 000 0107
INHERIT

MKT20190101 REFFIM10 000 0108
INHERIT

MKT20190101 REFFIM10 000 0109
INHERIT

MKT20190101 REFFIM10 000 0110
INHERIT

MKT20190101 REFFIM10 000 0201
INHERIT

MKT20190101 REFFIM10 000 0202
INHERIT

MKT20190101 REFFIM10 000 0202
INHERIT

MKT20190101 REFFIM10 000 0203
INHERIT

MKT20190101 REFFIM10 000 0301
INHERIT

MKT20190101 REFFIM10 000 0302
INHERIT

MKT20190101 REFFIM10 000 0303
INHERIT

MKT20190101 REFFIM10 000 0306
INHERIT

MKT20190101 REFFIM10 000 0307
INHERIT

MKT20190101 REFFIM10 000 0308
INHERIT

MKT20190101 REFFIM10 000 0309
INHERIT

MKT20190101 REFFIM10 000 0314
INHERIT

MKT20190101 REFFIM10 000 0317
/*
Záznam není v rámci výskytu v DO REFF10_11 unikátní. Prověřit možnou
duplicitu (T0019).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||')'
  , \aREFF10_11
  , T0019
  from \tREFF10_11 group by T0019 having count(*)>1
  \f; :1:=sql%rowcount;
end;

MKT20190101 REFFIM10 000 0318
/*
Záznam není v rámci výskytu v DO REFF10_21 unikátní. Prověřit možnou
duplicitu (T0019, T0021).
*/
begin
  \i
  \s
    \k
  , '(T0019.'||T0019||',T0021.'||T0021||')'
  , \aREFF10_21
  , T0019+T0021*power(10, m.SZ_T0019)
  from \tREFF10_21
  group by
    T0019
  , T0021
  having count(*)>1
  \f; :1:=sql%rowcount;
end;

MKT20190101 TRAFIM11 000 0101
INHERIT

MKT20190101 TRAFIM11 000 0103
INHERIT

MKT20190101 TRAFIM11 000 0104
INHERIT

MKT20190101 TRAFIM11 000 0105
INHERIT

MKT20190101 TRAFIM11 000 0106
INHERIT

MKT20190101 TRAFIM11 000 0108
INHERIT

MKT20190101 TRAFIM11 000 0109
INHERIT

MKT20190101 TRAFIM11 000 0110
INHERIT

MKT20190101 TRAFIM11 000 0111
INHERIT

MKT20190101 TRAFIM11 000 0112
INHERIT

MKT20190101 TRAFIM11 000 0113
INHERIT

MKT20190101 TRAFIM11 000 0114
INHERIT

MKT20190101 TRAFIM11 000 0115
INHERIT

MKT20190101 TRAFIM11 000 0116
INHERIT

MKT20190101 TRAFIM11 000 0117
INHERIT

MKT20190101 TRAFIM11 000 0118
INHERIT

MKT20190101 TRAFIM11 000 0119
INHERIT

MKT20190101 TRAFIM11 000 0120
INHERIT

MKT20190101 TRAFIM11 000 0121
INHERIT

MKT20190101 TRAFIM11 000 0122
INHERIT

MKT20190101 TRAFIM11 000 0123
INHERIT

MKT20190101 TRAFIM11 000 0124
INHERIT

MKT20190101 TRAFIM11 000 0125
INHERIT

MKT20190101 TRAFIM11 000 0126
INHERIT

MKT20190101 TRAFIM11 000 0127
INHERIT

MKT20190101 TRAFIM11 000 0128
INHERIT

MKT20190101 TRAFIM11 000 0129
INHERIT

MKT20190101 TRAFIM11 000 0130
INHERIT

MKT20190101 TRAFIM11 000 0131
INHERIT

MKT20190101 TRAFIM11 000 0132
INHERIT

MKT20190101 TRAFIM11 000 0133
INHERIT

MKT20190101 TRAFIM11 000 0134
INHERIT

MKT20190101 TRAFIM11 000 0135
INHERIT

MKT20190101 TRAFIM11 000 0136
INHERIT

MKT20190101 TRAFIM11 000 0201
INHERIT

MKT20190101 TRAFIM11 000 0202
INHERIT

MKT20190101 TRAFIM11 000 0203
INHERIT

MKT20190101 TRAFIM11 000 0204
INHERIT

MKT20190101 TRAFIM11 000 0205
INHERIT

MKT20190101 TRAFIM11 000 0206
INHERIT

MKT20190101 TRAFIM11 000 0207
INHERIT

MKT20190101 TRAFIM11 000 0208
INHERIT

MKT20190101 TRAFIM11 000 0209
INHERIT

MKT20190101 TRAFIM11 000 0210
INHERIT

MKT20190101 TRAFIM11 000 0211
INHERIT

MKT20190101 TRAFIM11 000 0212
INHERIT

MKT20190101 TRAFIM11 000 0213
INHERIT

MKT20190101 TRAFIM11 000 0214
INHERIT

MKT20190101 TRAFIM11 000 0217
INHERIT

MKT20190101 TRAFIM11 000 0218
INHERIT

MKT20190101 TRAFIM11 000 0221
INHERIT

MKT20190101 TRAFIM11 000 0222
INHERIT

MKT20190101 TRAFIM11 000 0223
INHERIT

MKT20190101 TRAFIM11 000 0224
/*
PK: Je-li ve výkazu TRAFIM20 údaj Identifikační kód nástroje 1
(TRAF20_11.FIM0065) vyplněný a v rámci množiny nástrojů zaslaných výkazem
REFFIM10 je pro tento nástroj (kontrola oproti hodnotám údaje
REFF10_11.RFD0033) hodnota REFF10_11.RFD0113 Hlášení nástroje podle čl. 26
nařízení (EU) č. 600/2014 (MIFIR) = true, pak musí být tento nástroj nalezen
v referenčních datech FIRDS.
\#include
*/
begin :1:=m.gke('MKT20180103', 'TRAFIM11', '000', '0902', '00');
end;

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 000 0001
INHERIT

MKT20190101 TRAFIM20 110 0023
INHERIT

MKT20190101 TRAFIM20 110 0023
INHERIT

MKT20190101 TRAFIM20 110 0024
INHERIT

MKT20190101 TRAFIM20 110 0025
INHERIT

MKT20190101 TRAFIM20 110 0040
INHERIT

MKT20190101 TRAFIM20 110 0041
INHERIT

MKT20190101 TRAFIM20 110 0060
INHERIT

MKT20190101 TRAFIM20 110 0070
INHERIT

MKT20190101 TRAFIM20 110 0071
INHERIT

MKT20190101 TRAFIM20 110 0072
INHERIT

MKT20190101 TRAFIM20 110 0073
INHERIT

MKT20190101 TRAFIM20 110 0074
INHERIT

MKT20190101 TRAFIM20 110 0080
INHERIT

MKT20190101 TRAFIM20 110 0120
INHERIT

MKT20190101 TRAFIM20 110 0121
INHERIT

MKT20190101 TRAFIM20 110 0122
INHERIT

MKT20190101 TRAFIM20 110 0123
INHERIT

MKT20190101 TRAFIM20 110 0160
INHERIT

MKT20190101 TRAFIM20 110 0161
INHERIT

MKT20190101 TRAFIM20 110 0162
INHERIT

MKT20190101 TRAFIM20 110 0163
INHERIT

MKT20190101 TRAFIM20 110 0164
INHERIT

MKT20190101 TRAFIM20 110 0170
INHERIT

MKT20190101 TRAFIM20 110 0210
INHERIT

MKT20190101 TRAFIM20 110 0211
INHERIT

MKT20190101 TRAFIM20 110 0212
INHERIT

MKT20190101 TRAFIM20 110 0213
INHERIT

MKT20190101 TRAFIM20 110 0251
INHERIT

MKT20190101 TRAFIM20 110 0260
INHERIT

MKT20190101 TRAFIM20 110 0270
INHERIT

MKT20190101 TRAFIM20 110 0280
INHERIT

MKT20190101 TRAFIM20 110 0281
INHERIT

MKT20190101 TRAFIM20 110 0290
INHERIT

MKT20190101 TRAFIM20 110 0310
INHERIT

MKT20190101 TRAFIM20 110 0340
INHERIT

MKT20190101 TRAFIM20 110 0360
INHERIT

MKT20190101 TRAFIM20 110 0370
INHERIT

MKT20190101 TRAFIM20 110 0371
INHERIT

MKT20190101 TRAFIM20 110 0390
INHERIT

MKT20190101 TRAFIM20 110 0410
INHERIT

MKT20190101 TRAFIM20 110 0570
INHERIT

MKT20190101 TRAFIM20 110 0571
INHERIT

MKT20190101 TRAFIM20 110 0572
INHERIT

MKT20190101 TRAFIM20 110 0573
INHERIT

MKT20190101 TRAFIM20 110 0574
INHERIT

MKT20190101 TRAFIM20 110 0580
INHERIT

MKT20190101 TRAFIM20 110 0590
INHERIT

MKT20190101 TRAFIM20 110 0591
INHERIT

MKT20190101 TRAFIM20 110 0600
INHERIT

MKT20190101 TRAFIM20 120 0030
INHERIT

MKT20190101 TRAFIM20 120 0610
INHERIT

MKT20190101 TRAFIM20 130 0411
INHERIT

MKT20190101 TRAFIM20 130 0411
INHERIT

MKT20190101 TRAFIM20 130 0412
INHERIT

MKT20190101 TRAFIM20 140 0331
INHERIT

MKT20190101 TRAFIM20 140 0351
INHERIT

MKT20190101 TRAFIM20 140 0381
INHERIT

MKT20190101 TRAFIM20 140 0640
INHERIT

MKT20190101 TRAFIM20 150 0470
INHERIT

MKT20190101 TRAFIM20 150 0473
INHERIT

MKT20190101 TRAFIM20 160 0361
INHERIT

MKT20190101 TRAFIM20 160 0471
INHERIT

MKT20190101 TRAFIM20 160 0471
INHERIT

MKT20190101 TRAFIM20 160 0472
INHERIT

MKT20190101 TRAFIM20 170 0440
INHERIT

MKT20190101 TRAFIM20 170 0450
INHERIT

MKT20190101 TRAFIM20 170 0451
INHERIT

MKT20190101 TRAFIM20 170 0520
INHERIT

MKT20190101 TRAFIM20 170 0541
INHERIT

MKT20190101 TRAFIM20 170 0552
INHERIT

MKT20190101 TRAFIM20 180 0330
INHERIT

MKT20190101 TRAFIM20 180 0350
INHERIT

MKT20190101 TRAFIM20 180 0380
INHERIT

MKT20190101 TRAFIM20 180 0441
INHERIT

MKT20190101 TRAFIM20 180 0481
INHERIT

MKT20190101 TRAFIM20 180 0500
INHERIT

MKT20190101 TRAFIM20 180 0501
INHERIT

MKT20190101 TRAFIM20 180 0510
INHERIT

MKT20190101 TRAFIM20 180 0511
INHERIT

MKT20190101 TRAFIM20 180 0530
INHERIT

MKT20190101 TRAFIM20 180 0531
INHERIT

MKT20190101 TRAFIM20 180 0540
INHERIT

MKT20190101 TRAFIM20 180 0542
INHERIT

MKT20190101 TRAFIM20 180 0551
INHERIT

MKT20190101 TRAFIM20 190 0012
INHERIT

MKT20190101 TRAFIM30 000 0101
INHERIT

MKT20190101 TRAFIM30 000 0102
INHERIT

MKT20190101 TRAFIM30 000 0104
INHERIT

MKT20190101 TRAFIM30 000 0109
INHERIT

MKT20190101 TRAFIM30 000 0113
INHERIT

MKT20190101 TRAFIM30 000 0114
INHERIT

MKT20190101 TRAFIM30 000 0115
INHERIT

MKT20190101 TRAFIM30 000 0118
INHERIT

MKT20190101 TRAFIM30 000 0201
INHERIT

MKT20190101 TRAFIM30 000 0202
INHERIT

MKT20190101 TRAFIM30 000 0203
INHERIT

MKT20190101 TRAFIM30 000 0204
INHERIT

MKT20190101 TRAFIM30 000 0205
INHERIT

MKT20190101 TRAFIM30 000 0206
INHERIT

MKT20190101 TRAFIM30 000 0207
INHERIT

MKT20190101 TRAFIM30 000 0208
INHERIT

MKT20190101 TRAFIM30 000 0209
INHERIT

MKT20190101 TRAFIM30 000 0304
INHERIT

MKT20190101 TRAFIM30 000 0310
INHERIT

MKT20190101 TRAFIM30 000 0311
INHERIT

MKT20190101 TRAFIM30 000 0312
INHERIT

MKT20190101 TRAFIM30 000 0313
INHERIT

MKT20190101 TRAFIM30 000 0314
INHERIT

MKT20190101 TRAFIM30 000 0315
INHERIT

MKT20190101 TRAFIM30 000 0317
INHERIT

MKT20190101 TRAFIM30 000 0318
INHERIT

MKT20190101 TRAFIM30 000 0319
INHERIT

MKT20190101 TRAFIM30 000 0320
INHERIT

MKT20190101 TRAFIM30 000 0321
INHERIT

MKT20190101 TRAFIM30 000 0322
INHERIT

MKT20190101 TRAFIM30 000 0323
INHERIT

MKT20190101 TRAFIM30 000 0324

  execute immediate '
begin
  \i
  \s
    \k
  , ''(file.''||mi.id||'',T0019.''||T0019||'')''
  , \aTRAF30_11
  , -1 -- unsaveable - no reference in h.mi_
  from
    rtraf30_11 r
  , rtraf30_11h h
  , mi
  , mo
  , md
  where r.ii=h.r_
  and h.mi_=mi.ii
  and mi.t between :1 and :2 -- rd-DEPTH and rd
  and mi.mis_=m.IS_CURRENT
  and mi.mo_!=case when :3=0 then \o else 0 end
  and mi.mo_=mo.ii
  and mo.mp_=\p
  and mo.md_=md.ii
  and md.id=''TRAFIM30''
  and FIM0247 is not null
  and FIM0247 not in (select * from \eEL)
  \f; :4:=sql%rowcount;
end;' using rd-DEPTH, rd, e_, out eco; ec:=ec+eco;
  if ec>\F then :1:=ec; s.pd(ec_); return; end if; s.ps(ec_, ec); commit;
  execute immediate '
begin
  \i
  \s
    \k
  , ''(file.''||mi.id||'',T0019.''||T0019||'')''
  , \aTRAF30_11
  , -1 -- unsaveable - no reference in h.mi_
  from
    rtraf30_11 r
  , rtraf30_11h h
  , mi
  , mo
  , md
  where r.ii=h.r_
  and h.mi_=mi.ii
  and mi.t between :1 and :2 -- rd-DEPTH and rd
  and mi.mis_=m.IS_CURRENT
  and mi.mo_!=case when :3=0 then \o else 0 end
  and mi.mo_=mo.ii
  and mo.mp_=\p
  and mo.md_=md.ii
  and md.id=''TRAFIM30''
  and FIM0421 is not null
  and FIM0421 not in (select * from \eEC)
  \f; :4:=sql%rowcount;
end;' using rd-DEPTH, rd, e_, out eco; ec:=ec+eco;
  if ec>\F then :1:=ec; s.pd(ec_); return; end if; s.ps(ec_, ec); commit;
  execute immediate '
begin
  \i
  \s
    \k
  , ''(file.''||mi.id||'',T0019.''||T0019||'')''
  , \aTRAF30_11
  , -1 -- unsaveable - no reference in h.mi_
  from
    rtraf30_11 r
  , rtraf30_11h h
  , mi
  , mo
  , md
  where r.ii=h.r_
  and h.mi_=mi.ii
  and mi.t between :1 and :2 -- rd-DEPTH and rd
  and mi.mis_=m.IS_CURRENT
  and mi.mo_!=case when :3=0 then \o else 0 end
  and mi.mo_=mo.ii
  and mo.mp_=\p
  and mo.md_=md.ii
  and md.id=''TRAFIM30''
  and FIM0248 is not null
  and FIM0248||s.BS||FIM0249||s.BS||FIM0250 not in (select * from \eEP)
  \f; :4:=sql%rowcount;
end;' using rd-DEPTH, rd, e_, out eco; ec:=ec+eco; :1:=ec; s.pd(ec_);
end;

MKT20190101 TRAFIM30 000 0324
/*
KK101 Identifikační kód zadavatele (TRAF30_11.FIM0247, TRAF30_11.FIM0421,
TRAF30_11.FIM0248) ve výkazu TRAFIM30 musí být nalezen v rámci množiny osob
zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0002) v případě LEI kódu, oproti hodnotám údaje
(PERF30_11.RFD0003) v případě IČ nebo oproti hodnotám údaje
(PERF30_11.RFD0005) v případě identifikátoru FO. V případě použití
identifikátoru FO se dále musí shodovat použitý typ tohoto identifikátoru -
kontrola množiny hodnot údajů (TRAF30_11.FIM0249, TRAF30_11.FIM0250) oproti
množině hodnot údajů (PERF30_11.RFD0006, PERF30_11.RFD0007).
*/
declare
  DEPTH pls_integer:=s.pg('m.t30-waiting-time');
  e_ mi.e%type;
  ec pls_integer:=0; -- error count
  ec_ stp.id%type:='__\e.324.ec'; -- error count
  eco pls_integer; -- error count of one call
  rd date:=sysdate; -- reference date (time)
-- \#begin
  sn stp.id%type:='__\e.324.sn'; -- step No
  st varchar2(1000 byte); -- statement
  procedure p(sn_ char) is begin s.ps(sn, sn_); commit; end;
begin
  st:='
from
  rperf30_11 r
, rperf30_11h h
, mi
, mo
, md
where r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=''A'' --m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id=''PERFIM30''';
  if s.pg(sn, s.GC_NO) is null then
    if s.uox('\eEL')=s.GC_NO then s.ued('create table \eEL as
select distinct RFD0002 X'||st||' and RFD0002 is not null'); end if;
    if s.uox('\eEC')=s.GC_NO then s.ued('create table \eEC as
select distinct RFD0003 X'||st ||' and RFD0003 is not null'); end if;
    if s.uox('\eEP')=s.GC_NO then s.ued('create table \eEP as
select distinct RFD0005||chr(8)||RFD0006||chr(8)||RFD0007 X'||st||'
and RFD0005 is not null'); end if; p('0'); end if;
  st:='create unique index IX_';
  if s.pg(sn)='0' then
    if s.uox('IX_\eEL', s.GC_INDEX)=s.GC_NO then
      s.ued(st||'\eEL on \eEL (X)'); end if;
    if s.uox('IX_\eEC', s.GC_INDEX)=s.GC_NO then
      s.ued(st||'\eEC on \eEC (X)'); end if;
    if s.uox('IX_\eEP', s.GC_INDEX)=s.GC_NO then
      s.ued(st||'\eEP on \eEP (X)'); end if; p('1'); end if;
  if s.pg(sn)='1' then
    s.ugs('\eEL'); s.ugs('\eEC'); s.ugs('\eEP'); p('2'); end if; s.pd(sn);
-- \#end
  if s.pg(ec_, s.GC_NO) is not null then
    delete \e where mk_=\k; s.pd(ec_); commit; end if;
  select e into e_ from mi where ii=\u;
  if e_=0 then
    execute immediate '
begin
  \i
  \s
    \k
  , ''(T0019.''||T0019||'')''
  , \aTRAF30_11
  , T0019
  from
    \tTRAF30_11 a
  , (
      select FIM0247 from \tTRAF30_11 where FIM0247 is not null
      minus
      select * from \eEL
    ) d -- diff
  where a.FIM0247=d.FIM0247
  \f; :1:=sql%rowcount;
end;' using out eco; ec:=ec+eco;
    if ec>\F then :1:=ec; s.pd(ec_); return; end if; s.ps(ec_, ec); commit;
    execute immediate '
begin
  \i
  \s
    \k
  , ''(T0019.''||T0019||'')''
  , \aTRAF30_11
  , T0019
  from
    \tTRAF30_11 a
  , (
      select FIM0421 from \tTRAF30_11 where FIM0421 is not null
      minus
      select * from \eEC
    ) d -- diff
  where a.FIM0421=d.FIM0421
  \f; :1:=sql%rowcount;
end;' using out eco; ec:=ec+eco;
    if ec>\F then :1:=ec; s.pd(ec_); return; end if; s.ps(ec_, ec); commit;
    execute immediate '
begin
  \i
  \s
    \k
  , ''(T0019.''||T0019||'')''
  , \aTRAF30_11
  , T0019
  from
    \tTRAF30_11 a
  , (
      select FIM0248||s.BS||FIM0249||s.BS||FIM0250 x
      from \tTRAF30_11 where FIM0248 is not null
      minus
      select * from \eEP
    ) d -- diff
  where FIM0248||s.BS||FIM0249||s.BS||FIM0250=x
  \f; :1:=sql%rowcount;
end;' using out eco; ec:=ec+eco;
    if ec>\F then :1:=ec; s.pd(ec_); return; end if; s.ps(ec_, ec); commit;
  end if;

MKT20190101 TRAFIM30 000 0325
/*
KK102 Pokud se nejedná o převzetí koncového zákazníka
(TRAF30_11.FIM0253=false) pak Identifikační kód zákazníka
(TRAF30_11.FIM0303, TRAF30_11.FIM0422, TRAF30_11.FIM0304) ve výkazu TRAFIM30
musí být nalezen v rámci množiny osob zaslaných výkazem PERFIM30 - kontrola
oproti hodnotám údaje (PERF30_11.RFD0002) v případě LEI kódu, oproti
hodnotám údaje (PERF30_11.RFD0003) v případě IČ nebo oproti hodnotám údaje
(PERF30_11.RFD0005) v případě identifikátoru FO. V případě použití
identifikátoru FO se dále musí shodovat použitý typ tohoto identifikátoru
- kontrola množiny hodnot údajů (TRAF30_11.FIM0305, TRAF30_11.FIM0306)
oproti množině hodnot údajů (PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type; begin
  e:=m.gke('MKT20190101', 'TRAFIM30', '000', '0324', '00');
  e:=regexp_replace(e, '-- \\#begin.*\\#end', 'begin', 1, 1, 'n');
  e:=replace(e, 'FIM0247', 'FIM0303');
  e:=replace(e, 'FIM0303 is not null'
  , 'FIM0303 is not null and FIM0253=''''false''''');
  e:=replace(e, 'FIM0421', 'FIM0422');
  e:=replace(e, 'FIM0422 is not null'
  , 'FIM0422 is not null and FIM0253=''''false''''');
  e:=replace(e, 'FIM0248', 'FIM0304');
  e:=replace(e, 'FIM0304 is not null'
  , 'FIM0304 is not null and FIM0253=''''false''''');
  e:=replace(e, 'FIM0249', 'FIM0305');
  :1:=replace(e, 'FIM0250', 'FIM0306');
end;

MKT20190101 TRAFIM30 000 0325
/*
\#include
*/
declare e mk.e%type; begin
  e:=m.gke('MKT20190101', 'TRAFIM30', '000', '0324', '01');
  e:=replace(e, 'FIM0247', 'FIM0303');
  e:=replace(e, 'FIM0303 is not null'
  , 'FIM0303 is not null and FIM0253=''''false''''');
  e:=replace(e, 'FIM0421', 'FIM0422');
  e:=replace(e, 'FIM0422 is not null'
  , 'FIM0422 is not null and FIM0253=''''false''''');
  e:=replace(e, 'FIM0248', 'FIM0304');
  e:=replace(e, 'FIM0304 is not null'
  , 'FIM0304 is not null and FIM0253=''''false''''');
  e:=replace(e, 'FIM0249', 'FIM0305');
  :1:=replace(e, 'FIM0250', 'FIM0306');
end;

MKT20190101 TRAFIM30 000 0326
/*
KK103 Je-li ve výkazu TRAFIM30 Požadovaná protistrana identifikována pomocí
LEI kódu (TRAF30_11.FIM0264), IČ (TRAF30_11.FIM0423) nebo pomocí
identifikátoru FO (TRAF30_11.FIM0266), potom musí být nalezena v rámci
množiny osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0002) v případě LEI kódu, oproti hodnotám údaje
(PERF30_11.RFD0003) v případě IČ nebo oproti hodnotám údaje
(PERF30_11.RFD0005) v případě identifikátoru FO. V případě použití
identifikátoru FO se dále musí shodovat použitý typ tohoto identifikátoru
- kontrola množiny hodnot údajů (TRAF30_11.FIM0267, TRAF30_11.FIM0268)
oproti množině hodnot údajů (PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type; begin
  e:= m.gke('MKT20190101', 'TRAFIM30', '000', '0324', '00');
  e:=regexp_replace(e, '-- \\#begin.*\\#end', 'begin', 1, 1, 'n');
  e:=replace(e, 'FIM0247', 'FIM0264');
  e:=replace(e, 'FIM0421', 'FIM0423');
  e:=replace(e, 'FIM0248', 'FIM0266');
  e:=replace(e, 'FIM0249', 'FIM0267');
  :1:=replace(e, 'FIM0250', 'FIM0268');
end;

MKT20190101 TRAFIM30 000 0326
/*
\#include
*/
declare e mk.e%type; begin
  e:=m.gke('MKT20190101', 'TRAFIM30', '000', '0324', '01');
  e:=replace(e, 'FIM0247', 'FIM0264');
  e:=replace(e, 'FIM0421', 'FIM0423');
  e:=replace(e, 'FIM0248', 'FIM0266');
  e:=replace(e, 'FIM0249', 'FIM0267');
  :1:=replace(e, 'FIM0250', 'FIM0268');
end;

MKT20190101 TRAFIM30 000 0327
/*
KK104 Je-li vyplněný Identifikační kód osoby přijímající pokyn v rámci
podniku (TRAF30_11.FIM0281), potom musí být nalezen v rámci množiny osob
zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0005) - a zároveň se musí shodovat použitý typ identifikátoru
- kontrola množiny hodnot údajů (TRAF30_11.FIM0282, TRAF30_11.FIM0283)
oproti množině hodnot údajů (PERF30_11.RFD0006, PERF30_11.RFD0007).
*/
declare
  DEPTH pls_integer:=s.pg('m.t30-waiting-time');
  e_ mi.e%type;
  ec pls_integer:=0; -- error count
  ec_ stp.id%type:='__\e.327.ec'; -- error count
  rd date:=sysdate; -- reference date (time)
begin
  if s.pg(ec_, s.GC_NO) is not null then
    delete \e where mk_=\k; s.pd(ec_); commit; end if;
  select e into e_ from mi where ii=\u;
  if e_=0 then
    \i
    \s
      \k
    , '(T0019.'||T0019||')'
    , \aTRAF30_11
    , T0019
    from
      \tTRAF30_11 a
    , (
        select FIM0281||s.BS||FIM0282||s.BS||FIM0283 x
        from \tTRAF30_11 where FIM0281 is not null
        minus
        select * from \eEP
      ) d -- diff
    where FIM0281||s.BS||FIM0282||s.BS||FIM0283=x
    \f; ec:=ec+sql%rowcount;
    if ec>\F then :1:=ec; s.pd(ec_); return; end if; s.ps(ec_, ec); commit;
  end if;
  \i
  \s
    \k
  , '(file.'||mi.id||',T0019.'||T0019||')'
  , \aTRAF30_11
  , -1 -- unsaveable - no reference in h.mi_
  from
    rtraf30_11 r
  , rtraf30_11h h
  , mi
  , mo
  , md
  where r.ii=h.r_
  and h.mi_=mi.ii
  and mi.t between rd-DEPTH and rd
  and mi.mis_=m.IS_CURRENT
  and mi.mo_!=case when e_=0 then \o else 0 end
  and mi.mo_=mo.ii
  and mo.mp_=\p
  and mo.md_=md.ii
  and md.id='TRAFIM30'
  and FIM0281 is not null
  and FIM0281||s.BS||FIM0282||s.BS||FIM0283 not in (select * from \eEP)
  \f; :1:=ec+sql%rowcount; s.pd(ec_);
end;

MKT20190101 TRAFIM30 000 0328
/*
KK105 Je-li vyplněný Identifikační kód osoby odpovědné za provedení pokynu
v rámci podniku (TRAF30_11.FIM0284), potom musí být nalezen v rámci množiny
osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0005) - a zároveň se musí shodovat použitý typ identifikátoru
- kontrola množiny hodnot údajů (TRAF30_11.FIM0285, TRAF30_11.FIM0286)
oproti množině hodnot údajů (PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type; begin
  e:=m.gke('MKT20190101', 'TRAFIM30', '000', '0327', '00');
  e:=replace(e, 'FIM0281', 'FIM0284');
  e:=replace(e, 'FIM0282', 'FIM0285');
  :1:=replace(e, 'FIM0283', 'FIM0286');
end;

MKT20190101 TRAFIM30 000 0329
/*
KK106 Je-li vyplněný Identifikační kód osoby činící investiční rozhodnutí v
rámci podniku (TRAF30_11.FIM0313), potom musí být nalezen v rámci množiny
osob zaslaných výkazem PERFIM30 - kontrola oproti hodnotám údaje
(PERF30_11.RFD0005) a zároveň se musí shodovat použitý typ identifikátoru
- kontrola množiny hodnot údajů (TRAF30_11.FIM0314, TRAF30_11.FIM0315)
oproti množině hodnot údajů (PERF30_11.RFD0006, PERF30_11.RFD0007).
\#include
*/
declare e mk.e%type; begin
  e:=m.gke('MKT20190101', 'TRAFIM30', '000', '0327', '00');
  e:=replace(e, 'FIM0281', 'FIM0313');
  e:=replace(e, 'FIM0282', 'FIM0314');
  :1:=replace(e, 'FIM0283', 'FIM0315');
end;

MKT20190101 TRAFIM30 000 0330
/*
KK107 Identifikace subjektu, kterému byl pokyn předán (TRAF30_32.FIM0296)
musí být nalezen v rámci množiny subjektů zaslaných výkazem PERFIM30 -
kontrola oproti hodnotám údaje PERF30_11.RFD0002.
*/
declare
  DEPTH pls_integer:=s.pg('m.t30-waiting-time');
  e_ mi.e%type;
  ec pls_integer:=0; -- error count
  ec_ stp.id%type:='__\e.330.ec'; -- error count
  rd date:=sysdate; -- reference date (time)
begin
  if s.pg(ec_, s.GC_NO) is not null then
    delete \e where mk_=\k; s.pd(ec_); commit; end if;
  select e into e_ from mi where ii=\u;
  if e_=0 then
    \i
    \s
      \k
    , '(T0019.'||T0019||')'
    , \aTRAF30_32
    , T0019
    from
      \tTRAF30_32 a
    , (
        select FIM0296
        from \tTRAF30_32 where FIM0296 is not null
        minus
        select * from \eEL
      ) d -- diff
    where a.FIM0296=d.FIM0296
    \f; ec:=ec+sql%rowcount;
    if ec>\F then :1:=ec; s.pd(ec_); return; end if; s.ps(ec_, ec); commit;
  end if;
  \i
  \s
    \k
  , '(file.'||mi.id||',T0019.'||T0019||')'
  , \aTRAF30_32
  , -1 -- unsaveable - no reference in h.mi_
  from
    rtraf30_32 r
  , rtraf30_32h h
  , mi
  , mo
  , md
  where r.ii=h.r_
  and h.mi_=mi.ii
  and mi.t between rd-DEPTH and rd
  and mi.mis_=m.IS_CURRENT
  and mi.mo_!=case when e_=0 then \o else 0 end
  and mi.mo_=mo.ii
  and mo.mp_=\p
  and mo.md_=md.ii
  and md.id='TRAFIM30'
  and FIM0296 is not null
  and FIM0296 not in (select * from \eEL)
  \f; :1:=ec+sql%rowcount; s.pd(ec_);
end;

MKT20190101 TRAFIM30 000 0331
/*
KK101 Množina hodnot údajů Identifikace investičního nástroje
(TRAF30_11.FIM0255, TRAF30_11.FIM0307, TRAF30_11.FIM0308, TRAF30_11.FIM0309)
musí být nalezena v rámci množiny nástrojů zaslaných výkazem REFFIM10 -
kontrola oproti množině hodnot údajů (REFF10_11.RFD0033, REFF10_11.RFD0034,
REFF10_11.RFD0035, REFF10_11.RFD0036).
*/
declare
  DEPTH pls_integer:=s.pg('m.t30-waiting-time');
  e_ mi.e%type;
  ec pls_integer:=0; -- error count
  ec_ stp.id%type:='__\e.331.ec'; -- error count
  eco pls_integer; -- error count of one call
  rd date:=sysdate; -- reference date (time)
  sn stp.id%type:='__\e.331.sn'; -- step No
  st varchar2(1000 byte); -- statement
  procedure p(sn_ char) is begin s.ps(sn, sn_); commit; end;
begin
  if s.pg(sn, s.GC_NO) is null then st:='drop table ';
    if s.uox('\eEL')=s.GC_YES then s.ued(st||'\eEL'); end if;
    if s.uox('\eEC')=s.GC_YES then s.ued(st||'\eEC'); end if;
    if s.uox('\eEP')=s.GC_YES then s.ued(st||'\eEP'); end if;
    p('0'); end if;
  if s.pg(sn)='0' then st:='
from
  rreff10_11 r
, rreff10_11h h
, mi
, mo
, md
where r.ii=h.r_
and h.mi_=mi.ii
and mi.mis_=''A'' --m.IS_CURRENT
and mi.mo_=mo.ii
and mo.mp_=\p
and mo.md_=md.ii
and md.id=''REFFIM10''';
    for i in 3..6 loop if s.uox('\eER'||i)=s.GC_NO then s.ued('
create table \eER'||i||' as select distinct RFD003'||i||' X'||st
||' and RFD003'||i||' is not null'); end if; end loop; p('1'); end if;
  if s.pg(sn)='1' then st:='create unique index IX_';
    for i in 3..6 loop if s.uox('IX_\eER'||i, s.GC_INDEX)=s.GC_NO then
        s.ued(st||'\eER'||i||' on \eER'||i||' (X)'); end if; end loop;
    p('2'); end if;
  if s.pg(sn)='2' then for i in 3..6 loop s.ugs('\eER'||i); end loop;
    p('3'); end if;
  if s.pg(sn)='3' then
    if s.pg(ec_, s.GC_NO) is not null then
      delete \e where mk_=\k; s.pd(ec_); commit; end if;
    select e into e_ from mi where ii=\u;
    if e_=0 then st:='
begin
  \i
  \s
    \k
  , ''(T0019.''||T0019||'')''
  , \aTRAF30_11
  , T0019
  from
    \tTRAF30_11 a
  , (
      select FIM0\$1 from \tTRAF30_11 where FIM0\$1 is not null
      minus
      select * from \eER\$2
    ) d -- diff
  where a.FIM0\$1=d.FIM0\$1
  \f; :1:=sql%rowcount;
end;';
      for i in 3..6 loop execute immediate replace(replace(st, '\$1'
          , case i when 3 then '255' when 4 then '307'
            when 5 then '308' when 6 then '309' end), '\$2', i)
        using out eco; ec:=ec+eco; s.ps(ec_, ec); commit;
        exit when ec>\F; end loop; end if;
    if ec<\F then st:='
begin
  \i
  \s
    \k
  , ''(file.''||mi.id||'',T0019.''||T0019||'')''
  , \aTRAF30_11
  , -1 -- unsaveable - no reference in h.mi_
  from
    rtraf30_11 r
  , rtraf30_11h h
  , mi
  , mo
  , md
  where r.ii=h.r_
  and h.mi_=mi.ii
  and mi.t between :1 and :2 -- rd-DEPTH and rd
  and mi.mis_=m.IS_CURRENT
  and mi.mo_!=case when :3=0 then \o else 0 end
  and mi.mo_=mo.ii
  and mo.mp_=\p
  and mo.md_=md.ii
  and md.id=''TRAFIM30''
  and FIM0\$1 is not null
  and FIM0\$1 not in (select * from \eER\$2)
  \f; :4:=sql%rowcount;
end;';
      for i in 3..6 loop execute immediate replace(replace(st, '\$1'
          , case i when 3 then '255' when 4 then '307'
            when 5 then '308' when 6 then '309' end), '\$2', i)
        using rd-DEPTH, rd, e_, out eco; ec:=ec+eco; s.ps(ec_, ec); commit;
        exit when ec>\F; end loop; end if;
    p('4'); end if;
  if s.pg(sn)='4' then for i in 3..6 loop
      if s.uox('\eER'||i)=s.GC_YES then s.ued('drop table \eER'||i); end if;
    end loop; :1:=s.pg(ec_); s.pd(ec_); s.pd(sn); end if;
  /* commit/rollback will be executed by caller */
end;