[I128-2226] Новый Action RQST/CreateRequestProlongationBS: Обрабатывает логику создания заявки на продление (валидация дат, обновление записи читателя, создание записи в БД заказов)
Action предназначен для создания заявки на продление срока пользования экземпляром издания, находящимся на руках у читателя. Выполняет проверки допустимости продления, создает запись заявки в базе данных заказов и обновляет запись читателя, добавляя информацию о запросе продления.
Входные параметры (GET/POST)
||Параметр||Тип||Обязательность||Описание||
|prolongDate|String|Да|Желаемая дата возврата в формате {}YYYY~~MM~~DD{}. Должна быть строго больше текущей даты и больше текущего срока возврата книги.|
|rdrDb|String|Да|Имя базы данных читателей (например, {}RDR{}).|
|rdrMfn|Integer|Да|MFN записи читателя.|
|occ|Integer|Да|Номер повторения поля выдачи (обычно поле 40) в записи читателя, соответствующий экземпляру, который необходимо продлить.|
|description|String|Нет|Примечание пользователя к заявке.|
Возвращаемое значение (JSON)
Возвращает JSON-объект с результатами выполнения операции.
При успешном выполнении:
{
"success": true,
"massage": "Заявка на продление срока пользования экземпляром издания успешно создана"
}
При ошибке:
{
"success": false,
"massage": "Текст ошибки"
}
Алгоритм работы и проверки
1. Валидация параметров:
Проверяется наличие обязательных параметров ({}prolongDate{}, {}rdrDb{}, {}rdrMfn{}, {}occ{}).
Проверяется, что prolongDate больше текущей системной даты.
2. Инициализация:
Подключаются модули Bookland и {}RQST{}.
Открываются базы данных читателей и заказов.
3. Проверка записи читателя:
Загружается запись читателя по MFN.
Извлекается текущая дата возврата из поля выдачи (тег определяется настройкой {}rdrtagrequest{}, подполе {}rdrdelimreturndate0{}).
** Проверяется, что prolongDate больше текущей даты возврата. Если меньше или равна — выбрасывается исключение.
4. Проверка дубликатов:
** Выполняется поиск существующих заявок на продление для данной пары "Читатель — Книга". Если заявка уже существует, возвращается ошибка.
5. Создание заявки:
Формируется объект данных для заявки типа prolongation (продление), включающий:
** Новую дату возврата.
Идентификаторы читателя и книги (шифр, инвентарный номер, штрих-код).
** Создается новая запись в базе данных заказов ({}RQST{}) через метод {}RQST::CreateRequestRecord{}.
6. Обновление записи читателя:
В соответствующее повторение поля выдачи записи читателя добавляется подполе запроса продления (настройка {}rdrdelimreturndaterequest{}, по умолчанию {}^Q{}) со значением новой даты возврата.
Запись читателя сохраняется.
Возможные ошибки
"Не указана дата возврата"
"Не указана база данных"
"Не указана запись пользователя".
"Дата желаемого возврата должна быть больше текущей даты".
"Ошибка в номере повторения поля 40".
"Не удалось открыть БД".
"Текущий срок возврата уже больше указанной даты".
"Заявка на продление срока пользования экземпляром издания уже существует".
-
I128~~2223 Функция Bookland::GetDbBookByRdrOcc(ObjectDataRecord $rdrRec, int $rdrOcc): ObjectDataDatabase
I128~~2224 Новый раздел настроек АРМ Книговыдача "Настройка подсистемы заявок на продление срока пользования изданием"
I128~~2225 Новый Action RQST/GetRqstProlongationForm: Возвращает HTML-форму для модального окна продления
I128~~2226 Новый Action RQST/CreateRequestProlongationBS: Обрабатывает логику создания заявки на продление (валидация дат, обновление записи читателя, создание записи в БД заказов)
I128~~2227 Возможность для читателей в разделе "Книги на руках" сформировать заявку на продление срока пользования экземпляром издания
I128~~2228 Функционал обработки заявок на продление срока пользования экземпляром издания читателем
Добавлена функция Bookland::GetDbBookByRdrOcc(ObjectDataRecord $rdrRec, int $rdrOcc): ObjectDataDatabase
Оптимизация GetDbBookByRdrOcc.inc
Добавлена настройка подсистемы заявок на продление в Bookland
В модуль Bookland добавлены конфигурационные параметры для управления подсистемой заявок на продление срока пользования изданиями.
Основные изменения:
В ApplyGeneralVariablesConfig.inc добавлен новый раздел настроек "Настройка подсистемы заявок на продление срока пользования изданием".
Реализованы параметры для включения подсистемы (isprolongationallow), отправки уведомлений на email (isprolongationmail), настройки фильтрации, пагинации и форматов отображения.
Добавлена возможность настройки дополнительных колонок и пользовательских кнопок для списка заявок.
Добавлены настройки подполей для даты продления (rdrdelimprolongation) и даты заявки на продление (rdrdelimreturndaterequest).
В api.php обновлен класс BooklandAnswer: добавлены новые свойства в PHPDoc и уточнены сигнатуры методов работы с БД.
Bookland: уточнение типов возвращаемых значений и исправление обработки тега шифра
В методах GetDbBook, GetDbRdr, GetDbRqst изменен тип возвращаемого значения с ObjectData на ObjectDataDatabase.
В RqstExec добавлено приведение dbntagshifr к целому числу (intval) при вызове GetSubField для корректной работы с полями.
Реализована функциональность продления книг и рефакторинг подсистемы заказов (RQST)
Подсистема заказов (RQST):
Рефакторинг типов заказов: Внедрена классовая структура для обработки типов заказов. Создан базовый класс RQSTExType и наследники ExTypeedd (ЭДД) и ExType_prolongation (Продление).
Фабрика типов: Добавлен RqstExTypeFactory для обеспечения обратной совместимости со старым форматом передачи параметров ($scaninfo в виде массива).
CreateRequestRecord:
Метод переписан с использованием строгой типизации аргументов (ObjectDataDatabase, ObjectDataRecord).
Добавлена поддержка объектов RQST_ExType для формирования поля 928.
Улучшена обработка ошибок и проверок (должники, лимиты, доступность экземпляров).
Новые Action-ы:
GetRqstProlongationForm: Возвращает HTML-форму для модального окна продления.
CreateRequestProlongationBS: Обрабатывает логику создания заявки на продление (валидация дат, обновление записи читателя, создание записи в БД заказов).
Добавлен статический метод RQST::getInstance() и подключение новых классов.
Кабинет читателя и История чтения (Users):
В формат ReadHistory.pft128 добавлена кнопка "Продлить" для текущих выдач (страница GetKvInfo).
Оптимизирована функция highlight (использование preg_replace вместо рекурсии).
Исправлена логика фильтрации записей (долги/история) и передача номера повторения (occ) для корректной работы продления.
АРМ Читатель (EC):
В irbis-advancedsearch.js добавлен метод WIrbis.EC.requestBookProlongation для вызова формы продления и обработки ответа сервера.
Мелкие исправления форматирования в JS.
Изменения касаются реализации функционала заявок на продление книг в модуле АРМ Книговыдача (Bookland) и Кабинете читателя.
АРМ Книговыдача: Реализация функционала заявок на продление книг
Добавлена новая таблица WIrbis.B.RqstProlongationTable для отображения списка заявок на продление (фильтр RQSTT=prolongation).
Добавлено модальное окно WIrbis.B.RqstProlongationWindow для обработки заявки библиотекарем (выбор новой даты возврата).
В интерфейс АРМа добавлена вкладка "Продление" (при условии включенной настройки isbroneallow).
Скорректированы поисковые запросы в таблицах обычных заказов (RqstTable) и бронирования (Rqstbrtb), чтобы исключить из них заявки на продление.
Зарегистрированы новые JS-файлы в WIrbis/api.php.
Реализован новый Action RqstExecProlongation для выполнения продления.
Обновлена функция Prodl (__call/Prodl.inc):
Добавлена поддержка привязки к записи заявки ($rqstRec).
Реализовано удаление признака запроса из записи читателя после выполнения.
Исправлен расчет даты возврата (использование strtotime для корректной работы с переходом месяцев/лет).
Добавлена блокировка файла (flock) при обновлении статистики.
В стандартный RqstExec добавлено исключение ExceptionBooklandRqstExec_IsProlongation, которое перехватывает попытку выполнить продление как обычный заказ и открывает соответствующее окно.
Добавлен хелпер GetRdrOccByRqst для поиска экземпляра у читателя по данным из заявки.
RQST (Создание заявок):
Обновлен класс RqstExTypeprolongation: расширен набор сохраняемых данных в поле 928 (БД читателя, идентификатор, шифр книги, инвентарный номер и т.д.).
CreateRequestProlongationBS: Добавлена проверка на существование уже активной заявки на продление для данного экземпляра.
GetRqstProlongationForm: Добавлена проверка на дубликаты заявок и расчет даты по умолчанию.
Кабинет читателя (Users):
Обновлен формат ReadHistory.pft128:
Оптимизирована загрузка записей книг (пакетный запрос вместо цикла).
Добавлено отображение статуса "в обработке заявка на продление".
Добавлена кнопка "Продлить" для выданных книг.
Функционал продления:
Исправлена логика отображения вкладки продления: теперь она зависит от настройки isprolongationallow, а не isbroneallow (отвязана от бронирования).
В таблицу заявок на продление добавлена колонка «Продлить до» (формат RqstProlongationRequestDate).
Колонка «Дата заказа» переименована в «Дата заявки».
Добавлены настройки для конфигурации колонок в списках выполненных заявок на продление и отказов (prolongationcolumnlistissue, prolongationcolumnlistdeny).
Рефакторинг и оптимизация:
Show.inc: Переход на использование getInstance(), оптимизация передачи конфигурации колонок в JS (устранение дублирования кода).
Добавлена логика определения типа заявки (Заказ или Заявка на продление).
Вывод даты, до которой запрашивается продление.
Добавлено экранирование спецсимволов (htmlspecialchars) для безопасности и корректного отображения.
Добавлен новый формат RqstProlongationRequestDate.pft128 для вывода даты продления (поле 928^B).
7. Связанные задачи
7.1. 🔗 Соответствует задача: I128-2233
[I128-2233] Новый Action RQST/CreateRequestProlongationBS: Обрабатывает логику создания заявки на продление (валидация дат, обновление записи читателя, создание записи в БД заказов)
Статус: Открытая задача | Автор: Ilya Mikhaylenko