3.1 Общая концепция расписания NDemia CashMatic Schedule.
Ежедневное расписание настраивается через Панель управления
NDemia CashMatic (см
Настройка расписания событий).
Расписание представляет собой набор событий, каждое событие имеет время и имя, а также необязательный произвольный комментарий.
Прикладной скрипт может установить обработчик для событий с определёнными именами, обработчик указывается как имя функции, которая должна быть вызвана для обработки события (см.
Установка функции-обработчика события). Прикладной скрипт обязательно должен снимать обработчик события при переходе на другие HTML-страницы, иначе возможен вызов указанной функции на другой странице, что приведёт к ошибке
javascript в
Internet Explorer.
На одно имя события можно установить только одну функцию обработки.
Когда наступает момент обработки события, вызывается соответствующий обработчик (если он установлен). Обработчик события — это
javascript-функция, которая при вызове через параметры получает имя события, комментарий, время обработки события (вычисленное по расписанию), время предыдущей обработки события с тем же именем (записанное в системном реестре
Windows) — см.
Программная обработка события.
Рекурсивная обработка одноимённых событий исключена (однако возможен вызов обработчика события во время обработки другого события).
Временем обработки события (фиксируемым в системном реестре
Windows) по умолчанию является время вызова функции-обработчика (время входа), однако запись в реестр делается по завершению обработки (время выхода).
Прикладной скрипт имеет возможность влиять на регистрируемое время последней обработки событий — см.
Управление записью времени обработки события.
Взаимодействие прикладного скрипта с компонентом
NDemia CashMatic Schedule осуществляется через интерфейс
CashMatic.Session (см.
http://ndemia.com/CashMatic/u-home/PG/session/SessionObjProps.php ), однако для удобства описания необходимых свойств и вызовов данный документ содержит образцы функций на
javascript (образцы, не примеры — предполагается прямое копирование кода
javascript в проекты прикладных разработчиков).
3.2 Настройка расписания событий.
NDemia CashMatic Schedule plugin предоставляет возможность настраивать ежедневное расписание программно обрабатываемых событий - произвольное количество событий с произвольными именами, в том числе повторяющимися в течение дня.
При установке
NDemia CashMatic Schedule plugin в Панели управления
NDemia CashMatic добавляется вкладка
"Расписание".

На этой странице размещается расписание событий, которые могут в соответствующее время передаваться прикладному скрипту для обработки.
Пользователь имеет возможность создавать, изменять и удалять любые события (синтаксис имён не определён, верхний-нижний регистр не различается, допускаются повторения имён в течение дня, допускается создание нескольких событий на одно время - из нескольких событий с одним именем на одно время будет обработано только одно).
Расписание хранится в системном реестре
Windows в разделе
HKEY_CURRENT_USER\Software\NDemia\CashMatic\Plugins\Schedule\Schedule
(имена подразделов и структура записей — внутренняя информация компонента, которая не должна интерпретироваться каким-либо образом)
Отметки об обработке событий заносятся в реестр в разделе
HKEY_CURRENT_USER\Software\NDemia\CashMatic\Plugins\Schedule\Processed
(время записывается в UTC, т. е. «по Гринвичу»)
(данная информация может быть использована только в целях отладки и наблюдения)
При создании или изменении события расписания открывается соответствующий диалог:
Время: желательное время вызова обработчика события. Если обработка не будет выполнена в указанное время, она всё равно будет выполнена в ближайшее возможное время после указанного.
Событие: программный идентификатор события (имя, название, наименование, тип и т. п. - терминология выбирается по усмотрению разработчика прикладного скрипта). Этот идентификатор должен быть обязательно согласован с прикладным скриптом (и, соответственно, должен указываться точно).
Комментарий: произвольный комментарий, по усмотрению пользователя (комментарий доступен обработчику события, поэтому комментарий можно рассматривать как произвольный дополнительный параметр обработчика).
При сохранении расписания в реестре (нажатие кнопок
Ok или
Применить после изменения) приложение
NDemia CashMatic KioskBrowser перезапускается (расписание прочитывается из реестра только при запуске приложения).
ВНИМАНИЕ: все записываемые в реестр события (как созданные, так и изменённые) относятся только к будущему — если указано время меньше текущего, то это событие будет обрабатываться только на следующий день. Благодаря этому механизму можно в любой момент создавать новые события в «прошлом» или переносить времена обработки событий из «будущего» в «прошлое» (относительно текущего времени) без их немедленной обработки при перезапуске приложения
NDemia CashMatic KioskBrowser (они не будут признаны просроченными). Кроме того, не будут считаться «просроченными вчера» события, созданные или изменённые в «будущем» (относительно текущего) времени.
Однако при этом есть риск в результате изменения пропустить/потерять обработку действительно просроченного события.
Например, если мы в 12:01 вносим изменение в событие на 12:00, которое по каким-либо причинам ещё не было обработано сегодня, то его обработка будет выполнена только в 12:00 завтрашнего дня.
Время изменения фиксируется для каждой строки расписания отдельно, «перенос в будущее» касается только новых и изменённых строк.
Изменением считается любое нажатие
Ok в диалоге
«Изменение события», даже если никакие данные не редактировались.
Имеется возможность отключить вкладку Панели управления
NDemia CashMatic "Расписание". Для этого в разделе реестра
HKEY_CURRENT_USER\Software\NDemia\CashMatic\Plugins\Schedule
нужно создать ненулевое значение
REG_DWORD "Control Disabled".
3.3 Установка функции-обработчика события.
Для того, чтобы в указанный в расписании момент времени выполнилась программная обработка соответствующего события, прикладной скрипт должен обратиться к компоненту
NDemia CashMatic Schedule и указать имя функции, которая будет обрабатывать события с соответствующим именем.
Функция-обработчик устанавливается следующим вызовом (функция-образец для
javascript):
function ScheduleSetHandler(event, func)
//event – имя (тип, наименование, идентификатор, обозначение) события
//func – имя функции, которая должна вызываться для обработки (может быть пустым — в этом случае обработка события event отключается)
{
if(event)
{
CashMatic.Session.AddProp("Schedule.Event.Name", event);
CashMatic.Session.AddProp("Schedule.Event.Function", func? func : ""); //значение «ложь» должно быть преобразовано в пустую строку
CashMatic.Session.Event("Schedule.Event.SetHandler");
//в случае успеха значение «Schedule.Event.Name» должно вернуться пустым
if(CashMatic.Session.GetProp("Schedule.Event.Name"))
throw new Error("Schedule plugin not installed");
}
}
На одно событие (на одно имя) может быть установлена только одна функция-обработчик.
Одна функция-обработчик может быть установлена на несколько разных имён событий.
При закрытии HTML-страницы прикладной скрипт обязательно должен отключить все свои обработчики событий. Объект
CashMatic (и все его расширения) существует вне контекста HTML-документа, поэтому, когда произойдёт переход на другой URL-адрес, имя функции-обработчика не сбросится без явного указания скрипта. Если это допустить, то при наступлении времени события возможен вызов несуществующей функции, что приведёт к ошибке
Internet Explorer (
javascript), причём интерпретировать эту ошибку будет трудно — она будет ссылаться на код, построенный программно, которого нет в текущем прикладном скрипте.
Настоятельно рекомендуется отключать все обработчики на время приёма платежа (т. е. перед вызовом
CashMatic.Session.Start() ), чтобы не создавать неожиданных проблем пользователю-плательщику.
NDemia CashMatic Schedule plugin достаточно тщательно отслеживает расписание и выполнение обработки, поэтому временное отключение обработчиков не грозит потерей или пропуском событий — только создаётся некоторая задержка времени обработки. Даже после отключения программы на несколько дней все пропущенные события будут обработаны (хотя бы по одному разу на каждое имя события).
3.4 Программная обработка события.
При наступлении соответствующего времени обработки события, для которого установлена функция-обработчик,
NDemia CashMatic Schedule plugin вызывает эту функцию со следующими параметрами:
handler(event, comment, reqTime, prevTime)
где
handler – имя функции-обработчика;
name – имя события;
comment – комментарий события (см. Настройка расписания событий);
reqTime – дата и время настроенного по расписанию момента вызова обработки события (меньше или равно текущему времени);
prevTime - дата и время предыдущей обработки события (меньше текущего времени, может быть пустая строка).
Параметры
reqTime и
prevTime передаются в виде текстовых строк, подходящих для преобразования в
javascript-объект
Date (например:
new Date(reqTime) ).
Параметр
prevTime может быть пустой строкой — в случаях, если предыдущая обработка ни разу не выполнялась, или если запись в реестре была сброшена (см.
Управление записью времени обработки события, функция
ScheduleEventReset).
Если внутри функции-обработчика вызываются какие-либо функции
javascript, допускающие собственные модальные циклы обработки сообщений
Windows (
alert,
confirm,
prompt,
showModalDialog и т. п.), то в принципе возможны наложения событий (вложенная обработка), что может привести к рекурсии функции-обработчика. Компонент
NDemia CashMatic Schedule предотвращает вложенную обработку одноимённых событий, но разрешает вложенную обработку событий с разными именами.
3.5 Управление записью времени обработки события.
В системном реестре
Windows для каждого имени события регистрируется время последней выполненной обработки события (с точностью до секунд).
Обработка события может выполняться сколь угодно долго — внутренний механизм
NDemia CashMatic Schedule plugin это допускает. Временем обработки по умолчанию считается время вызова обработчика, запись времени в реестр происходит после завершения обработки.
Разработчик прикладного скрипта может влиять на регистрацию этого времени - это может существенно влиять на последующие действия компонента
NDemia CashMatic Schedule.
Функция-образец, которая немедленно записывает в реестр текущее время как время последней обработки события (эта функция может вызываться как внутри обработчика события, так и вне обработки, например, если требуемые по расписанию действия выполнены досрочно по каким-то другим причинам)
function ScheduleEventProcessed(event)
//event – имя (тип, наименование, идентификатор, обозначение) события
{
if(event)
{
CashMatic.Session.AddProp("Schedule.Event.Name", event);
CashMatic.Session.Event("Schedule.Event.Processed");
//в случае успеха значение «Schedule.Event.Name» должно вернуться пустым
if(CashMatic.Session.GetProp("Schedule.Event.Name"))
throw new Error("Schedule plugin not installed");
}
}
Функция-образец, которая отменяет запись в реестр времени текущей обработки (эта функция имеет смысл только внутри обработчика события, в результате этого действия обработка события будет вызвана ещё раз):
function ScheduleEventCancel(event)
//event – имя (тип, наименование, идентификатор, обозначение) события
{
if(event)
{
CashMatic.Session.AddProp("Schedule.Event.Name", event);
CashMatic.Session.Event("Schedule.Event.Cancel");
//в случае успеха значение «Schedule.Event.Name» должно вернуться пустым
if(CashMatic.Session.GetProp("Schedule.Event.Name"))
throw new Error("Schedule plugin not installed");
}
}
Функция-образец, которая удаляет из реестра время последней обработки указанного события (эта функция имеет смысл как внутри обработчика события, так и вне обработки, в результате этого действия событие будет обработано заново при первой же возможности):
function ScheduleEventReset(event)
//event – имя (тип, наименование, идентификатор, обозначение) события
{
if(event)
{
CashMatic.Session.AddProp("Schedule.Event.Name", event);
CashMatic.Session.Event("Schedule.Event.Reset");
//в случае успеха значение «Schedule.Event.Name» должно вернуться пустым
if(CashMatic.Session.GetProp("Schedule.Event.Name"))
throw new Error("Schedule plugin not installed");
}
}