Prvni verze
This commit is contained in:
561
uCtrlQMS.pas
Normal file
561
uCtrlQMS.pas
Normal file
@ -0,0 +1,561 @@
|
||||
unit uCtrlQMS;
|
||||
|
||||
interface
|
||||
{$I 'GlobalDefs.inc'}
|
||||
|
||||
uses
|
||||
mvcframework,
|
||||
mvcframework.Commons,
|
||||
mvcframework.Serializer.Commons,
|
||||
uCtrlBase,
|
||||
uHeoObj_Base,
|
||||
uHeoObj_QMS
|
||||
{$IFDEF SWAGGER}
|
||||
,MVCFramework.Swagger.Commons
|
||||
{$ENDIF}
|
||||
;
|
||||
|
||||
const
|
||||
{$I globalConsts.inc}
|
||||
|
||||
type
|
||||
[MVCPath('/qms')]
|
||||
TQMSObecneController = class(TBaseController)
|
||||
public
|
||||
[MVCPath('/ciselnik/stavmeridel')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - Číselníky', 'Vrací číselník stavů měřidel', 'QMSCiselnikGetStavMeridel')]
|
||||
[MVCSwagResponses(200, 'Success', TQMSCiselnik, true)]
|
||||
procedure GetCiselnikStavMeridel; // ciselnik-1, IdQMS-0
|
||||
|
||||
[MVCPath('/ciselnik/druhmeridel')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - Číselníky', 'Vrací číselník druhů měřidel', 'QMSCiselnikGetDruhMeridel')]
|
||||
[MVCSwagResponses(200, 'Success', TQMSCiselnik, true)]
|
||||
procedure GetCiselnikDruhMeridel; // ciselnik-2, IdQMS-0
|
||||
|
||||
[MVCPath('/ciselnik/kategoriemeridel')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - Číselníky', 'Vrací číselník kategorií měřidel', 'QMSCiselnikGetKategorieMeridel')]
|
||||
[MVCSwagResponses(200, 'Success', TQMSCiselnik, true)]
|
||||
procedure GetCiselnikKategorieMeridel; // ciselnik-3, IdQMS-0
|
||||
|
||||
[MVCPath('/ciselnik/stavyudrzby')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - Číselníky', 'Vrací číselník stavů údržby strojů a zařízení', 'QMSCiselnikGetStavUdrzby')]
|
||||
[MVCSwagResponses(200, 'Success', TQMSCiselnik, true)]
|
||||
procedure GetCiselnikStavUdrzby; // ciselnik-1, IdQMS-1
|
||||
|
||||
[MVCPath('/ciselnik/druhyudrzby')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - Číselníky', 'Vrací číselník druhů údržby strojů a zařízení', 'QMSCiselnikGetDruhUdrzby')]
|
||||
[MVCSwagResponses(200, 'Success', TQMSCiselnik, true)]
|
||||
procedure GetCiselnikDruhUdrzby; // ciselnik-2, IdQMS-1
|
||||
|
||||
end;
|
||||
|
||||
|
||||
[MVCPath('/udrzbastroju')]
|
||||
TQMSUdrzbaStrojuAZarizeniController = class(TBaseController)
|
||||
public
|
||||
[MVCPath('/meta')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - Údržba strojů a zařízení', 'Vraci metadata údržby strojů a zařízení', 'QMSUdrzbaGetMeta')]
|
||||
procedure GetMeta;
|
||||
|
||||
[MVCPath('/hledej'), MVCHTTPMethod([httpPOST])]
|
||||
[MVCSwagSummary('QMS - Údržba strojů a zařízení', 'Hledá záznam údržby stroje či zařízení', 'QMSUdrzbaHledatUdrzbuStrojeAZarizeni')]
|
||||
[MVCConsumes(TMVCMediaType.APPLICATION_JSON)]
|
||||
[MVCSwagResponses(200, 'Success', TQMSUdrzbaStrojuAZarizeni, true)]
|
||||
procedure HledatUdrzbuStrojeAZarizeni;
|
||||
|
||||
[MVCPath]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - Údržba strojů a zařízení', 'Vrací seznam všech údržeb strojů a zařízení', 'QMSUdrzbaGetAll')]
|
||||
[MVCSwagResponses(200, 'Success', TQMSUdrzbaStrojuAZarizeni, true)]
|
||||
procedure GetAll;
|
||||
|
||||
[MVCPath]
|
||||
[MVCHTTPMethod([httpPOST])]
|
||||
[MVCSwagSummary('QMS - Údržba strojů a zařízení', 'Zápis hlavičky Údržby stroje či zařízení', 'QMSUdrzbaZapisUdrzbyStrojuAZarizeni')]
|
||||
[MVCConsumes(TMVCMediaType.APPLICATION_JSON)]
|
||||
procedure NovaUdrzbaStrojuAZarizeni (CTX: TWebContext);
|
||||
|
||||
[MVCPath('/($id)')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - Údržba strojů a zařízení', 'Vrací detail údržeb strojů či zařízení', 'QMSUdrzbaGetByID')]
|
||||
[MVCSwagParam(plPath, 'id', 'ID zaznamu', ptString, false)]
|
||||
[MVCSwagParam(plQuery, 'utvar', 'Útvar/středisko', ptString, false)]
|
||||
[MVCSwagParam(plQuery, 'stav', 'Číslo stavu údržby, nikoliv id (viz /qms/ciselnik/stavyudrzby)', ptString, false)]
|
||||
[MVCSwagParam(plQuery, 'druh', 'Číslo druhu údržby, nikoliv id (viz /qms/ciselnik/druhyudrzby)', ptString, false)]
|
||||
[MVCSwagResponses(200, 'Success', TQMSUdrzbaStrojuAZarizeni, true)]
|
||||
procedure GetByID (id: string='0';
|
||||
[MVCFromQueryString('utvar', '')] utvar: string='';
|
||||
[MVCFromQueryString('stav', '')] stav: string='';
|
||||
[MVCFromQueryString('druh', '')] druh: string=''
|
||||
);
|
||||
|
||||
[MVCPath('/($id)')]
|
||||
[MVCHTTPMethod([httpPUT])]
|
||||
[MVCSwagSummary('QMS - Údržba strojů a zařízení', 'Aktualizuje záznam údržby stroje či zařízení', 'QMSUdrzbaAktualizaceUdrzbyStrojuAZarizeni')]
|
||||
[MVCConsumes(TMVCMediaType.APPLICATION_JSON)]
|
||||
procedure AktualizaceUdrzbyStrojuAZarizeni (CTX: TWebContext; id: string='');
|
||||
|
||||
end;
|
||||
|
||||
|
||||
|
||||
[MVCPath('/qms/kontrolnipostup')]
|
||||
// [MVCPath('/kontrolnipostup')]
|
||||
// [MVCSwagSummary('KontrolniPostupy', 'Kontrolní postupy', '')]
|
||||
TQMSKontrolniPostupyController = class(TBaseController)
|
||||
public
|
||||
[MVCPath('/meta')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - kontrolní postupy', 'Vrátí meta informace', 'QMSKontrolniPostupGetMeta')]
|
||||
procedure GetMeta;
|
||||
|
||||
[MVCPath('/($id)')]
|
||||
// [MVCProduces('application/json')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - kontrolní postupy', 'Vratí detail kontrolního postupu', 'QMSKontrolniPostupGetByID')]
|
||||
[MVCSwagParam(plPath, 'id', 'ID kontrolního postupu', ptString, false)]
|
||||
[MVCSwagParam(plQuery, 'idpostup', 'ID výrobního postupu', ptString, false)]
|
||||
[MVCSwagParam(plQuery, 'params', 'Zobrazit parametry', ptBoolean, false)]
|
||||
[MVCSwagParam(plQuery, 'paramsFull', 'Zobrazit parametry', ptBoolean, false)]
|
||||
[MVCSwagResponses(200, 'Success', TQMSKontrolniPostup)]
|
||||
procedure GetByID (id: string='0';
|
||||
[MVCFromQueryString('idpostup', '')] sIdPostup: string='';
|
||||
[MVCFromQueryString('params', false)] params: Boolean=false;
|
||||
[MVCFromQueryString('paramsFull', false)] paramsFull: Boolean=false
|
||||
);
|
||||
[MVCPath('')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - kontrolní postupy', 'Vrátí seznam kontrolních postupů', 'QMSKontrolniPostupGetAll')]
|
||||
[MVCSwagResponses(200, 'Success', TQMSKontrolniPostup, true)]
|
||||
procedure GetAll;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
[MVCPath('/qms/kontrolniplan')]
|
||||
// [MVCPath('/kontrolniplan')]
|
||||
// [MVCDoc('QMS - kontrolní plány')]
|
||||
TQMSKontrolniPlanController = class(TBaseController)
|
||||
public
|
||||
[MVCPath('/meta')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - kontrolní plán', 'Vrati meta informace', 'QMSKontrolniPlanGetMeta')]
|
||||
procedure GetMeta;
|
||||
|
||||
[MVCPath('/($id)')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - kontrolní plán', 'Vrati kontrolni plan', 'QMSKontrolniPlanGetByID')]
|
||||
[MVCSwagParam(plPath, 'id', 'ID kontrolního plánu', ptString, true)]
|
||||
[MVCSwagResponses(200, 'Success', TQMSKontrolniPlan, false)]
|
||||
procedure GetByID (id: string='0');
|
||||
|
||||
[MVCPath('')]
|
||||
[MVCHTTPMethod([httpGET])]
|
||||
[MVCSwagSummary('QMS - kontrolní plán', 'Vrati seznam kontrolnich planu', 'QMSKontrolniPlanGetAll')]
|
||||
[MVCSwagParam(plQuery, 'kategorie', 'Kategorie výrobního plánu', ptString, false)]
|
||||
[MVCSwagResponses(200, 'Success', TQMSKontrolniPlan, true)]
|
||||
procedure GetAll ([MVCFromQueryString('kategorie', '')] kategorie: string=''
|
||||
);
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
uSvc_Base,
|
||||
uCommons,
|
||||
mvcframework.Serializer.Intf,
|
||||
System.Generics.Collections,
|
||||
System.RegularExpressions,
|
||||
System.StrUtils,
|
||||
System.SysUtils,
|
||||
Winapi.ActiveX,
|
||||
IdHTTP,
|
||||
System.JSON,
|
||||
JsonDataObjects,
|
||||
helTabsBIDs;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{ TQMSObecneController }
|
||||
|
||||
procedure TQMSObecneController.GetCiselnikStavMeridel;
|
||||
begin
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSObecneService.GetCislenikQMS (1, 0))); // viz uSvc_QMS.pas
|
||||
except
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 404);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TQMSObecneController.GetCiselnikDruhMeridel;
|
||||
begin
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSObecneService.GetCislenikQMS (2, 0))); // viz uSvc_QMS.pas
|
||||
except
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 404);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TQMSObecneController.GetCiselnikKategorieMeridel;
|
||||
begin
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSObecneService.GetCislenikQMS (3, 0))); // viz uSvc_QMS.pas
|
||||
except
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 404);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TQMSObecneController.GetCiselnikStavUdrzby;
|
||||
begin
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSObecneService.GetCislenikQMS (1, 1))); // viz uSvc_QMS.pas
|
||||
except
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 404);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TQMSObecneController.GetCiselnikDruhUdrzby;
|
||||
begin
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSObecneService.GetCislenikQMS (2, 1)));
|
||||
except
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 404);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{ TQMSUdrzbaStrojuAZarizeniController }
|
||||
|
||||
procedure TQMSUdrzbaStrojuAZarizeniController.GetAll;
|
||||
begin
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSUdrzbaStrojuAZarizeniService.GetAll)); // viz uSvc_QMS.pas
|
||||
except
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 404);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TQMSUdrzbaStrojuAZarizeniController.GetByID (id: string='0'; utvar: string=''; stav: string=''; druh:string='');
|
||||
var iId, iCislo: integer;
|
||||
typ: Byte;
|
||||
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);
|
||||
|
||||
utvar:= LeftStr(sanitizeSQLString(utvar), 30);
|
||||
if (utvar<>'') then
|
||||
params.Add('utvar', utvar);
|
||||
|
||||
stav:= LeftStr(sanitizeSQLString(stav), 3);
|
||||
if (stav<>'') then
|
||||
params.Add('stav', stav);
|
||||
|
||||
druh:= LeftStr(sanitizeSQLString(druh), 3);
|
||||
if (druh<>'') then
|
||||
params.Add('druh', druh);
|
||||
|
||||
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSUdrzbaStrojuAZarizeniService.GetByParams (params)));
|
||||
except
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 404);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
end;
|
||||
|
||||
params.Free;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TQMSUdrzbaStrojuAZarizeniController.GetMeta;
|
||||
begin
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSUdrzbaStrojuAZarizeniService.GetMeta));
|
||||
except
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 404);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TQMSUdrzbaStrojuAZarizeniController.HledatUdrzbuStrojeAZarizeni;
|
||||
var params: TJsonObject;
|
||||
udrzby: TObjectList<TQMSUdrzbaStrojuAZarizeni>;
|
||||
begin
|
||||
params:= TJsonBaseObject.Parse(Context.Request.Body) as TJsonObject;
|
||||
// udrzby:= GetQMSUdrzbaStrojuAZarizeniService.GetByFindParams (Params.S['hledej']);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TQMSUdrzbaStrojuAZarizeniController.AktualizaceUdrzbyStrojuAZarizeni (CTX: TWebContext; id: string='');
|
||||
var jsonData, respStr: string;
|
||||
begin
|
||||
try
|
||||
jsonData:= CTX.Request.Body;
|
||||
// if (jsonData<>'') then
|
||||
// GetVyrobniOperaceService.ZapisDZTasku (jsonData, respStr);
|
||||
ResponseStatus(HTTP_STATUS.OK, 'OK');
|
||||
Render(respStr);
|
||||
except
|
||||
RenderStatusMessage (200);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TQMSUdrzbaStrojuAZarizeniController.NovaUdrzbaStrojuAZarizeni (CTX: TWebContext);
|
||||
var jsonData, respStr: string;
|
||||
o: System.JSON.TJSONObject;
|
||||
begin
|
||||
respStr:= '';
|
||||
o:= System.JSON.TJSONObject.Create;
|
||||
try
|
||||
jsonData:= CTX.Request.Body;
|
||||
// if (jsonData<>'') then
|
||||
ResponseStatus(HTTP_STATUS.OK, 'OK');
|
||||
Render(respStr);
|
||||
except
|
||||
RenderStatusMessage (200);
|
||||
end;
|
||||
if (o<>nil) then
|
||||
o.Free;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{ TQMSKontrolniPostupyController }
|
||||
|
||||
procedure TQMSKontrolniPostupyController.GetAll;
|
||||
begin
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSKontrolniPostupyService.GetAll)); // viz uSvc_Vyroba.pas
|
||||
except
|
||||
RenderStatusMessage (200);
|
||||
{
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 200);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
}
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TQMSKontrolniPostupyController.GetByID (id: string='0'; sIdPostup: string=''; params: boolean = false; paramsFull: boolean = false);
|
||||
var iId, idPostup: integer;
|
||||
typ: byte;
|
||||
begin
|
||||
|
||||
id:= sanitizeSQLString(id);
|
||||
if not(TryStrToInt(id, iId)) then
|
||||
iId:= 0;
|
||||
|
||||
sIdPostup:= sanitizeSQLString(sIdPostup);
|
||||
if not(TryStrToInt(sIdPostup, idPostup)) then
|
||||
idPostup:= 0;
|
||||
|
||||
typ:= 255;
|
||||
if (iId>0) then
|
||||
typ:= 0;
|
||||
if (idPostup>0) then
|
||||
typ:= 1;
|
||||
if (iId>0) and (params) then
|
||||
typ:= 2;
|
||||
if (iId>0) and (paramsFull) then
|
||||
typ:= 3;
|
||||
|
||||
|
||||
try
|
||||
case typ of
|
||||
0: Render(ObjectDict().Add('data', GetQMSKontrolniPostupyService.GetByID(iId)));
|
||||
1: Render(ObjectDict().Add('data', GetQMSKontrolniPostupyService.GetListByIDPostup(idPostup)));
|
||||
2: Render(ObjectDict().Add('data', GetQMSKontrolniPostupyService.GetParamsByIDHlav(iId)));
|
||||
end;
|
||||
except
|
||||
RenderStatusMessage (200);
|
||||
{
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 200);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
}
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TQMSKontrolniPostupyController.GetMeta;
|
||||
begin
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSKontrolniPostupyService.GetMeta));
|
||||
except
|
||||
RenderStatusMessage (200);
|
||||
{
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 200);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
}
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
{ TQMSKontrolniPlanController }
|
||||
|
||||
procedure TQMSKontrolniPlanController.GetMeta;
|
||||
begin
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSKontrolniPlanService.GetMeta));
|
||||
except
|
||||
RenderStatusMessage (200);
|
||||
{
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 200);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
}
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TQMSKontrolniPlanController.GetByID (id: string = '0');
|
||||
var iId: integer;
|
||||
begin
|
||||
id:= sanitizeSQLString (id);
|
||||
if not(TryStrToInt(id, iId)) then
|
||||
iId:= 0;
|
||||
if (iId>0) then
|
||||
begin
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSKontrolniPlanService.GetByID(iId)));
|
||||
except
|
||||
RenderStatusMessage (200);
|
||||
{
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 200);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
}
|
||||
end;
|
||||
end
|
||||
else
|
||||
RenderStatusMessage (200);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure TQMSKontrolniPlanController.GetAll (kategorie: string='');
|
||||
var p: TDictionary<string, string>;
|
||||
begin
|
||||
p:= TDictionary<string, string>.Create;
|
||||
|
||||
kategorie:= sanitizeSQLString (kategorie);
|
||||
if (kategorie<>'') then
|
||||
p.Add ('kategorie', kategorie);
|
||||
|
||||
try
|
||||
Render(ObjectDict().Add('data', GetQMSKontrolniPlanService.GetByParams (p) )); // viz uSvc_Vyroba.pas
|
||||
except
|
||||
RenderStatusMessage (200);
|
||||
{
|
||||
on E: EServiceException do
|
||||
begin
|
||||
raise EMVCException.Create(E.Message, '', 0, 200);
|
||||
end
|
||||
else
|
||||
raise;
|
||||
}
|
||||
end;
|
||||
|
||||
p.Free;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
end.
|
||||
Reference in New Issue
Block a user