unit P3Dukoly;

interface

uses
  Classes,Variants,P3ServerTask,
  System.DateUtils,System.Math,System.Generics.Collections,XMLDoc,XMLIntf,SysUtils,P3ObjSQL,
  P3Srv001,P3SrvErr,P3SrvXML,P3ObjCon,P3Obj001,P3Sys001,P3Dll001,P3AncSQL, P3Types,P3ObjUzi,
  P3ObjObd,P3ObjCis,P3ObjCfg,P3ObjFir,P3ObjCsS,P3ObjKon,P3ObjDMS,P3ObjMEx,P3ObjStr,P3ObjFum,
  P3ObjObc,P3ObjPrM,P3BrwPra,P3TmpPra,P3ObjPra,P3ObjPPV,P3ObjPri,P3ObjKal,P3ObjAlg,P3ObjMzp,
  P3ObjVKI,P3ObjTrS,P3ObjPEn,P3ObjVol,P3ObjUsC,P3ObjNot,P3ObjPPM,P3ObjMzdZme,
  P3ObjNotif,P3ObjPLog,P3ObjPPC;

function ExecuteTask(Input:PChar; var Output:PChar; AUserName:PChar; APassword:PChar; ALog:PChar):Integer; stdcall;

type

  TLibParams=record // parametry knihovny
  private
    Rok,Mesic:word;
    incipr,incuzi,typuzi,readtype,zadava,odposa:integer;
    SendNotif,enotif,wnotif:Boolean;
    function MinDate:TDate;
    function MaxDate:TDate;
    procedure Clear;
  end;

  P3ServerUkoly=class(P3ServerTaskBase)
  private
    Par:TLibParams;
    FObdobi:TKvaObdobi;
    FUzivatelList:TKvaUzivatelList;
    FCiselniky:TKvaCiselnikList;
    FConfigList:TKvaConfigList;
    FFirmy:TKvaFirmaList;
    FFirma:TKvaFirma;
    FStaty:TKvaStatList;
    FPracovnik:TKvaPracovnik;
    FUkolPracovnikaList:TKvaUkolPracovnikaList;
    FUkolZadavatelList:TKvaUkolZadavatelList;
    FUkolOdpovednaOsList:TKvaUkolOdpovednaOsList;
    FPLoginList:TKvaPLoginList;
    FPLoginListP:TKvaPLoginListP;
    FPLoginListU:TKvaPLoginListU;
    FNotifList:TKvaNotifikaceList;
    FModified: boolean;
    procedure ReadFilter; // filtry do Par
    procedure ReadIni; // settings ini
    procedure CreateObjects;
  protected
    AktUzivatel: TKvaAktUzivatel;
    procedure EncodeXml;
    procedure DecodeXml;
    property Modified: boolean read FModified write FModified;
    procedure SendNotif(AOsoba:Integer; Atypuzi:Smallint; AIncipr:Integer);
  public
    procedure Execute; override;
  end;

implementation

{ P3ServerTarify }

procedure P3ServerUkoly.ReadFilter;
var
  LOp: TKvaPMFilterOperator;
  LErr: SmallInt;
begin
  if not Filter.GetValueAsObdobi('obdobi',LOp,Par.Rok,Par.Mesic,LErr) then
    raise Exception.Create(WErrXMLFilter);
  if not (Filter.GetValueAsInteger('incipr',LOp,Par.incipr,LErr)) and not
  (Filter.GetValueAsInteger('incuzi',LOp,Par.incuzi,LErr)) then
    raise Exception.Create(WErrXMLFilter);
  if not Filter.GetValueAsInteger('typuzi',LOp,Par.typuzi,LErr) then
    raise Exception.Create(WErrXMLFilter);
  if not Filter.GetValueAsInteger('readtype',LOp,Par.readtype,LErr) then
    raise Exception.Create(WErrXMLFilter);
end;

procedure P3ServerUkoly.ReadIni;
begin
  var LDir:=ExtractFileDir(GetmoduleName(HInstance));
  var LIniFile:=Trim(LDir)+'\Settings\Ukoly.ini';
  if FileExists(LIniFile) then
  begin
    var LStrList:=TStringList.Create;
    LstrList.LoadFromFile(LIniFile);
    Par.SendNotif:=StrToBoolDef(Trim(AnsiDequotedStr(LStrList.Values['SendNotif'],'''')),False);
    Par.enotif:=StrToBoolDef(Trim(AnsiDequotedStr(LStrList.Values['EmailNotif'],'''')),False);
    Par.wnotif:=StrToBoolDef(Trim(AnsiDequotedStr(LStrList.Values['WebNotif'],'''')),False);
    LStrList.Destroy;
  end;
end;


procedure P3ServerUkoly.SendNotif(AOsoba:Integer; Atypuzi:Smallint; AIncipr:Integer);      //kkri
var LNotif:TKvaNotifikace;        //AOsoba = incipr nebo incuzi
    LUzivatel:TKvaUzivatel;
begin
  LNotif:=FNotifList.AddRow;
  LNotif.TypNotifikace:=FNotifList.TypNotifikace;
  LNotif.Subject:=LNotif.Subject + 'přiřazen úkol';

  LNotif.Body.Add('Byl Vám přiřazený úkol, nebo jste jeho součástí.');
  LNotif.Body.Add('<br><br>');

  LNotif.AddRecipEmployee(AIncipr);
  if Atypuzi=0 then     //incipr
     LNotif.AddRecipEmployee(AOsoba)
  else if Atypuzi=1 then     //incuzi
     begin
       LUzivatel:=FUkolOdpovednaOsList.UzivatelList.UzivatelDleKodu(AOsoba);
       if LUzivatel<>nil then
          LNotif.AddRecipManagers(LUzivatel);
     end;
  FNotifList.SendAll;
end;

procedure P3ServerUkoly.EncodeXml;
  var
  LTaskNode:IXMLNode;
  LNodeUkolPracovnika,
  LNodeUkolZadavatel,LNodeUkolOdpovednaOs:iXMLNode;
  i:Integer;
  LUkolPracovnika:TKvaUkolPracovnika;
  LUkolZadavatel:TKvaUkolZadavatel;
  LUkolOdpovednaOs:TKvaUkolOdpovednaOs;
begin
  LTaskNode:=Body.AddChild(TaskName);
  for i := 0 to FUkolPracovnikaList.Numrows-1 do
     begin
        LUkolPracovnika:=FUkolPracovnikaList.UkolPracovnika[i];
        LNodeUkolPracovnika:=LTaskNode.AddChild('ukolpracovnik');
        LNodeUkolPracovnika.ChildNodes['inpppc'].NodeValue:=LUkolPracovnika.inpppc;
        LNodeUkolPracovnika.ChildNodes['incipr'].NodeValue:=LUkolPracovnika.incipr;
        LNodeUkolPracovnika.ChildNodes['nazuko'].NodeValue:=LUkolPracovnika.nazuko;
        LNodeUkolPracovnika.ChildNodes['typuko'].NodeValue:=LUkolPracovnika.typuko;
        LNodeUkolPracovnika.ChildNodes['vazuko'].NodeValue:=LUkolPracovnika.vazuko;
        LNodeUkolPracovnika.ChildNodes['spevaz'].NodeValue:=LUkolPracovnika.spevaz;
        LNodeUkolPracovnika.ChildNodes['typuzi'].NodeValue:=LUkolPracovnika.typuzi;
        LNodeUkolPracovnika.ChildNodes['odposa'].NodeValue:=LUkolPracovnika.odposa;
        LNodeUkolPracovnika.ChildNodes['stauko'].NodeValue:=LUkolPracovnika.stauko;
        LNodeUkolPracovnika.ChildNodes['kfirma'].NodeValue:=LUkolPracovnika.kfirma;
        LNodeUkolPracovnika.ChildNodes['castka'].NodeValue:=LUkolPracovnika.castka;
        LNodeUkolPracovnika.ChildNodes['primap'].NodeValue:=LUkolPracovnika.primap;
        LNodeUkolPracovnika.ChildNodes['typzad'].NodeValue:=LUkolPracovnika.typzad;
        LNodeUkolPracovnika.ChildNodes['zadava'].NodeValue:=LUkolPracovnika.zadava;
        LNodeUkolPracovnika.ChildNodes['datpln'].NodeValue:=PMDateStr(LUkolPracovnika.datpln);
        LNodeUkolPracovnika.ChildNodes['datzad'].NodeValue:=PMDateStr(LUkolPracovnika.datzad);
        LNodeUkolPracovnika.ChildNodes['popis'].NodeValue:=LUkolPracovnika.Popis.Text;
     end;
  for i := 0 to FUkolZadavatelList.Numrows-1 do
     begin
        LUkolZadavatel:=FUkolZadavatelList.UkolZadavatel[i];
        LNodeUkolZadavatel:=LTaskNode.AddChild('ukolzadavatel');
        LNodeUkolZadavatel.ChildNodes['inpppc'].NodeValue:=LUkolZadavatel.inpppc;
        LNodeUkolZadavatel.ChildNodes['incipr'].NodeValue:=LUkolZadavatel.incipr;
        LNodeUkolZadavatel.ChildNodes['nazuko'].NodeValue:=LUkolZadavatel.nazuko;
        LNodeUkolZadavatel.ChildNodes['typuko'].NodeValue:=LUkolZadavatel.typuko;
        LNodeUkolZadavatel.ChildNodes['vazuko'].NodeValue:=LUkolZadavatel.vazuko;
        LNodeUkolZadavatel.ChildNodes['spevaz'].NodeValue:=LUkolZadavatel.spevaz;
        LNodeUkolZadavatel.ChildNodes['typuzi'].NodeValue:=LUkolZadavatel.typuzi;
        LNodeUkolZadavatel.ChildNodes['odposa'].NodeValue:=LUkolZadavatel.odposa;
        LNodeUkolZadavatel.ChildNodes['stauko'].NodeValue:=LUkolZadavatel.stauko;
        LNodeUkolZadavatel.ChildNodes['kfirma'].NodeValue:=LUkolZadavatel.kfirma;
        LNodeUkolZadavatel.ChildNodes['castka'].NodeValue:=LUkolZadavatel.castka;
        LNodeUkolZadavatel.ChildNodes['primap'].NodeValue:=LUkolZadavatel.primap;
        LNodeUkolZadavatel.ChildNodes['typzad'].NodeValue:=LUkolZadavatel.typzad;
        LNodeUkolZadavatel.ChildNodes['zadava'].NodeValue:=LUkolZadavatel.zadava;
        LNodeUkolZadavatel.ChildNodes['datpln'].NodeValue:=PMDateStr(LUkolZadavatel.datpln);
        LNodeUkolZadavatel.ChildNodes['datzad'].NodeValue:=PMDateStr(LUkolZadavatel.datzad);
        LNodeUkolZadavatel.ChildNodes['popis'].NodeValue:=LUkolZadavatel.Popis.Text;
     end;
  for i := 0 to FUkolOdpovednaOsList.Numrows-1 do
     begin
        LUkolOdpovednaOs:=FUkolOdpovednaOsList.UkolOdpovednaOs[i];
        LNodeUkolOdpovednaOs:=LTaskNode.AddChild('ukolodpovednaos');
        LNodeUkolOdpovednaOs.ChildNodes['inpppc'].NodeValue:=LUkolOdpovednaOs.inpppc;
        LNodeUkolOdpovednaOs.ChildNodes['incipr'].NodeValue:=LUkolOdpovednaOs.incipr;
        LNodeUkolOdpovednaOs.ChildNodes['nazuko'].NodeValue:=LUkolOdpovednaOs.nazuko;
        LNodeUkolOdpovednaOs.ChildNodes['typuko'].NodeValue:=LUkolOdpovednaOs.typuko;
        LNodeUkolOdpovednaOs.ChildNodes['vazuko'].NodeValue:=LUkolOdpovednaOs.vazuko;
        LNodeUkolOdpovednaOs.ChildNodes['spevaz'].NodeValue:=LUkolOdpovednaOs.spevaz;
        LNodeUkolOdpovednaOs.ChildNodes['typuzi'].NodeValue:=LUkolOdpovednaOs.typuzi;
        LNodeUkolOdpovednaOs.ChildNodes['odposa'].NodeValue:=LUkolOdpovednaOs.odposa;
        LNodeUkolOdpovednaOs.ChildNodes['stauko'].NodeValue:=LUkolOdpovednaOs.stauko;
        LNodeUkolOdpovednaOs.ChildNodes['kfirma'].NodeValue:=LUkolOdpovednaOs.kfirma;
        LNodeUkolOdpovednaOs.ChildNodes['castka'].NodeValue:=LUkolOdpovednaOs.castka;
        LNodeUkolOdpovednaOs.ChildNodes['primap'].NodeValue:=LUkolOdpovednaOs.primap;
        LNodeUkolOdpovednaOs.ChildNodes['typzad'].NodeValue:=LUkolOdpovednaOs.typzad;
        LNodeUkolOdpovednaOs.ChildNodes['zadava'].NodeValue:=LUkolOdpovednaOs.zadava;
        LNodeUkolOdpovednaOs.ChildNodes['datpln'].NodeValue:=PMDateStr(LUkolOdpovednaOs.datpln);
        LNodeUkolOdpovednaOs.ChildNodes['datzad'].NodeValue:=PMDateStr(LUkolOdpovednaOs.datzad);
        LNodeUkolOdpovednaOs.ChildNodes['popis'].NodeValue:=LUkolOdpovednaOs.Popis.Text;
     end;
end;

procedure P3ServerUkoly.CreateObjects;
begin
  var LOwner: TComponent:=AktUzivatel;

  FObdobi:=TKvaObdobi.Create(LOwner);
  FObdobi.Year:=Par.Rok;
  FObdobi.Month:=Par.Mesic;
  FObdobi.SQL.Connect:=Connect;
  Fobdobi.AktUzivatel:=AktUzivatel;
  FObdobi.SQL.Read;

  FCiselniky:=TKvaCiselnikList.Create(LOwner);
  FCiselniky.SQL.Connect:=Connect;
  FCiselniky.Rok:=Par.Rok;
  FCiselniky.Mesic:=Par.Mesic;
  FCiselniky.SQL.Read;

  FConfigList:=TKvaConfigList.Create(LOwner);
  FConfigList.SQL.Connect:=Connect;
  FConfigList.SQL.Read;

  FFirmy:=TKvaFirmaList.Create(LOwner);
  FFirmy.SQL.Connect:=Connect;
  FFirmy.SQL.Read;
  FFirma:=FFirmy.FirmaDleKodu(AktUzivatel.AktFirma);

  FUzivatelList:=TKvaUzivatelList.Create(LOwner);
  FUzivatelList.SQL.Connect:=Connect;
  FUzivatelList.SQL.Read;

  FPLoginList:=TKvaPLoginList.Create(LOwner);
  FPLoginList.Uzivatele:=FUzivatelList;
  FPLoginList.SQL.Connect:=Connect;
  FPLoginList.SQL.Read;

  if Par.typuzi=0 then
    begin
      FPLoginListP:=TKvaPLoginListP.Create(LOwner);
      FPLoginListP.Uzivatele:=FUzivatelList;
      FPLoginListP.SQL.MasterKey:=Par.incipr;
      FPLoginListP.SQL.Connect:=Connect;
      FPLoginListP.SQL.Read;
    end
  else
    begin
      FPLoginListU:=TKvaPLoginListU.Create(LOwner);
      FPLoginListU.Uzivatele:=FUzivatelList;
      FPLoginListU.SQL.Connect:=Connect;
      FPLoginListU.SQL.Read;
    end;

  FUkolZadavatelList:=TKvaUkolZadavatelList.Create(LOwner);
  FUkolZadavatelList.SQL.Connect:=Connect;
  FUkolZadavatelList.Ciselniky:=FCiselniky;
  FUkolZadavatelList.UzivatelList:=FUzivatelList;
  if Par.typuzi=0 then
     FUkolZadavatelList.PLoginList:=FPLoginListP
  else
     FUkolZadavatelList.PLoginList:=FPLoginListU;
  FUkolZadavatelList.SQL.CompanyKey:=kfirma;
  FUkolZadavatelList.SQL.TypUzivatele:=Par.typuzi;
  if Par.typuzi=0 then
     FUkolZadavatelList.SQL.MasterKey:=Par.incipr
  else
     FUkolZadavatelList.SQL.MasterKey:=Par.incuzi;
  FUkolZadavatelList.SQL.readtype:=Par.readtype;
  if Par.readtype=0 then
     FUkolZadavatelList.SQL.datref:=Par.MinDate;
  FUkolZadavatelList.SQL.Read;

  FUkolOdpovednaOsList:=TKvaUkolOdpovednaOsList.Create(LOwner);
  FUkolOdpovednaOsList.SQL.Connect:=Connect;
  FUkolOdpovednaOsList.Ciselniky:=FCiselniky;
  FUkolOdpovednaOsList.UzivatelList:=FUzivatelList;
  if Par.typuzi=0 then
     FUkolOdpovednaOsList.PLoginList:=FPLoginListP
  else
     FUkolOdpovednaOsList.PLoginList:=FPLoginListU;
  FUkolOdpovednaOsList.SQL.CompanyKey:=kfirma;
  FUkolOdpovednaOsList.SQL.TypUzivatele:=Par.typuzi;
  if Par.typuzi=0 then
     FUkolOdpovednaOsList.SQL.MasterKey:=Par.incipr
  else
     FUkolOdpovednaOsList.SQL.MasterKey:=Par.incuzi;
  FUkolOdpovednaOsList.SQL.readtype:=Par.readtype;
  if Par.readtype=0 then
     FUkolOdpovednaOsList.SQL.datref:=Par.MinDate;
  FUkolOdpovednaOsList.SQL.Read;


  FNotifList:=TKvaNotifikaceList.Create(nil);
  FNotifList.AktUziv:= AktUzivatel;
  FNotifList.PLoginy:=FPLoginList;
  FNotifList.Connect:=Connect;
  FNotifList.PWebNotif:=false;
  FNotifList.EmailNotif:=false;

  FNotifList.TypNotifikace:=TKvaNotificationType.donotNotif;
  if Par.SendNotif then
     begin
       if Par.enotif then
          FNotifList.TypNotifikace:=TKvaNotificationType.onlyEmailNotif;
       FNotifList.EmailNotif:=Par.enotif;
     end;

  FUkolPracovnikaList:=TKvaUkolPracovnikaList.Create(LOwner);
  if Par.typuzi=0 then
    begin
      FStaty:=TKvaStatList.Create(LOwner);
      FStaty.SQL.Connect:=Connect;
      FStaty.SQL.Read;

      FPracovnik:=TKvaPracovnik.Create(LOwner);
      FPracovnik.SQL.Connect:=Connect;
      FPracovnik.Staty:=FStaty;
      FPracovnik.Ciselniky:=FCiselniky;
      FPracovnik.SQL.CompanyKey:=kfirma;
      FPracovnik.SQL.MasterKey:=Par.incipr;
      FPracovnik.SQL.Read;


      FUkolPracovnikaList.SQL.Connect:=Connect;
      FUkolPracovnikaList.Ciselniky:=FCiselniky;
      FUkolPracovnikaList.UzivatelList:=FUzivatelList;
      FUkolPracovnikaList.PLoginList:=FPLoginListP;
      FUkolPracovnikaList.SQL.CompanyKey:=kfirma;
      FUkolPracovnikaList.SQL.MasterKey:=Par.incipr;
      FUkolPracovnikaList.SQL.readtype:=Par.readtype;
      if Par.readtype=0 then
         FUkolPracovnikaList.SQL.datref:=Par.MinDate;
      FUkolPracovnikaList.SQL.Read;
    end;
end;


procedure P3ServerUkoly.DecodeXml;
var
  LNodBase,LNodeUkol:iXMLNode;
  i,j,Linpppc,Lnotifi:Integer;
  LStat:char;
  LUkolPracovnika:TKvaUkolPracovnika;
  LUkolZadavatel:TKvaUkolZadavatel;
  LUkolOdpovednaOs:TKvaUkolOdpovednaOs;
begin
  if inputBody=nil then Exit;
  LNodBase:= inputBody.ChildNodes.FindNode(TaskName);
  if LNodBase=nil then Exit;
  for i:=0 to LNodBase.ChildNodes.Count -1 do
    begin
      LNodeUkol:=LNodBase.ChildNodes[i];
      if (LNodeUkol.NodeName='ukolpracovnik') then
       begin
        if PMGetStatus(LNodeUkol,LStat) then
          begin
             case LStat of
              'i':
                begin
                   Modified:=True;
                   LUkolPracovnika:=FUkolPracovnikaList.UkolPracovnika[FUkolPracovnikaList.InsertRow(FUkolPracovnikaList.Count)];
                   LUkolPracovnika.incipr:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['incipr'].NodeValue)),0);
                   LUkolPracovnika.nazuko:=Trim(VarToStr(LNodeUkol.ChildNodes['nazuko'].NodeValue));
                   LUkolPracovnika.typuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuko'].NodeValue)),0);
                   LUkolPracovnika.vazuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['vazuko'].NodeValue)),0);
                   LUkolPracovnika.spevaz:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['spevaz'].NodeValue)),0);
                   LUkolPracovnika.typuzi:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuzi'].NodeValue)),0);
                   LUkolPracovnika.odposa:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['odposa'].NodeValue)),0);
                   LUkolPracovnika.stauko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['stauko'].NodeValue)),0);
                   LUkolPracovnika.kfirma:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['kfirma'].NodeValue)),0);
                   LUkolPracovnika.castka:=StrToFloatDef(Trim(VarToStr(LNodeUkol.ChildNodes['castka'].NodeValue)),0);
                   LUkolPracovnika.primap:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['primap'].NodeValue)),0);
                   LUkolPracovnika.typzad:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typzad'].NodeValue)),0);
                   LUkolPracovnika.zadava:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['zadava'].NodeValue)),0);
                   LUkolPracovnika.datpln:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datpln'].NodeValue)),cidmin);
                   LUkolPracovnika.datzad:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datzad'].NodeValue)),cidmin);
                   LUkolPracovnika.Popis.Text:=Trim(VarToStr(LNodeUkol.ChildNodes['popis'].NodeValue));
                   if Par.SendNotif then
                      SendNotif(LUkolZadavatel.odposa,LUkolZadavatel.typuzi,LUkolZadavatel.incipr);
                end;
              'u':
                begin
                   Modified:=True;
                   Linpppc:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['inpppc'].NodeValue)),0);
                   LUkolPracovnika:=FUkolPracovnikaList.UkolDleKodu(Linpppc);
                   if LUkolPracovnika<>nil then
                     begin
                       LUkolPracovnika:=FUkolPracovnikaList.UkolPracovnika[FUkolPracovnikaList.InsertRow(FUkolPracovnikaList.Count)];
                       LUkolPracovnika.incipr:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['incipr'].NodeValue)),0);
                       LUkolPracovnika.nazuko:=Trim(VarToStr(LNodeUkol.ChildNodes['nazuko'].NodeValue));
                       LUkolPracovnika.typuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuko'].NodeValue)),0);
                       LUkolPracovnika.vazuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['vazuko'].NodeValue)),0);
                       LUkolPracovnika.spevaz:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['spevaz'].NodeValue)),0);
                       LUkolPracovnika.typuzi:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuzi'].NodeValue)),0);
                       LUkolPracovnika.odposa:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['odposa'].NodeValue)),0);
                       LUkolPracovnika.stauko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['stauko'].NodeValue)),0);
                       LUkolPracovnika.kfirma:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['kfirma'].NodeValue)),0);
                       LUkolPracovnika.castka:=StrToFloatDef(Trim(VarToStr(LNodeUkol.ChildNodes['castka'].NodeValue)),0);
                       LUkolPracovnika.primap:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['primap'].NodeValue)),0);
                       LUkolPracovnika.typzad:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typzad'].NodeValue)),0);
                       LUkolPracovnika.zadava:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['zadava'].NodeValue)),0);
                       LUkolPracovnika.datpln:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datpln'].NodeValue)),cidmin);
                       LUkolPracovnika.datzad:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datzad'].NodeValue)),cidmin);
                       LUkolPracovnika.Popis.Text:=Trim(VarToStr(LNodeUkol.ChildNodes['popis'].NodeValue));
                     end
                   else
                     begin
                       WriteToLog('chyba decode update pracovnik',lmsError);
                       PMSetError(Output,'chyba decode update pracovnik');
                     end;
                end;
              'd':
                begin
                   Modified:=True;
                   Linpppc:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['inpppc'].NodeValue)),0);
                   j:=FUkolPracovnikaList.IndexDleKodu(Linpppc);
                   if j<>-1 then
                      FUkolPracovnikaList.DeleteRow(j)
                   else
                     begin
                       WriteToLog('chyba decode delete pracovnik',lmsError);
                       PMSetError(Output,'chyba decode delete pracovník');
                     end;
                end;
             end;
          end;
       end
      else if (LNodeUkol.NodeName='ukolzadavatel') then
       begin
        if PMGetStatus(LNodeUkol,LStat) then
          begin
             case LStat of
              'i':
                begin
                   Modified:=True;
                   LUkolZadavatel:=FUkolZadavatelList.UkolZadavatel[FUkolZadavatelList.InsertRow(FUkolZadavatelList.Count)];
                   LUkolZadavatel.incipr:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['incipr'].NodeValue)),0);
                   LUkolZadavatel.nazuko:=Trim(VarToStr(LNodeUkol.ChildNodes['nazuko'].NodeValue));
                   LUkolZadavatel.typuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuko'].NodeValue)),0);
                   LUkolZadavatel.vazuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['vazuko'].NodeValue)),0);
                   LUkolZadavatel.spevaz:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['spevaz'].NodeValue)),0);
                   LUkolZadavatel.typuzi:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuzi'].NodeValue)),0);
                   LUkolZadavatel.odposa:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['odposa'].NodeValue)),0);
                   LUkolZadavatel.stauko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['stauko'].NodeValue)),0);
                   LUkolZadavatel.kfirma:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['kfirma'].NodeValue)),0);
                   LUkolZadavatel.castka:=StrToFloatDef(Trim(VarToStr(LNodeUkol.ChildNodes['castka'].NodeValue)),0);
                   LUkolZadavatel.primap:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['primap'].NodeValue)),0);
                   LUkolZadavatel.typzad:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typzad'].NodeValue)),0);
                   LUkolZadavatel.zadava:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['zadava'].NodeValue)),0);
                   LUkolZadavatel.datpln:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datpln'].NodeValue)),cidmin);
                   LUkolZadavatel.datzad:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datzad'].NodeValue)),cidmin);
                   LUkolZadavatel.Popis.Text:=Trim(VarToStr(LNodeUkol.ChildNodes['popis'].NodeValue));
                   if Par.SendNotif then
                      SendNotif(LUkolZadavatel.odposa,LUkolZadavatel.typuzi,LUkolZadavatel.incipr);
                end;
              'u':
                begin
                   Modified:=True;
                   Linpppc:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['inpppc'].NodeValue)),0);
                   LUkolZadavatel:=FUkolZadavatelList.UkolDleKodu(Linpppc);
                   if LUkolZadavatel<>nil then
                    begin
                       LUkolZadavatel:=FUkolZadavatelList.UkolZadavatel[FUkolZadavatelList.InsertRow(FUkolZadavatelList.Count)];
                       LUkolZadavatel.incipr:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['incipr'].NodeValue)),0);
                       LUkolZadavatel.nazuko:=Trim(VarToStr(LNodeUkol.ChildNodes['nazuko'].NodeValue));
                       LUkolZadavatel.typuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuko'].NodeValue)),0);
                       LUkolZadavatel.vazuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['vazuko'].NodeValue)),0);
                       LUkolZadavatel.spevaz:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['spevaz'].NodeValue)),0);
                       LUkolZadavatel.typuzi:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuzi'].NodeValue)),0);
                       LUkolZadavatel.odposa:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['odposa'].NodeValue)),0);
                       LUkolZadavatel.stauko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['stauko'].NodeValue)),0);
                       LUkolZadavatel.kfirma:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['kfirma'].NodeValue)),0);
                       LUkolZadavatel.castka:=StrToFloatDef(Trim(VarToStr(LNodeUkol.ChildNodes['castka'].NodeValue)),0);
                       LUkolZadavatel.primap:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['primap'].NodeValue)),0);
                       LUkolZadavatel.typzad:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typzad'].NodeValue)),0);
                       LUkolZadavatel.zadava:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['zadava'].NodeValue)),0);
                       LUkolZadavatel.datpln:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datpln'].NodeValue)),cidmin);
                       LUkolZadavatel.datzad:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datzad'].NodeValue)),cidmin);
                       LUkolZadavatel.Popis.Text:=Trim(VarToStr(LNodeUkol.ChildNodes['popis'].NodeValue));
                    end
                   else
                    begin
                       WriteToLog('chyba decode update zadavatel',lmsError);
                       PMSetError(Output,'chyba decode update zadavatel');
                    end;
                end;
              'd':
                begin
                   Modified:=True;
                   Linpppc:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['inpppc'].NodeValue)),0);
                   j:=FUkolZadavatelList.IndexDleKodu(Linpppc);
                   if j<>-1 then
                      FUkolZadavatelList.DeleteRow(j)
                   else
                    begin
                       WriteToLog('chyba decode delete zadavatel',lmsError);
                       PMSetError(Output,'chyba decode delete zadavatel');
                    end;
                end;
             end;
          end;
       end
      else if (LNodeUkol.NodeName='ukolodpovednaos') then
      begin
        if PMGetStatus(LNodeUkol,LStat) then
          begin
            case LStat of
              'i':
                begin
                   Modified:=True;
                   LUkolOdpovednaOs:=FUkolOdpovednaOsList.UkolOdpovednaOs[FUkolOdpovednaOsList.InsertRow(FUkolOdpovednaOsList.Count)];
                   LUkolOdpovednaOs.incipr:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['incipr'].NodeValue)),0);
                   LUkolOdpovednaOs.nazuko:=Trim(VarToStr(LNodeUkol.ChildNodes['nazuko'].NodeValue));
                   LUkolOdpovednaOs.typuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuko'].NodeValue)),0);
                   LUkolOdpovednaOs.vazuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['vazuko'].NodeValue)),0);
                   LUkolOdpovednaOs.spevaz:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['spevaz'].NodeValue)),0);
                   LUkolOdpovednaOs.typuzi:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuzi'].NodeValue)),0);
                   LUkolOdpovednaOs.odposa:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['odposa'].NodeValue)),0);
                   LUkolOdpovednaOs.stauko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['stauko'].NodeValue)),0);
                   LUkolOdpovednaOs.kfirma:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['kfirma'].NodeValue)),0);
                   LUkolOdpovednaOs.castka:=StrToFloatDef(Trim(VarToStr(LNodeUkol.ChildNodes['castka'].NodeValue)),0);
                   LUkolOdpovednaOs.primap:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['primap'].NodeValue)),0);
                   LUkolOdpovednaOs.typzad:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typzad'].NodeValue)),0);
                   LUkolOdpovednaOs.zadava:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['zadava'].NodeValue)),0);
                   LUkolOdpovednaOs.datpln:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datpln'].NodeValue)),cidmin);
                   LUkolOdpovednaOs.datzad:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datzad'].NodeValue)),cidmin);
                   LUkolOdpovednaOs.Popis.Text:=Trim(VarToStr(LNodeUkol.ChildNodes['popis'].NodeValue));
                   if Par.SendNotif then
                      SendNotif(LUkolOdpovednaOs.odposa,LUkolOdpovednaOs.typuzi,LUkolOdpovednaOs.incipr);
                end;
              'u':
                begin
                   Modified:=True;
                   Linpppc:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['inpppc'].NodeValue)),0);
                   LUkolOdpovednaOs:=FUkolOdpovednaOsList.UkolDleKodu(Linpppc);
                   if LUkolOdpovednaOs<>nil then
                     begin
                       LUkolOdpovednaOs:=FUkolOdpovednaOsList.UkolOdpovednaOs[FUkolOdpovednaOsList.InsertRow(FUkolOdpovednaOsList.Count)];
                       LUkolOdpovednaOs.incipr:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['incipr'].NodeValue)),0);
                       LUkolOdpovednaOs.nazuko:=Trim(VarToStr(LNodeUkol.ChildNodes['nazuko'].NodeValue));
                       LUkolOdpovednaOs.typuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuko'].NodeValue)),0);
                       LUkolOdpovednaOs.vazuko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['vazuko'].NodeValue)),0);
                       LUkolOdpovednaOs.spevaz:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['spevaz'].NodeValue)),0);
                       LUkolOdpovednaOs.typuzi:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typuzi'].NodeValue)),0);
                       LUkolOdpovednaOs.odposa:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['odposa'].NodeValue)),0);
                       LUkolOdpovednaOs.stauko:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['stauko'].NodeValue)),0);
                       LUkolOdpovednaOs.kfirma:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['kfirma'].NodeValue)),0);
                       LUkolOdpovednaOs.castka:=StrToFloatDef(Trim(VarToStr(LNodeUkol.ChildNodes['castka'].NodeValue)),0);
                       LUkolOdpovednaOs.primap:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['primap'].NodeValue)),0);
                       LUkolOdpovednaOs.typzad:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['typzad'].NodeValue)),0);
                       LUkolOdpovednaOs.zadava:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['zadava'].NodeValue)),0);
                       LUkolOdpovednaOs.datpln:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datpln'].NodeValue)),cidmin);
                       LUkolOdpovednaOs.datzad:=StrToDateDef(Trim(VarToStr(LNodeUkol.ChildNodes['datzad'].NodeValue)),cidmin);
                       LUkolOdpovednaOs.Popis.Text:=Trim(VarToStr(LNodeUkol.ChildNodes['popis'].NodeValue));
                     end
                   else
                     begin
                       WriteToLog('chyba decode update odpovedna osoba',lmsError);
                       PMSetError(Output,'chyba decode update odpovědná osoba');
                     end;
                end;
              'd':
                begin
                   Modified:=True;
                   Linpppc:=StrToIntDef(Trim(VarToStr(LNodeUkol.ChildNodes['inpppc'].NodeValue)),0);
                   j:=FUkolOdpovednaOsList.IndexDleKodu(Linpppc);
                   if j<>-1 then
                      FUkolOdpovednaOsList.DeleteRow(j)
                   else
                    begin
                       WriteToLog('chyba decode delete odpovedna osoba',lmsError);
                       PMSetError(Output,'chyba decode delete odpovědná osoba');
                    end;
                end;
            end;
          end;
      end;
    end;
end;

procedure P3ServerUkoly.Execute;
begin
  inherited;
  LoadStandard;
  Par.Clear;
  ReadFilter;
  AktUzivatel:=TKvaAktUzivatel.Create(nil);
  try
    AktUzivatel.uzivat:=PermUser;
    AktUzivatel.SQL.Connect:=Connect;
    AktUzivatel.SQL.Read;
    AktUzivatel.AktFirma:=Kfirma;
    try
      ReadIni;
      CreateObjects;
      DecodeXml;
      if Modified then
      begin
        Connect.DbUsr.StartTransaction;
        try
          FUkolPracovnikaList.SQL.Connect:=Connect;
          FUkolPracovnikaList.SQL.CompanyKey:=kfirma;
          FUkolPracovnikaList.SQL.Write;
          FUkolZadavatelList.SQL.Connect:=Connect;
          FUkolZadavatelList.SQL.CompanyKey:=kfirma;
          FUkolZadavatelList.SQL.Write;
          FUkolOdpovednaOsList.SQL.Connect:=Connect;
          FUkolOdpovednaOsList.SQL.CompanyKey:=kfirma;
          FUkolOdpovednaOsList.SQL.Write;
          Connect.DbUsr.Commit;
        except
          Connect.DbUsr.Rollback;
          raise;
        end;
      end;
      EncodeXml;
    finally
    end;
  finally
    AktUzivatel.Free;
  end;
end;

{ TTimeline }

function ExecuteTask(Input:PChar; var Output:PChar; AUserName:PChar; APassword:PChar; ALog:PChar):Integer; stdcall;
begin
  var task: P3ServerUkoly:=P3ServerUkoly.Create(Input,aUserName,APassword,ALog);
  try
    task.Run;
    var s : string:=task.Output.XML.Text;
    SaveOutput(s,Output);
  finally
    task.Free;
  end;
  Result:=0;
end;


{ TLibParams }

procedure TLibParams.Clear;
begin
  Rok:=0;
  Mesic:=0;
  incipr:=0;
  incuzi:=0;
  typuzi:=0;
  SendNotif:=False;
end;

function TLibParams.MaxDate:TDate;
begin
  Result:=EndOfMonth(Rok,Mesic);
end;

function TLibParams.MinDate:TDate;
begin
  Result:=IncMonth(BeginOfMonth(Rok,Mesic),-1);
end;

end.

