Name('Tok financí');
Designed('PKLDNMAN','BANKMAN');

WNSType(1)

DeclareRec('Pokladna');
DeclareRec('KeyPokladna1');
DeclareRec('Banka');
DeclareRec('KeyBanka1');

DatumOd:Word=ValDate(GetDataIni('Cashflow','Od'));
DatumDo:Word=ValDate(GetDataIni('Cashflow','Do'));

LocStr:String=GetDataIni('Cashflow','Pokladny');

;DlgFollowMouse(True)

DefDialog('Upřesnění',298,144)
DlgShade(-1,'',4,4,290,70)

DlgStatic(-1,'&Od data:',16,16,70)
DlgEditDate(,DatumOd,86,12)
DlgOnLineHelp(GetLastID(),'Datum, od kterého budou vypsány informace vypsány')
DlgStatic(-1,'&do:',168,16,32,,,ES_CENTER)
DlgEditDate(,DatumDo,200,12)
DlgOnLineHelp(GetLastID(),'Datum, do kterého budou informace vypsány')

DlgStatic(-1,'&Pokladny:',16,46,70)
DlgEdit(,LocStr,86,42,196,,246,,'0123456789,')
DlgOnLineHelp(GetLastID(),'Čísla pokladen zahrnutých do výpočtů oddělená čárkou')

DlgButton(id_OK,'OK',158,78);
DlgOnLineHelp(id_OK,'Pokračuje ve zpracování')
DlgButton(id_Cancel,'Zpět',226,78);
DlgOnLineHelp(id_Cancel,'Ukončí bez zpracování')

Result:Integer=DlgExecute(True)

if(Result<>id_OK)
  Halt

SetDataIni('Cashflow','Od',StrDate(DatumOd));
SetDataIni('Cashflow','Do',StrDate(DatumDo));
SetDataIni('Cashflow','Pokladny',LocStr);

LocStr2:String;
Pokladny:Word;
IsPokladny:Boolean=False;

While(Length(LocStr)<>0)
  begin
    LocStr2=ToChar(',',LocStr);
    if(Length(LocStr2)<>0) then
      begin
        Push(Pokladny,LocStr2);
        IsPokladny=True;
      end;
    LocStr=FromChar(',',LocStr);
  end;

Datum:Word=DatumOd;

OKB:Boolean;
OKP:Boolean;

VetaB:LongInt
VetaP:LongInt

PocStavBanka:Double=0;
PocStavPokladna:Double=0;

Pozice:LongInt
InitStatus(UsedKeys(KeyBanka1)+UsedKeys(KeyPokladna1),'Sumarizuji data');

ClearKey(KeyBanka1)
OKB=NextKey(KeyBanka1,VetaB);
While((OKB)and(Swap(KeyBanka1.Datum)<DatumOd))
  begin
    ReadRec(Banka,VetaB);
    if(Banka.Vydaj)
      begin
        PocStavBanka=RoundFloat(PocStavBanka-Banka.Castka,-2);
      end else
      begin
        PocStavBanka=RoundFloat(PocStavBanka+Banka.Castka,-2);
      end;
    Inc(Pozice);
    SetStatus(Pozice);
    OKB=NextKey(KeyBanka1,VetaB);
  end;

ClearKey(KeyPokladna1);

OKP=NextKey(KeyPokladna1,VetaP);
While((OKP)and(Swap(KeyPokladna1.Datum)<DatumOd))
  begin
    ReadRec(Pokladna,VetaP);
    if((not IsPokladny)or(InArray(Pokladny,Pokladna.CisPokl)))
      begin
        if(Pokladna.Vydaj)
          begin
            PocStavPokladna=RoundFloat(PocStavPokladna-Pokladna.Castka,-2);
          end else
          begin
            PocStavPokladna=RoundFloat(PocStavPokladna+Pokladna.Castka,-2);
          end;
      end;
    Inc(Pozice);
    SetStatus(Pozice);
    OKP=NextKey(KeyPokladna1,VetaP);
  end;

NewWNS('cashflow.wns')

SetDescr(0,0,TA_Center,'Deník peněžních toků');
SetDescr(1,1,TA_Left|Descr_Date,'Datum: ');
SetDescr(2,1,TA_Right|Descr_PageNum,'Strana: ');
SetDescr(3,2,TA_Left|Descr_UserDescr);

SetColumn(0,TA_Right,10,PF_FatPen)    ; datum
SetColumn(1,TA_Right,12)              ; banka prijem
SetColumn(2,TA_Right,12)              ; banka vydaj
SetColumn(3,TA_Right,12)              ; banka stav
SetColumn(4,TA_Right,12,PF_FatPen)    ; banka zmena
SetColumn(5,TA_Right,12)              ; pokladna prijem
SetColumn(6,TA_Right,12)              ; pokladna vydaj
SetColumn(7,TA_Right,12)              ; pokladna stav
SetColumn(8,TA_Right,12,PF_FatPen)    ; pokladna zmena
SetColumn(9,TA_Right,12)              ; celkem prijem
SetColumn(10,TA_Right,12)              ; celkem vydaj
SetColumn(11,TA_Right,12)              ; celkem stav
SetColumn(12,TA_Right,12)              ; celkem zmena

SetHead('Datum\tbanka příjmy\tbanka výdaje\tbanka stav\tbanka změna\tpokl. příjmy\tpokl. výdaje\tpokl. stav\tpokl. změna\tPŘÍJMY\tVÝDAJE\tSTAV\tZMĚNA');

StavB:Double=PocStavBanka;
StavP:Double=PocStavPokladna;
StavC:Double=PocStavPokladna+PocStavBanka;

PrijmyB:Double
VydajeB:Double
PrijmyP:Double
VydajeP:Double
PrijmyC:Double
VydajeC:Double
ZmenaB:Double
ZmenaP:Double
ZmenaC:Double

AddLine(,,,StrFinanc(PocStavBanka,2),,,StrFinanc(PocStavPokladna,2),,,StrFinanc(PocStavBanka+PocStavPokladna,2));

While(Datum<=DatumDo)
  begin
    PrijmyB=0
    VydajeB=0
    While((OKB)and(Swap(KeyBanka1.Datum)=Datum))
      begin
        ReadRec(Banka,VetaB);
        if(Banka.Vydaj)
          begin
            VydajeB=RoundFloat(VydajeB+Banka.Castka,-2);
          end else
          begin
            PrijmyB=RoundFloat(PrijmyB+Banka.Castka,-2);
          end;
        Inc(Pozice);
        SetStatus(Pozice);
        OKB=NextKey(KeyBanka1,VetaB);
      end;
    PrijmyP=0
    VydajeP=0
    While((OKP)and(Swap(KeyPokladna1.Datum)=Datum))
      begin
        ReadRec(Pokladna,VetaP);
        if((not IsPokladny)or(InArray(Pokladny,Pokladna.CisPokl)))
          begin
            if(Pokladna.Vydaj)
              begin
                VydajeP=RoundFloat(VydajeP+Pokladna.Castka,-2);
              end else
              begin
                PrijmyP=RoundFloat(PrijmyP+Pokladna.Castka,-2);
              end;
          end;
        Inc(Pozice);
        SetStatus(Pozice);
        OKP=NextKey(KeyPokladna1,VetaP);
      end;
    StavB=StavB+PrijmyB-VydajeB;
    StavP=StavP+PrijmyP-VydajeP;
    ZmenaB=ZmenaB+PrijmyB-VydajeB;
    ZmenaP=ZmenaP+PrijmyP-VydajeP;
    ZmenaC=ZmenaB+ZmenaP
    PrijmyC=PrijmyB+PrijmyP;
    VydajeC=VydajeB+VydajeP;
    StavC=StavC+PrijmyC-VydajeC;
    AddText(StrDate(Datum));
AddLine(,StrFinanc(PrijmyB,2),StrFinanc(VydajeB,2),StrFinanc(StavB,2),StrFinanc(ZmenaB,2),StrFinanc(PrijmyP,2),StrFinanc(VydajeP,2),StrFinanc(StavP,2),StrFinanc(ZmenaP,2),StrFinanc(PrijmyC,2),StrFinanc(VydajeC,2),StrFinanc(StavC,2),StrFinanc(ZmenaC,2))
    Datum=AddDay(Datum,1)
  end;

END