;6.8.2002
Name('Analýza zůstatku účtu 2')                ; pod tímto názvem bude sestava v menu
Designed('Denman')                ; sestava bude dostupná z okna Skl_Man#1
Author('Winduo Team','EMail: winduo@winduo.cz','http://www.winduo.com','http://www.winduo.cz')  ;informace o autorovi
Descr('Vypíše doklady tvořící zůstatek účtu','Změna třídění - Ne','Filtr - Ano')  ;popis sestavy, tento text bude v bublince
WNSType(1);
NewWNS('ZustUct.WNS','Analýza zůstatku účtu 2')

Procedure ZjistiUhraduVAgende(Vysledek:String,Agenda:Byte,Cislo:LongInt,Datum:Word,AgendaName:String);
  ;vyscita v agende soucet plateb jedne faktury k datu, ktere maji sledovany ucet a ICO
  KeyName:String='Key'+AgendaName+'9';
  SubName:String=KeyName+'.Length';
  UhrVeta:LongInt;
  @SubName=5;
  AgdName:String=KeyName+'.SAgd';
  @Agdname=Agenda;
  CisloName:String=KeyName+'.SCislo';
  @CisloName=SwapL(Cislo);
  CastkaName:String=AgendaName+'.Castka'
  DatumName:String=AgendaName+'.Datum'
  VydajName:String=AgendaName+'.Vydaj'
  IntCisloName:String=AgendaName+'.Cislo'
  if(FindKey(@KeyName,UhrVeta))
    begin
    DalsiVeta:
      debug ;1
      ReadRec(@AgendaName,UhrVeta);
      if(@DatumName<=Datum)
        begin
          KeyDenik7.Length=4
          KeyDenik7.Cislo=Swapl(@IntCisloName)
          LocB=SearchKey(KeyDenik7,VetaD4) ;vyhledá první větu se shodným interním číslem
      debug ;2
          ReadRec(Denik,VetaD4)
          if((InFilter(Denik))and(Denik.Datum<=DatumD))        ; dotaz, zda věta prošla filtrem
            begin
              ;toto interní číslo dosud není zaznamenáno, poznacit,
              ;aby se mohlo v pripade rovnosti castek zapsat do seznamu
              ;analyzovanych a (ne)tisknout
              ;AddKey(IntCislaP,VetaD4)  ;zapise udaje do docasneho indexoveho souboru
              if(PocetPlateb<MaxPocetPlateb)
                begin
                  Inc(PocetPlateb)
                  Platby[PocetPlateb].Ico=Denik.Ico
                  Platby[PocetPlateb].Cislo=Denik.Cislo
                end else
                begin
                  Halt('Příliš mnoho plateb '+Str(PocetPlateb))
                end
            end
          if(Agenda=2) ;pohledavka
            begin
              ;zjistit, zda je rozkont platby na sledovanem uctu
              While(Denik.Cislo=@IntCisloName) ; cyklus pres rozkont jedne platby
                begin
                  ;dořešit, ať testuje správnou stranu a asi nemusi koukat na VydajName
                  if((Denik.Ico=Ico)and(Denik.DalSU=UcetSU)and(Denik.DalAU=UcetAU)and(InFilter(Denik))and(Denik.Datum<=DatumD))
                    begin
                      if(@VydajName)
                        @vysledek=@vysledek-Denik.Castka
                      else
                        @vysledek=@vysledek+Denik.Castka
                    end
                  LocB=NextKey(KeyDenik7,VetaD4)
      debug ;3
                  ReadRec(Denik,VetaD4)
                end
            end;
          if(Agenda=3)  ;zavazek
            begin
              ;zjistit, zda je rozkont platby na sledovanem uctu
              While(Denik.Cislo=@IntCisloName) ; cyklus pres rozkont jedne platby
                begin
                  ;dořešit, ať testuje správnou stranu a asi nemusi koukat na VydajName
                  if((Denik.Ico=Ico)and(Denik.MdSU=UcetSU)and(Denik.MdAU=UcetAU)and(InFilter(Denik))and(Denik.Datum<=DatumD))
                    begin
                      if(@VydajName)
                        @vysledek=@vysledek+Denik.Castka
                      else
                        @vysledek=@vysledek-Denik.Castka
                    end
                  LocB=NextKey(KeyDenik7,VetaD4)
      debug ;4
                  ReadRec(Denik,VetaD4)
                end
            end;
        end;
      if(NextKey(@KeyName,UhrVeta))
        begin
          if(@CisloName=SwapL(Cislo))
            begin
              if(@AgdName=Agenda)
                GoTo(DalsiVeta);
            end;
        end;
    end;
end;

Procedure ZjistiUhradu(Vysledek:String,Agenda:Byte,Cislo:LongInt,Datum:Word);
  @vysledek=0
  PocetPlateb=0
  ZjistiUhraduVAgende(Vysledek,Agenda,Cislo,Datum,'Pokladna');
  ZjistiUhraduVAgende(Vysledek,Agenda,Cislo,Datum,'Banka');
  ZjistiUhraduVAgende(Vysledek,Agenda,Cislo,Datum,'OstatniUhrady');
end;


Procedure StejneCastky(Prvni:Real,Druha:Real,Volani:Byte);
  beru=False
  ;volani=1 - prvni cyklus, musi z pole Platby[] precist hodnoty, prevest do IntCislaTisk
  ;volani=2 - rezerva :-)
  ;volani=3 - treti cyklus, uz to ma v IntCisla, takze jenom do IntCislaTisk
  if(volani=1) ;závazky a pohledávky
     begin
       if((RoundFloat(Prvni,-2)=RoundFloat(Druha,-2))and(RoundFloat(Prvni,-2)<>0))
         begin
           IntCislaTisk=IntCisla    ;poznačí si interní číslo závazku/pohledávky
           LocB=FindKey(IntCislaTisk,VetaD1)    ;vyhledá první větu
           if(LocB=False)
              begin
                LocW=1
                JeTam=False
                While(LocW<=PocetPlateb)
                  begin
                    IntCislaTisk.Length=8
                    IntCislaTisk.Cislo=Swapl(Platby[LocW].Cislo)
                    IntCislaTisk.ICO=Swapl(Platby[LocW].ICO)
                    LocB=FindKey(IntCislaTisk,VetaD1)    ;vyhledá první větu
                    if(LocB=True)
                       JeTam=True
                    Inc(LocW)
                  end
                if(JeTam=False)
                  begin
                    IntCislaTisk=IntCisla    ;poznačí si interní číslo závazku/pohledávky
                    AddKey(IntCislaTisk,PorCislo)
                    ;prevod pole=int.čísla plateb do IntCislaTisk:
                    LocW=1
                    While(LocW<=PocetPlateb)
                      begin
                        IntCislaTisk.Length=8
                        IntCislaTisk.Cislo=Swapl(Platby[LocW].Cislo)
                        IntCislaTisk.ICO=Swapl(Platby[LocW].ICO)
                        AddKey(IntCislaTisk,PorCislo)
                        Inc(LocW)
                      end
                    Sparoval=True
                    Inc(PorCislo)
                  end
              end
         end
     end

  ;if(volani=2)

  if(volani=3)
    begin
      if((RoundFloat(Prvni,-2)=RoundFloat(Druha,-2))and(RoundFloat(Prvni,-2)<>0))
      begin
        if((IntCisla2.ICO<>0)or((ParujNulIco=True)and(IntCisla2.ICO=0)))
          begin
            ;veta, ktera je na Dal a ma zrcadlo, poznacit si ji i s poradovym cislem i se zrcadlem do docasneho souboru
            ;zjistit, jestli už tam některa z tech dvou není sparovana dřive:
            IntCislaTisk=IntCisla
            LocB=FindKey(IntCislaTisk,VetaD1)    ;vyhledá první větu
            if(LocB=False)
               begin
                 IntCislaTisk.Length=8
                 IntCislaTisk.Cislo=IntCisla2.Cislo
                 IntCislaTisk.ICO=IntCisla2.ICO
                 LocB=FindKey(IntCislaTisk,VetaD1)    ;vyhledá první větu
                 if(LocB=False)
                   begin  ;nenasel ani jednu z páru
                     AddKey(IntCislaTisk,PorCislo)
                     IntCislaTisk=IntCisla
                     AddKey(IntCislaTisk,PorCislo)
                     Nasel=True
                     Sparoval=True
                     Inc(PorCislo)
                   end
               end
          end
      end
    end
end;









ValidCislo:String='0123456789'
VetaD1:LongInt
VetaD2:LongInt
VetaD3:LongInt
VetaD4:LongInt
VetaTemp:LongInt
VetaZ:LongInt
VetaA:LongInt
Pozice:LongInt
Beru:Boolean
LocB:Boolean
DatumD:Word
SUcetSU:String
SUcetAU:String
UcetSU:Word
UcetAU:Word
ProtiUcetSU:Word
ProtiUcetAU:Word
Tisk1:Boolean=True
Tisk2:Boolean=False
TiskTyp:Byte
TiskZust:String
ICislo:LongInt
ICislo2:LongInt
Castka:Real
Castka2:Real
TypUctu:byte           ;{0=ostatni,1=pasivni,2-aktivni}
Zustatek:Real
ICO:LongInt
Nasel:Boolean
Sparoval:Boolean
Znacka:String
CastkaMD:String
CastkaDal:String
PorCislo:LongInt=1
SIco:String
SFirma:String
Agenda:Byte
LocW:Word
Kniha:String
KnihaS:String
KnihaSAgd:String
KnihaKlic:String
KnihaKlicL:String
KnihaKlicC:String
ParujNulIco:Boolean=False
JeTam:Boolean=False
TypUctuText:String
SumaMD:Real
SumaDal:Real

DeclareRec('Program')
DeclareRec('Denik')
DeclareRec('Adresar')
DeclareRec('Zavazek')
DeclareRec('Pohledavka')
DeclareRec('KeyDenik1')         ; přiřazení a definice třídícího klíče pro tisk
DeclareRec('KeyDenik4')         ; přiřazení a definice třídícího klíče pro cyklus pres Dal
DeclareRec('KeyDenik5')         ; přiřazení a definice třídícího klíče pro dohledani pres MD
DeclareRec('KeyDenik7')         ; přiřazení a definice třídícího klíče pro identifikaci podle Int.cisla
DeclareRec('KeyAdresar1')
DeclareRec('KeyZavazek8')
DeclareRec('KeyPohledavka8')
ClearKey(KeyDenik1)             ; resetuje ukazatel aktuální věry v souboru
ClearKey(KeyDenik4)             ; resetuje ukazatel aktuální věry v souboru
ClearKey(KeyDenik5)             ; resetuje ukazatel aktuální věry v souboru
ClearKey(KeyDenik7)             ; resetuje ukazatel aktuální věry v souboru
ClearKey(KeyAdresar1)             ; resetuje ukazatel aktuální věry v souboru
ClearKey(KeyZavazek8)             ; resetuje ukazatel aktuální věry v souboru
ClearKey(KeyPohledavka8)             ; resetuje ukazatel aktuální věry v souboru
DeclareRec('Pokladna');
DeclareRec('KeyPokladna7');
DeclareRec('KeyPokladna9');
DeclareRec('Banka');
DeclareRec('KeyBanka7');
DeclareRec('KeyBanka9');
DeclareRec('OstatniUhrady');
DeclareRec('KeyOstatniUhrady7');
DeclareRec('KeyOstatniUhrady9');

Record TempIntCisla   ;definuje strukturu noveho indexoveho souboru
  Length:Byte;
  Cislo      :LongInt;
  ICO        :LongInt;
end;
IntCisla:TempIntCisla
;MakeTempFile(,IntCisla,True)  ; zalozi novy docasny indexovany soubor
MakeTempFile(,IntCisla,False)  ; zalozi novy docasny indexovany soubor

Record ArrIntCisla   ;definuje strukturu, ktera se pouzije pro Array
  Cislo      :LongInt;
  ICO        :LongInt;
end;
MaxPocetPlateb:Word=65448/SizeOf(ArrIntCisla);
Platby:Array[1..MaxPocetPlateb] of ArrIntCisla
PocetPlateb:Word

IntCislaP:TempIntCisla
MakeTempFile(,IntCislaP,False)  ; zalozi novy docasny indexovany soubor z plateb

Record TempIntCisla2   ;definuje strukturu noveho indexoveho souboru
  Length:Byte;
  Cislo      :LongInt;
  CisloProti :LongInt;
  ICO        :LongInt;
  ICOProti   :LongInt;
end;
IntCisla2:TempIntCisla2
MakeTempFile(,IntCisla2,False)  ; zalozi novy docasny indexovany soubor

Record TempIntCislaTisk   ;definuje strukturu noveho indexoveho souboru
  Length:Byte;
  Cislo :LongInt;
  ICO   :LongInt;
end;
IntCislaTisk:TempIntCislaTisk
MakeTempFile(,IntCislaTisk,False)  ; zalozi novy docasny indexovany soubor, ktery obsahuje int. cisla zrcadlovych


;DlgFollowMouse(True)
;{definice uvodni vysvetlivky:}
DefDialog('Zůstatek saldokontního účtu',462,264)
DlgShade(-1,'',4,27,453,164)
DlgStatic(-1,' Upozornění ',3,5,84)

DlgStatic(-1,'Sestava vypíše ty doklady, které mají vliv na konečný zůstatek účtu.',10,30,445)
DlgStatic(-1,'Slouží k sestavení dokladové inventury zůstatku na saldokontním',10,46,440)
DlgStatic(-1,'účtu. Vhodné např. pro účty záloh, kdy máte v evidenci zaplacení',10,62,440)
DlgStatic(-1,'zálohy (např. pokladnou) a (nezávisle) na tom pak doúčtování této',10,78,440)
DlgStatic(-1,'zálohy,nebo pro závazky,pohledávky.Doklady musí mít stejné IČO.',10,94,440)

DlgStatic(-1,'Program dopárovává vždy jeden doklad s několika dalšími, nelze',10,115,440)
DlgStatic(-1,'např. dva závazky se třemi platbami',10,131,440)

DlgStatic(-1,'Není vhodné pro účty typu Pokladna, Bankovní účet, nákladové a',10,150,440)
DlgStatic(-1,'výnosové účty ...',10,166,440)

DlgButton(id_OK,'OK',290,196);
DlgOnLineHelp(id_OK,'Pokračuje ve zpracování')
DlgButton(id_Cancel,'Zpět',373,196);
DlgOnLineHelp(id_Cancel,'Ukončí bez zpracování')


if(DlgExecute(True)<>ID_OK)
  Halt


;{definice dalsího dialogu}
DefDialog('Zůstatek účtu',462,224)
DlgShade(-1,'',4,27,453,124)
DlgStatic(-1,' Volba údajů ',3,5,84)

DlgStatic(-1,'&Datum, ke kterému chcete vypsat doklady',10,30,285)
DlgEditDate(101,DatumD,300,28,80)
DlgOnLineHelp(101,'Datum, ke kterému budou vypsány doklady'+#13+'tvořící zůstatek na účtu')

DlgStatic(-1,'&Číslo účtu',10,54,70)
DlgEdit(102,SUcetSU,85,52,36,22,3,,ValidCislo)
DlgOnLineHelp(102,'Sledovaný účet - SÚ')
DlgStatic(-1,'/',122,54,8)
DlgEdit(103,SUcetAU,127,52,36,22,3,,ValidCislo)
DlgOnLineHelp(103,'Sledovaný účet - AÚ')


DlgStatic(-1,'Sestava vypíše deník účtu. Dvojice či skupiny dokladů, které tvoří',10,76,445)
DlgStatic(-1,'kombinaci na MD a Dal se stejnou částkou a IČO:',10,92,440)
DlgRadioButton(120,Tisk1,12,108,142,,'nebudou vytištěny',120,121)
DlgOnLineHelp(120,'Dvojice dokladů se shodným IČO, částkou a zrcadlovým zaúčtováním nebudou tištěny')
DlgRadioButton(121,Tisk2,170,108,220,,'budou vytištěny a očíslovány',120,121)
DlgOnLineHelp(121,'Skupiny dokladů se shodným IČO, částkou a zrcadlovým zaúčtováním budou tištěny'+#13+'Každá dvojice bude pro lepší kontrolu očíslována (ty, které patří k sobě, budou mít stejné číslo)')

DlgCheckBox(130,ParujNulIco,10,128,260,,'párovat případy s nevyplněným IČO')
DlgOnLineHelp(130,'Budou-li nalezeny zrcadlové účetní případy, u nichž není (v obou případech) vyplněno IČO, budou/nebudou spolu spárovány')




DlgButton(id_OK,'OK',290,156);
DlgOnLineHelp(id_OK,'Pokračuje ve zpracování')
DlgButton(id_Cancel,'Zpět',373,156);
DlgOnLineHelp(id_Cancel,'Ukončí bez zpracování')


if(DlgExecute(True)<>ID_OK)
  Halt


if(Tisk1)
  TiskTyp=1
if(Tisk2)
  TiskTyp=2


if(TiskTyp=1)  ;netiskne krizove
  begin
    SetColumn(0,ta_Right,8);
    SetColumn(1,ta_Left,4);
    SetColumn(2,ta_Left,8);
    SetColumn(3,ta_Left,30,pf_FatPen);
    SetColumn(4,ta_Left,8);
    SetColumn(5,ta_Left,35);
    SetColumn(6,ta_Left,6);
    SetColumn(7,ta_Left,6);
    SetColumn(8,ta_Right,13);
    SetColumn(9,ta_Right,13);
    SetColumn(10,ta_Right,13);
    SetHead('Datum\tObd.\tDoklad\tPopis\tIČO\tFirma\tÚč.MD\tÚč.Dal\tČástka MD\tČástka Dal\tZůstatek');
  end
if(TiskTyp=2)  ;tiskne i křížové
  begin
    SetColumn(0,ta_Right,3);
    SetColumn(1,ta_Right,8);
    SetColumn(2,ta_Left,4);
    SetColumn(3,ta_Left,8);
    SetColumn(4,ta_Left,30,pf_FatPen);
    SetColumn(5,ta_Left,8);
    SetColumn(6,ta_Left,35);
    SetColumn(7,ta_Left,6);
    SetColumn(8,ta_Left,6);
    SetColumn(9,ta_Right,13);
    SetColumn(10,ta_Right,13);
    SetColumn(11,ta_Right,13);
    SetHead('Čís.\tDatum\tObd.\tDoklad\tPopis\tIČO\tFirma\tÚč.MD\tÚč.Dal\tČástka MD\tČástka Dal\tZůstatek');
  end

;vyhledání názvu účtu a AktPas
DeclareRec('UcetniRozvrh')
DeclareRec('KeyUcetniRozvrh1')
VetaUR:LongInt
UcetSU=Val(SUcetSU)
UcetAU=Val(SUcetAU)
;číslo účtu v účetním kódu
KeyUcetniRozvrh1.Length=4
KeyUcetniRozvrh1.SU=Swap(ucetSU)
KeyUcetniRozvrh1.AU=Swap(ucetAU)

ClearKey(KeyUcetniRozvrh1)
TypUctuText=''
if(FindKey(KeyUcetniRozvrh1,VetaUR))
  begin
    ReadRec(UcetniRozvrh,VetaUR)
    TypUctu=UcetniRozvrh.Typ           ;{0=ostatni,1=pasivni,2-aktivni}
    if(TypUctu=1)
       TypUctuText=' (pasivní)'
    if(TypUctu=2)
       TypUctuText=' (aktivní)'
  end else
  begin
    ClearRec(UcetniRozvrh)
  end


SetDescr(0,0,TA_Right|descr_PageNum,'Strana: ');
if(UcetAU=0)
    SetDescr(1,0,TA_Center,'Zůstatek účtu '+NULL(UcetSU,3)+' '+UcetniRozvrh.Nazev+TypUctuText+' k datu '+StrDate(DatumD));
  else
    SetDescr(1,0,TA_Center,'Zůstatek účtu '+NULL(UcetSU,3)+'/'+NULL(UcetAU,3)+' '+UcetniRozvrh.Nazev+TypUctuText+' k datu '+StrDate(DatumD));
SetDescr(2,0,TA_Left|descr_Date,'Datum: ');
SetDescr(3,1,TA_Left|descr_UserDescr,''); pokud je pouzit descr_UserDescr, tak si program vyzada dodatecny popis
if(IsFilter(Denik))             ; dotaz, zda je aktivní filtr do sestav
  begin
    SetDescr(4,1,TA_Right,'Aktívní filtr');
  end

;nastavení proměnných:
if(TypUctu=1)    ;pasivní
  begin
    HlavniStrana:String='Dal'
    PrvniKlic:String='KeyDenik4'        ;dal
    PrvniKlicL:String='KeyDenik4.Length'
    PrvniKlicSU:String='KeyDenik4.dSU'
    PrvniKlicAU:String='KeyDenik4.dAU'
    PrvniSU:String='Denik.DalSU'
    PrvniAU:String='Denik.DalAU'
    DruhyKlic:String='KeyDenik5'        ;MD
    DruhyKlicL:String='KeyDenik5.Length'
    DruhyKlicSU:String='KeyDenik5.MdSU'
    DruhyKlicAU:String='KeyDenik5.MdAU'
    DruhySU:String='Denik.MdSU'
    DruhyAU:String='Denik.MdAU'
  end else       ;aktivní a ostatní
  begin
    HlavniStrana:String='Má dáti'
    PrvniKlic:String='KeyDenik5'        ;MD
    PrvniKlicL:String='KeyDenik5.Length'
    PrvniKlicSU:String='KeyDenik5.MdSU'
    PrvniKlicAU:String='KeyDenik5.MdAU'
    PrvniSU:String='Denik.MdSU'
    PrvniAU:String='Denik.MdAU'
    DruhyKlic:String='KeyDenik4'        ;Dal
    DruhyKlicL:String='KeyDenik4.Length'
    DruhyKlicSU:String='KeyDenik4.dSU'
    DruhyKlicAU:String='KeyDenik4.dAU'
    DruhySU:String='Denik.DalSU'
    DruhyAU:String='Denik.DalAU'
  end

InitStatus(UsedKeys(@PrvniKlic),'K dokladům s účtem '+HlavniStrana+' '+NULL(UcetSU,3)+'/'+NULL(UcetAU,3),'hledám zrcadlové záznamy')

@PrvniKlicL=4
@PrvniKlicSU=Swap(ucetSU)
@PrvniKlicAU=Swap(ucetAU)
LocB=SearchKey(@PrvniKlic,VetaD1)    ;vyhledá první větu
;cyklus, dokud je shodné číslo účtu na straně HlavniStrana
While((VetaD1<>0)and(@PrvniKlicSU=Swap(ucetSU))and(@PrvniKlicAU=Swap(ucetAU)))
  begin
    Sparoval=False
      debug ;5
    ReadRec(Denik,VetaD1)
    if((InFilter(Denik))and(Denik.Datum<=DatumD))        ; dotaz, zda věta prošla filtrem
      begin
        beru=True
        if(Denik.Agenda=4)  ;pokladna
          Kniha='Pokladna'
        if(Denik.Agenda=5)  ;banka
          Kniha='Banka'
        if(Denik.Agenda=6)  ;ostatni uhrady
          Kniha='OstatniUhrady'

        if((Denik.Agenda=4)or(Denik.Agenda=5)or(Denik.Agenda=6))  ;pokladna,banka,ostatni uhrady
           begin
             ;kdyz je to platba, tak zjistit, zda je spárovaná. Je-li spárovaná,
             ;neřešit, ono se to dohledá při analýze závazku/pohledávky
             ;není-li spárovaná, půjde dále standardním postupem
             KnihaKlic='Key'+Kniha+'7'
             KnihaKlicL=KnihaKlic+'.Length'
             KnihaKlicC=KnihaKlic+'.Cislo'
             KnihaS=Kniha+'.SCislo'
             KnihaSAgd=Kniha+'.SAgd'
             @KnihaKlicL=4
             @KnihaKlicC=Swapl(Denik.Cislo)
             LocB=SearchKey(@KnihaKlic,VetaTemp)
      debug ;6
             ReadRec(@Kniha,VetaTemp)
             if(@KnihaS<>0)  ;je sparovana
               begin
                 if(@KnihaSAgd=3)  ;související je závazek
                   begin
                    if(TypUctu=1)  ;není pasivní
                      begin
                        ;v platbě testuji stranu=Dal, nepatří k sobě
                        ;musim tedy testovat
                        beru=True
                      end else
                      begin
                        ;v platbě testuji stranu=MD, patří k sobě
                        ;budu testovat až se závazkem
                        beru=False
                      end
                   end else
                   begin   ;souvisejici je pohledavka
                    if(TypUctu<>1)
                      begin
                        ;v platbě testuji stranu=MD, nepatří k sobě
                        ;musim tedy testovat
                        beru=True
                      end else
                      begin
                        ;v platbě testuji stranu=Dal, patří k sobě
                        ;budu testovat až s pohledavkou
                        beru=False
                      end
                   end
               end else
               begin
                 ;neni sparovana, testuji
                  beru=true
               end
           end


        beru=true   ;vyse uvedene rozhodovacky jsou blbe,
                    ;zpusobuji nesparovani zalohove platby (banka) s ostatni uhradou
        if(beru)
           begin
            ;nastavení proměnných pro hledání v dočasném indexovém souboru:
            SetStatusRemark('hledám zrcadlové záznamy k '+Denik.Doklad)
            IntCisla.Length=8
            IntCisla.Cislo=Swapl(Denik.Cislo)
            IntCisla.ICO=Swapl(Denik.Ico)
            if(not(FindKey(IntCisla,VetaD3))) ;toto interní číslo dosud není zaznamenáno v dočas.souboru, budu ho tedy analyzovat
              begin
                AddKey(IntCisla,VetaD1)  ;zapise udaje do docasneho indexoveho souboru
                ICO=Denik.ICO
                Agenda=Denik.Agenda
                KeyDenik7.Length=4
                KeyDenik7.Cislo=Swapl(Denik.Cislo)
                Castka=0
                LocB=SearchKey(KeyDenik7,VetaD3) ;vyhledá první větu se shodným interním číslem
                ICislo=Swapl(Denik.Cislo)
                While((VetaD3<>0)and(KeyDenik7.Cislo=ICislo))  ;cyklus přes všechny věty se shodným interním číslem
                  begin
      debug ;7
                    ReadRec(Denik,VetaD3)
                    if((InFilter(Denik))and(Denik.Datum<=DatumD))        ; dotaz, zda věta prošla filtrem
                      begin
                       ;je-li shodné ICO a číslo účtu na DAL:
                       if((Denik.Ico=Ico)and(@PrvniSU=ucetSU)and(@PrvniAU=ucetAU))
                         Castka=Castka+Denik.Castka  ;načte částku celeho interniho cisla, ktera ma na Dal sledovany ucet
                      end
                    LocB=NextKey(KeyDenik7,VetaD3)
                  end

                ;vyhledat "zrcadlovou" větu se shodným číslem účtu na MD a cyklem zjistit u shodného ICO částku:

                if(Agenda=3)  ;je to zavazek
                  begin
                    ;zjistit, zda je zavazek zaplacen, prednostne vyscitat a zkontrolovat tyto platby k zavazku
                    KeyZavazek8.Length=4
                    KeyZavazek8.Cislo=Swapl(Denik.Cislo)
                    LocB=SearchKey(KeyZavazek8,VetaZ)
      debug ;8
                    ReadRec(Zavazek,VetaZ)
                    if(Zavazek.Uhrazena)
                       begin
                         ;prohledat pokladnu, banku a ou, vyscitat rozkonty platby tohoto zavazku, ktere maji na MD sledovany ucet
                         ZjistiUhradu('Castka2',3,Denik.Cislo,DatumD)
                         StejneCastky(Castka,Castka2,1,Sparoval)
                       end else
                       begin
                         ;není uhrazená
                         sparoval=True   ;finta, aby u nezaplacene nevyhledal jinou platbu
                       end
                  end

                ;totez zrcadlove pro pohledavky
                if(Agenda=2)  ;je to pohledavka
                  begin
                    ;zjistit, zda je pohl. zaplacena, prednostne vyscitat a zkontrolovat tyto platby k pohledavce
                    KeyPohledavka8.Length=4
                    KeyPohledavka8.Cislo=Swapl(Denik.Cislo)
                    LocB=SearchKey(KeyPohledavka8,VetaZ)
      debug ;9
                    ReadRec(Pohledavka,VetaZ)
                    if(Pohledavka.Uhrazena)
                       begin
                         ;prohledat pokladnu, banku a ou, vyscitat rozkonty platby tohoto zavazku, ktere maji na MD sledovany ucet
                         ZjistiUhradu('Castka2',2,Denik.Cislo,DatumD)
                         StejneCastky(Castka,Castka2,1,Sparoval)
                       end else
                       begin
                         ;není uhrazená
                         sparoval=True   ;finta, aby u nezaplacene nevyhledal jinou platbu
                       end
                  end

                ;neni ani pohledavka ani zavazek ani platba:
                if(Sparoval=False)
                  begin
                    @DruhyKlicL=4
                    @DruhyKlicSU=Swap(ucetSU)
                    @DruhyKlicAU=Swap(ucetAU)
                    LocB=SearchKey(@DruhyKlic,VetaD2)    ;vyhledá první vetu s uctem na protistrane
                    Nasel=False
                    ;cyklus přes stranu druhou stranu (opacna, nezli je Hlavni strana)
                    While((VetaD2<>0)and(@DruhyKlicSU=Swap(ucetSU))and(@DruhyKlicAU=Swap(ucetAU))and(Nasel=False))
                      begin
      debug ;10
                        ReadRec(Denik,VetaD2)
                        if((InFilter(Denik))and(Denik.Datum<=DatumD))        ; dotaz, zda věta prošla filtrem
                          begin
                            ;nastavení proměnných pro hledání v dočasném indexovém souboru:

                            IntCisla2.Length=16
                            IntCisla2.Cislo=Swapl(Denik.Cislo)
                            IntCisla2.CisloProti=IntCisla.Cislo
                            IntCisla2.ICO=Swapl(Denik.Ico)
                            IntCisla2.ICOProti=IntCisla.ICO

                            IntCislaTisk.Length=8
                            IntCislaTisk.Cislo=IntCisla2.Cislo
                            IntCislaTisk.ICO=IntCisla2.ICO

                            ;if((not(FindKey(IntCisla2,VetaD2)))and(not(FindKey(IntCislaTisk,VetaD2)))) ;toto interní číslo dosud není zaznamenáno v dočas.souboru, budu ho tedy analyzovat
                            if(not(FindKey(IntCislaTisk,VetaD2))) ;toto interní číslo dosud není zaznamenáno v dočas.souboru, budu ho tedy analyzovat
                              begin
                                AddKey(IntCisla2,VetaD2)  ;zapise udaje do docasneho indexoveho souboru

                                ;ICO=Denik.ICO
                                KeyDenik7.Length=4
                                KeyDenik7.Cislo=Swapl(Denik.Cislo)
                                Castka2=0
                                LocB=SearchKey(KeyDenik7,VetaD3) ;vyhledá první větu se shodným interním číslem
                                ICislo2=Swapl(Denik.Cislo)
                                While((VetaD3<>0)and(KeyDenik7.Cislo=ICislo2))  ;cyklus přes všechny věty se shodným interním číslem
                                  begin
      debug ;11
                                    ReadRec(Denik,VetaD3)
                                    if((InFilter(Denik))and(Denik.Datum<=DatumD))        ; dotaz, zda věta prošla filtrem
                                      begin
                                        ;je-li shodné ICO a číslo účtu na DAL:
                                        if((Denik.Ico=Ico)and(@DruhySU=ucetSU)and(@DruhyAU=ucetAU))
                                          Castka2=Castka2+Denik.Castka  ;načte částku
                                      end
                                    LocB=NextKey(KeyDenik7,VetaD3)
                                  end
                                StejneCastky(Castka,Castka2,3,Sparoval)
                              end
                          end
                        LocB=NextKey(@DruhyKlic,VetaD2)
                      end  ;konec cyklu přes druhou stranu
                  end else
                  begin
                    debug; 7
                    @PrvniKlicL=4
                    @PrvniKlicSU=Swap(ucetSU)
                    @PrvniKlicAU=Swap(ucetAU)
                    LocB=SearchKey(@PrvniKlic,VetaD2)    ;vyhledá první vetu s uctem na protistrane
                    Nasel=False
                    ;cyklus přes stranu druhou stranu (opacna, nezli je Hlavni strana)
                    While((VetaD2<>0)and(@PrvniKlicSU=Swap(ucetSU))and(@PrvniKlicAU=Swap(ucetAU))and(Nasel=False))
                      begin
      debug ;12
                        ReadRec(Denik,VetaD2)
                        if((InFilter(Denik))and(Denik.Datum<=DatumD))        ; dotaz, zda věta prošla filtrem
                          begin
                            ;nastavení proměnných pro hledání v dočasném indexovém souboru:

                            IntCisla2.Length=16
                            IntCisla2.Cislo=Swapl(Denik.Cislo)
                            IntCisla2.CisloProti=IntCisla.Cislo
                            IntCisla2.ICO=Swapl(Denik.Ico)
                            IntCisla2.ICOProti=IntCisla.ICO

                            IntCislaTisk.Length=8
                            IntCislaTisk.Cislo=IntCisla2.Cislo
                            IntCislaTisk.ICO=IntCisla2.ICO

                            ;if((not(FindKey(IntCisla2,VetaD2)))and(not(FindKey(IntCislaTisk,VetaD2)))) ;toto interní číslo dosud není zaznamenáno v dočas.souboru, budu ho tedy analyzovat
                            if(not(FindKey(IntCislaTisk,VetaD2))) ;toto interní číslo dosud není zaznamenáno v dočas.souboru, budu ho tedy analyzovat
                              begin
                                AddKey(IntCisla2,VetaD2)  ;zapise udaje do docasneho indexoveho souboru

                                ;ICO=Denik.ICO
                                KeyDenik7.Length=4
                                KeyDenik7.Cislo=Swapl(Denik.Cislo)
                                Castka2=0
                                LocB=SearchKey(KeyDenik7,VetaD3) ;vyhledá první větu se shodným interním číslem
                                ICislo2=Swapl(Denik.Cislo)
                                While((VetaD3<>0)and(KeyDenik7.Cislo=ICislo2))  ;cyklus přes všechny věty se shodným interním číslem
                                  begin
      debug ;13
                                    ReadRec(Denik,VetaD3)
                                    if((InFilter(Denik))and(Denik.Datum<=DatumD))        ; dotaz, zda věta prošla filtrem
                                      begin
                                        ;je-li shodné ICO a číslo účtu na DAL:
                                        if((Denik.Ico=Ico)and(@PrvniSU=ucetSU)and(@PrvniAU=ucetAU))
                                          Castka2=Castka2+Denik.Castka  ;načte částku
                                      end
                                    LocB=NextKey(KeyDenik7,VetaD3)
                                  end
                                StejneCastky(Castka,-Castka2,3,Sparoval)
                              end
                          end
                        LocB=NextKey(@PrvniKlic,VetaD2)
                      end  ;konec cyklu přes druhou stranu
                  end
              end
           end
      ;end
    end
    LocB=NextKey(@PrvniKlic,VetaD1)
    Inc(Pozice)                  ; zvyseni citace zpracovanych vet
    SetStatus(Pozice)            ; nastaveni stavoveho prouzku
  end  ;konec cyklu přes HlavniStranu




  ; cyklus pro tisk:

  ClearKey(KeyDenik1)             ; resetuje ukazatel aktuální věry v souboru
  ;cyklus pres denik, trideno podle data a tisk:
  ;jen neoznacene nebo vsechny i s oznacenim
  SetStatusText('Vytvářím sestavu')
  SetStatusRemark('')
  SetNewMax(UsedKeys(KeyDenik1))
  Pozice=0
  While(NextKey(KeyDenik1,VetaD1))  ; začátek cyklu přes celý soubor pro tisk
    begin                           ; začátek příkazu pro zpracování jedné věty
      debug ;14
       ReadRec(Denik,VetaD1)        ; přečte větu ze souboru
       if((InFilter(Denik))and(Denik.Datum<=DatumD))
         begin
         if(((Denik.MdSU=UcetSU)and(Denik.MdAU=UcetAU))or((Denik.DalSU=UcetSU)and(Denik.DalAU=UcetAU)))
            begin
              IntCislaTisk.Length=8
              IntCislaTisk.Cislo=Swapl(Denik.Cislo)
              IntCislaTisk.ICO=Swapl(Denik.Ico)
              if(FindKey(IntCislaTisk,VetaD3)) ; vyhodnoceni, zda tisknout
                begin
                  beru=False
                  Znacka=Str(VetaD3)
                end else
                begin
                  beru=True
                end
              if((Denik.MdSU=Program.UcetPocatecniStav)or(Denik.DalSU=Program.UcetPocatecniStav))
                beru=True
              if((Denik.MdSU=Program.UcetKonecnyStav)or(Denik.DalSU=Program.UcetKonecnyStav))
                beru=True
              if((beru=False)and(TiskTyp=2))
                begin
                  beru=True
                end else
                begin
                  znacka=''
                end
              if(beru)
                begin
                  if((Denik.MdSU=UcetSU)and(Denik.MdAU=UcetAU))
                    begin
                      CastkaMD=StrFinanc(Denik.Castka,2)
                      CastkaDal=''
                      Zustatek=Zustatek+Denik.Castka
                    end else
                    begin
                      CastkaMD=''
                      CastkaDal=StrFinanc(Denik.Castka,2)
                      Zustatek=Zustatek-Denik.Castka
                    end
                  if(TypUctu=1)         ;{0=ostatni,1=pasivni,2-aktivni}
                       TiskZust=StrFinanc(Zustatek*(-1),2)
                     else
                       TiskZust=StrFinanc(Zustatek,2)
                  if(Denik.Ico<>0)
                    begin
                      ; zjisteni a tisk adresy:
                      KeyAdresar1.Length=4
                      KeyAdresar1.Ico=SwapL(Denik.Ico)
                      if(FindKey(KeyAdresar1,VetaA))
                        begin
                          ReadRec(Adresar,VetaA)
                          SFirma=Adresar.Nazev
                          SIco=Null(Denik.ICO,8,True)
                        end else
                        begin
                          SIco=Null(Denik.ICO,8,True)
                          SFirma=''
                        end
                    end else
                    begin
                      SIco=''
                      SFirma=''
                    end
                  if(TiskTyp=2)
AddLine(Znacka+#9+StrDate(Denik.Datum)+#9+Null(Denik.Obdobi,4)+#9+Denik.Doklad+#9+Denik.Popis+#9+SIco+#9+SFirma+#9+NULL(Denik.MdSU,3)+'/'+NULL(Denik.MdAU,3)+#9+NULL(Denik.dalSU,3)+'/'+NULL(Denik.dalAU,3)+#9+CastkaMD+#9+CastkaDal+#9+TiskZust)
                    else
AddLine(StrDate(Denik.Datum)+#9+Null(Denik.Obdobi,4)+#9+Denik.Doklad+#9+Denik.Popis+#9+SIco+#9+SFirma+#9+NULL(Denik.MdSU,3)+'/'+NULL(Denik.MdAU,3)+#9+NULL(Denik.dalSU,3)+'/'+NULL(Denik.dalAU,3)+#9+CastkaMD+#9+CastkaDal+#9+TiskZust)
                end

            end
         end
       Inc(Pozice)                  ; zvyseni citace zpracovanych vet
       SetStatus(Pozice)            ; nastaveni stavoveho prouzku
    end
end


END