Анкеты¶
Анкеты предназначены для описания структуры и иерархии данных для формата АВО.
Список анкет¶
{
"action" : "anketa.list"
-- параметры фильтрации, должен быть хотя бы один параметр
--
-- если выбрана последняя порция списка, то ответ содержит "last_page" : 1
--
-- доступны поля
--
-- anketa.id -- "уникальный идентификатор анкеты"
--
,"filter" : [ фильтр в синтаксисе stat.uni ]
,"order" : [ сортировка ответа в синтаксисе stat.uni ]
,"skip" : количество пропускаемых записей от начала списка -- по умолчанию 0
,"first" : количество выбираемых записей после skip -- по умолчанию 50, не более 50
}
ответ
{
<общие поля>
,"list" : [
{
"system" : "системная, да, нет (1, 0)" -- системные анкеты не доступны для изменения
,"id" : "уникальный идентификатор"
,"name" : "название",
}
...
]
}
Чтение анкеты¶
ответ
{
<общие поля>
,"obj" : {
"id" : код-анкеты,
"param" : {
"name" : "название анкеты",
"system" : 0|1 -- анкета системная, попытки изменения закончатся ошибкой
},
"order" : [ -- порядок вопросов
"код-вопроса3",
"код-вопроса8",
.....
"код-вопроса4"
]
"quests" : { -- вопросы анкеты
"код-вопроса" : {
"id" : код-вопроса,
"@" : номер по порядку,
"name" : формулировка вопроса,
"type" : тип вопроса,
-- для типа "dt"
"subtype" : под-тип вопроса
-- yd - Дата и время с точностью от года до дня
-- yh - Дата и время с точностью от года до часа
-- ym - Дата и время с точностью от года до минуты
-- ys - Дата и время с точностью от года до секунды
-- для типа "free"
"width" : ширина поля в байтах для типа free
-- для типа "1m" или "nm"
"answers" : { -- ответы вопроса
"код ответа1" : "название ответа1",
"код ответа2" : "название ответа2",
.....
"код ответа3" : "название ответа3",
},
"order" : [ -- порядок ответов
"код ответа3",
"код ответа1",
.....
"код ответа2"
],
"form" : {
-- свойства вопроса при использовании анкеты в форме как анкеты для первичного приёма данных
}
},
............
},
}
Удаление анкеты¶
ответ
Создание анкеты¶
{
"action" : "anketa.create"
,"name" : "Название анкеты",
необязательные:
,"copy_from" : "уникальный идентификатор анкеты (не нужен для создаваемой с нуля, а не копируемой анкеты)"
,"id" : "уникальный код анкеты"
-- не обязательно
,"return_fresh_obj" : "нужно вернуть данные объекта -- да, нет ( 1 | 0 )"
}
ответ
{
<общие поля>
,"id" : "код анкеты"
}
если "return_fresh_obj" : "1"
ответ -- как на запрос чтения "action" : "anketa.get" соответствующей анкеты
Сохранение анкеты¶
{
"action" : "anketa.set"
,"id" : "идентификатор анкеты"
,"name" : "название анкеты"
необязательный
,"return_fresh_obj" : "нужно вернуть данные объекта -- да, нет ( 1 | 0 )"
}
ответ
{
<общие поля>
}
если "return_fresh_obj" : "1"
ответ -- как на запрос чтения "action" : "anketa.get" соответствующей анкеты
Добавления нового вопроса анкеты¶
{
"action" : "anketa.quest.add"
,"anketa.id" : "уникальный идентификатор анкеты вопроса"
-- добавление одного вопроса
,obj : { -- описание вопроса
"name" : "Текст вопроса"
,"type" : "Тип вопроса"
-- free - свободный ввод
-- dt - дата и время
-- 1m - выбор одного из списка
-- nm - выбор нескольких из списка
-- int - целое число
-- параметры, определяемые типом вопроса:
-- для type=free:
,"width" : "количество символов для свободного ввода" -- обязателен, > 0
-- для type=dt:
,"dtsubtype" : "точность для даты и времени" -- обязателен
-- yd - от года до дня. в данных записывается и выводится в формате "YYYY-MM-DD"
-- yh - от года до часа. в данных записывается и выводится в формате "YYYY-MM-DD hh"
-- ym - от года до минуты. в данных записывается и выводится в формате "YYYY-MM-DD hh:mm"
-- ys - от года до секунды. в данных записывается и выводится в формате "YYYY-MM-DD hh:mm:ss"
-- для type=1m или nm (выбор из списка):
,"answers" : { -- ответы вопроса
"код ответа 1" : "название ответа1"
,"код ответа 2" : "название ответа2"
.....
,"код ответа N" : "название ответаN"
}
,"order" : [ -- порядок ответов
"код ответа 3"
,"код ответа 8"
.....
,"код ответа 4"
]
-- необязательные для любого типа
,"id" : "уникальный идентификатор вопроса"
-- свойства вопроса при использовании анкеты в форме как анкеты для первичного приёма данных
-- не обязательно
,"form" : {
-- Видимость в форме
"hidden" : 0|1 -- 0 - по умолчанию - поле в форме будет полем ввода
1 - поле в форме будет иметь тип hidden и значение default
-- Обязательность заполнения
,"mustbe" : 0|1 -- 0 - по умолчанию - поле не обязательно для заполнения (игнорируется для hidden=1)
-- при первоначальном отображении формы в поле будет значение default
-- 1 - поле обязательно для заполнения
-- Значение по умолчанию
,"default" : "значение по умолчанию" -- для всех вопросов кроме 1m и nm
,"default" : [код ответа] -- для вопросов 1m
,"default" : [код ответа1 , код ответа 2, ... ] -- для вопросов nm
-- в какой вопрос какой анкеты-хранилища копируется результат при подтверждении заполнения формы
-- параметры или оба отсутствуют или оба указаны и не пустые
-- анкета не может быть системной или показывать на саму себя
-- тип вопроса, в который будет идти копирование должен совпадать с типом вопроса в obj
-- для вопросов 1m и nm все возможные ответы текущего вопроса должны быть в ответах вопроса в который будет идти копирование
,"trans.ank" : "код анкеты"
,"trans.quest" : "код вопроса"
}
}
-- добавление нескольких вопросов, любая ошибка отменяет все изменения. Будут добавлены или все вопросы или ни
,obj : [
{ описание вопроса-1 }
,{ описание вопроса-2 }
,...............
]
-- не обязательно
,"return_fresh_obj" : 0|1 -- вернуть новый объект анкета -- да (1), нет
}
ответ
{
<общие поля>
,"obj" : { объект анкета как из ответа anketa.get } -- если "return_fresh_obj" : "1"
-- в зависимости от вида параметра obj в вызове
,"id" : "id-добавленного вопроса"
-- или
,"id" : [ -- порядок id соответствует порядку объектов в параметре obj в вызове
"id-добавленного вопроса-1"
,"id-добавленного вопроса-2"
.......
]
}
Изменение вопроса анкеты¶
{
"action" : "anketa.quest.set"
,"anketa.id" : "уникальный идентификатор анкеты вопроса"
-- добавление одного вопроса
,"obj" : { -- описание вопроса
"id" : "уникальный идентификатор вопроса"
,"name" : "Текст вопроса"
-- параметры, определяемые типом вопроса:
-- для type=free:
,"width" : "количество символов для свободного ввода, обязателен, > 0"
-- для type=1m или nm:
,"answers" : { -- ответы вопроса
"код ответа 1" : "название ответа 1"
,"код ответа 2" : "название ответа 2"
.....
,"код ответа N" : "название ответа N"
}
,"order" : [ -- порядок ответов
"код ответа 3"
,"код ответа 8"
.....
,"код ответа 4"
]
,"form" : {
-- свойства вопроса при использовании анкеты в форме как анкеты для первичного приёма данных
-- параметр необязателен
-- при указании "form" в запросе, все параметры вопроса, связанные с ним, заменяются на новые указанные или удаляются
}
-- изменение нескольких вопросов, любая ошибка отменяет все изменения. Будут изменены или все вопросы, или не все.
,obj : [
{ описание вопроса-1 }
,{ описание вопроса-2 }
,...............
]
-- не обязательно
,"return_fresh_obj" : 0|1 -- вернуть новый объект анкета -- да (1), нет (0, по умолчанию)
}
ответ
{
<общие поля>
,"obj" : { объект анкета как из ответа anketa.get } -- если "return_fresh_obj" : "1"
-- в зависимости от вида параметра obj в вызове
,"id" : "id-добавленного вопроса"
-- или
,"id" : [ -- порядок id соответствует порядку объектов в параметре obj в вызове
"id-добавленного вопроса-1"
,"id-добавленного вопроса-2"
.......
]
}
Удаление вопроса анкеты¶
Удаление нескольких вопросов транзакционно - удаляются или все (нет ошибок), или ни один (хоть одна ошибка).
{
"action" : "anketa.quest.delete"
,"anketa.id" : "уникальный идентификатор анкеты вопроса"
,"id" : "уникальный идентификатор вопроса"
-- или
,"id" : [ "id1", "id2", ..... ]
--- необязательный
,"return_fresh_obj" : "нужно вернуть данные объекта -- да, нет ( 1 | 0 )"
}
ответ
{
<общие поля>
}
если "return_fresh_obj" : "1"
ответ -- как на запрос чтения "action" : "anketa.get" соответствующей анкеты
Изменение позиции вопроса анкеты¶
{
"action" : "anketa.quest.order"
,"anketa.id" : "уникальный идентификатор анкеты вопроса"
,"order" : [ -- новый порядок вопросов
"код-вопроса3"
,"код-вопроса8"
.....
,"код-вопроса4"
]
-- необязательный
,"return_fresh_obj" : "нужно вернуть данные объекта -- да, нет ( 1 | 0 )"
}
ответ
{
<общие поля>
}
если "return_fresh_obj" : "1"
ответ -- как на запрос чтения "action" : "anketa.get" соответствующей анкеты
Удаление ответа вопроса анкеты¶
Для вопросов типа "1m" и "nm".
{
"action" : "anketa.quest.response.delete"
,"anketa.id" : "уникальный идентификатор анкеты вопроса"
,"quest.id" : "уникальный идентификатор вопроса"
,"id" : "уникальный идентификатор ответа"
-- необязательный
,"return_fresh_obj" : "нужно вернуть данные объекта -- да, нет ( 1 | 0 )"
}
ответ
{
<общие поля>
}
если "return_fresh_obj" : "1"
ответ -- как на запрос чтения "action" : "anketa.get" соответствующей анкеты
Изменение позиции ответа вопроса¶
Для вопросов типа "1m" и "nm".
{
"action" : "anketa.quest.response.order"
,"anketa.id" : "уникальный идентификатор анкеты вопроса"
,"id" : "уникальный идентификатор вопроса"
,"order" : [ -- новый порядок ответов
"код-ответа3"
,"код-ответа8"
.....
,"код-ответа4"
]
-- необязательный
,"return_fresh_obj" : "нужно вернуть данные объекта -- да, нет ( 1 | 0 )"
}
ответ