Система сообщений: ТЗ



Для чего нужна система сообщений:

- простой обмен сообщений между пользователя СВА, с гарантированной доставкой и возможностью как просмотра времени прочтения получателем, так и получением автоматического уведомления о прочтении получателем

- обмен сообщениями с прикрепленным заказом, что позволит открывать заказ из сообщения, посылать сообщения из заказа и, самой главное, посмотреть историю обмена сообщениями по конкретному заказу (это будут мини-революция, какая была с появлением системы ссылающихся заказов)

- возможность массовой рассылки сообщения по пользователям, как общеинформационных, так и приказов по фирме с обязательным подтверждением (не путать с автоматическим уведомлением) получателем о прочтении и понимании приказа

- возможность назначения и получения системных уведомлений (о изменении остатка личного кошелька, изменении курса, об изменении какого-либо статуса, о появлении в наличии определенной позиции прайс-листа и т.п.)

- обмен системными сообщениями (например об изменении состава групп/подгрупп прайс-листа и обновлении этого списка на уже открытых формах, дистанционное закрытие СВА администратором и т.п.)

- возможность создания сообщения типа «Задача», которую адресат должен выполнить, иначе сообщение будет висеть в списке задач и периодически напоминать о себе, а при выполнении задачи отправителю (по желанию) будет отправляться сообщение о выполнении задачи получателем


Для системы сообщений вводятся права:
- Администратор системы сообщений
- Ответственный пользователь системы сообщений
Администратор автоматически является ответственным пользователем

Для системы сообщений предусмотрен правый верхний тулбар там будут располагаться кнопки вызова окна нового сообщения, просмотр журналов сообщений, поставленных кому-то и полученных от кого-то задач, а также кнопки-индикаторы полученных непрочитанных сообщений.

Все элементы системы сообщений имеют префикс SY_MG. Я сразу дам имена некоторым объектам, чтобы удобнее было создавать ТЗ.

Пока что я не прорабатываю в ТЗ системные сообщения, их будем пришивать уже после реализации. Но сразу ясно, что необходим программный интерфейс для создания сообщения. Скорее всего, это просто функция с перечнем всех параметров нового сообщения, она же будет обслуживать и форму нового сообщения SY_MGNew.


Структура таблицы SY_MGLog


Каждое сообщение (оно же – запись в таблице сообщений) обладает массой атрибутов, которые может задавать пользователь. Для облегчения его задачи атрибуты будут сгруппированы в несколько профилей, но, при желании, почти все атрибуты пользователь может задать самостоятельно для каждого конкретного сообщения.

Список ниже фактически перечень полей таблицы сообщений, часть из них является атрибутами, задаваемыми пользователем

  • ID

  • RecipientType (пользователь=0/компьютер=1)

    Сообщение может быть адресовано конкретному пользователю, независимо от того, на каком компьютере он находится, либо конкретному экземпляру программы, независимо от того, какой пользователь в данный момент на нем работает.

  • RecipientID (ID пользователя или EID компьютера в зависимости от RecipientType)

    При массовой рассылке создается столько сообщений, сколько получателей, поэтому каждое сообщение адресовано только одному получателю

  • Code

    Если код=0, сообщение отображается пользователю, все остальные коды подразумевают, что сообщение системное, и каждый код обрабатывается получателем специфическим образом.

  • Text – собственно текст сообщения

  • ToOrder – «к заказу». 0-нет присоединенного заказа

  • ToMsg – «к сообщению» - это для автоматических уведомлений о прочтении сообщения – указывается ID сообщения, на которое получено уведомление.

  • SenderID - ID пользователя-отправителя (может быть и System)
  • SenderComp - имя компьютера отправителя в сети
  • SendDate - дата/время отправления

  • PopUpDelay

    Время задержки (в минутах) перед тем, как сообщение насильно выскочит в виде окна на передний план. Отсчет начинается в момент приема сообщения компьютером получателя, сообщение индицируется в тулбаре сообщений на протяжении указанного времени, затем, если пользователь его не прочитал, появляется перед глазами.
    PopUpDelay=0 – сообщение появляется сразу без задержки, PopUpDelay=-1 сообщение будет только индицироваться в тулбаре.

    Установить PopUp в интервале 0-9 минут может только ответственный пользователь

  • Priority

    Определяет приоритет, в котором расставляются сообщения на тулбаре (если есть несколько непрочитанных сообщений), а также способ отображения на кнопке тулбара:
    1 – синий
    2 - синий мигающий (по умолчанию)
    3 – красный
    4 – красный мигающий
    (предварительная трактовка, может список как-то изменится по ходу реализации)

    Установить приоритет выше 2 может только ответственный пользователь

  • IsJob – флаг, определяющий данное сообщение как «Задачу»

    Пользователь может только ПРОЧИТАТЬ задачу (производится нотификация о чтении, запись даты прочтения в журнале), и задача будет помещена в список задач, а может ее ВЫПОЛНИТЬ (сразу или потом) (производится нотификация о выполнении, запись даты выполнения в журнале)

  • ReadNotif – флаг, определяющий, что нужно прислать отправителю уведомление, когда получатель прочитает сообщение и нажмет кнопку «ОК» (получатель может отложить чтение сообщение, в этот момент сообщение еще не считается прочитанным). Текст уведомления: "Сообщение 'Текст сообщения, не более 100 символов, если основное сообщение длиннее, на конце многоточие...' отправленное Дата/Время было прочитано пользователем Пользователь Дата/Время"

  • JobCompleteNotif - флаг, определяющий, что нужно прислать отправителю уведомление, когда получатель пометит «Задачу» как выполненную (доступен только если IsJob =1)

  • ConfirmNeeded – флаг, определяющий, что у получателя на кнопке ОК вместо «ОК» появится надпись «Я прочитал, понял и подтверждаю получение данного сообщения». Также сообщения с этим флагом можно отдельно отбирать в журнале сообщений (см. описание журнала), чтобы посмотреть, кто еще не ознакомился с сообщением. Этот флаг в основном будет применяться для приказов по фирме.

    Установить этот флаг может только ответственный пользователь

    Этот флаг не может быть установлен, если IsJob =1

  • ReadDate - дата/время, когда получатель прочитал/подтвердил получение сообщения (NULL – сообщение еще не прочитано)
  • ReadComp - имя компьютера, на котором получатель прочитал/подтвердил получение сообщения

  • JobCompleteDate - дата/время, когда получатель поставил «Задаче» «выполнено» (NULL – задача не выполнена)
  • JobCompleteComp - имя компьютера, на котором получатель поставил задаче "выполнено"

    ОТПРАВИТЕЛЬ «Задачи» имеет право снять выполнение «Задачи» (очистить два вышеуказанных поля), если считает, что задача не выполнена.

  • LiveTimeType
  • LiveTime

    LiveTimeType=0 - время жизни сообщения не ограничено
    LiveTimeType=1 – время жизни сообщения в минутах указано в поле LiveTime
    LiveTimeType=2 – время жизни сообщения в сутках указано в поле LiveTime
    LiveTimeType=3 – время жизни – активный сеанс (если пользователь не прочитал сообщение в данном сеансе или вообще не был в онлайне, он его не получит)


    Инициализация. Прием сообщений. Тулбар.



    Инициализация после логина пользователя:
    - Удаляются сообщения с неактуальным временем жизни LiveTimeType=1 и 2 – для всех получателей и LiveTimeType=3 для конкретного получателя, который логинится в программу
    - Запускается обновление тулбара

    Кнопки тулбара:
    1) Новое сообщение (открывается форма SY_MGNew)
    2) Журнал сообщений (вызывается журнал сообщений SY_MGRegister)
    3) Полученные задачи (вызывается журнал сообщений на закладке "Полученные задачи"), если нет невыполненных задач – иконка на кнопке серая неприметная.
    4) Поставленные задачи (вызывается журнал сообщений на закладке "Поставленные задачи"), если нет невыполненных задач – иконка на кнопке серая неприметная.
    5) Отложенные сообщения. Если нет отложенных сообщений, эта кнопка Disabled. Если есть одно или несколько сообщений – эта кнопка вызывает их в порядке откладывания. Подробнее об отложенных сообщениях см. описание SY_MGRead
    6) Кнопки входящих сообщений (0-15шт). При появлении входящих сообщений появляются кнопки с соответствующими приоритету иконками. Причем сообщения расставляются слева направо в порядке убывания приоритета, т.е. если приходит сообщение с более высоким приоритетом, оно появляется левее сообщений с более низким приоритетом. Сообщения с одинаковым приоритетом расставляются слева направо в порядке увеличения времени создания.
    Отложенные сообщения на этих кнопках не отображаются.

    Необходимо обратить внимание, что признак прочитанности сообщения появляется не при показе его юзеру (как в аське), а после нажатия кнопки "ОК" в окне просмотра сообщения.

    Скорее всего, логично сделать некую единую процедуру обновления всех кнопок на тулбаре и вызывать ее при запуске и изменениях в таблице сообщений, касающихся конкретного пользователя. Об изменениях оповещает, видимо, триггер, оповещает он всех подсоединенных клиентов, передавая данные для нового или измененного сообщения в таблице об отправителе и получателе сообщения, а уж клиент смотрит, если это относится к нему (к залогиненному на клиенте пользователю), то запускает процедуру обновления тулбара. Эта процедура должна начинать свою работу с просмотра массива отложенных сообщений (см. форма просмотра сообщения SY_MGRead)


    Форма нового сообщения SY_MGNew


    Форма фиксированного размера.

    Контролы:
  • FlexST с перепиской с выбранным(и) адресатом(ами), не более 20 последних сообщений. Столбцы: Дата/Время, Отправитель, Получатель, Текст сообщения. По двойному щелчку на сообщении открывается SY_MGRead

  • Фрейм "Параметры сообщения", в который входят:
  • Комбобокс, позволяющий выбрать один из профилей, по которому программируются все остальные контролы в этом фрейме. Кроме профилей в комбобоксе есть пустая строка, как только один из контролов фрейма будет изменен пользователем, в комбобоксе автоматически выбирается пустая строка, что символизирует несоответствие параметров сообщения какому-либо профилю.
  • Комбобокс "Приоритет"
  • Поле "Всплывает через [ ] мин."
  • Чекбокс "Прислать уведомление о прочтении"
  • Чекбокс "Требуется подтверждение ("Ознакомлен")"
  • Чекбокс "Задача"
  • Чекбокс "Прислать уведомление о выполнении задачи"
  • Комбобокс и поле "Время жизни"
    (конец фрейма)
    Смысл контролов этого фрейма описан в разделе "Структура таблицы SY_MGLog"

  • FlexST со списком пользователей (почему именно FlexST – впоследствии туда добавятся некоторые навороты, типа показа статуса юзера (онлайн)).

  • Графический чекбокс "Рассылка" – при включении чекбокса в списке пользователей появляется столбец с чекбоксами, позволяющими выбрать несколько получателей.

  • Текст сообщения

  • Поле для выбора присоединенного заказа с галкой "К заказу" и кнопкой btRecent (посмотреть, как сделано в карточке заказа ZW_OrderCard), вызывающей список последних заказов.

  • Кнопка "Отправить" – создает сообщение(я) и закрывает форму

  • Кнопка "Отмена" (с подтверждением), закрывает форму


    На форме необходимо предусмотреть необязательные входные параметры: номер присоединенного заказа и получатель (для запуска из карточки заказа).


    Форма просмотра сообщения SY_MGRead



    Форма фиксированного размера.

    Контролы:
  • Метки: отправитель, дата/время отправления
  • Текст сообщения
  • Кнопка с написанным на ней номером заказа (появляется только если к сообщению приложен заказ) и по нажатию на эту кнопку открывается карточка заказа
  • Кнопка "К сообщению №", видна только если поле ToMsg<>0 и открывает новую форму SY_MGRead для просмотра этого сообщения
  • Кнопка "ОК"
    - прописывается ReadDate и ReadComp
    - если требуется – автоматически создается уведомление отправителю
    - форма закрывается

    Если ConfirmNeeded, то надпись на кнопке другая (см. описание структуры таблицы) и кнопка становится светло-красной

    Если при запуске формы у этого сообщения уже стоит ReadDate, то на кнопке надпись "Закрыть" и, естественно, она не прописывает второй раз ReadDate и ReadComp и не создает уведомления.
  • Кнопка "Ответить", выполняет все действия кнопки "ОК" и открывает окно нового сообщения с уже выбранным адресатом (SY_MGNew). Если к сообщению приложен заказ, то этот же заказ автоматически прикладывается к ответу.

    Если ConfirmNeeded или IsJob – кнопка "Ответить" недоступна
  • Кнопка "Задача выполнена".
    - прописывается ReadDate и ReadComp (только если не прописано ранее)
    - прописывается JobCompleteDate и JobCompleteComp
    - если требуется (JobCompleteNotif=1 или (ReadDate=Null и ReadNotif=1)) – автоматически создается уведомление отправителю (т.е. если отправитель запросил уведомление и на прочтение и на выполнение, а получатель одновременно и прочитал и выполнил задачу, то отправляется только одно уведомление)
    - форма закрывается

    Если IsJob=0 или JobCompleteDate<>Null – кнопка "Задача выполнена" недоступна
  • Кнопка "Отложить" и поле NumericBox "на [ N ] минут". Поле может меняться от 1 до 15 минут (по умолчанию 5). При нажатии этой кнопки
    - в БД не происходит никаких изменений, а ID сообщения и контрольное время (текущее дата/время +N минут) заносятся в динамический массив отложенных сообщений в памяти. Если массив не пустой, включается некий таймер, который запускает процедуру просмотра массива каждые 15 секунд. Если контрольное время прошло – элемент из массива удаляется и если массив опустевает – таймер останавливается (нехрен ресурсы жечь : )). Процедура просмотра массива также запускается перед обновлением тулбара, в то же время процедура обновления тулбара должна запускаться, если есть какие-то изменения в массиве. Соответственно, процедура обновления тулбара не отображает отложенные сообщения на отдельных кнопках, а только разрешает кнопку "Отложенные сообщения", если массив отложенных сообщений не пустой.
    - форма закрывается
  • Кнопка "Инфо" (маленькая, неприметная) – показывает MsgBox с атрибутами сообщения.


    Если пользователь закроет эту форму крестиком или форма закрывается в результате закрытия СВА - считать, что выполняется действие "Отложить" на 1 минуту.

    Журнал системы сообщений SY_MGRegister



    Форма журнального типа с закладками:
    - История
    - Полученные задачи
    - Поставленные задачи
    - Неполученные
    - Неподтвержденные
    - По заказу

  • История

    Выводится список всех сообщений в соответствии с фильтрами

    Контролы:
    - Два комбобокса с сортировкой (с обратным порядком). По умолчанию первая сортировка по времени в обратном порядке, вторая по получателю.
    - Интервал дат
    - Комбобокс - фильтр по конкретному пользователю (отбор одновременно в отправителе и получателе), по умолчанию "(все)"
    - Второй аналогичный фильтр, по умолчанию установлен на текущего пользователя и виден только администратору сообщений. Таким образом, обычный пользователь может отобрать только свою переписку со всеми или с конкретным пользователем, а администратор может отобрать вообще все сообщения, либо переписку конкретного пользователя со всеми, либо переписку между двумя выбранными пользователями
    - Чекбокс "Только задачи"

    Поля списка:
    - Дата/время
    - Отправитель (по двойному щелчку включается фильтр (первый) по нему)
    - Компьютер отправителя (столбец по умолчанию минимальной ширины)
    - Получатель(по двойному щелчку включается фильтр (первый) по нему)
    - Текст сообщения
    - Заказ (номер или '---') (по двойному щелчку открывается карточка заказа)
    - Уведомление (пустая клетка или "+")
    - Дата/время прочтения
    - Компьютер получателя (столбец по умолчанию минимальной ширины)
    - Подтверждение (пустая клетка или "+")
    - Задача (пустая клетка или "+")
    - Уведомление выполнения задачи (пустая клетка или "+")
    - Дата/время выполнения задачи (если нет – надпись '(не выполнено)')
    - Компьютер выполнения задачи (столбец по умолчанию минимальной ширины)
    - Приоритет
    - Всплывет через
    - Время жизни ('---','сеанс','20 мин','30 сут.')
    - К сообщению (номер) (по двойному щелчку открывается SY_MGRead с этим сообщением)

    По двойному щелчку на остальных полях открывается SY_MGRead с этим сообщением.

  • Полученные задачи

    Выводит все сообщения, где текущий пользователь является получателем и IsJob=1

    Контролы:
    Сортировка (по умолчанию по дате создания в обратном порядке)
    Две радиокнопки:
    - Неотработанные – выводятся все полученные задачи, у которых JobCompleteDate=Null, независимо от даты создания (активна по умолчанию)
    - Все – становится доступен интервал дат, по которому отбираются все полученные задачи

    Поля списка:
    - Дата/время создания
    - Отправитель
    - Дата/время выполнения задачи (если нет – надпись '(не выполнено)')
    - Текст задачи

    По двойному щелчку открывается SY_MGRead с этим сообщением.


  • Поставленные задачи

    Выводит все сообщения, где текущий пользователь является отправителем и IsJob=1

    Контролы:
    Сортировка (по умолчанию по дате создания в обратном порядке)
    Две радиокнопки:
    - Неотработанные – выводятся все поставленные задачи, у которых JobCompleteDate=Null, независимо от даты создания (активна по умолчанию)
    - Все – становится доступен интервал дат, по которому отбираются все поставленные задачи
    Кнопка "Снять признак "Выполнено""
    Кнопка "Удалить задачу"

    Поля списка:
    - Дата/время создания
    - Получатель
    - Дата/время выполнения задачи (если нет – надпись '(не выполнено)')
    - Текст задачи

    По двойному щелчку открывается SY_MGRead с этим сообщением.

  • Неполученные

    Выводятся все сообщения, где текущий пользователь является отправителем, у которых ReadDate=Null, независимо от даты

    Контролы:
    Сортировка (по умолчанию по дате создания в обратном порядке)
    Кнопка "Удалить выбранные"

    Поля списка:
    - Чекбокс
    - Дата/время
    - Получатель
    - Задача (пустая клетка или "+")
    - С подтверждением (пустая клетка или "+")
    - Текст сообщения
    - Время жизни

    По двойному щелчку открывается SY_MGRead с этим сообщением.

  • Неподтвержденные

    Выводятся все сообщения, где текущий пользователь является отправителем, у которых ReadDate=Null и ConfirmNeeded=1, независимо от даты

    Контролы:
    Сортировка (по умолчанию по дате создания в обратном порядке)
    Кнопка "Удалить выбранные"

    Поля списка:
    - Чекбокс
    - Дата/время создания
    - Получатель
    - Текст сообщения

    По двойному щелчку открывается SY_MGRead с этим сообщением.

  • По заказу

    Выводит все сообщения по выбранному заказу, независимо от даты, отправителя и получателя

    Контролы:
    - Сортировка (по умолчанию по дате создания в обратном порядке)
    - Поле с номером заказа. По умолчанию прописывается последний открывавшийся заказ (верхний элемент Recent -списка заказов). Соответственно, выводятся все сообщения, относящиеся к этому заказу, независимо от даты, отправителя и получателя
    - Кнопка btRecent со списком номеров последних заказов

    Поля списка:
    - Дата/время создания
    - Отправитель
    - Получатель
    - Текст сообщения

    По двойному щелчку открывается SY_MGRead с этим сообщением.

    (конец закладок)


    Необходимо предусмотреть получение формой сообщений через FCE о смене закладки и задании номера заказа для последней закладки. Это нужно для вызова из заказа и соответствующими кнопками тулбара. Это нельзя делать входными параметрами запуска журнала, так как журнал уже может быть запущен, несколько экземпляров запускать бессмысленно.
    Пример реализации можно посмотреть в ST_Register – при двойном щелчке на позиции склада – эта позиция активируется в прайс-листе.



    < THANKS ME>