unit uCtrlObehZbozi;

interface
{$I 'GlobalDefs.inc'}


uses
  mvcframework,
  mvcframework.Commons,
  mvcframework.Serializer.Commons,
  uCtrlBase,
  uHeoObj_Base,
  MVCFramework.Swagger.Commons;


const
{$I globalConsts.inc}

type
  [MVCPath('/stavskladu')]
  TStavSkladuController = class(TBaseController)
  public
    [MVCPath('/meta')]
    [MVCHTTPMethod([httpGET])]
    [MVCSwagSummary('Stav skladu', 'Vraci metadata položky stavu skladu', 'StavSkladuGetMeta')]
    procedure GetMeta;

    [MVCPath('')]
    [MVCHTTPMethod([httpGET])]
    [MVCSwagSummary('Stav skladu', 'Vraci položky stavu skladu', 'StavSkladuGetAll')]
    [MVCSwagParam(plQuery, 'idsklad', 'Číslo skladu', ptString, false)]
    [MVCSwagParam(plQuery, 'archivni', '1=včetně blokovaných', ptString, false)]
    [MVCSwagResponses(200, 'Success', TStavSkladu, true)]
    procedure GetAll ([MVCFromQueryString('idsklad', '')] idSklad: string='';
                      [MVCFromQueryString('archivni', '')] archivni: string=''
                     );

    [MVCPath('/($id)')]
    [MVCHTTPMethod([httpGET])]
    [MVCSwagSummary('Stav skladu', 'Vrací data položky stavu skladu', 'StavSkladuGetByID')]
//    [MVCSwagParam(plQuery, 'idsklad', 'Číslo skladu', ptString, false)]
//    [MVCSwagParam(plQuery, 'archivni', '1=včetně blokovaných', ptString, false)]
    [MVCSwagResponses(200, 'Success', TStavSkladu, true)]
    [MVCSwagParam(plPath, 'id', 'ID stavu skladu', ptString, true)]
    procedure GetByID (id: string='';
                       [MVCFromQueryString('idsklad', '')] idSklad: string='';
                       [MVCFromQueryString('archivni', '')] archivni: string=''
                      );
  end;



  [MVCPath('/dokladoz')]
  TDokladOZController = class(TBaseController)
  public
    [MVCPath('/meta')]
    [MVCHTTPMethod([httpGET])]
    [MVCSwagSummary('Doklady oběhu zboží', 'Vrací metadata dokladu oběhu zboží', 'DokladOZGetMeta')]
    procedure GetMeta;

    [MVCPath('/radadokladu')]
    [MVCHTTPMethod([httpGET])]
    [MVCSwagSummary('Doklady oběhu zboží', 'Vrací seznam řad dokladů oběhu zboží', 'DokladOZGetDruhyDok')]
    [MVCSwagResponses(200, 'Success', TDruhDokZbo, true)]
    [MVCSwagParam(plQuery, 'druhpohybu', 'Druh pohybu dokladu', ptString, false)]
    procedure GetDruhyDokladu ([MVCFromQueryString('druhpohybu', '')] druhpohybu: string='');

    [MVCPath('/($id)')]
    [MVCHTTPMethod([httpGET])]
    [MVCSwagSummary('Doklady oběhu zboží', 'Vrací doklad oběhu zboží dle ID', 'DokladOZGetByID')]
    [MVCSwagResponses(200, 'Success', TDokladOZ, true)]
    [MVCSwagParam(plPath, 'id', 'ID dokladu OZ', ptString, true)]
    [MVCSwagParam(plQuery, 'polozky', '0=bez polozek / 1=polozkami', ptString, false)]
    [MVCSwagParam(plQuery, 'sdserver', '1=vyrobni cisla/sarze z tabulky SDScanData', ptString, false)]
    procedure GetByID (id: string='';
                       [MVCFromQueryString('sdserver', '')] sdServer: string='1';
                       [MVCFromQueryString('polozky', '')] polozky: string='0'
                      );

    [MVCPath('')]
    [MVCHTTPMethod([httpGET])]
    [MVCSwagSummary('Doklady oběhu zboží', 'Vrací doklady oběhu zboží', 'DokladOZGetAll')]
    [MVCSwagResponses(200, 'Success', TDokladOZ, true)]
    [MVCSwagParam(plQuery, 'cisloorg', 'Číslo organizace', ptString, false)]
    [MVCSwagParam(plQuery, 'druhpohybu', 'Druh pohybu dokladu', ptString, false)]
    [MVCSwagParam(plQuery, 'radadokladu', 'Řada dokladů pohybového dokladu', ptString, false)]
    [MVCSwagParam(plQuery, 'sklad', 'Sklad', ptString, false)]
    [MVCSwagParam(plQuery, 'od', 'Datum od ve formátu RRRRMMDD (pokud neni zadano, bere se jen vcera a dnes)', ptString, false)]
    [MVCSwagParam(plQuery, 'do', 'Datum do ve formátu RRRRMMDD', ptString, false)]
    [MVCSwagParam(plQuery, 'realizovane', '1=jen realizované doklady', ptString, false)]
    [MVCSwagParam(plQuery, 'seznam', '1=jen seznam se základními údaji', ptString, false)]
    [MVCSwagParam(plQuery, 'minimum', '0=vsechny sloupce / 1=jen zakladni udaje', ptString, false)]
    [MVCSwagParam(plQuery, 'polozky', '0=bez polozek / 1=s polozkami (default)', ptString, false)]
    [MVCSwagParam(plQuery, 'sdserver', '1=vyrobni cisla/sarze z tabulky SDScanData', ptString, false)]
    procedure GetAll ([MVCFromQueryString('cisloorg', '')] cisloorg: string='';
                      [MVCFromQueryString('druhpohybu', '')] druhpohybu: string='';
                      [MVCFromQueryString('radadokladu', '')]  radadokladu: string='';
                      [MVCFromQueryString('sklad', '')] sklad: string='';
                      [MVCFromQueryString('od', '')] odDatum: string='';
                      [MVCFromQueryString('do', '')] doDatum: string='';
                      [MVCFromQueryString('realizovane', '')] realizovane: string='0';
                      [MVCFromQueryString('seznam', '0')] jenSeznam: string='';
                      [MVCFromQueryString('minimum', '')] minimumDat: string='';
                      [MVCFromQueryString('polozky', '1')] polozky: string='';
                      [MVCFromQueryString('sdserver', '')] sdServer: string=''
                     );

{$IFDEF POST_PUT}
    [MVCPath('/($id)')]
    [MVCHTTPMethod([httpPUT])]
    [MVCSwagSummary('Doklady oběhu zboží', 'Upraví doklad oběhu zboží', 'DokladOZZalozUpravOZ')]
    [MVCConsumes(TMVCMediaType.APPLICATION_JSON)]
    procedure UpravDokladOZ (id: string; CTX: TWebContext);

    [MVCPath('')]
    [MVCHTTPMethod([httpPOST])]
    [MVCSwagSummary('Doklady oběhu zboží', 'Založí doklad oběhu zboží', 'DokladOZZalozDokladOZ')]
    [MVCConsumes(TMVCMediaType.APPLICATION_JSON)]
    procedure ZalozDokladOZ (CTX: TWebContext);
{$ENDIF}
  end;



  [MVCPath('/polozkaoz')]
  TPolozkaOZController = class(TBaseController)
  public
{
    procedure GetByICODIC(const [MVCFromQueryString('ico', '')] ico: string;
                          const [MVCFromQueryString('dic', '')] dic: string
                         );
}
    [MVCPath('/meta')]
    [MVCHTTPMethod([httpGET])]
    [MVCSwagSummary('Položky oběhu zboží', 'Vrací metadata položky dokladu oběhu zboží', 'PolozkaOZGetMeta')]
    procedure GetMeta;

    [MVCPath('')]
    [MVCHTTPMethod([httpGET])]
{$IFDEF CUSTOM_CTRL_Rootvin}
    [MVCSwagSummary('Položky oběhu zboží', 'Vrací položky dokladů oběhu zboží.' + CRLF + CRLF + 'Pozor u výrobních čísel (serialnums) položek materiálové příjemky' + CRLF + '- atribut Nazev1 je ŠARŽE'
                                            + CRLF + '- atribut VyrCis je číslo PALETOVÉHO LISTU' + CRLF + '!! Pokud je nastaven sloupec ZdrojSD=1 je potreba to pri komunikaci zminovat !!'
                                            + CRLF + '(je to příznak že ID není ze standardní tabulky Heliosu ale zdrojem jsou skenovaná data SD Serveru)', 'PolozkaOZGetAll')]
{$ELSE}
    [MVCSwagSummary('Položky oběhu zboží', 'Vrací položky dokladů oběhu zboží', 'PolozkaOZGetAll')]
{$ENDIF}
    [MVCSwagResponses(200, 'Success', TPohybOZ, true)]
    [MVCSwagParam(plQuery, 'iddoklad', 'ID dokladu oběhu zboží', ptString, false)]
    procedure GetAll ([MVCFromQueryString('iddoklad', '')] iddoklad: string=''
                     );


    [MVCPath('/($id)')]
    [MVCHTTPMethod([httpGET])]
    [MVCSwagSummary('Položky oběhu zboží', 'Vrací data položky/položek oběhu zboží', 'PolozkaOZGetByID')]
    [MVCSwagResponses(200, 'Success', TPohybOZ, true)]
    [MVCSwagParam(plPath, 'id', 'ID položky OZ', ptString, true)]
    procedure GetByID (id: string='';
                       [MVCFromQueryString('iddoklad', '')] iddoklad: string=''
                      );

{$IFDEF POST_PUT}
    [MVCPath('/($id)')]
    [MVCHTTPMethod([httpPUT])]
    [MVCSwagSummary('Položky oběhu zboží', 'Upraví položku na doklad oběhu zboží', 'PolozkaOZUpravPolozkuOZ')]
    [MVCConsumes(TMVCMediaType.APPLICATION_JSON)]
    procedure UpravPolozkuOZ (id: string=''; CTX: TWebContext);

    [MVCPath('')]
    [MVCHTTPMethod([httpPOST])]
    [MVCSwagSummary('Položky oběhu zboží', 'Založí položku na doklad oběhu zboží', 'PolozkaOZZalozPolozkuOZ')]
    [MVCConsumes(TMVCMediaType.APPLICATION_JSON)]
    procedure ZalozPolozkuOZ (CTX: TWebContext);
{$ENDIF}
  end;



implementation

uses
  uSvc_Base,
  uCommons,
  mvcframework.Serializer.Intf,
  System.Generics.Collections,
  System.RegularExpressions,
  System.StrUtils,
  System.SysUtils;




{ TStavSkladuController }

 procedure TStavSkladuController.GetMeta;
  begin
    try
      Render(ObjectDict().Add('data', GetDokladOZService.GetMeta));
     except
{$IFDEF NORENDER400}
      RenderStatusMessage (200);
{$ELSE}
      on E: EServiceException do
      begin
        raise EMVCException.Create(E.Message, '', 0, 200);
      end
      else
        raise;
{$ENDIF}
    end;
  end;



 procedure TStavSkladuController.GetAll(idSklad: string=''; archivni: string='');
  begin
   idSklad:= sanitizeSQLString(idSklad);
   archivni:= sanitizeSQLString(archivni);
   GetByID('', idSklad, archivni);
  end;



 procedure TStavSkladuController.GetByID(id: string = ''; idSklad: string=''; archivni: string='');
  var iId: integer;
      params: TDictionary<string, string>;
  begin

   params:= TDictionary<string, string>.Create;

   iId:= 0;
   id:= sanitizeSQLString(id);
   if not(TryStrToInt(id, iId)) then
    iId:= 0;
   if (iId>0) then
    params.Add('id', iId.ToString);

   idSklad:= sanitizeSQLString(idSklad);
   if (idSklad<>'') then
    params.Add('idsklad', idSklad);

   archivni:= sanitizeSQLString(archivni);
   if (archivni<>'') then
    if (archivni='1') then
     params.Add('blokovane', '1');


   try
     Render(ObjectDict().Add('data', GetStavSkladuService.GetByParams(params, FDM.sqlConn))); // viz uSvc_ObehZbozi.pas
    except
{$IFDEF NORENDER400}
     RenderStatusMessage (200);
{$ELSE}
     on E: EServiceException do
      begin
       raise EMVCException.Create(E.Message, '', 0, 200);
      end
     else
       raise;
{$ENDIF}
   end;

   params.Free;

  end;






{ TDokladOZController }

 procedure TDokladOZController.GetAll (cisloorg: string=''; druhpohybu: string=''; radadokladu: string=''; sklad: string=''; odDatum: string='';
                                        doDatum: string=''; realizovane: string='0'; jenSeznam: string=''; minimumDat: string=''; polozky: string='';
                                        sdServer: string='');
  var iId, iCisOrg, dpz: integer;
      params: TDictionary<string, string>;
  begin

   params:= TDictionary<string, string>.Create;
{
   cisloorg:= sanitizeSQLString(cisloorg);
   druhpohybu:= sanitizeSQLString(druhpohybu);
   radadokladu:= sanitizeSQLString(radadokladu);
   sklad:= sanitizeSQLString(sklad);
   odDatum:= sanitizeSQLString(odDatum);
   doDatum:= sanitizeSQLString(doDatum);
   jenSeznam:= sanitizeSQLString(jenSeznam);

   GetByID ('', cisloorg, druhpohybu, radadokladu, sklad, odDatum, doDatum, jenSeznam);
}

   iCisOrg:= -1;
   cisloorg:= sanitizeSQLString(cisloorg);
   if not(TryStrToInt(cisloorg, iCisOrg)) then
    iCisOrg:= -1;
   if (iCisOrg>-1) then
    params.Add('organizace', iCisOrg.ToString);

   dpz:= -1;
   druhpohybu:= sanitizeSQLString(druhpohybu);
   if not(TryStrToInt(druhpohybu, dpz)) then
    dpz:= -1;
   if (dpz>-1) then
    params.Add('druhpohybu', dpz.ToString);

   radadokladu:= sanitizeSQLString(radadokladu);
   if (radadokladu<>'') then
    params.Add('radadokladu', radadokladu);

   sklad:= sanitizeSQLString(sklad);
   if (sklad<>'') then
    params.Add('sklad', sklad);

   odDatum:= sanitizeSQLString(odDatum);
   if (odDatum<>'') then
    params.Add('odDatum', odDatum);

   doDatum:= sanitizeSQLString(doDatum);
   if (doDatum<>'') then
    params.Add('doDatum', doDatum);

   jenSeznam:= sanitizeSQLString(jenSeznam);
   if (jenSeznam='1') then
    params.Add('seznam', '1');

   minimumDat:= sanitizeSQLString(minimumDat);
   if (minimumDat='1') then
    params.Add('minimum', '1');

   polozky:= sanitizeSQLString(polozky);
   if (polozky='1') then
    params.Add('polozky', '1');

   realizovane:= sanitizeSQLString(realizovane);
   if (realizovane='1') then
    params.Add('jenReal', '1');

   sdServer:= sanitizeSQLString(sdServer);
   if (sdServer='1') then
    params.Add('sdServer', '1');


   try
     Render(ObjectDict().Add('data', GetDokladOZService.GetByParams (params, FDM.sqlConn))); // viz uSvc_ObehZbozi.pas
    except
{$IFDEF NORENDER400}
     RenderStatusMessage (200);
{$ELSE}
     on E: EServiceException do
      begin
       raise EMVCException.Create(E.Message, '', 0, 200);
      end
     else
       raise;
{$ENDIF}
   end;

   params.Free;

  end;




 procedure TDokladOZController.GetDruhyDokladu (druhpohybu: string = '');
  begin
   druhpohybu:= sanitizeSQLString(druhpohybu);

   try
     Render(ObjectDict().Add('data', GetDokladOZService.GetDruhyDokladu(druhpohybu))); // viz uSvc_ObehZbozi.pas
    except
{$IFDEF NORENDER400}
     RenderStatusMessage (200);
{$ELSE}
     on E: EServiceException do
      begin
       raise EMVCException.Create(E.Message, '', 0, 200);
      end
     else
       raise;
{$ENDIF}
   end
  end;




 procedure TDokladOZController.GetByID (id: string=''; sdServer: string='1'; polozky: string='0');
  var iId: integer;
      params: TDictionary<string, string>;
  begin

   params:= TDictionary<string, string>.Create;

   sdServer:= sanitizeSQLString(sdServer);
   if (sdServer='1') then
    params.Add('sdServer', '1');

   if (polozky='1') then
    params.Add('polozky', '1');


   iId:= 0;
   id:= sanitizeSQLString(id);
   if not(TryStrToInt(id, iId)) then
    iId:= 0;
   if (iId>0) then
     begin
      params.Add('id', iId.ToString);
      try
        Render(ObjectDict().Add('data', GetDokladOZService.GetByParams (params, FDM.sqlConn))); // viz uSvc_ObehZbozi.pas
       except
   {$IFDEF NORENDER400}
        RenderStatusMessage (200);
   {$ELSE}
        on E: EServiceException do
         begin
          raise EMVCException.Create(E.Message, '', 0, 200);
         end
        else
          raise;
   {$ENDIF}
      end
     end
    else
     RenderStatusMessage (200);

   params.Free;

  end;




 procedure TDokladOZController.GetMeta;
  begin
    try
      Render(ObjectDict().Add('data', GetDokladOZService.GetMeta));
     except
{$IFDEF NORENDER400}
       RenderStatusMessage (200);
{$ELSE}
      on E: EServiceException do
       begin
        raise EMVCException.Create(E.Message, '', 0, 200);
       end
      else
        raise;
{$ENDIF}
    end;
  end;



{$IFDEF POST_PUT}
 procedure TDokladOZController.UpravDokladOZ (id: string; CTX: TWebContext);
  var iId: integer;
  begin
    try
    except
{$IFDEF NORENDER400}
       RenderStatusMessage (200);
{$ELSE}
     on E: EServiceException do
       begin
        raise EMVCException.Create(E.Message, '', 0, 200);
       end
      else
        raise;
{$ENDIF}
    end;
  end;



 procedure TDokladOZController.ZalozDokladOZ (CTX: TWebContext);
  begin
    try
    except
{$IFDEF NORENDER400}
       RenderStatusMessage (200);
{$ELSE}
     on E: EServiceException do
       begin
        raise EMVCException.Create(E.Message, '', 0, 200);
       end
      else
        raise;
{$ENDIF}
    end;
  end;
{$ENDIF}





{ TPolozkaOZController }

 procedure TPolozkaOZController.GetMeta;
  begin
    try
      Render(ObjectDict().Add('data', GetPolozkaOZService.GetMeta));
    except
{$IFDEF NORENDER400}
       RenderStatusMessage (200);
{$ELSE}
     on E: EServiceException do
       begin
        raise EMVCException.Create(E.Message, '', 0, 200);
       end
      else
        raise;
{$ENDIF}
    end;
  end;



 procedure TPolozkaOZController.GetAll (iddoklad: string = '');
  begin
   iddoklad:= sanitizeSQLString(iddoklad);
   GetByID('', iddoklad);
  end;




 procedure TPolozkaOZController.GetByID (id: string=''; iddoklad: string='');
  var iId, iIdDoklad: integer;
      params: TDictionary<string, string>;
  begin
   params:= TDictionary<string, string>.Create;

   iId:= 0;
   id:= sanitizeSQLString(id);
   if not(TryStrToInt(id, iId)) then
    iId:= 0;
   if (iId>0) then
    params.Add('id', iId.ToString);


   iIdDoklad:= -1;
   iddoklad:= sanitizeSQLString(iddoklad);
   if not(TryStrToInt(iddoklad, iIdDoklad)) then
    iIdDoklad:= -1;
   if (iIdDoklad>-1) then
    params.Add('iddoklad', iIdDoklad.ToString);

   try
     Render(ObjectDict().Add('data', GetPolozkaOZService.GetByParams(params, FDM.sqlConn))); // viz uSvc_ObehZbozi.pas
    except
{$IFDEF NORENDER400}
       RenderStatusMessage (200);
{$ELSE}
     on E: EServiceException do
      begin
       raise EMVCException.Create(E.Message, '', 0, 200);
      end
     else
       raise;
{$ENDIF}
   end;
   params.Free;
  end;



{$IFDEF POST_PUT}
 procedure TPolozkaOZController.UpravPolozkuOZ (id: string=''; CTX: TWebContext);
  var iId: integer;
  begin

   try
    except
{$IFDEF NORENDER400}
       RenderStatusMessage (200);
{$ELSE}
     on E: EServiceException do
      begin
       raise EMVCException.Create(E.Message, '', 0, 200);
      end
     else
       raise;
{$ENDIF}
   end;
  end;



 procedure TPolozkaOZController.ZalozPolozkuOZ (CTX: TWebContext);
  begin
   try
    except
{$IFDEF NORENDER400}
       RenderStatusMessage (200);
{$ELSE}
     on E: EServiceException do
      begin
       raise EMVCException.Create(E.Message, '', 0, 200);
      end
     else
       raise;
{$ENDIF}
   end;
  end;

{$ENDIF}

end.
