/
dorofeev_denis
/
test
Обзор
Документация
Войти
/
dorofeev_denis
/
test
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
uRequestService.pas
112 строк
4 KB
dorofeev_denis
update: uRequestService.pas
03 июн 2026, 14:14
Верифицирован
03 июн 2026, 14:14
8a24d85
Код
Авторство
О чём код?
unit uRequestService; interface uses System.SysUtils, FireDAC.Comp.Client, Data.DB; type // Статусы запроса TRequestStatus = (rsCreated, rsInWork, rsReady, rsRejected); //объявляем перечисляемый тип данных для статусов (Enumerated Type), через него можно передавать значения напрямую переменной или функции, например t:= TRequestStatus(1) или MyFunction(TRequestStatus(1)) // Виды справок TDumpCertificateType = (ct2NDFL, ctJobConfirmation, ctCustom); const StatusNames: array[TRequestStatus] of string = //объявление типизированной константы-массива для системных статусов ('Создан', 'В работе', 'Готова', 'Отклонён'); CertNames: array[TDumpCertificateType] of string = ('2-НДФЛ', 'Справка с места работы', 'Иная справка'); type TRequestService = class private FTable: TFDMemTable; // набор данных для работы с таблицами в памяти компьютера procedure SetupFields; //определяем набор полей таблицы public constructor Create; destructor Destroy; override; // API для Сотрудника procedure CreateRequest(const AEmployee, AReason: string; ACertType: TDumpCertificateType; ACopies: Integer); procedure FilterByEmployee(const AEmployee: string); // API для Бухгалтера procedure ClearFilter; procedure UpdateStatus(ARequestID: Integer; ANewStatus: TRequestStatus); property Table: TFDMemTable read FTable; // для привязки к DBGrid end; implementation constructor TRequestService.Create; begin FTable := TFDMemTable.Create(nil); SetupFields; end; destructor TRequestService.Destroy; begin FTable.Free; inherited; end; procedure TRequestService.SetupFields; begin FTable.FieldDefs.Add('ID', ftInteger); FTable.FieldDefs.Add('Employee', ftString, 30); FTable.FieldDefs.Add('CertType', ftString, 30); FTable.FieldDefs.Add('Copies', ftInteger); FTable.FieldDefs.Add('Reason', ftString, 20); FTable.FieldDefs.Add('Status', ftString, 10); FTable.FieldDefs.Add('StatusCode', ftInteger); // Для удобства смены статуса FTable.CreateDataSet; end; procedure TRequestService.CreateRequest(const AEmployee, AReason: string; ACertType: TDumpCertificateType; ACopies: Integer); begin // Валидация бизнес-логики if Trim(AEmployee) = '' then raise Exception.Create('Имя сотрудника не может быть пустым.'); if ACopies <= 0 then raise Exception.Create('Количество экземпляров должно быть больше 0.'); FTable.Append; // добавляем новую пустую строку FTable.FieldByName('ID').AsInteger := FTable.RecordCount + 1; FTable.FieldByName('Employee').AsString := AEmployee; FTable.FieldByName('CertType').AsString := CertNames[ACertType]; FTable.FieldByName('Copies').AsInteger := ACopies; FTable.FieldByName('Reason').AsString := AReason; FTable.FieldByName('Status').AsString := StatusNames[rsCreated]; FTable.FieldByName('StatusCode').AsInteger := Ord(rsCreated); // определяем числовой код статуса для удобства FTable.Post; //сохраняем внесенные изменения в памяти end; procedure TRequestService.FilterByEmployee(const AEmployee: string); begin FTable.Filtered := False; FTable.Filter := 'Employee = ' + QuotedStr(AEmployee); // QuotedStr - обрамляем одинарными кавычками FTable.Filtered := True; end; procedure TRequestService.ClearFilter; begin FTable.Filtered := False; end; procedure TRequestService.UpdateStatus(ARequestID: Integer; ANewStatus: TRequestStatus); begin if FTable.Locate('ID', ARequestID, []) then // поиск требуемой строки begin FTable.Edit; FTable.FieldByName('Status').AsString := StatusNames[ANewStatus]; FTable.FieldByName('StatusCode').AsInteger := Ord(ANewStatus); FTable.Post; end else raise Exception.CreateFmt('Запрос с ID %d не найден.', [ARequestID]); end; end.