program program_evidence;
uses crt;
const max_zaznamu=100;
type
  tDatum=record
  den:1..31;
  mesic:1..12;
  rok:1930..2050;
end;

tPohlavi=(muz,zena);

tZamestnanec=record
jmeno:string[20];
prijmeni:string[20];
datumZamestnani:tDatum;
plat:real;
pohlavi:tPohlavi;
end;

tEvidenceZamestnancu=array[1..max_zaznamu] of tZamestnanec;

tSouborEvidence=file of tZamestnanec;

procedure nactiUdaje(var evidence:tEvidenceZamestnancu; pocet,odkud:integer);
var i:integer;
    zadanePohlavi:char;
begin
  for i:=odkud+1 to pocet do
  begin
    with evidence[i] do
    begin
      write('Zadej jmeno zamestnance: ');
      readln(jmeno);
      write('Zadej prijmeni zamestnance: ');
      readln(prijmeni);

      with datumZamestnani do
      begin
        write('Zadej den zamestnani zamestnance: ');
        readln(den);
        write('Zadej mesic zamestnani zamestnance: ');
        readln(mesic);
        write('Zadej rok zamestnani: ');
        readln(rok);
      end;

      write('Zadej pohlavi zamestnance: (M - muz, Z - zena): ');
      readln(zadanePohlavi);

      case zadanePohlavi of
       'm':pohlavi:=muz;
       'M':pohlavi:=muz;
       'z':pohlavi:=zena;
       'Z':pohlavi:=zena;
      end;

      write('Zadej plat zamestnance: ');
      readln(plat);
      end;
    end;
  end;

procedure ulozEvidenciDoSouboru (pocet:integer; EvidenceZamestnancu:tEvidenceZamestnancu);
  var soubor:tSouborEvidence;
      i:integer;
  begin
    assign (soubor, 'evidence.dat');
    rewrite(soubor);
    for i:=1 to pocet do
      begin
        write (soubor, EvidenceZamestnancu[i]);
      end;
    close (soubor);
 end;

procedure nactiEvidenciZeSouboru (var pocetZamestnancu:integer; var EvidenceZamestnancu:tEvidenceZamestnancu);
  var soubor:tSouborEvidence;
  begin
    pocetZamestnancu:=0;
    assign (soubor, 'evidence.dat');
    reset (soubor);
    while not Eof (soubor) do
    begin
      pocetZamestnancu:=pocetZamestnancu+1;
      read (soubor, EvidenceZamestnancu[pocetZamestnancu]);
    end;
    close(soubor);
  end;

procedure vyhledejNejdelePracujiciho(pocetZamestnancu:integer; EvidenceZamestnancu:tEvidenceZamestnancu);
  var i:integer;
      pom:tZamestnanec;
  begin
    i:=1;
    pom:=EvidenceZamestnancu[i];
    for i:=1 to pocetZamestnancu do
    begin
    begin
      if (EvidenceZamestnancu[i].datumzamestnani.rok<pom.datumzamestnani.rok) then
        begin
          pom:=EvidenceZamestnancu[i];
          end else
          if (EvidenceZamestnancu[i].datumzamestnani.rok=pom.datumzamestnani.rok) and
             (EvidenceZamestnancu[i].datumzamestnani.mesic<pom.datumzamestnani.mesic) then
             begin
               pom:=EvidenceZamestnancu[i];
             end else
             if (EvidenceZamestnancu[i].datumzamestnani.rok=pom.datumzamestnani.rok) and
                (EvidenceZamestnancu[i].datumzamestnani.mesic=pom.datumzamestnani.mesic) and
                (EvidenceZamestnancu[i].datumzamestnani.den<pom.datumzamestnani.den) then
                begin
                  pom:=EvidenceZamestnancu[i];
                end;
             end;
        end;
    write('Nejdele pracujici zamestnanec: ');
    writeln(pom.jmeno,' ',pom.prijmeni);
    writeln ('Pracuje od: ',pom.datumzamestnani.den,'.',pom.datumzamestnani.mesic,'.',pom.datumzamestnani.rok);
  end;

procedure vypisZamestnance(evidence:tEvidenceZamestnancu; pocet:integer);
var i:integer;

begin

 for i:=1 to pocet  do
 begin
    with evidence[i] do
   begin
    writeln('Jmeno: ',jmeno);
    writeln('Prijmeni: ',prijmeni);


    with datumZamestnani do
    begin
    writeln('Den zamestnani: ',den);
    writeln('Mesic zamestnani: ',mesic);
    writeln('Rok zamestnani: ',rok);
    end;
   end;
 end;
end;

procedure navysPlat(var evidence:tEvidenceZamestnancu; pocet:integer);
var dolniHranice,horniHranice,kolikProcent:real;
    i:integer;
begin
write('Zadej spodni hranici pro navyseni platu');
readln(dolniHranice);
write('Zadej horni hranici pro navyseni platu');
readln(horniHranice);
write('Zadej o kolik procent maji byt navyseny platy');
readln(kolikProcent);

 for i:=1 to pocet do
   begin

   with evidence[i] do
   begin
   if (plat>=dolniHranice) and (plat<=hornihranice) then
   plat:=plat+plat*kolikprocent/100;
   end;

   end;
end;

procedure seradPodlePlatu(pocet:integer; var evidence:tEvidenceZamestnancu);
var i:integer;
    plati:boolean;
    docasne:tZamestnanec;
begin
     writeln('Serazeni podle platu:');
     repeat
           plati:=true;
           for i:=1 to pocet do
               begin
                    if evidence[i].plat>evidence[i+1].plat then
                       begin
                            docasne:=evidence[i];
                            evidence[i]:=evidence[i+1];
                            evidence[i+1]:=docasne;
                            plati:=false;
                       end;
                    end;
     until plati=true;
end;

var evidence:tEvidenceZamestnancu;
     pocet,odkud:integer;
begin
write('Zadej pocet zamestnancu');
readln(pocet);
odkud:=0;
nactiUdaje(evidence,pocet,odkud);
vypisZamestnance(evidence, pocet);
navysPlat(evidence,pocet);
vyhledejNejdelePracujiciho(pocet, evidence);
ulozEvidenciDoSouboru(pocet, evidence);
nactiEvidenciZeSouboru(pocet, evidence);

writeln('--- Evidence nactena ze souboru ---');
vypisZamestnance(evidence, pocet);
readln;
end.
