<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://docs.deansoffice.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Puppetmaster</id>
		<title>DOF - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://docs.deansoffice.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Puppetmaster"/>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Puppetmaster"/>
		<updated>2026-04-12T15:59:49Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.2</generator>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:%D0%98%D0%B4%D0%B5%D0%B8&amp;diff=2263</id>
		<title>Разработка:Идеи</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:%D0%98%D0%B4%D0%B5%D0%B8&amp;diff=2263"/>
				<updated>2011-06-07T15:31:04Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Специальный режим для &amp;quot;тяжелых&amp;quot; процессов: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе размещаются идеи и пожелания к проекту, которые пока не отражены в планах работ. При составлении плана работ и разработке новых плагинов идеи и пожелания из этого раздела учитываются Идеи могут быть разбиты в группы.&lt;br /&gt;
==Список==&lt;br /&gt;
=== Школьные журналы ===&lt;br /&gt;
==== Изменения в статусах присутствия/отсутствия на уроке ====&lt;br /&gt;
'''Краткое описание:''' Изменить статусы присутствия в таблице schpresences: поле ''present'' должно содержать не числовые значения 1 или 0, а enum-значения &amp;quot;was&amp;quot; и &amp;quot;away&amp;quot;. Ноль сложнее отличать от отсутствия записи из-за неявного приведения типов в PHP.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' Станет возможным легко отличать 2 разных случая: отсутствие записи о посещении ученика в таблице, и отсутствии ученика на уроке.&lt;br /&gt;
==== Подсказка по темам урока в школьном журнале ====&lt;br /&gt;
'''Краткое описание:''' В левой части журнала (там, где выставляются оценки) при наведении мыши на число сделать всплывающую подсказку, соответствующую теме урока.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' Навигация по журналу станет более удобной.&lt;br /&gt;
==== Редактирование всех оценок одного ученика по одному предмету ====&lt;br /&gt;
'''Краткое описание:''' Предусмотреть возможность редактировать оценки не только всех учеников по одной дате, но и все оценки одного ученика по всем датам.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' Можно будет редактировать все оценки одного ученика без перезагрузки формы&lt;br /&gt;
* ''Каких ресурсов это потребует?'' небольших: требуется незначительно изменить функцию отображения журнала. Не более 1 часа на кодирование и тестирование.&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться?''&lt;br /&gt;
==== Редактирование оценок совмещенное с просмотром журнала, редактирование старых оценок по клику из того же интерфейса. ====&lt;br /&gt;
'''Краткое описание:'''&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?''&lt;br /&gt;
* ''Каких ресурсов это потребует?''&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться?''&lt;br /&gt;
==== Правильная фиксация замен ====&lt;br /&gt;
'''Краткое описание:'''&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?''&lt;br /&gt;
* ''Каких ресурсов это потребует?''&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться?''&lt;br /&gt;
==== Механизм &amp;quot;билетов на замены&amp;quot; с кодами доступа для проведения замен без санкции завуча в системе ====&lt;br /&gt;
'''Краткое описание:'''&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?''&lt;br /&gt;
* ''Каких ресурсов это потребует?''&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться?''&lt;br /&gt;
==== Замечания по ведению классного журнала. Проверка журнала по результату четверти. ====&lt;br /&gt;
'''Краткое описание:'''&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?''&lt;br /&gt;
* ''Каких ресурсов это потребует?''&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться?''&lt;br /&gt;
==== Отметка посещаемости без расписания ====&lt;br /&gt;
'''Краткое описание:'''&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?''&lt;br /&gt;
* ''Каких ресурсов это потребует?''&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться?''&lt;br /&gt;
&lt;br /&gt;
=== Школьные табели (i-Школа) ===&lt;br /&gt;
* Возможность экспорта данных для тарификации (по постоянным учителям нагрузка в третью неделю месяца, по совместителям - кол-во отработанных часов)&lt;br /&gt;
* Формирование приказов на изменение нагрузки у постоянных учителей если изменилось по сравнению с предыдущим месяцем.&lt;br /&gt;
* Дать возможность завучам и преподавателям самостоятельно сформировать свои требования к FDO, пусть они напишут, что им нравится и что они хотели бы улучшить. Есть отличный сервис для таких вещей [http://reformal.ru/] . Предлагаю использовать его.&lt;br /&gt;
&lt;br /&gt;
=== Профессиональная переподготовка (ЮРГУЭС) ===&lt;br /&gt;
&amp;lt;strike&amp;gt; &lt;br /&gt;
==== Номера дипломов/свидетельств/сертификатов====&lt;br /&gt;
Справочник programmsbcs, новые поля:&lt;br /&gt;
* Номер сертификата certificatenum - 255 символов&lt;br /&gt;
* Код формы/бланка сертификата certificateform - 30 символов (должен совпадать с кодом шаблона в плагине storage/programmsbcs)&lt;br /&gt;
* Дата выдачи сертификата certificatedate&lt;br /&gt;
* Номер приказа, в соответствии с которым выдан сертификат certificateorderid&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные поля в контракт ====&lt;br /&gt;
Форма договора (шаблон)&lt;br /&gt;
Юр. лицо (если не указано - значит договор с физ. лицом, для бесплатников указывается управление образованием и т.п.)&lt;br /&gt;
Куратор данного ученика от работодателя (id персоны или не указан)&lt;br /&gt;
&lt;br /&gt;
==== Справочник организаций, место работы, должность ====&lt;br /&gt;
(для коллективных договоров)&lt;br /&gt;
Справочник организаций: Полное наименование, краткое наименование, ИНН, КПП, ОГРН, банковские реквизиты, юридический адрес (по таблице адресов), физический адрес, почтовый адрес, телефон, факс, дополнительные реквизиты, ФИО руководителя, должность руководителя, основание действия руководителя.&lt;br /&gt;
Привязка персоны к месту работы: id персоны, id организации, основное место работы/совместитель/не известно/уволен, должность, дата приема/не известно, дата увольнения/неизвестно, рабочий телефон, добавочный номер, комментарий.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тип итогового контроля в курсе ====&lt;br /&gt;
В справочнике programmitems добавить поле&lt;br /&gt;
controltypeid - тип итогового контроля по данному курсу.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Разное ===&lt;br /&gt;
==== Добавить возможность задавать одновременно несколько статусов для worflow ====&lt;br /&gt;
''Описание:'' Вместо понятия &amp;quot;статус&amp;quot; ввести понятие &amp;quot;тег&amp;quot;. Станет возможность пометить объект несколькими тегами одновременно. Продумать, каким образом в связи с этим хранить статусы объектов.&lt;br /&gt;
==== Создать базовый класс для плагина workflow ====&lt;br /&gt;
''Описание:'' В большинестве плагинов workflow приходится копировать много кода, и постоянно отлавливать ошибки, связанные с этим. Предлагается создать базовый клас для всех workflow в котором будут объявлены все функции, которые сейчас копируются. Создать в классе метод _init() (можно назвать как-то по-другому) в котором устанавливать все значения. &lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public function _init()&lt;br /&gt;
{&lt;br /&gt;
    $data['version'] = 2011052400;&lt;br /&gt;
    $data['code']    = 'cstreams';&lt;br /&gt;
    $data['cron']    = 900;&lt;br /&gt;
    $data['storage'] = 'cstreams';&lt;br /&gt;
    return $data;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все базовые методы сделать стандартными, зависящими только от $this-&amp;gt;type() и $this-&amp;gt;code().&lt;br /&gt;
&lt;br /&gt;
При таком подходе существенно уменьшится количество багов, ускорится разработка, а код стандартных workflow будет занимать меньше одной страницы.&lt;br /&gt;
&lt;br /&gt;
==== Кеширование прав в storage/acl ====&lt;br /&gt;
''Описание:'' Права в плагине acl запрашиваются при помощи сложного sql-запроса. Чтобы не производить его каждый раз предлагается добавить кеширование прав доступа. Возможно нужно будет создать отдельную таблицу.&lt;br /&gt;
==== Доработка для настроек (плагин storage/config) ====&lt;br /&gt;
''Описание:'' В будущем настройки будут устанавливаться через графический интерфейс. Было бы очень полезно автоматически генерировать формы для всех настроек. Предлагаемые улучшения:&lt;br /&gt;
* Добавить возможность устанавливать зависимость одной настройки от другой (можно как настройка отдельного типа)&lt;br /&gt;
* Добавить в БД поле, в котором будут указываться все стандартные проверки quickform которые нужно применить к сохраняемому значению&lt;br /&gt;
* Добавить в интерфейс dof_storage_config_interface специальный метод, который вызывается при созранении значения настройки, и запускает собственную проверку сохраняемого значения на стороне сервера (если нужно&lt;br /&gt;
* Добавить кеширование настроек (чтобы не тратить ресурсы на извлечение настроек, которые запрашиваются много раз)&lt;br /&gt;
==== Добавить ссылку из контактов на reformal.ru ====&lt;br /&gt;
''Описание:'' При помощи этого сервиса пользователи смогут оставлять свои комментарии и предложения по работе fdo&lt;br /&gt;
==== Для всех интерфейсных плагинов в wiki добавить раздел &amp;quot;сценарии тестирования&amp;quot; ====&lt;br /&gt;
''Описание:'' Раздел должен состоять из таблицы со следующими полями:&lt;br /&gt;
* Название тестового случая&lt;br /&gt;
* Шаг&lt;br /&gt;
* Описание/действия&lt;br /&gt;
* ожидаемый результат&lt;br /&gt;
(именно в таком порядке)&lt;br /&gt;
&lt;br /&gt;
==== Изменить отображение периодов ====&lt;br /&gt;
''Описание:'' Отображать период в списках выбора периодов так: [Название периода]:[временные рамки периода]&lt;br /&gt;
&lt;br /&gt;
==== Добавить возможность смены статуса договоров, подписок и проч в списках ====&lt;br /&gt;
''Описание:'' Добавить ссылки смены статуса прямо в графу статус под статусом в котором данный объект находится в данный момент. Перед сменой статусов желательно запрашивать, уверен ли пользователь в том, что хочет сделать.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;strike&amp;gt;Добавить в функцию print_header (modlibs/nvg) возможность добавлять мета-данные в заголовок (реализовано) ====&lt;br /&gt;
''Описание:'' В moodle функция print_header может добавлять в секцию &amp;lt;head&amp;gt; свои собственные данные: например у меня есть возможность добавить мета-теги, подключить собственные файлы с таблицами стилей или скриптами, а также добавить в тег body собственные атрибуты. Функция FDO таких возможностей не дает. Они необходимы нам, если мы собираемся работать с Javascript.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Разобраться с одинаковыми полями ====&lt;br /&gt;
''Описание:'' В некоторых формах при редактировании связанных объектов (например в академических группах и подписке на курсы у ученика) появляются одинаковые поля. Одновременно задавать эти поля в обоих местах нецелесообразно, так как присутствие ученика в данной академической группе сразу их определяет.&lt;br /&gt;
&lt;br /&gt;
==== Добавить плагин sync/import ====&lt;br /&gt;
''Описание:'' Добавить плагин, который бы отвечал за импорт любых данных в FDO. Создать внутри плагина папку types, в которой будут храниться файлы, каждый из которых будет содержать класс с типом импорта. Создать класс dof_sync_import_base с общими базовыми функциями импорта. Все типы импорта должны будут наследоваться от него.&lt;br /&gt;
В init-файл плагина sync/import добавить функцию import() с параметрами:&lt;br /&gt;
** $type - строка, тип экспорта, который будет производиться&lt;br /&gt;
** $data - массив объектов, данные которые импортируются в систему. Формат объектов определяется типом импорта.&lt;br /&gt;
** $options (необязательно) - объект, содержащий набор дополнительных настроек для импорта в указанный формат.&lt;br /&gt;
Формат возвращаемого значения определяется типом импорта.&lt;br /&gt;
Общие типы импорта могут находится в репозитории FDO, а специфические - создаваться отдельно.&lt;br /&gt;
&lt;br /&gt;
==== Добавить в базовый класс workflow функцию, которая сразу устанавливает нужный статус ====&lt;br /&gt;
''Описание:'' Это нужно, например, для того чтобы перевести контракт сразу в статус &amp;quot;идет обучение&amp;quot;. Я думаю имеет смысл не писать последовательно несколько обращений к функции change() а завести одну универсальную функцию, которая будет определять, какие статусы нужно пройти и проходить их. Если на каком-то этапе возникнет ошибка - она должна останавливаться и возвращать false.&lt;br /&gt;
&lt;br /&gt;
==== Список пользователей, для которых указана не вся информация ====&lt;br /&gt;
''Описание:'' При создании пользователя в таблице persons из пользователя moodle не указываются те данные, которые в деканате обязательны, а в moodle она просто отсутствуют (например в таблице mdl_user отчество не хранится). Нужен скрипт, который автоматически просматривал бы список пользователей деканата (persons), и выводил тех, для которых не указаны необходимые контактные или личные данные.&lt;br /&gt;
&lt;br /&gt;
==== Рефакторинг функций для постраничного вывода записей в интерфейсе ====&lt;br /&gt;
''Описание:'' Добавить в класс storage_base методы &lt;br /&gt;
* get_listing($limitfrom, $limitnum, $conds=null, $countonly=false, $sort=null) добавление последнего параметра обусловлено тем, что нам необходимо производить выборку для каждой таблицы индивидуально&lt;br /&gt;
* get_select_listing($inputconds)&lt;br /&gt;
&lt;br /&gt;
''Какие преимущества даст осуществление этой идеи?'' &lt;br /&gt;
* Упорядочится выборка записей по страницам&lt;br /&gt;
* Появится возможность не присать эти методы каждый раз для нового хранилища, если нам нужен просто стандартный фильтр по записям&lt;br /&gt;
==== Конвертация todo-пометок в коде в вопросы багтрекера ====&lt;br /&gt;
''Описание:'' Все недоделанные или не полностью реализованные места в коде мы помечаем метками @todo (я на это надеюсь). Было бы здорово найти какой-либо способ переконвертировать эти метки в задачи багтрекера и подчистить нереализованные возможности проекта.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' &lt;br /&gt;
** реализуем все возможности, на которые не хватало времени раньше&lt;br /&gt;
** подчистим проект, сделая его стабильнее&lt;br /&gt;
** получим реальную картину того сколько у нас всего не доделано.&lt;br /&gt;
==== Рефакторинг внешнего вида журнала с использованием библиотеки YUI ====&lt;br /&gt;
''Описание:'' Переработать внешний вид страницы журнала используя библиотеку Yui. Основные элементы, которые нуждаются в переработке:&lt;br /&gt;
* Страница расписания урока&lt;br /&gt;
* Страница планирования&lt;br /&gt;
* Страница отображения оценок&lt;br /&gt;
====&amp;lt;strike&amp;gt; Добавить в форму новый стандартный элемент &amp;quot;dof_addremove&amp;quot; ====&lt;br /&gt;
''Описание:''Элемент представляет собой двусторонний список с кнопками &amp;quot;добавить&amp;quot; и &amp;quot;удалить&amp;quot;. При выделении нужного количества элементов они автоматически добавляются или удаляются из списка. Также возможна реализация этого элемента в виде виджета в классе dof_modlib_widgets.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Доработать элемент hierselect ====&lt;br /&gt;
Используя класс dof_modlib_widgets_form нужно переопределить элемент hierselect, и сделать в нем следующие правки:&lt;br /&gt;
* Исправить его верстку (если идет 3 и более элемента подряд - то она расползается)&lt;br /&gt;
* Исправить ошибку, в результате которой в hierselect нельзя в качестве значения указать просто число&lt;br /&gt;
* Добавить возможность отключать отдельные поля внутри элемента.&lt;br /&gt;
* Сделать подгрузку элементов через AJAX&lt;br /&gt;
&lt;br /&gt;
==== Использование файла глобальных настроек блока для FDO ====&lt;br /&gt;
''Описание:'' Если создать в папке любого блока файл config_global.html - то у этого блока появится файл настроек, который будет отображаться администратору системы в меню &amp;quot;модули&amp;quot;. Возможно следует создать файл таких настроек для FDO и вынести туда часть настроек блока, либо вообще сделать такой файл настроек главным.&lt;br /&gt;
==== Графическое меню стандартных настроек FDO ====&lt;br /&gt;
''Описание:'' Нужно собрать и упорядочить все наши настройки (какой регион по умолчанию показывается, сколько записей на страницу выводится списком, и т. п), разделить на категории и создать для них одну форму, в которой их можно будет менять.&lt;br /&gt;
==== Возможность создать новую дисциплину на основе предыдущей ====&lt;br /&gt;
''Описание:'' Это решение подойдет для случаев, когда требуется создать углубленный курс из основного, или создать курс на основе стандарта образования. Сделать возможность создания дисциплины с готовым тематическим планированием из другой дисциплины.&lt;br /&gt;
==== Стили для стандартных элементов ====&lt;br /&gt;
''Описание:'' создать собственную каскадную таблицу стилей для fdo. Там будут описаны стили для различных часто используемых элементов: сообщения об успешном или неуспешном завершении операций, информационных сообшений, и т. п. Это позволит стандартизировать внешний вид программ, а также более гибко работать с оформлением.&lt;br /&gt;
==== Инструмент для редактирования тематического планирования ====&lt;br /&gt;
''Описание:'' Идея такая: создать инструмент, который позволил бы легко и быстро создавать тематическое планирование для любого предмета на основе программы из образовательного стандарта. Я представляю себе это так: двусторонний список, в котором слева находятся темы из стандарта, а справа темы нового курса (в начале это пустая колонка). Темы можно перетаскивать из левой колонки в правую. Можно менять порядок тем (drag&amp;amp;drop). Такой инструмент позволит легко и быстро создавать собственное тематическое планирование для любого предмета на основе образовательного стандарта.&lt;br /&gt;
==== Редактирование документации в wiki при помощи eclipse ====&lt;br /&gt;
Существуют плагины к eclipse (например [http://matheclipse.org/en/Eclipse_Wikipedia_Editor вот этот]), которые позволяют редактировать Википедию. Нужно узнать, будет ли этот плагин работать с нашим движком, и если нет, то какие настройки для этого потребуются.&lt;br /&gt;
&lt;br /&gt;
На мой взгляд, описанные ниже преимущества стоят того, чтобы хотя бы попробовать:&lt;br /&gt;
&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' &lt;br /&gt;
** Нам станет проще и быстрее и удобнее редактировать документацию&lt;br /&gt;
** Документация станет более структурированной (для wiki-разметки там поддерживается такая же подсветка и code-assist, как и для обычных языков программирования)&lt;br /&gt;
** Больше не будем забывать документировать функцию. Написание документации в wiki станет таким же обычным и &amp;quot;само собой разумеющимся&amp;quot; процессом, как и написание phpdoc-комментариев.&lt;br /&gt;
** Станет гораздо проще сопоставлять, какие функции, плагины, и классы у нас документированы, а какие  - нет. Документация станет гораздо больше соответствовать коду. Проще будет проверить, для каких функций уже есть документация, а для каких - нет.&lt;br /&gt;
** Возможность вставки отформатированного раскрашенного кода в wiki сразу же из буфера обмена.&lt;br /&gt;
** Поддержка ссылок на документацию в коде (!!!). Как это работает: устанавливаем wiki-плагин для eclipse. Создаем новый wiki-проект. Настраиваем проект на работу с нашим wiki-движком. После этого в phpdoc-комментариях можно будет писать ссылку на документацию, кликать на ней правой кнопкой, и будет открываться соответствующая статья нашей документации. [http://matheclipse.org/en/Eclipse_Wikipedia_Editor/Working_with_the_Editor#Configuring_a_MySQL_database_for_link_suggestions источник на английском]&lt;br /&gt;
&lt;br /&gt;
==== Добавить подсветку синтаксиса в mediawiki ====&lt;br /&gt;
Описание: поскольку наш проект посвящен программированию, было бы неплохо добавить к движку mediawiki возможность подсвечивать синтаксис php-кода. Для этого необходимо установить плагин [http://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi SyntaxHighlight] (описание и инструкция по установке доступны по ссылке)&lt;br /&gt;
&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' Нам всем станет ощутимо проще работать с документацией по проекту.&lt;br /&gt;
&lt;br /&gt;
==== Интерфейсный плагин, объединяющий создание всего учебного процесса ====&lt;br /&gt;
Описание: нужно добавить интерфейсный плагин, который позволил бы создавать учебный процесс &amp;quot;с нуля&amp;quot;, шаг за шагом, по четко определенной схеме. Например, это будет страница, которая будет отображать текущий статус процесса создания всей структуры, и давать подсказки и пояснения по хода процесса.&lt;br /&gt;
&lt;br /&gt;
Например, для того чтобы создать учебный процесс (в целом), нам нужно:&lt;br /&gt;
# переименовать первое, автоматически созданное подразделение из &amp;quot;Company&amp;quot; в название своего учебного заведения&lt;br /&gt;
# Создать учебные программы&lt;br /&gt;
# Создать дисциплины&lt;br /&gt;
# Создать учебные периоды&lt;br /&gt;
# Создать учебные группы&lt;br /&gt;
# Зарегистрировать контракты&lt;br /&gt;
# Через группы создать потоки&lt;br /&gt;
# Через созданные потоки приписываем группы и учеников к дисциплинам&lt;br /&gt;
И так далее. На странице мы переходим от одного шага к другому, видим, что мы уже сделали, а что еще предстоит сделать.&lt;br /&gt;
&lt;br /&gt;
Страницу можно реализовать как &amp;quot;обучающий режим&amp;quot;, то есть - можно пройти все операции с инструкциями, а можно сразу перейти к интерфейсу, и сделать все самому.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' Пользователь, никогда не использовавшему FDO станет сразу ясно с чего начать, ему не нужно будет долго разбираться в том, в какой плагин зайти сначала, а в какой потом.&lt;br /&gt;
&lt;br /&gt;
==== Дополнительные методы для отслеживания зависимостей плагинов ====&lt;br /&gt;
Описание: число наших плагинов растет, а значит скоро нам понадобятся дополнительные инструменты для удобного отслеживания их зависимостей друг от друга. Я предлагаю добавить к интерфейсу плагина функцию get_list_dependences (можно потом подобрать более удачное название). Эта функция будет отвечать на вопрос &amp;quot;Какие плагины зависят от меня?&amp;quot;. Помимо этого, в интерфейсе админки предлагаю сделать две кнопки: первая выводит список плагинов, которые зависят от этого плагина, а вторая - список плагинов от которых зависит этот плагин (т. е. обзор зависимостей в обе стороны).&lt;br /&gt;
&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' станет проще отслеживать зависимости между плагинами, и станет проще избегать циклических зависимостей.&lt;br /&gt;
&lt;br /&gt;
==== Справка по элементам интерфейса ====&lt;br /&gt;
Описание: помимо документации к самой системе необходимо внедрить справку внутрь самой системы. Я вижу это следующим образом:&lt;br /&gt;
# справка внутри самой формы. В quickform есть стандартный метод, который позволяет добавлять справку к элементам формы. Эта справка будет отображаться в открывшемся новом окне. html-файлы с текстом справки должны лежать в moodledata&lt;br /&gt;
# Краткая справка на каждой странице, где есть форма. Это может выглядеть примерно так: над формой помещается небольшой квадратный блок с текстом, который поясняет что можно сделать на этой странице, зачем нужна эта форма и куда мы вообще попали. Блоки с пояснениями могут размещатся на любых страницах, где требуются. &lt;br /&gt;
#* Должно быть 2 режима: обычный и &amp;quot;экспертный&amp;quot;. В экспертном режиме работы с fdo блоки не показываются&lt;br /&gt;
#* Все блоки выводятся через 1 стандартный метод в плагине widgets&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' Пользователям станет ощутимо легче ориентироваться в самой системе, если они смогут в любой момент получить справку по любому ее элементу. Также наш проект на один маленький шаг приблизится к тому идеалу, который называется &amp;quot;интуитивно понятный интерфейс&amp;quot;&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться?'' Все файлы справки задействуют стандартную функцию moodle, которая показывает страницу со справкой в новом окне. Все справочные файлы, вызываемые при помощи этой функции находятся в папке moodledata. Нужно будет разобраться в механизме реализации справочных файлов находящихся в moodledata. Судя по всему они хранятся где-то в отдельном месте, а только затем попадают в папку moodledata, которая создается автоматически в процессе установки moodle.&lt;br /&gt;
====Презентация по структуре freedeansoffice 2.х ====&lt;br /&gt;
Описание: создать презентацию или flash-ролик по структуре деканата: как он работает, как он соотносится с учебным процессом, какие преимущества он дает.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' Людям далеким от программирования станет понятнее что это за проект, зачем он нужен, и почему его нужно установить.&lt;br /&gt;
==== Использование библиотеки YUI ====&lt;br /&gt;
Описание: в список стандартных библиотек moodle включена библиотека &amp;quot;Yahoo User Interface&amp;quot; второй версии. Она позволяет использовать Javascript и CSS, а также использовать технологию AJAX. Совместима со всеми браузерами. Имеет весьма подробную документацию на английском языке, и примеры использования.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' Использование этой библиотеки значительно поможет нам улучшить внешний вид проекта, а также использовать технологию AJAX, которая ранее была не доступна.&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться?'' Для того чтобы использовать эту библиотеку нужен уровень понимания принципов действия Javascript/CSS выше начального.&lt;br /&gt;
==== Добавление стандартного поля dof в класс dof_modlib_widgets_form ====&lt;br /&gt;
Описание: В используемый вариант htmlQuickForm было бы полезно добавить поле dof которое сейчас добавляется вручную (через конструктор, в массиве _customdata). Это можно автоматизировать, если на шаге наследования формы от moodleQuickForm добавить в форму поле dof, куда записать объект dof_control.&lt;br /&gt;
&lt;br /&gt;
Старые формы не нужно будет переделывать, они продолжат работать как и раньше.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' Упростится и стандартизируется процесс разработки форм, сократится количество кода.&lt;br /&gt;
==== &amp;lt;strike&amp;gt; Дополнительная функция извлечения данных для класса storage &amp;lt;/strike&amp;gt;  ====&lt;br /&gt;
&amp;lt;strike&amp;gt; Описание: При получении данных из хранилища часто возникает необходимость получить несколько записей по двум или трем полям. Сейчас в storage есть три основные функции:&lt;br /&gt;
# get_list() - получить массив записей по одному полю&lt;br /&gt;
# get_filter() - получить только одну запись по трем полям &lt;br /&gt;
# get_list_select() - получить массив записей, используя собственный sql-запрос&lt;br /&gt;
К этим функциям необходимо добавить еще одну, которая позволяла бы получить массив записей по нескольким полям.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' Легче будет извлекать данные из таблиц, не нужно будет писать собственный sql-запрос каждый раз, когда нужно получить массив записей по нескольким полям.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Сохранение времени в БД ====&lt;br /&gt;
По стандарту у нас в БД дата хранится всегда на полдень. Сейчас функция, которая переводит текущую метку времени в метку времени полудня лежит в /dof/im/journal/lib.php - dof_im_journal_get_date($time). Может переложить ее куда-то поближе к ядру, чтобы удобно было из любого плагина дергать.&lt;br /&gt;
==== &amp;lt;strike&amp;gt;Поэтапное заполнение нового договора&amp;lt;/strike&amp;gt; ====&lt;br /&gt;
&amp;lt;strike&amp;gt;Надо страницу нового договора (im/sel/contracts/new.php) разделить на несколько. На одной странице заполнять информацию об ученике. На другой - о представителе. Так как набор заполняемых полей для ученика зависит от наличия представителя.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Добавление дополнительных типов проверок и элементов в QuickForm ====&lt;br /&gt;
Описание: Во время написания статьи про QuickForm я наткнулся на возможность назначать собственные виды проверок данных на стороне клиента, и собственные типы html-элементов. Возможно это может пригодиться нам для работы над интерфейсными плагинами - часто повторяющиеся элементы можно создать один раз, чтобы потом много раз не писать их заново. Код всего этого можно поместить в dof_modlib_widgets form.&lt;br /&gt;
&lt;br /&gt;
Также можно добавить новые интерактивные элементы в форму. Также имеет значение то, что по умолчанию в quickForm отсутствует проверка значений с русскими буквами на стороне клиента - ее следовало бы добавить.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' появится возможность проверять русскоязычные значения на стороне клиента, ускорится разработка интерфейсов.&lt;br /&gt;
* ''Каких ресурсов это потребует?'' Пока неизвестно.&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться?'' Надо будет по примерам из Moodle разобраться в том, как происходит регистрация элементов и проверок в форме.&lt;br /&gt;
&lt;br /&gt;
==== Построение графиков и диаграмм в OpenOffice Calc при помощи плагина templater ====&lt;br /&gt;
'''Краткое описание:''' Используя разметку шаблонизатора Sigma так разметить файл электронной таблицы формата ods, чтобы созданный в нем график каждый раз строился на основе экспортируемых данных.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи:'' Можно будет встраивать различные графики и диаграммы в отчеты, что даст дополнительные преимущества плагину templater.&lt;br /&gt;
* ''Каких ресурсов это потребует:'' Пока неизвестно.&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться:'' Надо будет разобраться, как устроено XML-отображение графиков в openOffice.&lt;br /&gt;
==== Дополнительное описание для плагинов ====&lt;br /&gt;
'''Краткое описание:''' В меню установки плагинов, при просмотре списка должно выводиться не только название плагина, но и его небольшое описание, которое говорит о том, для чего нужен этот плагин, и какие функции он выполняет. &lt;br /&gt;
&lt;br /&gt;
Там же выводить, какие плагины нужны для его установки (если есть зависимости), и отмечать, установлены они уже или нет. &lt;br /&gt;
&lt;br /&gt;
После краткого описания плагина давать ссылку на наш wiki, где этот плагин описан полностью.&lt;br /&gt;
&lt;br /&gt;
Описание изначально скрыто, и показывается по щелчку на ссылке &amp;quot;показать&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Сортировать плагины следующим образом: сначала установленные, затем не установленные.&lt;br /&gt;
&lt;br /&gt;
Также в будущем необходимо будет разделить плагины на группы: одни плагины необходимы для базовой функциональности системы, другие нужны для расширения ее возможностей. Будет &amp;quot;базовая комплектация&amp;quot;, работающая &amp;quot;из коробки&amp;quot; и дополнительные плагины.&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?'' Неподготовленным пользователям и администраторам не знакомым с нашей системой будет проще в ней ориентироваться. Проще будет определять, какие плагины нужны, а какие нет.&lt;br /&gt;
* ''Каких ресурсов это потребует?'' Приблизительно часов 5-6, для того чтобы добавить новые методы в базовый класс, и протестировать их работу.&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться?'' На создание и описание каждого нового плагина будет уходить несколько больше времени.&lt;br /&gt;
&lt;br /&gt;
==== Система полномочий на основе доверенностей с фильтрами ====&lt;br /&gt;
'''Краткое описание:'''&lt;br /&gt;
* ''Какие преимущества даст осуществление этой идеи?''&lt;br /&gt;
* ''Каких ресурсов это потребует?''&lt;br /&gt;
* ''С какими трудностями мы можем столкнуться?''&lt;br /&gt;
&lt;br /&gt;
==== Специальный режим для &amp;quot;тяжелых&amp;quot; процессов: ====&lt;br /&gt;
'''Краткое описание:'''Использовать специальный код для выполнения тяжелых и трудоемких процессов.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    @set_time_limit(0);&lt;br /&gt;
    @raise_memory_limit(&amp;quot;512M&amp;quot;);&lt;br /&gt;
    if (function_exists('apache_child_terminate'))&lt;br /&gt;
    {&lt;br /&gt;
        // Перезапустить процесс после исполнения&lt;br /&gt;
        // на случай утечек памяти&lt;br /&gt;
        @apache_child_terminate();&lt;br /&gt;
    }&lt;br /&gt;
    if (function_exists('ignore_user_abort'))&lt;br /&gt;
    {&lt;br /&gt;
        //не прерывать выполнение скрипта при отсоединении клиента&lt;br /&gt;
        ignore_user_abort();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code php&amp;gt;&lt;br /&gt;
* Какие приемущества это дает?&lt;br /&gt;
* Каких ресурсов это потребует?&lt;br /&gt;
* С какими трудностями мы можем столкнутся?&lt;br /&gt;
&lt;br /&gt;
==== При записи в языковые файлы пользоваться константами: ====&lt;br /&gt;
Выглядеть это должно подобным образом:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    define('student', 'ученик');&lt;br /&gt;
    $string['student'] = student;&lt;br /&gt;
    $string['student_list'] = 'Список '.student.'ов';&lt;br /&gt;
&amp;lt;/code php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате, для переноса такой записи в основной языковой файл из Susi&lt;br /&gt;
нужно будет просто поменять значение константы student на 'студент'&lt;br /&gt;
&lt;br /&gt;
=== Идеи для рефакторинга ===&lt;br /&gt;
В этом разделе собраны все идеи, которые следует реализовать при рефакторинге системы&lt;br /&gt;
==== Доработать элемент dof_duration ====&lt;br /&gt;
Сделать возможность добавлять несколько параметров (часы/минуты/дни) внутри одного элемента dof_duration. Сделать соответствующие настройки для элемента. Переписать функцию export_value. Переписать функцию установки значения по умолчанию таким образом, чтобы в элемент передавалось количество секунд, а он сам преобразовывал это в нужные единицы времени и распихивал по нужным окошкам. Переписать все места, где используется этот элемент с учетом его новых возможностей.&lt;br /&gt;
&lt;br /&gt;
==== Добавить в базовый плагин im функции преобразования значений БД в текст ====&lt;br /&gt;
Описание: В стандартном плагине интерфейса нужно предусмотреть возможность вызова стандартных функция преобразования значений в текст.&lt;br /&gt;
Предлагается реализовать функции:&lt;br /&gt;
1) функция преобразования значений 1 и 0 в &amp;quot;да&amp;quot; и &amp;quot;нет&amp;quot;&lt;br /&gt;
2) Функция автоматического преобразования статуса в базе в статус текстом. &lt;br /&gt;
Аргументы: &lt;br /&gt;
* статус &lt;br /&gt;
* workflow который за эти статусы отвечает&lt;br /&gt;
&lt;br /&gt;
==== Полный рефакторинг модуля ama ====&lt;br /&gt;
Описание: Нужно полностью переписать этот модуль, изменить логику его работы таким образом, чтобы при обращении к нему не возникало никаких непредвиденных ситуаций, вроде создания новых пустых курсов или пользователей.&lt;br /&gt;
Самое главное изменение логики:&lt;br /&gt;
* Все объекты создаются функцией create($obj) обновляются функцией update($obj) и удаляются функцией delete($id), и получаются функцией get($id)&lt;br /&gt;
* Конструктор класса просто создает объект с данными и никогда не производит никаких манипуляций с базой данных (никакого скрытого создания или удаления объектов и т. п.). Должна быть возможность создать объект, не создавая при этом запись в БД.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/persons&amp;diff=2244</id>
		<title>Разработка:storages/persons</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/persons&amp;diff=2244"/>
				<updated>2011-04-26T13:51:13Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Подробный формат полей в таблице: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = persons&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''persons'' - адресная книга, в которую включены все участники учебного процесса: учащиеся, законные представители, сотрудники, преподаватели и т. д.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
*firstname - имя&lt;br /&gt;
*middlename - отчество&lt;br /&gt;
*lastname - фамилия&lt;br /&gt;
*sortname - ФИО для сортировки по умолчанию (нужно ли оно?)&lt;br /&gt;
*preferredname - префикс для имения (Mr. Dr. Г-н, Г-а)&lt;br /&gt;
*dateofbirth - дата рождения у UTS&lt;br /&gt;
*gender - пол  (male, female, unknown)&lt;br /&gt;
*email - основной адрес электронной почты&lt;br /&gt;
*phonehome - домашний телефон&lt;br /&gt;
*phonework - рабочий телефон&lt;br /&gt;
*phonecell - сотовый телефон&lt;br /&gt;
*passtypeid - тип удостоверения личности (1 - свидетельство о рождение, 2 - паспорт гражданина РФ, 3 - загранпасспорт, 4 - разрешение на временное проживание лица без гражданства, 5 - вид на жительство, 6 - военный билет, 7 - водительсткое удостоверение пластиковое, 8 - вод. удостоверение форма 1, 9 - вод. удостоверение международное)&lt;br /&gt;
*passportserial - серия удостоверения личности (если предусмотрена типом документа)&lt;br /&gt;
*passportnum - номер удостоверения личности&lt;br /&gt;
*passportdate - дата выдачи удостоверения личности&lt;br /&gt;
*passportem - название организации, выдавшей удостоверение личности&lt;br /&gt;
*citizenship - гражданство&lt;br /&gt;
*passportaddrid - адрес прописки по паспорту&lt;br /&gt;
*mdluser - id пользователя в moodle (если есть)&lt;br /&gt;
*sync2moodle - признак синхронизации с moodle&lt;br /&gt;
*addressid - текущий адрес&lt;br /&gt;
*status - Статусы персоны (normal, deleted, archived)&lt;br /&gt;
*adddate - дата добавления&lt;br /&gt;
*departmentid - основной отдел, к которому приписан человек (может редактировать его данные в persons)&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_bu($userid = NULL,$create=false)'''====&lt;br /&gt;
&lt;br /&gt;
Получение объект по moodleid&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $userid - id пользователя в moodle, по умолчанию null&lt;br /&gt;
* (bool) $create создание персоны по текущему пользователю, по умолчанию false, &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - данные персоны&lt;br /&gt;
&lt;br /&gt;
===='''get_by_moodleid($muserid = NULL,$create=false)'''====&lt;br /&gt;
&lt;br /&gt;
Получение объект по moodleid&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $muserid - id пользователя в moodle, по умолчанию null&lt;br /&gt;
* (bool) $create создание персоны по текущему пользователю, по умолчанию false, &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - данные персоны&lt;br /&gt;
&lt;br /&gt;
===='''get_by_moodleid_id($muserid = NULL,$create=false)'''====&lt;br /&gt;
&lt;br /&gt;
Получение объект по moodleid&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $muserid - id пользователя в moodle,если не указан берется $USER-&amp;gt;id. По умолчанию null&lt;br /&gt;
* (bool) $create создание персоны по текущему пользователю, по умолчанию false, &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* mixed (int) id персоны или (bool) - false&lt;br /&gt;
&lt;br /&gt;
===='''get_list_synced()'''====&lt;br /&gt;
&lt;br /&gt;
Получает список синхронизируемых персон.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
нет&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список персон, требующих синхронизации.&lt;br /&gt;
&lt;br /&gt;
===='''get_list_normal()'''====&lt;br /&gt;
&lt;br /&gt;
Получение списка неудаленных персон.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
нет&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список неудаленных персон.&lt;br /&gt;
&lt;br /&gt;
===='''get_list_search_lastname($query)'''====&lt;br /&gt;
&lt;br /&gt;
Получение списка персон по запрашиваемой фамилии&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (str) $query - фамилия, которую ищем.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список персон.&lt;br /&gt;
&lt;br /&gt;
===='''get_list_search($query)'''====&lt;br /&gt;
&lt;br /&gt;
Получение списка персон по запрашиваемой фамилии&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (str) $query - фамилия, или отчество, или имя, или $mail, или usermoodle, которые ищем.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список персон.&lt;br /&gt;
&lt;br /&gt;
===='''is_email_unique($email)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, если другие персоны с указанным email.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (str) $email - электронный адрес, который ищем.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - нет, false - да.&lt;br /&gt;
&lt;br /&gt;
===='''reg_moodleuser($USER)'''====&lt;br /&gt;
&lt;br /&gt;
Регестрирует персону для переданного пользователя Moodle&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (obj) $USER - пользователь Moodle.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) id созданной персоны в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* (bool) false если запись не удалась.&lt;br /&gt;
&lt;br /&gt;
===='''get_fullname($id)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает полное имя пользователя в формате ФИО.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $id - id записи пользователя, чье имя необходимо&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (str) - полное имя пользователя или пустая строка, если пользователь не найден.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
*Получить запись вместе с адресом&lt;br /&gt;
*Сохранить (добавить или обновить) запись вместе с адресом&lt;br /&gt;
*Найти список людей, относящихся к структурному подразделению&lt;br /&gt;
*Удалить (изменить статус на &amp;quot;удален&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |persons&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу persons.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |persons&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице persons.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |persons&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы persons.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:workflows/persons&amp;diff=2243</id>
		<title>Разработка:workflows/persons</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:workflows/persons&amp;diff=2243"/>
				<updated>2011-04-26T13:34:19Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Возможные статусы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====Возможные статусы:==== &lt;br /&gt;
* новый&lt;br /&gt;
* подтвержденный&lt;br /&gt;
* удаленный&lt;br /&gt;
* архивный&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/departments&amp;diff=2186</id>
		<title>Разработка:storages/departments</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/departments&amp;diff=2186"/>
				<updated>2011-03-31T14:48:56Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* События */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = departments&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''departments'' - подразделения учебного заведения. Учебные потоки, дисциплины, учебные программы, подписки приписаны к одному из подразделений, для удобства организации учебного процесса в крупных учебных заведениях. При установке системы создается одно подразделение по умолчанию, к которому приписываются все объекты, если в использовании других подразделений нет необходимости.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название&lt;br /&gt;
* code - кодовое обозначение (текстовое, необязательное, при указании кода проверяется уникальность). Если код не указан - то вместо него подставляется id записи. &lt;br /&gt;
* managerid - руководитель структурного подразделения в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* leaddepid - вышестоящее структурное подразделение&lt;br /&gt;
* addressid - местоположение в таблице [[Разработка:storages/addresses | addresses ]]&lt;br /&gt;
* zone - временная зона, действующая в подразделении&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/departments | departments ]]&lt;br /&gt;
* path - путь к подразделению по родителям начиная с родителя-корня. Родители разделены &amp;quot;/&amp;quot;&lt;br /&gt;
* depth - глубина вложенности подразделения&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''departments_list()'''====&lt;br /&gt;
&lt;br /&gt;
Выводит список всех структурных подразделений в алфавитном порядке&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
нет&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из таблицы, где ключ - id подразделения, значение - название подразделения.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим все существующие структурные подразделения.&lt;br /&gt;
# для каждого подразделения создаем запись в массиве.&lt;br /&gt;
# сортируем массив и возвращаем значение.&lt;br /&gt;
&lt;br /&gt;
===='''departments_list_subordinated($id = '0' ,$spase = '')'''====&lt;br /&gt;
&lt;br /&gt;
Выводит список всех подчиненных структурных подразделений по id структурного подразделения.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (int) $id - id подразделения, по умолчанию - головное (0).&lt;br /&gt;
* (str) $spase - знак отступа , по умолчанию - нет. (неиспользуемый параметр, необходим для рекурсии)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список дочерних подразделений.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим дочерние подразделения первого уровня для данного подразделения.&lt;br /&gt;
# для каждого подразделения:&lt;br /&gt;
#* создаем запись в массиве, где ключ - id подразделения, значение - знак отступа+имя подразделения.&lt;br /&gt;
#* находим дочерние подразделения для полученного подразделения.&lt;br /&gt;
# возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_departments($select)'''====&lt;br /&gt;
&lt;br /&gt;
Подсчитывает количество записей, найденных по критериям&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (str) $select - условие выборки&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* mixed&lt;br /&gt;
&lt;br /&gt;
===='''get_default()'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает объект департамента по умолчанию&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
нет&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object&lt;br /&gt;
&lt;br /&gt;
===='''get_default_id()'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает id объект департамента по умолчанию&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
нет&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id объект департамента&lt;br /&gt;
&lt;br /&gt;
===='''is_code_notunique($code)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет уникальность кодового названия&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (str) $code&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если запись не уникальна&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить запись о первичного структурном подразделении, которому подчиняются все остальные. Руководителем первичного структурного подразделения является руководитель организации.&lt;br /&gt;
* Получить структурное подразделение по его коду&lt;br /&gt;
* Получить список подчиненных структурных подразделений первого уровня по id структурного подразделения&lt;br /&gt;
* Получить список структурных подразделений, подчиняющихся сотруднику по id персоны&lt;br /&gt;
* Добавить структурное подразделение в базу данных (проверяет, чтобы в качестве главного было указано существующее структурное подразделение)&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 | departments&lt;br /&gt;
 | storage&lt;br /&gt;
 | insert&lt;br /&gt;
 |&lt;br /&gt;
 | Обновляет path и depth&lt;br /&gt;
 |-&lt;br /&gt;
 | departments&lt;br /&gt;
 | storage&lt;br /&gt;
 | update&lt;br /&gt;
 |&lt;br /&gt;
 | Обновляет path и depth&lt;br /&gt;
 |-&lt;br /&gt;
 | departments&lt;br /&gt;
 | storage&lt;br /&gt;
 | update&lt;br /&gt;
 | status = deleted&lt;br /&gt;
 | Все подразделения, ссылавшиеся на удалённое, переходят на уровень выше&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |departments&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу departments.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |departments&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице departments.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |departments&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы departments.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/departments&amp;diff=2185</id>
		<title>Разработка:storages/departments</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/departments&amp;diff=2185"/>
				<updated>2011-03-31T13:48:04Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* События */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = departments&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''departments'' - подразделения учебного заведения. Учебные потоки, дисциплины, учебные программы, подписки приписаны к одному из подразделений, для удобства организации учебного процесса в крупных учебных заведениях. При установке системы создается одно подразделение по умолчанию, к которому приписываются все объекты, если в использовании других подразделений нет необходимости.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название&lt;br /&gt;
* code - кодовое обозначение (текстовое, необязательное, при указании кода проверяется уникальность). Если код не указан - то вместо него подставляется id записи. &lt;br /&gt;
* managerid - руководитель структурного подразделения в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* leaddepid - вышестоящее структурное подразделение&lt;br /&gt;
* addressid - местоположение в таблице [[Разработка:storages/addresses | addresses ]]&lt;br /&gt;
* zone - временная зона, действующая в подразделении&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/departments | departments ]]&lt;br /&gt;
* path - путь к подразделению по родителям начиная с родителя-корня. Родители разделены &amp;quot;/&amp;quot;&lt;br /&gt;
* depth - глубина вложенности подразделения&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''departments_list()'''====&lt;br /&gt;
&lt;br /&gt;
Выводит список всех структурных подразделений в алфавитном порядке&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
нет&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из таблицы, где ключ - id подразделения, значение - название подразделения.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим все существующие структурные подразделения.&lt;br /&gt;
# для каждого подразделения создаем запись в массиве.&lt;br /&gt;
# сортируем массив и возвращаем значение.&lt;br /&gt;
&lt;br /&gt;
===='''departments_list_subordinated($id = '0' ,$spase = '')'''====&lt;br /&gt;
&lt;br /&gt;
Выводит список всех подчиненных структурных подразделений по id структурного подразделения.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (int) $id - id подразделения, по умолчанию - головное (0).&lt;br /&gt;
* (str) $spase - знак отступа , по умолчанию - нет. (неиспользуемый параметр, необходим для рекурсии)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список дочерних подразделений.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим дочерние подразделения первого уровня для данного подразделения.&lt;br /&gt;
# для каждого подразделения:&lt;br /&gt;
#* создаем запись в массиве, где ключ - id подразделения, значение - знак отступа+имя подразделения.&lt;br /&gt;
#* находим дочерние подразделения для полученного подразделения.&lt;br /&gt;
# возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_departments($select)'''====&lt;br /&gt;
&lt;br /&gt;
Подсчитывает количество записей, найденных по критериям&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (str) $select - условие выборки&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* mixed&lt;br /&gt;
&lt;br /&gt;
===='''get_default()'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает объект департамента по умолчанию&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
нет&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object&lt;br /&gt;
&lt;br /&gt;
===='''get_default_id()'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает id объект департамента по умолчанию&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
нет&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id объект департамента&lt;br /&gt;
&lt;br /&gt;
===='''is_code_notunique($code)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет уникальность кодового названия&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (str) $code&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если запись не уникальна&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить запись о первичного структурном подразделении, которому подчиняются все остальные. Руководителем первичного структурного подразделения является руководитель организации.&lt;br /&gt;
* Получить структурное подразделение по его коду&lt;br /&gt;
* Получить список подчиненных структурных подразделений первого уровня по id структурного подразделения&lt;br /&gt;
* Получить список структурных подразделений, подчиняющихся сотруднику по id персоны&lt;br /&gt;
* Добавить структурное подразделение в базу данных (проверяет, чтобы в качестве главного было указано существующее структурное подразделение)&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 | departments&lt;br /&gt;
 ! storage&lt;br /&gt;
 ! insert&lt;br /&gt;
 !&lt;br /&gt;
 ! Обновляет path и depth&lt;br /&gt;
 |-&lt;br /&gt;
 | departments&lt;br /&gt;
 ! storage&lt;br /&gt;
 ! update&lt;br /&gt;
 !&lt;br /&gt;
 ! Обновляет path и depth&lt;br /&gt;
 |-&lt;br /&gt;
 | departments&lt;br /&gt;
 ! storage&lt;br /&gt;
 ! update&lt;br /&gt;
 ! status = deleted&lt;br /&gt;
 ! Все подразделения, ссылавшиеся на удалённое, переходят на уровень выше&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |departments&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу departments.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |departments&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице departments.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |departments&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы departments.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/departments&amp;diff=2184</id>
		<title>Разработка:storages/departments</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/departments&amp;diff=2184"/>
				<updated>2011-03-31T13:45:21Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Перехватываемые события */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = departments&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''departments'' - подразделения учебного заведения. Учебные потоки, дисциплины, учебные программы, подписки приписаны к одному из подразделений, для удобства организации учебного процесса в крупных учебных заведениях. При установке системы создается одно подразделение по умолчанию, к которому приписываются все объекты, если в использовании других подразделений нет необходимости.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название&lt;br /&gt;
* code - кодовое обозначение (текстовое, необязательное, при указании кода проверяется уникальность). Если код не указан - то вместо него подставляется id записи. &lt;br /&gt;
* managerid - руководитель структурного подразделения в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* leaddepid - вышестоящее структурное подразделение&lt;br /&gt;
* addressid - местоположение в таблице [[Разработка:storages/addresses | addresses ]]&lt;br /&gt;
* zone - временная зона, действующая в подразделении&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/departments | departments ]]&lt;br /&gt;
* path - путь к подразделению по родителям начиная с родителя-корня. Родители разделены &amp;quot;/&amp;quot;&lt;br /&gt;
* depth - глубина вложенности подразделения&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''departments_list()'''====&lt;br /&gt;
&lt;br /&gt;
Выводит список всех структурных подразделений в алфавитном порядке&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
нет&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из таблицы, где ключ - id подразделения, значение - название подразделения.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим все существующие структурные подразделения.&lt;br /&gt;
# для каждого подразделения создаем запись в массиве.&lt;br /&gt;
# сортируем массив и возвращаем значение.&lt;br /&gt;
&lt;br /&gt;
===='''departments_list_subordinated($id = '0' ,$spase = '')'''====&lt;br /&gt;
&lt;br /&gt;
Выводит список всех подчиненных структурных подразделений по id структурного подразделения.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (int) $id - id подразделения, по умолчанию - головное (0).&lt;br /&gt;
* (str) $spase - знак отступа , по умолчанию - нет. (неиспользуемый параметр, необходим для рекурсии)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список дочерних подразделений.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим дочерние подразделения первого уровня для данного подразделения.&lt;br /&gt;
# для каждого подразделения:&lt;br /&gt;
#* создаем запись в массиве, где ключ - id подразделения, значение - знак отступа+имя подразделения.&lt;br /&gt;
#* находим дочерние подразделения для полученного подразделения.&lt;br /&gt;
# возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_departments($select)'''====&lt;br /&gt;
&lt;br /&gt;
Подсчитывает количество записей, найденных по критериям&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (str) $select - условие выборки&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* mixed&lt;br /&gt;
&lt;br /&gt;
===='''get_default()'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает объект департамента по умолчанию&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
нет&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object&lt;br /&gt;
&lt;br /&gt;
===='''get_default_id()'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает id объект департамента по умолчанию&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
нет&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id объект департамента&lt;br /&gt;
&lt;br /&gt;
===='''is_code_notunique($code)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет уникальность кодового названия&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (str) $code&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если запись не уникальна&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить запись о первичного структурном подразделении, которому подчиняются все остальные. Руководителем первичного структурного подразделения является руководитель организации.&lt;br /&gt;
* Получить структурное подразделение по его коду&lt;br /&gt;
* Получить список подчиненных структурных подразделений первого уровня по id структурного подразделения&lt;br /&gt;
* Получить список структурных подразделений, подчиняющихся сотруднику по id персоны&lt;br /&gt;
* Добавить структурное подразделение в базу данных (проверяет, чтобы в качестве главного было указано существующее структурное подразделение)&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина ! Код плагина ! Код события ! Доп. данные ! Пояснение |-&lt;br /&gt;
 | departments ! storage ! insert ! ! Обновляет path и depth|-&lt;br /&gt;
 | departments ! storage ! update ! ! Обновляет path и depth|-&lt;br /&gt;
 | departments ! storage ! update ! status = deleted! Все подразделения, ссылавшиеся на удалённое, переходят на уровень выше|-&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |departments&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу departments.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |departments&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице departments.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |departments&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы departments.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/orders&amp;diff=2143</id>
		<title>Разработка:storages/orders</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/orders&amp;diff=2143"/>
				<updated>2011-03-05T14:27:36Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Подробный формат полей в таблице: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = orders&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
Приказы - единоличные, законченные, единовременные распоряжения пользователей системы, на выполнение значимых действий с данными в системе.  Реализуют протоколирование и исполнение как обычных приказов (приказ о зачислении, приказ о переводе), так и подразумеваемые приказы (выставление оценки, изменение статуса объекты).&lt;br /&gt;
Не обязательно все действия в системе должны выполняться через приказы, однако нужно стремится реализовать как приказы все действия, которые необходимо протоколировать и для работы с которыми в будущем предполагается использовать индивидуальную цифровую подпись. При последующей реализации индивидуальной цифровой подписи, ею можно будет заверять только действия, оформленные в качестве приказов. Сейчас при обработки приказов вычисляются контрольные суммы данных (сигнатуры sha1), для затруднения несанкционированного изменения данных (требуется ключь, сохраненный в конфигурационном файле).&lt;br /&gt;
&lt;br /&gt;
С программной точки зрения работа с приказами построена следующим образом:&lt;br /&gt;
* Плагин, &amp;quot;желающий&amp;quot; реализовать собственный приказ наследует родительский класс приказа (dof_storage_orders_baseorder), объявленный в справочнике &amp;quot;приказ&amp;quot;. Базовый класс содержит методы для наполнения приказа данными, исполнения приказа, получение из БД данных о ранее исполненном приказе. В дочернем классе эти методы переопределяются, в соответствии с логикой работы данного приказа.&lt;br /&gt;
* Для унификации, плагин, использующий приказы, должен реализовать метод order($code,$id=null), который возвращает объект нового или существующего приказа.&lt;br /&gt;
* При сохранении приказа, данные сохраняются в справочник orders в сериализованном виде, или в другие справочники (для этого можно использовать методы load_data() и save_data() либо в классе приказа переопределяются методы load() и save(), которые сохраняют/читают часть данных в других справочниках и убирают/добавляют их в поле data). При сохранении указывается ответственный сотрудник (подготовивший приказ) и отдел, к которому приказ относится.&lt;br /&gt;
* До исполнения приказа его необходимо подписать с помощью метода sign(), при этом формируется хешь от всех данных приказа (включая отсутствующие в sdata) и записывается в поле signature. Подпись приказа рассчитывается с учетом id подписанта. Если данные из других справочников будут возвращены в другой последовательности, либо данные будут измененыв в других справочниках в обход приказа, цифровая подпись станет недействительной.&lt;br /&gt;
* Подписанный приказ можно один раз исполнить методом execute(). При этом выполняются все действия, сопутствующие исполнению приказа. При необходимости, часть данных из sdata в другие справочники может переноситься именно на этом этапе, тогда переопределенная функция load() должна уметь их получить. Исполненный приказ помечается как исполненный. Это конечное состояние, удалить исполненный приказ нельзя, его действие можно отменить только другим, противоположным по эффекту приказом (если такой предусмотрен). Повторно исполнить приказ нельзя.&lt;br /&gt;
* Справочник &amp;quot;приказы&amp;quot; содержит метод, для получения записанного в БД приказа, при этом на основании информации из БД инициализируется соотествующий объект, который загружает собственные данные любым способом. Для этого используются методы order() в плагинах, реализовавших соответствующие типы приказов.&lt;br /&gt;
&lt;br /&gt;
Данные приказа представляют собой сложно-структурированный объект (тип object), элементами которого могут быть скалярные значение, другие объекты и массивы. После исполнения приказа эти данные могут протоколироваться как в сериализованном виде, так и в реляционном, в виде составных частей записей в БД. Следует стремится к тому, чтобы формат этого объекта соответствовал формату входных данных для шаблона, отображающего приказ в виде документа ODF и в других форматах. Для этого формат объекта планируется совместимым с шаблонизатором [[Разработка:modlibs/templater]], с тем, чтобы приказы можно было распечатывать без дополнительной обработки.&lt;br /&gt;
&lt;br /&gt;
==Таблица в базе данных==&lt;br /&gt;
''orders'' - список зарегистрированных и исполненных приказов, с информацией о плагине, реализующем объект приказа, исполнителе, дате исполнения, специальном поле для сериализованного объекта приказа.&lt;br /&gt;
&lt;br /&gt;
===Подробный формат полей в таблице:===&lt;br /&gt;
* plugintype - тип плагина, в котором реализован приказ&lt;br /&gt;
* plugincode - код плагина, в котором реализован приказ&lt;br /&gt;
* pluginversion - версия плагина, в котором реализован приказ&lt;br /&gt;
* code - код типа приказа (уникален внутри одного плагина)&lt;br /&gt;
* departmentid - id отдела в таблице [[Разработка:storages/departments | departments ]], внутри которого издан приказ&lt;br /&gt;
* ownerid - id персоны в таблице [[Разработка:storages/persons | persons ]], подготовившей приказ&lt;br /&gt;
* signerid - id персоны в таблице [[Разработка:storages/persons | persons ]], подписавшей приказ&lt;br /&gt;
* date - дата приказа (которой он пройдет по документам)&lt;br /&gt;
* signdate - id персоны, подписавшей приказ&lt;br /&gt;
* exdate - дата исполнения приказа в системе&lt;br /&gt;
* changedate - дата последнего изменения приказа&lt;br /&gt;
* status - статус приказа&lt;br /&gt;
* sdata - сериализованные данные приказа (если нужны)&lt;br /&gt;
* signature - сигнатура приказа (sha от signerid, ключевого слова из конфига,signdate,date и сериализованной data)&lt;br /&gt;
* notes - заметки&lt;br /&gt;
&lt;br /&gt;
==Дополнительные методы:==&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_code($plugintype,$plogincode,$code,$departmentid=null,$ownerid=null,$signerid=null,$status=null,$limitfrom=&amp;quot;&amp;quot;,$limitnum=&amp;quot;&amp;quot;)'''====&lt;br /&gt;
&lt;br /&gt;
Выдает список приказов по параметрам&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (str) $plugintype - тип плагина, в котором реализован приказ&lt;br /&gt;
* (str) $plogincode - код плагина, в котором реализован приказ&lt;br /&gt;
* (str) $code - код типа приказа (уникален внутри одного плагина)&lt;br /&gt;
* (int) $departmentid - id отдела в таблице departments , внутри которого издан приказ, по умолчанию null&lt;br /&gt;
* (int) $ownerid - id персоны в таблице [[Разработка:storages/persons | persons ]], подготовившей приказ, по умолчанию null&lt;br /&gt;
* (int) $signerid - id персоны в таблице [[Разработка:storages/persons | persons ]], подписавшей приказ, по умолчанию null&lt;br /&gt;
* (str) $status - статус приказа, по умолчанию null&lt;br /&gt;
* (int) $limitfrom - id, начиная с которого надо искать, по умолчанию пусто&lt;br /&gt;
* (int) $limitnum максимальное количество записей, которое надо вернуть, по умолчанию пусто&lt;br /&gt;
''Возвращает значение:''&lt;br /&gt;
* (mixed) массив объектов если что-то нашлось или false&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
=== dof_storage_orders_baseorder ===&lt;br /&gt;
Класс является базовым классом для типов приказов, объявляемых в плагинах. Дочерние классы должны именоваться по шаблону dof_типплагина_кодплагина_order_кодприказа.&lt;br /&gt;
* plugintype(),plugincode(),code() - получить идентификационную информацию о типе документа (должны быть объявлены в дочерних классах и возвращать строки).&lt;br /&gt;
* baseptype(), basepcode() - идентификация плагина storages/orders, если объекту понадобиться обратиться к справочнику orders.&lt;br /&gt;
* get_id() - получить id текущего объекта&lt;br /&gt;
* set_id() - установить id. Не может вызываться напрямую, только через методы save() и load()&lt;br /&gt;
* load($id,$withoutdata=false) - проверить наличие объекта совместимого типа в БД и сопоставиться с ним. Если требуется - собрать и вернуть данные объекта. Возвращается объект из справочника orders, с убранными полями sdata, plugintype, plugincode, code и добавленным полем data, куда помещены десериализованные данные из sdata, если они были запрошены.  Если данные необходимо сохранять в других справочниках, в дочернем классе переопределяется метод load_date() либо сам метод load(), а родительский метод вызывается через parent::. При загрузке к объекту в поле $order-&amp;gt;data добавляются копии служебных полей, с префиксом из символа подчеркивания, чтобы эти данные сразу можно было использовать в шаблонах.&lt;br /&gt;
* save(object $data) - сохранить данные приказа в БД. Перед сохранением убираются поля, которые нельзя изменять напрямую (plugintype, plugincode, code, exdate, changedate, status, sdata, signerid, signature, signdate, data). Данные из data сериализуются в sdata. Если часть данных после сохранения или исполнения хранится в других справочниках, можно переопределить метод save_data(), либо сам метод save() должен быть переопределен, а родительский вызывать через parent::. При этом, для корректности цифровой подписи необходимо обеспечить получение полей в той же последовательности, в которой они были сохранены. Кроме того, при сохранении удаляются копии служебных полей из поля $order-&amp;gt;data, чтобы избежать дублирования при сохранении.&lt;br /&gt;
* execute() - исполнить текущий приказ и пометить его как исполненный, если он был корректно подписан. Как правило переопределять не требуется, так как все сопутсвующие действия можно поместить в execute_actions(). &lt;br /&gt;
* execute_actions() - исполнить действия, сопутствующие выполнению приказа (вызывается после проверки подписи в execute()).  Если данные переписываются в другие справочники, они должны быть записаны так, чтобы функция load() прочитала все поля в точности в той же последовательности, как они были в сериализованном виде, иначе подпись не сойдется.&lt;br /&gt;
* notes() - сохранить заметки о приказе (не считается изменением приказа и не влияет на подпись)&lt;br /&gt;
* sign() - подписать объект по id&lt;br /&gt;
* is_signed() - проверить подпись по id&lt;br /&gt;
* make_sign() - сфоормировать строку подпись по объекту, возвращенному load(), при этом подпись зависит от порядка полей и чувствительна к любым изменениям данных. Несущественные и часто-меняющиеся данные необходимо выносить за пределы приказа и подгружать уже непосредственно перед их использованием.&lt;br /&gt;
* check_signature() - проверить корректность подписи по объекту, возвращенному load()&lt;br /&gt;
&lt;br /&gt;
=== Пример объявления нового приказа ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // Инициализируем работу с приказами&lt;br /&gt;
 $DOF-&amp;gt;storage('orders');&lt;br /&gt;
 // Объявляем класс&lt;br /&gt;
 class dof_im_exampleim_order_delete extends  dof_storage_orders_baseorder&lt;br /&gt;
 {&lt;br /&gt;
    /**&lt;br /&gt;
     * Тип плагина, объявившего тип приказа&lt;br /&gt;
     */&lt;br /&gt;
    public function plugintype()&lt;br /&gt;
    {&lt;br /&gt;
        return 'im';&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Код плагина, объявившего тип приказа&lt;br /&gt;
     */&lt;br /&gt;
    public  function plugincode()&lt;br /&gt;
    {&lt;br /&gt;
        return 'exampleim';&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Код типа приказа&lt;br /&gt;
     */&lt;br /&gt;
    public  function code()&lt;br /&gt;
    {&lt;br /&gt;
        return 'delete';&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * Исполнить действия, сопутствующие исполнению приказа &lt;br /&gt;
     *&lt;br /&gt;
     * @param object $order&lt;br /&gt;
     * @return bool&lt;br /&gt;
     */&lt;br /&gt;
    protected function execute_actions($order)&lt;br /&gt;
    {&lt;br /&gt;
        // Удаляем объект, который потребовали удалить в приказе&lt;br /&gt;
        return $this-&amp;gt;dof-&amp;gt;storage('examplest')-&amp;gt;delete($order-&amp;gt;data-&amp;gt;id);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример использования ===&lt;br /&gt;
В базовый класс плагина добавляется метод&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * Возвращает объект приказа&lt;br /&gt;
     *&lt;br /&gt;
     * @param string $code&lt;br /&gt;
     * @param integer  $id&lt;br /&gt;
     * @return dof_storage_orders_baseorder&lt;br /&gt;
     */&lt;br /&gt;
    public function order($code,$id=NULL)&lt;br /&gt;
    {&lt;br /&gt;
        switch ($code)&lt;br /&gt;
        {&lt;br /&gt;
            case 'delete':&lt;br /&gt;
                // Хорошей мыслью будет сделать сдесь кеширование&lt;br /&gt;
                $order = new dof_im_exampleim_order_delete($this-&amp;gt;dof);&lt;br /&gt;
                if (!is_null($id))&lt;br /&gt;
                {&lt;br /&gt;
                    if (!$order-&amp;gt;load($id))&lt;br /&gt;
                    {&lt;br /&gt;
                        // Не найден&lt;br /&gt;
                        return false;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                // Возвращаем объект&lt;br /&gt;
                return $order;&lt;br /&gt;
            break;&lt;br /&gt;
            default:&lt;br /&gt;
                // Ошибка&lt;br /&gt;
                return false;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Использование&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
        // Создаем экземпляр приказа напрямую&lt;br /&gt;
        // $order = new dof_im_exampleim_order_delete($DOF);&lt;br /&gt;
        // Или через плагин&lt;br /&gt;
        $order = $DOF-&amp;gt;im('exampleim')-&amp;gt;order('delete');&lt;br /&gt;
        // Вводим данные (id, отдел, ответственный, время в приказе)&lt;br /&gt;
        $orderobj = new object();&lt;br /&gt;
        $orderobj-&amp;gt;departmentid = 1;&lt;br /&gt;
        $orderobj-&amp;gt;ownerid = 2;&lt;br /&gt;
        $orderobj-&amp;gt;date = time();&lt;br /&gt;
        $orderobj-&amp;gt;data-&amp;gt;id = $id;&lt;br /&gt;
        // Сохраняем приказ в БД и привязываем экземпляр приказа к id&lt;br /&gt;
        $order-&amp;gt;save($orderobj);&lt;br /&gt;
        // Подписываем от имени персоны 2&lt;br /&gt;
        $order-&amp;gt;sign(3)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |orders&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу orders.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |orders&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице orders.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |orders&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы orders.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2094</id>
		<title>Разработка:im/journal</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2094"/>
				<updated>2011-01-13T08:12:59Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Права */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Классный журнал ==&lt;br /&gt;
В журнале можно выставлять оценки и вводить отчет о проведенном уроке.&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
Вверху страницы находится форма для выбора подразделения и кнопка &amp;quot;показать&amp;quot;. По умолчанию показывается информация по всем учебным подразделениям. При выборе конкретного учебного подразделения показывается информация только по нему.&lt;br /&gt;
&lt;br /&gt;
Вывод информации по журналам организован в виде маркированного списка следующего вида:&lt;br /&gt;
* ''Подразделение''&lt;br /&gt;
** ''Учебная программа''&lt;br /&gt;
*** ''Учебный период''&lt;br /&gt;
**** ''Предмет''&lt;br /&gt;
***** ''Учебный поток (дата_начала - дата_окончания)''&lt;br /&gt;
Каждая запись учебного потока является ссылкой на страницу журнала учебного потока.&lt;br /&gt;
=== Журнал класса ===&lt;br /&gt;
Под панелью навигации выводится надпись &amp;quot;Журнал группы&amp;quot;.&lt;br /&gt;
Ниже таблица с информацией о потоке - программа, предмет, группа, преподаватель. Справа от этой таблицы размещена  ссылка &amp;quot;Новый урок&amp;quot;. Нажатие на нее позволяет создать новый отчет об уроке. Над этой ссылкой будут выводиться сообщения об ошибках сохранения данных из таблицы оценок.&lt;br /&gt;
Ниже отображаются две таблицы - таблица оценок и, справа от нее, таблица отчетов об уроке. Обе таблицы сделаны максимально похожими на соответствующие таблицы в бумажном &amp;quot;Классном журнале&amp;quot;. Таблицы связаны друг с другом. Так, дата в таблице оценок отображаются только в том случае, если был создан отчет об уроке для этой даты. При нажатии на дату в таблице оценок, происходит перемещение к соответствующей строке отчета об уроке.&lt;br /&gt;
=== Таблица оценок. ===&lt;br /&gt;
Если таблица отчетов об уроке пуста, то в таблице оценок нет ни одной колонки с датой.&lt;br /&gt;
Если журнал заполнен, то в верхней строке отображаются названия месяцев, ниже номера дней месяцев, на которые приходились занятия. Каждое число месяца - ссылка, при нажатии на которую происходит переход на соответствующую этому дню строку таблицы отчета об уроке.&lt;br /&gt;
Сразу под числом расположен значок редактирования. Он также выполнен в виде ссылки. При нажатии на него страница перезагружается в режиме формы ввода оценок и выставления присутствия учеников на уроке, который проходил в тот день, по значку под числом которого щелкнули.&lt;br /&gt;
В колонке этого дня, напротив фамилии каждого ученика появляются два поля. Поле выбора из списка - для проставления оценки. И поле переключатель - для отметки присутствия на уроке. Об этом напоминает буква &amp;quot;н&amp;quot;, расположенная справа от него. Если ученик был на уроке, то это поле следует оставить пустым. Если не был - поставить там флажок. Для выставления оценки следует выбрать элемент из списка. После того как изменения будут сохранены, в соответствующих клетках появятся буквы &amp;quot;Н&amp;quot; или оценки. Если кому-то была выставлена и оценка и отметка об отсутствии на уроке, на против его фамилии можно будет увидеть букву &amp;quot;Н&amp;quot;. Однако перед сохранением будет выведено предупреждение о том, что выставлена оценка отсутствующему ученику. Под уведомлением будут две кнопки - &amp;quot;Продолжить&amp;quot; и &amp;quot;Отменить&amp;quot;. При нажатии на &amp;quot;Продолжить&amp;quot; сценарий сохранения будет выполнен. Нажатие на другую кнопку вызовет отмену процедуры сохранения и возврат к форме с несохраненными изменениями.&lt;br /&gt;
При переключении в режим формы под таблицей появляется надпись &amp;quot;Внимание! До нажатия кнопки &amp;quot;сохранить&amp;quot; оценки не сохраняются.&amp;quot; И три кнопки - &amp;quot;Сохранить&amp;quot;, &amp;quot;Сохранить и продолжить&amp;quot;, &amp;quot;Восстановить&amp;quot;. Нажатие на первую кнопку сохраняет изменения, сделанные в форме и перезагружает страницу в режим просмотра. Вторая - сохраняет сделанные изменения, но страница остается в режиме формы - можно продолжать ввод. Третья кнопка отменяет сделанные изменения. Все введенные,  но несохраненные данные удаляются из формы. Форма перегружается с отображением последних сохраненных изменений.&lt;br /&gt;
Если ученику была выставлена оценка, а затем отменена - в форме было выбрано пустое поле, то ранее выбранная оценка будет удалена. Если оценка была изменена, то оценка будет обновлена. Каждое из этих действий, а также выставление статуса присутствия на уроке, будет выполнено через издание приказа.&lt;br /&gt;
Если редактируется контрольная точка без события, то в форме показываеются только поля выставления оценки. Поле присутствия на уроке не показывается и статус присутствия не сохраняется.&lt;br /&gt;
Контрольная точка без события выводится в таблице оценок без даты. Вместо даты выводится название КТ.&lt;br /&gt;
Что происходит в процессе сохранения.&lt;br /&gt;
После того как нажата одна из кнопок, сохраняющая внесенные изменения происходит&lt;br /&gt;
&lt;br /&gt;
* формирование приказа регистрации присутствия учеников на уроке. В него сохраняются данные о всех учениках потока, их статусы присутствия, id события, статус присутствия на котором выставляется.&lt;br /&gt;
* применение приказа и сохранение статусов учеников в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
Если были выставлены оценки. То в дополнение к вышеописанным действиям происходят следующие действия:&lt;br /&gt;
* формирование приказа регистрации выставления оценок только тем ученикам, которые их получили на уроке. В приказе сохраняются: точное время выставления оценки, id КТ, за которую выставлена оценка, id преподавателя (из /storage/persons), который выставил оценку, ученики, которые получили оценку, и соответствующие им оценки, статус оценки, id подписки ученика на поток.&lt;br /&gt;
* применение приказа и сохранение оценок в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
После создания отчета об уроке, происходит возврат на главную страницу журнала и таблица оценок загружается в режиме формы того дня, отчет для которого был создан. Если этот день выходит за границы видимости окна, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой. После редактирования отчета об уроке таблица оценок загружается в режиме просмотра. Если день, для которого происходило редактирование отчета выходит за границы видимости, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой.&lt;br /&gt;
&lt;br /&gt;
=== Таблица отчетов об уроках. ===&lt;br /&gt;
Представляет собой таблицу из шести столбцов.&lt;br /&gt;
Первый столбец - порядковый номер урока. Второй - дата урока в фомате дд.мм. Третий - тема урока - произвольный текст. Четвертый - задание на дом. Пятый - замена урока или преподавателя. Пятый - заметки об уроке. В настоящее время три последних поля не используются.&lt;br /&gt;
Уроки сортируются по датам, сверху вниз по возрастанию.&lt;br /&gt;
Под датой располагается значок редактирования информации об уроке, выполненный в виде ссылки. При щелчке по нему открывается новая страница с формой редактирования отчета об уроке. Все поля формы заполнены соответствующей информацией. Ее можно изменить, а изменения сохранить.&lt;br /&gt;
Эта же страница открывается при щелчке по ссылке &amp;quot;Новый урок&amp;quot;.&lt;br /&gt;
=== Страница редактирования урока. ===&lt;br /&gt;
Вверху страницы, под строкой навигации, выводится надпись &amp;quot;Классный журнал&amp;quot;.&lt;br /&gt;
Ниже выводится форма ввода информации об уроке - &amp;quot;Отчет об уроке&amp;quot;. В поле &amp;quot;Дата проведения урока&amp;quot; нужно выбрать дату урока. В поле &amp;quot;Элементы темплана&amp;quot; можно выбрать тему для нового урока. Ниже находится текстовое поле ввода &amp;quot;Что пройдено на уроке&amp;quot;. Сюда можно ввести тему урока вручную.&lt;br /&gt;
Еще ниже поле &amp;quot;Домашнее задание&amp;quot; для ввода соответствующей информации.&lt;br /&gt;
В самом низу расположены две кнопки - &amp;quot;Сохранить&amp;quot; и &amp;quot;Отмена&amp;quot;. При нажатии на вторую происходит возврат на главную страницу журнала без сохранения внесенных изменений. После нажатия на кнопку &amp;quot;Сохранить&amp;quot; происходит сохранение введенных данных в соответствующих таблицах. О результатах операции сохранения информирует надпись, выводимая под кнопками. Еще ниже появляется ссылка &amp;quot;назад&amp;quot; для возврата на главную страницу журнала. В случае возврата после сохранения данных, таблица оценок загружается в режиме редактирования данных на дату только что сохраненного урока.&lt;br /&gt;
Правее формы редактирования урока расположено окно с полосами прокрутки, в котором можно просмотреть темы уже проведенных уроков.&lt;br /&gt;
Они выводятся в видет таблицы из двух столбцов, в которых указываются соответственно дата и тема урока.&lt;br /&gt;
В зависимости от заполненности полей ввода возможны разные варианты обработки введенных данных.&lt;br /&gt;
&lt;br /&gt;
{|border=1&lt;br /&gt;
 |id КТ&lt;br /&gt;
 |id темы, выбранной из списка.&lt;br /&gt;
 |как обрабатывается&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |создается новая КТ и новое событие.&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |выбрана из списка&lt;br /&gt;
 |создается новое событие, привязанное к КТ, выбранной из списка&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и равна id КТ&lt;br /&gt;
 |обновляем КТ и (если изменяется дата) все события, которые ей соответствуют.&lt;br /&gt;
Тему из списка &amp;quot;Элементы темтемплана&amp;quot; выбрать нельзя.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и не равна id КТ&lt;br /&gt;
 |такая ситуация запрещена.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |0&lt;br /&gt;
 |такая ситуация запрещена&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ведомость итоговых оценок ===&lt;br /&gt;
На данной странице можно выставить итоговые оценки учащимся и завершить обучение потока. Страница принимает обязательный параметр id - id идущего  или завершенного потока.&lt;br /&gt;
&lt;br /&gt;
Вверху страныцы отображается форма, где отображены ученики, которые обучаются на данном потоке. Напротив каждого можно выбрать итоговую оценку, выставляемую учащемуся. Итоговые оценки берутся из шкалы дисциплины приписанной к данному потоку. Под ведомостью стоит галочка подтвержения оценок, без нее оценки не сохранятся. Делее стоит галочка завершения обучения если необходимо завершить поток, При завершении потока все подписки на дисциплину переводятся в один из конечных статусов. Если поток уже завершен, то галочка не показывается, вместо нее предупреждение. После завершения потока оценки также можно выставить, но они уже будут идти как переэкзаменовка. &lt;br /&gt;
&lt;br /&gt;
После того как мы выставили оценки и нажали на кнопку сохранить формируется приказ о выставленни итоговых оценок. На основе этого приказа сохраняются оценки, после чего на новой странице показывается шаблон ведомости в том виде, в котом она будет распечатана. &lt;br /&gt;
После первого сохранения оценок эта ведомость также становится доступна для печати. &lt;br /&gt;
&lt;br /&gt;
Перейти на эту страницу можно со страницы Журнала группы.&lt;br /&gt;
&lt;br /&gt;
==Права==&lt;br /&gt;
&lt;br /&gt;
* '''datamanage''' - глобальное право (администратор)&lt;br /&gt;
* '''view_journal''' - право на просмотр журнала предмето-потока (учитель курса или завуч)&lt;br /&gt;
* '''view_all_journals''' - право на просмотр всех журналов (может просматривать общую информацию и личные данные)&lt;br /&gt;
* '''view_all_journals_department''' - право на просмотр всех журналов подразделения (может просматривать общую информацию и личные данные)&lt;br /&gt;
* '''can_complete_lesson''' - право отметить проведение урока (учитель урока или завуч)&lt;br /&gt;
* '''create_schevent''' - право на создание события (завуч и учитель на потоке)&lt;br /&gt;
* '''edit_schevent''' - право на редактирование события (учитель на потоке или завуч)&lt;br /&gt;
* '''control_journal''' - право на проверку журнала (завуч)&lt;br /&gt;
* '''give_grade''' - право на проверку журнала (учитель на потоке или завуч)&lt;br /&gt;
* '''give_itog_grades''' - право выставить итоговые оценки (поток завершён и пользователь - учитель на потоке)&lt;br /&gt;
* '''view_events''' - право просматривать свое расписание (учитель)&lt;br /&gt;
* '''give_attendance''' - право на отметку посещаемости (учитель на потоке или завуч)&lt;br /&gt;
* '''give_theme_event''' - право указать тему для события (только событие в статусе &amp;quot;запланирован&amp;quot; или &amp;quot;заменено другим событием&amp;quot;, а пользователь - завуч или ответственный преподаватель)&lt;br /&gt;
* '''edit_plans''' - право редактировать КТ (КТ не &amp;quot;зафиксирована&amp;quot; и ((КТ завершена или событие состоялось), а пользователь - завуч) или пользователь может выставлять оценки)&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
В этом разделе описаны функции для работы со страницами &amp;quot;журнал группы&amp;quot; и &amp;quot;список журналов&amp;quot;. Здесь содержится только краткое описание функций и их параметров. Если вас интересует их внутренняя логика, то обратитесь к разделу [[Разработка:im/journal#Подробное описание работы функций|Подробное описание]]. Аргументы всех функций перечислены именно в том порядке, в котором их следует передавать.&lt;br /&gt;
=== Журнал группы ===&lt;br /&gt;
В этом разделе собраны все функции, которые относятся к странице &amp;quot;журнал группы&amp;quot;&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
Класс отрисовки школьного журнала&lt;br /&gt;
===== print_texttable() =====&lt;br /&gt;
Вывести страницу журнала - просмотр оценок, или редактирование&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $editid  - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid - id учебного события, которое будет редактировано (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* null&lt;br /&gt;
===== check_permissions() =====&lt;br /&gt;
Проверяет разрешения на редактирование оценок для текущего пользователя&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true/false - есть или нет разрешения на редактирование оценок&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
Класс для отрисовки таблицы тематического планирования в классном журнале&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
 &lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Выводит таблицу тематического планирования на экран&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
Класс для создания или редактирования одной темы на странице планирования уроков&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $planid - id элемента учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
* $eventid - id учебного события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== get_topic() =====&lt;br /&gt;
Возвращает объект с полями, необходимыми для заполнения формы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - объект с полями для вставки в форму, или false в случае ошибки&lt;br /&gt;
===== create_topic() =====&lt;br /&gt;
Создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint - контрольная точка из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event - заранее заготовленный объект для таблицы [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи из таблицы schevents или false в случае ошибки&lt;br /&gt;
===== save_topic() =====&lt;br /&gt;
Обновляет существующий или создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint (object) - объект для обновления или создания записи в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event (object) - объект для обновления или создания записи в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true, если все записи успешно обновлены&lt;br /&gt;
* (int), id новой записи, если она была добавлена&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Формирует таблицу тематического планирования в правой части страницы журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
===== get_anchor_id() =====&lt;br /&gt;
Возвращает метку времени, которая будет создана для нового урока, чтобы осуществить корректное перенаправление на страницу журнала&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $time - (int) время создания нового события: метка времени в формате unixtime&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - метка времени для перенаправления&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
Класс для подготовки сырых исходных данных для формирования школьного журнала и ему подобных документов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор - определяет с каким учебным потоком будет вестись работа&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
Класс для проверки и обработки оценок из формы&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор класса. Осуществляет все проверки и записывает данные во внутреннее поле.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $gradedata (array) - массив $_POST из формы&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== process_form() =====&lt;br /&gt;
Обработать все данные, пришедшие из формы: установить посещаемость, выставить оценки и сформировать приказы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* false в случае неудачи. В случае успеха производит редирект на страницу журнала&lt;br /&gt;
==== Класс dof_im_journal_presence ====&lt;br /&gt;
Класс для обработки информации о посещаемости &lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== presence_students() =====&lt;br /&gt;
Формирует массив присутствия учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
===== absence_students() =====&lt;br /&gt;
Формирует массив отсутствующих студентов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $away - массив id отсутствующих учеников&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
==== Дополнительные функции ====&lt;br /&gt;
===== dof_im_journal_format_date() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времення для преобразования.&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'.&lt;br /&gt;
* $url (string) - Указывается, если необходимо получить дату как ссылку. По умолчанию NULL&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с отформатированной датой&lt;br /&gt;
===== dof_im_journal_date_edit() =====&lt;br /&gt;
Возвращает отформатироанную дату и значок редактирования как ссылку&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времени&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'&lt;br /&gt;
* $durl (string) - путь ссылки для даты, если не указана - дата выводится как просто строка. По умолчанию null.&lt;br /&gt;
* $eurl (string) - путь ссылки для значка, если не указана значок не показывается По умолчанию null.&lt;br /&gt;
* $imgsubdate (bool) - вывести значок под датой или рядом по умолчанию true (выводит значок под датой)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с отформатированной датой&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс содержит функции для работы со страницей списка журналов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
===== set_data() =====&lt;br /&gt;
Заполняет начальной информацией внутренние поля объекта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения (таблица [[Разработка:storages/departments|departments]]). По умолчанию 0.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
===== get_data() =====&lt;br /&gt;
Возвращает собранные данные&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив структурных подразделений&lt;br /&gt;
===== get_journals() =====&lt;br /&gt;
Получить все журнлы занесенных подразделений&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
== Подробное описание работы функций ==&lt;br /&gt;
В этом разделе описывается подробная работа всех публичных и внутренних методов для классов журнала. Если вам требуется только краткая справка по API, то обратитесь к разделу [[Разработка:im/journal#API|API]].&lt;br /&gt;
=== Для журнала группы ===&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
&lt;br /&gt;
===== Описание print_texttable() =====&lt;br /&gt;
[[#print_texttable()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
Итоговая функция, выводящая всю собранную информацию на экран. &lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собирает всю информацию при помощи функции [[Разработка:im/journal#Описание get_all_form()|get_all_form()]]&lt;br /&gt;
# обращается к плагину templater для представления информации в html-формате&lt;br /&gt;
# функцией print выводит результат работы templater'а на экран.&lt;br /&gt;
===== Описание check_permissions() =====&lt;br /&gt;
[[#check_permissions()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем учебный поток. Если поток не найден - возвращаем false.&lt;br /&gt;
# проверяем статус учебного потока. Если он не равен значению &amp;quot;go&amp;quot;, то возвращаем false.&lt;br /&gt;
# проверяем, имеет ли текущий пользователь права редактирования. Если нет, то возвращаем false.&lt;br /&gt;
# если все проверки пройдены успешно, то возвращаем true.&lt;br /&gt;
===== Описание get_all_form() =====&lt;br /&gt;
Возвращает объект формы для вставки в templater. Таблица в шаблоне формируется по столбцам, т. е. сначала выводится контрольная точка в тем. планировании, а затем оценки всех учеников за это событие (как при заполнении обычного школьного журнала).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $editid (int) - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid (int) - id редактируемого учебного события в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) объект нужной структуры для построения шаблона&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собираем в объект все стандартные надписи для таблицы&lt;br /&gt;
# собираем все запланированные активные контрольные точки учебного потока&lt;br /&gt;
# создадим массивы для названий месяцев и дат&lt;br /&gt;
# собираем в массив информацию по ученикам. Если параметр $editid не равен нулю, то в столбце оценок для редактируемой даты вместо оценки выводим форму.&lt;br /&gt;
# собираем в результурующий массив названия месяцев и дат &lt;br /&gt;
# если нужно распечатать форму - устанавливаем стандартные html-теги начала и конца формы&lt;br /&gt;
# возвращаем результат&lt;br /&gt;
&lt;br /&gt;
===== Описание get_cell_form() =====&lt;br /&gt;
Возвращает редактируемую ячейку таблицы журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons.&lt;br /&gt;
* $cpassedid (int) - id учебной программы&lt;br /&gt;
* $oldgrade (int) - старая оценка (если есть). По умолчанию null.&lt;br /&gt;
* $gradeid (int) - id оценки в таблице cpgrades . По умолчанию 0&lt;br /&gt;
* $eventid (int) - id учебного события в таблице [[Разработка:storages/schevents|schevents]].&lt;br /&gt;
* $scale (string) - шкала всех возможных оценок через запятую. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с html-кодом формы редактирования оценки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Вся форма редактирования оценки представляет собой маленькую таблицу. С левой стороны находится форма выбора оценки, а справа галочка для отметки отсутствующего ученика (верхняя ячейка) и пояснение к ней (нижняя ячейка).&lt;br /&gt;
# получаем все допустимые варианты оценок для данного задания из параметра scale.&lt;br /&gt;
# из этих вариантов оценки составляем html-элемент формы типа SELECT.&lt;br /&gt;
# если за задание уже есть ранее выставленная, старая оценка, то делаем ее оценкой по умолчанию&lt;br /&gt;
# узнаем статус присутствия ученика на занятии, и в зависимсости от этого проставляем галочку над буквой &amp;quot;н&amp;quot;. Форма с возможностью отмечания отсутствующих учеников отображается только для контрольных точек для которых есть события.&lt;br /&gt;
# возвращаем результат одной строкой.&lt;br /&gt;
===== Описание get_cell_string() =====&lt;br /&gt;
Получить текстовое содержимое ячейки оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий данные об элементе тематического планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - данные об оценке По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) html-код оценки, либо специальный знак пробела, чтобы в таблице было видно пустую ячейку&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
# узнаем данные о посещаемости: получаем id события, если оно есть&lt;br /&gt;
#* если событие есть, узнаем, был ли ученик на занятии&lt;br /&gt;
# находим оценку&lt;br /&gt;
#* если ученик был на занятии и получил оценку - выводим оценку&lt;br /&gt;
#* если ученик был на занятии и не получил оценку - выводим символ пробела&lt;br /&gt;
#* если ученик отсутствовал на занятии и нет оценки, то выводим букву &amp;quot;н&amp;quot;&lt;br /&gt;
#* если ученик отсутствовал на занятии и получил оценку - выводим оценку, и букву &amp;quot;н&amp;quot; рядом с ней&lt;br /&gt;
&lt;br /&gt;
===== Описание get_one_cell() =====&lt;br /&gt;
Возвращает данные в одной клетке журнала. Определяет какой тип ячейки выводить: для редактирования или текстовую.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий контрольную точку с событием  из тем. планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - объект содержащий данные об оценке (таблица cpgrades)&lt;br /&gt;
* $cpassedid (int) - id подписки (таблица cpassed)&lt;br /&gt;
* $editid (int) - id редактируемого в текущий момент элемента из тем. планирования&lt;br /&gt;
* $eventid (int) - id редактируемого в текущий момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
* $scale (string) = По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с html-кодом формы редактирования оценки, либо сама оценка, либо статус &amp;quot;отсутствовал&amp;quot;&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# сравниваем, совпадают ли id выводимой и редактируемой в данной момент контрольной точки&lt;br /&gt;
#* если id совпадают - то выводим форму редактирования оценки&lt;br /&gt;
#** если за это задание оценка уже была ранее выставлена, то выводим форму с установленной ранее оценкой&lt;br /&gt;
#** если за задание еще нет оценки - то выводим форму без предустановленных значений&lt;br /&gt;
#* если id не совпадают то выводим оценку текстом (либо статус &amp;quot;отсутствовал&amp;quot;, либо пустую клетку, в зависимости от того был ли ученик на уроке, и получил ли он оценку)&lt;br /&gt;
===== Описание get_line_for_student() =====&lt;br /&gt;
Возвращает строку таблицы журнала для одного ученика.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $i (int) - порядковый номер ученика в группе&lt;br /&gt;
* $student (object) - объект с данными об ученике из таблицы persons&lt;br /&gt;
* $cpasseds (array) - массив объектов, содержащий все подписки учеников этого потока&lt;br /&gt;
* $plans (array) -  массив объектов, содержащий все контрольные точки текущего курса (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (или 0, если события нет) Таблица [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - информация об ученике: его ФИО, и оценки по всем контрольным точкам, а также сведения о посещаемости&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в соответствующие поля итогового объекта порядковый номер ученика, и его ФИО&lt;br /&gt;
# перебираем все переданные подписки ищем ту, которая относится к переданному ученику&lt;br /&gt;
# записываем в итоговый объект id его подписки&lt;br /&gt;
# создаем массив для оценок и собираем оценки ученика:&lt;br /&gt;
#* перебираем все контрольные переданные точки ($plans)&lt;br /&gt;
#* для каждой контрольной точки создаем объект оценки&lt;br /&gt;
#* получаем значение оценки за просматриваемую контрольную точку&lt;br /&gt;
#* при помощи функции [[Разработка:im/journal#Описание get_one_cell()|get_one_cell()]] получаем оформленный html-код оценки&lt;br /&gt;
#* записываем полученный объект в массив оценок&lt;br /&gt;
# добавляем массив оценок в итоговый объект&lt;br /&gt;
# возвращаем итоговый объект&lt;br /&gt;
===== Описание get_lines_for_students() =====&lt;br /&gt;
Возвращает массив строк с ФИО и оценками для всех учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans (array) - массив всех контрольных точек учебного потока из таблицы plans&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) информация о всех учениках учебного потока или false, если ни одного ученика нет&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все подписки учебного потока, чтобы потом установить связи с оценками&lt;br /&gt;
# получаем учеников учебного потока&lt;br /&gt;
# присваиваем каждому ученику порядковый номер,&lt;br /&gt;
# получаем информацию по каждому ученику функцией [[#Описание get_line_for_student()|get_line_for_student()]] и заносим объект с информацией о нем в массив&lt;br /&gt;
# возвращаем получившийся массив &lt;br /&gt;
===== Описание create_datesstring() =====&lt;br /&gt;
Создает верхнюю строку журнала с названиями месяцев и списком дат в пригодном для обработки плагином templater виде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - список всех контрольных точек учебного потока из таблицы [[Разработка:storages/plans|plans]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий массив с данными для шаблонизатора&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Даты в электронном журнале должны будут проставляться как и в обычном классном журнале: верхняя строка - месяцы обучения, нижняя строка - даты проведенных или запланированных уроков, а также четвертные или годовые оценки.&lt;br /&gt;
Для того чтобы организовать такой внешний вид для электронного журнала мы должны воспользоваться параметром colspan для html-таблицы журнала, и расположить тем самым месяцы точно над датами проведенных уроков. Для этой задачи в этой функции мы создаем объект следующей структуры:&lt;br /&gt;
* ''(возвращаемый объект)''&lt;br /&gt;
** ''monthtitle'' - массив объектов, каждый из которых имеет свойства ''mtitle'' - название месяца, и ''mcolspan'' - количество ячеек с датами проведенных уроков в этом месяце&lt;br /&gt;
** ''monthdate'' - строка с датой проведенного урока, либо название контрольной точки.&lt;br /&gt;
&lt;br /&gt;
# получаем строку форматированных дат уроков при помощи функции [[#Описание generate_all_dates()|generate_all_dates()]]&lt;br /&gt;
# перебираем все события и собираем массивы дат и названий месяцев&lt;br /&gt;
#* если просматриваемая дата не находится в том же месяце, что и предыдущая, то дополняем массив месяцев&lt;br /&gt;
# прибавляем счетчик дат в месяце&lt;br /&gt;
# записываем новую дату в итоговый массив&lt;br /&gt;
# возвращаем итоговый массив&lt;br /&gt;
===== Описание generate_all_dates() =====&lt;br /&gt;
Вызывается из [[#Описание create_datesstring()|create_datesstring()]]. Получить отформатированные даты для журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - массив всех контрольных точек учебного потока (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - отформатированные даты для вывода в журнал&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получим событие из таблицы schevents, которое относится к данной теме тематического планирования&lt;br /&gt;
# если событие есть - то покажем дату&lt;br /&gt;
# если события нет - только название контрольной точки&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_single_date() =====&lt;br /&gt;
Вызывается из [[#Описание generate_all_dates|generate_all_dates]] Создает один объект даты для журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plan (object) - объект из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $date (string) - метка времени для события или контрольной точки&lt;br /&gt;
* $event (object) - Объект из таблицы [[Разработка:storages/schevents|schevents]]. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) дата в нужном для templater'a формате&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# устанавливаем путь (html-якорь) к теме в планирования на странице&lt;br /&gt;
# Определяем, id события которое будет редактировано. Если события нет, то передаем 0.&lt;br /&gt;
# записываем якорь с ссылкой в объект&lt;br /&gt;
# возвращаем объект&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
===== Описание get_topics() =====&lt;br /&gt;
Возвращает массив объектов c необходимыми свойствами для вставки в таблицу schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив тем входящих в планирование&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все контрольные точки учебного потока&lt;br /&gt;
# формируем объект с нужными полями для каждой контрольной точки&lt;br /&gt;
# возвращаем получившийся массив объектов&lt;br /&gt;
===== Описание get_empty_topic() =====&lt;br /&gt;
Возвращает &amp;quot;пустой&amp;quot; объект отчета об уроке &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект для вставки в таблицу [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* создаем объект с необходимым списком пустых полей и возвращаем его&lt;br /&gt;
===== Описание table_data() =====&lt;br /&gt;
Возвращает массив строк данных отформатированных для вывода с помощью moodle-функции print_table()&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив с данными для распечатки таблицы, либо false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли для переданного потока элементы тематического планирования.&lt;br /&gt;
#* если их нет - то возвращаем false&lt;br /&gt;
# формируем массив строк таблицы&lt;br /&gt;
# проставляем html-якоря для каждой контрольной точки на странице оценок&lt;br /&gt;
# добавляем ссылки на редактирования элементов учебного плана&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
===== Описание get_topic() =====&lt;br /&gt;
[[#get_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Проверяем, указан ли id контрольной точки. &lt;br /&gt;
** Если не указан - возврящаем пустую тему.&lt;br /&gt;
** Если указан - пробуем извлечь контрольную точку по такому id&lt;br /&gt;
*** Если контрольную точку извлечь не удалось - то возвращаем false&lt;br /&gt;
*** Если удалось - то возвращаем заполненный отчет об уроке&lt;br /&gt;
===== Описание save_topic() =====&lt;br /&gt;
[[#save_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем есть ли у нас данные в переменной $event для обновления или создания события. Если нет - то возвращаем false.&lt;br /&gt;
# определяем тип действия, которое надо совершить&lt;br /&gt;
#* если указан planid для события - то создаем новое событие для существующей контрольной точки&lt;br /&gt;
#* если нет id для контрольной точки - создаем новое событие и новую контрольную точку&lt;br /&gt;
#* в остальных случаях - обновляем контрольную точку и событие: вычисляем новую относительную дату, и обновляем записи в таблицах [[Разработка:storages/schevents|schevents]] и [[Разработка:storages/plans|plans]]&lt;br /&gt;
===== Описание create_topic() =====&lt;br /&gt;
[[#create_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем новый элемент тематического планирования в таблице plans (если это не удалось - то возвращаем false)&lt;br /&gt;
# добавляем в переданное событие id контрольной точки&lt;br /&gt;
# создаем событие из переданного объекта $event (если событие не создано - удаляем ранее созданный элемент тематического планирования)&lt;br /&gt;
# возвращаем id события&lt;br /&gt;
===== Описание create_checkpoint() =====&lt;br /&gt;
Создает и сохраняет запись в таблице plans&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $point (object) - данные для сохранения в таблицу [[Разработка:storages/plans|plans]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи или false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем дату начала обучения&lt;br /&gt;
# создаем заготовку для объекта контрольной точки&lt;br /&gt;
# вычисляем относительную дату контрольной точки&lt;br /&gt;
# заносим данные в базу&lt;br /&gt;
===== Описание create_event() =====&lt;br /&gt;
Создает объект события и сохраняет его в schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $event (object) - данные для сохранения&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи в таблице событий или false.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем id преподавателя в таблице persons&lt;br /&gt;
# создаем объект нужного формата и заносим туда все данные&lt;br /&gt;
# записываем данные в базу&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* csid - id учебного потока в таблице сstreams&lt;br /&gt;
===== Описание get_checkpoints() =====&lt;br /&gt;
Получить все контрольные точки одного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив объектов из таблицы plans или false &lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id учебного потока из таблицы cstreams&lt;br /&gt;
# выбираем из таблицы plans все записи, у которых поле cstreamid равно id учебного потока, и тип связи &amp;quot;cstreams&amp;quot;&lt;br /&gt;
# сортируем их в хронологическом порядке&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
&lt;br /&gt;
===== Описание get_students() =====&lt;br /&gt;
Получить всех учеников указанного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив записей из таблицы persons или false&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем список пройденных дисциплин&lt;br /&gt;
# перебираем все подписки и запоминаем id ученика для каждой из них&lt;br /&gt;
# извлекаем из таблицы persons учеников, чьи id были извлечены из подписок&lt;br /&gt;
&lt;br /&gt;
===== Описание get_teacherid() =====&lt;br /&gt;
Получить id преподавателя учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id преподавателя или false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* id преподавателя всегда берется только из записи учебного потока из таблицы cstreams&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* gradedata - (object) все оценки и сопутствующая им информация&lt;br /&gt;
* mypost - (array) непроверенные данные пришедшие из массива $_POST. Используются только для составления повторного запроса на сохранение данных.&lt;br /&gt;
===== Описание __construct =====&lt;br /&gt;
[[#Класс dof_im_journal_rawdata|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект, в который мы будем складывать все проверенные данные, пришедшие из формы&lt;br /&gt;
# проверяем скалярные данные: все числовые идентификаторы, и отдельные строки, и после проверки записываем их в итоговый объект&lt;br /&gt;
# теперь, зная cstreamid из проверенных скалярных данных вызываем родительский конструктор&lt;br /&gt;
# проверяем массивы, пришедшие из формы: &lt;br /&gt;
#* данные об отсутствующих учениках&lt;br /&gt;
#* массив оценок &lt;br /&gt;
#* массив идентификаторов подписок (таблица cpassed)&lt;br /&gt;
#* узнаем id оценок для изменения их статуса&lt;br /&gt;
# записываем все проверенные данные в итоговый массив&lt;br /&gt;
# определяем тип действия, которое надо совершить: &lt;br /&gt;
#* сохранить данные&lt;br /&gt;
#* сохранить данные и продолжить редактирование&lt;br /&gt;
#* восстановить исходные значения&lt;br /&gt;
# записываем исходный массив (непроверенный) в поле объекта, если потом понадобится еще раз отправить данные после подтверждения&lt;br /&gt;
===== Описание process_form() =====&lt;br /&gt;
[[#process_form()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# в самом начале проверяем тип действия, которое надо совершить. Если этим действием является &amp;quot;отменить изменения&amp;quot;, то не переходим к сохранению оценок и сразуже выполняем перенаправление на страницу журнала. В остальных случаях идем дальше:&lt;br /&gt;
# проверяем, установлено ли у кого-нибудь из учеников одновременно &amp;quot;н&amp;quot; и оценка. Если это так - то перенаправим пользователя на страницу с сообщением об этом, и попросим его подтвердить такой выбор.&lt;br /&gt;
#* если пользователь согласен с изменениями, которые он сделал, то все выставленые им оценки и сведения о посещаемости сохраняются&lt;br /&gt;
#* если же нет - то происходит отмена всех изменений&lt;br /&gt;
# в случае, когда никаких предупреждений нет - сначала формируем приказ для оценок&lt;br /&gt;
# затем приказ о посещаемости&lt;br /&gt;
# если все действия произведены успешно - производим редирект. Если же возникли ошибки - сообщаем об этом&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_order_grades() =====&lt;br /&gt;
Сформировать приказ об изменении состояния учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true если приказ успешно сформирован, и false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id подразделения в таблице departments&lt;br /&gt;
# определяем тип действия, которое нужно совершить с оценкой&lt;br /&gt;
# обращаемся к функциям выставления, либо удаления оценки&lt;br /&gt;
===== Описание order_set_grade() =====&lt;br /&gt;
Формирует приказ - установить оценку. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true в случае успеха и false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# подключаем методы работы с приказом&lt;br /&gt;
# создаем объект для записи&lt;br /&gt;
# сохраняем автора приказа, подразделение, к которому он относится, дату создания приказа&lt;br /&gt;
# добавляем данные, которые определяют назначение приказа&lt;br /&gt;
# сохраняем приказ в БД, в таблицу orders&lt;br /&gt;
# подписываем приказ&lt;br /&gt;
# исполняем приказ&lt;br /&gt;
Методы order_delete_grade и order_update_grade работают по такому же принципу.&lt;br /&gt;
===== Описание get_grades_fororder() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $type - тип действия, которое необходимо будет произвести над оценкой. Возможные значения: ''set_grade'' и ''delete_grade''.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий список оценок и все идентификаторы для формирования приказа.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в него дату, id учителя (в таблице persons) и id контрольной точки (в таблице plans&lt;br /&gt;
# перебираем все оценки из внутреннего массива с проверенными данными&lt;br /&gt;
# определяем тип действия, которое над ней нужно совершить&lt;br /&gt;
# в зависимости от типа действия (установление или удаление оценки) записываем в объект оценки нужные идентификаторы&lt;br /&gt;
# упаковываем оценки в итоговый массив и возвращаем его&lt;br /&gt;
=== Для списка журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс служит для сбора и вывода информации по всем структурным подразделениям. Информация выводится древовидно: самый верхний уровень - подразделение, затем учебные программы, затем учебные периоды, элементы учебной программы, и в самом конце - журналы учебного потока.&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $departments массив структуры&lt;br /&gt;
    array(&lt;br /&gt;
    [departmentid] =&amp;gt; obj  -&amp;gt; departmentname = 'department_name'&lt;br /&gt;
                      obj  -&amp;gt; programms = array(&lt;br /&gt;
      [programmid]   =&amp;gt; obj1 -&amp;gt; programmname = 'programm_name'&lt;br /&gt;
                        obj1 -&amp;gt; ages = array(&lt;br /&gt;
        [agenum]       =&amp;gt; obj2 -&amp;gt; agename = 'age_name'&lt;br /&gt;
                          obj2 -&amp;gt; items = array(&lt;br /&gt;
          [itemid]       =&amp;gt; obj3 -&amp;gt; itemname = 'item_name'&lt;br /&gt;
                            obj3 -&amp;gt; cstreams = array(&lt;br /&gt;
            [cstreamid]    =&amp;gt; obj4 -&amp;gt; cstreamname = 'cstream_name'&lt;br /&gt;
                                    )''// конец массива cstreams''&lt;br /&gt;
                                  )''// конец массива items''&lt;br /&gt;
                                )''// конец массива ages''&lt;br /&gt;
                              )''// конец массива programms''&lt;br /&gt;
         )''// конец общего массива''&lt;br /&gt;
    содержит данные для вставку в темплатер после добавления еще одного уровня:&lt;br /&gt;
    $fortemplater-&amp;gt;departments = $this-&amp;gt;departments;&lt;br /&gt;
В общем виде сбор данных выглядит так: &lt;br /&gt;
# сначала собирается информация по структурному подразделению (одному или нескольким), и информация по ним записывается в итоговый объект&lt;br /&gt;
# затем получаются все программы учебного подразделения, информация по ним записывается в итоговый массив&lt;br /&gt;
# извлекается и записывается в итоговый объект список учебных периодов &lt;br /&gt;
# для каждого учебного периода получаются элементы учебной программы, которые изучаются в нем&lt;br /&gt;
# для каждого элемента учебной программы получаются учебные потоки&lt;br /&gt;
# для каждого учебного потока получается его журнал&lt;br /&gt;
===== Описание set_data() =====&lt;br /&gt;
[[#set_data()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* получаем id структурного подразделения из таблицы departments.&lt;br /&gt;
** если оно есть - то получаем информацию только по нему&lt;br /&gt;
** если получили 0 вместо id подразделения - то выводим информацию по всем подразделениям&lt;br /&gt;
&lt;br /&gt;
===== Описание get_journals_department() =====&lt;br /&gt;
Возвращает журналы одного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - набор журналов &lt;br /&gt;
* (bool) - false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все программы, за которые отвечает подразделение&lt;br /&gt;
# для каждой программы получаем все ее журналы&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2093</id>
		<title>Разработка:im/journal</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2093"/>
				<updated>2011-01-12T14:51:01Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Права */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Классный журнал ==&lt;br /&gt;
В журнале можно выставлять оценки и вводить отчет о проведенном уроке.&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
Вверху страницы находится форма для выбора подразделения и кнопка &amp;quot;показать&amp;quot;. По умолчанию показывается информация по всем учебным подразделениям. При выборе конкретного учебного подразделения показывается информация только по нему.&lt;br /&gt;
&lt;br /&gt;
Вывод информации по журналам организован в виде маркированного списка следующего вида:&lt;br /&gt;
* ''Подразделение''&lt;br /&gt;
** ''Учебная программа''&lt;br /&gt;
*** ''Учебный период''&lt;br /&gt;
**** ''Предмет''&lt;br /&gt;
***** ''Учебный поток (дата_начала - дата_окончания)''&lt;br /&gt;
Каждая запись учебного потока является ссылкой на страницу журнала учебного потока.&lt;br /&gt;
=== Журнал класса ===&lt;br /&gt;
Под панелью навигации выводится надпись &amp;quot;Журнал группы&amp;quot;.&lt;br /&gt;
Ниже таблица с информацией о потоке - программа, предмет, группа, преподаватель. Справа от этой таблицы размещена  ссылка &amp;quot;Новый урок&amp;quot;. Нажатие на нее позволяет создать новый отчет об уроке. Над этой ссылкой будут выводиться сообщения об ошибках сохранения данных из таблицы оценок.&lt;br /&gt;
Ниже отображаются две таблицы - таблица оценок и, справа от нее, таблица отчетов об уроке. Обе таблицы сделаны максимально похожими на соответствующие таблицы в бумажном &amp;quot;Классном журнале&amp;quot;. Таблицы связаны друг с другом. Так, дата в таблице оценок отображаются только в том случае, если был создан отчет об уроке для этой даты. При нажатии на дату в таблице оценок, происходит перемещение к соответствующей строке отчета об уроке.&lt;br /&gt;
=== Таблица оценок. ===&lt;br /&gt;
Если таблица отчетов об уроке пуста, то в таблице оценок нет ни одной колонки с датой.&lt;br /&gt;
Если журнал заполнен, то в верхней строке отображаются названия месяцев, ниже номера дней месяцев, на которые приходились занятия. Каждое число месяца - ссылка, при нажатии на которую происходит переход на соответствующую этому дню строку таблицы отчета об уроке.&lt;br /&gt;
Сразу под числом расположен значок редактирования. Он также выполнен в виде ссылки. При нажатии на него страница перезагружается в режиме формы ввода оценок и выставления присутствия учеников на уроке, который проходил в тот день, по значку под числом которого щелкнули.&lt;br /&gt;
В колонке этого дня, напротив фамилии каждого ученика появляются два поля. Поле выбора из списка - для проставления оценки. И поле переключатель - для отметки присутствия на уроке. Об этом напоминает буква &amp;quot;н&amp;quot;, расположенная справа от него. Если ученик был на уроке, то это поле следует оставить пустым. Если не был - поставить там флажок. Для выставления оценки следует выбрать элемент из списка. После того как изменения будут сохранены, в соответствующих клетках появятся буквы &amp;quot;Н&amp;quot; или оценки. Если кому-то была выставлена и оценка и отметка об отсутствии на уроке, на против его фамилии можно будет увидеть букву &amp;quot;Н&amp;quot;. Однако перед сохранением будет выведено предупреждение о том, что выставлена оценка отсутствующему ученику. Под уведомлением будут две кнопки - &amp;quot;Продолжить&amp;quot; и &amp;quot;Отменить&amp;quot;. При нажатии на &amp;quot;Продолжить&amp;quot; сценарий сохранения будет выполнен. Нажатие на другую кнопку вызовет отмену процедуры сохранения и возврат к форме с несохраненными изменениями.&lt;br /&gt;
При переключении в режим формы под таблицей появляется надпись &amp;quot;Внимание! До нажатия кнопки &amp;quot;сохранить&amp;quot; оценки не сохраняются.&amp;quot; И три кнопки - &amp;quot;Сохранить&amp;quot;, &amp;quot;Сохранить и продолжить&amp;quot;, &amp;quot;Восстановить&amp;quot;. Нажатие на первую кнопку сохраняет изменения, сделанные в форме и перезагружает страницу в режим просмотра. Вторая - сохраняет сделанные изменения, но страница остается в режиме формы - можно продолжать ввод. Третья кнопка отменяет сделанные изменения. Все введенные,  но несохраненные данные удаляются из формы. Форма перегружается с отображением последних сохраненных изменений.&lt;br /&gt;
Если ученику была выставлена оценка, а затем отменена - в форме было выбрано пустое поле, то ранее выбранная оценка будет удалена. Если оценка была изменена, то оценка будет обновлена. Каждое из этих действий, а также выставление статуса присутствия на уроке, будет выполнено через издание приказа.&lt;br /&gt;
Если редактируется контрольная точка без события, то в форме показываеются только поля выставления оценки. Поле присутствия на уроке не показывается и статус присутствия не сохраняется.&lt;br /&gt;
Контрольная точка без события выводится в таблице оценок без даты. Вместо даты выводится название КТ.&lt;br /&gt;
Что происходит в процессе сохранения.&lt;br /&gt;
После того как нажата одна из кнопок, сохраняющая внесенные изменения происходит&lt;br /&gt;
&lt;br /&gt;
* формирование приказа регистрации присутствия учеников на уроке. В него сохраняются данные о всех учениках потока, их статусы присутствия, id события, статус присутствия на котором выставляется.&lt;br /&gt;
* применение приказа и сохранение статусов учеников в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
Если были выставлены оценки. То в дополнение к вышеописанным действиям происходят следующие действия:&lt;br /&gt;
* формирование приказа регистрации выставления оценок только тем ученикам, которые их получили на уроке. В приказе сохраняются: точное время выставления оценки, id КТ, за которую выставлена оценка, id преподавателя (из /storage/persons), который выставил оценку, ученики, которые получили оценку, и соответствующие им оценки, статус оценки, id подписки ученика на поток.&lt;br /&gt;
* применение приказа и сохранение оценок в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
После создания отчета об уроке, происходит возврат на главную страницу журнала и таблица оценок загружается в режиме формы того дня, отчет для которого был создан. Если этот день выходит за границы видимости окна, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой. После редактирования отчета об уроке таблица оценок загружается в режиме просмотра. Если день, для которого происходило редактирование отчета выходит за границы видимости, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой.&lt;br /&gt;
&lt;br /&gt;
=== Таблица отчетов об уроках. ===&lt;br /&gt;
Представляет собой таблицу из шести столбцов.&lt;br /&gt;
Первый столбец - порядковый номер урока. Второй - дата урока в фомате дд.мм. Третий - тема урока - произвольный текст. Четвертый - задание на дом. Пятый - замена урока или преподавателя. Пятый - заметки об уроке. В настоящее время три последних поля не используются.&lt;br /&gt;
Уроки сортируются по датам, сверху вниз по возрастанию.&lt;br /&gt;
Под датой располагается значок редактирования информации об уроке, выполненный в виде ссылки. При щелчке по нему открывается новая страница с формой редактирования отчета об уроке. Все поля формы заполнены соответствующей информацией. Ее можно изменить, а изменения сохранить.&lt;br /&gt;
Эта же страница открывается при щелчке по ссылке &amp;quot;Новый урок&amp;quot;.&lt;br /&gt;
=== Страница редактирования урока. ===&lt;br /&gt;
Вверху страницы, под строкой навигации, выводится надпись &amp;quot;Классный журнал&amp;quot;.&lt;br /&gt;
Ниже выводится форма ввода информации об уроке - &amp;quot;Отчет об уроке&amp;quot;. В поле &amp;quot;Дата проведения урока&amp;quot; нужно выбрать дату урока. В поле &amp;quot;Элементы темплана&amp;quot; можно выбрать тему для нового урока. Ниже находится текстовое поле ввода &amp;quot;Что пройдено на уроке&amp;quot;. Сюда можно ввести тему урока вручную.&lt;br /&gt;
Еще ниже поле &amp;quot;Домашнее задание&amp;quot; для ввода соответствующей информации.&lt;br /&gt;
В самом низу расположены две кнопки - &amp;quot;Сохранить&amp;quot; и &amp;quot;Отмена&amp;quot;. При нажатии на вторую происходит возврат на главную страницу журнала без сохранения внесенных изменений. После нажатия на кнопку &amp;quot;Сохранить&amp;quot; происходит сохранение введенных данных в соответствующих таблицах. О результатах операции сохранения информирует надпись, выводимая под кнопками. Еще ниже появляется ссылка &amp;quot;назад&amp;quot; для возврата на главную страницу журнала. В случае возврата после сохранения данных, таблица оценок загружается в режиме редактирования данных на дату только что сохраненного урока.&lt;br /&gt;
Правее формы редактирования урока расположено окно с полосами прокрутки, в котором можно просмотреть темы уже проведенных уроков.&lt;br /&gt;
Они выводятся в видет таблицы из двух столбцов, в которых указываются соответственно дата и тема урока.&lt;br /&gt;
В зависимости от заполненности полей ввода возможны разные варианты обработки введенных данных.&lt;br /&gt;
&lt;br /&gt;
{|border=1&lt;br /&gt;
 |id КТ&lt;br /&gt;
 |id темы, выбранной из списка.&lt;br /&gt;
 |как обрабатывается&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |создается новая КТ и новое событие.&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |выбрана из списка&lt;br /&gt;
 |создается новое событие, привязанное к КТ, выбранной из списка&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и равна id КТ&lt;br /&gt;
 |обновляем КТ и (если изменяется дата) все события, которые ей соответствуют.&lt;br /&gt;
Тему из списка &amp;quot;Элементы темтемплана&amp;quot; выбрать нельзя.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и не равна id КТ&lt;br /&gt;
 |такая ситуация запрещена.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |0&lt;br /&gt;
 |такая ситуация запрещена&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ведомость итоговых оценок ===&lt;br /&gt;
На данной странице можно выставить итоговые оценки учащимся и завершить обучение потока. Страница принимает обязательный параметр id - id идущего  или завершенного потока.&lt;br /&gt;
&lt;br /&gt;
Вверху страныцы отображается форма, где отображены ученики, которые обучаются на данном потоке. Напротив каждого можно выбрать итоговую оценку, выставляемую учащемуся. Итоговые оценки берутся из шкалы дисциплины приписанной к данному потоку. Под ведомостью стоит галочка подтвержения оценок, без нее оценки не сохранятся. Делее стоит галочка завершения обучения если необходимо завершить поток, При завершении потока все подписки на дисциплину переводятся в один из конечных статусов. Если поток уже завершен, то галочка не показывается, вместо нее предупреждение. После завершения потока оценки также можно выставить, но они уже будут идти как переэкзаменовка. &lt;br /&gt;
&lt;br /&gt;
После того как мы выставили оценки и нажали на кнопку сохранить формируется приказ о выставленни итоговых оценок. На основе этого приказа сохраняются оценки, после чего на новой странице показывается шаблон ведомости в том виде, в котом она будет распечатана. &lt;br /&gt;
После первого сохранения оценок эта ведомость также становится доступна для печати. &lt;br /&gt;
&lt;br /&gt;
Перейти на эту страницу можно со страницы Журнала группы.&lt;br /&gt;
&lt;br /&gt;
==Права==&lt;br /&gt;
&lt;br /&gt;
* '''datamanage''' - глобальное право&lt;br /&gt;
* '''view_journal''' - право на просмотр журнала предмето-потока (учитель курса или завуч)&lt;br /&gt;
* '''view_all_journals''' - право на просмотр всех журналов (может просматривать общую информацию и личные данные)&lt;br /&gt;
* '''view_all_journals_department''' - право на просмотр всех журналов подразделения (может просматривать общую информацию и личные данные)&lt;br /&gt;
* '''can_complete_lesson''' - право отметить проведение урока (учитель урока или завуч)&lt;br /&gt;
* '''create_schevent''' - право на создание события (завуч и учитель на потоке)&lt;br /&gt;
* '''edit_schevent''' - право на редактирование события (учитель на потоке или завуч)&lt;br /&gt;
* '''control_journal''' - право на проверку журнала (завуч)&lt;br /&gt;
* '''give_grade''' - право на проверку журнала (учитель на потоке или завуч)&lt;br /&gt;
* '''give_itog_grades''' - право выставить итоговые оценки (если поток завершён и пользователь - учитель на потоке)&lt;br /&gt;
* '''view_events''' - право просматривать свое расписание (преподаватель)&lt;br /&gt;
* '''give_attendance''' - право на отметку посещаемости (только для завуча или ответственного преподавателя)&lt;br /&gt;
* '''give_theme_event''' - право указать тему для события (только если событие в статусе &amp;quot;запланирован&amp;quot; или &amp;quot;заменено другим событием&amp;quot;, а пользователь - завуч или ответственный преподаватель)&lt;br /&gt;
* '''edit_plans''' - право редактировать КТ (если статус КТ не &amp;quot;зафиксирована&amp;quot; и ((КТ завершена или событие состоялось), а пользователь - завуч) или пользователь может выставлять оценки)&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
В этом разделе описаны функции для работы со страницами &amp;quot;журнал группы&amp;quot; и &amp;quot;список журналов&amp;quot;. Здесь содержится только краткое описание функций и их параметров. Если вас интересует их внутренняя логика, то обратитесь к разделу [[Разработка:im/journal#Подробное описание работы функций|Подробное описание]]. Аргументы всех функций перечислены именно в том порядке, в котором их следует передавать.&lt;br /&gt;
=== Журнал группы ===&lt;br /&gt;
В этом разделе собраны все функции, которые относятся к странице &amp;quot;журнал группы&amp;quot;&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
Класс отрисовки школьного журнала&lt;br /&gt;
===== print_texttable() =====&lt;br /&gt;
Вывести страницу журнала - просмотр оценок, или редактирование&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $editid  - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid - id учебного события, которое будет редактировано (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* null&lt;br /&gt;
===== check_permissions() =====&lt;br /&gt;
Проверяет разрешения на редактирование оценок для текущего пользователя&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true/false - есть или нет разрешения на редактирование оценок&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
Класс для отрисовки таблицы тематического планирования в классном журнале&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
 &lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Выводит таблицу тематического планирования на экран&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
Класс для создания или редактирования одной темы на странице планирования уроков&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $planid - id элемента учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
* $eventid - id учебного события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== get_topic() =====&lt;br /&gt;
Возвращает объект с полями, необходимыми для заполнения формы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - объект с полями для вставки в форму, или false в случае ошибки&lt;br /&gt;
===== create_topic() =====&lt;br /&gt;
Создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint - контрольная точка из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event - заранее заготовленный объект для таблицы [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи из таблицы schevents или false в случае ошибки&lt;br /&gt;
===== save_topic() =====&lt;br /&gt;
Обновляет существующий или создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint (object) - объект для обновления или создания записи в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event (object) - объект для обновления или создания записи в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true, если все записи успешно обновлены&lt;br /&gt;
* (int), id новой записи, если она была добавлена&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Формирует таблицу тематического планирования в правой части страницы журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
===== get_anchor_id() =====&lt;br /&gt;
Возвращает метку времени, которая будет создана для нового урока, чтобы осуществить корректное перенаправление на страницу журнала&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $time - (int) время создания нового события: метка времени в формате unixtime&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - метка времени для перенаправления&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
Класс для подготовки сырых исходных данных для формирования школьного журнала и ему подобных документов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор - определяет с каким учебным потоком будет вестись работа&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
Класс для проверки и обработки оценок из формы&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор класса. Осуществляет все проверки и записывает данные во внутреннее поле.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $gradedata (array) - массив $_POST из формы&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== process_form() =====&lt;br /&gt;
Обработать все данные, пришедшие из формы: установить посещаемость, выставить оценки и сформировать приказы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* false в случае неудачи. В случае успеха производит редирект на страницу журнала&lt;br /&gt;
==== Класс dof_im_journal_presence ====&lt;br /&gt;
Класс для обработки информации о посещаемости &lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== presence_students() =====&lt;br /&gt;
Формирует массив присутствия учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
===== absence_students() =====&lt;br /&gt;
Формирует массив отсутствующих студентов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $away - массив id отсутствующих учеников&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
==== Дополнительные функции ====&lt;br /&gt;
===== dof_im_journal_format_date() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времення для преобразования.&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'.&lt;br /&gt;
* $url (string) - Указывается, если необходимо получить дату как ссылку. По умолчанию NULL&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с отформатированной датой&lt;br /&gt;
===== dof_im_journal_date_edit() =====&lt;br /&gt;
Возвращает отформатироанную дату и значок редактирования как ссылку&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времени&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'&lt;br /&gt;
* $durl (string) - путь ссылки для даты, если не указана - дата выводится как просто строка. По умолчанию null.&lt;br /&gt;
* $eurl (string) - путь ссылки для значка, если не указана значок не показывается По умолчанию null.&lt;br /&gt;
* $imgsubdate (bool) - вывести значок под датой или рядом по умолчанию true (выводит значок под датой)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с отформатированной датой&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс содержит функции для работы со страницей списка журналов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
===== set_data() =====&lt;br /&gt;
Заполняет начальной информацией внутренние поля объекта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения (таблица [[Разработка:storages/departments|departments]]). По умолчанию 0.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
===== get_data() =====&lt;br /&gt;
Возвращает собранные данные&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив структурных подразделений&lt;br /&gt;
===== get_journals() =====&lt;br /&gt;
Получить все журнлы занесенных подразделений&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
== Подробное описание работы функций ==&lt;br /&gt;
В этом разделе описывается подробная работа всех публичных и внутренних методов для классов журнала. Если вам требуется только краткая справка по API, то обратитесь к разделу [[Разработка:im/journal#API|API]].&lt;br /&gt;
=== Для журнала группы ===&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
&lt;br /&gt;
===== Описание print_texttable() =====&lt;br /&gt;
[[#print_texttable()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
Итоговая функция, выводящая всю собранную информацию на экран. &lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собирает всю информацию при помощи функции [[Разработка:im/journal#Описание get_all_form()|get_all_form()]]&lt;br /&gt;
# обращается к плагину templater для представления информации в html-формате&lt;br /&gt;
# функцией print выводит результат работы templater'а на экран.&lt;br /&gt;
===== Описание check_permissions() =====&lt;br /&gt;
[[#check_permissions()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем учебный поток. Если поток не найден - возвращаем false.&lt;br /&gt;
# проверяем статус учебного потока. Если он не равен значению &amp;quot;go&amp;quot;, то возвращаем false.&lt;br /&gt;
# проверяем, имеет ли текущий пользователь права редактирования. Если нет, то возвращаем false.&lt;br /&gt;
# если все проверки пройдены успешно, то возвращаем true.&lt;br /&gt;
===== Описание get_all_form() =====&lt;br /&gt;
Возвращает объект формы для вставки в templater. Таблица в шаблоне формируется по столбцам, т. е. сначала выводится контрольная точка в тем. планировании, а затем оценки всех учеников за это событие (как при заполнении обычного школьного журнала).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $editid (int) - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid (int) - id редактируемого учебного события в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) объект нужной структуры для построения шаблона&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собираем в объект все стандартные надписи для таблицы&lt;br /&gt;
# собираем все запланированные активные контрольные точки учебного потока&lt;br /&gt;
# создадим массивы для названий месяцев и дат&lt;br /&gt;
# собираем в массив информацию по ученикам. Если параметр $editid не равен нулю, то в столбце оценок для редактируемой даты вместо оценки выводим форму.&lt;br /&gt;
# собираем в результурующий массив названия месяцев и дат &lt;br /&gt;
# если нужно распечатать форму - устанавливаем стандартные html-теги начала и конца формы&lt;br /&gt;
# возвращаем результат&lt;br /&gt;
&lt;br /&gt;
===== Описание get_cell_form() =====&lt;br /&gt;
Возвращает редактируемую ячейку таблицы журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons.&lt;br /&gt;
* $cpassedid (int) - id учебной программы&lt;br /&gt;
* $oldgrade (int) - старая оценка (если есть). По умолчанию null.&lt;br /&gt;
* $gradeid (int) - id оценки в таблице cpgrades . По умолчанию 0&lt;br /&gt;
* $eventid (int) - id учебного события в таблице [[Разработка:storages/schevents|schevents]].&lt;br /&gt;
* $scale (string) - шкала всех возможных оценок через запятую. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с html-кодом формы редактирования оценки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Вся форма редактирования оценки представляет собой маленькую таблицу. С левой стороны находится форма выбора оценки, а справа галочка для отметки отсутствующего ученика (верхняя ячейка) и пояснение к ней (нижняя ячейка).&lt;br /&gt;
# получаем все допустимые варианты оценок для данного задания из параметра scale.&lt;br /&gt;
# из этих вариантов оценки составляем html-элемент формы типа SELECT.&lt;br /&gt;
# если за задание уже есть ранее выставленная, старая оценка, то делаем ее оценкой по умолчанию&lt;br /&gt;
# узнаем статус присутствия ученика на занятии, и в зависимсости от этого проставляем галочку над буквой &amp;quot;н&amp;quot;. Форма с возможностью отмечания отсутствующих учеников отображается только для контрольных точек для которых есть события.&lt;br /&gt;
# возвращаем результат одной строкой.&lt;br /&gt;
===== Описание get_cell_string() =====&lt;br /&gt;
Получить текстовое содержимое ячейки оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий данные об элементе тематического планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - данные об оценке По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) html-код оценки, либо специальный знак пробела, чтобы в таблице было видно пустую ячейку&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
# узнаем данные о посещаемости: получаем id события, если оно есть&lt;br /&gt;
#* если событие есть, узнаем, был ли ученик на занятии&lt;br /&gt;
# находим оценку&lt;br /&gt;
#* если ученик был на занятии и получил оценку - выводим оценку&lt;br /&gt;
#* если ученик был на занятии и не получил оценку - выводим символ пробела&lt;br /&gt;
#* если ученик отсутствовал на занятии и нет оценки, то выводим букву &amp;quot;н&amp;quot;&lt;br /&gt;
#* если ученик отсутствовал на занятии и получил оценку - выводим оценку, и букву &amp;quot;н&amp;quot; рядом с ней&lt;br /&gt;
&lt;br /&gt;
===== Описание get_one_cell() =====&lt;br /&gt;
Возвращает данные в одной клетке журнала. Определяет какой тип ячейки выводить: для редактирования или текстовую.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий контрольную точку с событием  из тем. планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - объект содержащий данные об оценке (таблица cpgrades)&lt;br /&gt;
* $cpassedid (int) - id подписки (таблица cpassed)&lt;br /&gt;
* $editid (int) - id редактируемого в текущий момент элемента из тем. планирования&lt;br /&gt;
* $eventid (int) - id редактируемого в текущий момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
* $scale (string) = По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с html-кодом формы редактирования оценки, либо сама оценка, либо статус &amp;quot;отсутствовал&amp;quot;&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# сравниваем, совпадают ли id выводимой и редактируемой в данной момент контрольной точки&lt;br /&gt;
#* если id совпадают - то выводим форму редактирования оценки&lt;br /&gt;
#** если за это задание оценка уже была ранее выставлена, то выводим форму с установленной ранее оценкой&lt;br /&gt;
#** если за задание еще нет оценки - то выводим форму без предустановленных значений&lt;br /&gt;
#* если id не совпадают то выводим оценку текстом (либо статус &amp;quot;отсутствовал&amp;quot;, либо пустую клетку, в зависимости от того был ли ученик на уроке, и получил ли он оценку)&lt;br /&gt;
===== Описание get_line_for_student() =====&lt;br /&gt;
Возвращает строку таблицы журнала для одного ученика.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $i (int) - порядковый номер ученика в группе&lt;br /&gt;
* $student (object) - объект с данными об ученике из таблицы persons&lt;br /&gt;
* $cpasseds (array) - массив объектов, содержащий все подписки учеников этого потока&lt;br /&gt;
* $plans (array) -  массив объектов, содержащий все контрольные точки текущего курса (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (или 0, если события нет) Таблица [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - информация об ученике: его ФИО, и оценки по всем контрольным точкам, а также сведения о посещаемости&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в соответствующие поля итогового объекта порядковый номер ученика, и его ФИО&lt;br /&gt;
# перебираем все переданные подписки ищем ту, которая относится к переданному ученику&lt;br /&gt;
# записываем в итоговый объект id его подписки&lt;br /&gt;
# создаем массив для оценок и собираем оценки ученика:&lt;br /&gt;
#* перебираем все контрольные переданные точки ($plans)&lt;br /&gt;
#* для каждой контрольной точки создаем объект оценки&lt;br /&gt;
#* получаем значение оценки за просматриваемую контрольную точку&lt;br /&gt;
#* при помощи функции [[Разработка:im/journal#Описание get_one_cell()|get_one_cell()]] получаем оформленный html-код оценки&lt;br /&gt;
#* записываем полученный объект в массив оценок&lt;br /&gt;
# добавляем массив оценок в итоговый объект&lt;br /&gt;
# возвращаем итоговый объект&lt;br /&gt;
===== Описание get_lines_for_students() =====&lt;br /&gt;
Возвращает массив строк с ФИО и оценками для всех учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans (array) - массив всех контрольных точек учебного потока из таблицы plans&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) информация о всех учениках учебного потока или false, если ни одного ученика нет&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все подписки учебного потока, чтобы потом установить связи с оценками&lt;br /&gt;
# получаем учеников учебного потока&lt;br /&gt;
# присваиваем каждому ученику порядковый номер,&lt;br /&gt;
# получаем информацию по каждому ученику функцией [[#Описание get_line_for_student()|get_line_for_student()]] и заносим объект с информацией о нем в массив&lt;br /&gt;
# возвращаем получившийся массив &lt;br /&gt;
===== Описание create_datesstring() =====&lt;br /&gt;
Создает верхнюю строку журнала с названиями месяцев и списком дат в пригодном для обработки плагином templater виде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - список всех контрольных точек учебного потока из таблицы [[Разработка:storages/plans|plans]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий массив с данными для шаблонизатора&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Даты в электронном журнале должны будут проставляться как и в обычном классном журнале: верхняя строка - месяцы обучения, нижняя строка - даты проведенных или запланированных уроков, а также четвертные или годовые оценки.&lt;br /&gt;
Для того чтобы организовать такой внешний вид для электронного журнала мы должны воспользоваться параметром colspan для html-таблицы журнала, и расположить тем самым месяцы точно над датами проведенных уроков. Для этой задачи в этой функции мы создаем объект следующей структуры:&lt;br /&gt;
* ''(возвращаемый объект)''&lt;br /&gt;
** ''monthtitle'' - массив объектов, каждый из которых имеет свойства ''mtitle'' - название месяца, и ''mcolspan'' - количество ячеек с датами проведенных уроков в этом месяце&lt;br /&gt;
** ''monthdate'' - строка с датой проведенного урока, либо название контрольной точки.&lt;br /&gt;
&lt;br /&gt;
# получаем строку форматированных дат уроков при помощи функции [[#Описание generate_all_dates()|generate_all_dates()]]&lt;br /&gt;
# перебираем все события и собираем массивы дат и названий месяцев&lt;br /&gt;
#* если просматриваемая дата не находится в том же месяце, что и предыдущая, то дополняем массив месяцев&lt;br /&gt;
# прибавляем счетчик дат в месяце&lt;br /&gt;
# записываем новую дату в итоговый массив&lt;br /&gt;
# возвращаем итоговый массив&lt;br /&gt;
===== Описание generate_all_dates() =====&lt;br /&gt;
Вызывается из [[#Описание create_datesstring()|create_datesstring()]]. Получить отформатированные даты для журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - массив всех контрольных точек учебного потока (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - отформатированные даты для вывода в журнал&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получим событие из таблицы schevents, которое относится к данной теме тематического планирования&lt;br /&gt;
# если событие есть - то покажем дату&lt;br /&gt;
# если события нет - только название контрольной точки&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_single_date() =====&lt;br /&gt;
Вызывается из [[#Описание generate_all_dates|generate_all_dates]] Создает один объект даты для журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plan (object) - объект из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $date (string) - метка времени для события или контрольной точки&lt;br /&gt;
* $event (object) - Объект из таблицы [[Разработка:storages/schevents|schevents]]. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) дата в нужном для templater'a формате&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# устанавливаем путь (html-якорь) к теме в планирования на странице&lt;br /&gt;
# Определяем, id события которое будет редактировано. Если события нет, то передаем 0.&lt;br /&gt;
# записываем якорь с ссылкой в объект&lt;br /&gt;
# возвращаем объект&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
===== Описание get_topics() =====&lt;br /&gt;
Возвращает массив объектов c необходимыми свойствами для вставки в таблицу schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив тем входящих в планирование&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все контрольные точки учебного потока&lt;br /&gt;
# формируем объект с нужными полями для каждой контрольной точки&lt;br /&gt;
# возвращаем получившийся массив объектов&lt;br /&gt;
===== Описание get_empty_topic() =====&lt;br /&gt;
Возвращает &amp;quot;пустой&amp;quot; объект отчета об уроке &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект для вставки в таблицу [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* создаем объект с необходимым списком пустых полей и возвращаем его&lt;br /&gt;
===== Описание table_data() =====&lt;br /&gt;
Возвращает массив строк данных отформатированных для вывода с помощью moodle-функции print_table()&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив с данными для распечатки таблицы, либо false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли для переданного потока элементы тематического планирования.&lt;br /&gt;
#* если их нет - то возвращаем false&lt;br /&gt;
# формируем массив строк таблицы&lt;br /&gt;
# проставляем html-якоря для каждой контрольной точки на странице оценок&lt;br /&gt;
# добавляем ссылки на редактирования элементов учебного плана&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
===== Описание get_topic() =====&lt;br /&gt;
[[#get_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Проверяем, указан ли id контрольной точки. &lt;br /&gt;
** Если не указан - возврящаем пустую тему.&lt;br /&gt;
** Если указан - пробуем извлечь контрольную точку по такому id&lt;br /&gt;
*** Если контрольную точку извлечь не удалось - то возвращаем false&lt;br /&gt;
*** Если удалось - то возвращаем заполненный отчет об уроке&lt;br /&gt;
===== Описание save_topic() =====&lt;br /&gt;
[[#save_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем есть ли у нас данные в переменной $event для обновления или создания события. Если нет - то возвращаем false.&lt;br /&gt;
# определяем тип действия, которое надо совершить&lt;br /&gt;
#* если указан planid для события - то создаем новое событие для существующей контрольной точки&lt;br /&gt;
#* если нет id для контрольной точки - создаем новое событие и новую контрольную точку&lt;br /&gt;
#* в остальных случаях - обновляем контрольную точку и событие: вычисляем новую относительную дату, и обновляем записи в таблицах [[Разработка:storages/schevents|schevents]] и [[Разработка:storages/plans|plans]]&lt;br /&gt;
===== Описание create_topic() =====&lt;br /&gt;
[[#create_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем новый элемент тематического планирования в таблице plans (если это не удалось - то возвращаем false)&lt;br /&gt;
# добавляем в переданное событие id контрольной точки&lt;br /&gt;
# создаем событие из переданного объекта $event (если событие не создано - удаляем ранее созданный элемент тематического планирования)&lt;br /&gt;
# возвращаем id события&lt;br /&gt;
===== Описание create_checkpoint() =====&lt;br /&gt;
Создает и сохраняет запись в таблице plans&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $point (object) - данные для сохранения в таблицу [[Разработка:storages/plans|plans]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи или false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем дату начала обучения&lt;br /&gt;
# создаем заготовку для объекта контрольной точки&lt;br /&gt;
# вычисляем относительную дату контрольной точки&lt;br /&gt;
# заносим данные в базу&lt;br /&gt;
===== Описание create_event() =====&lt;br /&gt;
Создает объект события и сохраняет его в schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $event (object) - данные для сохранения&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи в таблице событий или false.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем id преподавателя в таблице persons&lt;br /&gt;
# создаем объект нужного формата и заносим туда все данные&lt;br /&gt;
# записываем данные в базу&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* csid - id учебного потока в таблице сstreams&lt;br /&gt;
===== Описание get_checkpoints() =====&lt;br /&gt;
Получить все контрольные точки одного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив объектов из таблицы plans или false &lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id учебного потока из таблицы cstreams&lt;br /&gt;
# выбираем из таблицы plans все записи, у которых поле cstreamid равно id учебного потока, и тип связи &amp;quot;cstreams&amp;quot;&lt;br /&gt;
# сортируем их в хронологическом порядке&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
&lt;br /&gt;
===== Описание get_students() =====&lt;br /&gt;
Получить всех учеников указанного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив записей из таблицы persons или false&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем список пройденных дисциплин&lt;br /&gt;
# перебираем все подписки и запоминаем id ученика для каждой из них&lt;br /&gt;
# извлекаем из таблицы persons учеников, чьи id были извлечены из подписок&lt;br /&gt;
&lt;br /&gt;
===== Описание get_teacherid() =====&lt;br /&gt;
Получить id преподавателя учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id преподавателя или false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* id преподавателя всегда берется только из записи учебного потока из таблицы cstreams&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* gradedata - (object) все оценки и сопутствующая им информация&lt;br /&gt;
* mypost - (array) непроверенные данные пришедшие из массива $_POST. Используются только для составления повторного запроса на сохранение данных.&lt;br /&gt;
===== Описание __construct =====&lt;br /&gt;
[[#Класс dof_im_journal_rawdata|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект, в который мы будем складывать все проверенные данные, пришедшие из формы&lt;br /&gt;
# проверяем скалярные данные: все числовые идентификаторы, и отдельные строки, и после проверки записываем их в итоговый объект&lt;br /&gt;
# теперь, зная cstreamid из проверенных скалярных данных вызываем родительский конструктор&lt;br /&gt;
# проверяем массивы, пришедшие из формы: &lt;br /&gt;
#* данные об отсутствующих учениках&lt;br /&gt;
#* массив оценок &lt;br /&gt;
#* массив идентификаторов подписок (таблица cpassed)&lt;br /&gt;
#* узнаем id оценок для изменения их статуса&lt;br /&gt;
# записываем все проверенные данные в итоговый массив&lt;br /&gt;
# определяем тип действия, которое надо совершить: &lt;br /&gt;
#* сохранить данные&lt;br /&gt;
#* сохранить данные и продолжить редактирование&lt;br /&gt;
#* восстановить исходные значения&lt;br /&gt;
# записываем исходный массив (непроверенный) в поле объекта, если потом понадобится еще раз отправить данные после подтверждения&lt;br /&gt;
===== Описание process_form() =====&lt;br /&gt;
[[#process_form()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# в самом начале проверяем тип действия, которое надо совершить. Если этим действием является &amp;quot;отменить изменения&amp;quot;, то не переходим к сохранению оценок и сразуже выполняем перенаправление на страницу журнала. В остальных случаях идем дальше:&lt;br /&gt;
# проверяем, установлено ли у кого-нибудь из учеников одновременно &amp;quot;н&amp;quot; и оценка. Если это так - то перенаправим пользователя на страницу с сообщением об этом, и попросим его подтвердить такой выбор.&lt;br /&gt;
#* если пользователь согласен с изменениями, которые он сделал, то все выставленые им оценки и сведения о посещаемости сохраняются&lt;br /&gt;
#* если же нет - то происходит отмена всех изменений&lt;br /&gt;
# в случае, когда никаких предупреждений нет - сначала формируем приказ для оценок&lt;br /&gt;
# затем приказ о посещаемости&lt;br /&gt;
# если все действия произведены успешно - производим редирект. Если же возникли ошибки - сообщаем об этом&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_order_grades() =====&lt;br /&gt;
Сформировать приказ об изменении состояния учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true если приказ успешно сформирован, и false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id подразделения в таблице departments&lt;br /&gt;
# определяем тип действия, которое нужно совершить с оценкой&lt;br /&gt;
# обращаемся к функциям выставления, либо удаления оценки&lt;br /&gt;
===== Описание order_set_grade() =====&lt;br /&gt;
Формирует приказ - установить оценку. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true в случае успеха и false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# подключаем методы работы с приказом&lt;br /&gt;
# создаем объект для записи&lt;br /&gt;
# сохраняем автора приказа, подразделение, к которому он относится, дату создания приказа&lt;br /&gt;
# добавляем данные, которые определяют назначение приказа&lt;br /&gt;
# сохраняем приказ в БД, в таблицу orders&lt;br /&gt;
# подписываем приказ&lt;br /&gt;
# исполняем приказ&lt;br /&gt;
Методы order_delete_grade и order_update_grade работают по такому же принципу.&lt;br /&gt;
===== Описание get_grades_fororder() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $type - тип действия, которое необходимо будет произвести над оценкой. Возможные значения: ''set_grade'' и ''delete_grade''.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий список оценок и все идентификаторы для формирования приказа.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в него дату, id учителя (в таблице persons) и id контрольной точки (в таблице plans&lt;br /&gt;
# перебираем все оценки из внутреннего массива с проверенными данными&lt;br /&gt;
# определяем тип действия, которое над ней нужно совершить&lt;br /&gt;
# в зависимости от типа действия (установление или удаление оценки) записываем в объект оценки нужные идентификаторы&lt;br /&gt;
# упаковываем оценки в итоговый массив и возвращаем его&lt;br /&gt;
=== Для списка журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс служит для сбора и вывода информации по всем структурным подразделениям. Информация выводится древовидно: самый верхний уровень - подразделение, затем учебные программы, затем учебные периоды, элементы учебной программы, и в самом конце - журналы учебного потока.&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $departments массив структуры&lt;br /&gt;
    array(&lt;br /&gt;
    [departmentid] =&amp;gt; obj  -&amp;gt; departmentname = 'department_name'&lt;br /&gt;
                      obj  -&amp;gt; programms = array(&lt;br /&gt;
      [programmid]   =&amp;gt; obj1 -&amp;gt; programmname = 'programm_name'&lt;br /&gt;
                        obj1 -&amp;gt; ages = array(&lt;br /&gt;
        [agenum]       =&amp;gt; obj2 -&amp;gt; agename = 'age_name'&lt;br /&gt;
                          obj2 -&amp;gt; items = array(&lt;br /&gt;
          [itemid]       =&amp;gt; obj3 -&amp;gt; itemname = 'item_name'&lt;br /&gt;
                            obj3 -&amp;gt; cstreams = array(&lt;br /&gt;
            [cstreamid]    =&amp;gt; obj4 -&amp;gt; cstreamname = 'cstream_name'&lt;br /&gt;
                                    )''// конец массива cstreams''&lt;br /&gt;
                                  )''// конец массива items''&lt;br /&gt;
                                )''// конец массива ages''&lt;br /&gt;
                              )''// конец массива programms''&lt;br /&gt;
         )''// конец общего массива''&lt;br /&gt;
    содержит данные для вставку в темплатер после добавления еще одного уровня:&lt;br /&gt;
    $fortemplater-&amp;gt;departments = $this-&amp;gt;departments;&lt;br /&gt;
В общем виде сбор данных выглядит так: &lt;br /&gt;
# сначала собирается информация по структурному подразделению (одному или нескольким), и информация по ним записывается в итоговый объект&lt;br /&gt;
# затем получаются все программы учебного подразделения, информация по ним записывается в итоговый массив&lt;br /&gt;
# извлекается и записывается в итоговый объект список учебных периодов &lt;br /&gt;
# для каждого учебного периода получаются элементы учебной программы, которые изучаются в нем&lt;br /&gt;
# для каждого элемента учебной программы получаются учебные потоки&lt;br /&gt;
# для каждого учебного потока получается его журнал&lt;br /&gt;
===== Описание set_data() =====&lt;br /&gt;
[[#set_data()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* получаем id структурного подразделения из таблицы departments.&lt;br /&gt;
** если оно есть - то получаем информацию только по нему&lt;br /&gt;
** если получили 0 вместо id подразделения - то выводим информацию по всем подразделениям&lt;br /&gt;
&lt;br /&gt;
===== Описание get_journals_department() =====&lt;br /&gt;
Возвращает журналы одного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - набор журналов &lt;br /&gt;
* (bool) - false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все программы, за которые отвечает подразделение&lt;br /&gt;
# для каждой программы получаем все ее журналы&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2092</id>
		<title>Разработка:im/journal</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2092"/>
				<updated>2011-01-12T14:49:04Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Права */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Классный журнал ==&lt;br /&gt;
В журнале можно выставлять оценки и вводить отчет о проведенном уроке.&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
Вверху страницы находится форма для выбора подразделения и кнопка &amp;quot;показать&amp;quot;. По умолчанию показывается информация по всем учебным подразделениям. При выборе конкретного учебного подразделения показывается информация только по нему.&lt;br /&gt;
&lt;br /&gt;
Вывод информации по журналам организован в виде маркированного списка следующего вида:&lt;br /&gt;
* ''Подразделение''&lt;br /&gt;
** ''Учебная программа''&lt;br /&gt;
*** ''Учебный период''&lt;br /&gt;
**** ''Предмет''&lt;br /&gt;
***** ''Учебный поток (дата_начала - дата_окончания)''&lt;br /&gt;
Каждая запись учебного потока является ссылкой на страницу журнала учебного потока.&lt;br /&gt;
=== Журнал класса ===&lt;br /&gt;
Под панелью навигации выводится надпись &amp;quot;Журнал группы&amp;quot;.&lt;br /&gt;
Ниже таблица с информацией о потоке - программа, предмет, группа, преподаватель. Справа от этой таблицы размещена  ссылка &amp;quot;Новый урок&amp;quot;. Нажатие на нее позволяет создать новый отчет об уроке. Над этой ссылкой будут выводиться сообщения об ошибках сохранения данных из таблицы оценок.&lt;br /&gt;
Ниже отображаются две таблицы - таблица оценок и, справа от нее, таблица отчетов об уроке. Обе таблицы сделаны максимально похожими на соответствующие таблицы в бумажном &amp;quot;Классном журнале&amp;quot;. Таблицы связаны друг с другом. Так, дата в таблице оценок отображаются только в том случае, если был создан отчет об уроке для этой даты. При нажатии на дату в таблице оценок, происходит перемещение к соответствующей строке отчета об уроке.&lt;br /&gt;
=== Таблица оценок. ===&lt;br /&gt;
Если таблица отчетов об уроке пуста, то в таблице оценок нет ни одной колонки с датой.&lt;br /&gt;
Если журнал заполнен, то в верхней строке отображаются названия месяцев, ниже номера дней месяцев, на которые приходились занятия. Каждое число месяца - ссылка, при нажатии на которую происходит переход на соответствующую этому дню строку таблицы отчета об уроке.&lt;br /&gt;
Сразу под числом расположен значок редактирования. Он также выполнен в виде ссылки. При нажатии на него страница перезагружается в режиме формы ввода оценок и выставления присутствия учеников на уроке, который проходил в тот день, по значку под числом которого щелкнули.&lt;br /&gt;
В колонке этого дня, напротив фамилии каждого ученика появляются два поля. Поле выбора из списка - для проставления оценки. И поле переключатель - для отметки присутствия на уроке. Об этом напоминает буква &amp;quot;н&amp;quot;, расположенная справа от него. Если ученик был на уроке, то это поле следует оставить пустым. Если не был - поставить там флажок. Для выставления оценки следует выбрать элемент из списка. После того как изменения будут сохранены, в соответствующих клетках появятся буквы &amp;quot;Н&amp;quot; или оценки. Если кому-то была выставлена и оценка и отметка об отсутствии на уроке, на против его фамилии можно будет увидеть букву &amp;quot;Н&amp;quot;. Однако перед сохранением будет выведено предупреждение о том, что выставлена оценка отсутствующему ученику. Под уведомлением будут две кнопки - &amp;quot;Продолжить&amp;quot; и &amp;quot;Отменить&amp;quot;. При нажатии на &amp;quot;Продолжить&amp;quot; сценарий сохранения будет выполнен. Нажатие на другую кнопку вызовет отмену процедуры сохранения и возврат к форме с несохраненными изменениями.&lt;br /&gt;
При переключении в режим формы под таблицей появляется надпись &amp;quot;Внимание! До нажатия кнопки &amp;quot;сохранить&amp;quot; оценки не сохраняются.&amp;quot; И три кнопки - &amp;quot;Сохранить&amp;quot;, &amp;quot;Сохранить и продолжить&amp;quot;, &amp;quot;Восстановить&amp;quot;. Нажатие на первую кнопку сохраняет изменения, сделанные в форме и перезагружает страницу в режим просмотра. Вторая - сохраняет сделанные изменения, но страница остается в режиме формы - можно продолжать ввод. Третья кнопка отменяет сделанные изменения. Все введенные,  но несохраненные данные удаляются из формы. Форма перегружается с отображением последних сохраненных изменений.&lt;br /&gt;
Если ученику была выставлена оценка, а затем отменена - в форме было выбрано пустое поле, то ранее выбранная оценка будет удалена. Если оценка была изменена, то оценка будет обновлена. Каждое из этих действий, а также выставление статуса присутствия на уроке, будет выполнено через издание приказа.&lt;br /&gt;
Если редактируется контрольная точка без события, то в форме показываеются только поля выставления оценки. Поле присутствия на уроке не показывается и статус присутствия не сохраняется.&lt;br /&gt;
Контрольная точка без события выводится в таблице оценок без даты. Вместо даты выводится название КТ.&lt;br /&gt;
Что происходит в процессе сохранения.&lt;br /&gt;
После того как нажата одна из кнопок, сохраняющая внесенные изменения происходит&lt;br /&gt;
&lt;br /&gt;
* формирование приказа регистрации присутствия учеников на уроке. В него сохраняются данные о всех учениках потока, их статусы присутствия, id события, статус присутствия на котором выставляется.&lt;br /&gt;
* применение приказа и сохранение статусов учеников в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
Если были выставлены оценки. То в дополнение к вышеописанным действиям происходят следующие действия:&lt;br /&gt;
* формирование приказа регистрации выставления оценок только тем ученикам, которые их получили на уроке. В приказе сохраняются: точное время выставления оценки, id КТ, за которую выставлена оценка, id преподавателя (из /storage/persons), который выставил оценку, ученики, которые получили оценку, и соответствующие им оценки, статус оценки, id подписки ученика на поток.&lt;br /&gt;
* применение приказа и сохранение оценок в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
После создания отчета об уроке, происходит возврат на главную страницу журнала и таблица оценок загружается в режиме формы того дня, отчет для которого был создан. Если этот день выходит за границы видимости окна, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой. После редактирования отчета об уроке таблица оценок загружается в режиме просмотра. Если день, для которого происходило редактирование отчета выходит за границы видимости, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой.&lt;br /&gt;
&lt;br /&gt;
=== Таблица отчетов об уроках. ===&lt;br /&gt;
Представляет собой таблицу из шести столбцов.&lt;br /&gt;
Первый столбец - порядковый номер урока. Второй - дата урока в фомате дд.мм. Третий - тема урока - произвольный текст. Четвертый - задание на дом. Пятый - замена урока или преподавателя. Пятый - заметки об уроке. В настоящее время три последних поля не используются.&lt;br /&gt;
Уроки сортируются по датам, сверху вниз по возрастанию.&lt;br /&gt;
Под датой располагается значок редактирования информации об уроке, выполненный в виде ссылки. При щелчке по нему открывается новая страница с формой редактирования отчета об уроке. Все поля формы заполнены соответствующей информацией. Ее можно изменить, а изменения сохранить.&lt;br /&gt;
Эта же страница открывается при щелчке по ссылке &amp;quot;Новый урок&amp;quot;.&lt;br /&gt;
=== Страница редактирования урока. ===&lt;br /&gt;
Вверху страницы, под строкой навигации, выводится надпись &amp;quot;Классный журнал&amp;quot;.&lt;br /&gt;
Ниже выводится форма ввода информации об уроке - &amp;quot;Отчет об уроке&amp;quot;. В поле &amp;quot;Дата проведения урока&amp;quot; нужно выбрать дату урока. В поле &amp;quot;Элементы темплана&amp;quot; можно выбрать тему для нового урока. Ниже находится текстовое поле ввода &amp;quot;Что пройдено на уроке&amp;quot;. Сюда можно ввести тему урока вручную.&lt;br /&gt;
Еще ниже поле &amp;quot;Домашнее задание&amp;quot; для ввода соответствующей информации.&lt;br /&gt;
В самом низу расположены две кнопки - &amp;quot;Сохранить&amp;quot; и &amp;quot;Отмена&amp;quot;. При нажатии на вторую происходит возврат на главную страницу журнала без сохранения внесенных изменений. После нажатия на кнопку &amp;quot;Сохранить&amp;quot; происходит сохранение введенных данных в соответствующих таблицах. О результатах операции сохранения информирует надпись, выводимая под кнопками. Еще ниже появляется ссылка &amp;quot;назад&amp;quot; для возврата на главную страницу журнала. В случае возврата после сохранения данных, таблица оценок загружается в режиме редактирования данных на дату только что сохраненного урока.&lt;br /&gt;
Правее формы редактирования урока расположено окно с полосами прокрутки, в котором можно просмотреть темы уже проведенных уроков.&lt;br /&gt;
Они выводятся в видет таблицы из двух столбцов, в которых указываются соответственно дата и тема урока.&lt;br /&gt;
В зависимости от заполненности полей ввода возможны разные варианты обработки введенных данных.&lt;br /&gt;
&lt;br /&gt;
{|border=1&lt;br /&gt;
 |id КТ&lt;br /&gt;
 |id темы, выбранной из списка.&lt;br /&gt;
 |как обрабатывается&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |создается новая КТ и новое событие.&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |выбрана из списка&lt;br /&gt;
 |создается новое событие, привязанное к КТ, выбранной из списка&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и равна id КТ&lt;br /&gt;
 |обновляем КТ и (если изменяется дата) все события, которые ей соответствуют.&lt;br /&gt;
Тему из списка &amp;quot;Элементы темтемплана&amp;quot; выбрать нельзя.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и не равна id КТ&lt;br /&gt;
 |такая ситуация запрещена.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |0&lt;br /&gt;
 |такая ситуация запрещена&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ведомость итоговых оценок ===&lt;br /&gt;
На данной странице можно выставить итоговые оценки учащимся и завершить обучение потока. Страница принимает обязательный параметр id - id идущего  или завершенного потока.&lt;br /&gt;
&lt;br /&gt;
Вверху страныцы отображается форма, где отображены ученики, которые обучаются на данном потоке. Напротив каждого можно выбрать итоговую оценку, выставляемую учащемуся. Итоговые оценки берутся из шкалы дисциплины приписанной к данному потоку. Под ведомостью стоит галочка подтвержения оценок, без нее оценки не сохранятся. Делее стоит галочка завершения обучения если необходимо завершить поток, При завершении потока все подписки на дисциплину переводятся в один из конечных статусов. Если поток уже завершен, то галочка не показывается, вместо нее предупреждение. После завершения потока оценки также можно выставить, но они уже будут идти как переэкзаменовка. &lt;br /&gt;
&lt;br /&gt;
После того как мы выставили оценки и нажали на кнопку сохранить формируется приказ о выставленни итоговых оценок. На основе этого приказа сохраняются оценки, после чего на новой странице показывается шаблон ведомости в том виде, в котом она будет распечатана. &lt;br /&gt;
После первого сохранения оценок эта ведомость также становится доступна для печати. &lt;br /&gt;
&lt;br /&gt;
Перейти на эту страницу можно со страницы Журнала группы.&lt;br /&gt;
&lt;br /&gt;
==Права==&lt;br /&gt;
&lt;br /&gt;
* '''datamanage''' - глобальное право&lt;br /&gt;
* '''view_journal''' - право на просмотр журнала предмето-потока (учитель курса или завуч)&lt;br /&gt;
* '''view_all_journals''' - право на просмотр всех журналов (может просматривать общую информацию и личные данные)&lt;br /&gt;
* '''view_all_journals_department''' - право на просмотр всех журналов подразделения (может просматривать общую информацию и личные данные)&lt;br /&gt;
* '''can_complete_lesson''' - право отметить проведение урока (учитель урока или завуч)&lt;br /&gt;
* '''create_schevent''' - право на создание события (завуч и учитель на потоке)&lt;br /&gt;
* '''edit_schevent''' - право на редактирование события (учитель на потоке или завуч)&lt;br /&gt;
* '''control_journal''' - право на проверку журнала (завуч)&lt;br /&gt;
* '''give_grade''' - право на проверку журнала (учитель на потоке или завуч)&lt;br /&gt;
* '''give_itog_grades''' - право выставить итоговые оценки (если поток завершён и пользователь - учитель на потоке)&lt;br /&gt;
* '''view_events''' - право просматривать свое рассписание (преподаватель)&lt;br /&gt;
* '''give_attendance''' - право просматривать свое рассписание (только для завуча или ответственного преподавателя)&lt;br /&gt;
* '''give_theme_event''' - право указать тему для события (только если событие в статусе &amp;quot;запланирован&amp;quot; или &amp;quot;заменено другим событием&amp;quot;, а пользователь - завуч или ответственный преподаватель)&lt;br /&gt;
* '''edit_plans''' - право редактировать КТ (если статус КТ не &amp;quot;зафиксирована&amp;quot; и ((КТ завершена или событие состоялось), а пользователь - завуч) или пользователь может выставлять оценки)&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
В этом разделе описаны функции для работы со страницами &amp;quot;журнал группы&amp;quot; и &amp;quot;список журналов&amp;quot;. Здесь содержится только краткое описание функций и их параметров. Если вас интересует их внутренняя логика, то обратитесь к разделу [[Разработка:im/journal#Подробное описание работы функций|Подробное описание]]. Аргументы всех функций перечислены именно в том порядке, в котором их следует передавать.&lt;br /&gt;
=== Журнал группы ===&lt;br /&gt;
В этом разделе собраны все функции, которые относятся к странице &amp;quot;журнал группы&amp;quot;&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
Класс отрисовки школьного журнала&lt;br /&gt;
===== print_texttable() =====&lt;br /&gt;
Вывести страницу журнала - просмотр оценок, или редактирование&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $editid  - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid - id учебного события, которое будет редактировано (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* null&lt;br /&gt;
===== check_permissions() =====&lt;br /&gt;
Проверяет разрешения на редактирование оценок для текущего пользователя&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true/false - есть или нет разрешения на редактирование оценок&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
Класс для отрисовки таблицы тематического планирования в классном журнале&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
 &lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Выводит таблицу тематического планирования на экран&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
Класс для создания или редактирования одной темы на странице планирования уроков&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $planid - id элемента учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
* $eventid - id учебного события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== get_topic() =====&lt;br /&gt;
Возвращает объект с полями, необходимыми для заполнения формы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - объект с полями для вставки в форму, или false в случае ошибки&lt;br /&gt;
===== create_topic() =====&lt;br /&gt;
Создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint - контрольная точка из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event - заранее заготовленный объект для таблицы [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи из таблицы schevents или false в случае ошибки&lt;br /&gt;
===== save_topic() =====&lt;br /&gt;
Обновляет существующий или создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint (object) - объект для обновления или создания записи в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event (object) - объект для обновления или создания записи в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true, если все записи успешно обновлены&lt;br /&gt;
* (int), id новой записи, если она была добавлена&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Формирует таблицу тематического планирования в правой части страницы журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
===== get_anchor_id() =====&lt;br /&gt;
Возвращает метку времени, которая будет создана для нового урока, чтобы осуществить корректное перенаправление на страницу журнала&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $time - (int) время создания нового события: метка времени в формате unixtime&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - метка времени для перенаправления&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
Класс для подготовки сырых исходных данных для формирования школьного журнала и ему подобных документов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор - определяет с каким учебным потоком будет вестись работа&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
Класс для проверки и обработки оценок из формы&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор класса. Осуществляет все проверки и записывает данные во внутреннее поле.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $gradedata (array) - массив $_POST из формы&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== process_form() =====&lt;br /&gt;
Обработать все данные, пришедшие из формы: установить посещаемость, выставить оценки и сформировать приказы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* false в случае неудачи. В случае успеха производит редирект на страницу журнала&lt;br /&gt;
==== Класс dof_im_journal_presence ====&lt;br /&gt;
Класс для обработки информации о посещаемости &lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== presence_students() =====&lt;br /&gt;
Формирует массив присутствия учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
===== absence_students() =====&lt;br /&gt;
Формирует массив отсутствующих студентов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $away - массив id отсутствующих учеников&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
==== Дополнительные функции ====&lt;br /&gt;
===== dof_im_journal_format_date() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времення для преобразования.&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'.&lt;br /&gt;
* $url (string) - Указывается, если необходимо получить дату как ссылку. По умолчанию NULL&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с отформатированной датой&lt;br /&gt;
===== dof_im_journal_date_edit() =====&lt;br /&gt;
Возвращает отформатироанную дату и значок редактирования как ссылку&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времени&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'&lt;br /&gt;
* $durl (string) - путь ссылки для даты, если не указана - дата выводится как просто строка. По умолчанию null.&lt;br /&gt;
* $eurl (string) - путь ссылки для значка, если не указана значок не показывается По умолчанию null.&lt;br /&gt;
* $imgsubdate (bool) - вывести значок под датой или рядом по умолчанию true (выводит значок под датой)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с отформатированной датой&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс содержит функции для работы со страницей списка журналов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
===== set_data() =====&lt;br /&gt;
Заполняет начальной информацией внутренние поля объекта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения (таблица [[Разработка:storages/departments|departments]]). По умолчанию 0.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
===== get_data() =====&lt;br /&gt;
Возвращает собранные данные&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив структурных подразделений&lt;br /&gt;
===== get_journals() =====&lt;br /&gt;
Получить все журнлы занесенных подразделений&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
== Подробное описание работы функций ==&lt;br /&gt;
В этом разделе описывается подробная работа всех публичных и внутренних методов для классов журнала. Если вам требуется только краткая справка по API, то обратитесь к разделу [[Разработка:im/journal#API|API]].&lt;br /&gt;
=== Для журнала группы ===&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
&lt;br /&gt;
===== Описание print_texttable() =====&lt;br /&gt;
[[#print_texttable()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
Итоговая функция, выводящая всю собранную информацию на экран. &lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собирает всю информацию при помощи функции [[Разработка:im/journal#Описание get_all_form()|get_all_form()]]&lt;br /&gt;
# обращается к плагину templater для представления информации в html-формате&lt;br /&gt;
# функцией print выводит результат работы templater'а на экран.&lt;br /&gt;
===== Описание check_permissions() =====&lt;br /&gt;
[[#check_permissions()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем учебный поток. Если поток не найден - возвращаем false.&lt;br /&gt;
# проверяем статус учебного потока. Если он не равен значению &amp;quot;go&amp;quot;, то возвращаем false.&lt;br /&gt;
# проверяем, имеет ли текущий пользователь права редактирования. Если нет, то возвращаем false.&lt;br /&gt;
# если все проверки пройдены успешно, то возвращаем true.&lt;br /&gt;
===== Описание get_all_form() =====&lt;br /&gt;
Возвращает объект формы для вставки в templater. Таблица в шаблоне формируется по столбцам, т. е. сначала выводится контрольная точка в тем. планировании, а затем оценки всех учеников за это событие (как при заполнении обычного школьного журнала).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $editid (int) - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid (int) - id редактируемого учебного события в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) объект нужной структуры для построения шаблона&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собираем в объект все стандартные надписи для таблицы&lt;br /&gt;
# собираем все запланированные активные контрольные точки учебного потока&lt;br /&gt;
# создадим массивы для названий месяцев и дат&lt;br /&gt;
# собираем в массив информацию по ученикам. Если параметр $editid не равен нулю, то в столбце оценок для редактируемой даты вместо оценки выводим форму.&lt;br /&gt;
# собираем в результурующий массив названия месяцев и дат &lt;br /&gt;
# если нужно распечатать форму - устанавливаем стандартные html-теги начала и конца формы&lt;br /&gt;
# возвращаем результат&lt;br /&gt;
&lt;br /&gt;
===== Описание get_cell_form() =====&lt;br /&gt;
Возвращает редактируемую ячейку таблицы журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons.&lt;br /&gt;
* $cpassedid (int) - id учебной программы&lt;br /&gt;
* $oldgrade (int) - старая оценка (если есть). По умолчанию null.&lt;br /&gt;
* $gradeid (int) - id оценки в таблице cpgrades . По умолчанию 0&lt;br /&gt;
* $eventid (int) - id учебного события в таблице [[Разработка:storages/schevents|schevents]].&lt;br /&gt;
* $scale (string) - шкала всех возможных оценок через запятую. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с html-кодом формы редактирования оценки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Вся форма редактирования оценки представляет собой маленькую таблицу. С левой стороны находится форма выбора оценки, а справа галочка для отметки отсутствующего ученика (верхняя ячейка) и пояснение к ней (нижняя ячейка).&lt;br /&gt;
# получаем все допустимые варианты оценок для данного задания из параметра scale.&lt;br /&gt;
# из этих вариантов оценки составляем html-элемент формы типа SELECT.&lt;br /&gt;
# если за задание уже есть ранее выставленная, старая оценка, то делаем ее оценкой по умолчанию&lt;br /&gt;
# узнаем статус присутствия ученика на занятии, и в зависимсости от этого проставляем галочку над буквой &amp;quot;н&amp;quot;. Форма с возможностью отмечания отсутствующих учеников отображается только для контрольных точек для которых есть события.&lt;br /&gt;
# возвращаем результат одной строкой.&lt;br /&gt;
===== Описание get_cell_string() =====&lt;br /&gt;
Получить текстовое содержимое ячейки оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий данные об элементе тематического планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - данные об оценке По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) html-код оценки, либо специальный знак пробела, чтобы в таблице было видно пустую ячейку&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
# узнаем данные о посещаемости: получаем id события, если оно есть&lt;br /&gt;
#* если событие есть, узнаем, был ли ученик на занятии&lt;br /&gt;
# находим оценку&lt;br /&gt;
#* если ученик был на занятии и получил оценку - выводим оценку&lt;br /&gt;
#* если ученик был на занятии и не получил оценку - выводим символ пробела&lt;br /&gt;
#* если ученик отсутствовал на занятии и нет оценки, то выводим букву &amp;quot;н&amp;quot;&lt;br /&gt;
#* если ученик отсутствовал на занятии и получил оценку - выводим оценку, и букву &amp;quot;н&amp;quot; рядом с ней&lt;br /&gt;
&lt;br /&gt;
===== Описание get_one_cell() =====&lt;br /&gt;
Возвращает данные в одной клетке журнала. Определяет какой тип ячейки выводить: для редактирования или текстовую.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий контрольную точку с событием  из тем. планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - объект содержащий данные об оценке (таблица cpgrades)&lt;br /&gt;
* $cpassedid (int) - id подписки (таблица cpassed)&lt;br /&gt;
* $editid (int) - id редактируемого в текущий момент элемента из тем. планирования&lt;br /&gt;
* $eventid (int) - id редактируемого в текущий момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
* $scale (string) = По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с html-кодом формы редактирования оценки, либо сама оценка, либо статус &amp;quot;отсутствовал&amp;quot;&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# сравниваем, совпадают ли id выводимой и редактируемой в данной момент контрольной точки&lt;br /&gt;
#* если id совпадают - то выводим форму редактирования оценки&lt;br /&gt;
#** если за это задание оценка уже была ранее выставлена, то выводим форму с установленной ранее оценкой&lt;br /&gt;
#** если за задание еще нет оценки - то выводим форму без предустановленных значений&lt;br /&gt;
#* если id не совпадают то выводим оценку текстом (либо статус &amp;quot;отсутствовал&amp;quot;, либо пустую клетку, в зависимости от того был ли ученик на уроке, и получил ли он оценку)&lt;br /&gt;
===== Описание get_line_for_student() =====&lt;br /&gt;
Возвращает строку таблицы журнала для одного ученика.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $i (int) - порядковый номер ученика в группе&lt;br /&gt;
* $student (object) - объект с данными об ученике из таблицы persons&lt;br /&gt;
* $cpasseds (array) - массив объектов, содержащий все подписки учеников этого потока&lt;br /&gt;
* $plans (array) -  массив объектов, содержащий все контрольные точки текущего курса (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (или 0, если события нет) Таблица [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - информация об ученике: его ФИО, и оценки по всем контрольным точкам, а также сведения о посещаемости&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в соответствующие поля итогового объекта порядковый номер ученика, и его ФИО&lt;br /&gt;
# перебираем все переданные подписки ищем ту, которая относится к переданному ученику&lt;br /&gt;
# записываем в итоговый объект id его подписки&lt;br /&gt;
# создаем массив для оценок и собираем оценки ученика:&lt;br /&gt;
#* перебираем все контрольные переданные точки ($plans)&lt;br /&gt;
#* для каждой контрольной точки создаем объект оценки&lt;br /&gt;
#* получаем значение оценки за просматриваемую контрольную точку&lt;br /&gt;
#* при помощи функции [[Разработка:im/journal#Описание get_one_cell()|get_one_cell()]] получаем оформленный html-код оценки&lt;br /&gt;
#* записываем полученный объект в массив оценок&lt;br /&gt;
# добавляем массив оценок в итоговый объект&lt;br /&gt;
# возвращаем итоговый объект&lt;br /&gt;
===== Описание get_lines_for_students() =====&lt;br /&gt;
Возвращает массив строк с ФИО и оценками для всех учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans (array) - массив всех контрольных точек учебного потока из таблицы plans&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) информация о всех учениках учебного потока или false, если ни одного ученика нет&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все подписки учебного потока, чтобы потом установить связи с оценками&lt;br /&gt;
# получаем учеников учебного потока&lt;br /&gt;
# присваиваем каждому ученику порядковый номер,&lt;br /&gt;
# получаем информацию по каждому ученику функцией [[#Описание get_line_for_student()|get_line_for_student()]] и заносим объект с информацией о нем в массив&lt;br /&gt;
# возвращаем получившийся массив &lt;br /&gt;
===== Описание create_datesstring() =====&lt;br /&gt;
Создает верхнюю строку журнала с названиями месяцев и списком дат в пригодном для обработки плагином templater виде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - список всех контрольных точек учебного потока из таблицы [[Разработка:storages/plans|plans]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий массив с данными для шаблонизатора&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Даты в электронном журнале должны будут проставляться как и в обычном классном журнале: верхняя строка - месяцы обучения, нижняя строка - даты проведенных или запланированных уроков, а также четвертные или годовые оценки.&lt;br /&gt;
Для того чтобы организовать такой внешний вид для электронного журнала мы должны воспользоваться параметром colspan для html-таблицы журнала, и расположить тем самым месяцы точно над датами проведенных уроков. Для этой задачи в этой функции мы создаем объект следующей структуры:&lt;br /&gt;
* ''(возвращаемый объект)''&lt;br /&gt;
** ''monthtitle'' - массив объектов, каждый из которых имеет свойства ''mtitle'' - название месяца, и ''mcolspan'' - количество ячеек с датами проведенных уроков в этом месяце&lt;br /&gt;
** ''monthdate'' - строка с датой проведенного урока, либо название контрольной точки.&lt;br /&gt;
&lt;br /&gt;
# получаем строку форматированных дат уроков при помощи функции [[#Описание generate_all_dates()|generate_all_dates()]]&lt;br /&gt;
# перебираем все события и собираем массивы дат и названий месяцев&lt;br /&gt;
#* если просматриваемая дата не находится в том же месяце, что и предыдущая, то дополняем массив месяцев&lt;br /&gt;
# прибавляем счетчик дат в месяце&lt;br /&gt;
# записываем новую дату в итоговый массив&lt;br /&gt;
# возвращаем итоговый массив&lt;br /&gt;
===== Описание generate_all_dates() =====&lt;br /&gt;
Вызывается из [[#Описание create_datesstring()|create_datesstring()]]. Получить отформатированные даты для журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - массив всех контрольных точек учебного потока (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - отформатированные даты для вывода в журнал&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получим событие из таблицы schevents, которое относится к данной теме тематического планирования&lt;br /&gt;
# если событие есть - то покажем дату&lt;br /&gt;
# если события нет - только название контрольной точки&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_single_date() =====&lt;br /&gt;
Вызывается из [[#Описание generate_all_dates|generate_all_dates]] Создает один объект даты для журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plan (object) - объект из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $date (string) - метка времени для события или контрольной точки&lt;br /&gt;
* $event (object) - Объект из таблицы [[Разработка:storages/schevents|schevents]]. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) дата в нужном для templater'a формате&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# устанавливаем путь (html-якорь) к теме в планирования на странице&lt;br /&gt;
# Определяем, id события которое будет редактировано. Если события нет, то передаем 0.&lt;br /&gt;
# записываем якорь с ссылкой в объект&lt;br /&gt;
# возвращаем объект&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
===== Описание get_topics() =====&lt;br /&gt;
Возвращает массив объектов c необходимыми свойствами для вставки в таблицу schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив тем входящих в планирование&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все контрольные точки учебного потока&lt;br /&gt;
# формируем объект с нужными полями для каждой контрольной точки&lt;br /&gt;
# возвращаем получившийся массив объектов&lt;br /&gt;
===== Описание get_empty_topic() =====&lt;br /&gt;
Возвращает &amp;quot;пустой&amp;quot; объект отчета об уроке &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект для вставки в таблицу [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* создаем объект с необходимым списком пустых полей и возвращаем его&lt;br /&gt;
===== Описание table_data() =====&lt;br /&gt;
Возвращает массив строк данных отформатированных для вывода с помощью moodle-функции print_table()&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив с данными для распечатки таблицы, либо false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли для переданного потока элементы тематического планирования.&lt;br /&gt;
#* если их нет - то возвращаем false&lt;br /&gt;
# формируем массив строк таблицы&lt;br /&gt;
# проставляем html-якоря для каждой контрольной точки на странице оценок&lt;br /&gt;
# добавляем ссылки на редактирования элементов учебного плана&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
===== Описание get_topic() =====&lt;br /&gt;
[[#get_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Проверяем, указан ли id контрольной точки. &lt;br /&gt;
** Если не указан - возврящаем пустую тему.&lt;br /&gt;
** Если указан - пробуем извлечь контрольную точку по такому id&lt;br /&gt;
*** Если контрольную точку извлечь не удалось - то возвращаем false&lt;br /&gt;
*** Если удалось - то возвращаем заполненный отчет об уроке&lt;br /&gt;
===== Описание save_topic() =====&lt;br /&gt;
[[#save_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем есть ли у нас данные в переменной $event для обновления или создания события. Если нет - то возвращаем false.&lt;br /&gt;
# определяем тип действия, которое надо совершить&lt;br /&gt;
#* если указан planid для события - то создаем новое событие для существующей контрольной точки&lt;br /&gt;
#* если нет id для контрольной точки - создаем новое событие и новую контрольную точку&lt;br /&gt;
#* в остальных случаях - обновляем контрольную точку и событие: вычисляем новую относительную дату, и обновляем записи в таблицах [[Разработка:storages/schevents|schevents]] и [[Разработка:storages/plans|plans]]&lt;br /&gt;
===== Описание create_topic() =====&lt;br /&gt;
[[#create_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем новый элемент тематического планирования в таблице plans (если это не удалось - то возвращаем false)&lt;br /&gt;
# добавляем в переданное событие id контрольной точки&lt;br /&gt;
# создаем событие из переданного объекта $event (если событие не создано - удаляем ранее созданный элемент тематического планирования)&lt;br /&gt;
# возвращаем id события&lt;br /&gt;
===== Описание create_checkpoint() =====&lt;br /&gt;
Создает и сохраняет запись в таблице plans&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $point (object) - данные для сохранения в таблицу [[Разработка:storages/plans|plans]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи или false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем дату начала обучения&lt;br /&gt;
# создаем заготовку для объекта контрольной точки&lt;br /&gt;
# вычисляем относительную дату контрольной точки&lt;br /&gt;
# заносим данные в базу&lt;br /&gt;
===== Описание create_event() =====&lt;br /&gt;
Создает объект события и сохраняет его в schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $event (object) - данные для сохранения&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи в таблице событий или false.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем id преподавателя в таблице persons&lt;br /&gt;
# создаем объект нужного формата и заносим туда все данные&lt;br /&gt;
# записываем данные в базу&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* csid - id учебного потока в таблице сstreams&lt;br /&gt;
===== Описание get_checkpoints() =====&lt;br /&gt;
Получить все контрольные точки одного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив объектов из таблицы plans или false &lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id учебного потока из таблицы cstreams&lt;br /&gt;
# выбираем из таблицы plans все записи, у которых поле cstreamid равно id учебного потока, и тип связи &amp;quot;cstreams&amp;quot;&lt;br /&gt;
# сортируем их в хронологическом порядке&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
&lt;br /&gt;
===== Описание get_students() =====&lt;br /&gt;
Получить всех учеников указанного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив записей из таблицы persons или false&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем список пройденных дисциплин&lt;br /&gt;
# перебираем все подписки и запоминаем id ученика для каждой из них&lt;br /&gt;
# извлекаем из таблицы persons учеников, чьи id были извлечены из подписок&lt;br /&gt;
&lt;br /&gt;
===== Описание get_teacherid() =====&lt;br /&gt;
Получить id преподавателя учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id преподавателя или false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* id преподавателя всегда берется только из записи учебного потока из таблицы cstreams&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* gradedata - (object) все оценки и сопутствующая им информация&lt;br /&gt;
* mypost - (array) непроверенные данные пришедшие из массива $_POST. Используются только для составления повторного запроса на сохранение данных.&lt;br /&gt;
===== Описание __construct =====&lt;br /&gt;
[[#Класс dof_im_journal_rawdata|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект, в который мы будем складывать все проверенные данные, пришедшие из формы&lt;br /&gt;
# проверяем скалярные данные: все числовые идентификаторы, и отдельные строки, и после проверки записываем их в итоговый объект&lt;br /&gt;
# теперь, зная cstreamid из проверенных скалярных данных вызываем родительский конструктор&lt;br /&gt;
# проверяем массивы, пришедшие из формы: &lt;br /&gt;
#* данные об отсутствующих учениках&lt;br /&gt;
#* массив оценок &lt;br /&gt;
#* массив идентификаторов подписок (таблица cpassed)&lt;br /&gt;
#* узнаем id оценок для изменения их статуса&lt;br /&gt;
# записываем все проверенные данные в итоговый массив&lt;br /&gt;
# определяем тип действия, которое надо совершить: &lt;br /&gt;
#* сохранить данные&lt;br /&gt;
#* сохранить данные и продолжить редактирование&lt;br /&gt;
#* восстановить исходные значения&lt;br /&gt;
# записываем исходный массив (непроверенный) в поле объекта, если потом понадобится еще раз отправить данные после подтверждения&lt;br /&gt;
===== Описание process_form() =====&lt;br /&gt;
[[#process_form()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# в самом начале проверяем тип действия, которое надо совершить. Если этим действием является &amp;quot;отменить изменения&amp;quot;, то не переходим к сохранению оценок и сразуже выполняем перенаправление на страницу журнала. В остальных случаях идем дальше:&lt;br /&gt;
# проверяем, установлено ли у кого-нибудь из учеников одновременно &amp;quot;н&amp;quot; и оценка. Если это так - то перенаправим пользователя на страницу с сообщением об этом, и попросим его подтвердить такой выбор.&lt;br /&gt;
#* если пользователь согласен с изменениями, которые он сделал, то все выставленые им оценки и сведения о посещаемости сохраняются&lt;br /&gt;
#* если же нет - то происходит отмена всех изменений&lt;br /&gt;
# в случае, когда никаких предупреждений нет - сначала формируем приказ для оценок&lt;br /&gt;
# затем приказ о посещаемости&lt;br /&gt;
# если все действия произведены успешно - производим редирект. Если же возникли ошибки - сообщаем об этом&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_order_grades() =====&lt;br /&gt;
Сформировать приказ об изменении состояния учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true если приказ успешно сформирован, и false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id подразделения в таблице departments&lt;br /&gt;
# определяем тип действия, которое нужно совершить с оценкой&lt;br /&gt;
# обращаемся к функциям выставления, либо удаления оценки&lt;br /&gt;
===== Описание order_set_grade() =====&lt;br /&gt;
Формирует приказ - установить оценку. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true в случае успеха и false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# подключаем методы работы с приказом&lt;br /&gt;
# создаем объект для записи&lt;br /&gt;
# сохраняем автора приказа, подразделение, к которому он относится, дату создания приказа&lt;br /&gt;
# добавляем данные, которые определяют назначение приказа&lt;br /&gt;
# сохраняем приказ в БД, в таблицу orders&lt;br /&gt;
# подписываем приказ&lt;br /&gt;
# исполняем приказ&lt;br /&gt;
Методы order_delete_grade и order_update_grade работают по такому же принципу.&lt;br /&gt;
===== Описание get_grades_fororder() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $type - тип действия, которое необходимо будет произвести над оценкой. Возможные значения: ''set_grade'' и ''delete_grade''.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий список оценок и все идентификаторы для формирования приказа.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в него дату, id учителя (в таблице persons) и id контрольной точки (в таблице plans&lt;br /&gt;
# перебираем все оценки из внутреннего массива с проверенными данными&lt;br /&gt;
# определяем тип действия, которое над ней нужно совершить&lt;br /&gt;
# в зависимости от типа действия (установление или удаление оценки) записываем в объект оценки нужные идентификаторы&lt;br /&gt;
# упаковываем оценки в итоговый массив и возвращаем его&lt;br /&gt;
=== Для списка журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс служит для сбора и вывода информации по всем структурным подразделениям. Информация выводится древовидно: самый верхний уровень - подразделение, затем учебные программы, затем учебные периоды, элементы учебной программы, и в самом конце - журналы учебного потока.&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $departments массив структуры&lt;br /&gt;
    array(&lt;br /&gt;
    [departmentid] =&amp;gt; obj  -&amp;gt; departmentname = 'department_name'&lt;br /&gt;
                      obj  -&amp;gt; programms = array(&lt;br /&gt;
      [programmid]   =&amp;gt; obj1 -&amp;gt; programmname = 'programm_name'&lt;br /&gt;
                        obj1 -&amp;gt; ages = array(&lt;br /&gt;
        [agenum]       =&amp;gt; obj2 -&amp;gt; agename = 'age_name'&lt;br /&gt;
                          obj2 -&amp;gt; items = array(&lt;br /&gt;
          [itemid]       =&amp;gt; obj3 -&amp;gt; itemname = 'item_name'&lt;br /&gt;
                            obj3 -&amp;gt; cstreams = array(&lt;br /&gt;
            [cstreamid]    =&amp;gt; obj4 -&amp;gt; cstreamname = 'cstream_name'&lt;br /&gt;
                                    )''// конец массива cstreams''&lt;br /&gt;
                                  )''// конец массива items''&lt;br /&gt;
                                )''// конец массива ages''&lt;br /&gt;
                              )''// конец массива programms''&lt;br /&gt;
         )''// конец общего массива''&lt;br /&gt;
    содержит данные для вставку в темплатер после добавления еще одного уровня:&lt;br /&gt;
    $fortemplater-&amp;gt;departments = $this-&amp;gt;departments;&lt;br /&gt;
В общем виде сбор данных выглядит так: &lt;br /&gt;
# сначала собирается информация по структурному подразделению (одному или нескольким), и информация по ним записывается в итоговый объект&lt;br /&gt;
# затем получаются все программы учебного подразделения, информация по ним записывается в итоговый массив&lt;br /&gt;
# извлекается и записывается в итоговый объект список учебных периодов &lt;br /&gt;
# для каждого учебного периода получаются элементы учебной программы, которые изучаются в нем&lt;br /&gt;
# для каждого элемента учебной программы получаются учебные потоки&lt;br /&gt;
# для каждого учебного потока получается его журнал&lt;br /&gt;
===== Описание set_data() =====&lt;br /&gt;
[[#set_data()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* получаем id структурного подразделения из таблицы departments.&lt;br /&gt;
** если оно есть - то получаем информацию только по нему&lt;br /&gt;
** если получили 0 вместо id подразделения - то выводим информацию по всем подразделениям&lt;br /&gt;
&lt;br /&gt;
===== Описание get_journals_department() =====&lt;br /&gt;
Возвращает журналы одного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - набор журналов &lt;br /&gt;
* (bool) - false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все программы, за которые отвечает подразделение&lt;br /&gt;
# для каждой программы получаем все ее журналы&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2091</id>
		<title>Разработка:im/journal</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2091"/>
				<updated>2011-01-12T13:28:38Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Права */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Классный журнал ==&lt;br /&gt;
В журнале можно выставлять оценки и вводить отчет о проведенном уроке.&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
Вверху страницы находится форма для выбора подразделения и кнопка &amp;quot;показать&amp;quot;. По умолчанию показывается информация по всем учебным подразделениям. При выборе конкретного учебного подразделения показывается информация только по нему.&lt;br /&gt;
&lt;br /&gt;
Вывод информации по журналам организован в виде маркированного списка следующего вида:&lt;br /&gt;
* ''Подразделение''&lt;br /&gt;
** ''Учебная программа''&lt;br /&gt;
*** ''Учебный период''&lt;br /&gt;
**** ''Предмет''&lt;br /&gt;
***** ''Учебный поток (дата_начала - дата_окончания)''&lt;br /&gt;
Каждая запись учебного потока является ссылкой на страницу журнала учебного потока.&lt;br /&gt;
=== Журнал класса ===&lt;br /&gt;
Под панелью навигации выводится надпись &amp;quot;Журнал группы&amp;quot;.&lt;br /&gt;
Ниже таблица с информацией о потоке - программа, предмет, группа, преподаватель. Справа от этой таблицы размещена  ссылка &amp;quot;Новый урок&amp;quot;. Нажатие на нее позволяет создать новый отчет об уроке. Над этой ссылкой будут выводиться сообщения об ошибках сохранения данных из таблицы оценок.&lt;br /&gt;
Ниже отображаются две таблицы - таблица оценок и, справа от нее, таблица отчетов об уроке. Обе таблицы сделаны максимально похожими на соответствующие таблицы в бумажном &amp;quot;Классном журнале&amp;quot;. Таблицы связаны друг с другом. Так, дата в таблице оценок отображаются только в том случае, если был создан отчет об уроке для этой даты. При нажатии на дату в таблице оценок, происходит перемещение к соответствующей строке отчета об уроке.&lt;br /&gt;
=== Таблица оценок. ===&lt;br /&gt;
Если таблица отчетов об уроке пуста, то в таблице оценок нет ни одной колонки с датой.&lt;br /&gt;
Если журнал заполнен, то в верхней строке отображаются названия месяцев, ниже номера дней месяцев, на которые приходились занятия. Каждое число месяца - ссылка, при нажатии на которую происходит переход на соответствующую этому дню строку таблицы отчета об уроке.&lt;br /&gt;
Сразу под числом расположен значок редактирования. Он также выполнен в виде ссылки. При нажатии на него страница перезагружается в режиме формы ввода оценок и выставления присутствия учеников на уроке, который проходил в тот день, по значку под числом которого щелкнули.&lt;br /&gt;
В колонке этого дня, напротив фамилии каждого ученика появляются два поля. Поле выбора из списка - для проставления оценки. И поле переключатель - для отметки присутствия на уроке. Об этом напоминает буква &amp;quot;н&amp;quot;, расположенная справа от него. Если ученик был на уроке, то это поле следует оставить пустым. Если не был - поставить там флажок. Для выставления оценки следует выбрать элемент из списка. После того как изменения будут сохранены, в соответствующих клетках появятся буквы &amp;quot;Н&amp;quot; или оценки. Если кому-то была выставлена и оценка и отметка об отсутствии на уроке, на против его фамилии можно будет увидеть букву &amp;quot;Н&amp;quot;. Однако перед сохранением будет выведено предупреждение о том, что выставлена оценка отсутствующему ученику. Под уведомлением будут две кнопки - &amp;quot;Продолжить&amp;quot; и &amp;quot;Отменить&amp;quot;. При нажатии на &amp;quot;Продолжить&amp;quot; сценарий сохранения будет выполнен. Нажатие на другую кнопку вызовет отмену процедуры сохранения и возврат к форме с несохраненными изменениями.&lt;br /&gt;
При переключении в режим формы под таблицей появляется надпись &amp;quot;Внимание! До нажатия кнопки &amp;quot;сохранить&amp;quot; оценки не сохраняются.&amp;quot; И три кнопки - &amp;quot;Сохранить&amp;quot;, &amp;quot;Сохранить и продолжить&amp;quot;, &amp;quot;Восстановить&amp;quot;. Нажатие на первую кнопку сохраняет изменения, сделанные в форме и перезагружает страницу в режим просмотра. Вторая - сохраняет сделанные изменения, но страница остается в режиме формы - можно продолжать ввод. Третья кнопка отменяет сделанные изменения. Все введенные,  но несохраненные данные удаляются из формы. Форма перегружается с отображением последних сохраненных изменений.&lt;br /&gt;
Если ученику была выставлена оценка, а затем отменена - в форме было выбрано пустое поле, то ранее выбранная оценка будет удалена. Если оценка была изменена, то оценка будет обновлена. Каждое из этих действий, а также выставление статуса присутствия на уроке, будет выполнено через издание приказа.&lt;br /&gt;
Если редактируется контрольная точка без события, то в форме показываеются только поля выставления оценки. Поле присутствия на уроке не показывается и статус присутствия не сохраняется.&lt;br /&gt;
Контрольная точка без события выводится в таблице оценок без даты. Вместо даты выводится название КТ.&lt;br /&gt;
Что происходит в процессе сохранения.&lt;br /&gt;
После того как нажата одна из кнопок, сохраняющая внесенные изменения происходит&lt;br /&gt;
&lt;br /&gt;
* формирование приказа регистрации присутствия учеников на уроке. В него сохраняются данные о всех учениках потока, их статусы присутствия, id события, статус присутствия на котором выставляется.&lt;br /&gt;
* применение приказа и сохранение статусов учеников в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
Если были выставлены оценки. То в дополнение к вышеописанным действиям происходят следующие действия:&lt;br /&gt;
* формирование приказа регистрации выставления оценок только тем ученикам, которые их получили на уроке. В приказе сохраняются: точное время выставления оценки, id КТ, за которую выставлена оценка, id преподавателя (из /storage/persons), который выставил оценку, ученики, которые получили оценку, и соответствующие им оценки, статус оценки, id подписки ученика на поток.&lt;br /&gt;
* применение приказа и сохранение оценок в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
После создания отчета об уроке, происходит возврат на главную страницу журнала и таблица оценок загружается в режиме формы того дня, отчет для которого был создан. Если этот день выходит за границы видимости окна, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой. После редактирования отчета об уроке таблица оценок загружается в режиме просмотра. Если день, для которого происходило редактирование отчета выходит за границы видимости, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой.&lt;br /&gt;
&lt;br /&gt;
=== Таблица отчетов об уроках. ===&lt;br /&gt;
Представляет собой таблицу из шести столбцов.&lt;br /&gt;
Первый столбец - порядковый номер урока. Второй - дата урока в фомате дд.мм. Третий - тема урока - произвольный текст. Четвертый - задание на дом. Пятый - замена урока или преподавателя. Пятый - заметки об уроке. В настоящее время три последних поля не используются.&lt;br /&gt;
Уроки сортируются по датам, сверху вниз по возрастанию.&lt;br /&gt;
Под датой располагается значок редактирования информации об уроке, выполненный в виде ссылки. При щелчке по нему открывается новая страница с формой редактирования отчета об уроке. Все поля формы заполнены соответствующей информацией. Ее можно изменить, а изменения сохранить.&lt;br /&gt;
Эта же страница открывается при щелчке по ссылке &amp;quot;Новый урок&amp;quot;.&lt;br /&gt;
=== Страница редактирования урока. ===&lt;br /&gt;
Вверху страницы, под строкой навигации, выводится надпись &amp;quot;Классный журнал&amp;quot;.&lt;br /&gt;
Ниже выводится форма ввода информации об уроке - &amp;quot;Отчет об уроке&amp;quot;. В поле &amp;quot;Дата проведения урока&amp;quot; нужно выбрать дату урока. В поле &amp;quot;Элементы темплана&amp;quot; можно выбрать тему для нового урока. Ниже находится текстовое поле ввода &amp;quot;Что пройдено на уроке&amp;quot;. Сюда можно ввести тему урока вручную.&lt;br /&gt;
Еще ниже поле &amp;quot;Домашнее задание&amp;quot; для ввода соответствующей информации.&lt;br /&gt;
В самом низу расположены две кнопки - &amp;quot;Сохранить&amp;quot; и &amp;quot;Отмена&amp;quot;. При нажатии на вторую происходит возврат на главную страницу журнала без сохранения внесенных изменений. После нажатия на кнопку &amp;quot;Сохранить&amp;quot; происходит сохранение введенных данных в соответствующих таблицах. О результатах операции сохранения информирует надпись, выводимая под кнопками. Еще ниже появляется ссылка &amp;quot;назад&amp;quot; для возврата на главную страницу журнала. В случае возврата после сохранения данных, таблица оценок загружается в режиме редактирования данных на дату только что сохраненного урока.&lt;br /&gt;
Правее формы редактирования урока расположено окно с полосами прокрутки, в котором можно просмотреть темы уже проведенных уроков.&lt;br /&gt;
Они выводятся в видет таблицы из двух столбцов, в которых указываются соответственно дата и тема урока.&lt;br /&gt;
В зависимости от заполненности полей ввода возможны разные варианты обработки введенных данных.&lt;br /&gt;
&lt;br /&gt;
{|border=1&lt;br /&gt;
 |id КТ&lt;br /&gt;
 |id темы, выбранной из списка.&lt;br /&gt;
 |как обрабатывается&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |создается новая КТ и новое событие.&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |выбрана из списка&lt;br /&gt;
 |создается новое событие, привязанное к КТ, выбранной из списка&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и равна id КТ&lt;br /&gt;
 |обновляем КТ и (если изменяется дата) все события, которые ей соответствуют.&lt;br /&gt;
Тему из списка &amp;quot;Элементы темтемплана&amp;quot; выбрать нельзя.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и не равна id КТ&lt;br /&gt;
 |такая ситуация запрещена.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |0&lt;br /&gt;
 |такая ситуация запрещена&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ведомость итоговых оценок ===&lt;br /&gt;
На данной странице можно выставить итоговые оценки учащимся и завершить обучение потока. Страница принимает обязательный параметр id - id идущего  или завершенного потока.&lt;br /&gt;
&lt;br /&gt;
Вверху страныцы отображается форма, где отображены ученики, которые обучаются на данном потоке. Напротив каждого можно выбрать итоговую оценку, выставляемую учащемуся. Итоговые оценки берутся из шкалы дисциплины приписанной к данному потоку. Под ведомостью стоит галочка подтвержения оценок, без нее оценки не сохранятся. Делее стоит галочка завершения обучения если необходимо завершить поток, При завершении потока все подписки на дисциплину переводятся в один из конечных статусов. Если поток уже завершен, то галочка не показывается, вместо нее предупреждение. После завершения потока оценки также можно выставить, но они уже будут идти как переэкзаменовка. &lt;br /&gt;
&lt;br /&gt;
После того как мы выставили оценки и нажали на кнопку сохранить формируется приказ о выставленни итоговых оценок. На основе этого приказа сохраняются оценки, после чего на новой странице показывается шаблон ведомости в том виде, в котом она будет распечатана. &lt;br /&gt;
После первого сохранения оценок эта ведомость также становится доступна для печати. &lt;br /&gt;
&lt;br /&gt;
Перейти на эту страницу можно со страницы Журнала группы.&lt;br /&gt;
&lt;br /&gt;
==Права==&lt;br /&gt;
&lt;br /&gt;
* '''datamanage''' - глобальное право&lt;br /&gt;
* '''view_journal''' - право на просмотр журнала предмето-потока&lt;br /&gt;
* '''view_all_journals''' - право на просмотр журнала предмето-потока&lt;br /&gt;
* '''view_all_journals_department''' - право на просмотр всех журналов подразделения&lt;br /&gt;
* '''can_complete_lesson''' - право на отметить проведение урока&lt;br /&gt;
* '''create_schevent''' - право на создание события&lt;br /&gt;
* '''edit_schevent''' - право на редактирование события&lt;br /&gt;
* '''control_journal''' - право на проверку журнала&lt;br /&gt;
* '''give_grade''' - право на проверку журнала&lt;br /&gt;
* '''give_itog_grades''' - право выставить итоговые оценки&lt;br /&gt;
* '''view_events''' - право просматривать свое рассписание&lt;br /&gt;
* '''give_attendance''' - право просматривать свое рассписание (только для завуча или ответственного преподавателя)&lt;br /&gt;
* '''give_theme_event''' - право указать тему для события (только если событие в статусе &amp;quot;запланирован&amp;quot; или &amp;quot;заменено другим событием&amp;quot;, а пользователь - завуч или ответственный преподаватель)&lt;br /&gt;
* '''edit_plans''' - право редактировать КТ (если статус КТ не &amp;quot;зафиксирована&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
В этом разделе описаны функции для работы со страницами &amp;quot;журнал группы&amp;quot; и &amp;quot;список журналов&amp;quot;. Здесь содержится только краткое описание функций и их параметров. Если вас интересует их внутренняя логика, то обратитесь к разделу [[Разработка:im/journal#Подробное описание работы функций|Подробное описание]]. Аргументы всех функций перечислены именно в том порядке, в котором их следует передавать.&lt;br /&gt;
=== Журнал группы ===&lt;br /&gt;
В этом разделе собраны все функции, которые относятся к странице &amp;quot;журнал группы&amp;quot;&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
Класс отрисовки школьного журнала&lt;br /&gt;
===== print_texttable() =====&lt;br /&gt;
Вывести страницу журнала - просмотр оценок, или редактирование&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $editid  - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid - id учебного события, которое будет редактировано (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* null&lt;br /&gt;
===== check_permissions() =====&lt;br /&gt;
Проверяет разрешения на редактирование оценок для текущего пользователя&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true/false - есть или нет разрешения на редактирование оценок&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
Класс для отрисовки таблицы тематического планирования в классном журнале&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
 &lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Выводит таблицу тематического планирования на экран&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
Класс для создания или редактирования одной темы на странице планирования уроков&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $planid - id элемента учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
* $eventid - id учебного события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== get_topic() =====&lt;br /&gt;
Возвращает объект с полями, необходимыми для заполнения формы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - объект с полями для вставки в форму, или false в случае ошибки&lt;br /&gt;
===== create_topic() =====&lt;br /&gt;
Создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint - контрольная точка из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event - заранее заготовленный объект для таблицы [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи из таблицы schevents или false в случае ошибки&lt;br /&gt;
===== save_topic() =====&lt;br /&gt;
Обновляет существующий или создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint (object) - объект для обновления или создания записи в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event (object) - объект для обновления или создания записи в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true, если все записи успешно обновлены&lt;br /&gt;
* (int), id новой записи, если она была добавлена&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Формирует таблицу тематического планирования в правой части страницы журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
===== get_anchor_id() =====&lt;br /&gt;
Возвращает метку времени, которая будет создана для нового урока, чтобы осуществить корректное перенаправление на страницу журнала&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $time - (int) время создания нового события: метка времени в формате unixtime&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - метка времени для перенаправления&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
Класс для подготовки сырых исходных данных для формирования школьного журнала и ему подобных документов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор - определяет с каким учебным потоком будет вестись работа&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
Класс для проверки и обработки оценок из формы&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор класса. Осуществляет все проверки и записывает данные во внутреннее поле.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $gradedata (array) - массив $_POST из формы&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== process_form() =====&lt;br /&gt;
Обработать все данные, пришедшие из формы: установить посещаемость, выставить оценки и сформировать приказы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* false в случае неудачи. В случае успеха производит редирект на страницу журнала&lt;br /&gt;
==== Класс dof_im_journal_presence ====&lt;br /&gt;
Класс для обработки информации о посещаемости &lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== presence_students() =====&lt;br /&gt;
Формирует массив присутствия учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
===== absence_students() =====&lt;br /&gt;
Формирует массив отсутствующих студентов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $away - массив id отсутствующих учеников&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
==== Дополнительные функции ====&lt;br /&gt;
===== dof_im_journal_format_date() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времення для преобразования.&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'.&lt;br /&gt;
* $url (string) - Указывается, если необходимо получить дату как ссылку. По умолчанию NULL&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с отформатированной датой&lt;br /&gt;
===== dof_im_journal_date_edit() =====&lt;br /&gt;
Возвращает отформатироанную дату и значок редактирования как ссылку&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времени&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'&lt;br /&gt;
* $durl (string) - путь ссылки для даты, если не указана - дата выводится как просто строка. По умолчанию null.&lt;br /&gt;
* $eurl (string) - путь ссылки для значка, если не указана значок не показывается По умолчанию null.&lt;br /&gt;
* $imgsubdate (bool) - вывести значок под датой или рядом по умолчанию true (выводит значок под датой)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с отформатированной датой&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс содержит функции для работы со страницей списка журналов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
===== set_data() =====&lt;br /&gt;
Заполняет начальной информацией внутренние поля объекта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения (таблица [[Разработка:storages/departments|departments]]). По умолчанию 0.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
===== get_data() =====&lt;br /&gt;
Возвращает собранные данные&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив структурных подразделений&lt;br /&gt;
===== get_journals() =====&lt;br /&gt;
Получить все журнлы занесенных подразделений&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
== Подробное описание работы функций ==&lt;br /&gt;
В этом разделе описывается подробная работа всех публичных и внутренних методов для классов журнала. Если вам требуется только краткая справка по API, то обратитесь к разделу [[Разработка:im/journal#API|API]].&lt;br /&gt;
=== Для журнала группы ===&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
&lt;br /&gt;
===== Описание print_texttable() =====&lt;br /&gt;
[[#print_texttable()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
Итоговая функция, выводящая всю собранную информацию на экран. &lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собирает всю информацию при помощи функции [[Разработка:im/journal#Описание get_all_form()|get_all_form()]]&lt;br /&gt;
# обращается к плагину templater для представления информации в html-формате&lt;br /&gt;
# функцией print выводит результат работы templater'а на экран.&lt;br /&gt;
===== Описание check_permissions() =====&lt;br /&gt;
[[#check_permissions()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем учебный поток. Если поток не найден - возвращаем false.&lt;br /&gt;
# проверяем статус учебного потока. Если он не равен значению &amp;quot;go&amp;quot;, то возвращаем false.&lt;br /&gt;
# проверяем, имеет ли текущий пользователь права редактирования. Если нет, то возвращаем false.&lt;br /&gt;
# если все проверки пройдены успешно, то возвращаем true.&lt;br /&gt;
===== Описание get_all_form() =====&lt;br /&gt;
Возвращает объект формы для вставки в templater. Таблица в шаблоне формируется по столбцам, т. е. сначала выводится контрольная точка в тем. планировании, а затем оценки всех учеников за это событие (как при заполнении обычного школьного журнала).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $editid (int) - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid (int) - id редактируемого учебного события в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) объект нужной структуры для построения шаблона&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собираем в объект все стандартные надписи для таблицы&lt;br /&gt;
# собираем все запланированные активные контрольные точки учебного потока&lt;br /&gt;
# создадим массивы для названий месяцев и дат&lt;br /&gt;
# собираем в массив информацию по ученикам. Если параметр $editid не равен нулю, то в столбце оценок для редактируемой даты вместо оценки выводим форму.&lt;br /&gt;
# собираем в результурующий массив названия месяцев и дат &lt;br /&gt;
# если нужно распечатать форму - устанавливаем стандартные html-теги начала и конца формы&lt;br /&gt;
# возвращаем результат&lt;br /&gt;
&lt;br /&gt;
===== Описание get_cell_form() =====&lt;br /&gt;
Возвращает редактируемую ячейку таблицы журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons.&lt;br /&gt;
* $cpassedid (int) - id учебной программы&lt;br /&gt;
* $oldgrade (int) - старая оценка (если есть). По умолчанию null.&lt;br /&gt;
* $gradeid (int) - id оценки в таблице cpgrades . По умолчанию 0&lt;br /&gt;
* $eventid (int) - id учебного события в таблице [[Разработка:storages/schevents|schevents]].&lt;br /&gt;
* $scale (string) - шкала всех возможных оценок через запятую. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с html-кодом формы редактирования оценки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Вся форма редактирования оценки представляет собой маленькую таблицу. С левой стороны находится форма выбора оценки, а справа галочка для отметки отсутствующего ученика (верхняя ячейка) и пояснение к ней (нижняя ячейка).&lt;br /&gt;
# получаем все допустимые варианты оценок для данного задания из параметра scale.&lt;br /&gt;
# из этих вариантов оценки составляем html-элемент формы типа SELECT.&lt;br /&gt;
# если за задание уже есть ранее выставленная, старая оценка, то делаем ее оценкой по умолчанию&lt;br /&gt;
# узнаем статус присутствия ученика на занятии, и в зависимсости от этого проставляем галочку над буквой &amp;quot;н&amp;quot;. Форма с возможностью отмечания отсутствующих учеников отображается только для контрольных точек для которых есть события.&lt;br /&gt;
# возвращаем результат одной строкой.&lt;br /&gt;
===== Описание get_cell_string() =====&lt;br /&gt;
Получить текстовое содержимое ячейки оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий данные об элементе тематического планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - данные об оценке По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) html-код оценки, либо специальный знак пробела, чтобы в таблице было видно пустую ячейку&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
# узнаем данные о посещаемости: получаем id события, если оно есть&lt;br /&gt;
#* если событие есть, узнаем, был ли ученик на занятии&lt;br /&gt;
# находим оценку&lt;br /&gt;
#* если ученик был на занятии и получил оценку - выводим оценку&lt;br /&gt;
#* если ученик был на занятии и не получил оценку - выводим символ пробела&lt;br /&gt;
#* если ученик отсутствовал на занятии и нет оценки, то выводим букву &amp;quot;н&amp;quot;&lt;br /&gt;
#* если ученик отсутствовал на занятии и получил оценку - выводим оценку, и букву &amp;quot;н&amp;quot; рядом с ней&lt;br /&gt;
&lt;br /&gt;
===== Описание get_one_cell() =====&lt;br /&gt;
Возвращает данные в одной клетке журнала. Определяет какой тип ячейки выводить: для редактирования или текстовую.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий контрольную точку с событием  из тем. планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - объект содержащий данные об оценке (таблица cpgrades)&lt;br /&gt;
* $cpassedid (int) - id подписки (таблица cpassed)&lt;br /&gt;
* $editid (int) - id редактируемого в текущий момент элемента из тем. планирования&lt;br /&gt;
* $eventid (int) - id редактируемого в текущий момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
* $scale (string) = По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с html-кодом формы редактирования оценки, либо сама оценка, либо статус &amp;quot;отсутствовал&amp;quot;&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# сравниваем, совпадают ли id выводимой и редактируемой в данной момент контрольной точки&lt;br /&gt;
#* если id совпадают - то выводим форму редактирования оценки&lt;br /&gt;
#** если за это задание оценка уже была ранее выставлена, то выводим форму с установленной ранее оценкой&lt;br /&gt;
#** если за задание еще нет оценки - то выводим форму без предустановленных значений&lt;br /&gt;
#* если id не совпадают то выводим оценку текстом (либо статус &amp;quot;отсутствовал&amp;quot;, либо пустую клетку, в зависимости от того был ли ученик на уроке, и получил ли он оценку)&lt;br /&gt;
===== Описание get_line_for_student() =====&lt;br /&gt;
Возвращает строку таблицы журнала для одного ученика.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $i (int) - порядковый номер ученика в группе&lt;br /&gt;
* $student (object) - объект с данными об ученике из таблицы persons&lt;br /&gt;
* $cpasseds (array) - массив объектов, содержащий все подписки учеников этого потока&lt;br /&gt;
* $plans (array) -  массив объектов, содержащий все контрольные точки текущего курса (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (или 0, если события нет) Таблица [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - информация об ученике: его ФИО, и оценки по всем контрольным точкам, а также сведения о посещаемости&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в соответствующие поля итогового объекта порядковый номер ученика, и его ФИО&lt;br /&gt;
# перебираем все переданные подписки ищем ту, которая относится к переданному ученику&lt;br /&gt;
# записываем в итоговый объект id его подписки&lt;br /&gt;
# создаем массив для оценок и собираем оценки ученика:&lt;br /&gt;
#* перебираем все контрольные переданные точки ($plans)&lt;br /&gt;
#* для каждой контрольной точки создаем объект оценки&lt;br /&gt;
#* получаем значение оценки за просматриваемую контрольную точку&lt;br /&gt;
#* при помощи функции [[Разработка:im/journal#Описание get_one_cell()|get_one_cell()]] получаем оформленный html-код оценки&lt;br /&gt;
#* записываем полученный объект в массив оценок&lt;br /&gt;
# добавляем массив оценок в итоговый объект&lt;br /&gt;
# возвращаем итоговый объект&lt;br /&gt;
===== Описание get_lines_for_students() =====&lt;br /&gt;
Возвращает массив строк с ФИО и оценками для всех учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans (array) - массив всех контрольных точек учебного потока из таблицы plans&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) информация о всех учениках учебного потока или false, если ни одного ученика нет&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все подписки учебного потока, чтобы потом установить связи с оценками&lt;br /&gt;
# получаем учеников учебного потока&lt;br /&gt;
# присваиваем каждому ученику порядковый номер,&lt;br /&gt;
# получаем информацию по каждому ученику функцией [[#Описание get_line_for_student()|get_line_for_student()]] и заносим объект с информацией о нем в массив&lt;br /&gt;
# возвращаем получившийся массив &lt;br /&gt;
===== Описание create_datesstring() =====&lt;br /&gt;
Создает верхнюю строку журнала с названиями месяцев и списком дат в пригодном для обработки плагином templater виде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - список всех контрольных точек учебного потока из таблицы [[Разработка:storages/plans|plans]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий массив с данными для шаблонизатора&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Даты в электронном журнале должны будут проставляться как и в обычном классном журнале: верхняя строка - месяцы обучения, нижняя строка - даты проведенных или запланированных уроков, а также четвертные или годовые оценки.&lt;br /&gt;
Для того чтобы организовать такой внешний вид для электронного журнала мы должны воспользоваться параметром colspan для html-таблицы журнала, и расположить тем самым месяцы точно над датами проведенных уроков. Для этой задачи в этой функции мы создаем объект следующей структуры:&lt;br /&gt;
* ''(возвращаемый объект)''&lt;br /&gt;
** ''monthtitle'' - массив объектов, каждый из которых имеет свойства ''mtitle'' - название месяца, и ''mcolspan'' - количество ячеек с датами проведенных уроков в этом месяце&lt;br /&gt;
** ''monthdate'' - строка с датой проведенного урока, либо название контрольной точки.&lt;br /&gt;
&lt;br /&gt;
# получаем строку форматированных дат уроков при помощи функции [[#Описание generate_all_dates()|generate_all_dates()]]&lt;br /&gt;
# перебираем все события и собираем массивы дат и названий месяцев&lt;br /&gt;
#* если просматриваемая дата не находится в том же месяце, что и предыдущая, то дополняем массив месяцев&lt;br /&gt;
# прибавляем счетчик дат в месяце&lt;br /&gt;
# записываем новую дату в итоговый массив&lt;br /&gt;
# возвращаем итоговый массив&lt;br /&gt;
===== Описание generate_all_dates() =====&lt;br /&gt;
Вызывается из [[#Описание create_datesstring()|create_datesstring()]]. Получить отформатированные даты для журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - массив всех контрольных точек учебного потока (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - отформатированные даты для вывода в журнал&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получим событие из таблицы schevents, которое относится к данной теме тематического планирования&lt;br /&gt;
# если событие есть - то покажем дату&lt;br /&gt;
# если события нет - только название контрольной точки&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_single_date() =====&lt;br /&gt;
Вызывается из [[#Описание generate_all_dates|generate_all_dates]] Создает один объект даты для журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plan (object) - объект из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $date (string) - метка времени для события или контрольной точки&lt;br /&gt;
* $event (object) - Объект из таблицы [[Разработка:storages/schevents|schevents]]. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) дата в нужном для templater'a формате&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# устанавливаем путь (html-якорь) к теме в планирования на странице&lt;br /&gt;
# Определяем, id события которое будет редактировано. Если события нет, то передаем 0.&lt;br /&gt;
# записываем якорь с ссылкой в объект&lt;br /&gt;
# возвращаем объект&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
===== Описание get_topics() =====&lt;br /&gt;
Возвращает массив объектов c необходимыми свойствами для вставки в таблицу schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив тем входящих в планирование&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все контрольные точки учебного потока&lt;br /&gt;
# формируем объект с нужными полями для каждой контрольной точки&lt;br /&gt;
# возвращаем получившийся массив объектов&lt;br /&gt;
===== Описание get_empty_topic() =====&lt;br /&gt;
Возвращает &amp;quot;пустой&amp;quot; объект отчета об уроке &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект для вставки в таблицу [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* создаем объект с необходимым списком пустых полей и возвращаем его&lt;br /&gt;
===== Описание table_data() =====&lt;br /&gt;
Возвращает массив строк данных отформатированных для вывода с помощью moodle-функции print_table()&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив с данными для распечатки таблицы, либо false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли для переданного потока элементы тематического планирования.&lt;br /&gt;
#* если их нет - то возвращаем false&lt;br /&gt;
# формируем массив строк таблицы&lt;br /&gt;
# проставляем html-якоря для каждой контрольной точки на странице оценок&lt;br /&gt;
# добавляем ссылки на редактирования элементов учебного плана&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
===== Описание get_topic() =====&lt;br /&gt;
[[#get_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Проверяем, указан ли id контрольной точки. &lt;br /&gt;
** Если не указан - возврящаем пустую тему.&lt;br /&gt;
** Если указан - пробуем извлечь контрольную точку по такому id&lt;br /&gt;
*** Если контрольную точку извлечь не удалось - то возвращаем false&lt;br /&gt;
*** Если удалось - то возвращаем заполненный отчет об уроке&lt;br /&gt;
===== Описание save_topic() =====&lt;br /&gt;
[[#save_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем есть ли у нас данные в переменной $event для обновления или создания события. Если нет - то возвращаем false.&lt;br /&gt;
# определяем тип действия, которое надо совершить&lt;br /&gt;
#* если указан planid для события - то создаем новое событие для существующей контрольной точки&lt;br /&gt;
#* если нет id для контрольной точки - создаем новое событие и новую контрольную точку&lt;br /&gt;
#* в остальных случаях - обновляем контрольную точку и событие: вычисляем новую относительную дату, и обновляем записи в таблицах [[Разработка:storages/schevents|schevents]] и [[Разработка:storages/plans|plans]]&lt;br /&gt;
===== Описание create_topic() =====&lt;br /&gt;
[[#create_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем новый элемент тематического планирования в таблице plans (если это не удалось - то возвращаем false)&lt;br /&gt;
# добавляем в переданное событие id контрольной точки&lt;br /&gt;
# создаем событие из переданного объекта $event (если событие не создано - удаляем ранее созданный элемент тематического планирования)&lt;br /&gt;
# возвращаем id события&lt;br /&gt;
===== Описание create_checkpoint() =====&lt;br /&gt;
Создает и сохраняет запись в таблице plans&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $point (object) - данные для сохранения в таблицу [[Разработка:storages/plans|plans]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи или false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем дату начала обучения&lt;br /&gt;
# создаем заготовку для объекта контрольной точки&lt;br /&gt;
# вычисляем относительную дату контрольной точки&lt;br /&gt;
# заносим данные в базу&lt;br /&gt;
===== Описание create_event() =====&lt;br /&gt;
Создает объект события и сохраняет его в schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $event (object) - данные для сохранения&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи в таблице событий или false.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем id преподавателя в таблице persons&lt;br /&gt;
# создаем объект нужного формата и заносим туда все данные&lt;br /&gt;
# записываем данные в базу&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* csid - id учебного потока в таблице сstreams&lt;br /&gt;
===== Описание get_checkpoints() =====&lt;br /&gt;
Получить все контрольные точки одного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив объектов из таблицы plans или false &lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id учебного потока из таблицы cstreams&lt;br /&gt;
# выбираем из таблицы plans все записи, у которых поле cstreamid равно id учебного потока, и тип связи &amp;quot;cstreams&amp;quot;&lt;br /&gt;
# сортируем их в хронологическом порядке&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
&lt;br /&gt;
===== Описание get_students() =====&lt;br /&gt;
Получить всех учеников указанного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив записей из таблицы persons или false&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем список пройденных дисциплин&lt;br /&gt;
# перебираем все подписки и запоминаем id ученика для каждой из них&lt;br /&gt;
# извлекаем из таблицы persons учеников, чьи id были извлечены из подписок&lt;br /&gt;
&lt;br /&gt;
===== Описание get_teacherid() =====&lt;br /&gt;
Получить id преподавателя учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id преподавателя или false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* id преподавателя всегда берется только из записи учебного потока из таблицы cstreams&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* gradedata - (object) все оценки и сопутствующая им информация&lt;br /&gt;
* mypost - (array) непроверенные данные пришедшие из массива $_POST. Используются только для составления повторного запроса на сохранение данных.&lt;br /&gt;
===== Описание __construct =====&lt;br /&gt;
[[#Класс dof_im_journal_rawdata|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект, в который мы будем складывать все проверенные данные, пришедшие из формы&lt;br /&gt;
# проверяем скалярные данные: все числовые идентификаторы, и отдельные строки, и после проверки записываем их в итоговый объект&lt;br /&gt;
# теперь, зная cstreamid из проверенных скалярных данных вызываем родительский конструктор&lt;br /&gt;
# проверяем массивы, пришедшие из формы: &lt;br /&gt;
#* данные об отсутствующих учениках&lt;br /&gt;
#* массив оценок &lt;br /&gt;
#* массив идентификаторов подписок (таблица cpassed)&lt;br /&gt;
#* узнаем id оценок для изменения их статуса&lt;br /&gt;
# записываем все проверенные данные в итоговый массив&lt;br /&gt;
# определяем тип действия, которое надо совершить: &lt;br /&gt;
#* сохранить данные&lt;br /&gt;
#* сохранить данные и продолжить редактирование&lt;br /&gt;
#* восстановить исходные значения&lt;br /&gt;
# записываем исходный массив (непроверенный) в поле объекта, если потом понадобится еще раз отправить данные после подтверждения&lt;br /&gt;
===== Описание process_form() =====&lt;br /&gt;
[[#process_form()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# в самом начале проверяем тип действия, которое надо совершить. Если этим действием является &amp;quot;отменить изменения&amp;quot;, то не переходим к сохранению оценок и сразуже выполняем перенаправление на страницу журнала. В остальных случаях идем дальше:&lt;br /&gt;
# проверяем, установлено ли у кого-нибудь из учеников одновременно &amp;quot;н&amp;quot; и оценка. Если это так - то перенаправим пользователя на страницу с сообщением об этом, и попросим его подтвердить такой выбор.&lt;br /&gt;
#* если пользователь согласен с изменениями, которые он сделал, то все выставленые им оценки и сведения о посещаемости сохраняются&lt;br /&gt;
#* если же нет - то происходит отмена всех изменений&lt;br /&gt;
# в случае, когда никаких предупреждений нет - сначала формируем приказ для оценок&lt;br /&gt;
# затем приказ о посещаемости&lt;br /&gt;
# если все действия произведены успешно - производим редирект. Если же возникли ошибки - сообщаем об этом&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_order_grades() =====&lt;br /&gt;
Сформировать приказ об изменении состояния учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true если приказ успешно сформирован, и false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id подразделения в таблице departments&lt;br /&gt;
# определяем тип действия, которое нужно совершить с оценкой&lt;br /&gt;
# обращаемся к функциям выставления, либо удаления оценки&lt;br /&gt;
===== Описание order_set_grade() =====&lt;br /&gt;
Формирует приказ - установить оценку. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true в случае успеха и false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# подключаем методы работы с приказом&lt;br /&gt;
# создаем объект для записи&lt;br /&gt;
# сохраняем автора приказа, подразделение, к которому он относится, дату создания приказа&lt;br /&gt;
# добавляем данные, которые определяют назначение приказа&lt;br /&gt;
# сохраняем приказ в БД, в таблицу orders&lt;br /&gt;
# подписываем приказ&lt;br /&gt;
# исполняем приказ&lt;br /&gt;
Методы order_delete_grade и order_update_grade работают по такому же принципу.&lt;br /&gt;
===== Описание get_grades_fororder() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $type - тип действия, которое необходимо будет произвести над оценкой. Возможные значения: ''set_grade'' и ''delete_grade''.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий список оценок и все идентификаторы для формирования приказа.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в него дату, id учителя (в таблице persons) и id контрольной точки (в таблице plans&lt;br /&gt;
# перебираем все оценки из внутреннего массива с проверенными данными&lt;br /&gt;
# определяем тип действия, которое над ней нужно совершить&lt;br /&gt;
# в зависимости от типа действия (установление или удаление оценки) записываем в объект оценки нужные идентификаторы&lt;br /&gt;
# упаковываем оценки в итоговый массив и возвращаем его&lt;br /&gt;
=== Для списка журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс служит для сбора и вывода информации по всем структурным подразделениям. Информация выводится древовидно: самый верхний уровень - подразделение, затем учебные программы, затем учебные периоды, элементы учебной программы, и в самом конце - журналы учебного потока.&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $departments массив структуры&lt;br /&gt;
    array(&lt;br /&gt;
    [departmentid] =&amp;gt; obj  -&amp;gt; departmentname = 'department_name'&lt;br /&gt;
                      obj  -&amp;gt; programms = array(&lt;br /&gt;
      [programmid]   =&amp;gt; obj1 -&amp;gt; programmname = 'programm_name'&lt;br /&gt;
                        obj1 -&amp;gt; ages = array(&lt;br /&gt;
        [agenum]       =&amp;gt; obj2 -&amp;gt; agename = 'age_name'&lt;br /&gt;
                          obj2 -&amp;gt; items = array(&lt;br /&gt;
          [itemid]       =&amp;gt; obj3 -&amp;gt; itemname = 'item_name'&lt;br /&gt;
                            obj3 -&amp;gt; cstreams = array(&lt;br /&gt;
            [cstreamid]    =&amp;gt; obj4 -&amp;gt; cstreamname = 'cstream_name'&lt;br /&gt;
                                    )''// конец массива cstreams''&lt;br /&gt;
                                  )''// конец массива items''&lt;br /&gt;
                                )''// конец массива ages''&lt;br /&gt;
                              )''// конец массива programms''&lt;br /&gt;
         )''// конец общего массива''&lt;br /&gt;
    содержит данные для вставку в темплатер после добавления еще одного уровня:&lt;br /&gt;
    $fortemplater-&amp;gt;departments = $this-&amp;gt;departments;&lt;br /&gt;
В общем виде сбор данных выглядит так: &lt;br /&gt;
# сначала собирается информация по структурному подразделению (одному или нескольким), и информация по ним записывается в итоговый объект&lt;br /&gt;
# затем получаются все программы учебного подразделения, информация по ним записывается в итоговый массив&lt;br /&gt;
# извлекается и записывается в итоговый объект список учебных периодов &lt;br /&gt;
# для каждого учебного периода получаются элементы учебной программы, которые изучаются в нем&lt;br /&gt;
# для каждого элемента учебной программы получаются учебные потоки&lt;br /&gt;
# для каждого учебного потока получается его журнал&lt;br /&gt;
===== Описание set_data() =====&lt;br /&gt;
[[#set_data()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* получаем id структурного подразделения из таблицы departments.&lt;br /&gt;
** если оно есть - то получаем информацию только по нему&lt;br /&gt;
** если получили 0 вместо id подразделения - то выводим информацию по всем подразделениям&lt;br /&gt;
&lt;br /&gt;
===== Описание get_journals_department() =====&lt;br /&gt;
Возвращает журналы одного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - набор журналов &lt;br /&gt;
* (bool) - false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все программы, за которые отвечает подразделение&lt;br /&gt;
# для каждой программы получаем все ее журналы&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2090</id>
		<title>Разработка:im/journal</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2090"/>
				<updated>2011-01-12T13:18:46Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Права */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Классный журнал ==&lt;br /&gt;
В журнале можно выставлять оценки и вводить отчет о проведенном уроке.&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
Вверху страницы находится форма для выбора подразделения и кнопка &amp;quot;показать&amp;quot;. По умолчанию показывается информация по всем учебным подразделениям. При выборе конкретного учебного подразделения показывается информация только по нему.&lt;br /&gt;
&lt;br /&gt;
Вывод информации по журналам организован в виде маркированного списка следующего вида:&lt;br /&gt;
* ''Подразделение''&lt;br /&gt;
** ''Учебная программа''&lt;br /&gt;
*** ''Учебный период''&lt;br /&gt;
**** ''Предмет''&lt;br /&gt;
***** ''Учебный поток (дата_начала - дата_окончания)''&lt;br /&gt;
Каждая запись учебного потока является ссылкой на страницу журнала учебного потока.&lt;br /&gt;
=== Журнал класса ===&lt;br /&gt;
Под панелью навигации выводится надпись &amp;quot;Журнал группы&amp;quot;.&lt;br /&gt;
Ниже таблица с информацией о потоке - программа, предмет, группа, преподаватель. Справа от этой таблицы размещена  ссылка &amp;quot;Новый урок&amp;quot;. Нажатие на нее позволяет создать новый отчет об уроке. Над этой ссылкой будут выводиться сообщения об ошибках сохранения данных из таблицы оценок.&lt;br /&gt;
Ниже отображаются две таблицы - таблица оценок и, справа от нее, таблица отчетов об уроке. Обе таблицы сделаны максимально похожими на соответствующие таблицы в бумажном &amp;quot;Классном журнале&amp;quot;. Таблицы связаны друг с другом. Так, дата в таблице оценок отображаются только в том случае, если был создан отчет об уроке для этой даты. При нажатии на дату в таблице оценок, происходит перемещение к соответствующей строке отчета об уроке.&lt;br /&gt;
=== Таблица оценок. ===&lt;br /&gt;
Если таблица отчетов об уроке пуста, то в таблице оценок нет ни одной колонки с датой.&lt;br /&gt;
Если журнал заполнен, то в верхней строке отображаются названия месяцев, ниже номера дней месяцев, на которые приходились занятия. Каждое число месяца - ссылка, при нажатии на которую происходит переход на соответствующую этому дню строку таблицы отчета об уроке.&lt;br /&gt;
Сразу под числом расположен значок редактирования. Он также выполнен в виде ссылки. При нажатии на него страница перезагружается в режиме формы ввода оценок и выставления присутствия учеников на уроке, который проходил в тот день, по значку под числом которого щелкнули.&lt;br /&gt;
В колонке этого дня, напротив фамилии каждого ученика появляются два поля. Поле выбора из списка - для проставления оценки. И поле переключатель - для отметки присутствия на уроке. Об этом напоминает буква &amp;quot;н&amp;quot;, расположенная справа от него. Если ученик был на уроке, то это поле следует оставить пустым. Если не был - поставить там флажок. Для выставления оценки следует выбрать элемент из списка. После того как изменения будут сохранены, в соответствующих клетках появятся буквы &amp;quot;Н&amp;quot; или оценки. Если кому-то была выставлена и оценка и отметка об отсутствии на уроке, на против его фамилии можно будет увидеть букву &amp;quot;Н&amp;quot;. Однако перед сохранением будет выведено предупреждение о том, что выставлена оценка отсутствующему ученику. Под уведомлением будут две кнопки - &amp;quot;Продолжить&amp;quot; и &amp;quot;Отменить&amp;quot;. При нажатии на &amp;quot;Продолжить&amp;quot; сценарий сохранения будет выполнен. Нажатие на другую кнопку вызовет отмену процедуры сохранения и возврат к форме с несохраненными изменениями.&lt;br /&gt;
При переключении в режим формы под таблицей появляется надпись &amp;quot;Внимание! До нажатия кнопки &amp;quot;сохранить&amp;quot; оценки не сохраняются.&amp;quot; И три кнопки - &amp;quot;Сохранить&amp;quot;, &amp;quot;Сохранить и продолжить&amp;quot;, &amp;quot;Восстановить&amp;quot;. Нажатие на первую кнопку сохраняет изменения, сделанные в форме и перезагружает страницу в режим просмотра. Вторая - сохраняет сделанные изменения, но страница остается в режиме формы - можно продолжать ввод. Третья кнопка отменяет сделанные изменения. Все введенные,  но несохраненные данные удаляются из формы. Форма перегружается с отображением последних сохраненных изменений.&lt;br /&gt;
Если ученику была выставлена оценка, а затем отменена - в форме было выбрано пустое поле, то ранее выбранная оценка будет удалена. Если оценка была изменена, то оценка будет обновлена. Каждое из этих действий, а также выставление статуса присутствия на уроке, будет выполнено через издание приказа.&lt;br /&gt;
Если редактируется контрольная точка без события, то в форме показываеются только поля выставления оценки. Поле присутствия на уроке не показывается и статус присутствия не сохраняется.&lt;br /&gt;
Контрольная точка без события выводится в таблице оценок без даты. Вместо даты выводится название КТ.&lt;br /&gt;
Что происходит в процессе сохранения.&lt;br /&gt;
После того как нажата одна из кнопок, сохраняющая внесенные изменения происходит&lt;br /&gt;
&lt;br /&gt;
* формирование приказа регистрации присутствия учеников на уроке. В него сохраняются данные о всех учениках потока, их статусы присутствия, id события, статус присутствия на котором выставляется.&lt;br /&gt;
* применение приказа и сохранение статусов учеников в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
Если были выставлены оценки. То в дополнение к вышеописанным действиям происходят следующие действия:&lt;br /&gt;
* формирование приказа регистрации выставления оценок только тем ученикам, которые их получили на уроке. В приказе сохраняются: точное время выставления оценки, id КТ, за которую выставлена оценка, id преподавателя (из /storage/persons), который выставил оценку, ученики, которые получили оценку, и соответствующие им оценки, статус оценки, id подписки ученика на поток.&lt;br /&gt;
* применение приказа и сохранение оценок в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
После создания отчета об уроке, происходит возврат на главную страницу журнала и таблица оценок загружается в режиме формы того дня, отчет для которого был создан. Если этот день выходит за границы видимости окна, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой. После редактирования отчета об уроке таблица оценок загружается в режиме просмотра. Если день, для которого происходило редактирование отчета выходит за границы видимости, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой.&lt;br /&gt;
&lt;br /&gt;
=== Таблица отчетов об уроках. ===&lt;br /&gt;
Представляет собой таблицу из шести столбцов.&lt;br /&gt;
Первый столбец - порядковый номер урока. Второй - дата урока в фомате дд.мм. Третий - тема урока - произвольный текст. Четвертый - задание на дом. Пятый - замена урока или преподавателя. Пятый - заметки об уроке. В настоящее время три последних поля не используются.&lt;br /&gt;
Уроки сортируются по датам, сверху вниз по возрастанию.&lt;br /&gt;
Под датой располагается значок редактирования информации об уроке, выполненный в виде ссылки. При щелчке по нему открывается новая страница с формой редактирования отчета об уроке. Все поля формы заполнены соответствующей информацией. Ее можно изменить, а изменения сохранить.&lt;br /&gt;
Эта же страница открывается при щелчке по ссылке &amp;quot;Новый урок&amp;quot;.&lt;br /&gt;
=== Страница редактирования урока. ===&lt;br /&gt;
Вверху страницы, под строкой навигации, выводится надпись &amp;quot;Классный журнал&amp;quot;.&lt;br /&gt;
Ниже выводится форма ввода информации об уроке - &amp;quot;Отчет об уроке&amp;quot;. В поле &amp;quot;Дата проведения урока&amp;quot; нужно выбрать дату урока. В поле &amp;quot;Элементы темплана&amp;quot; можно выбрать тему для нового урока. Ниже находится текстовое поле ввода &amp;quot;Что пройдено на уроке&amp;quot;. Сюда можно ввести тему урока вручную.&lt;br /&gt;
Еще ниже поле &amp;quot;Домашнее задание&amp;quot; для ввода соответствующей информации.&lt;br /&gt;
В самом низу расположены две кнопки - &amp;quot;Сохранить&amp;quot; и &amp;quot;Отмена&amp;quot;. При нажатии на вторую происходит возврат на главную страницу журнала без сохранения внесенных изменений. После нажатия на кнопку &amp;quot;Сохранить&amp;quot; происходит сохранение введенных данных в соответствующих таблицах. О результатах операции сохранения информирует надпись, выводимая под кнопками. Еще ниже появляется ссылка &amp;quot;назад&amp;quot; для возврата на главную страницу журнала. В случае возврата после сохранения данных, таблица оценок загружается в режиме редактирования данных на дату только что сохраненного урока.&lt;br /&gt;
Правее формы редактирования урока расположено окно с полосами прокрутки, в котором можно просмотреть темы уже проведенных уроков.&lt;br /&gt;
Они выводятся в видет таблицы из двух столбцов, в которых указываются соответственно дата и тема урока.&lt;br /&gt;
В зависимости от заполненности полей ввода возможны разные варианты обработки введенных данных.&lt;br /&gt;
&lt;br /&gt;
{|border=1&lt;br /&gt;
 |id КТ&lt;br /&gt;
 |id темы, выбранной из списка.&lt;br /&gt;
 |как обрабатывается&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |создается новая КТ и новое событие.&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |выбрана из списка&lt;br /&gt;
 |создается новое событие, привязанное к КТ, выбранной из списка&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и равна id КТ&lt;br /&gt;
 |обновляем КТ и (если изменяется дата) все события, которые ей соответствуют.&lt;br /&gt;
Тему из списка &amp;quot;Элементы темтемплана&amp;quot; выбрать нельзя.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и не равна id КТ&lt;br /&gt;
 |такая ситуация запрещена.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |0&lt;br /&gt;
 |такая ситуация запрещена&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ведомость итоговых оценок ===&lt;br /&gt;
На данной странице можно выставить итоговые оценки учащимся и завершить обучение потока. Страница принимает обязательный параметр id - id идущего  или завершенного потока.&lt;br /&gt;
&lt;br /&gt;
Вверху страныцы отображается форма, где отображены ученики, которые обучаются на данном потоке. Напротив каждого можно выбрать итоговую оценку, выставляемую учащемуся. Итоговые оценки берутся из шкалы дисциплины приписанной к данному потоку. Под ведомостью стоит галочка подтвержения оценок, без нее оценки не сохранятся. Делее стоит галочка завершения обучения если необходимо завершить поток, При завершении потока все подписки на дисциплину переводятся в один из конечных статусов. Если поток уже завершен, то галочка не показывается, вместо нее предупреждение. После завершения потока оценки также можно выставить, но они уже будут идти как переэкзаменовка. &lt;br /&gt;
&lt;br /&gt;
После того как мы выставили оценки и нажали на кнопку сохранить формируется приказ о выставленни итоговых оценок. На основе этого приказа сохраняются оценки, после чего на новой странице показывается шаблон ведомости в том виде, в котом она будет распечатана. &lt;br /&gt;
После первого сохранения оценок эта ведомость также становится доступна для печати. &lt;br /&gt;
&lt;br /&gt;
Перейти на эту страницу можно со страницы Журнала группы.&lt;br /&gt;
&lt;br /&gt;
==Права==&lt;br /&gt;
&lt;br /&gt;
* '''datamanage''' - глобальное право&lt;br /&gt;
* '''view_journal''' - право на просмотр журнала предмето-потока&lt;br /&gt;
* '''view_all_journals''' - право на просмотр журнала предмето-потока&lt;br /&gt;
* '''view_all_journals_department''' - право на просмотр всех журналов подразделения&lt;br /&gt;
* '''can_complete_lesson''' - право на отметить проведение урока&lt;br /&gt;
* '''create_schevent''' - право на создание события&lt;br /&gt;
* '''edit_schevent''' - право на редактирование события&lt;br /&gt;
* '''control_journal''' - право на проверку журнала&lt;br /&gt;
* '''give_grade''' - право на проверку журнала&lt;br /&gt;
* '''give_itog_grades''' - право выставить итоговые оценки&lt;br /&gt;
* '''view_events''' - право просматривать свое рассписание&lt;br /&gt;
* '''give_attendance''' - право просматривать свое рассписание (только для завуча или ответственного преподавателя)&lt;br /&gt;
* '''give_theme_event''' - право указать тему для события (только если событие в статусе &amp;quot;запланирован&amp;quot; или &amp;quot;заменено другим событием&amp;quot;, а пользователь - завуч или ответственный преподаватель)&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
В этом разделе описаны функции для работы со страницами &amp;quot;журнал группы&amp;quot; и &amp;quot;список журналов&amp;quot;. Здесь содержится только краткое описание функций и их параметров. Если вас интересует их внутренняя логика, то обратитесь к разделу [[Разработка:im/journal#Подробное описание работы функций|Подробное описание]]. Аргументы всех функций перечислены именно в том порядке, в котором их следует передавать.&lt;br /&gt;
=== Журнал группы ===&lt;br /&gt;
В этом разделе собраны все функции, которые относятся к странице &amp;quot;журнал группы&amp;quot;&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
Класс отрисовки школьного журнала&lt;br /&gt;
===== print_texttable() =====&lt;br /&gt;
Вывести страницу журнала - просмотр оценок, или редактирование&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $editid  - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid - id учебного события, которое будет редактировано (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* null&lt;br /&gt;
===== check_permissions() =====&lt;br /&gt;
Проверяет разрешения на редактирование оценок для текущего пользователя&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true/false - есть или нет разрешения на редактирование оценок&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
Класс для отрисовки таблицы тематического планирования в классном журнале&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
 &lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Выводит таблицу тематического планирования на экран&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
Класс для создания или редактирования одной темы на странице планирования уроков&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $planid - id элемента учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
* $eventid - id учебного события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== get_topic() =====&lt;br /&gt;
Возвращает объект с полями, необходимыми для заполнения формы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - объект с полями для вставки в форму, или false в случае ошибки&lt;br /&gt;
===== create_topic() =====&lt;br /&gt;
Создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint - контрольная точка из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event - заранее заготовленный объект для таблицы [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи из таблицы schevents или false в случае ошибки&lt;br /&gt;
===== save_topic() =====&lt;br /&gt;
Обновляет существующий или создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint (object) - объект для обновления или создания записи в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event (object) - объект для обновления или создания записи в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true, если все записи успешно обновлены&lt;br /&gt;
* (int), id новой записи, если она была добавлена&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Формирует таблицу тематического планирования в правой части страницы журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
===== get_anchor_id() =====&lt;br /&gt;
Возвращает метку времени, которая будет создана для нового урока, чтобы осуществить корректное перенаправление на страницу журнала&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $time - (int) время создания нового события: метка времени в формате unixtime&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - метка времени для перенаправления&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
Класс для подготовки сырых исходных данных для формирования школьного журнала и ему подобных документов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор - определяет с каким учебным потоком будет вестись работа&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
Класс для проверки и обработки оценок из формы&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор класса. Осуществляет все проверки и записывает данные во внутреннее поле.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $gradedata (array) - массив $_POST из формы&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== process_form() =====&lt;br /&gt;
Обработать все данные, пришедшие из формы: установить посещаемость, выставить оценки и сформировать приказы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* false в случае неудачи. В случае успеха производит редирект на страницу журнала&lt;br /&gt;
==== Класс dof_im_journal_presence ====&lt;br /&gt;
Класс для обработки информации о посещаемости &lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== presence_students() =====&lt;br /&gt;
Формирует массив присутствия учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
===== absence_students() =====&lt;br /&gt;
Формирует массив отсутствующих студентов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $away - массив id отсутствующих учеников&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
==== Дополнительные функции ====&lt;br /&gt;
===== dof_im_journal_format_date() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времення для преобразования.&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'.&lt;br /&gt;
* $url (string) - Указывается, если необходимо получить дату как ссылку. По умолчанию NULL&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с отформатированной датой&lt;br /&gt;
===== dof_im_journal_date_edit() =====&lt;br /&gt;
Возвращает отформатироанную дату и значок редактирования как ссылку&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времени&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'&lt;br /&gt;
* $durl (string) - путь ссылки для даты, если не указана - дата выводится как просто строка. По умолчанию null.&lt;br /&gt;
* $eurl (string) - путь ссылки для значка, если не указана значок не показывается По умолчанию null.&lt;br /&gt;
* $imgsubdate (bool) - вывести значок под датой или рядом по умолчанию true (выводит значок под датой)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с отформатированной датой&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс содержит функции для работы со страницей списка журналов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
===== set_data() =====&lt;br /&gt;
Заполняет начальной информацией внутренние поля объекта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения (таблица [[Разработка:storages/departments|departments]]). По умолчанию 0.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
===== get_data() =====&lt;br /&gt;
Возвращает собранные данные&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив структурных подразделений&lt;br /&gt;
===== get_journals() =====&lt;br /&gt;
Получить все журнлы занесенных подразделений&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
== Подробное описание работы функций ==&lt;br /&gt;
В этом разделе описывается подробная работа всех публичных и внутренних методов для классов журнала. Если вам требуется только краткая справка по API, то обратитесь к разделу [[Разработка:im/journal#API|API]].&lt;br /&gt;
=== Для журнала группы ===&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
&lt;br /&gt;
===== Описание print_texttable() =====&lt;br /&gt;
[[#print_texttable()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
Итоговая функция, выводящая всю собранную информацию на экран. &lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собирает всю информацию при помощи функции [[Разработка:im/journal#Описание get_all_form()|get_all_form()]]&lt;br /&gt;
# обращается к плагину templater для представления информации в html-формате&lt;br /&gt;
# функцией print выводит результат работы templater'а на экран.&lt;br /&gt;
===== Описание check_permissions() =====&lt;br /&gt;
[[#check_permissions()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем учебный поток. Если поток не найден - возвращаем false.&lt;br /&gt;
# проверяем статус учебного потока. Если он не равен значению &amp;quot;go&amp;quot;, то возвращаем false.&lt;br /&gt;
# проверяем, имеет ли текущий пользователь права редактирования. Если нет, то возвращаем false.&lt;br /&gt;
# если все проверки пройдены успешно, то возвращаем true.&lt;br /&gt;
===== Описание get_all_form() =====&lt;br /&gt;
Возвращает объект формы для вставки в templater. Таблица в шаблоне формируется по столбцам, т. е. сначала выводится контрольная точка в тем. планировании, а затем оценки всех учеников за это событие (как при заполнении обычного школьного журнала).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $editid (int) - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid (int) - id редактируемого учебного события в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) объект нужной структуры для построения шаблона&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собираем в объект все стандартные надписи для таблицы&lt;br /&gt;
# собираем все запланированные активные контрольные точки учебного потока&lt;br /&gt;
# создадим массивы для названий месяцев и дат&lt;br /&gt;
# собираем в массив информацию по ученикам. Если параметр $editid не равен нулю, то в столбце оценок для редактируемой даты вместо оценки выводим форму.&lt;br /&gt;
# собираем в результурующий массив названия месяцев и дат &lt;br /&gt;
# если нужно распечатать форму - устанавливаем стандартные html-теги начала и конца формы&lt;br /&gt;
# возвращаем результат&lt;br /&gt;
&lt;br /&gt;
===== Описание get_cell_form() =====&lt;br /&gt;
Возвращает редактируемую ячейку таблицы журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons.&lt;br /&gt;
* $cpassedid (int) - id учебной программы&lt;br /&gt;
* $oldgrade (int) - старая оценка (если есть). По умолчанию null.&lt;br /&gt;
* $gradeid (int) - id оценки в таблице cpgrades . По умолчанию 0&lt;br /&gt;
* $eventid (int) - id учебного события в таблице [[Разработка:storages/schevents|schevents]].&lt;br /&gt;
* $scale (string) - шкала всех возможных оценок через запятую. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с html-кодом формы редактирования оценки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Вся форма редактирования оценки представляет собой маленькую таблицу. С левой стороны находится форма выбора оценки, а справа галочка для отметки отсутствующего ученика (верхняя ячейка) и пояснение к ней (нижняя ячейка).&lt;br /&gt;
# получаем все допустимые варианты оценок для данного задания из параметра scale.&lt;br /&gt;
# из этих вариантов оценки составляем html-элемент формы типа SELECT.&lt;br /&gt;
# если за задание уже есть ранее выставленная, старая оценка, то делаем ее оценкой по умолчанию&lt;br /&gt;
# узнаем статус присутствия ученика на занятии, и в зависимсости от этого проставляем галочку над буквой &amp;quot;н&amp;quot;. Форма с возможностью отмечания отсутствующих учеников отображается только для контрольных точек для которых есть события.&lt;br /&gt;
# возвращаем результат одной строкой.&lt;br /&gt;
===== Описание get_cell_string() =====&lt;br /&gt;
Получить текстовое содержимое ячейки оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий данные об элементе тематического планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - данные об оценке По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) html-код оценки, либо специальный знак пробела, чтобы в таблице было видно пустую ячейку&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
# узнаем данные о посещаемости: получаем id события, если оно есть&lt;br /&gt;
#* если событие есть, узнаем, был ли ученик на занятии&lt;br /&gt;
# находим оценку&lt;br /&gt;
#* если ученик был на занятии и получил оценку - выводим оценку&lt;br /&gt;
#* если ученик был на занятии и не получил оценку - выводим символ пробела&lt;br /&gt;
#* если ученик отсутствовал на занятии и нет оценки, то выводим букву &amp;quot;н&amp;quot;&lt;br /&gt;
#* если ученик отсутствовал на занятии и получил оценку - выводим оценку, и букву &amp;quot;н&amp;quot; рядом с ней&lt;br /&gt;
&lt;br /&gt;
===== Описание get_one_cell() =====&lt;br /&gt;
Возвращает данные в одной клетке журнала. Определяет какой тип ячейки выводить: для редактирования или текстовую.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий контрольную точку с событием  из тем. планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - объект содержащий данные об оценке (таблица cpgrades)&lt;br /&gt;
* $cpassedid (int) - id подписки (таблица cpassed)&lt;br /&gt;
* $editid (int) - id редактируемого в текущий момент элемента из тем. планирования&lt;br /&gt;
* $eventid (int) - id редактируемого в текущий момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
* $scale (string) = По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с html-кодом формы редактирования оценки, либо сама оценка, либо статус &amp;quot;отсутствовал&amp;quot;&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# сравниваем, совпадают ли id выводимой и редактируемой в данной момент контрольной точки&lt;br /&gt;
#* если id совпадают - то выводим форму редактирования оценки&lt;br /&gt;
#** если за это задание оценка уже была ранее выставлена, то выводим форму с установленной ранее оценкой&lt;br /&gt;
#** если за задание еще нет оценки - то выводим форму без предустановленных значений&lt;br /&gt;
#* если id не совпадают то выводим оценку текстом (либо статус &amp;quot;отсутствовал&amp;quot;, либо пустую клетку, в зависимости от того был ли ученик на уроке, и получил ли он оценку)&lt;br /&gt;
===== Описание get_line_for_student() =====&lt;br /&gt;
Возвращает строку таблицы журнала для одного ученика.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $i (int) - порядковый номер ученика в группе&lt;br /&gt;
* $student (object) - объект с данными об ученике из таблицы persons&lt;br /&gt;
* $cpasseds (array) - массив объектов, содержащий все подписки учеников этого потока&lt;br /&gt;
* $plans (array) -  массив объектов, содержащий все контрольные точки текущего курса (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (или 0, если события нет) Таблица [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - информация об ученике: его ФИО, и оценки по всем контрольным точкам, а также сведения о посещаемости&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в соответствующие поля итогового объекта порядковый номер ученика, и его ФИО&lt;br /&gt;
# перебираем все переданные подписки ищем ту, которая относится к переданному ученику&lt;br /&gt;
# записываем в итоговый объект id его подписки&lt;br /&gt;
# создаем массив для оценок и собираем оценки ученика:&lt;br /&gt;
#* перебираем все контрольные переданные точки ($plans)&lt;br /&gt;
#* для каждой контрольной точки создаем объект оценки&lt;br /&gt;
#* получаем значение оценки за просматриваемую контрольную точку&lt;br /&gt;
#* при помощи функции [[Разработка:im/journal#Описание get_one_cell()|get_one_cell()]] получаем оформленный html-код оценки&lt;br /&gt;
#* записываем полученный объект в массив оценок&lt;br /&gt;
# добавляем массив оценок в итоговый объект&lt;br /&gt;
# возвращаем итоговый объект&lt;br /&gt;
===== Описание get_lines_for_students() =====&lt;br /&gt;
Возвращает массив строк с ФИО и оценками для всех учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans (array) - массив всех контрольных точек учебного потока из таблицы plans&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) информация о всех учениках учебного потока или false, если ни одного ученика нет&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все подписки учебного потока, чтобы потом установить связи с оценками&lt;br /&gt;
# получаем учеников учебного потока&lt;br /&gt;
# присваиваем каждому ученику порядковый номер,&lt;br /&gt;
# получаем информацию по каждому ученику функцией [[#Описание get_line_for_student()|get_line_for_student()]] и заносим объект с информацией о нем в массив&lt;br /&gt;
# возвращаем получившийся массив &lt;br /&gt;
===== Описание create_datesstring() =====&lt;br /&gt;
Создает верхнюю строку журнала с названиями месяцев и списком дат в пригодном для обработки плагином templater виде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - список всех контрольных точек учебного потока из таблицы [[Разработка:storages/plans|plans]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий массив с данными для шаблонизатора&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Даты в электронном журнале должны будут проставляться как и в обычном классном журнале: верхняя строка - месяцы обучения, нижняя строка - даты проведенных или запланированных уроков, а также четвертные или годовые оценки.&lt;br /&gt;
Для того чтобы организовать такой внешний вид для электронного журнала мы должны воспользоваться параметром colspan для html-таблицы журнала, и расположить тем самым месяцы точно над датами проведенных уроков. Для этой задачи в этой функции мы создаем объект следующей структуры:&lt;br /&gt;
* ''(возвращаемый объект)''&lt;br /&gt;
** ''monthtitle'' - массив объектов, каждый из которых имеет свойства ''mtitle'' - название месяца, и ''mcolspan'' - количество ячеек с датами проведенных уроков в этом месяце&lt;br /&gt;
** ''monthdate'' - строка с датой проведенного урока, либо название контрольной точки.&lt;br /&gt;
&lt;br /&gt;
# получаем строку форматированных дат уроков при помощи функции [[#Описание generate_all_dates()|generate_all_dates()]]&lt;br /&gt;
# перебираем все события и собираем массивы дат и названий месяцев&lt;br /&gt;
#* если просматриваемая дата не находится в том же месяце, что и предыдущая, то дополняем массив месяцев&lt;br /&gt;
# прибавляем счетчик дат в месяце&lt;br /&gt;
# записываем новую дату в итоговый массив&lt;br /&gt;
# возвращаем итоговый массив&lt;br /&gt;
===== Описание generate_all_dates() =====&lt;br /&gt;
Вызывается из [[#Описание create_datesstring()|create_datesstring()]]. Получить отформатированные даты для журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - массив всех контрольных точек учебного потока (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - отформатированные даты для вывода в журнал&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получим событие из таблицы schevents, которое относится к данной теме тематического планирования&lt;br /&gt;
# если событие есть - то покажем дату&lt;br /&gt;
# если события нет - только название контрольной точки&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_single_date() =====&lt;br /&gt;
Вызывается из [[#Описание generate_all_dates|generate_all_dates]] Создает один объект даты для журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plan (object) - объект из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $date (string) - метка времени для события или контрольной точки&lt;br /&gt;
* $event (object) - Объект из таблицы [[Разработка:storages/schevents|schevents]]. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) дата в нужном для templater'a формате&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# устанавливаем путь (html-якорь) к теме в планирования на странице&lt;br /&gt;
# Определяем, id события которое будет редактировано. Если события нет, то передаем 0.&lt;br /&gt;
# записываем якорь с ссылкой в объект&lt;br /&gt;
# возвращаем объект&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
===== Описание get_topics() =====&lt;br /&gt;
Возвращает массив объектов c необходимыми свойствами для вставки в таблицу schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив тем входящих в планирование&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все контрольные точки учебного потока&lt;br /&gt;
# формируем объект с нужными полями для каждой контрольной точки&lt;br /&gt;
# возвращаем получившийся массив объектов&lt;br /&gt;
===== Описание get_empty_topic() =====&lt;br /&gt;
Возвращает &amp;quot;пустой&amp;quot; объект отчета об уроке &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект для вставки в таблицу [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* создаем объект с необходимым списком пустых полей и возвращаем его&lt;br /&gt;
===== Описание table_data() =====&lt;br /&gt;
Возвращает массив строк данных отформатированных для вывода с помощью moodle-функции print_table()&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив с данными для распечатки таблицы, либо false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли для переданного потока элементы тематического планирования.&lt;br /&gt;
#* если их нет - то возвращаем false&lt;br /&gt;
# формируем массив строк таблицы&lt;br /&gt;
# проставляем html-якоря для каждой контрольной точки на странице оценок&lt;br /&gt;
# добавляем ссылки на редактирования элементов учебного плана&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
===== Описание get_topic() =====&lt;br /&gt;
[[#get_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Проверяем, указан ли id контрольной точки. &lt;br /&gt;
** Если не указан - возврящаем пустую тему.&lt;br /&gt;
** Если указан - пробуем извлечь контрольную точку по такому id&lt;br /&gt;
*** Если контрольную точку извлечь не удалось - то возвращаем false&lt;br /&gt;
*** Если удалось - то возвращаем заполненный отчет об уроке&lt;br /&gt;
===== Описание save_topic() =====&lt;br /&gt;
[[#save_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем есть ли у нас данные в переменной $event для обновления или создания события. Если нет - то возвращаем false.&lt;br /&gt;
# определяем тип действия, которое надо совершить&lt;br /&gt;
#* если указан planid для события - то создаем новое событие для существующей контрольной точки&lt;br /&gt;
#* если нет id для контрольной точки - создаем новое событие и новую контрольную точку&lt;br /&gt;
#* в остальных случаях - обновляем контрольную точку и событие: вычисляем новую относительную дату, и обновляем записи в таблицах [[Разработка:storages/schevents|schevents]] и [[Разработка:storages/plans|plans]]&lt;br /&gt;
===== Описание create_topic() =====&lt;br /&gt;
[[#create_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем новый элемент тематического планирования в таблице plans (если это не удалось - то возвращаем false)&lt;br /&gt;
# добавляем в переданное событие id контрольной точки&lt;br /&gt;
# создаем событие из переданного объекта $event (если событие не создано - удаляем ранее созданный элемент тематического планирования)&lt;br /&gt;
# возвращаем id события&lt;br /&gt;
===== Описание create_checkpoint() =====&lt;br /&gt;
Создает и сохраняет запись в таблице plans&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $point (object) - данные для сохранения в таблицу [[Разработка:storages/plans|plans]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи или false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем дату начала обучения&lt;br /&gt;
# создаем заготовку для объекта контрольной точки&lt;br /&gt;
# вычисляем относительную дату контрольной точки&lt;br /&gt;
# заносим данные в базу&lt;br /&gt;
===== Описание create_event() =====&lt;br /&gt;
Создает объект события и сохраняет его в schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $event (object) - данные для сохранения&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи в таблице событий или false.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем id преподавателя в таблице persons&lt;br /&gt;
# создаем объект нужного формата и заносим туда все данные&lt;br /&gt;
# записываем данные в базу&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* csid - id учебного потока в таблице сstreams&lt;br /&gt;
===== Описание get_checkpoints() =====&lt;br /&gt;
Получить все контрольные точки одного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив объектов из таблицы plans или false &lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id учебного потока из таблицы cstreams&lt;br /&gt;
# выбираем из таблицы plans все записи, у которых поле cstreamid равно id учебного потока, и тип связи &amp;quot;cstreams&amp;quot;&lt;br /&gt;
# сортируем их в хронологическом порядке&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
&lt;br /&gt;
===== Описание get_students() =====&lt;br /&gt;
Получить всех учеников указанного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив записей из таблицы persons или false&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем список пройденных дисциплин&lt;br /&gt;
# перебираем все подписки и запоминаем id ученика для каждой из них&lt;br /&gt;
# извлекаем из таблицы persons учеников, чьи id были извлечены из подписок&lt;br /&gt;
&lt;br /&gt;
===== Описание get_teacherid() =====&lt;br /&gt;
Получить id преподавателя учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id преподавателя или false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* id преподавателя всегда берется только из записи учебного потока из таблицы cstreams&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* gradedata - (object) все оценки и сопутствующая им информация&lt;br /&gt;
* mypost - (array) непроверенные данные пришедшие из массива $_POST. Используются только для составления повторного запроса на сохранение данных.&lt;br /&gt;
===== Описание __construct =====&lt;br /&gt;
[[#Класс dof_im_journal_rawdata|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект, в который мы будем складывать все проверенные данные, пришедшие из формы&lt;br /&gt;
# проверяем скалярные данные: все числовые идентификаторы, и отдельные строки, и после проверки записываем их в итоговый объект&lt;br /&gt;
# теперь, зная cstreamid из проверенных скалярных данных вызываем родительский конструктор&lt;br /&gt;
# проверяем массивы, пришедшие из формы: &lt;br /&gt;
#* данные об отсутствующих учениках&lt;br /&gt;
#* массив оценок &lt;br /&gt;
#* массив идентификаторов подписок (таблица cpassed)&lt;br /&gt;
#* узнаем id оценок для изменения их статуса&lt;br /&gt;
# записываем все проверенные данные в итоговый массив&lt;br /&gt;
# определяем тип действия, которое надо совершить: &lt;br /&gt;
#* сохранить данные&lt;br /&gt;
#* сохранить данные и продолжить редактирование&lt;br /&gt;
#* восстановить исходные значения&lt;br /&gt;
# записываем исходный массив (непроверенный) в поле объекта, если потом понадобится еще раз отправить данные после подтверждения&lt;br /&gt;
===== Описание process_form() =====&lt;br /&gt;
[[#process_form()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# в самом начале проверяем тип действия, которое надо совершить. Если этим действием является &amp;quot;отменить изменения&amp;quot;, то не переходим к сохранению оценок и сразуже выполняем перенаправление на страницу журнала. В остальных случаях идем дальше:&lt;br /&gt;
# проверяем, установлено ли у кого-нибудь из учеников одновременно &amp;quot;н&amp;quot; и оценка. Если это так - то перенаправим пользователя на страницу с сообщением об этом, и попросим его подтвердить такой выбор.&lt;br /&gt;
#* если пользователь согласен с изменениями, которые он сделал, то все выставленые им оценки и сведения о посещаемости сохраняются&lt;br /&gt;
#* если же нет - то происходит отмена всех изменений&lt;br /&gt;
# в случае, когда никаких предупреждений нет - сначала формируем приказ для оценок&lt;br /&gt;
# затем приказ о посещаемости&lt;br /&gt;
# если все действия произведены успешно - производим редирект. Если же возникли ошибки - сообщаем об этом&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_order_grades() =====&lt;br /&gt;
Сформировать приказ об изменении состояния учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true если приказ успешно сформирован, и false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id подразделения в таблице departments&lt;br /&gt;
# определяем тип действия, которое нужно совершить с оценкой&lt;br /&gt;
# обращаемся к функциям выставления, либо удаления оценки&lt;br /&gt;
===== Описание order_set_grade() =====&lt;br /&gt;
Формирует приказ - установить оценку. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true в случае успеха и false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# подключаем методы работы с приказом&lt;br /&gt;
# создаем объект для записи&lt;br /&gt;
# сохраняем автора приказа, подразделение, к которому он относится, дату создания приказа&lt;br /&gt;
# добавляем данные, которые определяют назначение приказа&lt;br /&gt;
# сохраняем приказ в БД, в таблицу orders&lt;br /&gt;
# подписываем приказ&lt;br /&gt;
# исполняем приказ&lt;br /&gt;
Методы order_delete_grade и order_update_grade работают по такому же принципу.&lt;br /&gt;
===== Описание get_grades_fororder() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $type - тип действия, которое необходимо будет произвести над оценкой. Возможные значения: ''set_grade'' и ''delete_grade''.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий список оценок и все идентификаторы для формирования приказа.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в него дату, id учителя (в таблице persons) и id контрольной точки (в таблице plans&lt;br /&gt;
# перебираем все оценки из внутреннего массива с проверенными данными&lt;br /&gt;
# определяем тип действия, которое над ней нужно совершить&lt;br /&gt;
# в зависимости от типа действия (установление или удаление оценки) записываем в объект оценки нужные идентификаторы&lt;br /&gt;
# упаковываем оценки в итоговый массив и возвращаем его&lt;br /&gt;
=== Для списка журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс служит для сбора и вывода информации по всем структурным подразделениям. Информация выводится древовидно: самый верхний уровень - подразделение, затем учебные программы, затем учебные периоды, элементы учебной программы, и в самом конце - журналы учебного потока.&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $departments массив структуры&lt;br /&gt;
    array(&lt;br /&gt;
    [departmentid] =&amp;gt; obj  -&amp;gt; departmentname = 'department_name'&lt;br /&gt;
                      obj  -&amp;gt; programms = array(&lt;br /&gt;
      [programmid]   =&amp;gt; obj1 -&amp;gt; programmname = 'programm_name'&lt;br /&gt;
                        obj1 -&amp;gt; ages = array(&lt;br /&gt;
        [agenum]       =&amp;gt; obj2 -&amp;gt; agename = 'age_name'&lt;br /&gt;
                          obj2 -&amp;gt; items = array(&lt;br /&gt;
          [itemid]       =&amp;gt; obj3 -&amp;gt; itemname = 'item_name'&lt;br /&gt;
                            obj3 -&amp;gt; cstreams = array(&lt;br /&gt;
            [cstreamid]    =&amp;gt; obj4 -&amp;gt; cstreamname = 'cstream_name'&lt;br /&gt;
                                    )''// конец массива cstreams''&lt;br /&gt;
                                  )''// конец массива items''&lt;br /&gt;
                                )''// конец массива ages''&lt;br /&gt;
                              )''// конец массива programms''&lt;br /&gt;
         )''// конец общего массива''&lt;br /&gt;
    содержит данные для вставку в темплатер после добавления еще одного уровня:&lt;br /&gt;
    $fortemplater-&amp;gt;departments = $this-&amp;gt;departments;&lt;br /&gt;
В общем виде сбор данных выглядит так: &lt;br /&gt;
# сначала собирается информация по структурному подразделению (одному или нескольким), и информация по ним записывается в итоговый объект&lt;br /&gt;
# затем получаются все программы учебного подразделения, информация по ним записывается в итоговый массив&lt;br /&gt;
# извлекается и записывается в итоговый объект список учебных периодов &lt;br /&gt;
# для каждого учебного периода получаются элементы учебной программы, которые изучаются в нем&lt;br /&gt;
# для каждого элемента учебной программы получаются учебные потоки&lt;br /&gt;
# для каждого учебного потока получается его журнал&lt;br /&gt;
===== Описание set_data() =====&lt;br /&gt;
[[#set_data()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* получаем id структурного подразделения из таблицы departments.&lt;br /&gt;
** если оно есть - то получаем информацию только по нему&lt;br /&gt;
** если получили 0 вместо id подразделения - то выводим информацию по всем подразделениям&lt;br /&gt;
&lt;br /&gt;
===== Описание get_journals_department() =====&lt;br /&gt;
Возвращает журналы одного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - набор журналов &lt;br /&gt;
* (bool) - false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все программы, за которые отвечает подразделение&lt;br /&gt;
# для каждой программы получаем все ее журналы&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2089</id>
		<title>Разработка:im/journal</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2089"/>
				<updated>2011-01-12T13:15:28Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Права */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Классный журнал ==&lt;br /&gt;
В журнале можно выставлять оценки и вводить отчет о проведенном уроке.&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
Вверху страницы находится форма для выбора подразделения и кнопка &amp;quot;показать&amp;quot;. По умолчанию показывается информация по всем учебным подразделениям. При выборе конкретного учебного подразделения показывается информация только по нему.&lt;br /&gt;
&lt;br /&gt;
Вывод информации по журналам организован в виде маркированного списка следующего вида:&lt;br /&gt;
* ''Подразделение''&lt;br /&gt;
** ''Учебная программа''&lt;br /&gt;
*** ''Учебный период''&lt;br /&gt;
**** ''Предмет''&lt;br /&gt;
***** ''Учебный поток (дата_начала - дата_окончания)''&lt;br /&gt;
Каждая запись учебного потока является ссылкой на страницу журнала учебного потока.&lt;br /&gt;
=== Журнал класса ===&lt;br /&gt;
Под панелью навигации выводится надпись &amp;quot;Журнал группы&amp;quot;.&lt;br /&gt;
Ниже таблица с информацией о потоке - программа, предмет, группа, преподаватель. Справа от этой таблицы размещена  ссылка &amp;quot;Новый урок&amp;quot;. Нажатие на нее позволяет создать новый отчет об уроке. Над этой ссылкой будут выводиться сообщения об ошибках сохранения данных из таблицы оценок.&lt;br /&gt;
Ниже отображаются две таблицы - таблица оценок и, справа от нее, таблица отчетов об уроке. Обе таблицы сделаны максимально похожими на соответствующие таблицы в бумажном &amp;quot;Классном журнале&amp;quot;. Таблицы связаны друг с другом. Так, дата в таблице оценок отображаются только в том случае, если был создан отчет об уроке для этой даты. При нажатии на дату в таблице оценок, происходит перемещение к соответствующей строке отчета об уроке.&lt;br /&gt;
=== Таблица оценок. ===&lt;br /&gt;
Если таблица отчетов об уроке пуста, то в таблице оценок нет ни одной колонки с датой.&lt;br /&gt;
Если журнал заполнен, то в верхней строке отображаются названия месяцев, ниже номера дней месяцев, на которые приходились занятия. Каждое число месяца - ссылка, при нажатии на которую происходит переход на соответствующую этому дню строку таблицы отчета об уроке.&lt;br /&gt;
Сразу под числом расположен значок редактирования. Он также выполнен в виде ссылки. При нажатии на него страница перезагружается в режиме формы ввода оценок и выставления присутствия учеников на уроке, который проходил в тот день, по значку под числом которого щелкнули.&lt;br /&gt;
В колонке этого дня, напротив фамилии каждого ученика появляются два поля. Поле выбора из списка - для проставления оценки. И поле переключатель - для отметки присутствия на уроке. Об этом напоминает буква &amp;quot;н&amp;quot;, расположенная справа от него. Если ученик был на уроке, то это поле следует оставить пустым. Если не был - поставить там флажок. Для выставления оценки следует выбрать элемент из списка. После того как изменения будут сохранены, в соответствующих клетках появятся буквы &amp;quot;Н&amp;quot; или оценки. Если кому-то была выставлена и оценка и отметка об отсутствии на уроке, на против его фамилии можно будет увидеть букву &amp;quot;Н&amp;quot;. Однако перед сохранением будет выведено предупреждение о том, что выставлена оценка отсутствующему ученику. Под уведомлением будут две кнопки - &amp;quot;Продолжить&amp;quot; и &amp;quot;Отменить&amp;quot;. При нажатии на &amp;quot;Продолжить&amp;quot; сценарий сохранения будет выполнен. Нажатие на другую кнопку вызовет отмену процедуры сохранения и возврат к форме с несохраненными изменениями.&lt;br /&gt;
При переключении в режим формы под таблицей появляется надпись &amp;quot;Внимание! До нажатия кнопки &amp;quot;сохранить&amp;quot; оценки не сохраняются.&amp;quot; И три кнопки - &amp;quot;Сохранить&amp;quot;, &amp;quot;Сохранить и продолжить&amp;quot;, &amp;quot;Восстановить&amp;quot;. Нажатие на первую кнопку сохраняет изменения, сделанные в форме и перезагружает страницу в режим просмотра. Вторая - сохраняет сделанные изменения, но страница остается в режиме формы - можно продолжать ввод. Третья кнопка отменяет сделанные изменения. Все введенные,  но несохраненные данные удаляются из формы. Форма перегружается с отображением последних сохраненных изменений.&lt;br /&gt;
Если ученику была выставлена оценка, а затем отменена - в форме было выбрано пустое поле, то ранее выбранная оценка будет удалена. Если оценка была изменена, то оценка будет обновлена. Каждое из этих действий, а также выставление статуса присутствия на уроке, будет выполнено через издание приказа.&lt;br /&gt;
Если редактируется контрольная точка без события, то в форме показываеются только поля выставления оценки. Поле присутствия на уроке не показывается и статус присутствия не сохраняется.&lt;br /&gt;
Контрольная точка без события выводится в таблице оценок без даты. Вместо даты выводится название КТ.&lt;br /&gt;
Что происходит в процессе сохранения.&lt;br /&gt;
После того как нажата одна из кнопок, сохраняющая внесенные изменения происходит&lt;br /&gt;
&lt;br /&gt;
* формирование приказа регистрации присутствия учеников на уроке. В него сохраняются данные о всех учениках потока, их статусы присутствия, id события, статус присутствия на котором выставляется.&lt;br /&gt;
* применение приказа и сохранение статусов учеников в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
Если были выставлены оценки. То в дополнение к вышеописанным действиям происходят следующие действия:&lt;br /&gt;
* формирование приказа регистрации выставления оценок только тем ученикам, которые их получили на уроке. В приказе сохраняются: точное время выставления оценки, id КТ, за которую выставлена оценка, id преподавателя (из /storage/persons), который выставил оценку, ученики, которые получили оценку, и соответствующие им оценки, статус оценки, id подписки ученика на поток.&lt;br /&gt;
* применение приказа и сохранение оценок в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
После создания отчета об уроке, происходит возврат на главную страницу журнала и таблица оценок загружается в режиме формы того дня, отчет для которого был создан. Если этот день выходит за границы видимости окна, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой. После редактирования отчета об уроке таблица оценок загружается в режиме просмотра. Если день, для которого происходило редактирование отчета выходит за границы видимости, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой.&lt;br /&gt;
&lt;br /&gt;
=== Таблица отчетов об уроках. ===&lt;br /&gt;
Представляет собой таблицу из шести столбцов.&lt;br /&gt;
Первый столбец - порядковый номер урока. Второй - дата урока в фомате дд.мм. Третий - тема урока - произвольный текст. Четвертый - задание на дом. Пятый - замена урока или преподавателя. Пятый - заметки об уроке. В настоящее время три последних поля не используются.&lt;br /&gt;
Уроки сортируются по датам, сверху вниз по возрастанию.&lt;br /&gt;
Под датой располагается значок редактирования информации об уроке, выполненный в виде ссылки. При щелчке по нему открывается новая страница с формой редактирования отчета об уроке. Все поля формы заполнены соответствующей информацией. Ее можно изменить, а изменения сохранить.&lt;br /&gt;
Эта же страница открывается при щелчке по ссылке &amp;quot;Новый урок&amp;quot;.&lt;br /&gt;
=== Страница редактирования урока. ===&lt;br /&gt;
Вверху страницы, под строкой навигации, выводится надпись &amp;quot;Классный журнал&amp;quot;.&lt;br /&gt;
Ниже выводится форма ввода информации об уроке - &amp;quot;Отчет об уроке&amp;quot;. В поле &amp;quot;Дата проведения урока&amp;quot; нужно выбрать дату урока. В поле &amp;quot;Элементы темплана&amp;quot; можно выбрать тему для нового урока. Ниже находится текстовое поле ввода &amp;quot;Что пройдено на уроке&amp;quot;. Сюда можно ввести тему урока вручную.&lt;br /&gt;
Еще ниже поле &amp;quot;Домашнее задание&amp;quot; для ввода соответствующей информации.&lt;br /&gt;
В самом низу расположены две кнопки - &amp;quot;Сохранить&amp;quot; и &amp;quot;Отмена&amp;quot;. При нажатии на вторую происходит возврат на главную страницу журнала без сохранения внесенных изменений. После нажатия на кнопку &amp;quot;Сохранить&amp;quot; происходит сохранение введенных данных в соответствующих таблицах. О результатах операции сохранения информирует надпись, выводимая под кнопками. Еще ниже появляется ссылка &amp;quot;назад&amp;quot; для возврата на главную страницу журнала. В случае возврата после сохранения данных, таблица оценок загружается в режиме редактирования данных на дату только что сохраненного урока.&lt;br /&gt;
Правее формы редактирования урока расположено окно с полосами прокрутки, в котором можно просмотреть темы уже проведенных уроков.&lt;br /&gt;
Они выводятся в видет таблицы из двух столбцов, в которых указываются соответственно дата и тема урока.&lt;br /&gt;
В зависимости от заполненности полей ввода возможны разные варианты обработки введенных данных.&lt;br /&gt;
&lt;br /&gt;
{|border=1&lt;br /&gt;
 |id КТ&lt;br /&gt;
 |id темы, выбранной из списка.&lt;br /&gt;
 |как обрабатывается&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |создается новая КТ и новое событие.&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |выбрана из списка&lt;br /&gt;
 |создается новое событие, привязанное к КТ, выбранной из списка&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и равна id КТ&lt;br /&gt;
 |обновляем КТ и (если изменяется дата) все события, которые ей соответствуют.&lt;br /&gt;
Тему из списка &amp;quot;Элементы темтемплана&amp;quot; выбрать нельзя.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и не равна id КТ&lt;br /&gt;
 |такая ситуация запрещена.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |0&lt;br /&gt;
 |такая ситуация запрещена&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ведомость итоговых оценок ===&lt;br /&gt;
На данной странице можно выставить итоговые оценки учащимся и завершить обучение потока. Страница принимает обязательный параметр id - id идущего  или завершенного потока.&lt;br /&gt;
&lt;br /&gt;
Вверху страныцы отображается форма, где отображены ученики, которые обучаются на данном потоке. Напротив каждого можно выбрать итоговую оценку, выставляемую учащемуся. Итоговые оценки берутся из шкалы дисциплины приписанной к данному потоку. Под ведомостью стоит галочка подтвержения оценок, без нее оценки не сохранятся. Делее стоит галочка завершения обучения если необходимо завершить поток, При завершении потока все подписки на дисциплину переводятся в один из конечных статусов. Если поток уже завершен, то галочка не показывается, вместо нее предупреждение. После завершения потока оценки также можно выставить, но они уже будут идти как переэкзаменовка. &lt;br /&gt;
&lt;br /&gt;
После того как мы выставили оценки и нажали на кнопку сохранить формируется приказ о выставленни итоговых оценок. На основе этого приказа сохраняются оценки, после чего на новой странице показывается шаблон ведомости в том виде, в котом она будет распечатана. &lt;br /&gt;
После первого сохранения оценок эта ведомость также становится доступна для печати. &lt;br /&gt;
&lt;br /&gt;
Перейти на эту страницу можно со страницы Журнала группы.&lt;br /&gt;
&lt;br /&gt;
==Права==&lt;br /&gt;
&lt;br /&gt;
* '''datamanage''' - глобальное право&lt;br /&gt;
* '''view_journal''' - право на просмотр журнала предмето-потока&lt;br /&gt;
* '''view_all_journals''' - право на просмотр журнала предмето-потока&lt;br /&gt;
* '''view_all_journals_department''' - право на просмотр всех журналов подразделения&lt;br /&gt;
* '''can_complete_lesson''' - право на отметить проведение урока&lt;br /&gt;
* '''create_schevent''' - право на создание события&lt;br /&gt;
* '''edit_schevent''' - право на редактирование события&lt;br /&gt;
* '''control_journal''' - право на проверку журнала&lt;br /&gt;
* '''give_grade''' - право на проверку журнала&lt;br /&gt;
* '''give_itog_grades''' - право выставить итоговые оценки&lt;br /&gt;
* '''view_events''' - право просматривать свое рассписание&lt;br /&gt;
* '''give_attendance''' - право просматривать свое рассписание (только завуч или ответственный преподаватель)&lt;br /&gt;
* '''give_theme_event''' - право указать тему для события&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
В этом разделе описаны функции для работы со страницами &amp;quot;журнал группы&amp;quot; и &amp;quot;список журналов&amp;quot;. Здесь содержится только краткое описание функций и их параметров. Если вас интересует их внутренняя логика, то обратитесь к разделу [[Разработка:im/journal#Подробное описание работы функций|Подробное описание]]. Аргументы всех функций перечислены именно в том порядке, в котором их следует передавать.&lt;br /&gt;
=== Журнал группы ===&lt;br /&gt;
В этом разделе собраны все функции, которые относятся к странице &amp;quot;журнал группы&amp;quot;&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
Класс отрисовки школьного журнала&lt;br /&gt;
===== print_texttable() =====&lt;br /&gt;
Вывести страницу журнала - просмотр оценок, или редактирование&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $editid  - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid - id учебного события, которое будет редактировано (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* null&lt;br /&gt;
===== check_permissions() =====&lt;br /&gt;
Проверяет разрешения на редактирование оценок для текущего пользователя&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true/false - есть или нет разрешения на редактирование оценок&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
Класс для отрисовки таблицы тематического планирования в классном журнале&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
 &lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Выводит таблицу тематического планирования на экран&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
Класс для создания или редактирования одной темы на странице планирования уроков&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $planid - id элемента учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
* $eventid - id учебного события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== get_topic() =====&lt;br /&gt;
Возвращает объект с полями, необходимыми для заполнения формы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - объект с полями для вставки в форму, или false в случае ошибки&lt;br /&gt;
===== create_topic() =====&lt;br /&gt;
Создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint - контрольная точка из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event - заранее заготовленный объект для таблицы [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи из таблицы schevents или false в случае ошибки&lt;br /&gt;
===== save_topic() =====&lt;br /&gt;
Обновляет существующий или создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint (object) - объект для обновления или создания записи в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event (object) - объект для обновления или создания записи в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true, если все записи успешно обновлены&lt;br /&gt;
* (int), id новой записи, если она была добавлена&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Формирует таблицу тематического планирования в правой части страницы журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
===== get_anchor_id() =====&lt;br /&gt;
Возвращает метку времени, которая будет создана для нового урока, чтобы осуществить корректное перенаправление на страницу журнала&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $time - (int) время создания нового события: метка времени в формате unixtime&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - метка времени для перенаправления&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
Класс для подготовки сырых исходных данных для формирования школьного журнала и ему подобных документов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор - определяет с каким учебным потоком будет вестись работа&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
Класс для проверки и обработки оценок из формы&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор класса. Осуществляет все проверки и записывает данные во внутреннее поле.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $gradedata (array) - массив $_POST из формы&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== process_form() =====&lt;br /&gt;
Обработать все данные, пришедшие из формы: установить посещаемость, выставить оценки и сформировать приказы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* false в случае неудачи. В случае успеха производит редирект на страницу журнала&lt;br /&gt;
==== Класс dof_im_journal_presence ====&lt;br /&gt;
Класс для обработки информации о посещаемости &lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== presence_students() =====&lt;br /&gt;
Формирует массив присутствия учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
===== absence_students() =====&lt;br /&gt;
Формирует массив отсутствующих студентов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $away - массив id отсутствующих учеников&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
==== Дополнительные функции ====&lt;br /&gt;
===== dof_im_journal_format_date() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времення для преобразования.&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'.&lt;br /&gt;
* $url (string) - Указывается, если необходимо получить дату как ссылку. По умолчанию NULL&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с отформатированной датой&lt;br /&gt;
===== dof_im_journal_date_edit() =====&lt;br /&gt;
Возвращает отформатироанную дату и значок редактирования как ссылку&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времени&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'&lt;br /&gt;
* $durl (string) - путь ссылки для даты, если не указана - дата выводится как просто строка. По умолчанию null.&lt;br /&gt;
* $eurl (string) - путь ссылки для значка, если не указана значок не показывается По умолчанию null.&lt;br /&gt;
* $imgsubdate (bool) - вывести значок под датой или рядом по умолчанию true (выводит значок под датой)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с отформатированной датой&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс содержит функции для работы со страницей списка журналов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
===== set_data() =====&lt;br /&gt;
Заполняет начальной информацией внутренние поля объекта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения (таблица [[Разработка:storages/departments|departments]]). По умолчанию 0.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
===== get_data() =====&lt;br /&gt;
Возвращает собранные данные&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив структурных подразделений&lt;br /&gt;
===== get_journals() =====&lt;br /&gt;
Получить все журнлы занесенных подразделений&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
== Подробное описание работы функций ==&lt;br /&gt;
В этом разделе описывается подробная работа всех публичных и внутренних методов для классов журнала. Если вам требуется только краткая справка по API, то обратитесь к разделу [[Разработка:im/journal#API|API]].&lt;br /&gt;
=== Для журнала группы ===&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
&lt;br /&gt;
===== Описание print_texttable() =====&lt;br /&gt;
[[#print_texttable()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
Итоговая функция, выводящая всю собранную информацию на экран. &lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собирает всю информацию при помощи функции [[Разработка:im/journal#Описание get_all_form()|get_all_form()]]&lt;br /&gt;
# обращается к плагину templater для представления информации в html-формате&lt;br /&gt;
# функцией print выводит результат работы templater'а на экран.&lt;br /&gt;
===== Описание check_permissions() =====&lt;br /&gt;
[[#check_permissions()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем учебный поток. Если поток не найден - возвращаем false.&lt;br /&gt;
# проверяем статус учебного потока. Если он не равен значению &amp;quot;go&amp;quot;, то возвращаем false.&lt;br /&gt;
# проверяем, имеет ли текущий пользователь права редактирования. Если нет, то возвращаем false.&lt;br /&gt;
# если все проверки пройдены успешно, то возвращаем true.&lt;br /&gt;
===== Описание get_all_form() =====&lt;br /&gt;
Возвращает объект формы для вставки в templater. Таблица в шаблоне формируется по столбцам, т. е. сначала выводится контрольная точка в тем. планировании, а затем оценки всех учеников за это событие (как при заполнении обычного школьного журнала).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $editid (int) - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid (int) - id редактируемого учебного события в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) объект нужной структуры для построения шаблона&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собираем в объект все стандартные надписи для таблицы&lt;br /&gt;
# собираем все запланированные активные контрольные точки учебного потока&lt;br /&gt;
# создадим массивы для названий месяцев и дат&lt;br /&gt;
# собираем в массив информацию по ученикам. Если параметр $editid не равен нулю, то в столбце оценок для редактируемой даты вместо оценки выводим форму.&lt;br /&gt;
# собираем в результурующий массив названия месяцев и дат &lt;br /&gt;
# если нужно распечатать форму - устанавливаем стандартные html-теги начала и конца формы&lt;br /&gt;
# возвращаем результат&lt;br /&gt;
&lt;br /&gt;
===== Описание get_cell_form() =====&lt;br /&gt;
Возвращает редактируемую ячейку таблицы журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons.&lt;br /&gt;
* $cpassedid (int) - id учебной программы&lt;br /&gt;
* $oldgrade (int) - старая оценка (если есть). По умолчанию null.&lt;br /&gt;
* $gradeid (int) - id оценки в таблице cpgrades . По умолчанию 0&lt;br /&gt;
* $eventid (int) - id учебного события в таблице [[Разработка:storages/schevents|schevents]].&lt;br /&gt;
* $scale (string) - шкала всех возможных оценок через запятую. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с html-кодом формы редактирования оценки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Вся форма редактирования оценки представляет собой маленькую таблицу. С левой стороны находится форма выбора оценки, а справа галочка для отметки отсутствующего ученика (верхняя ячейка) и пояснение к ней (нижняя ячейка).&lt;br /&gt;
# получаем все допустимые варианты оценок для данного задания из параметра scale.&lt;br /&gt;
# из этих вариантов оценки составляем html-элемент формы типа SELECT.&lt;br /&gt;
# если за задание уже есть ранее выставленная, старая оценка, то делаем ее оценкой по умолчанию&lt;br /&gt;
# узнаем статус присутствия ученика на занятии, и в зависимсости от этого проставляем галочку над буквой &amp;quot;н&amp;quot;. Форма с возможностью отмечания отсутствующих учеников отображается только для контрольных точек для которых есть события.&lt;br /&gt;
# возвращаем результат одной строкой.&lt;br /&gt;
===== Описание get_cell_string() =====&lt;br /&gt;
Получить текстовое содержимое ячейки оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий данные об элементе тематического планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - данные об оценке По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) html-код оценки, либо специальный знак пробела, чтобы в таблице было видно пустую ячейку&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
# узнаем данные о посещаемости: получаем id события, если оно есть&lt;br /&gt;
#* если событие есть, узнаем, был ли ученик на занятии&lt;br /&gt;
# находим оценку&lt;br /&gt;
#* если ученик был на занятии и получил оценку - выводим оценку&lt;br /&gt;
#* если ученик был на занятии и не получил оценку - выводим символ пробела&lt;br /&gt;
#* если ученик отсутствовал на занятии и нет оценки, то выводим букву &amp;quot;н&amp;quot;&lt;br /&gt;
#* если ученик отсутствовал на занятии и получил оценку - выводим оценку, и букву &amp;quot;н&amp;quot; рядом с ней&lt;br /&gt;
&lt;br /&gt;
===== Описание get_one_cell() =====&lt;br /&gt;
Возвращает данные в одной клетке журнала. Определяет какой тип ячейки выводить: для редактирования или текстовую.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий контрольную точку с событием  из тем. планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - объект содержащий данные об оценке (таблица cpgrades)&lt;br /&gt;
* $cpassedid (int) - id подписки (таблица cpassed)&lt;br /&gt;
* $editid (int) - id редактируемого в текущий момент элемента из тем. планирования&lt;br /&gt;
* $eventid (int) - id редактируемого в текущий момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
* $scale (string) = По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с html-кодом формы редактирования оценки, либо сама оценка, либо статус &amp;quot;отсутствовал&amp;quot;&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# сравниваем, совпадают ли id выводимой и редактируемой в данной момент контрольной точки&lt;br /&gt;
#* если id совпадают - то выводим форму редактирования оценки&lt;br /&gt;
#** если за это задание оценка уже была ранее выставлена, то выводим форму с установленной ранее оценкой&lt;br /&gt;
#** если за задание еще нет оценки - то выводим форму без предустановленных значений&lt;br /&gt;
#* если id не совпадают то выводим оценку текстом (либо статус &amp;quot;отсутствовал&amp;quot;, либо пустую клетку, в зависимости от того был ли ученик на уроке, и получил ли он оценку)&lt;br /&gt;
===== Описание get_line_for_student() =====&lt;br /&gt;
Возвращает строку таблицы журнала для одного ученика.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $i (int) - порядковый номер ученика в группе&lt;br /&gt;
* $student (object) - объект с данными об ученике из таблицы persons&lt;br /&gt;
* $cpasseds (array) - массив объектов, содержащий все подписки учеников этого потока&lt;br /&gt;
* $plans (array) -  массив объектов, содержащий все контрольные точки текущего курса (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (или 0, если события нет) Таблица [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - информация об ученике: его ФИО, и оценки по всем контрольным точкам, а также сведения о посещаемости&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в соответствующие поля итогового объекта порядковый номер ученика, и его ФИО&lt;br /&gt;
# перебираем все переданные подписки ищем ту, которая относится к переданному ученику&lt;br /&gt;
# записываем в итоговый объект id его подписки&lt;br /&gt;
# создаем массив для оценок и собираем оценки ученика:&lt;br /&gt;
#* перебираем все контрольные переданные точки ($plans)&lt;br /&gt;
#* для каждой контрольной точки создаем объект оценки&lt;br /&gt;
#* получаем значение оценки за просматриваемую контрольную точку&lt;br /&gt;
#* при помощи функции [[Разработка:im/journal#Описание get_one_cell()|get_one_cell()]] получаем оформленный html-код оценки&lt;br /&gt;
#* записываем полученный объект в массив оценок&lt;br /&gt;
# добавляем массив оценок в итоговый объект&lt;br /&gt;
# возвращаем итоговый объект&lt;br /&gt;
===== Описание get_lines_for_students() =====&lt;br /&gt;
Возвращает массив строк с ФИО и оценками для всех учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans (array) - массив всех контрольных точек учебного потока из таблицы plans&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) информация о всех учениках учебного потока или false, если ни одного ученика нет&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все подписки учебного потока, чтобы потом установить связи с оценками&lt;br /&gt;
# получаем учеников учебного потока&lt;br /&gt;
# присваиваем каждому ученику порядковый номер,&lt;br /&gt;
# получаем информацию по каждому ученику функцией [[#Описание get_line_for_student()|get_line_for_student()]] и заносим объект с информацией о нем в массив&lt;br /&gt;
# возвращаем получившийся массив &lt;br /&gt;
===== Описание create_datesstring() =====&lt;br /&gt;
Создает верхнюю строку журнала с названиями месяцев и списком дат в пригодном для обработки плагином templater виде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - список всех контрольных точек учебного потока из таблицы [[Разработка:storages/plans|plans]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий массив с данными для шаблонизатора&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Даты в электронном журнале должны будут проставляться как и в обычном классном журнале: верхняя строка - месяцы обучения, нижняя строка - даты проведенных или запланированных уроков, а также четвертные или годовые оценки.&lt;br /&gt;
Для того чтобы организовать такой внешний вид для электронного журнала мы должны воспользоваться параметром colspan для html-таблицы журнала, и расположить тем самым месяцы точно над датами проведенных уроков. Для этой задачи в этой функции мы создаем объект следующей структуры:&lt;br /&gt;
* ''(возвращаемый объект)''&lt;br /&gt;
** ''monthtitle'' - массив объектов, каждый из которых имеет свойства ''mtitle'' - название месяца, и ''mcolspan'' - количество ячеек с датами проведенных уроков в этом месяце&lt;br /&gt;
** ''monthdate'' - строка с датой проведенного урока, либо название контрольной точки.&lt;br /&gt;
&lt;br /&gt;
# получаем строку форматированных дат уроков при помощи функции [[#Описание generate_all_dates()|generate_all_dates()]]&lt;br /&gt;
# перебираем все события и собираем массивы дат и названий месяцев&lt;br /&gt;
#* если просматриваемая дата не находится в том же месяце, что и предыдущая, то дополняем массив месяцев&lt;br /&gt;
# прибавляем счетчик дат в месяце&lt;br /&gt;
# записываем новую дату в итоговый массив&lt;br /&gt;
# возвращаем итоговый массив&lt;br /&gt;
===== Описание generate_all_dates() =====&lt;br /&gt;
Вызывается из [[#Описание create_datesstring()|create_datesstring()]]. Получить отформатированные даты для журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - массив всех контрольных точек учебного потока (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - отформатированные даты для вывода в журнал&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получим событие из таблицы schevents, которое относится к данной теме тематического планирования&lt;br /&gt;
# если событие есть - то покажем дату&lt;br /&gt;
# если события нет - только название контрольной точки&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_single_date() =====&lt;br /&gt;
Вызывается из [[#Описание generate_all_dates|generate_all_dates]] Создает один объект даты для журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plan (object) - объект из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $date (string) - метка времени для события или контрольной точки&lt;br /&gt;
* $event (object) - Объект из таблицы [[Разработка:storages/schevents|schevents]]. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) дата в нужном для templater'a формате&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# устанавливаем путь (html-якорь) к теме в планирования на странице&lt;br /&gt;
# Определяем, id события которое будет редактировано. Если события нет, то передаем 0.&lt;br /&gt;
# записываем якорь с ссылкой в объект&lt;br /&gt;
# возвращаем объект&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
===== Описание get_topics() =====&lt;br /&gt;
Возвращает массив объектов c необходимыми свойствами для вставки в таблицу schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив тем входящих в планирование&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все контрольные точки учебного потока&lt;br /&gt;
# формируем объект с нужными полями для каждой контрольной точки&lt;br /&gt;
# возвращаем получившийся массив объектов&lt;br /&gt;
===== Описание get_empty_topic() =====&lt;br /&gt;
Возвращает &amp;quot;пустой&amp;quot; объект отчета об уроке &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект для вставки в таблицу [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* создаем объект с необходимым списком пустых полей и возвращаем его&lt;br /&gt;
===== Описание table_data() =====&lt;br /&gt;
Возвращает массив строк данных отформатированных для вывода с помощью moodle-функции print_table()&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив с данными для распечатки таблицы, либо false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли для переданного потока элементы тематического планирования.&lt;br /&gt;
#* если их нет - то возвращаем false&lt;br /&gt;
# формируем массив строк таблицы&lt;br /&gt;
# проставляем html-якоря для каждой контрольной точки на странице оценок&lt;br /&gt;
# добавляем ссылки на редактирования элементов учебного плана&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
===== Описание get_topic() =====&lt;br /&gt;
[[#get_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Проверяем, указан ли id контрольной точки. &lt;br /&gt;
** Если не указан - возврящаем пустую тему.&lt;br /&gt;
** Если указан - пробуем извлечь контрольную точку по такому id&lt;br /&gt;
*** Если контрольную точку извлечь не удалось - то возвращаем false&lt;br /&gt;
*** Если удалось - то возвращаем заполненный отчет об уроке&lt;br /&gt;
===== Описание save_topic() =====&lt;br /&gt;
[[#save_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем есть ли у нас данные в переменной $event для обновления или создания события. Если нет - то возвращаем false.&lt;br /&gt;
# определяем тип действия, которое надо совершить&lt;br /&gt;
#* если указан planid для события - то создаем новое событие для существующей контрольной точки&lt;br /&gt;
#* если нет id для контрольной точки - создаем новое событие и новую контрольную точку&lt;br /&gt;
#* в остальных случаях - обновляем контрольную точку и событие: вычисляем новую относительную дату, и обновляем записи в таблицах [[Разработка:storages/schevents|schevents]] и [[Разработка:storages/plans|plans]]&lt;br /&gt;
===== Описание create_topic() =====&lt;br /&gt;
[[#create_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем новый элемент тематического планирования в таблице plans (если это не удалось - то возвращаем false)&lt;br /&gt;
# добавляем в переданное событие id контрольной точки&lt;br /&gt;
# создаем событие из переданного объекта $event (если событие не создано - удаляем ранее созданный элемент тематического планирования)&lt;br /&gt;
# возвращаем id события&lt;br /&gt;
===== Описание create_checkpoint() =====&lt;br /&gt;
Создает и сохраняет запись в таблице plans&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $point (object) - данные для сохранения в таблицу [[Разработка:storages/plans|plans]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи или false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем дату начала обучения&lt;br /&gt;
# создаем заготовку для объекта контрольной точки&lt;br /&gt;
# вычисляем относительную дату контрольной точки&lt;br /&gt;
# заносим данные в базу&lt;br /&gt;
===== Описание create_event() =====&lt;br /&gt;
Создает объект события и сохраняет его в schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $event (object) - данные для сохранения&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи в таблице событий или false.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем id преподавателя в таблице persons&lt;br /&gt;
# создаем объект нужного формата и заносим туда все данные&lt;br /&gt;
# записываем данные в базу&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* csid - id учебного потока в таблице сstreams&lt;br /&gt;
===== Описание get_checkpoints() =====&lt;br /&gt;
Получить все контрольные точки одного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив объектов из таблицы plans или false &lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id учебного потока из таблицы cstreams&lt;br /&gt;
# выбираем из таблицы plans все записи, у которых поле cstreamid равно id учебного потока, и тип связи &amp;quot;cstreams&amp;quot;&lt;br /&gt;
# сортируем их в хронологическом порядке&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
&lt;br /&gt;
===== Описание get_students() =====&lt;br /&gt;
Получить всех учеников указанного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив записей из таблицы persons или false&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем список пройденных дисциплин&lt;br /&gt;
# перебираем все подписки и запоминаем id ученика для каждой из них&lt;br /&gt;
# извлекаем из таблицы persons учеников, чьи id были извлечены из подписок&lt;br /&gt;
&lt;br /&gt;
===== Описание get_teacherid() =====&lt;br /&gt;
Получить id преподавателя учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id преподавателя или false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* id преподавателя всегда берется только из записи учебного потока из таблицы cstreams&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* gradedata - (object) все оценки и сопутствующая им информация&lt;br /&gt;
* mypost - (array) непроверенные данные пришедшие из массива $_POST. Используются только для составления повторного запроса на сохранение данных.&lt;br /&gt;
===== Описание __construct =====&lt;br /&gt;
[[#Класс dof_im_journal_rawdata|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект, в который мы будем складывать все проверенные данные, пришедшие из формы&lt;br /&gt;
# проверяем скалярные данные: все числовые идентификаторы, и отдельные строки, и после проверки записываем их в итоговый объект&lt;br /&gt;
# теперь, зная cstreamid из проверенных скалярных данных вызываем родительский конструктор&lt;br /&gt;
# проверяем массивы, пришедшие из формы: &lt;br /&gt;
#* данные об отсутствующих учениках&lt;br /&gt;
#* массив оценок &lt;br /&gt;
#* массив идентификаторов подписок (таблица cpassed)&lt;br /&gt;
#* узнаем id оценок для изменения их статуса&lt;br /&gt;
# записываем все проверенные данные в итоговый массив&lt;br /&gt;
# определяем тип действия, которое надо совершить: &lt;br /&gt;
#* сохранить данные&lt;br /&gt;
#* сохранить данные и продолжить редактирование&lt;br /&gt;
#* восстановить исходные значения&lt;br /&gt;
# записываем исходный массив (непроверенный) в поле объекта, если потом понадобится еще раз отправить данные после подтверждения&lt;br /&gt;
===== Описание process_form() =====&lt;br /&gt;
[[#process_form()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# в самом начале проверяем тип действия, которое надо совершить. Если этим действием является &amp;quot;отменить изменения&amp;quot;, то не переходим к сохранению оценок и сразуже выполняем перенаправление на страницу журнала. В остальных случаях идем дальше:&lt;br /&gt;
# проверяем, установлено ли у кого-нибудь из учеников одновременно &amp;quot;н&amp;quot; и оценка. Если это так - то перенаправим пользователя на страницу с сообщением об этом, и попросим его подтвердить такой выбор.&lt;br /&gt;
#* если пользователь согласен с изменениями, которые он сделал, то все выставленые им оценки и сведения о посещаемости сохраняются&lt;br /&gt;
#* если же нет - то происходит отмена всех изменений&lt;br /&gt;
# в случае, когда никаких предупреждений нет - сначала формируем приказ для оценок&lt;br /&gt;
# затем приказ о посещаемости&lt;br /&gt;
# если все действия произведены успешно - производим редирект. Если же возникли ошибки - сообщаем об этом&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_order_grades() =====&lt;br /&gt;
Сформировать приказ об изменении состояния учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true если приказ успешно сформирован, и false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id подразделения в таблице departments&lt;br /&gt;
# определяем тип действия, которое нужно совершить с оценкой&lt;br /&gt;
# обращаемся к функциям выставления, либо удаления оценки&lt;br /&gt;
===== Описание order_set_grade() =====&lt;br /&gt;
Формирует приказ - установить оценку. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true в случае успеха и false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# подключаем методы работы с приказом&lt;br /&gt;
# создаем объект для записи&lt;br /&gt;
# сохраняем автора приказа, подразделение, к которому он относится, дату создания приказа&lt;br /&gt;
# добавляем данные, которые определяют назначение приказа&lt;br /&gt;
# сохраняем приказ в БД, в таблицу orders&lt;br /&gt;
# подписываем приказ&lt;br /&gt;
# исполняем приказ&lt;br /&gt;
Методы order_delete_grade и order_update_grade работают по такому же принципу.&lt;br /&gt;
===== Описание get_grades_fororder() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $type - тип действия, которое необходимо будет произвести над оценкой. Возможные значения: ''set_grade'' и ''delete_grade''.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий список оценок и все идентификаторы для формирования приказа.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в него дату, id учителя (в таблице persons) и id контрольной точки (в таблице plans&lt;br /&gt;
# перебираем все оценки из внутреннего массива с проверенными данными&lt;br /&gt;
# определяем тип действия, которое над ней нужно совершить&lt;br /&gt;
# в зависимости от типа действия (установление или удаление оценки) записываем в объект оценки нужные идентификаторы&lt;br /&gt;
# упаковываем оценки в итоговый массив и возвращаем его&lt;br /&gt;
=== Для списка журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс служит для сбора и вывода информации по всем структурным подразделениям. Информация выводится древовидно: самый верхний уровень - подразделение, затем учебные программы, затем учебные периоды, элементы учебной программы, и в самом конце - журналы учебного потока.&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $departments массив структуры&lt;br /&gt;
    array(&lt;br /&gt;
    [departmentid] =&amp;gt; obj  -&amp;gt; departmentname = 'department_name'&lt;br /&gt;
                      obj  -&amp;gt; programms = array(&lt;br /&gt;
      [programmid]   =&amp;gt; obj1 -&amp;gt; programmname = 'programm_name'&lt;br /&gt;
                        obj1 -&amp;gt; ages = array(&lt;br /&gt;
        [agenum]       =&amp;gt; obj2 -&amp;gt; agename = 'age_name'&lt;br /&gt;
                          obj2 -&amp;gt; items = array(&lt;br /&gt;
          [itemid]       =&amp;gt; obj3 -&amp;gt; itemname = 'item_name'&lt;br /&gt;
                            obj3 -&amp;gt; cstreams = array(&lt;br /&gt;
            [cstreamid]    =&amp;gt; obj4 -&amp;gt; cstreamname = 'cstream_name'&lt;br /&gt;
                                    )''// конец массива cstreams''&lt;br /&gt;
                                  )''// конец массива items''&lt;br /&gt;
                                )''// конец массива ages''&lt;br /&gt;
                              )''// конец массива programms''&lt;br /&gt;
         )''// конец общего массива''&lt;br /&gt;
    содержит данные для вставку в темплатер после добавления еще одного уровня:&lt;br /&gt;
    $fortemplater-&amp;gt;departments = $this-&amp;gt;departments;&lt;br /&gt;
В общем виде сбор данных выглядит так: &lt;br /&gt;
# сначала собирается информация по структурному подразделению (одному или нескольким), и информация по ним записывается в итоговый объект&lt;br /&gt;
# затем получаются все программы учебного подразделения, информация по ним записывается в итоговый массив&lt;br /&gt;
# извлекается и записывается в итоговый объект список учебных периодов &lt;br /&gt;
# для каждого учебного периода получаются элементы учебной программы, которые изучаются в нем&lt;br /&gt;
# для каждого элемента учебной программы получаются учебные потоки&lt;br /&gt;
# для каждого учебного потока получается его журнал&lt;br /&gt;
===== Описание set_data() =====&lt;br /&gt;
[[#set_data()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* получаем id структурного подразделения из таблицы departments.&lt;br /&gt;
** если оно есть - то получаем информацию только по нему&lt;br /&gt;
** если получили 0 вместо id подразделения - то выводим информацию по всем подразделениям&lt;br /&gt;
&lt;br /&gt;
===== Описание get_journals_department() =====&lt;br /&gt;
Возвращает журналы одного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - набор журналов &lt;br /&gt;
* (bool) - false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все программы, за которые отвечает подразделение&lt;br /&gt;
# для каждой программы получаем все ее журналы&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2088</id>
		<title>Разработка:im/journal</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2088"/>
				<updated>2011-01-12T13:14:24Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Права */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Классный журнал ==&lt;br /&gt;
В журнале можно выставлять оценки и вводить отчет о проведенном уроке.&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
Вверху страницы находится форма для выбора подразделения и кнопка &amp;quot;показать&amp;quot;. По умолчанию показывается информация по всем учебным подразделениям. При выборе конкретного учебного подразделения показывается информация только по нему.&lt;br /&gt;
&lt;br /&gt;
Вывод информации по журналам организован в виде маркированного списка следующего вида:&lt;br /&gt;
* ''Подразделение''&lt;br /&gt;
** ''Учебная программа''&lt;br /&gt;
*** ''Учебный период''&lt;br /&gt;
**** ''Предмет''&lt;br /&gt;
***** ''Учебный поток (дата_начала - дата_окончания)''&lt;br /&gt;
Каждая запись учебного потока является ссылкой на страницу журнала учебного потока.&lt;br /&gt;
=== Журнал класса ===&lt;br /&gt;
Под панелью навигации выводится надпись &amp;quot;Журнал группы&amp;quot;.&lt;br /&gt;
Ниже таблица с информацией о потоке - программа, предмет, группа, преподаватель. Справа от этой таблицы размещена  ссылка &amp;quot;Новый урок&amp;quot;. Нажатие на нее позволяет создать новый отчет об уроке. Над этой ссылкой будут выводиться сообщения об ошибках сохранения данных из таблицы оценок.&lt;br /&gt;
Ниже отображаются две таблицы - таблица оценок и, справа от нее, таблица отчетов об уроке. Обе таблицы сделаны максимально похожими на соответствующие таблицы в бумажном &amp;quot;Классном журнале&amp;quot;. Таблицы связаны друг с другом. Так, дата в таблице оценок отображаются только в том случае, если был создан отчет об уроке для этой даты. При нажатии на дату в таблице оценок, происходит перемещение к соответствующей строке отчета об уроке.&lt;br /&gt;
=== Таблица оценок. ===&lt;br /&gt;
Если таблица отчетов об уроке пуста, то в таблице оценок нет ни одной колонки с датой.&lt;br /&gt;
Если журнал заполнен, то в верхней строке отображаются названия месяцев, ниже номера дней месяцев, на которые приходились занятия. Каждое число месяца - ссылка, при нажатии на которую происходит переход на соответствующую этому дню строку таблицы отчета об уроке.&lt;br /&gt;
Сразу под числом расположен значок редактирования. Он также выполнен в виде ссылки. При нажатии на него страница перезагружается в режиме формы ввода оценок и выставления присутствия учеников на уроке, который проходил в тот день, по значку под числом которого щелкнули.&lt;br /&gt;
В колонке этого дня, напротив фамилии каждого ученика появляются два поля. Поле выбора из списка - для проставления оценки. И поле переключатель - для отметки присутствия на уроке. Об этом напоминает буква &amp;quot;н&amp;quot;, расположенная справа от него. Если ученик был на уроке, то это поле следует оставить пустым. Если не был - поставить там флажок. Для выставления оценки следует выбрать элемент из списка. После того как изменения будут сохранены, в соответствующих клетках появятся буквы &amp;quot;Н&amp;quot; или оценки. Если кому-то была выставлена и оценка и отметка об отсутствии на уроке, на против его фамилии можно будет увидеть букву &amp;quot;Н&amp;quot;. Однако перед сохранением будет выведено предупреждение о том, что выставлена оценка отсутствующему ученику. Под уведомлением будут две кнопки - &amp;quot;Продолжить&amp;quot; и &amp;quot;Отменить&amp;quot;. При нажатии на &amp;quot;Продолжить&amp;quot; сценарий сохранения будет выполнен. Нажатие на другую кнопку вызовет отмену процедуры сохранения и возврат к форме с несохраненными изменениями.&lt;br /&gt;
При переключении в режим формы под таблицей появляется надпись &amp;quot;Внимание! До нажатия кнопки &amp;quot;сохранить&amp;quot; оценки не сохраняются.&amp;quot; И три кнопки - &amp;quot;Сохранить&amp;quot;, &amp;quot;Сохранить и продолжить&amp;quot;, &amp;quot;Восстановить&amp;quot;. Нажатие на первую кнопку сохраняет изменения, сделанные в форме и перезагружает страницу в режим просмотра. Вторая - сохраняет сделанные изменения, но страница остается в режиме формы - можно продолжать ввод. Третья кнопка отменяет сделанные изменения. Все введенные,  но несохраненные данные удаляются из формы. Форма перегружается с отображением последних сохраненных изменений.&lt;br /&gt;
Если ученику была выставлена оценка, а затем отменена - в форме было выбрано пустое поле, то ранее выбранная оценка будет удалена. Если оценка была изменена, то оценка будет обновлена. Каждое из этих действий, а также выставление статуса присутствия на уроке, будет выполнено через издание приказа.&lt;br /&gt;
Если редактируется контрольная точка без события, то в форме показываеются только поля выставления оценки. Поле присутствия на уроке не показывается и статус присутствия не сохраняется.&lt;br /&gt;
Контрольная точка без события выводится в таблице оценок без даты. Вместо даты выводится название КТ.&lt;br /&gt;
Что происходит в процессе сохранения.&lt;br /&gt;
После того как нажата одна из кнопок, сохраняющая внесенные изменения происходит&lt;br /&gt;
&lt;br /&gt;
* формирование приказа регистрации присутствия учеников на уроке. В него сохраняются данные о всех учениках потока, их статусы присутствия, id события, статус присутствия на котором выставляется.&lt;br /&gt;
* применение приказа и сохранение статусов учеников в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
Если были выставлены оценки. То в дополнение к вышеописанным действиям происходят следующие действия:&lt;br /&gt;
* формирование приказа регистрации выставления оценок только тем ученикам, которые их получили на уроке. В приказе сохраняются: точное время выставления оценки, id КТ, за которую выставлена оценка, id преподавателя (из /storage/persons), который выставил оценку, ученики, которые получили оценку, и соответствующие им оценки, статус оценки, id подписки ученика на поток.&lt;br /&gt;
* применение приказа и сохранение оценок в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
После создания отчета об уроке, происходит возврат на главную страницу журнала и таблица оценок загружается в режиме формы того дня, отчет для которого был создан. Если этот день выходит за границы видимости окна, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой. После редактирования отчета об уроке таблица оценок загружается в режиме просмотра. Если день, для которого происходило редактирование отчета выходит за границы видимости, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой.&lt;br /&gt;
&lt;br /&gt;
=== Таблица отчетов об уроках. ===&lt;br /&gt;
Представляет собой таблицу из шести столбцов.&lt;br /&gt;
Первый столбец - порядковый номер урока. Второй - дата урока в фомате дд.мм. Третий - тема урока - произвольный текст. Четвертый - задание на дом. Пятый - замена урока или преподавателя. Пятый - заметки об уроке. В настоящее время три последних поля не используются.&lt;br /&gt;
Уроки сортируются по датам, сверху вниз по возрастанию.&lt;br /&gt;
Под датой располагается значок редактирования информации об уроке, выполненный в виде ссылки. При щелчке по нему открывается новая страница с формой редактирования отчета об уроке. Все поля формы заполнены соответствующей информацией. Ее можно изменить, а изменения сохранить.&lt;br /&gt;
Эта же страница открывается при щелчке по ссылке &amp;quot;Новый урок&amp;quot;.&lt;br /&gt;
=== Страница редактирования урока. ===&lt;br /&gt;
Вверху страницы, под строкой навигации, выводится надпись &amp;quot;Классный журнал&amp;quot;.&lt;br /&gt;
Ниже выводится форма ввода информации об уроке - &amp;quot;Отчет об уроке&amp;quot;. В поле &amp;quot;Дата проведения урока&amp;quot; нужно выбрать дату урока. В поле &amp;quot;Элементы темплана&amp;quot; можно выбрать тему для нового урока. Ниже находится текстовое поле ввода &amp;quot;Что пройдено на уроке&amp;quot;. Сюда можно ввести тему урока вручную.&lt;br /&gt;
Еще ниже поле &amp;quot;Домашнее задание&amp;quot; для ввода соответствующей информации.&lt;br /&gt;
В самом низу расположены две кнопки - &amp;quot;Сохранить&amp;quot; и &amp;quot;Отмена&amp;quot;. При нажатии на вторую происходит возврат на главную страницу журнала без сохранения внесенных изменений. После нажатия на кнопку &amp;quot;Сохранить&amp;quot; происходит сохранение введенных данных в соответствующих таблицах. О результатах операции сохранения информирует надпись, выводимая под кнопками. Еще ниже появляется ссылка &amp;quot;назад&amp;quot; для возврата на главную страницу журнала. В случае возврата после сохранения данных, таблица оценок загружается в режиме редактирования данных на дату только что сохраненного урока.&lt;br /&gt;
Правее формы редактирования урока расположено окно с полосами прокрутки, в котором можно просмотреть темы уже проведенных уроков.&lt;br /&gt;
Они выводятся в видет таблицы из двух столбцов, в которых указываются соответственно дата и тема урока.&lt;br /&gt;
В зависимости от заполненности полей ввода возможны разные варианты обработки введенных данных.&lt;br /&gt;
&lt;br /&gt;
{|border=1&lt;br /&gt;
 |id КТ&lt;br /&gt;
 |id темы, выбранной из списка.&lt;br /&gt;
 |как обрабатывается&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |создается новая КТ и новое событие.&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |выбрана из списка&lt;br /&gt;
 |создается новое событие, привязанное к КТ, выбранной из списка&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и равна id КТ&lt;br /&gt;
 |обновляем КТ и (если изменяется дата) все события, которые ей соответствуют.&lt;br /&gt;
Тему из списка &amp;quot;Элементы темтемплана&amp;quot; выбрать нельзя.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и не равна id КТ&lt;br /&gt;
 |такая ситуация запрещена.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |0&lt;br /&gt;
 |такая ситуация запрещена&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ведомость итоговых оценок ===&lt;br /&gt;
На данной странице можно выставить итоговые оценки учащимся и завершить обучение потока. Страница принимает обязательный параметр id - id идущего  или завершенного потока.&lt;br /&gt;
&lt;br /&gt;
Вверху страныцы отображается форма, где отображены ученики, которые обучаются на данном потоке. Напротив каждого можно выбрать итоговую оценку, выставляемую учащемуся. Итоговые оценки берутся из шкалы дисциплины приписанной к данному потоку. Под ведомостью стоит галочка подтвержения оценок, без нее оценки не сохранятся. Делее стоит галочка завершения обучения если необходимо завершить поток, При завершении потока все подписки на дисциплину переводятся в один из конечных статусов. Если поток уже завершен, то галочка не показывается, вместо нее предупреждение. После завершения потока оценки также можно выставить, но они уже будут идти как переэкзаменовка. &lt;br /&gt;
&lt;br /&gt;
После того как мы выставили оценки и нажали на кнопку сохранить формируется приказ о выставленни итоговых оценок. На основе этого приказа сохраняются оценки, после чего на новой странице показывается шаблон ведомости в том виде, в котом она будет распечатана. &lt;br /&gt;
После первого сохранения оценок эта ведомость также становится доступна для печати. &lt;br /&gt;
&lt;br /&gt;
Перейти на эту страницу можно со страницы Журнала группы.&lt;br /&gt;
&lt;br /&gt;
==Права==&lt;br /&gt;
&lt;br /&gt;
* datamanage - глобальное право&lt;br /&gt;
* view_journal - право на просмотр журнала предмето-потока&lt;br /&gt;
* view_all_journals - право на просмотр журнала предмето-потока&lt;br /&gt;
* view_all_journals_department - право на просмотр всех журналов подразделения&lt;br /&gt;
* can_complete_lesson - право на отметить проведение урока&lt;br /&gt;
* create_schevent - право на создание события&lt;br /&gt;
* edit_schevent - право на редактирование события&lt;br /&gt;
* control_journal - право на проверку журнала&lt;br /&gt;
* give_grade - право на проверку журнала&lt;br /&gt;
* give_itog_grades - право выставить итоговые оценки&lt;br /&gt;
* view_events - право просматривать свое рассписание&lt;br /&gt;
* give_attendance - право просматривать свое рассписание (только завуч или ответственный преподаватель)&lt;br /&gt;
* give_theme_event - право указать тему для события&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
В этом разделе описаны функции для работы со страницами &amp;quot;журнал группы&amp;quot; и &amp;quot;список журналов&amp;quot;. Здесь содержится только краткое описание функций и их параметров. Если вас интересует их внутренняя логика, то обратитесь к разделу [[Разработка:im/journal#Подробное описание работы функций|Подробное описание]]. Аргументы всех функций перечислены именно в том порядке, в котором их следует передавать.&lt;br /&gt;
=== Журнал группы ===&lt;br /&gt;
В этом разделе собраны все функции, которые относятся к странице &amp;quot;журнал группы&amp;quot;&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
Класс отрисовки школьного журнала&lt;br /&gt;
===== print_texttable() =====&lt;br /&gt;
Вывести страницу журнала - просмотр оценок, или редактирование&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $editid  - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid - id учебного события, которое будет редактировано (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* null&lt;br /&gt;
===== check_permissions() =====&lt;br /&gt;
Проверяет разрешения на редактирование оценок для текущего пользователя&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true/false - есть или нет разрешения на редактирование оценок&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
Класс для отрисовки таблицы тематического планирования в классном журнале&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
 &lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Выводит таблицу тематического планирования на экран&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
Класс для создания или редактирования одной темы на странице планирования уроков&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $planid - id элемента учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
* $eventid - id учебного события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== get_topic() =====&lt;br /&gt;
Возвращает объект с полями, необходимыми для заполнения формы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - объект с полями для вставки в форму, или false в случае ошибки&lt;br /&gt;
===== create_topic() =====&lt;br /&gt;
Создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint - контрольная точка из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event - заранее заготовленный объект для таблицы [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи из таблицы schevents или false в случае ошибки&lt;br /&gt;
===== save_topic() =====&lt;br /&gt;
Обновляет существующий или создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint (object) - объект для обновления или создания записи в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event (object) - объект для обновления или создания записи в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true, если все записи успешно обновлены&lt;br /&gt;
* (int), id новой записи, если она была добавлена&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Формирует таблицу тематического планирования в правой части страницы журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
===== get_anchor_id() =====&lt;br /&gt;
Возвращает метку времени, которая будет создана для нового урока, чтобы осуществить корректное перенаправление на страницу журнала&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $time - (int) время создания нового события: метка времени в формате unixtime&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - метка времени для перенаправления&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
Класс для подготовки сырых исходных данных для формирования школьного журнала и ему подобных документов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор - определяет с каким учебным потоком будет вестись работа&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
Класс для проверки и обработки оценок из формы&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор класса. Осуществляет все проверки и записывает данные во внутреннее поле.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $gradedata (array) - массив $_POST из формы&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== process_form() =====&lt;br /&gt;
Обработать все данные, пришедшие из формы: установить посещаемость, выставить оценки и сформировать приказы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* false в случае неудачи. В случае успеха производит редирект на страницу журнала&lt;br /&gt;
==== Класс dof_im_journal_presence ====&lt;br /&gt;
Класс для обработки информации о посещаемости &lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== presence_students() =====&lt;br /&gt;
Формирует массив присутствия учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
===== absence_students() =====&lt;br /&gt;
Формирует массив отсутствующих студентов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $away - массив id отсутствующих учеников&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
==== Дополнительные функции ====&lt;br /&gt;
===== dof_im_journal_format_date() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времення для преобразования.&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'.&lt;br /&gt;
* $url (string) - Указывается, если необходимо получить дату как ссылку. По умолчанию NULL&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с отформатированной датой&lt;br /&gt;
===== dof_im_journal_date_edit() =====&lt;br /&gt;
Возвращает отформатироанную дату и значок редактирования как ссылку&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времени&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'&lt;br /&gt;
* $durl (string) - путь ссылки для даты, если не указана - дата выводится как просто строка. По умолчанию null.&lt;br /&gt;
* $eurl (string) - путь ссылки для значка, если не указана значок не показывается По умолчанию null.&lt;br /&gt;
* $imgsubdate (bool) - вывести значок под датой или рядом по умолчанию true (выводит значок под датой)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с отформатированной датой&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс содержит функции для работы со страницей списка журналов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
===== set_data() =====&lt;br /&gt;
Заполняет начальной информацией внутренние поля объекта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения (таблица [[Разработка:storages/departments|departments]]). По умолчанию 0.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
===== get_data() =====&lt;br /&gt;
Возвращает собранные данные&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив структурных подразделений&lt;br /&gt;
===== get_journals() =====&lt;br /&gt;
Получить все журнлы занесенных подразделений&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
== Подробное описание работы функций ==&lt;br /&gt;
В этом разделе описывается подробная работа всех публичных и внутренних методов для классов журнала. Если вам требуется только краткая справка по API, то обратитесь к разделу [[Разработка:im/journal#API|API]].&lt;br /&gt;
=== Для журнала группы ===&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
&lt;br /&gt;
===== Описание print_texttable() =====&lt;br /&gt;
[[#print_texttable()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
Итоговая функция, выводящая всю собранную информацию на экран. &lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собирает всю информацию при помощи функции [[Разработка:im/journal#Описание get_all_form()|get_all_form()]]&lt;br /&gt;
# обращается к плагину templater для представления информации в html-формате&lt;br /&gt;
# функцией print выводит результат работы templater'а на экран.&lt;br /&gt;
===== Описание check_permissions() =====&lt;br /&gt;
[[#check_permissions()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем учебный поток. Если поток не найден - возвращаем false.&lt;br /&gt;
# проверяем статус учебного потока. Если он не равен значению &amp;quot;go&amp;quot;, то возвращаем false.&lt;br /&gt;
# проверяем, имеет ли текущий пользователь права редактирования. Если нет, то возвращаем false.&lt;br /&gt;
# если все проверки пройдены успешно, то возвращаем true.&lt;br /&gt;
===== Описание get_all_form() =====&lt;br /&gt;
Возвращает объект формы для вставки в templater. Таблица в шаблоне формируется по столбцам, т. е. сначала выводится контрольная точка в тем. планировании, а затем оценки всех учеников за это событие (как при заполнении обычного школьного журнала).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $editid (int) - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid (int) - id редактируемого учебного события в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) объект нужной структуры для построения шаблона&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собираем в объект все стандартные надписи для таблицы&lt;br /&gt;
# собираем все запланированные активные контрольные точки учебного потока&lt;br /&gt;
# создадим массивы для названий месяцев и дат&lt;br /&gt;
# собираем в массив информацию по ученикам. Если параметр $editid не равен нулю, то в столбце оценок для редактируемой даты вместо оценки выводим форму.&lt;br /&gt;
# собираем в результурующий массив названия месяцев и дат &lt;br /&gt;
# если нужно распечатать форму - устанавливаем стандартные html-теги начала и конца формы&lt;br /&gt;
# возвращаем результат&lt;br /&gt;
&lt;br /&gt;
===== Описание get_cell_form() =====&lt;br /&gt;
Возвращает редактируемую ячейку таблицы журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons.&lt;br /&gt;
* $cpassedid (int) - id учебной программы&lt;br /&gt;
* $oldgrade (int) - старая оценка (если есть). По умолчанию null.&lt;br /&gt;
* $gradeid (int) - id оценки в таблице cpgrades . По умолчанию 0&lt;br /&gt;
* $eventid (int) - id учебного события в таблице [[Разработка:storages/schevents|schevents]].&lt;br /&gt;
* $scale (string) - шкала всех возможных оценок через запятую. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с html-кодом формы редактирования оценки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Вся форма редактирования оценки представляет собой маленькую таблицу. С левой стороны находится форма выбора оценки, а справа галочка для отметки отсутствующего ученика (верхняя ячейка) и пояснение к ней (нижняя ячейка).&lt;br /&gt;
# получаем все допустимые варианты оценок для данного задания из параметра scale.&lt;br /&gt;
# из этих вариантов оценки составляем html-элемент формы типа SELECT.&lt;br /&gt;
# если за задание уже есть ранее выставленная, старая оценка, то делаем ее оценкой по умолчанию&lt;br /&gt;
# узнаем статус присутствия ученика на занятии, и в зависимсости от этого проставляем галочку над буквой &amp;quot;н&amp;quot;. Форма с возможностью отмечания отсутствующих учеников отображается только для контрольных точек для которых есть события.&lt;br /&gt;
# возвращаем результат одной строкой.&lt;br /&gt;
===== Описание get_cell_string() =====&lt;br /&gt;
Получить текстовое содержимое ячейки оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий данные об элементе тематического планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - данные об оценке По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) html-код оценки, либо специальный знак пробела, чтобы в таблице было видно пустую ячейку&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
# узнаем данные о посещаемости: получаем id события, если оно есть&lt;br /&gt;
#* если событие есть, узнаем, был ли ученик на занятии&lt;br /&gt;
# находим оценку&lt;br /&gt;
#* если ученик был на занятии и получил оценку - выводим оценку&lt;br /&gt;
#* если ученик был на занятии и не получил оценку - выводим символ пробела&lt;br /&gt;
#* если ученик отсутствовал на занятии и нет оценки, то выводим букву &amp;quot;н&amp;quot;&lt;br /&gt;
#* если ученик отсутствовал на занятии и получил оценку - выводим оценку, и букву &amp;quot;н&amp;quot; рядом с ней&lt;br /&gt;
&lt;br /&gt;
===== Описание get_one_cell() =====&lt;br /&gt;
Возвращает данные в одной клетке журнала. Определяет какой тип ячейки выводить: для редактирования или текстовую.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий контрольную точку с событием  из тем. планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - объект содержащий данные об оценке (таблица cpgrades)&lt;br /&gt;
* $cpassedid (int) - id подписки (таблица cpassed)&lt;br /&gt;
* $editid (int) - id редактируемого в текущий момент элемента из тем. планирования&lt;br /&gt;
* $eventid (int) - id редактируемого в текущий момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
* $scale (string) = По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с html-кодом формы редактирования оценки, либо сама оценка, либо статус &amp;quot;отсутствовал&amp;quot;&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# сравниваем, совпадают ли id выводимой и редактируемой в данной момент контрольной точки&lt;br /&gt;
#* если id совпадают - то выводим форму редактирования оценки&lt;br /&gt;
#** если за это задание оценка уже была ранее выставлена, то выводим форму с установленной ранее оценкой&lt;br /&gt;
#** если за задание еще нет оценки - то выводим форму без предустановленных значений&lt;br /&gt;
#* если id не совпадают то выводим оценку текстом (либо статус &amp;quot;отсутствовал&amp;quot;, либо пустую клетку, в зависимости от того был ли ученик на уроке, и получил ли он оценку)&lt;br /&gt;
===== Описание get_line_for_student() =====&lt;br /&gt;
Возвращает строку таблицы журнала для одного ученика.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $i (int) - порядковый номер ученика в группе&lt;br /&gt;
* $student (object) - объект с данными об ученике из таблицы persons&lt;br /&gt;
* $cpasseds (array) - массив объектов, содержащий все подписки учеников этого потока&lt;br /&gt;
* $plans (array) -  массив объектов, содержащий все контрольные точки текущего курса (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (или 0, если события нет) Таблица [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - информация об ученике: его ФИО, и оценки по всем контрольным точкам, а также сведения о посещаемости&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в соответствующие поля итогового объекта порядковый номер ученика, и его ФИО&lt;br /&gt;
# перебираем все переданные подписки ищем ту, которая относится к переданному ученику&lt;br /&gt;
# записываем в итоговый объект id его подписки&lt;br /&gt;
# создаем массив для оценок и собираем оценки ученика:&lt;br /&gt;
#* перебираем все контрольные переданные точки ($plans)&lt;br /&gt;
#* для каждой контрольной точки создаем объект оценки&lt;br /&gt;
#* получаем значение оценки за просматриваемую контрольную точку&lt;br /&gt;
#* при помощи функции [[Разработка:im/journal#Описание get_one_cell()|get_one_cell()]] получаем оформленный html-код оценки&lt;br /&gt;
#* записываем полученный объект в массив оценок&lt;br /&gt;
# добавляем массив оценок в итоговый объект&lt;br /&gt;
# возвращаем итоговый объект&lt;br /&gt;
===== Описание get_lines_for_students() =====&lt;br /&gt;
Возвращает массив строк с ФИО и оценками для всех учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans (array) - массив всех контрольных точек учебного потока из таблицы plans&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) информация о всех учениках учебного потока или false, если ни одного ученика нет&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все подписки учебного потока, чтобы потом установить связи с оценками&lt;br /&gt;
# получаем учеников учебного потока&lt;br /&gt;
# присваиваем каждому ученику порядковый номер,&lt;br /&gt;
# получаем информацию по каждому ученику функцией [[#Описание get_line_for_student()|get_line_for_student()]] и заносим объект с информацией о нем в массив&lt;br /&gt;
# возвращаем получившийся массив &lt;br /&gt;
===== Описание create_datesstring() =====&lt;br /&gt;
Создает верхнюю строку журнала с названиями месяцев и списком дат в пригодном для обработки плагином templater виде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - список всех контрольных точек учебного потока из таблицы [[Разработка:storages/plans|plans]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий массив с данными для шаблонизатора&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Даты в электронном журнале должны будут проставляться как и в обычном классном журнале: верхняя строка - месяцы обучения, нижняя строка - даты проведенных или запланированных уроков, а также четвертные или годовые оценки.&lt;br /&gt;
Для того чтобы организовать такой внешний вид для электронного журнала мы должны воспользоваться параметром colspan для html-таблицы журнала, и расположить тем самым месяцы точно над датами проведенных уроков. Для этой задачи в этой функции мы создаем объект следующей структуры:&lt;br /&gt;
* ''(возвращаемый объект)''&lt;br /&gt;
** ''monthtitle'' - массив объектов, каждый из которых имеет свойства ''mtitle'' - название месяца, и ''mcolspan'' - количество ячеек с датами проведенных уроков в этом месяце&lt;br /&gt;
** ''monthdate'' - строка с датой проведенного урока, либо название контрольной точки.&lt;br /&gt;
&lt;br /&gt;
# получаем строку форматированных дат уроков при помощи функции [[#Описание generate_all_dates()|generate_all_dates()]]&lt;br /&gt;
# перебираем все события и собираем массивы дат и названий месяцев&lt;br /&gt;
#* если просматриваемая дата не находится в том же месяце, что и предыдущая, то дополняем массив месяцев&lt;br /&gt;
# прибавляем счетчик дат в месяце&lt;br /&gt;
# записываем новую дату в итоговый массив&lt;br /&gt;
# возвращаем итоговый массив&lt;br /&gt;
===== Описание generate_all_dates() =====&lt;br /&gt;
Вызывается из [[#Описание create_datesstring()|create_datesstring()]]. Получить отформатированные даты для журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - массив всех контрольных точек учебного потока (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - отформатированные даты для вывода в журнал&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получим событие из таблицы schevents, которое относится к данной теме тематического планирования&lt;br /&gt;
# если событие есть - то покажем дату&lt;br /&gt;
# если события нет - только название контрольной точки&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_single_date() =====&lt;br /&gt;
Вызывается из [[#Описание generate_all_dates|generate_all_dates]] Создает один объект даты для журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plan (object) - объект из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $date (string) - метка времени для события или контрольной точки&lt;br /&gt;
* $event (object) - Объект из таблицы [[Разработка:storages/schevents|schevents]]. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) дата в нужном для templater'a формате&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# устанавливаем путь (html-якорь) к теме в планирования на странице&lt;br /&gt;
# Определяем, id события которое будет редактировано. Если события нет, то передаем 0.&lt;br /&gt;
# записываем якорь с ссылкой в объект&lt;br /&gt;
# возвращаем объект&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
===== Описание get_topics() =====&lt;br /&gt;
Возвращает массив объектов c необходимыми свойствами для вставки в таблицу schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив тем входящих в планирование&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все контрольные точки учебного потока&lt;br /&gt;
# формируем объект с нужными полями для каждой контрольной точки&lt;br /&gt;
# возвращаем получившийся массив объектов&lt;br /&gt;
===== Описание get_empty_topic() =====&lt;br /&gt;
Возвращает &amp;quot;пустой&amp;quot; объект отчета об уроке &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект для вставки в таблицу [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* создаем объект с необходимым списком пустых полей и возвращаем его&lt;br /&gt;
===== Описание table_data() =====&lt;br /&gt;
Возвращает массив строк данных отформатированных для вывода с помощью moodle-функции print_table()&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив с данными для распечатки таблицы, либо false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли для переданного потока элементы тематического планирования.&lt;br /&gt;
#* если их нет - то возвращаем false&lt;br /&gt;
# формируем массив строк таблицы&lt;br /&gt;
# проставляем html-якоря для каждой контрольной точки на странице оценок&lt;br /&gt;
# добавляем ссылки на редактирования элементов учебного плана&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
===== Описание get_topic() =====&lt;br /&gt;
[[#get_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Проверяем, указан ли id контрольной точки. &lt;br /&gt;
** Если не указан - возврящаем пустую тему.&lt;br /&gt;
** Если указан - пробуем извлечь контрольную точку по такому id&lt;br /&gt;
*** Если контрольную точку извлечь не удалось - то возвращаем false&lt;br /&gt;
*** Если удалось - то возвращаем заполненный отчет об уроке&lt;br /&gt;
===== Описание save_topic() =====&lt;br /&gt;
[[#save_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем есть ли у нас данные в переменной $event для обновления или создания события. Если нет - то возвращаем false.&lt;br /&gt;
# определяем тип действия, которое надо совершить&lt;br /&gt;
#* если указан planid для события - то создаем новое событие для существующей контрольной точки&lt;br /&gt;
#* если нет id для контрольной точки - создаем новое событие и новую контрольную точку&lt;br /&gt;
#* в остальных случаях - обновляем контрольную точку и событие: вычисляем новую относительную дату, и обновляем записи в таблицах [[Разработка:storages/schevents|schevents]] и [[Разработка:storages/plans|plans]]&lt;br /&gt;
===== Описание create_topic() =====&lt;br /&gt;
[[#create_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем новый элемент тематического планирования в таблице plans (если это не удалось - то возвращаем false)&lt;br /&gt;
# добавляем в переданное событие id контрольной точки&lt;br /&gt;
# создаем событие из переданного объекта $event (если событие не создано - удаляем ранее созданный элемент тематического планирования)&lt;br /&gt;
# возвращаем id события&lt;br /&gt;
===== Описание create_checkpoint() =====&lt;br /&gt;
Создает и сохраняет запись в таблице plans&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $point (object) - данные для сохранения в таблицу [[Разработка:storages/plans|plans]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи или false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем дату начала обучения&lt;br /&gt;
# создаем заготовку для объекта контрольной точки&lt;br /&gt;
# вычисляем относительную дату контрольной точки&lt;br /&gt;
# заносим данные в базу&lt;br /&gt;
===== Описание create_event() =====&lt;br /&gt;
Создает объект события и сохраняет его в schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $event (object) - данные для сохранения&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи в таблице событий или false.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем id преподавателя в таблице persons&lt;br /&gt;
# создаем объект нужного формата и заносим туда все данные&lt;br /&gt;
# записываем данные в базу&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* csid - id учебного потока в таблице сstreams&lt;br /&gt;
===== Описание get_checkpoints() =====&lt;br /&gt;
Получить все контрольные точки одного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив объектов из таблицы plans или false &lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id учебного потока из таблицы cstreams&lt;br /&gt;
# выбираем из таблицы plans все записи, у которых поле cstreamid равно id учебного потока, и тип связи &amp;quot;cstreams&amp;quot;&lt;br /&gt;
# сортируем их в хронологическом порядке&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
&lt;br /&gt;
===== Описание get_students() =====&lt;br /&gt;
Получить всех учеников указанного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив записей из таблицы persons или false&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем список пройденных дисциплин&lt;br /&gt;
# перебираем все подписки и запоминаем id ученика для каждой из них&lt;br /&gt;
# извлекаем из таблицы persons учеников, чьи id были извлечены из подписок&lt;br /&gt;
&lt;br /&gt;
===== Описание get_teacherid() =====&lt;br /&gt;
Получить id преподавателя учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id преподавателя или false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* id преподавателя всегда берется только из записи учебного потока из таблицы cstreams&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* gradedata - (object) все оценки и сопутствующая им информация&lt;br /&gt;
* mypost - (array) непроверенные данные пришедшие из массива $_POST. Используются только для составления повторного запроса на сохранение данных.&lt;br /&gt;
===== Описание __construct =====&lt;br /&gt;
[[#Класс dof_im_journal_rawdata|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект, в который мы будем складывать все проверенные данные, пришедшие из формы&lt;br /&gt;
# проверяем скалярные данные: все числовые идентификаторы, и отдельные строки, и после проверки записываем их в итоговый объект&lt;br /&gt;
# теперь, зная cstreamid из проверенных скалярных данных вызываем родительский конструктор&lt;br /&gt;
# проверяем массивы, пришедшие из формы: &lt;br /&gt;
#* данные об отсутствующих учениках&lt;br /&gt;
#* массив оценок &lt;br /&gt;
#* массив идентификаторов подписок (таблица cpassed)&lt;br /&gt;
#* узнаем id оценок для изменения их статуса&lt;br /&gt;
# записываем все проверенные данные в итоговый массив&lt;br /&gt;
# определяем тип действия, которое надо совершить: &lt;br /&gt;
#* сохранить данные&lt;br /&gt;
#* сохранить данные и продолжить редактирование&lt;br /&gt;
#* восстановить исходные значения&lt;br /&gt;
# записываем исходный массив (непроверенный) в поле объекта, если потом понадобится еще раз отправить данные после подтверждения&lt;br /&gt;
===== Описание process_form() =====&lt;br /&gt;
[[#process_form()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# в самом начале проверяем тип действия, которое надо совершить. Если этим действием является &amp;quot;отменить изменения&amp;quot;, то не переходим к сохранению оценок и сразуже выполняем перенаправление на страницу журнала. В остальных случаях идем дальше:&lt;br /&gt;
# проверяем, установлено ли у кого-нибудь из учеников одновременно &amp;quot;н&amp;quot; и оценка. Если это так - то перенаправим пользователя на страницу с сообщением об этом, и попросим его подтвердить такой выбор.&lt;br /&gt;
#* если пользователь согласен с изменениями, которые он сделал, то все выставленые им оценки и сведения о посещаемости сохраняются&lt;br /&gt;
#* если же нет - то происходит отмена всех изменений&lt;br /&gt;
# в случае, когда никаких предупреждений нет - сначала формируем приказ для оценок&lt;br /&gt;
# затем приказ о посещаемости&lt;br /&gt;
# если все действия произведены успешно - производим редирект. Если же возникли ошибки - сообщаем об этом&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_order_grades() =====&lt;br /&gt;
Сформировать приказ об изменении состояния учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true если приказ успешно сформирован, и false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id подразделения в таблице departments&lt;br /&gt;
# определяем тип действия, которое нужно совершить с оценкой&lt;br /&gt;
# обращаемся к функциям выставления, либо удаления оценки&lt;br /&gt;
===== Описание order_set_grade() =====&lt;br /&gt;
Формирует приказ - установить оценку. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true в случае успеха и false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# подключаем методы работы с приказом&lt;br /&gt;
# создаем объект для записи&lt;br /&gt;
# сохраняем автора приказа, подразделение, к которому он относится, дату создания приказа&lt;br /&gt;
# добавляем данные, которые определяют назначение приказа&lt;br /&gt;
# сохраняем приказ в БД, в таблицу orders&lt;br /&gt;
# подписываем приказ&lt;br /&gt;
# исполняем приказ&lt;br /&gt;
Методы order_delete_grade и order_update_grade работают по такому же принципу.&lt;br /&gt;
===== Описание get_grades_fororder() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $type - тип действия, которое необходимо будет произвести над оценкой. Возможные значения: ''set_grade'' и ''delete_grade''.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий список оценок и все идентификаторы для формирования приказа.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в него дату, id учителя (в таблице persons) и id контрольной точки (в таблице plans&lt;br /&gt;
# перебираем все оценки из внутреннего массива с проверенными данными&lt;br /&gt;
# определяем тип действия, которое над ней нужно совершить&lt;br /&gt;
# в зависимости от типа действия (установление или удаление оценки) записываем в объект оценки нужные идентификаторы&lt;br /&gt;
# упаковываем оценки в итоговый массив и возвращаем его&lt;br /&gt;
=== Для списка журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс служит для сбора и вывода информации по всем структурным подразделениям. Информация выводится древовидно: самый верхний уровень - подразделение, затем учебные программы, затем учебные периоды, элементы учебной программы, и в самом конце - журналы учебного потока.&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $departments массив структуры&lt;br /&gt;
    array(&lt;br /&gt;
    [departmentid] =&amp;gt; obj  -&amp;gt; departmentname = 'department_name'&lt;br /&gt;
                      obj  -&amp;gt; programms = array(&lt;br /&gt;
      [programmid]   =&amp;gt; obj1 -&amp;gt; programmname = 'programm_name'&lt;br /&gt;
                        obj1 -&amp;gt; ages = array(&lt;br /&gt;
        [agenum]       =&amp;gt; obj2 -&amp;gt; agename = 'age_name'&lt;br /&gt;
                          obj2 -&amp;gt; items = array(&lt;br /&gt;
          [itemid]       =&amp;gt; obj3 -&amp;gt; itemname = 'item_name'&lt;br /&gt;
                            obj3 -&amp;gt; cstreams = array(&lt;br /&gt;
            [cstreamid]    =&amp;gt; obj4 -&amp;gt; cstreamname = 'cstream_name'&lt;br /&gt;
                                    )''// конец массива cstreams''&lt;br /&gt;
                                  )''// конец массива items''&lt;br /&gt;
                                )''// конец массива ages''&lt;br /&gt;
                              )''// конец массива programms''&lt;br /&gt;
         )''// конец общего массива''&lt;br /&gt;
    содержит данные для вставку в темплатер после добавления еще одного уровня:&lt;br /&gt;
    $fortemplater-&amp;gt;departments = $this-&amp;gt;departments;&lt;br /&gt;
В общем виде сбор данных выглядит так: &lt;br /&gt;
# сначала собирается информация по структурному подразделению (одному или нескольким), и информация по ним записывается в итоговый объект&lt;br /&gt;
# затем получаются все программы учебного подразделения, информация по ним записывается в итоговый массив&lt;br /&gt;
# извлекается и записывается в итоговый объект список учебных периодов &lt;br /&gt;
# для каждого учебного периода получаются элементы учебной программы, которые изучаются в нем&lt;br /&gt;
# для каждого элемента учебной программы получаются учебные потоки&lt;br /&gt;
# для каждого учебного потока получается его журнал&lt;br /&gt;
===== Описание set_data() =====&lt;br /&gt;
[[#set_data()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* получаем id структурного подразделения из таблицы departments.&lt;br /&gt;
** если оно есть - то получаем информацию только по нему&lt;br /&gt;
** если получили 0 вместо id подразделения - то выводим информацию по всем подразделениям&lt;br /&gt;
&lt;br /&gt;
===== Описание get_journals_department() =====&lt;br /&gt;
Возвращает журналы одного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - набор журналов &lt;br /&gt;
* (bool) - false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все программы, за которые отвечает подразделение&lt;br /&gt;
# для каждой программы получаем все ее журналы&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2087</id>
		<title>Разработка:im/journal</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2087"/>
				<updated>2011-01-12T13:13:20Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Права */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Классный журнал ==&lt;br /&gt;
В журнале можно выставлять оценки и вводить отчет о проведенном уроке.&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
Вверху страницы находится форма для выбора подразделения и кнопка &amp;quot;показать&amp;quot;. По умолчанию показывается информация по всем учебным подразделениям. При выборе конкретного учебного подразделения показывается информация только по нему.&lt;br /&gt;
&lt;br /&gt;
Вывод информации по журналам организован в виде маркированного списка следующего вида:&lt;br /&gt;
* ''Подразделение''&lt;br /&gt;
** ''Учебная программа''&lt;br /&gt;
*** ''Учебный период''&lt;br /&gt;
**** ''Предмет''&lt;br /&gt;
***** ''Учебный поток (дата_начала - дата_окончания)''&lt;br /&gt;
Каждая запись учебного потока является ссылкой на страницу журнала учебного потока.&lt;br /&gt;
=== Журнал класса ===&lt;br /&gt;
Под панелью навигации выводится надпись &amp;quot;Журнал группы&amp;quot;.&lt;br /&gt;
Ниже таблица с информацией о потоке - программа, предмет, группа, преподаватель. Справа от этой таблицы размещена  ссылка &amp;quot;Новый урок&amp;quot;. Нажатие на нее позволяет создать новый отчет об уроке. Над этой ссылкой будут выводиться сообщения об ошибках сохранения данных из таблицы оценок.&lt;br /&gt;
Ниже отображаются две таблицы - таблица оценок и, справа от нее, таблица отчетов об уроке. Обе таблицы сделаны максимально похожими на соответствующие таблицы в бумажном &amp;quot;Классном журнале&amp;quot;. Таблицы связаны друг с другом. Так, дата в таблице оценок отображаются только в том случае, если был создан отчет об уроке для этой даты. При нажатии на дату в таблице оценок, происходит перемещение к соответствующей строке отчета об уроке.&lt;br /&gt;
=== Таблица оценок. ===&lt;br /&gt;
Если таблица отчетов об уроке пуста, то в таблице оценок нет ни одной колонки с датой.&lt;br /&gt;
Если журнал заполнен, то в верхней строке отображаются названия месяцев, ниже номера дней месяцев, на которые приходились занятия. Каждое число месяца - ссылка, при нажатии на которую происходит переход на соответствующую этому дню строку таблицы отчета об уроке.&lt;br /&gt;
Сразу под числом расположен значок редактирования. Он также выполнен в виде ссылки. При нажатии на него страница перезагружается в режиме формы ввода оценок и выставления присутствия учеников на уроке, который проходил в тот день, по значку под числом которого щелкнули.&lt;br /&gt;
В колонке этого дня, напротив фамилии каждого ученика появляются два поля. Поле выбора из списка - для проставления оценки. И поле переключатель - для отметки присутствия на уроке. Об этом напоминает буква &amp;quot;н&amp;quot;, расположенная справа от него. Если ученик был на уроке, то это поле следует оставить пустым. Если не был - поставить там флажок. Для выставления оценки следует выбрать элемент из списка. После того как изменения будут сохранены, в соответствующих клетках появятся буквы &amp;quot;Н&amp;quot; или оценки. Если кому-то была выставлена и оценка и отметка об отсутствии на уроке, на против его фамилии можно будет увидеть букву &amp;quot;Н&amp;quot;. Однако перед сохранением будет выведено предупреждение о том, что выставлена оценка отсутствующему ученику. Под уведомлением будут две кнопки - &amp;quot;Продолжить&amp;quot; и &amp;quot;Отменить&amp;quot;. При нажатии на &amp;quot;Продолжить&amp;quot; сценарий сохранения будет выполнен. Нажатие на другую кнопку вызовет отмену процедуры сохранения и возврат к форме с несохраненными изменениями.&lt;br /&gt;
При переключении в режим формы под таблицей появляется надпись &amp;quot;Внимание! До нажатия кнопки &amp;quot;сохранить&amp;quot; оценки не сохраняются.&amp;quot; И три кнопки - &amp;quot;Сохранить&amp;quot;, &amp;quot;Сохранить и продолжить&amp;quot;, &amp;quot;Восстановить&amp;quot;. Нажатие на первую кнопку сохраняет изменения, сделанные в форме и перезагружает страницу в режим просмотра. Вторая - сохраняет сделанные изменения, но страница остается в режиме формы - можно продолжать ввод. Третья кнопка отменяет сделанные изменения. Все введенные,  но несохраненные данные удаляются из формы. Форма перегружается с отображением последних сохраненных изменений.&lt;br /&gt;
Если ученику была выставлена оценка, а затем отменена - в форме было выбрано пустое поле, то ранее выбранная оценка будет удалена. Если оценка была изменена, то оценка будет обновлена. Каждое из этих действий, а также выставление статуса присутствия на уроке, будет выполнено через издание приказа.&lt;br /&gt;
Если редактируется контрольная точка без события, то в форме показываеются только поля выставления оценки. Поле присутствия на уроке не показывается и статус присутствия не сохраняется.&lt;br /&gt;
Контрольная точка без события выводится в таблице оценок без даты. Вместо даты выводится название КТ.&lt;br /&gt;
Что происходит в процессе сохранения.&lt;br /&gt;
После того как нажата одна из кнопок, сохраняющая внесенные изменения происходит&lt;br /&gt;
&lt;br /&gt;
* формирование приказа регистрации присутствия учеников на уроке. В него сохраняются данные о всех учениках потока, их статусы присутствия, id события, статус присутствия на котором выставляется.&lt;br /&gt;
* применение приказа и сохранение статусов учеников в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
Если были выставлены оценки. То в дополнение к вышеописанным действиям происходят следующие действия:&lt;br /&gt;
* формирование приказа регистрации выставления оценок только тем ученикам, которые их получили на уроке. В приказе сохраняются: точное время выставления оценки, id КТ, за которую выставлена оценка, id преподавателя (из /storage/persons), который выставил оценку, ученики, которые получили оценку, и соответствующие им оценки, статус оценки, id подписки ученика на поток.&lt;br /&gt;
* применение приказа и сохранение оценок в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
После создания отчета об уроке, происходит возврат на главную страницу журнала и таблица оценок загружается в режиме формы того дня, отчет для которого был создан. Если этот день выходит за границы видимости окна, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой. После редактирования отчета об уроке таблица оценок загружается в режиме просмотра. Если день, для которого происходило редактирование отчета выходит за границы видимости, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой.&lt;br /&gt;
&lt;br /&gt;
=== Таблица отчетов об уроках. ===&lt;br /&gt;
Представляет собой таблицу из шести столбцов.&lt;br /&gt;
Первый столбец - порядковый номер урока. Второй - дата урока в фомате дд.мм. Третий - тема урока - произвольный текст. Четвертый - задание на дом. Пятый - замена урока или преподавателя. Пятый - заметки об уроке. В настоящее время три последних поля не используются.&lt;br /&gt;
Уроки сортируются по датам, сверху вниз по возрастанию.&lt;br /&gt;
Под датой располагается значок редактирования информации об уроке, выполненный в виде ссылки. При щелчке по нему открывается новая страница с формой редактирования отчета об уроке. Все поля формы заполнены соответствующей информацией. Ее можно изменить, а изменения сохранить.&lt;br /&gt;
Эта же страница открывается при щелчке по ссылке &amp;quot;Новый урок&amp;quot;.&lt;br /&gt;
=== Страница редактирования урока. ===&lt;br /&gt;
Вверху страницы, под строкой навигации, выводится надпись &amp;quot;Классный журнал&amp;quot;.&lt;br /&gt;
Ниже выводится форма ввода информации об уроке - &amp;quot;Отчет об уроке&amp;quot;. В поле &amp;quot;Дата проведения урока&amp;quot; нужно выбрать дату урока. В поле &amp;quot;Элементы темплана&amp;quot; можно выбрать тему для нового урока. Ниже находится текстовое поле ввода &amp;quot;Что пройдено на уроке&amp;quot;. Сюда можно ввести тему урока вручную.&lt;br /&gt;
Еще ниже поле &amp;quot;Домашнее задание&amp;quot; для ввода соответствующей информации.&lt;br /&gt;
В самом низу расположены две кнопки - &amp;quot;Сохранить&amp;quot; и &amp;quot;Отмена&amp;quot;. При нажатии на вторую происходит возврат на главную страницу журнала без сохранения внесенных изменений. После нажатия на кнопку &amp;quot;Сохранить&amp;quot; происходит сохранение введенных данных в соответствующих таблицах. О результатах операции сохранения информирует надпись, выводимая под кнопками. Еще ниже появляется ссылка &amp;quot;назад&amp;quot; для возврата на главную страницу журнала. В случае возврата после сохранения данных, таблица оценок загружается в режиме редактирования данных на дату только что сохраненного урока.&lt;br /&gt;
Правее формы редактирования урока расположено окно с полосами прокрутки, в котором можно просмотреть темы уже проведенных уроков.&lt;br /&gt;
Они выводятся в видет таблицы из двух столбцов, в которых указываются соответственно дата и тема урока.&lt;br /&gt;
В зависимости от заполненности полей ввода возможны разные варианты обработки введенных данных.&lt;br /&gt;
&lt;br /&gt;
{|border=1&lt;br /&gt;
 |id КТ&lt;br /&gt;
 |id темы, выбранной из списка.&lt;br /&gt;
 |как обрабатывается&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |создается новая КТ и новое событие.&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |выбрана из списка&lt;br /&gt;
 |создается новое событие, привязанное к КТ, выбранной из списка&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и равна id КТ&lt;br /&gt;
 |обновляем КТ и (если изменяется дата) все события, которые ей соответствуют.&lt;br /&gt;
Тему из списка &amp;quot;Элементы темтемплана&amp;quot; выбрать нельзя.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и не равна id КТ&lt;br /&gt;
 |такая ситуация запрещена.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |0&lt;br /&gt;
 |такая ситуация запрещена&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ведомость итоговых оценок ===&lt;br /&gt;
На данной странице можно выставить итоговые оценки учащимся и завершить обучение потока. Страница принимает обязательный параметр id - id идущего  или завершенного потока.&lt;br /&gt;
&lt;br /&gt;
Вверху страныцы отображается форма, где отображены ученики, которые обучаются на данном потоке. Напротив каждого можно выбрать итоговую оценку, выставляемую учащемуся. Итоговые оценки берутся из шкалы дисциплины приписанной к данному потоку. Под ведомостью стоит галочка подтвержения оценок, без нее оценки не сохранятся. Делее стоит галочка завершения обучения если необходимо завершить поток, При завершении потока все подписки на дисциплину переводятся в один из конечных статусов. Если поток уже завершен, то галочка не показывается, вместо нее предупреждение. После завершения потока оценки также можно выставить, но они уже будут идти как переэкзаменовка. &lt;br /&gt;
&lt;br /&gt;
После того как мы выставили оценки и нажали на кнопку сохранить формируется приказ о выставленни итоговых оценок. На основе этого приказа сохраняются оценки, после чего на новой странице показывается шаблон ведомости в том виде, в котом она будет распечатана. &lt;br /&gt;
После первого сохранения оценок эта ведомость также становится доступна для печати. &lt;br /&gt;
&lt;br /&gt;
Перейти на эту страницу можно со страницы Журнала группы.&lt;br /&gt;
&lt;br /&gt;
==Права==&lt;br /&gt;
&lt;br /&gt;
datamanage - глобальное право&lt;br /&gt;
view_journal - право на просмотр журнала предмето-потока&lt;br /&gt;
view_all_journals - право на просмотр журнала предмето-потока&lt;br /&gt;
view_all_journals_department - право на просмотр всех журналов подразделения&lt;br /&gt;
can_complete_lesson - право на отметить проведение урока&lt;br /&gt;
create_schevent - право на создание события&lt;br /&gt;
edit_schevent - право на редактирование события&lt;br /&gt;
control_journal - право на проверку журнала&lt;br /&gt;
give_grade - право на проверку журнала&lt;br /&gt;
give_itog_grades - право выставить итоговые оценки&lt;br /&gt;
view_events - право просматривать свое рассписание&lt;br /&gt;
give_attendance - право просматривать свое рассписание (только завуч или ответственный преподаватель)&lt;br /&gt;
give_theme_event - право указать тему для события&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
В этом разделе описаны функции для работы со страницами &amp;quot;журнал группы&amp;quot; и &amp;quot;список журналов&amp;quot;. Здесь содержится только краткое описание функций и их параметров. Если вас интересует их внутренняя логика, то обратитесь к разделу [[Разработка:im/journal#Подробное описание работы функций|Подробное описание]]. Аргументы всех функций перечислены именно в том порядке, в котором их следует передавать.&lt;br /&gt;
=== Журнал группы ===&lt;br /&gt;
В этом разделе собраны все функции, которые относятся к странице &amp;quot;журнал группы&amp;quot;&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
Класс отрисовки школьного журнала&lt;br /&gt;
===== print_texttable() =====&lt;br /&gt;
Вывести страницу журнала - просмотр оценок, или редактирование&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $editid  - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid - id учебного события, которое будет редактировано (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* null&lt;br /&gt;
===== check_permissions() =====&lt;br /&gt;
Проверяет разрешения на редактирование оценок для текущего пользователя&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true/false - есть или нет разрешения на редактирование оценок&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
Класс для отрисовки таблицы тематического планирования в классном журнале&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
 &lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Выводит таблицу тематического планирования на экран&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
Класс для создания или редактирования одной темы на странице планирования уроков&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $planid - id элемента учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
* $eventid - id учебного события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== get_topic() =====&lt;br /&gt;
Возвращает объект с полями, необходимыми для заполнения формы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - объект с полями для вставки в форму, или false в случае ошибки&lt;br /&gt;
===== create_topic() =====&lt;br /&gt;
Создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint - контрольная точка из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event - заранее заготовленный объект для таблицы [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи из таблицы schevents или false в случае ошибки&lt;br /&gt;
===== save_topic() =====&lt;br /&gt;
Обновляет существующий или создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint (object) - объект для обновления или создания записи в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event (object) - объект для обновления или создания записи в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true, если все записи успешно обновлены&lt;br /&gt;
* (int), id новой записи, если она была добавлена&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Формирует таблицу тематического планирования в правой части страницы журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
===== get_anchor_id() =====&lt;br /&gt;
Возвращает метку времени, которая будет создана для нового урока, чтобы осуществить корректное перенаправление на страницу журнала&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $time - (int) время создания нового события: метка времени в формате unixtime&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - метка времени для перенаправления&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
Класс для подготовки сырых исходных данных для формирования школьного журнала и ему подобных документов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор - определяет с каким учебным потоком будет вестись работа&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
Класс для проверки и обработки оценок из формы&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор класса. Осуществляет все проверки и записывает данные во внутреннее поле.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $gradedata (array) - массив $_POST из формы&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== process_form() =====&lt;br /&gt;
Обработать все данные, пришедшие из формы: установить посещаемость, выставить оценки и сформировать приказы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* false в случае неудачи. В случае успеха производит редирект на страницу журнала&lt;br /&gt;
==== Класс dof_im_journal_presence ====&lt;br /&gt;
Класс для обработки информации о посещаемости &lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== presence_students() =====&lt;br /&gt;
Формирует массив присутствия учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
===== absence_students() =====&lt;br /&gt;
Формирует массив отсутствующих студентов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $away - массив id отсутствующих учеников&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
==== Дополнительные функции ====&lt;br /&gt;
===== dof_im_journal_format_date() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времення для преобразования.&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'.&lt;br /&gt;
* $url (string) - Указывается, если необходимо получить дату как ссылку. По умолчанию NULL&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с отформатированной датой&lt;br /&gt;
===== dof_im_journal_date_edit() =====&lt;br /&gt;
Возвращает отформатироанную дату и значок редактирования как ссылку&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времени&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'&lt;br /&gt;
* $durl (string) - путь ссылки для даты, если не указана - дата выводится как просто строка. По умолчанию null.&lt;br /&gt;
* $eurl (string) - путь ссылки для значка, если не указана значок не показывается По умолчанию null.&lt;br /&gt;
* $imgsubdate (bool) - вывести значок под датой или рядом по умолчанию true (выводит значок под датой)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с отформатированной датой&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс содержит функции для работы со страницей списка журналов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
===== set_data() =====&lt;br /&gt;
Заполняет начальной информацией внутренние поля объекта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения (таблица [[Разработка:storages/departments|departments]]). По умолчанию 0.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
===== get_data() =====&lt;br /&gt;
Возвращает собранные данные&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив структурных подразделений&lt;br /&gt;
===== get_journals() =====&lt;br /&gt;
Получить все журнлы занесенных подразделений&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
== Подробное описание работы функций ==&lt;br /&gt;
В этом разделе описывается подробная работа всех публичных и внутренних методов для классов журнала. Если вам требуется только краткая справка по API, то обратитесь к разделу [[Разработка:im/journal#API|API]].&lt;br /&gt;
=== Для журнала группы ===&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
&lt;br /&gt;
===== Описание print_texttable() =====&lt;br /&gt;
[[#print_texttable()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
Итоговая функция, выводящая всю собранную информацию на экран. &lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собирает всю информацию при помощи функции [[Разработка:im/journal#Описание get_all_form()|get_all_form()]]&lt;br /&gt;
# обращается к плагину templater для представления информации в html-формате&lt;br /&gt;
# функцией print выводит результат работы templater'а на экран.&lt;br /&gt;
===== Описание check_permissions() =====&lt;br /&gt;
[[#check_permissions()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем учебный поток. Если поток не найден - возвращаем false.&lt;br /&gt;
# проверяем статус учебного потока. Если он не равен значению &amp;quot;go&amp;quot;, то возвращаем false.&lt;br /&gt;
# проверяем, имеет ли текущий пользователь права редактирования. Если нет, то возвращаем false.&lt;br /&gt;
# если все проверки пройдены успешно, то возвращаем true.&lt;br /&gt;
===== Описание get_all_form() =====&lt;br /&gt;
Возвращает объект формы для вставки в templater. Таблица в шаблоне формируется по столбцам, т. е. сначала выводится контрольная точка в тем. планировании, а затем оценки всех учеников за это событие (как при заполнении обычного школьного журнала).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $editid (int) - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid (int) - id редактируемого учебного события в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) объект нужной структуры для построения шаблона&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собираем в объект все стандартные надписи для таблицы&lt;br /&gt;
# собираем все запланированные активные контрольные точки учебного потока&lt;br /&gt;
# создадим массивы для названий месяцев и дат&lt;br /&gt;
# собираем в массив информацию по ученикам. Если параметр $editid не равен нулю, то в столбце оценок для редактируемой даты вместо оценки выводим форму.&lt;br /&gt;
# собираем в результурующий массив названия месяцев и дат &lt;br /&gt;
# если нужно распечатать форму - устанавливаем стандартные html-теги начала и конца формы&lt;br /&gt;
# возвращаем результат&lt;br /&gt;
&lt;br /&gt;
===== Описание get_cell_form() =====&lt;br /&gt;
Возвращает редактируемую ячейку таблицы журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons.&lt;br /&gt;
* $cpassedid (int) - id учебной программы&lt;br /&gt;
* $oldgrade (int) - старая оценка (если есть). По умолчанию null.&lt;br /&gt;
* $gradeid (int) - id оценки в таблице cpgrades . По умолчанию 0&lt;br /&gt;
* $eventid (int) - id учебного события в таблице [[Разработка:storages/schevents|schevents]].&lt;br /&gt;
* $scale (string) - шкала всех возможных оценок через запятую. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с html-кодом формы редактирования оценки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Вся форма редактирования оценки представляет собой маленькую таблицу. С левой стороны находится форма выбора оценки, а справа галочка для отметки отсутствующего ученика (верхняя ячейка) и пояснение к ней (нижняя ячейка).&lt;br /&gt;
# получаем все допустимые варианты оценок для данного задания из параметра scale.&lt;br /&gt;
# из этих вариантов оценки составляем html-элемент формы типа SELECT.&lt;br /&gt;
# если за задание уже есть ранее выставленная, старая оценка, то делаем ее оценкой по умолчанию&lt;br /&gt;
# узнаем статус присутствия ученика на занятии, и в зависимсости от этого проставляем галочку над буквой &amp;quot;н&amp;quot;. Форма с возможностью отмечания отсутствующих учеников отображается только для контрольных точек для которых есть события.&lt;br /&gt;
# возвращаем результат одной строкой.&lt;br /&gt;
===== Описание get_cell_string() =====&lt;br /&gt;
Получить текстовое содержимое ячейки оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий данные об элементе тематического планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - данные об оценке По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) html-код оценки, либо специальный знак пробела, чтобы в таблице было видно пустую ячейку&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
# узнаем данные о посещаемости: получаем id события, если оно есть&lt;br /&gt;
#* если событие есть, узнаем, был ли ученик на занятии&lt;br /&gt;
# находим оценку&lt;br /&gt;
#* если ученик был на занятии и получил оценку - выводим оценку&lt;br /&gt;
#* если ученик был на занятии и не получил оценку - выводим символ пробела&lt;br /&gt;
#* если ученик отсутствовал на занятии и нет оценки, то выводим букву &amp;quot;н&amp;quot;&lt;br /&gt;
#* если ученик отсутствовал на занятии и получил оценку - выводим оценку, и букву &amp;quot;н&amp;quot; рядом с ней&lt;br /&gt;
&lt;br /&gt;
===== Описание get_one_cell() =====&lt;br /&gt;
Возвращает данные в одной клетке журнала. Определяет какой тип ячейки выводить: для редактирования или текстовую.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий контрольную точку с событием  из тем. планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - объект содержащий данные об оценке (таблица cpgrades)&lt;br /&gt;
* $cpassedid (int) - id подписки (таблица cpassed)&lt;br /&gt;
* $editid (int) - id редактируемого в текущий момент элемента из тем. планирования&lt;br /&gt;
* $eventid (int) - id редактируемого в текущий момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
* $scale (string) = По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с html-кодом формы редактирования оценки, либо сама оценка, либо статус &amp;quot;отсутствовал&amp;quot;&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# сравниваем, совпадают ли id выводимой и редактируемой в данной момент контрольной точки&lt;br /&gt;
#* если id совпадают - то выводим форму редактирования оценки&lt;br /&gt;
#** если за это задание оценка уже была ранее выставлена, то выводим форму с установленной ранее оценкой&lt;br /&gt;
#** если за задание еще нет оценки - то выводим форму без предустановленных значений&lt;br /&gt;
#* если id не совпадают то выводим оценку текстом (либо статус &amp;quot;отсутствовал&amp;quot;, либо пустую клетку, в зависимости от того был ли ученик на уроке, и получил ли он оценку)&lt;br /&gt;
===== Описание get_line_for_student() =====&lt;br /&gt;
Возвращает строку таблицы журнала для одного ученика.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $i (int) - порядковый номер ученика в группе&lt;br /&gt;
* $student (object) - объект с данными об ученике из таблицы persons&lt;br /&gt;
* $cpasseds (array) - массив объектов, содержащий все подписки учеников этого потока&lt;br /&gt;
* $plans (array) -  массив объектов, содержащий все контрольные точки текущего курса (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (или 0, если события нет) Таблица [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - информация об ученике: его ФИО, и оценки по всем контрольным точкам, а также сведения о посещаемости&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в соответствующие поля итогового объекта порядковый номер ученика, и его ФИО&lt;br /&gt;
# перебираем все переданные подписки ищем ту, которая относится к переданному ученику&lt;br /&gt;
# записываем в итоговый объект id его подписки&lt;br /&gt;
# создаем массив для оценок и собираем оценки ученика:&lt;br /&gt;
#* перебираем все контрольные переданные точки ($plans)&lt;br /&gt;
#* для каждой контрольной точки создаем объект оценки&lt;br /&gt;
#* получаем значение оценки за просматриваемую контрольную точку&lt;br /&gt;
#* при помощи функции [[Разработка:im/journal#Описание get_one_cell()|get_one_cell()]] получаем оформленный html-код оценки&lt;br /&gt;
#* записываем полученный объект в массив оценок&lt;br /&gt;
# добавляем массив оценок в итоговый объект&lt;br /&gt;
# возвращаем итоговый объект&lt;br /&gt;
===== Описание get_lines_for_students() =====&lt;br /&gt;
Возвращает массив строк с ФИО и оценками для всех учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans (array) - массив всех контрольных точек учебного потока из таблицы plans&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) информация о всех учениках учебного потока или false, если ни одного ученика нет&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все подписки учебного потока, чтобы потом установить связи с оценками&lt;br /&gt;
# получаем учеников учебного потока&lt;br /&gt;
# присваиваем каждому ученику порядковый номер,&lt;br /&gt;
# получаем информацию по каждому ученику функцией [[#Описание get_line_for_student()|get_line_for_student()]] и заносим объект с информацией о нем в массив&lt;br /&gt;
# возвращаем получившийся массив &lt;br /&gt;
===== Описание create_datesstring() =====&lt;br /&gt;
Создает верхнюю строку журнала с названиями месяцев и списком дат в пригодном для обработки плагином templater виде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - список всех контрольных точек учебного потока из таблицы [[Разработка:storages/plans|plans]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий массив с данными для шаблонизатора&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Даты в электронном журнале должны будут проставляться как и в обычном классном журнале: верхняя строка - месяцы обучения, нижняя строка - даты проведенных или запланированных уроков, а также четвертные или годовые оценки.&lt;br /&gt;
Для того чтобы организовать такой внешний вид для электронного журнала мы должны воспользоваться параметром colspan для html-таблицы журнала, и расположить тем самым месяцы точно над датами проведенных уроков. Для этой задачи в этой функции мы создаем объект следующей структуры:&lt;br /&gt;
* ''(возвращаемый объект)''&lt;br /&gt;
** ''monthtitle'' - массив объектов, каждый из которых имеет свойства ''mtitle'' - название месяца, и ''mcolspan'' - количество ячеек с датами проведенных уроков в этом месяце&lt;br /&gt;
** ''monthdate'' - строка с датой проведенного урока, либо название контрольной точки.&lt;br /&gt;
&lt;br /&gt;
# получаем строку форматированных дат уроков при помощи функции [[#Описание generate_all_dates()|generate_all_dates()]]&lt;br /&gt;
# перебираем все события и собираем массивы дат и названий месяцев&lt;br /&gt;
#* если просматриваемая дата не находится в том же месяце, что и предыдущая, то дополняем массив месяцев&lt;br /&gt;
# прибавляем счетчик дат в месяце&lt;br /&gt;
# записываем новую дату в итоговый массив&lt;br /&gt;
# возвращаем итоговый массив&lt;br /&gt;
===== Описание generate_all_dates() =====&lt;br /&gt;
Вызывается из [[#Описание create_datesstring()|create_datesstring()]]. Получить отформатированные даты для журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - массив всех контрольных точек учебного потока (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - отформатированные даты для вывода в журнал&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получим событие из таблицы schevents, которое относится к данной теме тематического планирования&lt;br /&gt;
# если событие есть - то покажем дату&lt;br /&gt;
# если события нет - только название контрольной точки&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_single_date() =====&lt;br /&gt;
Вызывается из [[#Описание generate_all_dates|generate_all_dates]] Создает один объект даты для журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plan (object) - объект из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $date (string) - метка времени для события или контрольной точки&lt;br /&gt;
* $event (object) - Объект из таблицы [[Разработка:storages/schevents|schevents]]. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) дата в нужном для templater'a формате&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# устанавливаем путь (html-якорь) к теме в планирования на странице&lt;br /&gt;
# Определяем, id события которое будет редактировано. Если события нет, то передаем 0.&lt;br /&gt;
# записываем якорь с ссылкой в объект&lt;br /&gt;
# возвращаем объект&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
===== Описание get_topics() =====&lt;br /&gt;
Возвращает массив объектов c необходимыми свойствами для вставки в таблицу schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив тем входящих в планирование&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все контрольные точки учебного потока&lt;br /&gt;
# формируем объект с нужными полями для каждой контрольной точки&lt;br /&gt;
# возвращаем получившийся массив объектов&lt;br /&gt;
===== Описание get_empty_topic() =====&lt;br /&gt;
Возвращает &amp;quot;пустой&amp;quot; объект отчета об уроке &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект для вставки в таблицу [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* создаем объект с необходимым списком пустых полей и возвращаем его&lt;br /&gt;
===== Описание table_data() =====&lt;br /&gt;
Возвращает массив строк данных отформатированных для вывода с помощью moodle-функции print_table()&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив с данными для распечатки таблицы, либо false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли для переданного потока элементы тематического планирования.&lt;br /&gt;
#* если их нет - то возвращаем false&lt;br /&gt;
# формируем массив строк таблицы&lt;br /&gt;
# проставляем html-якоря для каждой контрольной точки на странице оценок&lt;br /&gt;
# добавляем ссылки на редактирования элементов учебного плана&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
===== Описание get_topic() =====&lt;br /&gt;
[[#get_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Проверяем, указан ли id контрольной точки. &lt;br /&gt;
** Если не указан - возврящаем пустую тему.&lt;br /&gt;
** Если указан - пробуем извлечь контрольную точку по такому id&lt;br /&gt;
*** Если контрольную точку извлечь не удалось - то возвращаем false&lt;br /&gt;
*** Если удалось - то возвращаем заполненный отчет об уроке&lt;br /&gt;
===== Описание save_topic() =====&lt;br /&gt;
[[#save_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем есть ли у нас данные в переменной $event для обновления или создания события. Если нет - то возвращаем false.&lt;br /&gt;
# определяем тип действия, которое надо совершить&lt;br /&gt;
#* если указан planid для события - то создаем новое событие для существующей контрольной точки&lt;br /&gt;
#* если нет id для контрольной точки - создаем новое событие и новую контрольную точку&lt;br /&gt;
#* в остальных случаях - обновляем контрольную точку и событие: вычисляем новую относительную дату, и обновляем записи в таблицах [[Разработка:storages/schevents|schevents]] и [[Разработка:storages/plans|plans]]&lt;br /&gt;
===== Описание create_topic() =====&lt;br /&gt;
[[#create_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем новый элемент тематического планирования в таблице plans (если это не удалось - то возвращаем false)&lt;br /&gt;
# добавляем в переданное событие id контрольной точки&lt;br /&gt;
# создаем событие из переданного объекта $event (если событие не создано - удаляем ранее созданный элемент тематического планирования)&lt;br /&gt;
# возвращаем id события&lt;br /&gt;
===== Описание create_checkpoint() =====&lt;br /&gt;
Создает и сохраняет запись в таблице plans&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $point (object) - данные для сохранения в таблицу [[Разработка:storages/plans|plans]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи или false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем дату начала обучения&lt;br /&gt;
# создаем заготовку для объекта контрольной точки&lt;br /&gt;
# вычисляем относительную дату контрольной точки&lt;br /&gt;
# заносим данные в базу&lt;br /&gt;
===== Описание create_event() =====&lt;br /&gt;
Создает объект события и сохраняет его в schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $event (object) - данные для сохранения&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи в таблице событий или false.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем id преподавателя в таблице persons&lt;br /&gt;
# создаем объект нужного формата и заносим туда все данные&lt;br /&gt;
# записываем данные в базу&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* csid - id учебного потока в таблице сstreams&lt;br /&gt;
===== Описание get_checkpoints() =====&lt;br /&gt;
Получить все контрольные точки одного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив объектов из таблицы plans или false &lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id учебного потока из таблицы cstreams&lt;br /&gt;
# выбираем из таблицы plans все записи, у которых поле cstreamid равно id учебного потока, и тип связи &amp;quot;cstreams&amp;quot;&lt;br /&gt;
# сортируем их в хронологическом порядке&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
&lt;br /&gt;
===== Описание get_students() =====&lt;br /&gt;
Получить всех учеников указанного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив записей из таблицы persons или false&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем список пройденных дисциплин&lt;br /&gt;
# перебираем все подписки и запоминаем id ученика для каждой из них&lt;br /&gt;
# извлекаем из таблицы persons учеников, чьи id были извлечены из подписок&lt;br /&gt;
&lt;br /&gt;
===== Описание get_teacherid() =====&lt;br /&gt;
Получить id преподавателя учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id преподавателя или false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* id преподавателя всегда берется только из записи учебного потока из таблицы cstreams&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* gradedata - (object) все оценки и сопутствующая им информация&lt;br /&gt;
* mypost - (array) непроверенные данные пришедшие из массива $_POST. Используются только для составления повторного запроса на сохранение данных.&lt;br /&gt;
===== Описание __construct =====&lt;br /&gt;
[[#Класс dof_im_journal_rawdata|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект, в который мы будем складывать все проверенные данные, пришедшие из формы&lt;br /&gt;
# проверяем скалярные данные: все числовые идентификаторы, и отдельные строки, и после проверки записываем их в итоговый объект&lt;br /&gt;
# теперь, зная cstreamid из проверенных скалярных данных вызываем родительский конструктор&lt;br /&gt;
# проверяем массивы, пришедшие из формы: &lt;br /&gt;
#* данные об отсутствующих учениках&lt;br /&gt;
#* массив оценок &lt;br /&gt;
#* массив идентификаторов подписок (таблица cpassed)&lt;br /&gt;
#* узнаем id оценок для изменения их статуса&lt;br /&gt;
# записываем все проверенные данные в итоговый массив&lt;br /&gt;
# определяем тип действия, которое надо совершить: &lt;br /&gt;
#* сохранить данные&lt;br /&gt;
#* сохранить данные и продолжить редактирование&lt;br /&gt;
#* восстановить исходные значения&lt;br /&gt;
# записываем исходный массив (непроверенный) в поле объекта, если потом понадобится еще раз отправить данные после подтверждения&lt;br /&gt;
===== Описание process_form() =====&lt;br /&gt;
[[#process_form()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# в самом начале проверяем тип действия, которое надо совершить. Если этим действием является &amp;quot;отменить изменения&amp;quot;, то не переходим к сохранению оценок и сразуже выполняем перенаправление на страницу журнала. В остальных случаях идем дальше:&lt;br /&gt;
# проверяем, установлено ли у кого-нибудь из учеников одновременно &amp;quot;н&amp;quot; и оценка. Если это так - то перенаправим пользователя на страницу с сообщением об этом, и попросим его подтвердить такой выбор.&lt;br /&gt;
#* если пользователь согласен с изменениями, которые он сделал, то все выставленые им оценки и сведения о посещаемости сохраняются&lt;br /&gt;
#* если же нет - то происходит отмена всех изменений&lt;br /&gt;
# в случае, когда никаких предупреждений нет - сначала формируем приказ для оценок&lt;br /&gt;
# затем приказ о посещаемости&lt;br /&gt;
# если все действия произведены успешно - производим редирект. Если же возникли ошибки - сообщаем об этом&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_order_grades() =====&lt;br /&gt;
Сформировать приказ об изменении состояния учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true если приказ успешно сформирован, и false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id подразделения в таблице departments&lt;br /&gt;
# определяем тип действия, которое нужно совершить с оценкой&lt;br /&gt;
# обращаемся к функциям выставления, либо удаления оценки&lt;br /&gt;
===== Описание order_set_grade() =====&lt;br /&gt;
Формирует приказ - установить оценку. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true в случае успеха и false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# подключаем методы работы с приказом&lt;br /&gt;
# создаем объект для записи&lt;br /&gt;
# сохраняем автора приказа, подразделение, к которому он относится, дату создания приказа&lt;br /&gt;
# добавляем данные, которые определяют назначение приказа&lt;br /&gt;
# сохраняем приказ в БД, в таблицу orders&lt;br /&gt;
# подписываем приказ&lt;br /&gt;
# исполняем приказ&lt;br /&gt;
Методы order_delete_grade и order_update_grade работают по такому же принципу.&lt;br /&gt;
===== Описание get_grades_fororder() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $type - тип действия, которое необходимо будет произвести над оценкой. Возможные значения: ''set_grade'' и ''delete_grade''.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий список оценок и все идентификаторы для формирования приказа.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в него дату, id учителя (в таблице persons) и id контрольной точки (в таблице plans&lt;br /&gt;
# перебираем все оценки из внутреннего массива с проверенными данными&lt;br /&gt;
# определяем тип действия, которое над ней нужно совершить&lt;br /&gt;
# в зависимости от типа действия (установление или удаление оценки) записываем в объект оценки нужные идентификаторы&lt;br /&gt;
# упаковываем оценки в итоговый массив и возвращаем его&lt;br /&gt;
=== Для списка журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс служит для сбора и вывода информации по всем структурным подразделениям. Информация выводится древовидно: самый верхний уровень - подразделение, затем учебные программы, затем учебные периоды, элементы учебной программы, и в самом конце - журналы учебного потока.&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $departments массив структуры&lt;br /&gt;
    array(&lt;br /&gt;
    [departmentid] =&amp;gt; obj  -&amp;gt; departmentname = 'department_name'&lt;br /&gt;
                      obj  -&amp;gt; programms = array(&lt;br /&gt;
      [programmid]   =&amp;gt; obj1 -&amp;gt; programmname = 'programm_name'&lt;br /&gt;
                        obj1 -&amp;gt; ages = array(&lt;br /&gt;
        [agenum]       =&amp;gt; obj2 -&amp;gt; agename = 'age_name'&lt;br /&gt;
                          obj2 -&amp;gt; items = array(&lt;br /&gt;
          [itemid]       =&amp;gt; obj3 -&amp;gt; itemname = 'item_name'&lt;br /&gt;
                            obj3 -&amp;gt; cstreams = array(&lt;br /&gt;
            [cstreamid]    =&amp;gt; obj4 -&amp;gt; cstreamname = 'cstream_name'&lt;br /&gt;
                                    )''// конец массива cstreams''&lt;br /&gt;
                                  )''// конец массива items''&lt;br /&gt;
                                )''// конец массива ages''&lt;br /&gt;
                              )''// конец массива programms''&lt;br /&gt;
         )''// конец общего массива''&lt;br /&gt;
    содержит данные для вставку в темплатер после добавления еще одного уровня:&lt;br /&gt;
    $fortemplater-&amp;gt;departments = $this-&amp;gt;departments;&lt;br /&gt;
В общем виде сбор данных выглядит так: &lt;br /&gt;
# сначала собирается информация по структурному подразделению (одному или нескольким), и информация по ним записывается в итоговый объект&lt;br /&gt;
# затем получаются все программы учебного подразделения, информация по ним записывается в итоговый массив&lt;br /&gt;
# извлекается и записывается в итоговый объект список учебных периодов &lt;br /&gt;
# для каждого учебного периода получаются элементы учебной программы, которые изучаются в нем&lt;br /&gt;
# для каждого элемента учебной программы получаются учебные потоки&lt;br /&gt;
# для каждого учебного потока получается его журнал&lt;br /&gt;
===== Описание set_data() =====&lt;br /&gt;
[[#set_data()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* получаем id структурного подразделения из таблицы departments.&lt;br /&gt;
** если оно есть - то получаем информацию только по нему&lt;br /&gt;
** если получили 0 вместо id подразделения - то выводим информацию по всем подразделениям&lt;br /&gt;
&lt;br /&gt;
===== Описание get_journals_department() =====&lt;br /&gt;
Возвращает журналы одного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - набор журналов &lt;br /&gt;
* (bool) - false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все программы, за которые отвечает подразделение&lt;br /&gt;
# для каждой программы получаем все ее журналы&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2086</id>
		<title>Разработка:im/journal</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:im/journal&amp;diff=2086"/>
				<updated>2011-01-12T12:58:51Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Классный журнал */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Классный журнал ==&lt;br /&gt;
В журнале можно выставлять оценки и вводить отчет о проведенном уроке.&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
Вверху страницы находится форма для выбора подразделения и кнопка &amp;quot;показать&amp;quot;. По умолчанию показывается информация по всем учебным подразделениям. При выборе конкретного учебного подразделения показывается информация только по нему.&lt;br /&gt;
&lt;br /&gt;
Вывод информации по журналам организован в виде маркированного списка следующего вида:&lt;br /&gt;
* ''Подразделение''&lt;br /&gt;
** ''Учебная программа''&lt;br /&gt;
*** ''Учебный период''&lt;br /&gt;
**** ''Предмет''&lt;br /&gt;
***** ''Учебный поток (дата_начала - дата_окончания)''&lt;br /&gt;
Каждая запись учебного потока является ссылкой на страницу журнала учебного потока.&lt;br /&gt;
=== Журнал класса ===&lt;br /&gt;
Под панелью навигации выводится надпись &amp;quot;Журнал группы&amp;quot;.&lt;br /&gt;
Ниже таблица с информацией о потоке - программа, предмет, группа, преподаватель. Справа от этой таблицы размещена  ссылка &amp;quot;Новый урок&amp;quot;. Нажатие на нее позволяет создать новый отчет об уроке. Над этой ссылкой будут выводиться сообщения об ошибках сохранения данных из таблицы оценок.&lt;br /&gt;
Ниже отображаются две таблицы - таблица оценок и, справа от нее, таблица отчетов об уроке. Обе таблицы сделаны максимально похожими на соответствующие таблицы в бумажном &amp;quot;Классном журнале&amp;quot;. Таблицы связаны друг с другом. Так, дата в таблице оценок отображаются только в том случае, если был создан отчет об уроке для этой даты. При нажатии на дату в таблице оценок, происходит перемещение к соответствующей строке отчета об уроке.&lt;br /&gt;
=== Таблица оценок. ===&lt;br /&gt;
Если таблица отчетов об уроке пуста, то в таблице оценок нет ни одной колонки с датой.&lt;br /&gt;
Если журнал заполнен, то в верхней строке отображаются названия месяцев, ниже номера дней месяцев, на которые приходились занятия. Каждое число месяца - ссылка, при нажатии на которую происходит переход на соответствующую этому дню строку таблицы отчета об уроке.&lt;br /&gt;
Сразу под числом расположен значок редактирования. Он также выполнен в виде ссылки. При нажатии на него страница перезагружается в режиме формы ввода оценок и выставления присутствия учеников на уроке, который проходил в тот день, по значку под числом которого щелкнули.&lt;br /&gt;
В колонке этого дня, напротив фамилии каждого ученика появляются два поля. Поле выбора из списка - для проставления оценки. И поле переключатель - для отметки присутствия на уроке. Об этом напоминает буква &amp;quot;н&amp;quot;, расположенная справа от него. Если ученик был на уроке, то это поле следует оставить пустым. Если не был - поставить там флажок. Для выставления оценки следует выбрать элемент из списка. После того как изменения будут сохранены, в соответствующих клетках появятся буквы &amp;quot;Н&amp;quot; или оценки. Если кому-то была выставлена и оценка и отметка об отсутствии на уроке, на против его фамилии можно будет увидеть букву &amp;quot;Н&amp;quot;. Однако перед сохранением будет выведено предупреждение о том, что выставлена оценка отсутствующему ученику. Под уведомлением будут две кнопки - &amp;quot;Продолжить&amp;quot; и &amp;quot;Отменить&amp;quot;. При нажатии на &amp;quot;Продолжить&amp;quot; сценарий сохранения будет выполнен. Нажатие на другую кнопку вызовет отмену процедуры сохранения и возврат к форме с несохраненными изменениями.&lt;br /&gt;
При переключении в режим формы под таблицей появляется надпись &amp;quot;Внимание! До нажатия кнопки &amp;quot;сохранить&amp;quot; оценки не сохраняются.&amp;quot; И три кнопки - &amp;quot;Сохранить&amp;quot;, &amp;quot;Сохранить и продолжить&amp;quot;, &amp;quot;Восстановить&amp;quot;. Нажатие на первую кнопку сохраняет изменения, сделанные в форме и перезагружает страницу в режим просмотра. Вторая - сохраняет сделанные изменения, но страница остается в режиме формы - можно продолжать ввод. Третья кнопка отменяет сделанные изменения. Все введенные,  но несохраненные данные удаляются из формы. Форма перегружается с отображением последних сохраненных изменений.&lt;br /&gt;
Если ученику была выставлена оценка, а затем отменена - в форме было выбрано пустое поле, то ранее выбранная оценка будет удалена. Если оценка была изменена, то оценка будет обновлена. Каждое из этих действий, а также выставление статуса присутствия на уроке, будет выполнено через издание приказа.&lt;br /&gt;
Если редактируется контрольная точка без события, то в форме показываеются только поля выставления оценки. Поле присутствия на уроке не показывается и статус присутствия не сохраняется.&lt;br /&gt;
Контрольная точка без события выводится в таблице оценок без даты. Вместо даты выводится название КТ.&lt;br /&gt;
Что происходит в процессе сохранения.&lt;br /&gt;
После того как нажата одна из кнопок, сохраняющая внесенные изменения происходит&lt;br /&gt;
&lt;br /&gt;
* формирование приказа регистрации присутствия учеников на уроке. В него сохраняются данные о всех учениках потока, их статусы присутствия, id события, статус присутствия на котором выставляется.&lt;br /&gt;
* применение приказа и сохранение статусов учеников в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
Если были выставлены оценки. То в дополнение к вышеописанным действиям происходят следующие действия:&lt;br /&gt;
* формирование приказа регистрации выставления оценок только тем ученикам, которые их получили на уроке. В приказе сохраняются: точное время выставления оценки, id КТ, за которую выставлена оценка, id преподавателя (из /storage/persons), который выставил оценку, ученики, которые получили оценку, и соответствующие им оценки, статус оценки, id подписки ученика на поток.&lt;br /&gt;
* применение приказа и сохранение оценок в соответствующих таблицах.&lt;br /&gt;
&lt;br /&gt;
После создания отчета об уроке, происходит возврат на главную страницу журнала и таблица оценок загружается в режиме формы того дня, отчет для которого был создан. Если этот день выходит за границы видимости окна, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой. После редактирования отчета об уроке таблица оценок загружается в режиме просмотра. Если день, для которого происходило редактирование отчета выходит за границы видимости, то происходит перемещение таблицы оценок таким образом, чтобы нужная колонка оказалась видимой.&lt;br /&gt;
&lt;br /&gt;
=== Таблица отчетов об уроках. ===&lt;br /&gt;
Представляет собой таблицу из шести столбцов.&lt;br /&gt;
Первый столбец - порядковый номер урока. Второй - дата урока в фомате дд.мм. Третий - тема урока - произвольный текст. Четвертый - задание на дом. Пятый - замена урока или преподавателя. Пятый - заметки об уроке. В настоящее время три последних поля не используются.&lt;br /&gt;
Уроки сортируются по датам, сверху вниз по возрастанию.&lt;br /&gt;
Под датой располагается значок редактирования информации об уроке, выполненный в виде ссылки. При щелчке по нему открывается новая страница с формой редактирования отчета об уроке. Все поля формы заполнены соответствующей информацией. Ее можно изменить, а изменения сохранить.&lt;br /&gt;
Эта же страница открывается при щелчке по ссылке &amp;quot;Новый урок&amp;quot;.&lt;br /&gt;
=== Страница редактирования урока. ===&lt;br /&gt;
Вверху страницы, под строкой навигации, выводится надпись &amp;quot;Классный журнал&amp;quot;.&lt;br /&gt;
Ниже выводится форма ввода информации об уроке - &amp;quot;Отчет об уроке&amp;quot;. В поле &amp;quot;Дата проведения урока&amp;quot; нужно выбрать дату урока. В поле &amp;quot;Элементы темплана&amp;quot; можно выбрать тему для нового урока. Ниже находится текстовое поле ввода &amp;quot;Что пройдено на уроке&amp;quot;. Сюда можно ввести тему урока вручную.&lt;br /&gt;
Еще ниже поле &amp;quot;Домашнее задание&amp;quot; для ввода соответствующей информации.&lt;br /&gt;
В самом низу расположены две кнопки - &amp;quot;Сохранить&amp;quot; и &amp;quot;Отмена&amp;quot;. При нажатии на вторую происходит возврат на главную страницу журнала без сохранения внесенных изменений. После нажатия на кнопку &amp;quot;Сохранить&amp;quot; происходит сохранение введенных данных в соответствующих таблицах. О результатах операции сохранения информирует надпись, выводимая под кнопками. Еще ниже появляется ссылка &amp;quot;назад&amp;quot; для возврата на главную страницу журнала. В случае возврата после сохранения данных, таблица оценок загружается в режиме редактирования данных на дату только что сохраненного урока.&lt;br /&gt;
Правее формы редактирования урока расположено окно с полосами прокрутки, в котором можно просмотреть темы уже проведенных уроков.&lt;br /&gt;
Они выводятся в видет таблицы из двух столбцов, в которых указываются соответственно дата и тема урока.&lt;br /&gt;
В зависимости от заполненности полей ввода возможны разные варианты обработки введенных данных.&lt;br /&gt;
&lt;br /&gt;
{|border=1&lt;br /&gt;
 |id КТ&lt;br /&gt;
 |id темы, выбранной из списка.&lt;br /&gt;
 |как обрабатывается&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |0&lt;br /&gt;
 |создается новая КТ и новое событие.&lt;br /&gt;
 |-&lt;br /&gt;
 |0&lt;br /&gt;
 |выбрана из списка&lt;br /&gt;
 |создается новое событие, привязанное к КТ, выбранной из списка&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и равна id КТ&lt;br /&gt;
 |обновляем КТ и (если изменяется дата) все события, которые ей соответствуют.&lt;br /&gt;
Тему из списка &amp;quot;Элементы темтемплана&amp;quot; выбрать нельзя.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |выбрана из списка и не равна id КТ&lt;br /&gt;
 |такая ситуация запрещена.&lt;br /&gt;
 |-&lt;br /&gt;
 |существующая КТ&lt;br /&gt;
 |0&lt;br /&gt;
 |такая ситуация запрещена&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Ведомость итоговых оценок ===&lt;br /&gt;
На данной странице можно выставить итоговые оценки учащимся и завершить обучение потока. Страница принимает обязательный параметр id - id идущего  или завершенного потока.&lt;br /&gt;
&lt;br /&gt;
Вверху страныцы отображается форма, где отображены ученики, которые обучаются на данном потоке. Напротив каждого можно выбрать итоговую оценку, выставляемую учащемуся. Итоговые оценки берутся из шкалы дисциплины приписанной к данному потоку. Под ведомостью стоит галочка подтвержения оценок, без нее оценки не сохранятся. Делее стоит галочка завершения обучения если необходимо завершить поток, При завершении потока все подписки на дисциплину переводятся в один из конечных статусов. Если поток уже завершен, то галочка не показывается, вместо нее предупреждение. После завершения потока оценки также можно выставить, но они уже будут идти как переэкзаменовка. &lt;br /&gt;
&lt;br /&gt;
После того как мы выставили оценки и нажали на кнопку сохранить формируется приказ о выставленни итоговых оценок. На основе этого приказа сохраняются оценки, после чего на новой странице показывается шаблон ведомости в том виде, в котом она будет распечатана. &lt;br /&gt;
После первого сохранения оценок эта ведомость также становится доступна для печати. &lt;br /&gt;
&lt;br /&gt;
Перейти на эту страницу можно со страницы Журнала группы.&lt;br /&gt;
&lt;br /&gt;
==Права==&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
В этом разделе описаны функции для работы со страницами &amp;quot;журнал группы&amp;quot; и &amp;quot;список журналов&amp;quot;. Здесь содержится только краткое описание функций и их параметров. Если вас интересует их внутренняя логика, то обратитесь к разделу [[Разработка:im/journal#Подробное описание работы функций|Подробное описание]]. Аргументы всех функций перечислены именно в том порядке, в котором их следует передавать.&lt;br /&gt;
=== Журнал группы ===&lt;br /&gt;
В этом разделе собраны все функции, которые относятся к странице &amp;quot;журнал группы&amp;quot;&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
Класс отрисовки школьного журнала&lt;br /&gt;
===== print_texttable() =====&lt;br /&gt;
Вывести страницу журнала - просмотр оценок, или редактирование&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $editid  - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid - id учебного события, которое будет редактировано (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* null&lt;br /&gt;
===== check_permissions() =====&lt;br /&gt;
Проверяет разрешения на редактирование оценок для текущего пользователя&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true/false - есть или нет разрешения на редактирование оценок&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
Класс для отрисовки таблицы тематического планирования в классном журнале&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
 &lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Выводит таблицу тематического планирования на экран&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
Класс для создания или редактирования одной темы на странице планирования уроков&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $planid - id элемента учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
* $eventid - id учебного события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== get_topic() =====&lt;br /&gt;
Возвращает объект с полями, необходимыми для заполнения формы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - объект с полями для вставки в форму, или false в случае ошибки&lt;br /&gt;
===== create_topic() =====&lt;br /&gt;
Создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint - контрольная точка из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event - заранее заготовленный объект для таблицы [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи из таблицы schevents или false в случае ошибки&lt;br /&gt;
===== save_topic() =====&lt;br /&gt;
Обновляет существующий или создает новый элемент тематического планирования&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $checkpoint (object) - объект для обновления или создания записи в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $event (object) - объект для обновления или создания записи в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true, если все записи успешно обновлены&lt;br /&gt;
* (int), id новой записи, если она была добавлена&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
===== print_table() =====&lt;br /&gt;
Формирует таблицу тематического планирования в правой части страницы журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*  true если операция вывода прошла успешно, или false если при выводе возникли ошибки&lt;br /&gt;
===== get_anchor_id() =====&lt;br /&gt;
Возвращает метку времени, которая будет создана для нового урока, чтобы осуществить корректное перенаправление на страницу журнала&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $time - (int) время создания нового события: метка времени в формате unixtime&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - метка времени для перенаправления&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
Класс для подготовки сырых исходных данных для формирования школьного журнала и ему подобных документов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор - определяет с каким учебным потоком будет вестись работа&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
Класс для проверки и обработки оценок из формы&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
Конструктор класса. Осуществляет все проверки и записывает данные во внутреннее поле.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $gradedata (array) - массив $_POST из формы&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== process_form() =====&lt;br /&gt;
Обработать все данные, пришедшие из формы: установить посещаемость, выставить оценки и сформировать приказы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* false в случае неудачи. В случае успеха производит редирект на страницу журнала&lt;br /&gt;
==== Класс dof_im_journal_presence ====&lt;br /&gt;
Класс для обработки информации о посещаемости &lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $csid - id учебного потока&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
===== presence_students() =====&lt;br /&gt;
Формирует массив присутствия учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
===== absence_students() =====&lt;br /&gt;
Формирует массив отсутствующих студентов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $away - массив id отсутствующих учеников&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* массив вида [id_ученика]=&amp;gt;статус_присутствия&lt;br /&gt;
==== Дополнительные функции ====&lt;br /&gt;
===== dof_im_journal_format_date() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времення для преобразования.&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'.&lt;br /&gt;
* $url (string) - Указывается, если необходимо получить дату как ссылку. По умолчанию NULL&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с отформатированной датой&lt;br /&gt;
===== dof_im_journal_date_edit() =====&lt;br /&gt;
Возвращает отформатироанную дату и значок редактирования как ссылку&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $date (int) - метка времени&lt;br /&gt;
* $format (string) - формат выводимой даты. По умолчанию 'dmy'&lt;br /&gt;
* $durl (string) - путь ссылки для даты, если не указана - дата выводится как просто строка. По умолчанию null.&lt;br /&gt;
* $eurl (string) - путь ссылки для значка, если не указана значок не показывается По умолчанию null.&lt;br /&gt;
* $imgsubdate (bool) - вывести значок под датой или рядом по умолчанию true (выводит значок под датой)&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с отформатированной датой&lt;br /&gt;
=== Список журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс содержит функции для работы со страницей списка журналов&lt;br /&gt;
===== __construct() =====&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
''Возвращаемые значения:'' нет&lt;br /&gt;
&lt;br /&gt;
===== set_data() =====&lt;br /&gt;
Заполняет начальной информацией внутренние поля объекта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения (таблица [[Разработка:storages/departments|departments]]). По умолчанию 0.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
===== get_data() =====&lt;br /&gt;
Возвращает собранные данные&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив структурных подразделений&lt;br /&gt;
===== get_journals() =====&lt;br /&gt;
Получить все журнлы занесенных подразделений&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true если все нормально или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
== Подробное описание работы функций ==&lt;br /&gt;
В этом разделе описывается подробная работа всех публичных и внутренних методов для классов журнала. Если вам требуется только краткая справка по API, то обратитесь к разделу [[Разработка:im/journal#API|API]].&lt;br /&gt;
=== Для журнала группы ===&lt;br /&gt;
==== Класс dof_im_journal_tablegrades ====&lt;br /&gt;
&lt;br /&gt;
===== Описание print_texttable() =====&lt;br /&gt;
[[#print_texttable()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
Итоговая функция, выводящая всю собранную информацию на экран. &lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собирает всю информацию при помощи функции [[Разработка:im/journal#Описание get_all_form()|get_all_form()]]&lt;br /&gt;
# обращается к плагину templater для представления информации в html-формате&lt;br /&gt;
# функцией print выводит результат работы templater'а на экран.&lt;br /&gt;
===== Описание check_permissions() =====&lt;br /&gt;
[[#check_permissions()|Описание API]].&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем учебный поток. Если поток не найден - возвращаем false.&lt;br /&gt;
# проверяем статус учебного потока. Если он не равен значению &amp;quot;go&amp;quot;, то возвращаем false.&lt;br /&gt;
# проверяем, имеет ли текущий пользователь права редактирования. Если нет, то возвращаем false.&lt;br /&gt;
# если все проверки пройдены успешно, то возвращаем true.&lt;br /&gt;
===== Описание get_all_form() =====&lt;br /&gt;
Возвращает объект формы для вставки в templater. Таблица в шаблоне формируется по столбцам, т. е. сначала выводится контрольная точка в тем. планировании, а затем оценки всех учеников за это событие (как при заполнении обычного школьного журнала).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $editid (int) - id редактируемого учебного плана в таблице [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $eventid (int) - id редактируемого учебного события в таблице [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) объект нужной структуры для построения шаблона&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# собираем в объект все стандартные надписи для таблицы&lt;br /&gt;
# собираем все запланированные активные контрольные точки учебного потока&lt;br /&gt;
# создадим массивы для названий месяцев и дат&lt;br /&gt;
# собираем в массив информацию по ученикам. Если параметр $editid не равен нулю, то в столбце оценок для редактируемой даты вместо оценки выводим форму.&lt;br /&gt;
# собираем в результурующий массив названия месяцев и дат &lt;br /&gt;
# если нужно распечатать форму - устанавливаем стандартные html-теги начала и конца формы&lt;br /&gt;
# возвращаем результат&lt;br /&gt;
&lt;br /&gt;
===== Описание get_cell_form() =====&lt;br /&gt;
Возвращает редактируемую ячейку таблицы журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons.&lt;br /&gt;
* $cpassedid (int) - id учебной программы&lt;br /&gt;
* $oldgrade (int) - старая оценка (если есть). По умолчанию null.&lt;br /&gt;
* $gradeid (int) - id оценки в таблице cpgrades . По умолчанию 0&lt;br /&gt;
* $eventid (int) - id учебного события в таблице [[Разработка:storages/schevents|schevents]].&lt;br /&gt;
* $scale (string) - шкала всех возможных оценок через запятую. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - строка с html-кодом формы редактирования оценки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Вся форма редактирования оценки представляет собой маленькую таблицу. С левой стороны находится форма выбора оценки, а справа галочка для отметки отсутствующего ученика (верхняя ячейка) и пояснение к ней (нижняя ячейка).&lt;br /&gt;
# получаем все допустимые варианты оценок для данного задания из параметра scale.&lt;br /&gt;
# из этих вариантов оценки составляем html-элемент формы типа SELECT.&lt;br /&gt;
# если за задание уже есть ранее выставленная, старая оценка, то делаем ее оценкой по умолчанию&lt;br /&gt;
# узнаем статус присутствия ученика на занятии, и в зависимсости от этого проставляем галочку над буквой &amp;quot;н&amp;quot;. Форма с возможностью отмечания отсутствующих учеников отображается только для контрольных точек для которых есть события.&lt;br /&gt;
# возвращаем результат одной строкой.&lt;br /&gt;
===== Описание get_cell_string() =====&lt;br /&gt;
Получить текстовое содержимое ячейки оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий данные об элементе тематического планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - данные об оценке По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) html-код оценки, либо специальный знак пробела, чтобы в таблице было видно пустую ячейку&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
# узнаем данные о посещаемости: получаем id события, если оно есть&lt;br /&gt;
#* если событие есть, узнаем, был ли ученик на занятии&lt;br /&gt;
# находим оценку&lt;br /&gt;
#* если ученик был на занятии и получил оценку - выводим оценку&lt;br /&gt;
#* если ученик был на занятии и не получил оценку - выводим символ пробела&lt;br /&gt;
#* если ученик отсутствовал на занятии и нет оценки, то выводим букву &amp;quot;н&amp;quot;&lt;br /&gt;
#* если ученик отсутствовал на занятии и получил оценку - выводим оценку, и букву &amp;quot;н&amp;quot; рядом с ней&lt;br /&gt;
&lt;br /&gt;
===== Описание get_one_cell() =====&lt;br /&gt;
Возвращает данные в одной клетке журнала. Определяет какой тип ячейки выводить: для редактирования или текстовую.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $studentid (int) - id ученика в таблице persons&lt;br /&gt;
* $plan (object) - объект содержащий контрольную точку с событием  из тем. планирования (таблица [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $gradedata (object) - объект содержащий данные об оценке (таблица cpgrades)&lt;br /&gt;
* $cpassedid (int) - id подписки (таблица cpassed)&lt;br /&gt;
* $editid (int) - id редактируемого в текущий момент элемента из тем. планирования&lt;br /&gt;
* $eventid (int) - id редактируемого в текущий момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
* $scale (string) = По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) строка с html-кодом формы редактирования оценки, либо сама оценка, либо статус &amp;quot;отсутствовал&amp;quot;&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# сравниваем, совпадают ли id выводимой и редактируемой в данной момент контрольной точки&lt;br /&gt;
#* если id совпадают - то выводим форму редактирования оценки&lt;br /&gt;
#** если за это задание оценка уже была ранее выставлена, то выводим форму с установленной ранее оценкой&lt;br /&gt;
#** если за задание еще нет оценки - то выводим форму без предустановленных значений&lt;br /&gt;
#* если id не совпадают то выводим оценку текстом (либо статус &amp;quot;отсутствовал&amp;quot;, либо пустую клетку, в зависимости от того был ли ученик на уроке, и получил ли он оценку)&lt;br /&gt;
===== Описание get_line_for_student() =====&lt;br /&gt;
Возвращает строку таблицы журнала для одного ученика.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $i (int) - порядковый номер ученика в группе&lt;br /&gt;
* $student (object) - объект с данными об ученике из таблицы persons&lt;br /&gt;
* $cpasseds (array) - массив объектов, содержащий все подписки учеников этого потока&lt;br /&gt;
* $plans (array) -  массив объектов, содержащий все контрольные точки текущего курса (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (или 0, если события нет) Таблица [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - информация об ученике: его ФИО, и оценки по всем контрольным точкам, а также сведения о посещаемости&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в соответствующие поля итогового объекта порядковый номер ученика, и его ФИО&lt;br /&gt;
# перебираем все переданные подписки ищем ту, которая относится к переданному ученику&lt;br /&gt;
# записываем в итоговый объект id его подписки&lt;br /&gt;
# создаем массив для оценок и собираем оценки ученика:&lt;br /&gt;
#* перебираем все контрольные переданные точки ($plans)&lt;br /&gt;
#* для каждой контрольной точки создаем объект оценки&lt;br /&gt;
#* получаем значение оценки за просматриваемую контрольную точку&lt;br /&gt;
#* при помощи функции [[Разработка:im/journal#Описание get_one_cell()|get_one_cell()]] получаем оформленный html-код оценки&lt;br /&gt;
#* записываем полученный объект в массив оценок&lt;br /&gt;
# добавляем массив оценок в итоговый объект&lt;br /&gt;
# возвращаем итоговый объект&lt;br /&gt;
===== Описание get_lines_for_students() =====&lt;br /&gt;
Возвращает массив строк с ФИО и оценками для всех учеников&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans (array) - массив всех контрольных точек учебного потока из таблицы plans&lt;br /&gt;
* $editid (int) - id редактируемой в данный момент контрольной точки (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
* $eventid (int) - id редактируемого в данный момент события (таблица [[Разработка:storages/schevents|schevents]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) информация о всех учениках учебного потока или false, если ни одного ученика нет&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все подписки учебного потока, чтобы потом установить связи с оценками&lt;br /&gt;
# получаем учеников учебного потока&lt;br /&gt;
# присваиваем каждому ученику порядковый номер,&lt;br /&gt;
# получаем информацию по каждому ученику функцией [[#Описание get_line_for_student()|get_line_for_student()]] и заносим объект с информацией о нем в массив&lt;br /&gt;
# возвращаем получившийся массив &lt;br /&gt;
===== Описание create_datesstring() =====&lt;br /&gt;
Создает верхнюю строку журнала с названиями месяцев и списком дат в пригодном для обработки плагином templater виде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - список всех контрольных точек учебного потока из таблицы [[Разработка:storages/plans|plans]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий массив с данными для шаблонизатора&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
Даты в электронном журнале должны будут проставляться как и в обычном классном журнале: верхняя строка - месяцы обучения, нижняя строка - даты проведенных или запланированных уроков, а также четвертные или годовые оценки.&lt;br /&gt;
Для того чтобы организовать такой внешний вид для электронного журнала мы должны воспользоваться параметром colspan для html-таблицы журнала, и расположить тем самым месяцы точно над датами проведенных уроков. Для этой задачи в этой функции мы создаем объект следующей структуры:&lt;br /&gt;
* ''(возвращаемый объект)''&lt;br /&gt;
** ''monthtitle'' - массив объектов, каждый из которых имеет свойства ''mtitle'' - название месяца, и ''mcolspan'' - количество ячеек с датами проведенных уроков в этом месяце&lt;br /&gt;
** ''monthdate'' - строка с датой проведенного урока, либо название контрольной точки.&lt;br /&gt;
&lt;br /&gt;
# получаем строку форматированных дат уроков при помощи функции [[#Описание generate_all_dates()|generate_all_dates()]]&lt;br /&gt;
# перебираем все события и собираем массивы дат и названий месяцев&lt;br /&gt;
#* если просматриваемая дата не находится в том же месяце, что и предыдущая, то дополняем массив месяцев&lt;br /&gt;
# прибавляем счетчик дат в месяце&lt;br /&gt;
# записываем новую дату в итоговый массив&lt;br /&gt;
# возвращаем итоговый массив&lt;br /&gt;
===== Описание generate_all_dates() =====&lt;br /&gt;
Вызывается из [[#Описание create_datesstring()|create_datesstring()]]. Получить отформатированные даты для журнала&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plans - массив всех контрольных точек учебного потока (из таблицы [[Разработка:storages/plans|plans]])&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - отформатированные даты для вывода в журнал&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получим событие из таблицы schevents, которое относится к данной теме тематического планирования&lt;br /&gt;
# если событие есть - то покажем дату&lt;br /&gt;
# если события нет - только название контрольной точки&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_single_date() =====&lt;br /&gt;
Вызывается из [[#Описание generate_all_dates|generate_all_dates]] Создает один объект даты для журнала.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $plan (object) - объект из таблицы [[Разработка:storages/plans|plans]]&lt;br /&gt;
* $date (string) - метка времени для события или контрольной точки&lt;br /&gt;
* $event (object) - Объект из таблицы [[Разработка:storages/schevents|schevents]]. По умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) дата в нужном для templater'a формате&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# устанавливаем путь (html-якорь) к теме в планирования на странице&lt;br /&gt;
# Определяем, id события которое будет редактировано. Если события нет, то передаем 0.&lt;br /&gt;
# записываем якорь с ссылкой в объект&lt;br /&gt;
# возвращаем объект&lt;br /&gt;
&lt;br /&gt;
==== Класс dof_im_journal_templans_table ====&lt;br /&gt;
===== Описание get_topics() =====&lt;br /&gt;
Возвращает массив объектов c необходимыми свойствами для вставки в таблицу schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив тем входящих в планирование&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все контрольные точки учебного потока&lt;br /&gt;
# формируем объект с нужными полями для каждой контрольной точки&lt;br /&gt;
# возвращаем получившийся массив объектов&lt;br /&gt;
===== Описание get_empty_topic() =====&lt;br /&gt;
Возвращает &amp;quot;пустой&amp;quot; объект отчета об уроке &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект для вставки в таблицу [[Разработка:storages/schevents|schevents]]&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* создаем объект с необходимым списком пустых полей и возвращаем его&lt;br /&gt;
===== Описание table_data() =====&lt;br /&gt;
Возвращает массив строк данных отформатированных для вывода с помощью moodle-функции print_table()&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив с данными для распечатки таблицы, либо false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли для переданного потока элементы тематического планирования.&lt;br /&gt;
#* если их нет - то возвращаем false&lt;br /&gt;
# формируем массив строк таблицы&lt;br /&gt;
# проставляем html-якоря для каждой контрольной точки на странице оценок&lt;br /&gt;
# добавляем ссылки на редактирования элементов учебного плана&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
==== Класс dof_im_journal_edittopic ====&lt;br /&gt;
===== Описание get_topic() =====&lt;br /&gt;
[[#get_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Проверяем, указан ли id контрольной точки. &lt;br /&gt;
** Если не указан - возврящаем пустую тему.&lt;br /&gt;
** Если указан - пробуем извлечь контрольную точку по такому id&lt;br /&gt;
*** Если контрольную точку извлечь не удалось - то возвращаем false&lt;br /&gt;
*** Если удалось - то возвращаем заполненный отчет об уроке&lt;br /&gt;
===== Описание save_topic() =====&lt;br /&gt;
[[#save_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем есть ли у нас данные в переменной $event для обновления или создания события. Если нет - то возвращаем false.&lt;br /&gt;
# определяем тип действия, которое надо совершить&lt;br /&gt;
#* если указан planid для события - то создаем новое событие для существующей контрольной точки&lt;br /&gt;
#* если нет id для контрольной точки - создаем новое событие и новую контрольную точку&lt;br /&gt;
#* в остальных случаях - обновляем контрольную точку и событие: вычисляем новую относительную дату, и обновляем записи в таблицах [[Разработка:storages/schevents|schevents]] и [[Разработка:storages/plans|plans]]&lt;br /&gt;
===== Описание create_topic() =====&lt;br /&gt;
[[#create_topic()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем новый элемент тематического планирования в таблице plans (если это не удалось - то возвращаем false)&lt;br /&gt;
# добавляем в переданное событие id контрольной точки&lt;br /&gt;
# создаем событие из переданного объекта $event (если событие не создано - удаляем ранее созданный элемент тематического планирования)&lt;br /&gt;
# возвращаем id события&lt;br /&gt;
===== Описание create_checkpoint() =====&lt;br /&gt;
Создает и сохраняет запись в таблице plans&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $point (object) - данные для сохранения в таблицу [[Разработка:storages/plans|plans]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи или false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем дату начала обучения&lt;br /&gt;
# создаем заготовку для объекта контрольной точки&lt;br /&gt;
# вычисляем относительную дату контрольной точки&lt;br /&gt;
# заносим данные в базу&lt;br /&gt;
===== Описание create_event() =====&lt;br /&gt;
Создает объект события и сохраняет его в schevents&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $event (object) - данные для сохранения&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи в таблице событий или false.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# проверяем, есть ли у нас все необходимые для создания записи&lt;br /&gt;
# получаем id учебного потока&lt;br /&gt;
# получаем id преподавателя в таблице persons&lt;br /&gt;
# создаем объект нужного формата и заносим туда все данные&lt;br /&gt;
# записываем данные в базу&lt;br /&gt;
==== Класс dof_im_journal_rawdata ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* csid - id учебного потока в таблице сstreams&lt;br /&gt;
===== Описание get_checkpoints() =====&lt;br /&gt;
Получить все контрольные точки одного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив объектов из таблицы plans или false &lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id учебного потока из таблицы cstreams&lt;br /&gt;
# выбираем из таблицы plans все записи, у которых поле cstreamid равно id учебного потока, и тип связи &amp;quot;cstreams&amp;quot;&lt;br /&gt;
# сортируем их в хронологическом порядке&lt;br /&gt;
# возвращаем получившийся массив&lt;br /&gt;
&lt;br /&gt;
===== Описание get_students() =====&lt;br /&gt;
Получить всех учеников указанного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив записей из таблицы persons или false&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем список пройденных дисциплин&lt;br /&gt;
# перебираем все подписки и запоминаем id ученика для каждой из них&lt;br /&gt;
# извлекаем из таблицы persons учеников, чьи id были извлечены из подписок&lt;br /&gt;
&lt;br /&gt;
===== Описание get_teacherid() =====&lt;br /&gt;
Получить id преподавателя учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id преподавателя или false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* id преподавателя всегда берется только из записи учебного потока из таблицы cstreams&lt;br /&gt;
==== Класс dof_im_journal_process_gradesform ====&lt;br /&gt;
''Поля:''&lt;br /&gt;
* gradedata - (object) все оценки и сопутствующая им информация&lt;br /&gt;
* mypost - (array) непроверенные данные пришедшие из массива $_POST. Используются только для составления повторного запроса на сохранение данных.&lt;br /&gt;
===== Описание __construct =====&lt;br /&gt;
[[#Класс dof_im_journal_rawdata|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект, в который мы будем складывать все проверенные данные, пришедшие из формы&lt;br /&gt;
# проверяем скалярные данные: все числовые идентификаторы, и отдельные строки, и после проверки записываем их в итоговый объект&lt;br /&gt;
# теперь, зная cstreamid из проверенных скалярных данных вызываем родительский конструктор&lt;br /&gt;
# проверяем массивы, пришедшие из формы: &lt;br /&gt;
#* данные об отсутствующих учениках&lt;br /&gt;
#* массив оценок &lt;br /&gt;
#* массив идентификаторов подписок (таблица cpassed)&lt;br /&gt;
#* узнаем id оценок для изменения их статуса&lt;br /&gt;
# записываем все проверенные данные в итоговый массив&lt;br /&gt;
# определяем тип действия, которое надо совершить: &lt;br /&gt;
#* сохранить данные&lt;br /&gt;
#* сохранить данные и продолжить редактирование&lt;br /&gt;
#* восстановить исходные значения&lt;br /&gt;
# записываем исходный массив (непроверенный) в поле объекта, если потом понадобится еще раз отправить данные после подтверждения&lt;br /&gt;
===== Описание process_form() =====&lt;br /&gt;
[[#process_form()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# в самом начале проверяем тип действия, которое надо совершить. Если этим действием является &amp;quot;отменить изменения&amp;quot;, то не переходим к сохранению оценок и сразуже выполняем перенаправление на страницу журнала. В остальных случаях идем дальше:&lt;br /&gt;
# проверяем, установлено ли у кого-нибудь из учеников одновременно &amp;quot;н&amp;quot; и оценка. Если это так - то перенаправим пользователя на страницу с сообщением об этом, и попросим его подтвердить такой выбор.&lt;br /&gt;
#* если пользователь согласен с изменениями, которые он сделал, то все выставленые им оценки и сведения о посещаемости сохраняются&lt;br /&gt;
#* если же нет - то происходит отмена всех изменений&lt;br /&gt;
# в случае, когда никаких предупреждений нет - сначала формируем приказ для оценок&lt;br /&gt;
# затем приказ о посещаемости&lt;br /&gt;
# если все действия произведены успешно - производим редирект. Если же возникли ошибки - сообщаем об этом&lt;br /&gt;
&lt;br /&gt;
===== Описание generate_order_grades() =====&lt;br /&gt;
Сформировать приказ об изменении состояния учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' нет&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* true если приказ успешно сформирован, и false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем id подразделения в таблице departments&lt;br /&gt;
# определяем тип действия, которое нужно совершить с оценкой&lt;br /&gt;
# обращаемся к функциям выставления, либо удаления оценки&lt;br /&gt;
===== Описание order_set_grade() =====&lt;br /&gt;
Формирует приказ - установить оценку. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid (int) - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true в случае успеха и false в случае неудачи&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# подключаем методы работы с приказом&lt;br /&gt;
# создаем объект для записи&lt;br /&gt;
# сохраняем автора приказа, подразделение, к которому он относится, дату создания приказа&lt;br /&gt;
# добавляем данные, которые определяют назначение приказа&lt;br /&gt;
# сохраняем приказ в БД, в таблицу orders&lt;br /&gt;
# подписываем приказ&lt;br /&gt;
# исполняем приказ&lt;br /&gt;
Методы order_delete_grade и order_update_grade работают по такому же принципу.&lt;br /&gt;
===== Описание get_grades_fororder() =====&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $type - тип действия, которое необходимо будет произвести над оценкой. Возможные значения: ''set_grade'' и ''delete_grade''.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект, содержащий список оценок и все идентификаторы для формирования приказа.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для итоговых данных&lt;br /&gt;
# записываем в него дату, id учителя (в таблице persons) и id контрольной точки (в таблице plans&lt;br /&gt;
# перебираем все оценки из внутреннего массива с проверенными данными&lt;br /&gt;
# определяем тип действия, которое над ней нужно совершить&lt;br /&gt;
# в зависимости от типа действия (установление или удаление оценки) записываем в объект оценки нужные идентификаторы&lt;br /&gt;
# упаковываем оценки в итоговый массив и возвращаем его&lt;br /&gt;
=== Для списка журналов ===&lt;br /&gt;
==== Класс dof_im_journal_listjournals ====&lt;br /&gt;
Этот класс служит для сбора и вывода информации по всем структурным подразделениям. Информация выводится древовидно: самый верхний уровень - подразделение, затем учебные программы, затем учебные периоды, элементы учебной программы, и в самом конце - журналы учебного потока.&lt;br /&gt;
''Поля:''&lt;br /&gt;
* dof - - объект класса [[Разработка:lib/dof.php|dof_control]]&lt;br /&gt;
* $departments массив структуры&lt;br /&gt;
    array(&lt;br /&gt;
    [departmentid] =&amp;gt; obj  -&amp;gt; departmentname = 'department_name'&lt;br /&gt;
                      obj  -&amp;gt; programms = array(&lt;br /&gt;
      [programmid]   =&amp;gt; obj1 -&amp;gt; programmname = 'programm_name'&lt;br /&gt;
                        obj1 -&amp;gt; ages = array(&lt;br /&gt;
        [agenum]       =&amp;gt; obj2 -&amp;gt; agename = 'age_name'&lt;br /&gt;
                          obj2 -&amp;gt; items = array(&lt;br /&gt;
          [itemid]       =&amp;gt; obj3 -&amp;gt; itemname = 'item_name'&lt;br /&gt;
                            obj3 -&amp;gt; cstreams = array(&lt;br /&gt;
            [cstreamid]    =&amp;gt; obj4 -&amp;gt; cstreamname = 'cstream_name'&lt;br /&gt;
                                    )''// конец массива cstreams''&lt;br /&gt;
                                  )''// конец массива items''&lt;br /&gt;
                                )''// конец массива ages''&lt;br /&gt;
                              )''// конец массива programms''&lt;br /&gt;
         )''// конец общего массива''&lt;br /&gt;
    содержит данные для вставку в темплатер после добавления еще одного уровня:&lt;br /&gt;
    $fortemplater-&amp;gt;departments = $this-&amp;gt;departments;&lt;br /&gt;
В общем виде сбор данных выглядит так: &lt;br /&gt;
# сначала собирается информация по структурному подразделению (одному или нескольким), и информация по ним записывается в итоговый объект&lt;br /&gt;
# затем получаются все программы учебного подразделения, информация по ним записывается в итоговый массив&lt;br /&gt;
# извлекается и записывается в итоговый объект список учебных периодов &lt;br /&gt;
# для каждого учебного периода получаются элементы учебной программы, которые изучаются в нем&lt;br /&gt;
# для каждого элемента учебной программы получаются учебные потоки&lt;br /&gt;
# для каждого учебного потока получается его журнал&lt;br /&gt;
===== Описание set_data() =====&lt;br /&gt;
[[#set_data()|Описание API]]&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* получаем id структурного подразделения из таблицы departments.&lt;br /&gt;
** если оно есть - то получаем информацию только по нему&lt;br /&gt;
** если получили 0 вместо id подразделения - то выводим информацию по всем подразделениям&lt;br /&gt;
&lt;br /&gt;
===== Описание get_journals_department() =====&lt;br /&gt;
Возвращает журналы одного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $departmentid - id подразделения в таблице [[Разработка:storages/departments|departments]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - набор журналов &lt;br /&gt;
* (bool) - false в случае ошибки&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# получаем все программы, за которые отвечает подразделение&lt;br /&gt;
# для каждой программы получаем все ее журналы&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2051</id>
		<title>Разработка:storages/cstreams</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2051"/>
				<updated>2010-11-10T17:49:38Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cstreams&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cstreams'' - учебный поток. Представляет учебный процесс, идущий по учебной дисциплине/предмету в течение одного учебного периоду с конкретным преподавателем, одним или несколькими учащимися или группой.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* ageid - учебный период в таблице [[Разработка:storages/ages | ages ]]&lt;br /&gt;
* programmitemid - дисциплина в таблице [[Разработка:storages/programmitems | programmitems ]]&lt;br /&gt;
* teacherid - id преподавателя в таблице [[Разработка:storages/persons | persons ]]. После создания поля appointmentid стало ненужным. Все старые обращения к этому полю будут переделаны на обращения к appointmentid, при создании новых обращений они должны обращаться к appointmentid. После переработки старых методов данное поле удалиться.&lt;br /&gt;
* departmentid - подразделение, которому принадлежит учебный процесс в таблице [[Разработка:storages/departments | departments ]]&lt;br /&gt;
* appointmentid - id назначения на должность в таблице [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
* mdlgroup - id группы moodle, соответствующей учебному потоку&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, по-умолчанию берется из programmitems, если там не указано - из ages. Нужны для подсчета часов при составлении расписания.&lt;br /&gt;
* begindate - дата и время, когда учебный процесс был впервые переведен в состояние &amp;quot;идет обучение&amp;quot; по [http://ru.wikipedia.org/wiki/UTC UTC]&lt;br /&gt;
* enddate  - дата и время окончания по [http://ru.wikipedia.org/wiki/UTC UTC], когда учебный процесс был в последний раз выведен из состояния &amp;quot;идет обучение&amp;quot;&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/cstreams | cstreams ]]&lt;br /&gt;
* hours - часов всего&lt;br /&gt;
* hoursweek - часов в неделю&lt;br /&gt;
* name - имя предмето-потока&lt;br /&gt;
* hoursweekdistance - количество часов в неделю дистанционно&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject, $id = NULL, $quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу плагина.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - данные для записи в таблицу.&lt;br /&gt;
* $id = NULL&lt;br /&gt;
* quiet(bool) - генерировать или нет события, по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id вставленной записи.&lt;br /&gt;
* (bool) - false, если операция не удалась.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''delete($id,$quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Удаляет запись из таблицы плагина с указанным id.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* id(int) - id записи в этой таблице .&lt;br /&gt;
* quiet(bool) - генерировать или нет события, по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если запись удалена или ее нет, false - в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''update($dataobject, $id = NULL, $quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Обновляет запись в таблице плагина данными из объекта. Отсутствующие в объекте записи не изменяются. Если id передан, то обновляется запись с переданным id. Если id не передан обновляется запись с id, который передан в объекте.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - данные, которыми надо заменить запись в таблице.&lt;br /&gt;
* id(int) - id обновляемой записи в этой таблице.&lt;br /&gt;
* quiet(bool) - не генерировать событий.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если обновление прошло успешно, и false - во всех остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_teacher_cstream($id, $status = &amp;quot;active&amp;quot;)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного преподавателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(active).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив процессов. &lt;br /&gt;
* (bool) - false, если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_department_cstream($id, $status = &amp;quot;active&amp;quot;)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного подразделения.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(active).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив процессов. &lt;br /&gt;
* (bool) - false, если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_age_cstream($id, $status = &amp;quot;active&amp;quot;)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для данного учебного периода.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(active).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив процессов. &lt;br /&gt;
* (bool) - false, если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_programmitem_cstream($id, $status = &amp;quot;active&amp;quot;)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов по данной дисциплине.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(active).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив процессов. &lt;br /&gt;
* (bool) - false, если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом active.&lt;br /&gt;
&lt;br /&gt;
===='''get_agroup_cstream($id)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для академической группы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив процессов.&lt;br /&gt;
* (bool) - false, если процессы не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agroup_agenum_cstreams($agroupid, $ageid)'''====&lt;br /&gt;
&lt;br /&gt;
Получить Список программ по академической группе, и периоду.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $agroupid(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из этой таблицы, если они есть.&lt;br /&gt;
* (bool) - false, если ничего не нашлось.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agroup_status_cstreams($agroupid, $status)'''====&lt;br /&gt;
Получить Список программ по академической группе, и статусу.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $agroupid(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $status(string) - статус потока.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из таблицы cstreams если они есть.&lt;br /&gt;
* (bool) - false, если ничегг не нашлось.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_cstreams($select)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает количество потоков.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $select(string) - критерии отбора записей.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_prog_age_cstreams($pitemid, $ageid, $status=null)'''====&lt;br /&gt;
&lt;br /&gt;
Получить список учебных потоков, допустимых учебной программой и текущим периодом&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmid(object) - id учебной программы в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $ageid(object) - id периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $status(string) - статус учебного потока.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из базы.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_programm_age_cstreams($programmid, $ageid = null, $agenum = null, $dpid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает все учебные потоки программы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmid(int) - id учебной программы в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $ageid(int) - id периода в таблице [[Разработка:storages/ages | ages ]], по умолчанию нет.&lt;br /&gt;
* $agenum - номер паралели в таблице [[Разработка:storages/programmitems | programmitems ]], по умолчанию нет(null).&lt;br /&gt;
* $dpid - id подразделения в таблице [[Разработка:storages/departments | departments ]], по умолчанию - нет(null).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив потоков.&lt;br /&gt;
* (bool) - false, если потоки не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_listing($limitfrom, $limitnum, $conds=null, $countonly=false)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает список учебных потоков по заданным критериям.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $limitfrom(int) - начиная с какой записи просматривается фрагмент списка записей.&lt;br /&gt;
* $limitnum(int) - сколько записей нужно извлечь из базы.&lt;br /&gt;
* $conds(object) - объект со списком свойств, по которым будет происходить поиск, по умолчанию - нет(null),&lt;br /&gt;
* $countonly(object) - вернуть список записей по указанным условиям или только их количество, по умолчанию - список(false),&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из базы.&lt;br /&gt;
* (bool) - false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_select_listing($inputconds)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает фрагмент sql-запроса после слова WHERE.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $inputconds(object) - список полей с условиями запроса в формате &amp;quot;поле_БД-&amp;gt;значение&amp;quot;.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string).&lt;br /&gt;
&lt;br /&gt;
===='''get_agroup_ageids($agroupid)'''====&lt;br /&gt;
&lt;br /&gt;
Получить id всех периодов, в течение которых проходит обучение выбранной группы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* @param int $agroupid - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - индексированный массив с уникальными значениями id периодов всех потоков.&lt;br /&gt;
* (bool) - false, если ничего не найдено.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
===='''create_cstreams_for_agroup($agroupid, $ageid, $departmentid, $datebegin, $enddate=null)'''====&lt;br /&gt;
&lt;br /&gt;
Создаёт учебные потоки для группы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $agroupid(int) - id акадкмическуой группы (класса) в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $departmentid(int) - id учебного подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $datebegin(int) - дата начала обучения в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $enddate(int) - дата окончания обучения в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime], по умолчанию - нет(null).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если всё получилось, и false, если возникли ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''create_cstreams_for_programm($programmid, $ageid, $agenum, $departmentid, $datebegin, $enddate=null)'''====&lt;br /&gt;
&lt;br /&gt;
Создаёт подписку на программу в учебном периоде для выбранной параллели.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmid(int) - id учебной программы в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $agenum(int) - номер параллели, для которой создается подписка.&lt;br /&gt;
* $departmentid(int) - id учебного подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $datebegin(int) - дата начала обучения в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если всё получилось, и false, если возникли ошибки.&lt;br /&gt;
    &lt;br /&gt;
===='''enrol_agroup_on_cstreams($agroupid, $ageid)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает группу на список потоков.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $agroupid(int) - id группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если всё получилось, и false, если возникли ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''set_status_complete($id)'''====&lt;br /&gt;
&lt;br /&gt;
Переводит поток в статус &amp;quot;завершен&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $id(int) - id потока в таблице плагина.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если поток удачно завершен, и false - в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cstreams_on_parametres($programmitemid, $teacherid = 0, $mycstrems = false, $completecstrems = false)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает список потоков по параметрам.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmitemid(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $teacherid(int) - id учителя в таблице [[Разработка:storages/persons | persons ]], по умолчанию - нет(0).&lt;br /&gt;
* $mycstrems(bool) - показать ли потоки текущего пользователя, по умолчанию - нет(false).&lt;br /&gt;
* $completecstrems(bool) - показать ли завершенные потоки, по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_short_name($cstreamid)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает короткое имя потока.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id потока в таблице плагина.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string)&lt;br /&gt;
* (bool) - false, если возникли ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''enrol_students_on_cstream($cstream, $programmsbcids)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает учеников на поток.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstream(object) - объект из таблицы плагина.&lt;br /&gt;
* $programmsbcids(object) - массив, состоящий из id подписок на программы в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если всё получилось, и false, если возникли ошибки.&lt;br /&gt;
&lt;br /&gt;
===='''unenrol_students_from_cstream($cstream, $programmsbcids)'''====&lt;br /&gt;
&lt;br /&gt;
Исключает учеников из потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* @param object $cstream - объект из таблицы плагина.&lt;br /&gt;
* @param array $programmsbcids - массив, состоящий из id подписок на программы в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если всё получилось, и false, если возникли ошибки.&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
===='''enrol_student_on_cstream($cstream, $programmsbcid)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает одного ученика на поток.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstream(object) - объект из таблицы плагина.&lt;br /&gt;
* $programmsbcid(int) - id подписки ученика на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если всё получилось, и false, если возникли ошибки.&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
===='''unenrol_student_from_cstream($cstream, $programmsbcid)'''====&lt;br /&gt;
&lt;br /&gt;
Исключает одного ученика из потока. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstream(object) - объект из таблицы плагина.&lt;br /&gt;
* $programmsbcid(int) - id подписки ученика на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если всё получилось, и false, если возникли ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cstreamname($eventcode, $mixedvar, $cstream = false)'''====&lt;br /&gt;
&lt;br /&gt;
В зависимости от произошедших событий (значение $eventcode) сохраняет информацию о новом (insert), и новом, и старом (update) либо только старом (delete) имени предмето-потока в БД.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $eventcode - произошедшее событие.&lt;br /&gt;
* $mixedvar(array) - id нового и старого потоков в таблице плагина.&lt;br /&gt;
* $cstream - данные пришли из таблицы плагина? , по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если запись прошла успешно, и false - в случае ошибок.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить список учебных процессов для данного ученика с учетом персональной подписки и академических групп (второй параметр - статус, по умолчанию - &amp;quot;идет&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |Массив, содержащий id учебного потока&lt;br /&gt;
''Пример:'' array('cstreamid'=&amp;gt;$id)&lt;br /&gt;
 |Событие посылается при изменении статуса учебного потока на &amp;quot;активный&amp;quot; (active)&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=2050</id>
		<title>Разработка:storages/ages</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=2050"/>
				<updated>2010-11-10T16:51:41Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = ages&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''ages'' - учебные периоды (учебный год в школе, семестр в ВУЗе). Каждый учебный поток и итоговая отметка по курсу принадлежат какому-то одному учебному периоду.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название учебного периода&lt;br /&gt;
* begindate - дата и время начала по UTC&lt;br /&gt;
* enddate  - дата и время окончания по UTC&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, которые помещаются в этом учебном периоде.&lt;br /&gt;
* departmentid - структурное подразделение в таблице [[Разработка:storages/departments | departments ]], объявившее учебный период&lt;br /&gt;
* previousid - предыдущий учебный период&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/ages | ages ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
* '''+''' Получить список текущих учебных периодов для структурного подразделения. Возвращает массив объектов. По умолчанию - все периоды в статусе &amp;quot;идет учебный процесс&amp;quot;. Если второй параметр null - возвращаются все периоды, если строка - периоды в этом статусе, если массив - все периоды в таких статусах. Для удобства нужно сделать заготовку, которая принимает такой параметр и имя sql-колонки и возвращает соответствующий фрагмент sql-запроса - и поместить ее защищенным методом в storage_base.&lt;br /&gt;
* '''+''' Получить id учебного периода, являющегося x по счету после периода с заданным id. При этом x=1 - это сам исходный период (период для &amp;quot;первого класса), x=2 - это период, для которого период x=1 был предыдущим. Метод возвращает id или false, если однозначно установить id периода не удалось.&lt;br /&gt;
* Создать период для структурного подразделения: получает параметры &amp;quot;структурное подразделение&amp;quot;, &amp;quot;дата начала&amp;quot;, &amp;quot;дата конца&amp;quot;, &amp;quot;количество учебных недель&amp;quot;, &amp;quot;название&amp;quot;, &amp;quot;предыдущий период&amp;quot; - по умолчанию 0. Не указывать предыдущий период допускается только если для этого структурного подразделения еще не было создано периодов. Если для периода уже есть один &amp;quot;последующий период&amp;quot;, то больше его указывать в качестве &amp;quot;предыдущего&amp;quot; нельзя. Метод возвращает id созданного периода или false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_department_ages($departmentid, $status=&amp;quot;active&amp;quot;)'''====&lt;br /&gt;
&lt;br /&gt;
находит список всех или в указанном статусе учебных периодов структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $departmentid(int) - id учебного подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $status(string) - статус учебного периода, или null если нужны периоды с любым статусом, по умолчанию &amp;quot;active&amp;quot;.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - массив объектов из таблицы ages.&lt;br /&gt;
* bool - false, если ничего не найдено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_next_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит один из дочерних учебных периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $agenum(int) - сколько периодов вперед отсчитать относительно переданного ageid. При этом переданный id считается первым.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода&lt;br /&gt;
* bool - false, если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_previous_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит предшествующий указанному в ageid учебный период&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $agenum(int) - сколько периодов назад отсчитать относительно переданного ageid. При этом переданный ageid считается последним.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода или&lt;br /&gt;
* bool - false, если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''create_period_for_department($deptid, $datebegin, $dateend, $numweeks, $name, $previousid=null)'''====&lt;br /&gt;
&lt;br /&gt;
создаёт период для структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $deptid(int) - id учебного подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $datebegin(int) - время начала периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $dateend(int) - время окончания периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $numweeks(int) - количество недель в учебном периоде.&lt;br /&gt;
* $name(string) - название учебного периода.&lt;br /&gt;
* $previosid(int) - id предыдущего учебного периода в таблице [[Разработка:storages/ages | ages ]] или null, если нет предыдущего периода, по умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id созданного периода.&lt;br /&gt;
* bool - false, если период создать нельзя.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_ages($select)'''====&lt;br /&gt;
&lt;br /&gt;
находит количество периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $select(int) - критерии отбора записей.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
===='''get_ages_by_idrange($minid, $maxid)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
получаеть список записей по диапазону id&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $minid(int) - минимальный id.&lt;br /&gt;
* $maxid(int) - максимальный id.&lt;br /&gt;
''Возвращает значения:''&lt;br /&gt;
* array - массив записей.&lt;br /&gt;
* bool - false, если ни один не найден.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agenum_byageid($startageid, $currentageid, $maxagenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит порядковый номер периода, считая от заданного периода&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $startageid(int) - id периода на котором нужно остановить поиск.&lt;br /&gt;
* $currentageid(int) - id периода, порядковый номер которого нам надо узнать.&lt;br /&gt;
* $maxagenum(int) - максимально возможный порядковый номер периода.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - порядковый номер периода.&lt;br /&gt;
* bool - false, если не находит.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
Надо реализовать удаление периода так: если к периоду ничего не привязано (потоки, подразделения и т.п.), то его можно удалять. Иначе - нельзя.&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы ages.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2049</id>
		<title>Разработка:storages/cstreams</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2049"/>
				<updated>2010-11-10T16:43:52Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cstreams&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cstreams'' - учебный поток. Представляет учебный процесс, идущий по учебной дисциплине/предмету в течение одного учебного периоду с конкретным преподавателем, одним или несколькими учащимися или группой.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* ageid - учебный период в таблице [[Разработка:storages/ages | ages ]]&lt;br /&gt;
* programmitemid - дисциплина в таблице [[Разработка:storages/programmitems | programmitems ]]&lt;br /&gt;
* teacherid - id преподавателя в таблице [[Разработка:storages/persons | persons ]]. После создания поля appointmentid стало ненужным. Все старые обращения к этому полю будут переделаны на обращения к appointmentid, при создании новых обращений они должны обращаться к appointmentid. После переработки старых методов данное поле удалиться.&lt;br /&gt;
* departmentid - подразделение, которому принадлежит учебный процесс в таблице [[Разработка:storages/departments | departments ]]&lt;br /&gt;
* appointmentid - id назначения на должность в таблице [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
* mdlgroup - id группы moodle, соответствующей учебному потоку&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, по-умолчанию берется из programmitems, если там не указано - из ages. Нужны для подсчета часов при составлении расписания.&lt;br /&gt;
* begindate - дата и время, когда учебный процесс был впервые переведен в состояние &amp;quot;идет обучение&amp;quot; по [http://ru.wikipedia.org/wiki/UTC UTC]&lt;br /&gt;
* enddate  - дата и время окончания по [http://ru.wikipedia.org/wiki/UTC UTC], когда учебный процесс был в последний раз выведен из состояния &amp;quot;идет обучение&amp;quot;&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/cstreams | cstreams ]]&lt;br /&gt;
* hours - часов всего&lt;br /&gt;
* hoursweek - часов в неделю&lt;br /&gt;
* name - имя предмето-потока&lt;br /&gt;
* hoursweekdistance - количество часов в неделю дистанционно&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject, $id = NULL, $quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу плагина.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - данные для записи в таблицу.&lt;br /&gt;
* $id = NULL&lt;br /&gt;
* quiet(bool) - генерировать или нет события, по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id вставленной записи.&lt;br /&gt;
* (bool) - false, если операция не удалась.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''delete($id,$quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Удаляет запись из таблицы плагина с указанным id.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* id(int) - id записи в этой таблице .&lt;br /&gt;
* quiet(bool) - генерировать или нет события, по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если запись удалена или ее нет, false - в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''update($dataobject, $id = NULL, $quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Обновляет запись в таблице плагина данными из объекта. Отсутствующие в объекте записи не изменяются. Если id передан, то обновляется запись с переданным id. Если id не передан обновляется запись с id, который передан в объекте.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - данные, которыми надо заменить запись в таблице.&lt;br /&gt;
* id(int) - id обновляемой записи в этой таблице.&lt;br /&gt;
* quiet(bool) - не генерировать событий.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если обновление прошло успешно, и false - во всех остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_teacher_cstream($id, $status = &amp;quot;active&amp;quot;)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного преподавателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(active).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив процессов. &lt;br /&gt;
* (bool) - false, если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_department_cstream($id, $status = &amp;quot;active&amp;quot;)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного подразделения.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(active).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив процессов. &lt;br /&gt;
* (bool) - false, если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_age_cstream($id, $status = &amp;quot;active&amp;quot;)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для данного учебного периода.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(active).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив процессов. &lt;br /&gt;
* (bool) - false, если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_programmitem_cstream($id, $status = &amp;quot;active&amp;quot;)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов по данной дисциплине.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(active).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив процессов. &lt;br /&gt;
* (bool) - false, если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом active.&lt;br /&gt;
&lt;br /&gt;
===='''get_agroup_cstream($id)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для академической группы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив процессов.&lt;br /&gt;
* (bool) - false, если процессы не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agroup_agenum_cstreams($agroupid, $ageid)'''====&lt;br /&gt;
&lt;br /&gt;
Получить Список программ по академической группе, и периоду.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $agroupid(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из этой таблицы, если они есть.&lt;br /&gt;
* (bool) - false, если ничего не нашлось.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agroup_status_cstreams($agroupid, $status)'''====&lt;br /&gt;
Получить Список программ по академической группе, и статусу.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $agroupid(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $status(string) - статус потока.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из таблицы cstreams если они есть.&lt;br /&gt;
* (bool) - false, если ничегг не нашлось.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_cstreams($select)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает количество потоков.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $select(string) - критерии отбора записей.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_prog_age_cstreams($pitemid, $ageid, $status=null)'''====&lt;br /&gt;
&lt;br /&gt;
Получить список учебных потоков, допустимых учебной программой и текущим периодом&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmid(object) - id учебной программы в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $ageid(object) - id периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $status(string) - статус учебного потока.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из базы.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_programm_age_cstreams($programmid, $ageid = null, $agenum = null, $dpid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает все учебные потоки программы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmid(int) - id учебной программы в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $ageid(int) - id периода в таблице [[Разработка:storages/ages | ages ]], по умолчанию нет.&lt;br /&gt;
* $agenum - номер паралели в таблице [[Разработка:storages/programmitems | programmitems ]], по умолчанию нет(null).&lt;br /&gt;
* $dpid - id подразделения в таблице [[Разработка:storages/departments | departments ]], по умолчанию - нет(null).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив потоков.&lt;br /&gt;
* (bool) - false, если потоки не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_listing($limitfrom, $limitnum, $conds=null, $countonly=false)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает список учебных потоков по заданным критериям.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $limitfrom(int) - начиная с какой записи просматривается фрагмент списка записей.&lt;br /&gt;
* $limitnum(int) - сколько записей нужно извлечь из базы.&lt;br /&gt;
* $conds(object) - объект со списком свойств, по которым будет происходить поиск, по умолчанию - нет(null),&lt;br /&gt;
* $countonly(object) - вернуть список записей по указанным условиям или только их количество, по умолчанию - список(false),&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из базы.&lt;br /&gt;
* (bool) - false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_select_listing($inputconds)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает фрагмент sql-запроса после слова WHERE.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $inputconds(object) - список полей с условиями запроса в формате &amp;quot;поле_БД-&amp;gt;значение&amp;quot;.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string).&lt;br /&gt;
&lt;br /&gt;
    /** Получить id всех периодов, в течение которых проходит обучение выбранной группы&lt;br /&gt;
     * &lt;br /&gt;
     * @return array|bool - индексированный массив с уникальными значениями id периодов всех потоков или false&lt;br /&gt;
     * если ничего не найдено&lt;br /&gt;
     * @param int $agroupid - id академической группы в таблице agroups&lt;br /&gt;
     */&lt;br /&gt;
    public function get_agroup_ageids($agroupid)&lt;br /&gt;
    {&lt;br /&gt;
        $result = array();&lt;br /&gt;
        // получаем массив всех потоков академической группы&lt;br /&gt;
        $agcstreams = $this-&amp;gt;get_agroup_cstream($agroupid);&lt;br /&gt;
        // получаем все id периодов &lt;br /&gt;
        if ( ! $agcstreams )&lt;br /&gt;
        {// не найдено ни одного потока&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        foreach ( $agcstreams as $agcstream )&lt;br /&gt;
        {// перебираем все элементы массива, и вытаскиваем только id&lt;br /&gt;
            $result[] = $agcstream-&amp;gt;ageid;&lt;br /&gt;
        }&lt;br /&gt;
        // оставляем только уникальные значения&lt;br /&gt;
        $result = array_unique($result);&lt;br /&gt;
        // сортируем массив по возрастанию&lt;br /&gt;
        sort($result);&lt;br /&gt;
        return $result;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Создать учебные потоки для группы&lt;br /&gt;
     * &lt;br /&gt;
     * @return &lt;br /&gt;
     * @param int $agroupid - id акадкмическуой группы (класса) в таблице agroups&lt;br /&gt;
     * @param int $ageid - id учебного периода в таблице ages&lt;br /&gt;
     * @param int $departmentid - id учебного подразделения в таблице departments&lt;br /&gt;
     * @param int $datebegin - дата начала обучения в формате unixtime&lt;br /&gt;
     * &lt;br /&gt;
     */&lt;br /&gt;
    public function create_cstreams_for_agroup($agroupid, $ageid, $departmentid, $datebegin, $enddate=null)&lt;br /&gt;
    {&lt;br /&gt;
        if ( ! $agroup = $this-&amp;gt;dof-&amp;gt;storage('agroups')-&amp;gt;get($agroupid) )&lt;br /&gt;
        {// не удалось получить академичеескую группу&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        if ( ! $programm = $this-&amp;gt;dof-&amp;gt;storage('programms')-&amp;gt;get($agroup-&amp;gt;programmid) )&lt;br /&gt;
        {// не удалось получить учебную программу&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        if ( ! $programmitems = $this-&amp;gt;dof-&amp;gt;storage('programmitems')-&amp;gt;get_pitems_list&lt;br /&gt;
                               ($programm-&amp;gt;id, $agroup-&amp;gt;agenum, 'deleted') )&lt;br /&gt;
        {// нет потоков, некого подписывать - но считаем, что мы свою работы все равно сделали&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
        $result = true;&lt;br /&gt;
        // если в программе есть предметы на этот период - создадим для них подписки&lt;br /&gt;
        foreach ( $programmitems as $pitem )&lt;br /&gt;
        {&lt;br /&gt;
            $cslink=false;&lt;br /&gt;
            if ( $cstreams = $this-&amp;gt;get_list_filter('ageid',$ageid,'programmitemid',$pitem-&amp;gt;id, &lt;br /&gt;
                    'status', array('plan', 'active', 'suspend')) )&lt;br /&gt;
            {// если уже есть такой поток&lt;br /&gt;
                foreach ( $cstreams as $cstream )&lt;br /&gt;
                {// и на него подписана группа&lt;br /&gt;
                    if ( $this-&amp;gt;dof-&amp;gt;storage('cstreamlinks')-&amp;gt;get_filter('cstreamid',$cstream-&amp;gt;id,'agroupid',$agroupid) ) &lt;br /&gt;
                    {// поток не создаем&lt;br /&gt;
                        $cslink=true;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            } &lt;br /&gt;
            if ( ! $cslink )  &lt;br /&gt;
            {// нету связи создаем поток и привязываем&lt;br /&gt;
                $cstream = new object();&lt;br /&gt;
                $cstream-&amp;gt;ageid          = $ageid;&lt;br /&gt;
                $cstream-&amp;gt;programmitemid = $pitem-&amp;gt;id;&lt;br /&gt;
                // откуда брать id учителя?&lt;br /&gt;
                $cstream-&amp;gt;teacherid      = 0;&lt;br /&gt;
                $cstream-&amp;gt;departmentid   = $departmentid;&lt;br /&gt;
                $cstream-&amp;gt;mdlgroup       = null;&lt;br /&gt;
                $cstream-&amp;gt;eduweeks = $this-&amp;gt;dof-&amp;gt;storage('ages')-&amp;gt;get_field($ageid,'eduweeks');&lt;br /&gt;
                if ( $pitem-&amp;gt;eduweeks )&lt;br /&gt;
                {// или из предмета, если указано там&lt;br /&gt;
                    $cstream-&amp;gt;eduweeks = $pitem-&amp;gt;eduweeks;&lt;br /&gt;
                }&lt;br /&gt;
                $cstream-&amp;gt;begindate      = $datebegin;&lt;br /&gt;
                $cstream-&amp;gt;enddate        = $datebegin + $pitem-&amp;gt;maxduration;&lt;br /&gt;
                if ( $enddate )&lt;br /&gt;
                {// дата окончания указана принудительно&lt;br /&gt;
                    $cstream-&amp;gt;enddate = $enddate;&lt;br /&gt;
                }&lt;br /&gt;
                $cstream-&amp;gt;status         = 'plan';&lt;br /&gt;
                // создаем подписку предмета на программу в текущем периоде&lt;br /&gt;
                if ( $id = $this-&amp;gt;insert($cstream) )&lt;br /&gt;
                {// удалось вставить запись в базу&lt;br /&gt;
                    if ( $this-&amp;gt;dof-&amp;gt;storage('cstreamlinks')-&amp;gt;&lt;br /&gt;
                               is_exists_filter('cstreamid', $id, 'agroupid', $agroupid) )&lt;br /&gt;
                    {// если запись для такого потока и такой группы существует - не создаем такую запись еще раз &lt;br /&gt;
                        continue;&lt;br /&gt;
                    }&lt;br /&gt;
                    // запомним, если что-то пошло не так&lt;br /&gt;
                    $result = $result AND (bool)$this-&amp;gt;dof-&amp;gt;storage('cstreamlinks')-&amp;gt;&lt;br /&gt;
                              enrol_agroup_on_cstream($agroupid, $id);&lt;br /&gt;
                }else&lt;br /&gt;
                {// во время вставки произошла ошибка&lt;br /&gt;
                    $result = $result AND false;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // возвращаем результат&lt;br /&gt;
        return $result;&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Создать подписку на программу в учебном периоде для выбранной параллели&lt;br /&gt;
     * &lt;br /&gt;
     * @return bool &lt;br /&gt;
     * @param int $programmid - id учебной программы в таблице programms&lt;br /&gt;
     * @param int $ageid - id учебного периода в таблице ages&lt;br /&gt;
     * @param int $agenum - номер параллели, для которой создается подписка&lt;br /&gt;
     * @param int $departmentid - id учебного подразделения в таблице departments&lt;br /&gt;
     * @param int $datebegin - дата начала обучения в формате unixtime&lt;br /&gt;
     */&lt;br /&gt;
    public function create_cstreams_for_programm($programmid, $ageid, $agenum, $departmentid, $datebegin, $enddate=null)&lt;br /&gt;
    {&lt;br /&gt;
        $result = true;&lt;br /&gt;
        if ( ! $programm = $this-&amp;gt;dof-&amp;gt;storage('programms')-&amp;gt;get($programmid) )&lt;br /&gt;
        {// не удалось получить учебную программу&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        if ( ! $programmitems = $this-&amp;gt;dof-&amp;gt;storage('programmitems')-&amp;gt;get_pitems_list($programmid, $agenum, 'deleted') )&lt;br /&gt;
        {// нет потоков, некого подписывать - но считаем, что мы свою работы все равно сделали&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
        // если в программе есть предметы на этот период - создадим для них подписки&lt;br /&gt;
        foreach ( $programmitems as $pitem )&lt;br /&gt;
        {&lt;br /&gt;
            &lt;br /&gt;
            $cstream = new object();&lt;br /&gt;
            $cstream-&amp;gt;ageid          = $ageid;&lt;br /&gt;
            $cstream-&amp;gt;programmitemid = $pitem-&amp;gt;id;&lt;br /&gt;
            // откуда брать id учителя?&lt;br /&gt;
            $cstream-&amp;gt;teacherid      = 0;&lt;br /&gt;
            $cstream-&amp;gt;departmentid   = $departmentid;&lt;br /&gt;
            $cstream-&amp;gt;mdlgroup       = null;&lt;br /&gt;
            $cstream-&amp;gt;eduweeks = $this-&amp;gt;dof-&amp;gt;storage('ages')-&amp;gt;get_field($ageid,'eduweeks');&lt;br /&gt;
            if ( $pitem-&amp;gt;eduweeks )&lt;br /&gt;
            {// или из предмета, если указано там&lt;br /&gt;
                $cstream-&amp;gt;eduweeks = $pitem-&amp;gt;eduweeks;&lt;br /&gt;
            }&lt;br /&gt;
            $cstream-&amp;gt;begindate      = $datebegin;&lt;br /&gt;
            $cstream-&amp;gt;enddate        = $datebegin + $pitem-&amp;gt;maxduration;&lt;br /&gt;
            if ( $enddate )&lt;br /&gt;
            {// дата окончания указана принудительно&lt;br /&gt;
                $cstream-&amp;gt;enddate = $enddate;&lt;br /&gt;
            }&lt;br /&gt;
            $cstream-&amp;gt;status         = 'plan';&lt;br /&gt;
            // создаем подписку предмета на программу в текущем периоде&lt;br /&gt;
            $result = $result AND (bool)$this-&amp;gt;insert($cstream);&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
        return $result;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Подписать группу на список потоков&lt;br /&gt;
     * &lt;br /&gt;
     * @return &lt;br /&gt;
     * @param int $agroupid- id группы в таблице agroups&lt;br /&gt;
     * @param int $ageid - id учебного периода в таблице ages&lt;br /&gt;
     * &lt;br /&gt;
     * @todo выяснить, нужно ли реализовать возможность подписки группы не по определененому периоду, &lt;br /&gt;
     * а для всех периодов?&lt;br /&gt;
     */&lt;br /&gt;
    public function enrol_agroup_on_cstreams($agroupid, $ageid)&lt;br /&gt;
    {&lt;br /&gt;
        $return = true;&lt;br /&gt;
        if ( ! $agroup = $this-&amp;gt;dof-&amp;gt;storage('agroups')-&amp;gt;get($agroupid) )&lt;br /&gt;
        {// не удалось получить академичеескую группу&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // @todo нужно ли указывать agenum?&lt;br /&gt;
        if ( ! $programmitems = $this-&amp;gt;dof-&amp;gt;storage('programmitems')-&amp;gt;get_pitems_list($agroup-&amp;gt;programmid, $agroup-&amp;gt;agenum) )&lt;br /&gt;
        {// в программе группы нет предметов для текущего периода&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
        foreach ( $programmitems as $pitem )&lt;br /&gt;
        {// подписываем группу на все потоки&lt;br /&gt;
            $cstreams = $this-&amp;gt;get_prog_age_cstreams($pitem-&amp;gt;id, $ageid);&lt;br /&gt;
            foreach ($cstreams as $cstream )&lt;br /&gt;
            {// создаем подписку группы на учебный поток&lt;br /&gt;
                if ( $this-&amp;gt;dof-&amp;gt;storage('cstreamlinks')-&amp;gt;&lt;br /&gt;
                        is_exists_filter('cstreamid', $cstream-&amp;gt;id, 'agroupid', $agroupid) )&lt;br /&gt;
                {// если запись для такого потока и такой группы существует - не создаем такую запись еще раз &lt;br /&gt;
                    continue;&lt;br /&gt;
                }&lt;br /&gt;
                // запомним, если что-то пошло не так&lt;br /&gt;
                $return = $return AND (bool)$this-&amp;gt;dof-&amp;gt;storage('cstreamlinks')-&amp;gt;&lt;br /&gt;
                          enrol_agroup_on_cstream($agroupid, $cstream-&amp;gt;id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return $return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Переводит поток в статус &amp;quot;завершен&amp;quot;&lt;br /&gt;
     * @param int $id - id потока&lt;br /&gt;
     * @return bool true - если поток удачно завершен и &lt;br /&gt;
     * false в остальных случаях&lt;br /&gt;
     */&lt;br /&gt;
    public function set_status_complete($id)&lt;br /&gt;
    {&lt;br /&gt;
        if ( ! is_int_string($id) )&lt;br /&gt;
        {// входные данные неверного формата&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        if ( ! $obj = $this-&amp;gt;get($id) )&lt;br /&gt;
		{// объект не найден&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
        if ( $obj-&amp;gt;status == 'completed' )&lt;br /&gt;
		{// поток уже завершен&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
        if ( $obj-&amp;gt;status == 'plan' OR $obj-&amp;gt;status == 'canceled' OR $obj-&amp;gt;status == 'suspend')&lt;br /&gt;
		{// поток запланирован, приостановлен или отменен - его нельзя завершить&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		$rez = true;&lt;br /&gt;
		// дата окончания действия подписки&lt;br /&gt;
		$obj-&amp;gt;enddate = time();&lt;br /&gt;
		if ( ! $this-&amp;gt;update($obj,$id) )&lt;br /&gt;
		{// не удалось обновить запись БД&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		// переместить в статс &amp;quot;неудачно завершены&amp;quot; &lt;br /&gt;
		if ( $cpassed = $this-&amp;gt;dof-&amp;gt;storage('cpassed')-&amp;gt;get_list_filter('cstreamid',$id,&lt;br /&gt;
		                       'status',array('plan','active','suspend')) )&lt;br /&gt;
		{// если есть незавершенные подписки на дисциплину сменим им статус&lt;br /&gt;
			foreach($cpassed as $cpass)&lt;br /&gt;
			{// переведем каждую в статус неуспешно завершена&lt;br /&gt;
				$rez = $rez &amp;amp; $this-&amp;gt;dof-&amp;gt;storage('cpassed')-&amp;gt;set_final_grade($cpass-&amp;gt;id);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( $rez )&lt;br /&gt;
		{// если все в порядке - меняем статус потока&lt;br /&gt;
			return $this-&amp;gt;dof-&amp;gt;workflow('cstreams')-&amp;gt;change($id,'completed');&lt;br /&gt;
		}&lt;br /&gt;
		return $rez;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /** Возвращает список потоков по параметрам&lt;br /&gt;
     * @param int $programmitemid - id дисциплины&lt;br /&gt;
     * @param int $teacherid - id учителя&lt;br /&gt;
     * @param bool $mycstrems - показать ли потоки текущего пользователя&lt;br /&gt;
     * @param bool $completecstrems - показать ли завершенные потоки&lt;br /&gt;
     * @return array&lt;br /&gt;
     */&lt;br /&gt;
    public function get_cstreams_on_parametres($programmitemid, $teacherid = 0, $mycstrems = false, $completecstrems = false)&lt;br /&gt;
    {&lt;br /&gt;
        // составляем условие&lt;br /&gt;
        // предмет обязателен&lt;br /&gt;
        $select = ' programmitemid = '.$programmitemid;&lt;br /&gt;
        if ( $teacherid )&lt;br /&gt;
        {// если указан учитель выведем только для него&lt;br /&gt;
            $select .= ' AND teacherid = '.$teacherid;&lt;br /&gt;
        }elseif ( $mycstrems ) &lt;br /&gt;
        {// если учителя нет, но надо показать потоки текущего пользователя&lt;br /&gt;
            if ( $teacherid = $this-&amp;gt;dof-&amp;gt;storage('persons')-&amp;gt;get_by_moodleid_id() )&lt;br /&gt;
            {// если только он есть в БД&lt;br /&gt;
                $select .= ' AND teacherid = '.$teacherid;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if ( $completecstrems )&lt;br /&gt;
        {// скахзано что надо вывести завершенные потоки вместе с активными&lt;br /&gt;
            $select .= ' AND status IN (\'active\',\'completed\')';&lt;br /&gt;
        }else&lt;br /&gt;
        {// выведем только активные&lt;br /&gt;
            $select .= ' AND status = \'active\'';&lt;br /&gt;
        }&lt;br /&gt;
        // возвращаем найденные потоки&lt;br /&gt;
        return $this-&amp;gt;dof-&amp;gt;storage('cstreams')-&amp;gt;get_list_select($select);&lt;br /&gt;
    }&lt;br /&gt;
    /** Возвращает короткое имя потока&lt;br /&gt;
     * @return string&lt;br /&gt;
     */&lt;br /&gt;
    public function get_short_name($cstreamid)&lt;br /&gt;
    {&lt;br /&gt;
        if ( ! $cstream = $this-&amp;gt;get($cstreamid) )&lt;br /&gt;
        {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        $pitem       = stripslashes_recursive($this-&amp;gt;dof-&amp;gt;storage('programmitems')-&amp;gt;get_field($cstream-&amp;gt;programmitemid, 'name'));&lt;br /&gt;
        $teacher     = stripslashes_recursive($this-&amp;gt;dof-&amp;gt;storage('persons')-&amp;gt;get_fullname($cstream-&amp;gt;teacherid));&lt;br /&gt;
            &lt;br /&gt;
        $cstreamname = $pitem;&lt;br /&gt;
        if ( $teacher )&lt;br /&gt;
        {// если есть учитель - добавим его&lt;br /&gt;
            $cstreamname .= ', '.$teacher;&lt;br /&gt;
        }&lt;br /&gt;
        $cstreamname .= ' ['.$cstream-&amp;gt;id.']';&lt;br /&gt;
        return $cstreamname;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Подписать учеников на поток&lt;br /&gt;
     * &lt;br /&gt;
     * @return bool&lt;br /&gt;
     * @param object $cstream - объект из таблицы cstreams&lt;br /&gt;
     * @param object $programmsbcids - массив, состоящий из id подписок на программы в таблице programmsbcs&lt;br /&gt;
     */&lt;br /&gt;
    public function enrol_students_on_cstream($cstream, $programmsbcids)&lt;br /&gt;
    {&lt;br /&gt;
        if ( ! is_object($cstream) OR ! is_array($programmsbcids) )&lt;br /&gt;
        {// неправильный формат данных&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        foreach ( $programmsbcids as $programmsbcid )&lt;br /&gt;
        {// перебираем все подписки на программу и отписываем каждого ученика&lt;br /&gt;
            $result = &amp;amp; $this-&amp;gt;enrol_student_on_cstream($cstream, $programmsbcid);&lt;br /&gt;
        }&lt;br /&gt;
        return $result;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Исключить учеников из потока&lt;br /&gt;
     * &lt;br /&gt;
     * @return bool&lt;br /&gt;
     * @param object $cstream - объект из таблицы cstreams&lt;br /&gt;
     * @param array $programmsbcids - массив, состоящий из id подписок на программы в таблице programmsbcs&lt;br /&gt;
     */&lt;br /&gt;
    public function unenrol_students_from_cstream($cstream, $programmsbcids)&lt;br /&gt;
    {&lt;br /&gt;
        if ( ! is_object($cstream) OR ! is_array($programmsbcids) )&lt;br /&gt;
        {// неправильный формат данных&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        $result = true;&lt;br /&gt;
        foreach ( $programmsbcids as $programmsbcid )&lt;br /&gt;
        {// перебираем все подписки на программу и отписываем каждого ученика&lt;br /&gt;
            $result = &amp;amp; $this-&amp;gt;unenrol_student_from_cstream($cstream, $programmsbcid);&lt;br /&gt;
        }&lt;br /&gt;
        return $result;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Подписать одного ученика на поток&lt;br /&gt;
     * &lt;br /&gt;
     * @return bool&lt;br /&gt;
     * @param object $cstream - объект из таблицы cstreams&lt;br /&gt;
     * @param int $programmsbcid - id подписки ученика на программу в таблице programmsbcs&lt;br /&gt;
     * &lt;br /&gt;
     * @todo проверить, не подписан ли уже ученик на этот поток&lt;br /&gt;
     * @todo добавить полную проверку объекта $cpassed, если к тому времени не введем функции безопасной вставки&lt;br /&gt;
     */&lt;br /&gt;
    public function enrol_student_on_cstream($cstream, $programmsbcid)&lt;br /&gt;
    {&lt;br /&gt;
        $programmsbcid = intval($programmsbcid);&lt;br /&gt;
        if ( ! is_object($cstream) OR ! $programmsbc = $this-&amp;gt;dof-&amp;gt;storage('programmsbcs')-&amp;gt;get($programmsbcid) )&lt;br /&gt;
        {// неправильный формат данных&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        if ( ! $studentid = $this-&amp;gt;dof-&amp;gt;storage('programmsbcs')-&amp;gt;get_studentid_by_programmsbc($programmsbcid) )&lt;br /&gt;
        {// не нашли id ученика - это ошибка&lt;br /&gt;
            // @todo поймать здесь исключение которое будет генерироваться функцией get_studentid_by_programmitem&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        if ( ! $programmitem = $this-&amp;gt;dof-&amp;gt;storage('programmitems')-&amp;gt;get($cstream-&amp;gt;programmitemid) )&lt;br /&gt;
        {// предмет потока на который подписывается ученик не найден&lt;br /&gt;
            // @todo сгенерировать исключение и записать это событие в лог, когда станет возможно&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // создаем объект для будущей подписки на предмет&lt;br /&gt;
        $cpassed = new object;&lt;br /&gt;
        $cpassed-&amp;gt;cstreamid      = $cstream-&amp;gt;id;&lt;br /&gt;
        $cpassed-&amp;gt;programmsbcid  = $programmsbcid;&lt;br /&gt;
        $cpassed-&amp;gt;programmitemid = $cstream-&amp;gt;programmitemid;&lt;br /&gt;
        $cpassed-&amp;gt;studentid      = $studentid;&lt;br /&gt;
        $cpassed-&amp;gt;agroupid       = $programmsbc-&amp;gt;agroupid;&lt;br /&gt;
        $cpassed-&amp;gt;gradelevel     = $programmitem-&amp;gt;gradelevel; 	&lt;br /&gt;
        $cpassed-&amp;gt;ageid          = $cstream-&amp;gt;ageid;&lt;br /&gt;
        // @todo с типом синхронизации разобраться когда станет окончательно ясно как обавлять обычные cpassed&lt;br /&gt;
        //$cpassed-&amp;gt;typesync       = 0;&lt;br /&gt;
        // @todo добавить  сюда сведения о часах из дисциплины, когда эти поля появятся в таблице cpassed&lt;br /&gt;
         &lt;br /&gt;
        // Устанавливаем статус прошлой подписки в положение &amp;quot;неуспешно завершен&amp;quot;&lt;br /&gt;
        // @todo в будущем проверять результат выполнения этой функции и записывать его в лог&lt;br /&gt;
        // когда это станет возможно&lt;br /&gt;
        if ( $repeatid = $this-&amp;gt;set_previos_cpassed_to_failed($cstream, $programmsbcid) )&lt;br /&gt;
        {// если ученик пересдавал предмет в этом потоке - то запомним это&lt;br /&gt;
            $cpassed-&amp;gt;repeatid = $repeatid;&lt;br /&gt;
        }&lt;br /&gt;
                &lt;br /&gt;
        // вставляем новую запись в таблицу cpassed, тем самым подписывая ученика на поток&lt;br /&gt;
        if ( ! $newid = $this-&amp;gt;dof-&amp;gt;storage('cpassed')-&amp;gt;insert($cpassed) )&lt;br /&gt;
        {// не удалось создать новую запись&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // после создания установим подписке нужный статус:&lt;br /&gt;
        return $this-&amp;gt;set_new_status_to_cpassed($newid, $cstream);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Устанавливает предыдущие подписки в статус &amp;quot;неуспешно завершено&amp;quot; если они были&lt;br /&gt;
     * &lt;br /&gt;
     * @return bool&lt;br /&gt;
     * @param object $cstream - учебный поток, объект из таблицы cstreams&lt;br /&gt;
     * @param object $programmsbcid - id подписки на программу в таблице programmsbcs&lt;br /&gt;
     * &lt;br /&gt;
     * @todo различать случаи ошибок и случаи когда просто нет предыдущей записи в cpassed&lt;br /&gt;
     */&lt;br /&gt;
    private function set_previos_cpassed_to_failed($cstream, $programmsbcid)&lt;br /&gt;
    {&lt;br /&gt;
        $select = 'programmsbcid = '.$programmsbcid.&lt;br /&gt;
                      ' AND cstreamid = '.$cstream-&amp;gt;id.&lt;br /&gt;
                      &amp;quot; AND repeatid IS NULL AND status != 'canceled' &amp;quot;;&lt;br /&gt;
        $cpass = $this-&amp;gt;dof-&amp;gt;storage('cpassed')-&amp;gt;get_list_select($select);&lt;br /&gt;
        if ( $cpass AND is_array($cpass) )&lt;br /&gt;
        {// если нашли запись - то она единственная&lt;br /&gt;
            $cpass = current($cpass);&lt;br /&gt;
        }else&lt;br /&gt;
		{// подписка не найдена - все нормально, ничего не надо делать&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
        &lt;br /&gt;
        // найдем наследника&lt;br /&gt;
		$successorid = $this-&amp;gt;dof-&amp;gt;storage('cpassed')-&amp;gt;get_last_successor($cpass-&amp;gt;id);&lt;br /&gt;
        if ( ! $successorid )&lt;br /&gt;
        {// нет наследника - все нормально&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // устанавливаем предыдущие подписки в статус &amp;quot;отменен&amp;quot; или &amp;quot;неуспешно завершен&amp;quot;, если они есть,&lt;br /&gt;
        // используя для этого функцию выставления итоговых оценок&lt;br /&gt;
        // @todo проверить результат работы этой функции и записать в лог возможные ошибки, если они возникнут&lt;br /&gt;
        $this-&amp;gt;dof-&amp;gt;storage('cpassed')-&amp;gt;set_final_grade($successorid);&lt;br /&gt;
        &lt;br /&gt;
        return $successorid;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** установить статус новой созданной подписки в зависимости от статуса потока неа который она создается&lt;br /&gt;
     * &lt;br /&gt;
     * @return bool&lt;br /&gt;
     * @param int $id - id подписки на поток в таблице cpassed&lt;br /&gt;
     * @param object $cstream - объект из таблицы cstreams. Поток на который была произведена запись&lt;br /&gt;
     */&lt;br /&gt;
    private function set_new_status_to_cpassed($id, $cstream)&lt;br /&gt;
    {&lt;br /&gt;
        switch ( $cstream-&amp;gt;status )&lt;br /&gt;
        {// в зависимости от статуса потока меняем статус подписки&lt;br /&gt;
            case 'active':  return $this-&amp;gt;dof-&amp;gt;workflow('cpassed')-&amp;gt;change($id, 'active');  break;&lt;br /&gt;
            case 'suspend': return $this-&amp;gt;dof-&amp;gt;workflow('cpassed')-&amp;gt;change($id, 'suspend'); break;&lt;br /&gt;
            // подписка уже в нужном статусе&lt;br /&gt;
            case 'plan':    return true; break;&lt;br /&gt;
            // неизвестный или недопустимый статус потока&lt;br /&gt;
            default: return false;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Подписать одного ученика на поток. &lt;br /&gt;
     * &lt;br /&gt;
     * @return bool&lt;br /&gt;
     * @param object $cstream - объект из таблицы cstreams&lt;br /&gt;
     * @param int $programmsbcid - id подписки ученика на программу в таблице programmsbcs&lt;br /&gt;
     * &lt;br /&gt;
     * @todo перенести эту функцию в storage/cstreams&lt;br /&gt;
     */&lt;br /&gt;
    public function unenrol_student_from_cstream($cstream, $programmsbcid)&lt;br /&gt;
    {&lt;br /&gt;
        $programmsbcid = intval($programmsbcid);&lt;br /&gt;
        if ( ! is_object($cstream) OR ! $programmsbcid )&lt;br /&gt;
        {// неправильный формат данных&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        if ( ! $cpassed = $this-&amp;gt;dof-&amp;gt;storage('cpassed')-&amp;gt;&lt;br /&gt;
                get_list_filter('cstreamid', $cstream-&amp;gt;id, 'programmsbcid', $programmsbcid, &lt;br /&gt;
                'status', array('plan', 'active', 'suspend')) )&lt;br /&gt;
        {// не нашли ни одной подписки, значит ученик уже отписан&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        $result = true;&lt;br /&gt;
        foreach ( $cpassed as $cpitem )&lt;br /&gt;
        {// отписываем всех учеников от потока, устанавливая подпискам статус &amp;quot;отменен&amp;quot;&lt;br /&gt;
            // @todo выяснить какой статус устанавливать: &amp;quot;отменен&amp;quot; или &amp;quot;успешно завершен&amp;quot;&lt;br /&gt;
            $result = &amp;amp; $this-&amp;gt;dof-&amp;gt;workflow('cpassed')-&amp;gt;change($cpitem-&amp;gt;id, 'canceled');&lt;br /&gt;
        }&lt;br /&gt;
        return $result;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Получить id программы, к которой привязан указанный поток&lt;br /&gt;
     * &lt;br /&gt;
     * @return int|bool - id программы, которой принадлежит поток или false в случае ошибки&lt;br /&gt;
     * @param int $cstreamid - id потока в таблице cstreams&lt;br /&gt;
     */&lt;br /&gt;
    private function get_cstream_programmid($cstreamid)&lt;br /&gt;
    {&lt;br /&gt;
        if ( ! $this-&amp;gt;get($cstreamid) )&lt;br /&gt;
        {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // получаем id программы из предмета, по которому проходит этот поток&lt;br /&gt;
        return $this-&amp;gt;dof-&amp;gt;storage('programmitems')-&amp;gt;get_field($cstreamid-&amp;gt;programmitemid, 'programmid');&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** Сохраняет имя предмето-потока в БД&lt;br /&gt;
     * @param int $cstreamid - id предмето-поток&lt;br /&gt;
     * @return bool true - если запись прошла успешно или false&lt;br /&gt;
     */&lt;br /&gt;
    public function get_cstreamname($eventcode, $mixedvar, $cstream = false)&lt;br /&gt;
    {&lt;br /&gt;
        //узнаем с объектами из каких таблиц мы имеем дело';&lt;br /&gt;
        //и найдем cstreamid&lt;br /&gt;
        if ( $cstream )&lt;br /&gt;
        {//пришли данные из таблицы cstream&lt;br /&gt;
            if ( $eventcode == 'delete' AND isset($mixedvar['old']-&amp;gt;id) )&lt;br /&gt;
            {//это удаление- старый объект обязательно должен быть&lt;br /&gt;
                $oldid = $mixedvar['old']-&amp;gt;id;&lt;br /&gt;
            }elseif ( $eventcode == 'insert' AND isset($mixedvar['new']-&amp;gt;id) )&lt;br /&gt;
            {//это вставка - новая запись всегда должна быть&lt;br /&gt;
                $newid = $mixedvar['new']-&amp;gt;id;&lt;br /&gt;
            }elseif ( $eventcode == 'update' AND isset($mixedvar['old']-&amp;gt;id) &lt;br /&gt;
                 AND isset($mixedvar['new']-&amp;gt;id) )&lt;br /&gt;
            {//это обновление - оба объекта должны быть&lt;br /&gt;
                $newid = $mixedvar['new']-&amp;gt;id;&lt;br /&gt;
                $oldid = $mixedvar['old']-&amp;gt;id;&lt;br /&gt;
            }else&lt;br /&gt;
            {//но это не так&lt;br /&gt;
               return false; &lt;br /&gt;
            }&lt;br /&gt;
        }else&lt;br /&gt;
        {//пришли данные из других таблиц';&lt;br /&gt;
            if ( $eventcode == 'delete' AND isset($mixedvar['old']-&amp;gt;cstreamid) )&lt;br /&gt;
            {//это удаление - старый объект обязательно должен быть&lt;br /&gt;
                $oldid = $mixedvar['old']-&amp;gt;cstreamid;&lt;br /&gt;
            }elseif ( $eventcode == 'insert' AND isset($mixedvar['new']-&amp;gt;cstreamid) )&lt;br /&gt;
            {//это вставка - новая запись всегда должна быть&lt;br /&gt;
                $newid = $mixedvar['new']-&amp;gt;cstreamid;&lt;br /&gt;
            }elseif ( $eventcode == 'update' AND isset($mixedvar['old']-&amp;gt;cstreamid) &lt;br /&gt;
                 AND isset($mixedvar['new']-&amp;gt;id) )&lt;br /&gt;
            {//это обновление - оба объекта должны быть&lt;br /&gt;
                $newid = $mixedvar['new']-&amp;gt;cstreamid;&lt;br /&gt;
                $oldid = $mixedvar['old']-&amp;gt;cstreamid;&lt;br /&gt;
            }else&lt;br /&gt;
            {//но это не так&lt;br /&gt;
               return false; &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        //путь к файлу с методами формирования имени файла&lt;br /&gt;
        $path = $this-&amp;gt;dof-&amp;gt;plugin_path('storage','cstreams','/cfg/namestream.php');&lt;br /&gt;
        if ( ! file_exists($path) )&lt;br /&gt;
        {//если файла нет - сообщим об этом&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        //файл есть - подключаем файл&lt;br /&gt;
        include_once($path);&lt;br /&gt;
        //создаем объект для генерации имени&lt;br /&gt;
        $csname = new block_dof_storage_cstreams_namecstream;&lt;br /&gt;
        switch ( $eventcode )&lt;br /&gt;
        {&lt;br /&gt;
            case 'insert':&lt;br /&gt;
            {&lt;br /&gt;
                return $csname-&amp;gt;save_cstream_name($newid);&lt;br /&gt;
            }&lt;br /&gt;
            case 'update':&lt;br /&gt;
            {&lt;br /&gt;
                $old = $csname-&amp;gt;save_cstream_name($oldid);&lt;br /&gt;
                $new = $csname-&amp;gt;save_cstream_name($newid);&lt;br /&gt;
                return ($old AND $new);&lt;br /&gt;
            }&lt;br /&gt;
            case 'delete':&lt;br /&gt;
            {&lt;br /&gt;
                return $csname-&amp;gt;save_cstream_name($oldid);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить список учебных процессов для данного ученика с учетом персональной подписки и академических групп (второй параметр - статус, по умолчанию - &amp;quot;идет&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |Массив, содержащий id учебного потока&lt;br /&gt;
''Пример:'' array('cstreamid'=&amp;gt;$id)&lt;br /&gt;
 |Событие посылается при изменении статуса учебного потока на &amp;quot;активный&amp;quot; (active)&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2048</id>
		<title>Разработка:storages/cstreams</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2048"/>
				<updated>2010-11-10T15:27:44Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cstreams&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cstreams'' - учебный поток. Представляет учебный процесс, идущий по учебной дисциплине/предмету в течение одного учебного периоду с конкретным преподавателем, одним или несколькими учащимися или группой.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* ageid - учебный период в таблице [[Разработка:storages/ages | ages ]]&lt;br /&gt;
* programmitemid - дисциплина в таблице [[Разработка:storages/programmitems | programmitems ]]&lt;br /&gt;
* teacherid - id преподавателя в таблице [[Разработка:storages/persons | persons ]]. После создания поля appointmentid стало ненужным. Все старые обращения к этому полю будут переделаны на обращения к appointmentid, при создании новых обращений они должны обращаться к appointmentid. После переработки старых методов данное поле удалиться.&lt;br /&gt;
* departmentid - подразделение, которому принадлежит учебный процесс в таблице [[Разработка:storages/departments | departments ]]&lt;br /&gt;
* appointmentid - id назначения на должность в таблице [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
* mdlgroup - id группы moodle, соответствующей учебному потоку&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, по-умолчанию берется из programmitems, если там не указано - из ages. Нужны для подсчета часов при составлении расписания.&lt;br /&gt;
* begindate - дата и время, когда учебный процесс был впервые переведен в состояние &amp;quot;идет обучение&amp;quot; по [http://ru.wikipedia.org/wiki/UTC UTC]&lt;br /&gt;
* enddate  - дата и время окончания по [http://ru.wikipedia.org/wiki/UTC UTC], когда учебный процесс был в последний раз выведен из состояния &amp;quot;идет обучение&amp;quot;&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/cstreams | cstreams ]]&lt;br /&gt;
* hours - часов всего&lt;br /&gt;
* hoursweek - часов в неделю&lt;br /&gt;
* name - имя предмето-потока&lt;br /&gt;
* hoursweekdistance - количество часов в неделю дистанционно&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject, $id = NULL, $quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу плагина.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - данные для записи в таблицу.&lt;br /&gt;
* $id = NULL&lt;br /&gt;
* quiet(bool) - генерировать или нет события, по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id вставленной записи.&lt;br /&gt;
* (bool) - false, если операция не удалась.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''delete($id,$quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Удаляет запись из таблицы плагина с указанным id.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* id(int) - id записи в этой таблице .&lt;br /&gt;
* quiet(bool) - генерировать или нет события, по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если запись удалена или ее нет, false - в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''update($dataobject, $id = NULL, $quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Обновляет запись в таблице плагина данными из объекта. Отсутствующие в объекте записи не изменяются. Если id передан, то обновляется запись с переданным id. Если id не передан обновляется запись с id, который передан в объекте.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - данные, которыми надо заменить запись в таблице.&lt;br /&gt;
* id(int) - id обновляемой записи в этой таблице.&lt;br /&gt;
* quiet(bool) - не генерировать событий.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если обновление прошло успешно, и false - во всех остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get($id)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает запись из таблицы плагина с указанным id.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* id(int) - id записи в этой таблице.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* @return mixed object - запись из таблицы или false в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_field($id,$return)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает содержимое поля по id записи и имени поля в таблице плагина .&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* id(int) - id записи в этой таблице.&lt;br /&gt;
* $return(string) - имя поля.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (mixed) - значение поля.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_filter($field1 = /'', $value1 = /'', $field2 = /'', $value2 = /'', $field3 = /'', $value3 = /'', $fields = '*')'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает объект, которые удовлетворяют заданным критериям.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* field1(string) - название первого поля поиска, по умолчанию - пусто('').&lt;br /&gt;
* value1(mixed) - значение, которое ищется в первом поле, по умолчанию - пусто('').&lt;br /&gt;
* field2(string) - название второго поля поиска, по умолчанию - пусто('').&lt;br /&gt;
* value2(mixed) - значение, которое ищется во втором поле, по умолчанию - пусто('').&lt;br /&gt;
* field3(string) - название третьего поля поиска, по умолчанию - пусто('').&lt;br /&gt;
* value3(mixed) - значение, которое ищется в третьем поле, по умолчанию - пусто('').&lt;br /&gt;
**''любая переменная $valueX может содержать как одно значение так и массив значений, которые ищутся в соответствующем  поле.''&lt;br /&gt;
* fields(string) - поля, которые должны быть возвращены, разделенные запятыми.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект с указанными полями, если нашлась запись, удовлетворяюшая всем трем критериям поиска.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list($field = '', $value = '', $sort = '', $fields = '*', $limitfrom = '', $limitnum = '')'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает массив объектов, удовлетворяющих нескольким значениям одного поля из таблицы плагина.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* field(string) - название поля для поиска в этой таблице.&lt;br /&gt;
* value(mixed) - может содержать как одно значение, так и массив значений, которые ищутся в указанном поле&lt;br /&gt;
* sort(string) - в каком направлении и по каким полям производится сортировка.&lt;br /&gt;
* fields(string) - поля, которые надо возвратить.&lt;br /&gt;
* limitfrom(int) - id, начиная с которого надо искать.&lt;br /&gt;
* limitnum(int) - максимальное количество записей, которое надо вернуть.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (mixed) - массив объектов если что-то нашлось.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_teacher_cstream()'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного преподавателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_department_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного подразделения.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_age_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для данного учебного периода.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_programmitem_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов по данной дисциплине.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_cstream'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для академической группы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_agenum_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_status_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
''' get_prog_age_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_listing()'''&lt;br /&gt;
&lt;br /&gt;
'''get_select_listing()'''&lt;br /&gt;
&lt;br /&gt;
protected-метод.&lt;br /&gt;
&lt;br /&gt;
'''is_teacher()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_ageids()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_agroup()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_programm()'''&lt;br /&gt;
&lt;br /&gt;
'''enrol_agroup_on_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить список учебных процессов для данного ученика с учетом персональной подписки и академических групп (второй параметр - статус, по умолчанию - &amp;quot;идет&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |Массив, содержащий id учебного потока&lt;br /&gt;
''Пример:'' array('cstreamid'=&amp;gt;$id)&lt;br /&gt;
 |Событие посылается при изменении статуса учебного потока на &amp;quot;активный&amp;quot; (active)&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2047</id>
		<title>Разработка:storages/cstreams</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2047"/>
				<updated>2010-11-10T15:27:02Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cstreams&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cstreams'' - учебный поток. Представляет учебный процесс, идущий по учебной дисциплине/предмету в течение одного учебного периоду с конкретным преподавателем, одним или несколькими учащимися или группой.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* ageid - учебный период в таблице [[Разработка:storages/ages | ages ]]&lt;br /&gt;
* programmitemid - дисциплина в таблице [[Разработка:storages/programmitems | programmitems ]]&lt;br /&gt;
* teacherid - id преподавателя в таблице [[Разработка:storages/persons | persons ]]. После создания поля appointmentid стало ненужным. Все старые обращения к этому полю будут переделаны на обращения к appointmentid, при создании новых обращений они должны обращаться к appointmentid. После переработки старых методов данное поле удалиться.&lt;br /&gt;
* departmentid - подразделение, которому принадлежит учебный процесс в таблице [[Разработка:storages/departments | departments ]]&lt;br /&gt;
* appointmentid - id назначения на должность в таблице [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
* mdlgroup - id группы moodle, соответствующей учебному потоку&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, по-умолчанию берется из programmitems, если там не указано - из ages. Нужны для подсчета часов при составлении расписания.&lt;br /&gt;
* begindate - дата и время, когда учебный процесс был впервые переведен в состояние &amp;quot;идет обучение&amp;quot; по [http://ru.wikipedia.org/wiki/UTC UTC]&lt;br /&gt;
* enddate  - дата и время окончания по [http://ru.wikipedia.org/wiki/UTC UTC], когда учебный процесс был в последний раз выведен из состояния &amp;quot;идет обучение&amp;quot;&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/cstreams | cstreams ]]&lt;br /&gt;
* hours - часов всего&lt;br /&gt;
* hoursweek - часов в неделю&lt;br /&gt;
* name - имя предмето-потока&lt;br /&gt;
* hoursweekdistance - количество часов в неделю дистанционно&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject, $id = NULL, $quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу плагина.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - данные для записи в таблицу.&lt;br /&gt;
* $id = NULL&lt;br /&gt;
* quiet(bool) - генерировать или нет события, по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id вставленной записи.&lt;br /&gt;
* (bool) - false, если операция не удалась.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''delete($id,$quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Удаляет запись из таблицы плагина с указанным id.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* id(int) - id записи в этой таблице .&lt;br /&gt;
* quiet(bool) - генерировать или нет события, по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если запись удалена или ее нет, false - в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''update($dataobject, $id = NULL, $quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Обновляет запись в таблице плагина данными из объекта. Отсутствующие в объекте записи не изменяются. Если id передан, то обновляется запись с переданным id. Если id не передан обновляется запись с id, который передан в объекте.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - данные, которыми надо заменить запись в таблице.&lt;br /&gt;
* id(int) - id обновляемой записи в этой таблице.&lt;br /&gt;
* quiet(bool) - не генерировать событий.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если обновление прошло успешно, и false - во всех остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get($id)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает запись из таблицы плагина с указанным id.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* id(int) - id записи в этой таблице.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* @return mixed object - запись из таблицы или false в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_field($id,$return)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает содержимое поля по id записи и имени поля в таблице плагина .&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* id(int) - id записи в этой таблице.&lt;br /&gt;
* $return(string) - имя поля.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (mixed) - значение поля.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_filter($field1 = \'', $value1 = \'', $field2 = \'', $value2 = \'', $field3 = \'', $value3 = \'', $fields = '*')'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает объект, которые удовлетворяют заданным критериям.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* field1(string) - название первого поля поиска, по умолчанию - пусто('').&lt;br /&gt;
* value1(mixed) - значение, которое ищется в первом поле, по умолчанию - пусто('').&lt;br /&gt;
* field2(string) - название второго поля поиска, по умолчанию - пусто('').&lt;br /&gt;
* value2(mixed) - значение, которое ищется во втором поле, по умолчанию - пусто('').&lt;br /&gt;
* field3(string) - название третьего поля поиска, по умолчанию - пусто('').&lt;br /&gt;
* value3(mixed) - значение, которое ищется в третьем поле, по умолчанию - пусто('').&lt;br /&gt;
**''любая переменная $valueX может содержать как одно значение так и массив значений, которые ищутся в соответствующем  поле.''&lt;br /&gt;
* fields(string) - поля, которые должны быть возвращены, разделенные запятыми.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект с указанными полями, если нашлась запись, удовлетворяюшая всем трем критериям поиска.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list($field = '', $value = '', $sort = '', $fields = '*', $limitfrom = '', $limitnum = '')'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает массив объектов, удовлетворяющих нескольким значениям одного поля из таблицы плагина.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* field(string) - название поля для поиска в этой таблице.&lt;br /&gt;
* value(mixed) - может содержать как одно значение, так и массив значений, которые ищутся в указанном поле&lt;br /&gt;
* sort(string) - в каком направлении и по каким полям производится сортировка.&lt;br /&gt;
* fields(string) - поля, которые надо возвратить.&lt;br /&gt;
* limitfrom(int) - id, начиная с которого надо искать.&lt;br /&gt;
* limitnum(int) - максимальное количество записей, которое надо вернуть.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (mixed) - массив объектов если что-то нашлось.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_teacher_cstream()'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного преподавателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_department_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного подразделения.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_age_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для данного учебного периода.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_programmitem_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов по данной дисциплине.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_cstream'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для академической группы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_agenum_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_status_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
''' get_prog_age_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_listing()'''&lt;br /&gt;
&lt;br /&gt;
'''get_select_listing()'''&lt;br /&gt;
&lt;br /&gt;
protected-метод.&lt;br /&gt;
&lt;br /&gt;
'''is_teacher()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_ageids()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_agroup()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_programm()'''&lt;br /&gt;
&lt;br /&gt;
'''enrol_agroup_on_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить список учебных процессов для данного ученика с учетом персональной подписки и академических групп (второй параметр - статус, по умолчанию - &amp;quot;идет&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |Массив, содержащий id учебного потока&lt;br /&gt;
''Пример:'' array('cstreamid'=&amp;gt;$id)&lt;br /&gt;
 |Событие посылается при изменении статуса учебного потока на &amp;quot;активный&amp;quot; (active)&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2046</id>
		<title>Разработка:storages/cstreams</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2046"/>
				<updated>2010-11-10T15:25:14Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cstreams&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cstreams'' - учебный поток. Представляет учебный процесс, идущий по учебной дисциплине/предмету в течение одного учебного периоду с конкретным преподавателем, одним или несколькими учащимися или группой.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* ageid - учебный период в таблице [[Разработка:storages/ages | ages ]]&lt;br /&gt;
* programmitemid - дисциплина в таблице [[Разработка:storages/programmitems | programmitems ]]&lt;br /&gt;
* teacherid - id преподавателя в таблице [[Разработка:storages/persons | persons ]]. После создания поля appointmentid стало ненужным. Все старые обращения к этому полю будут переделаны на обращения к appointmentid, при создании новых обращений они должны обращаться к appointmentid. После переработки старых методов данное поле удалиться.&lt;br /&gt;
* departmentid - подразделение, которому принадлежит учебный процесс в таблице [[Разработка:storages/departments | departments ]]&lt;br /&gt;
* appointmentid - id назначения на должность в таблице [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
* mdlgroup - id группы moodle, соответствующей учебному потоку&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, по-умолчанию берется из programmitems, если там не указано - из ages. Нужны для подсчета часов при составлении расписания.&lt;br /&gt;
* begindate - дата и время, когда учебный процесс был впервые переведен в состояние &amp;quot;идет обучение&amp;quot; по [http://ru.wikipedia.org/wiki/UTC UTC]&lt;br /&gt;
* enddate  - дата и время окончания по [http://ru.wikipedia.org/wiki/UTC UTC], когда учебный процесс был в последний раз выведен из состояния &amp;quot;идет обучение&amp;quot;&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/cstreams | cstreams ]]&lt;br /&gt;
* hours - часов всего&lt;br /&gt;
* hoursweek - часов в неделю&lt;br /&gt;
* name - имя предмето-потока&lt;br /&gt;
* hoursweekdistance - количество часов в неделю дистанционно&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject, $id = NULL, $quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу плагина.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - данные для записи в таблицу.&lt;br /&gt;
* $id = NULL&lt;br /&gt;
* quiet(bool) - генерировать или нет события, по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id вставленной записи.&lt;br /&gt;
* (bool) - false, если операция не удалась.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''delete($id,$quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Удаляет запись из таблицы плагина с указанным id.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* id(int) - id записи в этой таблице .&lt;br /&gt;
* quiet(bool) - генерировать или нет события, по умолчанию - нет(false).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если запись удалена или ее нет, false - в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''update($dataobject, $id = NULL, $quiet=false)'''====&lt;br /&gt;
&lt;br /&gt;
Обновляет запись в таблице плагина данными из объекта. Отсутствующие в объекте записи не изменяются. Если id передан, то обновляется запись с переданным id. Если id не передан обновляется запись с id, который передан в объекте.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - данные, которыми надо заменить запись в таблице.&lt;br /&gt;
* id(int) - id обновляемой записи в этой таблице.&lt;br /&gt;
* quiet(bool) - не генерировать событий.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если обновление прошло успешно, и false - во всех остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get($id)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает запись из таблицы плагина с указанным id.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* id(int) - id записи в этой таблице.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* @return mixed object - запись из таблицы или false в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_field($id,$return)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает содержимое поля по id записи и имени поля в таблице плагина .&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* id(int) - id записи в этой таблице.&lt;br /&gt;
* $return(string) - имя поля.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (mixed) - значение поля.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_filter($field1 = '', $value1 = '', $field2 = '', $value2 = '', $field3 = '', $value3 = '', $fields = '*')'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает объект, которые удовлетворяют заданным критериям.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* field1(string) - название первого поля поиска, по умолчанию - пусто('').&lt;br /&gt;
* value1(mixed) - значение, которое ищется в первом поле, по умолчанию - пусто('').&lt;br /&gt;
* field2(string) - название второго поля поиска, по умолчанию - пусто('').&lt;br /&gt;
* value2(mixed) - значение, которое ищется во втором поле, по умолчанию - пусто('').&lt;br /&gt;
* field3(string) - название третьего поля поиска, по умолчанию - пусто('').&lt;br /&gt;
* value3(mixed) - значение, которое ищется в третьем поле, по умолчанию - пусто('').&lt;br /&gt;
**''любая переменная $valueX может содержать как одно значение так и массив значений, которые ищутся в соответствующем  поле.''&lt;br /&gt;
* fields(string) - поля, которые должны быть возвращены, разделенные запятыми.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - объект с указанными полями, если нашлась запись, удовлетворяюшая всем трем критериям поиска.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list($field = '', $value = '', $sort = '', $fields = '*', $limitfrom = '', $limitnum = '')'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает массив объектов, удовлетворяющих нескольким значениям одного поля из таблицы плагина.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* field(string) - название поля для поиска в этой таблице.&lt;br /&gt;
* value(mixed) - может содержать как одно значение, так и массив значений, которые ищутся в указанном поле&lt;br /&gt;
* sort(string) - в каком направлении и по каким полям производится сортировка.&lt;br /&gt;
* fields(string) - поля, которые надо возвратить.&lt;br /&gt;
* limitfrom(int) - id, начиная с которого надо искать.&lt;br /&gt;
* limitnum(int) - максимальное количество записей, которое надо вернуть.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (mixed) - массив объектов если что-то нашлось.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_teacher_cstream()'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного преподавателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_department_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного подразделения.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_age_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для данного учебного периода.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_programmitem_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов по данной дисциплине.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_cstream'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для академической группы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_agenum_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_status_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
''' get_prog_age_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_listing()'''&lt;br /&gt;
&lt;br /&gt;
'''get_select_listing()'''&lt;br /&gt;
&lt;br /&gt;
protected-метод.&lt;br /&gt;
&lt;br /&gt;
'''is_teacher()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_ageids()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_agroup()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_programm()'''&lt;br /&gt;
&lt;br /&gt;
'''enrol_agroup_on_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить список учебных процессов для данного ученика с учетом персональной подписки и академических групп (второй параметр - статус, по умолчанию - &amp;quot;идет&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |Массив, содержащий id учебного потока&lt;br /&gt;
''Пример:'' array('cstreamid'=&amp;gt;$id)&lt;br /&gt;
 |Событие посылается при изменении статуса учебного потока на &amp;quot;активный&amp;quot; (active)&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2022</id>
		<title>Разработка:storages/cstreams</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2022"/>
				<updated>2010-11-10T09:51:01Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Таблица в базе данных */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cstreams&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cstreams'' - учебный поток. Представляет учебный процесс, идущий по учебной дисциплине/предмету в течение одного учебного периоду с конкретным преподавателем, одним или несколькими учащимися или группой.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* ageid - учебный период в таблице [[Разработка:storages/ages | ages ]]&lt;br /&gt;
* programmitemid - дисциплина в таблице [[Разработка:storages/programmitems | programmitems ]]&lt;br /&gt;
* teacherid - id преподавателя в таблице [[Разработка:storages/persons | persons ]]. После создания поля appointmentid стало ненужным. Все старые обращения к этому полю будут переделаны на обращения к appointmentid, при создании новых обращений они должны обращаться к appointmentid. После переработки старых методов данное поле удалиться.&lt;br /&gt;
* departmentid - подразделение, которому принадлежит учебный процесс в таблице [[Разработка:storages/departments | departments ]]&lt;br /&gt;
* appointmentid - id назначения на должность в таблице [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
* mdlgroup - id группы moodle, соответствующей учебному потоку&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, по-умолчанию берется из programmitems, если там не указано - из ages. Нужны для подсчета часов при составлении расписания.&lt;br /&gt;
* begindate - дата и время, когда учебный процесс был впервые переведен в состояние &amp;quot;идет обучение&amp;quot; по [http://ru.wikipedia.org/wiki/UTC UTC]&lt;br /&gt;
* enddate  - дата и время окончания по [http://ru.wikipedia.org/wiki/UTC UTC], когда учебный процесс был в последний раз выведен из состояния &amp;quot;идет обучение&amp;quot;&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/cstreams | cstreams ]]&lt;br /&gt;
* hours - часов всего&lt;br /&gt;
* hoursweek - часов в неделю&lt;br /&gt;
* name - имя предмето-потока&lt;br /&gt;
* hoursweekdistance - количество часов в неделю дистанционно&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''get_teacher_cstream()'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного преподавателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_department_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного подразделения.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_age_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для данного учебного периода.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_programmitem_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов по данной дисциплине.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_cstream'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для академической группы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_agenum_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_status_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
''' get_prog_age_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_listing()'''&lt;br /&gt;
&lt;br /&gt;
'''get_select_listing()'''&lt;br /&gt;
&lt;br /&gt;
protected-метод.&lt;br /&gt;
&lt;br /&gt;
'''is_teacher()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_ageids()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_agroup()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_programm()'''&lt;br /&gt;
&lt;br /&gt;
'''enrol_agroup_on_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить список учебных процессов для данного ученика с учетом персональной подписки и академических групп (второй параметр - статус, по умолчанию - &amp;quot;идет&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |Массив, содержащий id учебного потока&lt;br /&gt;
''Пример:'' array('cstreamid'=&amp;gt;$id)&lt;br /&gt;
 |Событие посылается при изменении статуса учебного потока на &amp;quot;активный&amp;quot; (active)&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2021</id>
		<title>Разработка:storages/cstreams</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2021"/>
				<updated>2010-11-10T09:48:59Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cstreams&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cstreams'' - учебный поток. Представляет учебный процесс, идущий по учебной дисциплине/предмету в течение одного учебного периоду с конкретным преподавателем, одним или несколькими учащимися или группой.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* ageid - учебный период в таблице [[Разработка:storages/ages | ages ]]&lt;br /&gt;
* programmitemid - дисциплина в таблице [[Разработка:storages/programmitems | programmitems ]]&lt;br /&gt;
* teacherid - id преподавателя в таблице [[Разработка:storages/persons | persons ]]. После создания поля appointmentid стало ненужным. Все старые обращения к этому полю будут переделаны на обращения к appointmentid, при создании новых обращений они должны обращаться к appointmentid. После переработки старых методов данное поле удалиться.&lt;br /&gt;
* departmentid - подразделение, которому принадлежит учебный процесс в таблице [[Разработка:storages/departments | departments ]]&lt;br /&gt;
* appointmentid - id назначения на должность в таблице [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
* mdlgroup - id группы moodle, соответствующей учебному потоку&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, по-умолчанию берется из programmitems, если там не указано - из ages. Нужны для подсчета часов при составлении расписания.&lt;br /&gt;
* begindate - дата и время, когда учебный процесс был впервые переведен в состояние &amp;quot;идет обучение&amp;quot; по [http://ru.wikipedia.org/wiki/UTC UTC]&lt;br /&gt;
* enddate  - дата и время окончания по [http://ru.wikipedia.org/wiki/UTC UTC], когда учебный процесс был в последний раз выведен из состояния &amp;quot;идет обучение&amp;quot;&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/cstreams | cstreams ]]&lt;br /&gt;
* hours - часов всего&lt;br /&gt;
* hoursweek - часов в неделю&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''get_teacher_cstream()'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного преподавателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_department_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного подразделения.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_age_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для данного учебного периода.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_programmitem_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов по данной дисциплине.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_cstream'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для академической группы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_agenum_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_status_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
''' get_prog_age_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_listing()'''&lt;br /&gt;
&lt;br /&gt;
'''get_select_listing()'''&lt;br /&gt;
&lt;br /&gt;
protected-метод.&lt;br /&gt;
&lt;br /&gt;
'''is_teacher()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_ageids()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_agroup()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_programm()'''&lt;br /&gt;
&lt;br /&gt;
'''enrol_agroup_on_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить список учебных процессов для данного ученика с учетом персональной подписки и академических групп (второй параметр - статус, по умолчанию - &amp;quot;идет&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |Массив, содержащий id учебного потока&lt;br /&gt;
''Пример:'' array('cstreamid'=&amp;gt;$id)&lt;br /&gt;
 |Событие посылается при изменении статуса учебного потока на &amp;quot;активный&amp;quot; (active)&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2020</id>
		<title>Разработка:storages/cstreams</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreams&amp;diff=2020"/>
				<updated>2010-11-10T09:45:51Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Таблица в базе данных */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cstreams&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cstreams'' - учебный поток. Представляет учебный процесс, идущий по учебной дисциплине/предмету в течение одного учебного периоду с конкретным преподавателем, одним или несколькими учащимися или группой.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* ageid - учебный период в таблице [[Разработка:storages/ages | ages ]]&lt;br /&gt;
* programmitemid - дисциплина в таблице [[Разработка:storages/programmitems | programmitems ]]&lt;br /&gt;
* teacherid - id преподавателя в таблице [[Разработка:storages/persons | persons ]]. После создания поля appointmentid стало ненужным. Все старые обращения к этому полю будут переделаны на обращения к appointmentid, при создании новых обращений они должны обращаться к appointmentid. После переработки старых методов данное поле удалиться.&lt;br /&gt;
* departmentid - подразделение, которому принадлежит учебный процесс в таблице [[Разработка:storages/departments | departments ]]&lt;br /&gt;
* appointmentid - id назначения на должность в таблице [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
* mdlgroup - id группы moodle, соответствующей учебному потоку&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, по-умолчанию берется из programmitems, если там не указано - из ages. Нужны для подсчета часов при составлении расписания.&lt;br /&gt;
* begindate - дата и время, когда учебный процесс был впервые переведен в состояние &amp;quot;идет обучение&amp;quot; по [http://ru.wikipedia.org/wiki/UTC UTC]&lt;br /&gt;
* enddate  - дата и время окончания по [http://ru.wikipedia.org/wiki/UTC UTC], когда учебный процесс был в последний раз выведен из состояния &amp;quot;идет обучение&amp;quot;&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/cstreams | cstreams ]]&lt;br /&gt;
* hours - часов всего&lt;br /&gt;
* hoursweek - часов в неделю&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
'''get_teacher_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного преподавателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_department_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов у данного подразделения.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_age_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для данного учебного периода.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_programmitem_cstream()'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов по данной дисциплине.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - статус потока, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список процессов:&lt;br /&gt;
** если указывается статус - процессы с указанным статусом,&lt;br /&gt;
** если статус указывается null - процессы с любым статусом,&lt;br /&gt;
** если статус не указывается - процессы со статусом go.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_cstream'''&lt;br /&gt;
&lt;br /&gt;
Получает список учебных процессов для академической группы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив процессов. &lt;br /&gt;
* (bool) false если процессы не найдены.&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_agenum_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_status_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
''' get_prog_age_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
'''get_listing()'''&lt;br /&gt;
&lt;br /&gt;
'''get_select_listing()'''&lt;br /&gt;
&lt;br /&gt;
protected-метод.&lt;br /&gt;
&lt;br /&gt;
'''is_teacher()'''&lt;br /&gt;
&lt;br /&gt;
'''get_agroup_ageids()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_agroup()'''&lt;br /&gt;
&lt;br /&gt;
'''create_cstreams_for_programm()'''&lt;br /&gt;
&lt;br /&gt;
'''enrol_agroup_on_cstreams()'''&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить список учебных процессов для данного ученика с учетом персональной подписки и академических групп (второй параметр - статус, по умолчанию - &amp;quot;идет&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cstreams.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreams&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |Массив, содержащий id учебного потока&lt;br /&gt;
''Пример:'' array('cstreamid'=&amp;gt;$id)&lt;br /&gt;
 |Событие посылается при изменении статуса учебного потока на &amp;quot;активный&amp;quot; (active)&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreamlinks&amp;diff=2019</id>
		<title>Разработка:storages/cstreamlinks</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreamlinks&amp;diff=2019"/>
				<updated>2010-11-10T09:34:25Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cstreamlinks&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cstreamlinks'' - участие академических групп в учебных потоках (основание для инициации учебного процесса). &lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* cstreamid (int) - учебный процесс в таблице [[Разработка:storages/cstreams | cstreams ]]&lt;br /&gt;
* agroupid (int) -  академическая группа в таблице [[Разработка:storages/agroups | agroups ]] (вместе с полем cstreamid составляет уникальный ключ)&lt;br /&gt;
* agroupsync (char, 20) - тип связи с академической группой: полная, не обязательный курс, нет связи&lt;br /&gt;
=====Поведение, при разных типах связей=====&lt;br /&gt;
Синхронизации членов групп распространяется только на текущие, приостановленные и запланированные потоки. А на завершенные и отмененные не распространяются.&lt;br /&gt;
При записи студента в поток через синхронизацию, в таблице [[Разработка:storages/cpassed | cpassed ]] устанавливается id академической группы, чтобы отслеживать связь при отчислении.&lt;br /&gt;
* Полная - при добавлении студента в группу, он добавляется и в поток, при исключении - отчисляется.&lt;br /&gt;
* Не обязательный курс - при добавлении студента в группу, он НЕ добавляется в поток, а при исключении - отчисляется.&lt;br /&gt;
* Нет связи - нет автоматических синхронизаций ни при включении в группу, ни при исключении, но поток числится связанным с группой. Все добавленные студенты из этой группы числятся индивидуалами (записанными на поток вручную по одному, не зависимо от группы).&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''get_typesync_cstreamlink($typesync)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список связей, по типу связи.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $typesync(string) - статус потока.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список связей.&lt;br /&gt;
* (bool) - false, если связи не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* по типу сязи находит все необходимые записи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agroup_cstreamlink($id)''' ====&lt;br /&gt;
&lt;br /&gt;
Получает список связей по академической группе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список связей.&lt;br /&gt;
* (bool) - false, если связи не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* по данному id находит все необходимые записи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_cstreamlink($id)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список связей по учебному процессу.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список связей .&lt;br /&gt;
* (bool) - false, если связи не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* по данному id находит все необходимые записи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_link_cstreamlink($agid, $csid)'''====&lt;br /&gt;
&lt;br /&gt;
Получает информацию о связи академической группы с учебным процессом или false.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $agid(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $csid(int) - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - запись из таблицы БД.&lt;br /&gt;
* (bool) - false, если связь не найдена.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* по данным id находит запись о связи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_type_cstreamlink($agid, $csid)'''====&lt;br /&gt;
&lt;br /&gt;
Получает тип связи связи академической группы с учебным процессом или false.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $agid(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $csid(int) - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - запись со связью.&lt;br /&gt;
* (bool) - false, если запись не найдена.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Из списка возможных типов связок выбирает нужную, соответствующую информации о связи, полученной по данным id.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_agroupsync()'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает массив возможных типов связок&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (нет).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array)&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Создаёт массив из записей типа: 'тип связки' =&amp;gt; 'описание'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''enrol_agroup_on_cstream($agroupid, $cstreamid, $agroupsync='full')'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает одну учебную группу на один поток&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $agroupid(int) - id группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $agroupsync(string) -  тип связи с академической группой: полная(full), не обязательный курс(norequired), нет связи(nolink). &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи в таблице cstreams&lt;br /&gt;
* (bool) - true, если такая запись уже существует, и false, если произошла ошибка.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Получает все доступные виды связей академических групп с потоками.&lt;br /&gt;
* Проверяет, является ли переданный вариант допустимым.&lt;br /&gt;
* Если всё правильно вставляет запись с переданными данными в базу и возвращает результат.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreamlinks&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cstreamlinks.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreamlinks&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cstreamlinks.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreamlinks&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cstreamlinks.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreamlinks&amp;diff=2018</id>
		<title>Разработка:storages/cstreamlinks</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cstreamlinks&amp;diff=2018"/>
				<updated>2010-11-10T09:32:36Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cstreamlinks&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cstreamlinks'' - участие академических групп в учебных потоках (основание для инициации учебного процесса). &lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* cstreamid (int) - учебный процесс в таблице [[Разработка:storages/cstreams | cstreams ]]&lt;br /&gt;
* agroupid (int) -  академическая группа в таблице [[Разработка:storages/agroups | agroups ]] (вместе с полем cstreamid составляет уникальный ключ)&lt;br /&gt;
* agroupsync (char, 20) - тип связи с академической группой: полная, не обязательный курс, нет связи&lt;br /&gt;
=====Поведение, при разных типах связей=====&lt;br /&gt;
Синхронизации членов групп распространяется только на текущие, приостановленные и запланированные потоки. А на завершенные и отмененные не распространяются.&lt;br /&gt;
При записи студента в поток через синхронизацию, в таблице [[Разработка:storages/cpassed | cpassed ]] устанавливается id академической группы, чтобы отслеживать связь при отчислении.&lt;br /&gt;
* Полная - при добавлении студента в группу, он добавляется и в поток, при исключении - отчисляется.&lt;br /&gt;
* Не обязательный курс - при добавлении студента в группу, он НЕ добавляется в поток, а при исключении - отчисляется.&lt;br /&gt;
* Нет связи - нет автоматических синхронизаций ни при включении в группу, ни при исключении, но поток числится связанным с группой. Все добавленные студенты из этой группы числятся индивидуалами (записанными на поток вручную по одному, не зависимо от группы).&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''get_typesync_cstreamlink($typesync)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список связей, по типу связи.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $typesync(string) - статус потока.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список связей.&lt;br /&gt;
* (bool) - false, если связи не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
#* по типу сязи находит все необходимые записи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agroup_cstreamlink($id)''' ====&lt;br /&gt;
&lt;br /&gt;
Получает список связей по академической группе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список связей.&lt;br /&gt;
* (bool) - false, если связи не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
#* по данному id находит все необходимые записи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_cstreamlink($id)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список связей по учебному процессу.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список связей .&lt;br /&gt;
* (bool) - false, если связи не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
#* по данному id находит все необходимые записи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_link_cstreamlink($agid, $csid)'''====&lt;br /&gt;
&lt;br /&gt;
Получает информацию о связи академической группы с учебным процессом или false.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $agid(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $csid(int) - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - запись из таблицы БД.&lt;br /&gt;
* (bool) - false, если связь не найдена.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
#* по данным id находит запись о связи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_type_cstreamlink($agid, $csid)'''====&lt;br /&gt;
&lt;br /&gt;
Получает тип связи связи академической группы с учебным процессом или false.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $agid(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $csid(int) - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (string) - запись со связью.&lt;br /&gt;
* (bool) - false, если запись не найдена.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
#* Из списка возможных типов связок выбирает нужную, соответствующую информации о связи, полученной по данным id.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_agroupsync()'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает массив возможных типов связок&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* (нет).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array)&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
#* Создаёт массив из записей типа: 'тип связки' =&amp;gt; 'описание'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''enrol_agroup_on_cstream($agroupid, $cstreamid, $agroupsync='full')'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает одну учебную группу на один поток&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $agroupid(int) - id группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $agroupsync(string) -  тип связи с академической группой: полная(full), не обязательный курс(norequired), нет связи(nolink). &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id новой записи в таблице cstreams&lt;br /&gt;
* (bool) - true, если такая запись уже существует, и false, если произошла ошибка.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
#* Получает все доступные виды связей академических групп с потоками.&lt;br /&gt;
#* Проверяет, является ли переданный вариант допустимым.&lt;br /&gt;
#* Если всё правильно вставляет запись с переданными данными в базу и возвращает результат.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreamlinks&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cstreamlinks.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreamlinks&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cstreamlinks.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cstreamlinks&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cstreamlinks.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpgrades&amp;diff=2017</id>
		<title>Разработка:storages/cpgrades</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpgrades&amp;diff=2017"/>
				<updated>2010-11-10T09:00:30Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cpgrades&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cpgrades'' - оценки по контрольным точкам внутри дисциплины. Контрольные точки могут быть как локальными (внутри учебной дисциплины), так и глобальными - на все учебное заведение (четверти в школе или промежуточные аттестации).&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* cpassedid - подписка на дисциплину в таблице [[Разработка:storages/cpassed | cpassed ]] (связь с personid студента осуществляется через id подписки)&lt;br /&gt;
* planid - контрольная точка или тема в плане (таблица [[Разработка:storages/plans | plans ]]), за которую получена оценка&lt;br /&gt;
* grade - полученная оценка&lt;br /&gt;
* date - дата получения оценки&lt;br /&gt;
* notice - комментарий преподавателя к отметке (виден студенту и родителям)&lt;br /&gt;
* typesync - тип синхронизации (выставление вручную, синхронизация с moodle)&lt;br /&gt;
* mdlinstance - id задания в moodle, с которым выполнялась синхронизация&lt;br /&gt;
* orderid - id приказа в таблице [[Разработка:storages/orders | orders ]], в соответствии с которым была выставлена эта оценка&lt;br /&gt;
* teacherid - id сотрудника по справочнику [[Разработка:storages/persons | persons ]], вручную (если не синхронизация) выставившего отметку&lt;br /&gt;
* status - статус оценки (черновик (tmp), поставлена (put), удалена (delete) )&lt;br /&gt;
&lt;br /&gt;
====Комментарии====&lt;br /&gt;
* История оценок выставляется в эту же таблицу, старые оценки не удаляются, актуальной считается одна, самая последняя по дате&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''save_grade_student($obj)'''====&lt;br /&gt;
&lt;br /&gt;
Сохраняет отметку студента. (в перспективе, когда будет реализован справочник с историей изменения отметок - вызов функции протоколирования)&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $obj(object) - запись в таблицу БД.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) id вставленной записи, если запись вставляется.&lt;br /&gt;
* (bool) - true, если запись обновляется и false, если операции не удались.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим запись в таблице БД по данным из обьекта:&lt;br /&gt;
#* если запись была найдена и ее статус при этом является черновым, мы ее обновляем и возвращаем результат.&lt;br /&gt;
#* если не найдена или статус не черновой - запысываем в таблицу БД и возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''save_grade_students($obj)'''====&lt;br /&gt;
&lt;br /&gt;
Cохраняет отметки всех студентов.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $obj(object) - запись в таблицу БД (объект, в котором имеются свойства date(дата), planid(id плана), teacherid(id учителя) и grades - массив записей, где ключ - id персоны, значения - оценка, подписка на учибный процесс и статус оценки).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true, если все записи успешно обновильсь/вставились, и false, во всех остальных случаях.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# обновляем/вставляем все записи в БД.&lt;br /&gt;
#* перебираем исходный массив из данных объекта.&lt;br /&gt;
#* формируем объект для обновления/вставки в БД.&lt;br /&gt;
#* обновляем/вставляем объект в таблицу БД.&lt;br /&gt;
# возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_grade_student_cpassed($cpid, $plid)'''====&lt;br /&gt;
&lt;br /&gt;
Получает последнюю по дате оценку студента по id-подписки и id контрольной точки&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $cpid(int) - id подписки в таблице [[Разработка:storages/cpassed | cpassed ]].&lt;br /&gt;
* $plid(int) - id контрольной точки в таблице [[Разработка:storages/plans | plans ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) запись из таблицы БД - последняя по дате оценка студента.&lt;br /&gt;
* (bool) - false, если ни одной оценки не найдено.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим все оценки студента отсортированных по дате в порядке убывания.&lt;br /&gt;
# возвращаем первую стоящюю в списке оценку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_grade_student($stid, $csid, $plid)'''====&lt;br /&gt;
&lt;br /&gt;
Получает последнюю по дате оценку студента по id студента, id учебного потока и id контрольной точки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $cpid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $plid(int) - id контрольной точки в таблице [[Разработка:storages/plans | plans ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) запись из таблицы БД - последняя по дате оценка студента.&lt;br /&gt;
* (bool) - false, если ни одной оценки не найдено.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# по id учебного потока и id студента находим подписку студента на учебный поток.&lt;br /&gt;
# по id подписка и id контрольной точки находим последнюю по дате оценку студента.&lt;br /&gt;
# возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_all_grade_student($cpid)'''====&lt;br /&gt;
&lt;br /&gt;
Получает все оценки одного студента по подписке на дисциплину вместе с информацией из плана.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $cpid(int) - id подписки на дисциплину в таблице [[Разработка:storages/cpassed | cpassed ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список оценок вместе c планом. &lt;br /&gt;
* (bool) - false, если ни одной оценки не найдено.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим все оценки студента по подписке.&lt;br /&gt;
# создаем массив оценок вместе с информацией из плана.&lt;br /&gt;
#* создаем новый объек со свойствами:&lt;br /&gt;
#** grade - оценка студента&lt;br /&gt;
#** plan - контрольная точка (информация из учебного плана, таблица [[Разработка:storages/plans | plans ]])&lt;br /&gt;
#* записываем объект в массив&lt;br /&gt;
# возвращаем созданный массив&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить историю изменения оценок по id подписки и id контрольной точки&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpgrades&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cpgrades.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpgrades&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cpgrades.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpgrades&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cpgrades.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpgrades&amp;diff=2005</id>
		<title>Разработка:storages/cpgrades</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpgrades&amp;diff=2005"/>
				<updated>2010-11-09T12:59:10Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cpgrades&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cpgrades'' - оценки по контрольным точкам внутри дисциплины. Контрольные точки могут быть как локальными (внутри учебной дисциплины), так и глобальными - на все учебное заведение (четверти в школе или промежуточные аттестации).&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* cpassedid - подписка на дисциплину в таблице [[Разработка:storages/cpassed | cpassed ]] (связь с personid студента осуществляется через id подписки)&lt;br /&gt;
* planid - контрольная точка или тема в плане (таблица [[Разработка:storages/plans | plans ]]), за которую получена оценка&lt;br /&gt;
* grade - полученная оценка&lt;br /&gt;
* date - дата получения оценки&lt;br /&gt;
* notice - комментарий преподавателя к отметке (виден студенту и родителям)&lt;br /&gt;
* typesync - тип синхронизации (выставление вручную, синхронизация с moodle)&lt;br /&gt;
* mdlinstance - id задания в moodle, с которым выполнялась синхронизация&lt;br /&gt;
* orderid - id приказа в таблице [[Разработка:storages/orders | orders ]], в соответствии с которым была выставлена эта оценка&lt;br /&gt;
* teacherid - id сотрудника по справочнику [[Разработка:storages/persons | persons ]], вручную (если не синхронизация) выставившего отметку&lt;br /&gt;
* status - статус оценки (черновик (tmp), поставлена (put), удалена (delete) )&lt;br /&gt;
&lt;br /&gt;
====Комментарии====&lt;br /&gt;
* История оценок выставляется в эту же таблицу, старые оценки не удаляются, актуальной считается одна, самая последняя по дате&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''save_grade_student($obj)'''====&lt;br /&gt;
&lt;br /&gt;
Сохраняет отметку студента. (в перспективе, когда будет реализован справочник с историей изменения отметок - вызов функции протоколирования)&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $obj(object) - запись в таблицу БД.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) id вставленной записи, если запись вставляется.&lt;br /&gt;
* (bool) - true, если запись обновляется и false, если операции не удались.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим запись в таблице БД по данным из обьекта:&lt;br /&gt;
#* если запись была найдена и ее статус при этом является черновым, мы ее обновляем и возвращаем результат.&lt;br /&gt;
#* если не найдена или статус не черновой - запысываем в таблицу БД и возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''save_grade_students($obj)'''====&lt;br /&gt;
&lt;br /&gt;
Cохраняет отметки всех студентов.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $obj(object) - запись в таблицу БД (объект, в котором имеются свойства date(дата), planid(id плана), teacherid(id учителя) и grades - массив записей, где ключ - id персоны, значения - оценка, подписка на учибный процесс и статус оценки).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true, если все записи успешно обновильсь/вставились, и false, во всех остальных случаях.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# обновляем/вставляем все записи в БД.&lt;br /&gt;
#* перебираем исходный массив из данных объекта.&lt;br /&gt;
#* формируем объект для обновления/вставки в БД.&lt;br /&gt;
#* обновляем/вставляем объект в таблицу БД.&lt;br /&gt;
# возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_grade_student_cpassed($cpid, $plid)'''====&lt;br /&gt;
&lt;br /&gt;
Получает последнюю по дате оценку студента по id-подписки и id контрольной точки&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $cpid(int) - id подписки в таблице [[Разработка:storages/cpassed | cpassed ]].&lt;br /&gt;
* $plid(int) - id контрольной точки в таблице [[Разработка:storages/plans | plans ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) запись из таблицы БД - последняя по дате оценка студента.&lt;br /&gt;
* (bool) - false, если ни одной оценки не найдено.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим все оценки студента отсортированных по дате в порядке убывания.&lt;br /&gt;
# возвращаем первую стоящюю в списке оценку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_grade_student($stid, $csid, $plid)'''====&lt;br /&gt;
&lt;br /&gt;
Получает последнюю по дате оценку студента по id студента, id учебного потока и id контрольной точки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $cpid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $plid(int) - id контрольной точки в таблице [[Разработка:storages/plans | plans ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) запись из таблицы БД - последняя по дате оценка студента.&lt;br /&gt;
* (bool) - false, если ни одной оценки не найдено.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# по id учебного потока и id студента находим подписку студента на учебный поток.&lt;br /&gt;
# по id подписка и id контрольной точки находим последнюю по дате оценку студента.&lt;br /&gt;
# возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
=====''get_all_grade_student($cpid)'''====&lt;br /&gt;
&lt;br /&gt;
Получает все оценки одного студента по подписке на дисциплину вместе с информацией из плана.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $cpid(int) - id подписки на дисциплину в таблице [[Разработка:storages/cpassed | cpassed ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список оценок вместе c планом. &lt;br /&gt;
* (bool) - false, если ни одной оценки не найдено.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# находим все оценки студента по подписке.&lt;br /&gt;
# создаем массив оценок вместе с информацией из плана.&lt;br /&gt;
#* создаем новый объек со свойствами:&lt;br /&gt;
#** grade - оценка студента&lt;br /&gt;
#** plan - контрольная точка (информация из учебного плана, таблица [[Разработка:storages/plans | plans ]])&lt;br /&gt;
#* записываем объект в массив&lt;br /&gt;
# возвращаем созданный массив&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Получить историю изменения оценок по id подписки и id контрольной точки&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpgrades&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cpgrades.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpgrades&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cpgrades.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpgrades&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cpgrades.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=2003</id>
		<title>Разработка:storages/cpassed</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=2003"/>
				<updated>2010-11-09T12:47:42Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cpassed&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cpassed'' - изучаемые и пройденные курсы: отражает ход изучения учащимися выбранной учебной программы, итоговые отметки.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* cstreamid - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]], по которому велось обучение.&lt;br /&gt;
* programmsbcid - id подписки контракта в таблице [[Разработка:storages/contracts | contracts ]] на программу обучения.&lt;br /&gt;
* programmitemid - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* studentid - id слушателя по таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* agroupid - id академической группы в таблице [[Разработка:storages/agroups | agroups ]]. Не обязательное поле (для заполнения). По умолчанию NULL. При зачислении и отчислении из группы изменяется его значение автоматически. При отчислении из группы поле становится равным нулю (0). При индивидуальном обучении - NULL. На основании этого принимается решение подписке/отписке на предмет. &lt;br /&gt;
* grade - итоговая отметка по курсу.&lt;br /&gt;
* gradelevel - уровень оценки (оценка не идет в кондуит, дисциплина, курсовая работа, практика, междисциплинарный экзамин, дипломная работа). Берется из [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* credit - количество кредитов, полученное за прохождение дисциплины.&lt;br /&gt;
* notice - текстовое пояснение об источнике оценки при перезачете.&lt;br /&gt;
* repeatid - id предыдущей подписки на дисциплину, если обучение выполняется повторно (пересдача или повторное обучение - при этом подписка, на которую выполняется ссылка должна иметь статус &amp;quot;пересдан&amp;quot;). Пересдачей может считаться только пересдача дисциплины, пройденной в рамках этой же подписки на учебную программу. Если было несколько пересдач данной дисциплины в данной учебной программе, то все они ссылаются на один и тот же исходный cpassedid.&lt;br /&gt;
* typesync - тип синхронизации (выставление вручную, синхронизация с moodle).&lt;br /&gt;
* mdlinstance - id задания в moodle, с которым выполнялась синхронизация.&lt;br /&gt;
* teacherid - id сотрудника по справочнику [[Разработка:storages/persons | persons ]], вручную выставившего итоговую отметку.&lt;br /&gt;
* ageid - id периода в таблице [[Разработка:storages/ages | ages ]] по которому велось обучение.&lt;br /&gt;
* orderid - id приказа в таблице [[Разработка:storages/orders | orders ]], согласно которому была выставлена оценка.&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов [[Разработка:workflows/cpassed | cpassed ]].&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_students($csid, $status = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок студентов, приписаных к одному предмето-потоку.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $csid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток.&lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус не указывается или указывается как null - подписки с любым статусом.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_agroup($cstreamid, $agroupid, $status = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получаеть список всех подписок студентов к указанному учебному потоку или только подписок с указанным статусом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $agroupid(int) - id академической группы в таблице [[Разработка:storages/cstreams | agroups ]].&lt;br /&gt;
* $status(string) - статус учебной дисциплины. по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из таблица.&lt;br /&gt;
* (bool) - false, если записи не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpasseds_student($stid, $status = 'active')'''====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок для слушателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток. &lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpassed_programm($stid, $prid, $status = 'complete')'''====&lt;br /&gt;
&lt;br /&gt;
Получает список дисциплин, изученных слушателем в рамках учебной программы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - 'complete'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток. &lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpasseds_programmitem($stid, $prid, $status = 'complete', $levelgrade = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает подписки на дисциплину по id слушателя и id дисциплины.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - название статуса подписки, по умолчанию - 'complete'&lt;br /&gt;
* $levelgrade(string) - уровень оценки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив подписок на дисциплину.&lt;br /&gt;
* (bool) false если подписка не найдена или слушатель ее еще не изучил.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается уровень оценки - подписки с указанным уровнем оценки,&lt;br /&gt;
** если уровень оценки не указывается или указывается как null - подписки с любым уровнем оценки.&lt;br /&gt;
** если указывается статус - подписки с указанным статусом, если статус не указан, то возвращаются подписки со статусом 'complete'&lt;br /&gt;
** если статус указан как null или false, то вернутся подписки с любым статусом&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''insert_grade_reoffset($stid, $prid, $cpid, $grade, $status, $comment, $initialid)'''====&lt;br /&gt;
&lt;br /&gt;
Добавляет оценку в режиме &amp;quot;перезачета&amp;quot;.(в перспективе, когда будет реализован справочник с историей изменения отметок - вызов функции протоколирования).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id дисциплины в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $cpid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $grade(int) - итоговая оценка.&lt;br /&gt;
* $comment(string) - коментарий.&lt;br /&gt;
* $status(string) - статус - перезачет(reoffset) или пересдача(repeating).&lt;br /&gt;
* $initialid(int) - id исходной подписки.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) id добавленной записи.&lt;br /&gt;
* (bool) false если добавление не удалось.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если дисиплина пересдается (статус = repeating), статус исходной подписки меняем на пересдан и обновляем запись в БД.&lt;br /&gt;
# формируем новый объект в БД.&lt;br /&gt;
# вставляем сформированную запись в таблицу БД.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_listing($limitfrom, $limitnum, $conds=null, $countonly=false)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных потоков по заданным критериям.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $limitfrom - начиная с какой записи просматривается фрагмент списка записей.&lt;br /&gt;
* $limitnum - сколько записей нужно извлечь из базы.&lt;br /&gt;
* $conds - объект со списком свойств, по которым будет происходить поиск.&lt;br /&gt;
* $countonly - Если указано true, то функция вернет только количество записей, соответствующих переданным условиям. По умолчанию - false.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из базы.&lt;br /&gt;
* (int) - количество записей, если $countonly=true.&lt;br /&gt;
* (bool) - false, в случае ошибки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# составляем запрос по переданным параметрам при помощи собственной protected-функции get_select_listing()&lt;br /&gt;
# Проверяем условие $countonly. Если оно истинно - то возвращаем только количество записей&lt;br /&gt;
# Если ложно - то возвращаем список записей&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_student_one_cpassed($studentid, $cstreamid)'''====&lt;br /&gt;
&lt;br /&gt;
Отписывает заданного студента от заданного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $studentid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_agroups_from_cstream($cstreamid)'''====&lt;br /&gt;
&lt;br /&gt;
Удаляет всех &amp;quot;лишних&amp;quot; подписок из потока, которые были записаны в составе группы, связи с которой сейчас нет.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
unsign_student_all_cpassed($studentid, $programmsbcid)&lt;br /&gt;
&lt;br /&gt;
Отписывает студента от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $studentid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $programmsbcid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_students_all_cpassed($students)'''====&lt;br /&gt;
&lt;br /&gt;
Отписывает нескольких студентов от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $students(array) - массив (id подписки на программу студента в таблице [[Разработка:storages/programmsbcs | programmsbcs ]]=&amp;gt;id студента в таблице [[Разработка:storages/persons | persons ]]).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_students_without_agroup()'''====&lt;br /&gt;
&lt;br /&gt;
Получить список всех подписок, которые не принадлежат ни к одной группе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array)&lt;br /&gt;
* (bool) - false, если ничего не нашлось.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Возвращаются все записи таблицы cpassed, имеющие статус plan или active в которых поле agroupid равно: &lt;br /&gt;
** NULL (null-значение)&lt;br /&gt;
** &amp;quot;&amp;quot; (пустой строке) &lt;br /&gt;
** 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_students_without_agroup()'''====&lt;br /&gt;
&lt;br /&gt;
Отписать всех учеников, не имеющих подписки ни на одну группу&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если изменение всех статусов прошло нормально или false, если в процессе работы произошли ошибки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Для получения списка подписок, не имеющих связи с группой вызывается функция get_students_without_agroup()&lt;br /&gt;
** Если таких подписок нет - возвращается true&lt;br /&gt;
** Если подписки есть - то в цикле выставляем каждой записи статус &amp;quot;canceled&amp;quot; (через обращение к плагину workflow)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
is_already_enroled($studentid, $cstreamid, $status = null)&lt;br /&gt;
&lt;br /&gt;
Проверяет, подписан ли уже этот ученик на переданный поток из поиска исключаются записи с переданным статусом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $studentid(int) - id ученика в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $status(string) - код статуса&lt;br /&gt;
* $status(array) - массив статусов, или null, если их нет, по умолчанию - null. &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id записи если такая запись уже есть.&lt;br /&gt;
* (bool) - false, если ученик еще не подписан.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
===='''sign_student_on_cstream($cstreamid, $programmsbcid)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает одного ученика на один учебный поток. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $programmsbcid(int) - id подписки студента на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id записи если подписка произошла успешно (или уже существует).&lt;br /&gt;
* (bool) - false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''sign_student_on_all_cstreams($programmsbcid, $ageid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Подписыает студента на все потоки программы по данному периоду &lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmsbcid(int) - id подписку студента на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $ageid(int) - id текущего периода в таблице [[Разработка:storages/ages | ages ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если ученик успешно подписан на потоки, или потоков в программе посто нет и false, в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''sign_all_agroups_on_all_cstreams($programmid, $ageid)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает все группы на потоки программы по данному периоду&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmid(int) - id программы, на которую создаем подписки на предмет в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $ageid(int) - id текущего периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции прошли успешно и false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''sign_agroup_on_all_cstreams($agroupid, $programmid, $ageid)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает одну академическую группу на все потоки указанной программы в переданом периоде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $agroupid(int) - id учебной группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $programmid(int) - id учебной программы в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $ageid(int) - id периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции прошли успешно, и false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_students_without_real_agroup($cstreamlink)'''====&lt;br /&gt;
&lt;br /&gt;
Отменяет подписки учеников, у которых группа, указанная в подписке на программу ([[Разработка:storages/programmsbcs | programmsbcs ]]), не совпадает с группой, указанной в таблице связей учебных потоков с группами ([[Разработка:storages/cstreamlinks | cstreamlinks ]]).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (object)$cstreamlink - объект в таблице [[Разработка:storages/cstreamlinks | cstreamlinks ]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции завершились успешно и false, в случае возникновения ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''syncronize_agroups_with_cstream($cstreamid)'''====&lt;br /&gt;
&lt;br /&gt;
Синхронизирует все группы, связанные с данным потоком.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции завершились успешно и false, в случае возникновения ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''syncronize_agroup_with_cstreams($agroupid)'''====&lt;br /&gt;
&lt;br /&gt;
Синхронизирует группу, со связанными с нею потоками.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $agroupid(int) - id группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции завершились успешно и false, в случае возникновения ошибок.&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
===='''set_final_grade($cpassedid, $grade = null, $orderid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Выставляет итоговую оценку, и в зависимости от нее перевести подписку в новый статус.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cpassedid(int) - id подписки.&lt;br /&gt;
* $grade(string) - выставляемая итоговая оценка, если не указана, то подписка автоматически переходит в статус неуспешно завершен, по умолчанию - null.&lt;br /&gt;
* $orderid(int) - id приказа в таблице [[Разработка:storages/orders | orders ]], на основании которого происходит выставление оценки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все прошло успешно и false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_last_successor($cpassedid)'''====&lt;br /&gt;
&lt;br /&gt;
Находит последнего наследника данной подписки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cpassedid(int) - id подписки.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id последнего наследника подписки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpassed_on_programmsbcid($id, $status = 'active')'''====&lt;br /&gt;
&lt;br /&gt;
Получает информацию о подписках на дисциплину по подписке на программу.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $id(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $status(string) - статус подписок, информацию о которых требуется найти, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив с информацией о подписках на дисциплину.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает одному студенту подписку на все потоки программы (sign_student_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает нескольким студентам подписку на все потоки программы (sign_agroup_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает всем студентам группы подписку на все потоки рограммы (sign_all_agroups_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|programmsbcs]]&lt;br /&gt;
 |changeagroup&lt;br /&gt;
 |Массив, содержащий:&lt;br /&gt;
* в поле 'oldagroup' id старой группы&lt;br /&gt;
* в поле 'newagroup' id новой группы&lt;br /&gt;
* в поле 'programmsbc' объект из таблицы programmsbcs&lt;br /&gt;
''Пример:'' array('oldagroup' =&amp;gt; $oldid, 'newagroup' =&amp;gt; $newid, 'programmsbc' =&amp;gt; $object)&lt;br /&gt;
 |Обрабатывается событие изменения группы, вызывается функция [[#change_group()|change_group()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию выполняется синхронизация подписок группы при помощи функции [[#syncronize_agroup_with_cstream()|syncronize_agroup_with_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию удаляются подписки при помощи функции [[#unsign_agroups_from_cstream()|unsign_agroups_from_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/cstreams|cstreams]]&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |&lt;br /&gt;
 |При изменении статуса учебного потока изменяет статус всех подписок на этот поток, через обращение к [[Разработка:workflows/cpassed|workflows/cpassed]].&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cpassed.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=2002</id>
		<title>Разработка:storages/cpassed</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=2002"/>
				<updated>2010-11-09T11:55:38Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cpassed&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cpassed'' - изучаемые и пройденные курсы: отражает ход изучения учащимися выбранной учебной программы, итоговые отметки.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* cstreamid - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]], по которому велось обучение.&lt;br /&gt;
* programmsbcid - id подписки контракта в таблице [[Разработка:storages/contracts | contracts ]] на программу обучения.&lt;br /&gt;
* programmitemid - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* studentid - id слушателя по таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* agroupid - id академической группы в таблице [[Разработка:storages/agroups | agroups ]]. Не обязательное поле (для заполнения). По умолчанию NULL. При зачислении и отчислении из группы изменяется его значение автоматически. При отчислении из группы поле становится равным нулю (0). При индивидуальном обучении - NULL. На основании этого принимается решение подписке/отписке на предмет. &lt;br /&gt;
* grade - итоговая отметка по курсу.&lt;br /&gt;
* gradelevel - уровень оценки (оценка не идет в кондуит, дисциплина, курсовая работа, практика, междисциплинарный экзамин, дипломная работа). Берется из [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* credit - количество кредитов, полученное за прохождение дисциплины.&lt;br /&gt;
* notice - текстовое пояснение об источнике оценки при перезачете.&lt;br /&gt;
* repeatid - id предыдущей подписки на дисциплину, если обучение выполняется повторно (пересдача или повторное обучение - при этом подписка, на которую выполняется ссылка должна иметь статус &amp;quot;пересдан&amp;quot;). Пересдачей может считаться только пересдача дисциплины, пройденной в рамках этой же подписки на учебную программу. Если было несколько пересдач данной дисциплины в данной учебной программе, то все они ссылаются на один и тот же исходный cpassedid.&lt;br /&gt;
* typesync - тип синхронизации (выставление вручную, синхронизация с moodle).&lt;br /&gt;
* mdlinstance - id задания в moodle, с которым выполнялась синхронизация.&lt;br /&gt;
* teacherid - id сотрудника по справочнику [[Разработка:storages/persons | persons ]], вручную выставившего итоговую отметку.&lt;br /&gt;
* ageid - id периода в таблице [[Разработка:storages/ages | ages ]] по которому велось обучение.&lt;br /&gt;
* orderid - id приказа в таблице [[Разработка:storages/orders | orders ]], согласно которому была выставлена оценка.&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов [[Разработка:workflows/cpassed | cpassed ]].&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_students($csid, $status = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок студентов, приписаных к одному предмето-потоку.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $csid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток.&lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус не указывается или указывается как null - подписки с любым статусом.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_agroup($cstreamid, $agroupid, $status = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получаеть список всех подписок студентов к указанному учебному потоку или только подписок с указанным статусом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $agroupid(int) - id академической группы в таблице [[Разработка:storages/cstreams | agroups ]].&lt;br /&gt;
* $status(string) - статус учебной дисциплины. по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из таблица.&lt;br /&gt;
* (bool) - false, если записи не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpasseds_student($stid, $status = 'active')'''====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок для слушателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток. &lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpassed_programm($stid, $prid, $status = 'complete')'''====&lt;br /&gt;
&lt;br /&gt;
Получает список дисциплин, изученных слушателем в рамках учебной программы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - 'complete'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток. &lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpasseds_programmitem($stid, $prid, $status = 'complete', $levelgrade = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает подписки на дисциплину по id слушателя и id дисциплины.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - название статуса подписки, по умолчанию - 'complete'&lt;br /&gt;
* $levelgrade(string) - уровень оценки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив подписок на дисциплину.&lt;br /&gt;
* (bool) false если подписка не найдена или слушатель ее еще не изучил.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается уровень оценки - подписки с указанным уровнем оценки,&lt;br /&gt;
** если уровень оценки не указывается или указывается как null - подписки с любым уровнем оценки.&lt;br /&gt;
** если указывается статус - подписки с указанным статусом, если статус не указан, то возвращаются подписки со статусом 'complete'&lt;br /&gt;
** если статус указан как null или false, то вернутся подписки с любым статусом&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''insert_grade_reoffset($stid, $prid, $cpid, $grade, $status, $comment, $initialid)'''====&lt;br /&gt;
&lt;br /&gt;
Добавляет оценку в режиме &amp;quot;перезачета&amp;quot;.(в перспективе, когда будет реализован справочник с историей изменения отметок - вызов функции протоколирования).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id дисциплины в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $cpid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $grade(int) - итоговая оценка.&lt;br /&gt;
* $comment(string) - коментарий.&lt;br /&gt;
* $status(string) - статус - перезачет(reoffset) или пересдача(repeating).&lt;br /&gt;
* $initialid(int) - id исходной подписки.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) id добавленной записи.&lt;br /&gt;
* (bool) false если добавление не удалось.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если дисиплина пересдается (статус = repeating), статус исходной подписки меняем на пересдан и обновляем запись в БД.&lt;br /&gt;
# формируем новый объект в БД.&lt;br /&gt;
# вставляем сформированную запись в таблицу БД.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_listing($limitfrom, $limitnum, $conds=null, $countonly=false)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных потоков по заданным критериям.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $limitfrom - начиная с какой записи просматривается фрагмент списка записей.&lt;br /&gt;
* $limitnum - сколько записей нужно извлечь из базы.&lt;br /&gt;
* $conds - объект со списком свойств, по которым будет происходить поиск.&lt;br /&gt;
* $countonly - Если указано true, то функция вернет только количество записей, соответствующих переданным условиям. По умолчанию - false.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из базы.&lt;br /&gt;
* (int) - количество записей, если $countonly=true.&lt;br /&gt;
* (bool) - false, в случае ошибки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# составляем запрос по переданным параметрам при помощи собственной protected-функции get_select_listing()&lt;br /&gt;
# Проверяем условие $countonly. Если оно истинно - то возвращаем только количество записей&lt;br /&gt;
# Если ложно - то возвращаем список записей&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_student_one_cpassed($studentid, $cstreamid)'''====&lt;br /&gt;
&lt;br /&gt;
Отписывает заданного студента от заданного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $studentid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_agroups_from_cstream($cstreamid)'''====&lt;br /&gt;
&lt;br /&gt;
Удаляет всех &amp;quot;лишних&amp;quot; подписок из потока, которые были записаны в составе группы, связи с которой сейчас нет.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
unsign_student_all_cpassed($studentid, $programmsbcid)&lt;br /&gt;
&lt;br /&gt;
Отписывает студента от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $studentid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $programmsbcid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_students_all_cpassed($students)'''====&lt;br /&gt;
&lt;br /&gt;
Отписывает нескольких студентов от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $students(array) - массив (id подписки на программу студента в таблице [[Разработка:storages/programmsbcs | programmsbcs ]]=&amp;gt;id студента в таблице [[Разработка:storages/persons | persons ]]).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_students_without_agroup()'''====&lt;br /&gt;
&lt;br /&gt;
Получить список всех подписок, которые не принадлежат ни к одной группе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array)&lt;br /&gt;
* (bool) - false, если ничего не нашлось.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Возвращаются все записи таблицы cpassed, имеющие статус plan или active в которых поле agroupid равно: &lt;br /&gt;
** NULL (null-значение)&lt;br /&gt;
** &amp;quot;&amp;quot; (пустой строке) &lt;br /&gt;
** 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_students_without_agroup()'''====&lt;br /&gt;
&lt;br /&gt;
Отписать всех учеников, не имеющих подписки ни на одну группу&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если изменение всех статусов прошло нормально или false, если в процессе работы произошли ошибки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Для получения списка подписок, не имеющих связи с группой вызывается функция get_students_without_agroup()&lt;br /&gt;
** Если таких подписок нет - возвращается true&lt;br /&gt;
** Если подписки есть - то в цикле выставляем каждой записи статус &amp;quot;canceled&amp;quot; (через обращение к плагину workflow)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
is_already_enroled($studentid, $cstreamid, $status = null)&lt;br /&gt;
&lt;br /&gt;
Проверяет, подписан ли уже этот ученик на переданный поток из поиска исключаются записи с переданным статусом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $studentid(int) - id ученика в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $status(string) - код статуса&lt;br /&gt;
* $status(array) - массив статусов, или null, если их нет, по умолчанию - null. &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id записи если такая запись уже есть.&lt;br /&gt;
* (bool) - false, если ученик еще не подписан.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
===='''sign_student_on_cstream($cstreamid, $programmsbcid)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает одного ученика на один учебный поток. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $programmsbcid(int) - id подписки студента на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id записи если подписка произошла успешно (или уже существует).&lt;br /&gt;
* (bool) - false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''sign_student_on_all_cstreams($programmsbcid, $ageid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Подписыает студента на все потоки программы по данному периоду &lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmsbcid(int) - id подписку студента на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $ageid(int) - id текущего периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если ученик успешно подписан на потоки, или потоков в программе посто нет и false, в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''sign_all_agroups_on_all_cstreams($programmid, $ageid)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает все группы на потоки программы по данному периоду&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmid(int) - id программы, на которую создаем подписки на предмет в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $ageid(int) - id текущего периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции прошли успешно и false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''sign_agroup_on_all_cstreams($agroupid, $programmid, $ageid)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает одну академическую группу на все потоки указанной программы в переданом периоде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $agroupid(int) - id учебной группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $programmid(int) - id учебной программы в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $ageid(int) - id периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции прошли успешно, и false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_students_without_real_agroup($cstreamlink)'''====&lt;br /&gt;
&lt;br /&gt;
Отменяет подписки учеников, у которых группа, указанная в подписке на программу ([[Разработка:storages/programmsbcs | programmsbcs ]]), не совпадает с группой, указанной в таблице связей учебных потоков с группами ([[Разработка:storages/cstreamlinks | cstreamlinks ]]).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (object)$cstreamlink - объект в таблице [[Разработка:storages/cstreamlinks | cstreamlinks ]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции завершились успешно и false, в случае возникновения ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''syncronize_agroups_with_cstream($cstreamid)'''====&lt;br /&gt;
&lt;br /&gt;
Синхронизирует все группы, связанные с данным потоком.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции завершились успешно и false, в случае возникновения ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''syncronize_agroup_with_cstreams($agroupid)'''====&lt;br /&gt;
&lt;br /&gt;
Синхронизирует группу, со связанными с нею потоками.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $agroupid(int) - id группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции завершились успешно и false, в случае возникновения ошибок.&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
===='''set_final_grade($cpassedid, $grade = null, $orderid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Выставляет итоговую оценку, и в зависимости от нее перевести подписку в новый статус.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cpassedid(int) - id подписки.&lt;br /&gt;
* $grade(string) - выставляемая итоговая оценка, если не указана, то подписка автоматически переходит в статус неуспешно завершен, по умолчанию - null.&lt;br /&gt;
* $orderid(int) - id приказа в таблице [[Разработка:storages/orders | orders ]], на основании которого происходит выставление оценки.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все прошло успешно и false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_last_successor($cpassedid)'''====&lt;br /&gt;
&lt;br /&gt;
Находит последнего наследника данной подписки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cpassedid(int) - id подписки.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id последнего наследника подписки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpassed_on_programmsbcid($id, $status = 'active')'''====&lt;br /&gt;
&lt;br /&gt;
Получает информацию о подписках на дисциплину по подписке на программу.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $id(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив с информацией о подписках на дисциплину.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает одному студенту подписку на все потоки программы (sign_student_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает нескольким студентам подписку на все потоки программы (sign_agroup_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает всем студентам группы подписку на все потоки рограммы (sign_all_agroups_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|programmsbcs]]&lt;br /&gt;
 |changeagroup&lt;br /&gt;
 |Массив, содержащий:&lt;br /&gt;
* в поле 'oldagroup' id старой группы&lt;br /&gt;
* в поле 'newagroup' id новой группы&lt;br /&gt;
* в поле 'programmsbc' объект из таблицы programmsbcs&lt;br /&gt;
''Пример:'' array('oldagroup' =&amp;gt; $oldid, 'newagroup' =&amp;gt; $newid, 'programmsbc' =&amp;gt; $object)&lt;br /&gt;
 |Обрабатывается событие изменения группы, вызывается функция [[#change_group()|change_group()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию выполняется синхронизация подписок группы при помощи функции [[#syncronize_agroup_with_cstream()|syncronize_agroup_with_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию удаляются подписки при помощи функции [[#unsign_agroups_from_cstream()|unsign_agroups_from_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/cstreams|cstreams]]&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |&lt;br /&gt;
 |При изменении статуса учебного потока изменяет статус всех подписок на этот поток, через обращение к [[Разработка:workflows/cpassed|workflows/cpassed]].&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cpassed.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=1986</id>
		<title>Разработка:storages/cpassed</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=1986"/>
				<updated>2010-11-09T10:29:26Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cpassed&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cpassed'' - изучаемые и пройденные курсы: отражает ход изучения учащимися выбранной учебной программы, итоговые отметки.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* cstreamid - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]], по которому велось обучение.&lt;br /&gt;
* programmsbcid - id подписки контракта в таблице [[Разработка:storages/contracts | contracts ]] на программу обучения.&lt;br /&gt;
* programmitemid - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* studentid - id слушателя по таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* agroupid - id академической группы в таблице [[Разработка:storages/agroups | agroups ]]. Не обязательное поле (для заполнения). По умолчанию NULL. При зачислении и отчислении из группы изменяется его значение автоматически. При отчислении из группы поле становится равным нулю (0). При индивидуальном обучении - NULL. На основании этого принимается решение подписке/отписке на предмет. &lt;br /&gt;
* grade - итоговая отметка по курсу.&lt;br /&gt;
* gradelevel - уровень оценки (оценка не идет в кондуит, дисциплина, курсовая работа, практика, междисциплинарный экзамин, дипломная работа). Берется из [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* credit - количество кредитов, полученное за прохождение дисциплины.&lt;br /&gt;
* notice - текстовое пояснение об источнике оценки при перезачете.&lt;br /&gt;
* repeatid - id предыдущей подписки на дисциплину, если обучение выполняется повторно (пересдача или повторное обучение - при этом подписка, на которую выполняется ссылка должна иметь статус &amp;quot;пересдан&amp;quot;). Пересдачей может считаться только пересдача дисциплины, пройденной в рамках этой же подписки на учебную программу. Если было несколько пересдач данной дисциплины в данной учебной программе, то все они ссылаются на один и тот же исходный cpassedid.&lt;br /&gt;
* typesync - тип синхронизации (выставление вручную, синхронизация с moodle).&lt;br /&gt;
* mdlinstance - id задания в moodle, с которым выполнялась синхронизация.&lt;br /&gt;
* teacherid - id сотрудника по справочнику [[Разработка:storages/persons | persons ]], вручную выставившего итоговую отметку.&lt;br /&gt;
* ageid - id периода в таблице [[Разработка:storages/ages | ages ]] по которому велось обучение.&lt;br /&gt;
* orderid - id приказа в таблице [[Разработка:storages/orders | orders ]], согласно которому была выставлена оценка.&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов [[Разработка:workflows/cpassed | cpassed ]].&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_students($csid, $status = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок студентов, приписаных к одному предмето-потоку.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $csid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток.&lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус не указывается или указывается как null - подписки с любым статусом.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_agroup($cstreamid, $agroupid, $status = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получаеть список всех подписок студентов к указанному учебному потоку или только подписок с указанным статусом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $agroupid(int) - id академической группы в таблице [[Разработка:storages/cstreams | agroups ]].&lt;br /&gt;
* $status(string) - статус учебной дисциплины. по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из таблица.&lt;br /&gt;
* (bool) - false, если записи не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpasseds_student($stid, $status = 'active')'''====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок для слушателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток. &lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpassed_programm($stid, $prid, $status = 'complete')'''====&lt;br /&gt;
&lt;br /&gt;
Получает список дисциплин, изученных слушателем в рамках учебной программы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - 'complete'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток. &lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpasseds_programmitem($stid, $prid, $status = 'complete', $levelgrade = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает подписки на дисциплину по id слушателя и id дисциплины.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - название статуса подписки, по умолчанию - 'complete'&lt;br /&gt;
* $levelgrade(string) - уровень оценки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив подписок на дисциплину.&lt;br /&gt;
* (bool) false если подписка не найдена или слушатель ее еще не изучил.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается уровень оценки - подписки с указанным уровнем оценки,&lt;br /&gt;
** если уровень оценки не указывается или указывается как null - подписки с любым уровнем оценки.&lt;br /&gt;
** если указывается статус - подписки с указанным статусом, если статус не указан, то возвращаются подписки со статусом 'complete'&lt;br /&gt;
** если статус указан как null или false, то вернутся подписки с любым статусом&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''insert_grade_reoffset($stid, $prid, $cpid, $grade, $status, $comment, $initialid)'''====&lt;br /&gt;
&lt;br /&gt;
Добавляет оценку в режиме &amp;quot;перезачета&amp;quot;.(в перспективе, когда будет реализован справочник с историей изменения отметок - вызов функции протоколирования).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id дисциплины в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $cpid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $grade(int) - итоговая оценка.&lt;br /&gt;
* $comment(string) - коментарий.&lt;br /&gt;
* $status(string) - статус - перезачет(reoffset) или пересдача(repeating).&lt;br /&gt;
* $initialid(int) - id исходной подписки.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) id добавленной записи.&lt;br /&gt;
* (bool) false если добавление не удалось.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если дисиплина пересдается (статус = repeating), статус исходной подписки меняем на пересдан и обновляем запись в БД.&lt;br /&gt;
# формируем новый объект в БД.&lt;br /&gt;
# вставляем сформированную запись в таблицу БД.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_listing($limitfrom, $limitnum, $conds=null, $countonly=false)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных потоков по заданным критериям.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $limitfrom - начиная с какой записи просматривается фрагмент списка записей.&lt;br /&gt;
* $limitnum - сколько записей нужно извлечь из базы.&lt;br /&gt;
* $conds - объект со списком свойств, по которым будет происходить поиск.&lt;br /&gt;
* $countonly - Если указано true, то функция вернет только количество записей, соответствующих переданным условиям. По умолчанию - false.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из базы.&lt;br /&gt;
* (int) - количество записей, если $countonly=true.&lt;br /&gt;
* (bool) - false, в случае ошибки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# составляем запрос по переданным параметрам при помощи собственной protected-функции get_select_listing()&lt;br /&gt;
# Проверяем условие $countonly. Если оно истинно - то возвращаем только количество записей&lt;br /&gt;
# Если ложно - то возвращаем список записей&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_student_one_cpassed($studentid, $cstreamid)'''====&lt;br /&gt;
&lt;br /&gt;
Отписывает заданного студента от заданного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $studentid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_agroups_from_cstream($cstreamid)'''====&lt;br /&gt;
&lt;br /&gt;
Удаляет всех &amp;quot;лишних&amp;quot; подписок из потока, которые были записаны в составе группы, связи с которой сейчас нет.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
unsign_student_all_cpassed($studentid, $programmsbcid)&lt;br /&gt;
&lt;br /&gt;
Отписывает студента от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $studentid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $programmsbcid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_students_all_cpassed($students)'''====&lt;br /&gt;
&lt;br /&gt;
Отписывает нескольких студентов от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $students(array) - массив (id подписки на программу студента в таблице [[Разработка:storages/programmsbcs | programmsbcs ]]=&amp;gt;id студента в таблице [[Разработка:storages/persons | persons ]]).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_students_without_agroup()'''====&lt;br /&gt;
&lt;br /&gt;
Получить список всех подписок, которые не принадлежат ни к одной группе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array)&lt;br /&gt;
* (bool) - false, если ничего не нашлось.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Возвращаются все записи таблицы cpassed, имеющие статус plan или active в которых поле agroupid равно: &lt;br /&gt;
** NULL (null-значение)&lt;br /&gt;
** &amp;quot;&amp;quot; (пустой строке) &lt;br /&gt;
** 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_students_without_agroup()'''====&lt;br /&gt;
&lt;br /&gt;
Отписать всех учеников, не имеющих подписки ни на одну группу&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если изменение всех статусов прошло нормально или false, если в процессе работы произошли ошибки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Для получения списка подписок, не имеющих связи с группой вызывается функция get_students_without_agroup()&lt;br /&gt;
** Если таких подписок нет - возвращается true&lt;br /&gt;
** Если подписки есть - то в цикле выставляем каждой записи статус &amp;quot;canceled&amp;quot; (через обращение к плагину workflow)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
is_already_enroled($studentid, $cstreamid, $status = null)&lt;br /&gt;
&lt;br /&gt;
Проверяет, подписан ли уже этот ученик на переданный поток из поиска исключаются записи с переданным статусом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $studentid(int) - id ученика в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $status(string) - код статуса&lt;br /&gt;
* $status(array) - массив статусов, или null, если их нет, по умолчанию - null. &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id записи если такая запись уже есть.&lt;br /&gt;
* (bool) - false, если ученик еще не подписан.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
===='''sign_student_on_cstream($cstreamid, $programmsbcid)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает одного ученика на один учебный поток. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $programmsbcid(int) - id подписки студента на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id записи если подписка произошла успешно (или уже существует).&lt;br /&gt;
* (bool) - false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''sign_student_on_all_cstreams($programmsbcid, $ageid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Подписыает студента на все потоки программы по данному периоду &lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmsbcid(int) - id подписку студента на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $ageid(int) - id текущего периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если ученик успешно подписан на потоки, или потоков в программе посто нет и false, в остальных случаях.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''sign_all_agroups_on_all_cstreams($programmid, $ageid)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает все группы на потоки программы по данному периоду&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $programmid(int) - id программы, на которую создаем подписки на предмет в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $ageid(int) - id текущего периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции прошли успешно и false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''sign_agroup_on_all_cstreams($agroupid, $programmid, $ageid)'''====&lt;br /&gt;
&lt;br /&gt;
Подписывает одну академическую группу на все потоки указанной программы в переданом периоде.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $agroupid(int) - id учебной группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
* $programmid(int) - id учебной программы в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $ageid(int) - id периода в таблице [[Разработка:storages/ages | ages ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции прошли успешно, и false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''unsign_students_without_real_agroup($cstreamlink)'''====&lt;br /&gt;
&lt;br /&gt;
Отменяет подписки учеников, у которых группа, указанная в подписке на программу ([[Разработка:storages/programmsbcs | programmsbcs ]]), не совпадает с группой, указанной в таблице связей учебных потоков с группами ([[Разработка:storages/cstreamlinks | cstreamlinks ]]).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (object)$cstreamlink - объект в таблице [[Разработка:storages/cstreamlinks | cstreamlinks ]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции завершились успешно и false, в случае возникновения ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''syncronize_agroups_with_cstream($cstreamid)'''====&lt;br /&gt;
&lt;br /&gt;
Синхронизирует все группы, связанные с данным потоком.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции завершились успешно и false, в случае возникновения ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''syncronize_agroup_with_cstreams($agroupid)'''====&lt;br /&gt;
&lt;br /&gt;
Синхронизирует группу, со связанными с нею потоками.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $agroupid(int) - id группы в таблице [[Разработка:storages/agroups | agroups ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все операции завершились успешно и false, в случае возникновения ошибок.&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
===='''set_final_grade($cpassedid, $grade = null, $orderid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Выставляет итоговую оценку, и в зависимости от нее перевести подписку в новый статус.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cpassedid(int) - id подписки.&lt;br /&gt;
* $grade(string) - выставляемая итоговая оценка, если не указана, то подписка автоматически переходит в статус неуспешно завершен, по умолчанию - null.&lt;br /&gt;
* $orderid(int) - id приказа в таблице [[Разработка:storages/orders | orders ]], на основании которого происходит выставление оценки.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если все прошло успешно и false, в случае ошибки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_last_successor($cpassedid)'''====&lt;br /&gt;
&lt;br /&gt;
Находит последнего наследника данной подписки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cpassedid(int) - id подписки.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) - id последнего наследника подписки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====unsign_student_from_one_cstream()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает одного студента от одного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $studentid - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* (int) $cstreamid - id потока в таблице [[Разработка:storages/cstreams | cstreams ]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_student_from_all_cstreams()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает одного студента от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $studentid - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* (int) $programmsbcid - id подписки студента на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_students_from_all_cstreams()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает нескольких студентов от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (array) $students - массив (id=&amp;gt;подписки на программу студента=&amp;gt;id студента)&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====set_final_grade()=====&lt;br /&gt;
&lt;br /&gt;
Выставляет итоговую оценку по  предмету, переводя подписку в нужный статус, в зависимости от переданной оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cpassedid - id подписки на дисциплину&lt;br /&gt;
* $grade - выставляемая итоговая оценка&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
===== change_group() =====&lt;br /&gt;
Синхронизирует ученика с потоками при смене группы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $oldagroupid - id старой группы студента&lt;br /&gt;
* $newagroupid - id новой группы студента&lt;br /&gt;
* $programmsbcid - id подписки на программу&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===== syncronize_agroup_with_cstream() =====&lt;br /&gt;
Синхронизировать учебную группу с потоком, проверим и обновив все подписки&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
*  $cstreamlinkid - id записи в таблице [[Разработка:storages/cstreamlinks|cstreamlinks]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===== unsign_agroups_from_cstream() =====&lt;br /&gt;
Удаление всех &amp;quot;лишних&amp;quot; подписок из потока, которые были записаны в составе группы, связи с которой сейчас нет&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid - id записи в таблице cstreams&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает одному студенту подписку на все потоки программы (sign_student_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает нескольким студентам подписку на все потоки программы (sign_agroup_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает всем студентам группы подписку на все потоки рограммы (sign_all_agroups_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|programmsbcs]]&lt;br /&gt;
 |changeagroup&lt;br /&gt;
 |Массив, содержащий:&lt;br /&gt;
* в поле 'oldagroup' id старой группы&lt;br /&gt;
* в поле 'newagroup' id новой группы&lt;br /&gt;
* в поле 'programmsbc' объект из таблицы programmsbcs&lt;br /&gt;
''Пример:'' array('oldagroup' =&amp;gt; $oldid, 'newagroup' =&amp;gt; $newid, 'programmsbc' =&amp;gt; $object)&lt;br /&gt;
 |Обрабатывается событие изменения группы, вызывается функция [[#change_group()|change_group()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию выполняется синхронизация подписок группы при помощи функции [[#syncronize_agroup_with_cstream()|syncronize_agroup_with_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию удаляются подписки при помощи функции [[#unsign_agroups_from_cstream()|unsign_agroups_from_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/cstreams|cstreams]]&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |&lt;br /&gt;
 |При изменении статуса учебного потока изменяет статус всех подписок на этот поток, через обращение к [[Разработка:workflows/cpassed|workflows/cpassed]].&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cpassed.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=1984</id>
		<title>Разработка:storages/cpassed</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=1984"/>
				<updated>2010-11-08T17:53:34Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cpassed&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cpassed'' - изучаемые и пройденные курсы: отражает ход изучения учащимися выбранной учебной программы, итоговые отметки.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* cstreamid - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]], по которому велось обучение.&lt;br /&gt;
* programmsbcid - id подписки контракта в таблице [[Разработка:storages/contracts | contracts ]] на программу обучения.&lt;br /&gt;
* programmitemid - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* studentid - id слушателя по таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* agroupid - id академической группы в таблице [[Разработка:storages/agroups | agroups ]]. Не обязательное поле (для заполнения). По умолчанию NULL. При зачислении и отчислении из группы изменяется его значение автоматически. При отчислении из группы поле становится равным нулю (0). При индивидуальном обучении - NULL. На основании этого принимается решение подписке/отписке на предмет. &lt;br /&gt;
* grade - итоговая отметка по курсу.&lt;br /&gt;
* gradelevel - уровень оценки (оценка не идет в кондуит, дисциплина, курсовая работа, практика, междисциплинарный экзамин, дипломная работа). Берется из [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* credit - количество кредитов, полученное за прохождение дисциплины.&lt;br /&gt;
* notice - текстовое пояснение об источнике оценки при перезачете.&lt;br /&gt;
* repeatid - id предыдущей подписки на дисциплину, если обучение выполняется повторно (пересдача или повторное обучение - при этом подписка, на которую выполняется ссылка должна иметь статус &amp;quot;пересдан&amp;quot;). Пересдачей может считаться только пересдача дисциплины, пройденной в рамках этой же подписки на учебную программу. Если было несколько пересдач данной дисциплины в данной учебной программе, то все они ссылаются на один и тот же исходный cpassedid.&lt;br /&gt;
* typesync - тип синхронизации (выставление вручную, синхронизация с moodle).&lt;br /&gt;
* mdlinstance - id задания в moodle, с которым выполнялась синхронизация.&lt;br /&gt;
* teacherid - id сотрудника по справочнику [[Разработка:storages/persons | persons ]], вручную выставившего итоговую отметку.&lt;br /&gt;
* ageid - id периода в таблице [[Разработка:storages/ages | ages ]] по которому велось обучение.&lt;br /&gt;
* orderid - id приказа в таблице [[Разработка:storages/orders | orders ]], согласно которому была выставлена оценка.&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов [[Разработка:workflows/cpassed | cpassed ]].&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_students($csid, $status = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок студентов, приписаных к одному предмето-потоку.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $csid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток.&lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус не указывается или указывается как null - подписки с любым статусом.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_agroup($cstreamid, $agroupid, $status = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получаеть список всех подписок студентов к указанному учебному потоку или только подписок с указанным статусом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $agroupid(int) - id академической группы в таблице [[Разработка:storages/cstreams | agroups ]].&lt;br /&gt;
* $status(string) - статус учебной дисциплины. по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из таблица.&lt;br /&gt;
* (bool) - false, если записи не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpasseds_student($stid, $status = 'active')'''====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок для слушателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток. &lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpassed_programm($stid, $prid, $status = 'complete')'''====&lt;br /&gt;
&lt;br /&gt;
Получает список дисциплин, изученных слушателем в рамках учебной программы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - 'complete'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток. &lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpasseds_programmitem($stid, $prid, $status = 'complete', $levelgrade = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает подписки на дисциплину по id слушателя и id дисциплины.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - название статуса подписки, по умолчанию - 'complete'&lt;br /&gt;
* $levelgrade(string) - уровень оценки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив подписок на дисциплину.&lt;br /&gt;
* (bool) false если подписка не найдена или слушатель ее еще не изучил.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается уровень оценки - подписки с указанным уровнем оценки,&lt;br /&gt;
** если уровень оценки не указывается или указывается как null - подписки с любым уровнем оценки.&lt;br /&gt;
** если указывается статус - подписки с указанным статусом, если статус не указан, то возвращаются подписки со статусом 'complete'&lt;br /&gt;
** если статус указан как null или false, то вернутся подписки с любым статусом&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''insert_grade_reoffset($stid, $prid, $cpid, $grade, $status, $comment, $initialid)'''====&lt;br /&gt;
&lt;br /&gt;
Добавляет оценку в режиме &amp;quot;перезачета&amp;quot;.(в перспективе, когда будет реализован справочник с историей изменения отметок - вызов функции протоколирования).&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id дисциплины в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $cpid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $grade(int) - итоговая оценка.&lt;br /&gt;
* $comment(string) - коментарий.&lt;br /&gt;
* $status(string) - статус - перезачет(reoffset) или пересдача(repeating).&lt;br /&gt;
* $initialid(int) - id исходной подписки.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) id добавленной записи.&lt;br /&gt;
* (bool) false если добавление не удалось.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если дисиплина пересдается (статус = repeating), статус исходной подписки меняем на пересдан и обновляем запись в БД.&lt;br /&gt;
# формируем новый объект в БД.&lt;br /&gt;
# вставляем сформированную запись в таблицу БД.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_listing($limitfrom, $limitnum, $conds=null, $countonly=false)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список учебных потоков по заданным критериям.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $limitfrom - начиная с какой записи просматривается фрагмент списка записей.&lt;br /&gt;
* $limitnum - сколько записей нужно извлечь из базы.&lt;br /&gt;
* $conds - объект со списком свойств, по которым будет происходить поиск.&lt;br /&gt;
* $countonly - Если указано true, то функция вернет только количество записей, соответствующих переданным условиям. По умолчанию - false.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из базы.&lt;br /&gt;
* (int) - количество записей, если $countonly=true.&lt;br /&gt;
* (bool) - false, в случае ошибки.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# составляем запрос по переданным параметрам при помощи собственной protected-функции get_select_listing()&lt;br /&gt;
# Проверяем условие $countonly. Если оно истинно - то возвращаем только количество записей&lt;br /&gt;
# Если ложно - то возвращаем список записей&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
unsign_student_one_cpassed($studentid, $cstreamid)&lt;br /&gt;
&lt;br /&gt;
Отписывает заданного студента от заданного учебного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $studentid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* (boоl) - true, в случае успеха и falsе, в остальных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====get_students_without_agroup()=====&lt;br /&gt;
&lt;br /&gt;
Получить список всех подписок, которые не принадлежат ни к одной группе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* bool|array - массив из записей таблицы cpassed или false, если ничего не нашлось&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Возвращаются все записи таблицы cpassed, имеющие статус plan или active в которых поле agroupid равно: &lt;br /&gt;
** NULL (null-значение)&lt;br /&gt;
** &amp;quot;&amp;quot; (пустой строке) &lt;br /&gt;
** 0&lt;br /&gt;
&lt;br /&gt;
=====unsign_students_without_agroup()=====&lt;br /&gt;
&lt;br /&gt;
Отписать всех учеников, не имеющих подписки ни на одну группу&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool)&lt;br /&gt;
** true  - если изменение всех статусов прошло нормально или&lt;br /&gt;
** false - если в процессе работы произошли ошибки&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Для получения списка подписок, не имеющих связи с группой вызывается функция get_students_without_agroup()&lt;br /&gt;
** Если таких подписок нет - возвращается true&lt;br /&gt;
** Если подписки есть - то в цикле выставляем каждой записи статус &amp;quot;canceled&amp;quot; (через обращение к плагину workflow)&lt;br /&gt;
&lt;br /&gt;
=====sign_student_on_cstream()=====&lt;br /&gt;
&lt;br /&gt;
Подписывает одного ученика на один учебный поток. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int)$cstreamid - id учебного потока в таблице в таблице [[Разработка:storages/cstreams | cstreams ]]&lt;br /&gt;
* (int)$programmsbcid - id подписки студента на программу в таблице в таблице [[Разработка:storages/programmsbcs | programmsbcs ]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* id записи если подписка произошла успешно (или уже существует),&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_students_without_real_agroup()=====&lt;br /&gt;
&lt;br /&gt;
Отменить подписки учеников, у которых группа, указанная в подписке на программу (programmsbcs) не совпадает с группой, указанной в таблице связей учебных потоков с группами (cstreamlinks)&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (object)$cstreamlink - объект из таблицы в таблице [[Разработка:storages/cstreamlinks | cstreamlinks ]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_student_from_one_cstream()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает одного студента от одного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $studentid - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* (int) $cstreamid - id потока в таблице [[Разработка:storages/cstreams | cstreams ]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_student_from_all_cstreams()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает одного студента от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $studentid - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* (int) $programmsbcid - id подписки студента на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_students_from_all_cstreams()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает нескольких студентов от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (array) $students - массив (id=&amp;gt;подписки на программу студента=&amp;gt;id студента)&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====set_final_grade()=====&lt;br /&gt;
&lt;br /&gt;
Выставляет итоговую оценку по  предмету, переводя подписку в нужный статус, в зависимости от переданной оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cpassedid - id подписки на дисциплину&lt;br /&gt;
* $grade - выставляемая итоговая оценка&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
===== change_group() =====&lt;br /&gt;
Синхронизирует ученика с потоками при смене группы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $oldagroupid - id старой группы студента&lt;br /&gt;
* $newagroupid - id новой группы студента&lt;br /&gt;
* $programmsbcid - id подписки на программу&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===== syncronize_agroup_with_cstream() =====&lt;br /&gt;
Синхронизировать учебную группу с потоком, проверим и обновив все подписки&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
*  $cstreamlinkid - id записи в таблице [[Разработка:storages/cstreamlinks|cstreamlinks]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===== unsign_agroups_from_cstream() =====&lt;br /&gt;
Удаление всех &amp;quot;лишних&amp;quot; подписок из потока, которые были записаны в составе группы, связи с которой сейчас нет&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid - id записи в таблице cstreams&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает одному студенту подписку на все потоки программы (sign_student_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает нескольким студентам подписку на все потоки программы (sign_agroup_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает всем студентам группы подписку на все потоки рограммы (sign_all_agroups_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|programmsbcs]]&lt;br /&gt;
 |changeagroup&lt;br /&gt;
 |Массив, содержащий:&lt;br /&gt;
* в поле 'oldagroup' id старой группы&lt;br /&gt;
* в поле 'newagroup' id новой группы&lt;br /&gt;
* в поле 'programmsbc' объект из таблицы programmsbcs&lt;br /&gt;
''Пример:'' array('oldagroup' =&amp;gt; $oldid, 'newagroup' =&amp;gt; $newid, 'programmsbc' =&amp;gt; $object)&lt;br /&gt;
 |Обрабатывается событие изменения группы, вызывается функция [[#change_group()|change_group()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию выполняется синхронизация подписок группы при помощи функции [[#syncronize_agroup_with_cstream()|syncronize_agroup_with_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию удаляются подписки при помощи функции [[#unsign_agroups_from_cstream()|unsign_agroups_from_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/cstreams|cstreams]]&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |&lt;br /&gt;
 |При изменении статуса учебного потока изменяет статус всех подписок на этот поток, через обращение к [[Разработка:workflows/cpassed|workflows/cpassed]].&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cpassed.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=1983</id>
		<title>Разработка:storages/cpassed</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=1983"/>
				<updated>2010-11-08T17:24:51Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cpassed&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cpassed'' - изучаемые и пройденные курсы: отражает ход изучения учащимися выбранной учебной программы, итоговые отметки.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* cstreamid - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]], по которому велось обучение.&lt;br /&gt;
* programmsbcid - id подписки контракта в таблице [[Разработка:storages/contracts | contracts ]] на программу обучения.&lt;br /&gt;
* programmitemid - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* studentid - id слушателя по таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* agroupid - id академической группы в таблице [[Разработка:storages/agroups | agroups ]]. Не обязательное поле (для заполнения). По умолчанию NULL. При зачислении и отчислении из группы изменяется его значение автоматически. При отчислении из группы поле становится равным нулю (0). При индивидуальном обучении - NULL. На основании этого принимается решение подписке/отписке на предмет. &lt;br /&gt;
* grade - итоговая отметка по курсу.&lt;br /&gt;
* gradelevel - уровень оценки (оценка не идет в кондуит, дисциплина, курсовая работа, практика, междисциплинарный экзамин, дипломная работа). Берется из [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* credit - количество кредитов, полученное за прохождение дисциплины.&lt;br /&gt;
* notice - текстовое пояснение об источнике оценки при перезачете.&lt;br /&gt;
* repeatid - id предыдущей подписки на дисциплину, если обучение выполняется повторно (пересдача или повторное обучение - при этом подписка, на которую выполняется ссылка должна иметь статус &amp;quot;пересдан&amp;quot;). Пересдачей может считаться только пересдача дисциплины, пройденной в рамках этой же подписки на учебную программу. Если было несколько пересдач данной дисциплины в данной учебной программе, то все они ссылаются на один и тот же исходный cpassedid.&lt;br /&gt;
* typesync - тип синхронизации (выставление вручную, синхронизация с moodle).&lt;br /&gt;
* mdlinstance - id задания в moodle, с которым выполнялась синхронизация.&lt;br /&gt;
* teacherid - id сотрудника по справочнику [[Разработка:storages/persons | persons ]], вручную выставившего итоговую отметку.&lt;br /&gt;
* ageid - id периода в таблице [[Разработка:storages/ages | ages ]] по которому велось обучение.&lt;br /&gt;
* orderid - id приказа в таблице [[Разработка:storages/orders | orders ]], согласно которому была выставлена оценка.&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов [[Разработка:workflows/cpassed | cpassed ]].&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_students($csid, $status = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок студентов, приписаных к одному предмето-потоку.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $csid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток.&lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус не указывается или указывается как null - подписки с любым статусом.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cstream_agroup($cstreamid, $agroupid, $status = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получаеть список всех подписок студентов к указанному учебному потоку или только подписок с указанным статусом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $agroupid(int) - id академической группы в таблице [[Разработка:storages/cstreams | agroups ]].&lt;br /&gt;
* $status(string) - статус учебной дисциплины. по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - массив записей из таблица.&lt;br /&gt;
* (bool) - false, если записи не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpasseds_student($stid, $status = 'active')'''====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок для слушателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток. &lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpassed_programm($stid, $prid, $status = 'complete')'''====&lt;br /&gt;
&lt;br /&gt;
Получает список дисциплин, изученных слушателем в рамках учебной программы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - 'complete'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список подписок на учебный поток. &lt;br /&gt;
* (bool) - false, если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpasseds_programmitem($stid, $prid, $status = 'complete', $levelgrade = null)'''====&lt;br /&gt;
&lt;br /&gt;
Получает подписки на дисциплину по id слушателя и id дисциплины.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* $status(string) - название статуса подписки, по умолчанию - 'complete'&lt;br /&gt;
* $levelgrade(string) - уровень оценки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив подписок на дисциплину.&lt;br /&gt;
* (bool) false если подписка не найдена или слушатель ее еще не изучил.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается уровень оценки - подписки с указанным уровнем оценки,&lt;br /&gt;
** если уровень оценки не указывается или указывается как null - подписки с любым уровнем оценки.&lt;br /&gt;
** если указывается статус - подписки с указанным статусом, если статус не указан, то возвращаются подписки со статусом 'complete'&lt;br /&gt;
** если статус указан как null или false, то вернутся подписки с любым статусом&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_cpassed_programm($stid, $prid, $status = 'complete')'''====&lt;br /&gt;
&lt;br /&gt;
Получить список дисциплин, изученных слушателем в рамках учебной программы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - 'complete'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - список подписок на дисциплину.&lt;br /&gt;
* bool - false, если дисциплины не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====update_total_grade()=====&lt;br /&gt;
&lt;br /&gt;
Установливает/обновляет студенту итоговую оценку и комментарий для существующей подписки (в перспективе, когда будет реализован справочник с историей изменения отметок - вызов функции протоколирования). Если оценка равна или выше минимальной, подписка переводится в статус &amp;quot;успешно завершен&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id подписки.&lt;br /&gt;
* $grade(int) - итоговая оценка.&lt;br /&gt;
* $comment(string) - коментарий&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true в случае успешного обновления и false в остальных&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для вставки в таблицу БД.&lt;br /&gt;
# (не реализовано)меняем статус подписки.&lt;br /&gt;
# обновляем запись в БД.&lt;br /&gt;
&lt;br /&gt;
=====insert_grade_reoffset()=====&lt;br /&gt;
&lt;br /&gt;
Добавляет оценку в режиме &amp;quot;перезачета&amp;quot;.(в перспективе, когда будет реализован справочник с историей изменения отметок - вызов функции протоколирования)&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id дисциплины в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $cpid(int) - id подписки на программу.&lt;br /&gt;
* $grade(int) - итоговая оценка.&lt;br /&gt;
* $comment(string) - коментарий.&lt;br /&gt;
* $status(string) - статус - перезачет(reoffset) или пересдача(repeating).&lt;br /&gt;
* $initialid(int) - id исходной подписки.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) id добавленной записи &lt;br /&gt;
* (bool) false если добавление не удалось&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если дисиплина пересдается (статус = repeating), статус исходной подписки меняем на пересдан и обновляем запись в БД.&lt;br /&gt;
# формируем новый объект в БД.&lt;br /&gt;
# вставляем сформированную запись в таблицу БД.&lt;br /&gt;
&lt;br /&gt;
=====get_listing()=====&lt;br /&gt;
&lt;br /&gt;
Получить список записей для вывода в таблицу&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $limitfrom - с какой записи начинать вывод&lt;br /&gt;
* $limitnum - сколько записей выводить на одной странице&lt;br /&gt;
* $conds - Объект, содержащий данные с условиями выборки, в формате ''поле_БД-&amp;gt;значение'' по умолчанию NULL.&lt;br /&gt;
* $countonly - Если указано true, то функция вернет только количество записей, соответствующих переданным условиям. По умолчанию false.&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив записей из базы, int количество записей, соответствующих условиям (если $countonly=true), или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# составляем запрос по переданным параметрам при помощи собственной protected-функции get_select_listing()&lt;br /&gt;
# Проверяем условие $countonly. Если оно истинно - то возвращаем только количество записей&lt;br /&gt;
# Если ложно - то возвращаем список записей&lt;br /&gt;
&lt;br /&gt;
=====get_students_without_agroup()=====&lt;br /&gt;
&lt;br /&gt;
Получить список всех подписок, которые не принадлежат ни к одной группе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* bool|array - массив из записей таблицы cpassed или false, если ничего не нашлось&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Возвращаются все записи таблицы cpassed, имеющие статус plan или active в которых поле agroupid равно: &lt;br /&gt;
** NULL (null-значение)&lt;br /&gt;
** &amp;quot;&amp;quot; (пустой строке) &lt;br /&gt;
** 0&lt;br /&gt;
&lt;br /&gt;
=====unsign_students_without_agroup()=====&lt;br /&gt;
&lt;br /&gt;
Отписать всех учеников, не имеющих подписки ни на одну группу&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool)&lt;br /&gt;
** true  - если изменение всех статусов прошло нормально или&lt;br /&gt;
** false - если в процессе работы произошли ошибки&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Для получения списка подписок, не имеющих связи с группой вызывается функция get_students_without_agroup()&lt;br /&gt;
** Если таких подписок нет - возвращается true&lt;br /&gt;
** Если подписки есть - то в цикле выставляем каждой записи статус &amp;quot;canceled&amp;quot; (через обращение к плагину workflow)&lt;br /&gt;
&lt;br /&gt;
=====sign_student_on_cstream()=====&lt;br /&gt;
&lt;br /&gt;
Подписывает одного ученика на один учебный поток. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int)$cstreamid - id учебного потока в таблице в таблице [[Разработка:storages/cstreams | cstreams ]]&lt;br /&gt;
* (int)$programmsbcid - id подписки студента на программу в таблице в таблице [[Разработка:storages/programmsbcs | programmsbcs ]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* id записи если подписка произошла успешно (или уже существует),&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_students_without_real_agroup()=====&lt;br /&gt;
&lt;br /&gt;
Отменить подписки учеников, у которых группа, указанная в подписке на программу (programmsbcs) не совпадает с группой, указанной в таблице связей учебных потоков с группами (cstreamlinks)&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (object)$cstreamlink - объект из таблицы в таблице [[Разработка:storages/cstreamlinks | cstreamlinks ]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_student_from_one_cstream()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает одного студента от одного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $studentid - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* (int) $cstreamid - id потока в таблице [[Разработка:storages/cstreams | cstreams ]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_student_from_all_cstreams()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает одного студента от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $studentid - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* (int) $programmsbcid - id подписки студента на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_students_from_all_cstreams()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает нескольких студентов от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (array) $students - массив (id=&amp;gt;подписки на программу студента=&amp;gt;id студента)&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====set_final_grade()=====&lt;br /&gt;
&lt;br /&gt;
Выставляет итоговую оценку по  предмету, переводя подписку в нужный статус, в зависимости от переданной оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cpassedid - id подписки на дисциплину&lt;br /&gt;
* $grade - выставляемая итоговая оценка&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
===== change_group() =====&lt;br /&gt;
Синхронизирует ученика с потоками при смене группы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $oldagroupid - id старой группы студента&lt;br /&gt;
* $newagroupid - id новой группы студента&lt;br /&gt;
* $programmsbcid - id подписки на программу&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===== syncronize_agroup_with_cstream() =====&lt;br /&gt;
Синхронизировать учебную группу с потоком, проверим и обновив все подписки&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
*  $cstreamlinkid - id записи в таблице [[Разработка:storages/cstreamlinks|cstreamlinks]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===== unsign_agroups_from_cstream() =====&lt;br /&gt;
Удаление всех &amp;quot;лишних&amp;quot; подписок из потока, которые были записаны в составе группы, связи с которой сейчас нет&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid - id записи в таблице cstreams&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает одному студенту подписку на все потоки программы (sign_student_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает нескольким студентам подписку на все потоки программы (sign_agroup_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает всем студентам группы подписку на все потоки рограммы (sign_all_agroups_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|programmsbcs]]&lt;br /&gt;
 |changeagroup&lt;br /&gt;
 |Массив, содержащий:&lt;br /&gt;
* в поле 'oldagroup' id старой группы&lt;br /&gt;
* в поле 'newagroup' id новой группы&lt;br /&gt;
* в поле 'programmsbc' объект из таблицы programmsbcs&lt;br /&gt;
''Пример:'' array('oldagroup' =&amp;gt; $oldid, 'newagroup' =&amp;gt; $newid, 'programmsbc' =&amp;gt; $object)&lt;br /&gt;
 |Обрабатывается событие изменения группы, вызывается функция [[#change_group()|change_group()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию выполняется синхронизация подписок группы при помощи функции [[#syncronize_agroup_with_cstream()|syncronize_agroup_with_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию удаляются подписки при помощи функции [[#unsign_agroups_from_cstream()|unsign_agroups_from_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/cstreams|cstreams]]&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |&lt;br /&gt;
 |При изменении статуса учебного потока изменяет статус всех подписок на этот поток, через обращение к [[Разработка:workflows/cpassed|workflows/cpassed]].&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cpassed.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=1978</id>
		<title>Разработка:storages/cpassed</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/cpassed&amp;diff=1978"/>
				<updated>2010-11-08T15:03:21Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Таблица в базе данных */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = cpassed&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''cpassed'' - изучаемые и пройденные курсы: отражает ход изучения учащимися выбранной учебной программы, итоговые отметки.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* cstreamid - id учебного процесса в таблице [[Разработка:storages/cstreams | cstreams ]], по которому велось обучение.&lt;br /&gt;
* programmsbcid - id подписки контракта в таблице [[Разработка:storages/contracts | contracts ]] на программу обучения.&lt;br /&gt;
* programmitemid - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* studentid - id слушателя по таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* agroupid - id академической группы в таблице [[Разработка:storages/agroups | agroups ]]. Не обязательное поле (для заполнения). По умолчанию NULL. При зачислении и отчислении из группы изменяется его значение автоматически. При отчислении из группы поле становится равным нулю (0). При индивидуальном обучении - NULL. На основании этого принимается решение подписке/отписке на предмет. &lt;br /&gt;
* grade - итоговая отметка по курсу.&lt;br /&gt;
* gradelevel - уровень оценки (оценка не идет в кондуит, дисциплина, курсовая работа, практика, междисциплинарный экзамин, дипломная работа). Берется из [[Разработка:storages/programmitems | programmitems ]].&lt;br /&gt;
* credit - количество кредитов, полученное за прохождение дисциплины.&lt;br /&gt;
* notice - текстовое пояснение об источнике оценки при перезачете.&lt;br /&gt;
* repeatid - id предыдущей подписки на дисциплину, если обучение выполняется повторно (пересдача или повторное обучение - при этом подписка, на которую выполняется ссылка должна иметь статус &amp;quot;пересдан&amp;quot;). Пересдачей может считаться только пересдача дисциплины, пройденной в рамках этой же подписки на учебную программу. Если было несколько пересдач данной дисциплины в данной учебной программе, то все они ссылаются на один и тот же исходный cpassedid.&lt;br /&gt;
* typesync - тип синхронизации (выставление вручную, синхронизация с moodle).&lt;br /&gt;
* mdlinstance - id задания в moodle, с которым выполнялась синхронизация.&lt;br /&gt;
* teacherid - id сотрудника по справочнику [[Разработка:storages/persons | persons ]], вручную выставившего итоговую отметку.&lt;br /&gt;
* ageid - id периода в таблице [[Разработка:storages/ages | ages ]] по которому велось обучение.&lt;br /&gt;
* orderid - id приказа в таблице [[Разработка:storages/orders | orders ]], согласно которому была выставлена оценка.&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов [[Разработка:workflows/cpassed | cpassed ]].&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
=====get_cstream_students()=====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок студентов, приписаных к одному предмето-потоку.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $csid(int) - id учебного потока в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - все(null).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список подписок на учебный поток. &lt;br /&gt;
* (bool) false если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус не указывается или указывается как null - подписки с любым статусом.&lt;br /&gt;
&lt;br /&gt;
=====get_cpasseds_student()=====&lt;br /&gt;
&lt;br /&gt;
Получает список всех подписок для слушателя.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - идет(go).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список подписок на учебный поток. &lt;br /&gt;
* (bool) false если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом go.&lt;br /&gt;
&lt;br /&gt;
=====get_cpassed_programm()=====&lt;br /&gt;
&lt;br /&gt;
Получает список дисциплин, изученных слушателем в рамках учебной программы.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id подписки на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].&lt;br /&gt;
* $status(string) - статус подписки, по умолчанию - завершен(complete).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список подписок на учебный поток. &lt;br /&gt;
* (bool) false если подписки не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается статус - подписки с указанным статусом,&lt;br /&gt;
** если статус указывается null - подписки с любым статусом,&lt;br /&gt;
** если статус не указывается - подписки со статусом complete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====get_cpasseds_programmitem()=====&lt;br /&gt;
&lt;br /&gt;
Получает подписки на дисциплину по id слушателя и id дисциплины.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $deptid(int) - id дисциплины в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $status(string) - название статуса подписки, по умолчанию 'complete'&lt;br /&gt;
* $levelgrade(string) - уровень оценки, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив подписок на дисциплину.&lt;br /&gt;
* (bool) false если подписка не найдена или слушатель ее еще не изучил.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список подписок:&lt;br /&gt;
** если указывается уровень оценки - подписки с указанным уровнем оценки,&lt;br /&gt;
** если уровень оценки не указывается или указывается как null - подписки с любым уровнем оценки.&lt;br /&gt;
** если указывается статус - подписки с указанным статусом, если статус не указан, то возвращаются подписки со статусом 'complete'&lt;br /&gt;
** если статус указан как null или false, то вернутся подписки с любым статусом&lt;br /&gt;
&lt;br /&gt;
=====update_total_grade()=====&lt;br /&gt;
&lt;br /&gt;
Установливает/обновляет студенту итоговую оценку и комментарий для существующей подписки (в перспективе, когда будет реализован справочник с историей изменения отметок - вызов функции протоколирования). Если оценка равна или выше минимальной, подписка переводится в статус &amp;quot;успешно завершен&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $id(int) - id подписки.&lt;br /&gt;
* $grade(int) - итоговая оценка.&lt;br /&gt;
* $comment(string) - коментарий&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true в случае успешного обновления и false в остальных&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# создаем объект для вставки в таблицу БД.&lt;br /&gt;
# (не реализовано)меняем статус подписки.&lt;br /&gt;
# обновляем запись в БД.&lt;br /&gt;
&lt;br /&gt;
=====insert_grade_reoffset()=====&lt;br /&gt;
&lt;br /&gt;
Добавляет оценку в режиме &amp;quot;перезачета&amp;quot;.(в перспективе, когда будет реализован справочник с историей изменения отметок - вызов функции протоколирования)&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $stid(int) - id студента в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $prid(int) - id дисциплины в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $cpid(int) - id подписки на программу.&lt;br /&gt;
* $grade(int) - итоговая оценка.&lt;br /&gt;
* $comment(string) - коментарий.&lt;br /&gt;
* $status(string) - статус - перезачет(reoffset) или пересдача(repeating).&lt;br /&gt;
* $initialid(int) - id исходной подписки.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (int) id добавленной записи &lt;br /&gt;
* (bool) false если добавление не удалось&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если дисиплина пересдается (статус = repeating), статус исходной подписки меняем на пересдан и обновляем запись в БД.&lt;br /&gt;
# формируем новый объект в БД.&lt;br /&gt;
# вставляем сформированную запись в таблицу БД.&lt;br /&gt;
&lt;br /&gt;
=====get_listing()=====&lt;br /&gt;
&lt;br /&gt;
Получить список записей для вывода в таблицу&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $limitfrom - с какой записи начинать вывод&lt;br /&gt;
* $limitnum - сколько записей выводить на одной странице&lt;br /&gt;
* $conds - Объект, содержащий данные с условиями выборки, в формате ''поле_БД-&amp;gt;значение'' по умолчанию NULL.&lt;br /&gt;
* $countonly - Если указано true, то функция вернет только количество записей, соответствующих переданным условиям. По умолчанию false.&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) массив записей из базы, int количество записей, соответствующих условиям (если $countonly=true), или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# составляем запрос по переданным параметрам при помощи собственной protected-функции get_select_listing()&lt;br /&gt;
# Проверяем условие $countonly. Если оно истинно - то возвращаем только количество записей&lt;br /&gt;
# Если ложно - то возвращаем список записей&lt;br /&gt;
&lt;br /&gt;
=====get_students_without_agroup()=====&lt;br /&gt;
&lt;br /&gt;
Получить список всех подписок, которые не принадлежат ни к одной группе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* bool|array - массив из записей таблицы cpassed или false, если ничего не нашлось&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Возвращаются все записи таблицы cpassed, имеющие статус plan или active в которых поле agroupid равно: &lt;br /&gt;
** NULL (null-значение)&lt;br /&gt;
** &amp;quot;&amp;quot; (пустой строке) &lt;br /&gt;
** 0&lt;br /&gt;
&lt;br /&gt;
=====unsign_students_without_agroup()=====&lt;br /&gt;
&lt;br /&gt;
Отписать всех учеников, не имеющих подписки ни на одну группу&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* ''(нет)''&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool)&lt;br /&gt;
** true  - если изменение всех статусов прошло нормально или&lt;br /&gt;
** false - если в процессе работы произошли ошибки&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* Для получения списка подписок, не имеющих связи с группой вызывается функция get_students_without_agroup()&lt;br /&gt;
** Если таких подписок нет - возвращается true&lt;br /&gt;
** Если подписки есть - то в цикле выставляем каждой записи статус &amp;quot;canceled&amp;quot; (через обращение к плагину workflow)&lt;br /&gt;
&lt;br /&gt;
=====sign_student_on_cstream()=====&lt;br /&gt;
&lt;br /&gt;
Подписывает одного ученика на один учебный поток. &lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int)$cstreamid - id учебного потока в таблице в таблице [[Разработка:storages/cstreams | cstreams ]]&lt;br /&gt;
* (int)$programmsbcid - id подписки студента на программу в таблице в таблице [[Разработка:storages/programmsbcs | programmsbcs ]]&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* id записи если подписка произошла успешно (или уже существует),&lt;br /&gt;
* false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_students_without_real_agroup()=====&lt;br /&gt;
&lt;br /&gt;
Отменить подписки учеников, у которых группа, указанная в подписке на программу (programmsbcs) не совпадает с группой, указанной в таблице связей учебных потоков с группами (cstreamlinks)&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (object)$cstreamlink - объект из таблицы в таблице [[Разработка:storages/cstreamlinks | cstreamlinks ]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_student_from_one_cstream()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает одного студента от одного потока&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $studentid - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* (int) $cstreamid - id потока в таблице [[Разработка:storages/cstreams | cstreams ]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_student_from_all_cstreams()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает одного студента от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (int) $studentid - id студента в таблице [[Разработка:storages/persons | persons ]]&lt;br /&gt;
* (int) $programmsbcid - id подписки студента на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====unsign_students_from_all_cstreams()=====&lt;br /&gt;
&lt;br /&gt;
Отписывает нескольких студентов от всех потоков программы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* (array) $students - массив (id=&amp;gt;подписки на программу студента=&amp;gt;id студента)&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) &lt;br /&gt;
** true если все операции завершились успешно &lt;br /&gt;
** false в случае возникновения ошибок&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
=====set_final_grade()=====&lt;br /&gt;
&lt;br /&gt;
Выставляет итоговую оценку по  предмету, переводя подписку в нужный статус, в зависимости от переданной оценки.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cpassedid - id подписки на дисциплину&lt;br /&gt;
* $grade - выставляемая итоговая оценка&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
&lt;br /&gt;
===== change_group() =====&lt;br /&gt;
Синхронизирует ученика с потоками при смене группы&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $oldagroupid - id старой группы студента&lt;br /&gt;
* $newagroupid - id новой группы студента&lt;br /&gt;
* $programmsbcid - id подписки на программу&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===== syncronize_agroup_with_cstream() =====&lt;br /&gt;
Синхронизировать учебную группу с потоком, проверим и обновив все подписки&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
*  $cstreamlinkid - id записи в таблице [[Разработка:storages/cstreamlinks|cstreamlinks]]&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===== unsign_agroups_from_cstream() =====&lt;br /&gt;
Удаление всех &amp;quot;лишних&amp;quot; подписок из потока, которые были записаны в составе группы, связи с которой сейчас нет&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $cstreamid - id записи в таблице cstreams&lt;br /&gt;
&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) true - если все прошло успешно или false в случае ошибки&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает одному студенту подписку на все потоки программы (sign_student_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает нескольким студентам подписку на все потоки программы (sign_agroup_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;метод создает всем студентам группы подписку на все потоки рограммы (sign_all_agroups_on_all_cstreams)&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|programmsbcs]]&lt;br /&gt;
 |changeagroup&lt;br /&gt;
 |Массив, содержащий:&lt;br /&gt;
* в поле 'oldagroup' id старой группы&lt;br /&gt;
* в поле 'newagroup' id новой группы&lt;br /&gt;
* в поле 'programmsbc' объект из таблицы programmsbcs&lt;br /&gt;
''Пример:'' array('oldagroup' =&amp;gt; $oldid, 'newagroup' =&amp;gt; $newid, 'programmsbc' =&amp;gt; $object)&lt;br /&gt;
 |Обрабатывается событие изменения группы, вызывается функция [[#change_group()|change_group()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию выполняется синхронизация подписок группы при помощи функции [[#syncronize_agroup_with_cstream()|syncronize_agroup_with_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/programmsbcs|cstreamlinks]]&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |По этому событию удаляются подписки при помощи функции [[#unsign_agroups_from_cstream()|unsign_agroups_from_cstream()]]&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |[[Разработка:storages/cstreams|cstreams]]&lt;br /&gt;
 |changestatus&lt;br /&gt;
 |&lt;br /&gt;
 |При изменении статуса учебного потока изменяет статус всех подписок на этот поток, через обращение к [[Разработка:workflows/cpassed|workflows/cpassed]].&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице cpassed.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |cpassed&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы cpassed.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/contracts&amp;diff=1977</id>
		<title>Разработка:storages/contracts</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/contracts&amp;diff=1977"/>
				<updated>2010-11-08T14:55:00Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = contracts&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''contracts'' - договор учащегося с учебным заведением. Отношения учащегося с учебного заведения начинаются с явного или подразумеваемого заключения договора на оказание образовательных услуг, выражающегося в виде записи в таблице contracts, связывающей учащегося, куратора и законного представителя.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* typeid - тип договора, если у учебного заведения предусмотрено несколько разных типов договоров &lt;br /&gt;
* num - номер договора&lt;br /&gt;
* numpass - номер пропуска, студенческого билета и т.п.&lt;br /&gt;
* date - дата заключения&lt;br /&gt;
* sellerid - куратор (id по таблице [[Разработка:storages/persons | persons ]])&lt;br /&gt;
* clientid - клиент, оплачивающий обучение (законный представитель, сам совершеннолетний ученик или куратор от организации, может принимать значение 0 или null, если клиент создается, а контракт имеет черновой вариант) (по таблице [[Разработка:storages/persons | persons ]])&lt;br /&gt;
* studentid - ученик ( может принимать значение 0, если ученик создается, а контракт имеет черновой вариант) (по таблице [[Разработка:storages/persons | persons ]])&lt;br /&gt;
* adddate - дата добавления в БД&lt;br /&gt;
* notes - заметки&lt;br /&gt;
* departmentid - подразделение в таблице [[Разработка:storages/departments | departments ]], к которому приписан контракт на обучение (например,  принявшее ученика)&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов [[Разработка:workflows/contracts | contracts ]]&lt;br /&gt;
* contractform - форма договора (шаблон)&lt;br /&gt;
* organizationid - юридическое лицо в таблице [[Разработка:storages/organizations | organizations ]], оплачивающее  договор, если ученик платит за себя сам - то не указывается.&lt;br /&gt;
* curatorid - куратор данного ученика от работодателя (по таблице [[Разработка:storages/persons | persons ]] или не указан)&lt;br /&gt;
* enddate - дата окончания договора&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject,$quiet=NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу(ы) плагина.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - запись.&lt;br /&gt;
* $quiet(bool) - определяет, создавать ли события, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id вставленной записи.&lt;br /&gt;
* bool - false, если операция не удалась.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_seller($pid = NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Ищет список действующих контрактов для куратора.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны-куратора в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - false, если контракты не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если id персоны не указано, устанавливаем id текущего пользователя.&lt;br /&gt;
# по SQL-запросу находим список необходимых контрактов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_client($pid = NULL)'''====&lt;br /&gt;
 &lt;br /&gt;
Ищет список действующих контрактов, заключенных данным клиентом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны-клиента в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - false, если контракты не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если id персоны не указано, устанавливаем id текущего пользователя.&lt;br /&gt;
# по SQL-запросу находим список необходимых контрактов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_student($pid = NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Ищет список действующих контрактов для студента.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны-студента в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - fals, если контракты не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если id персоны не указано, устанавливаем id текущего пользователя.&lt;br /&gt;
# по SQL-запросу находим список необходимых контрактов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_status($status)'''====&lt;br /&gt;
&lt;br /&gt;
Ищет список контрактов по статусу.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $status(string) - статус контракта.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - false, если контракты не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_person_used($pid,$except=null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет есть ли другие активные договора, где используется учетная запись.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $except(int) - id контракта, который следует исключить, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если контракты были найдены и false, если их нет.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# формируем SQL-запрос.&lt;br /&gt;
# если задан контракт, который слудует исключить, исключаем его из поиска.&lt;br /&gt;
# находим конракты и возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_seller($contractid = null,$personid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли персона куратором по контракту.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $contractid(int) - id контракта, по умолчанию - null.&lt;br /&gt;
* $personid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_student($contractid = null,$personid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли персона студентом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $contractid(int) - id контракта, по умолчанию - null.&lt;br /&gt;
* $personid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_client($contractid = null,$personid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли персона клиентом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $contractid(int) - id контракта, по умолчанию - null.&lt;br /&gt;
* $personid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_personel($userid, $except=null, $where = 'moodle')'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, упомянута ли данная персона в данном контракте.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $mdluser(int) - id пользователя в moodle&lt;br /&gt;
* $except(bool) - id контракта, который надо исключить из поиска&lt;br /&gt;
* $where(string) - идентификатор происхождения id пользователя: mоodle - id из таблицы mdl_user, fdo - из таблицы [[Разработка:storages/persons | persons ]] &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
===='''get_seller($id)'''====&lt;br /&gt;
&lt;br /&gt;
Находит ФИО продавца и его id по id контракта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $id(int) - id контракта.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (object) - ФИО продовца и его id.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_contracts_for_person($pid = NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Находит список договоров для конкретной персоны.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Сгенерировать номер контракта&lt;br /&gt;
* Найти контракт по номеру&lt;br /&gt;
* Найти контракт по номеру пропуска&lt;br /&gt;
* Найти список действующих контрактов, относящихся к структурному подразделению&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |contracts&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу contracts.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |contracts&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице contracts.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |contracts&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы contracts.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/contracts&amp;diff=1976</id>
		<title>Разработка:storages/contracts</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/contracts&amp;diff=1976"/>
				<updated>2010-11-08T14:53:42Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* is_client($contractid = null,$personid = null) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = contracts&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''contracts'' - договор учащегося с учебным заведением. Отношения учащегося с учебного заведения начинаются с явного или подразумеваемого заключения договора на оказание образовательных услуг, выражающегося в виде записи в таблице contracts, связывающей учащегося, куратора и законного представителя.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* typeid - тип договора, если у учебного заведения предусмотрено несколько разных типов договоров &lt;br /&gt;
* num - номер договора&lt;br /&gt;
* numpass - номер пропуска, студенческого билета и т.п.&lt;br /&gt;
* date - дата заключения&lt;br /&gt;
* sellerid - куратор (id по таблице [[Разработка:storages/persons | persons ]])&lt;br /&gt;
* clientid - клиент, оплачивающий обучение (законный представитель, сам совершеннолетний ученик или куратор от организации, может принимать значение 0 или null, если клиент создается, а контракт имеет черновой вариант) (по таблице [[Разработка:storages/persons | persons ]])&lt;br /&gt;
* studentid - ученик ( может принимать значение 0, если ученик создается, а контракт имеет черновой вариант) (по таблице [[Разработка:storages/persons | persons ]])&lt;br /&gt;
* adddate - дата добавления в БД&lt;br /&gt;
* notes - заметки&lt;br /&gt;
* departmentid - подразделение в таблице [[Разработка:storages/departments | departments ]], к которому приписан контракт на обучение (например,  принявшее ученика)&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов [[Разработка:workflows/contracts | contracts ]]&lt;br /&gt;
* contractform - форма договора (шаблон)&lt;br /&gt;
* organizationid - юридическое лицо в таблице [[Разработка:storages/organizations | organizations ]], оплачивающее  договор, если ученик платит за себя сам - то не указывается.&lt;br /&gt;
* curatorid - куратор данного ученика от работодателя (по таблице [[Разработка:storages/persons | persons ]] или не указан)&lt;br /&gt;
* enddate - дата окончания договора&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject,$quiet=NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу(ы) плагина.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - запись.&lt;br /&gt;
* $quiet(bool) - определяет, создавать ли события, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id вставленной записи.&lt;br /&gt;
* bool - false, если операция не удалась.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_seller($pid = NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Ищет список действующих контрактов для куратора.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны-куратора в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - false, если контракты не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если id персоны не указано, устанавливаем id текущего пользователя.&lt;br /&gt;
# по SQL-запросу находим список необходимых контрактов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_client($pid = NULL)'''====&lt;br /&gt;
 &lt;br /&gt;
Ищет список действующих контрактов, заключенных данным клиентом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны-клиента в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - false, если контракты не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если id персоны не указано, устанавливаем id текущего пользователя.&lt;br /&gt;
# по SQL-запросу находим список необходимых контрактов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_student($pid = NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Ищет список действующих контрактов для студента.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны-студента в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - fals, если контракты не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если id персоны не указано, устанавливаем id текущего пользователя.&lt;br /&gt;
# по SQL-запросу находим список необходимых контрактов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_status($status)'''====&lt;br /&gt;
&lt;br /&gt;
Ищет список контрактов по статусу.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $status(string) - статус контракта.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - false, если контракты не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_person_used($pid,$except=null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет есть ли другие активные договора, где используется учетная запись.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $except(int) - id контракта, который следует исключить, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если контракты были найдены и false, если их нет.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# формируем SQL-запрос.&lt;br /&gt;
# если задан контракт, который слудует исключить, исключаем его из поиска.&lt;br /&gt;
# находим конракты и возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_seller($contractid = null,$personid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли персона куратором по контракту.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $contractid(int) - id контракта, по умолчанию - null.&lt;br /&gt;
* $personid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_student($contractid = null,$personid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли персона студентом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $contractid(int) - id контракта, по умолчанию - null.&lt;br /&gt;
* $personid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_client($contractid = null,$personid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли персона клиентом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $contractid(int) - id контракта, по умолчанию - null.&lt;br /&gt;
* $personid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_personel($userid, $except=null, $where = 'moodle')'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, упомянута ли данная персона в данном контракте.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $mdluser(int) - id пользователя в moodle&lt;br /&gt;
* $except(bool) - id контракта, который надо исключить из поиска&lt;br /&gt;
* $where(string) - идентификатор происхождения id пользователя: mоodle - id из таблицы mdl_user, fdo - из таблицы [[Разработка:storages/persons | persons ]] &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
===='''get_seller($id)'''====&lt;br /&gt;
&lt;br /&gt;
Находит ФИО продавца и его id по id контракта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $id(int) - id контракта.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - ФИО продовца и его id.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_contracts_for_person($pid = NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Находит список договоров для конкретной персоны.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*array - список контрактов.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Сгенерировать номер контракта&lt;br /&gt;
* Найти контракт по номеру&lt;br /&gt;
* Найти контракт по номеру пропуска&lt;br /&gt;
* Найти список действующих контрактов, относящихся к структурному подразделению&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |contracts&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу contracts.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |contracts&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице contracts.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |contracts&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы contracts.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/contracts&amp;diff=1974</id>
		<title>Разработка:storages/contracts</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/contracts&amp;diff=1974"/>
				<updated>2010-11-08T14:40:16Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = contracts&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''contracts'' - договор учащегося с учебным заведением. Отношения учащегося с учебного заведения начинаются с явного или подразумеваемого заключения договора на оказание образовательных услуг, выражающегося в виде записи в таблице contracts, связывающей учащегося, куратора и законного представителя.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* typeid - тип договора, если у учебного заведения предусмотрено несколько разных типов договоров &lt;br /&gt;
* num - номер договора&lt;br /&gt;
* numpass - номер пропуска, студенческого билета и т.п.&lt;br /&gt;
* date - дата заключения&lt;br /&gt;
* sellerid - куратор (id по таблице [[Разработка:storages/persons | persons ]])&lt;br /&gt;
* clientid - клиент, оплачивающий обучение (законный представитель, сам совершеннолетний ученик или куратор от организации, может принимать значение 0 или null, если клиент создается, а контракт имеет черновой вариант) (по таблице [[Разработка:storages/persons | persons ]])&lt;br /&gt;
* studentid - ученик ( может принимать значение 0, если ученик создается, а контракт имеет черновой вариант) (по таблице [[Разработка:storages/persons | persons ]])&lt;br /&gt;
* adddate - дата добавления в БД&lt;br /&gt;
* notes - заметки&lt;br /&gt;
* departmentid - подразделение в таблице [[Разработка:storages/departments | departments ]], к которому приписан контракт на обучение (например,  принявшее ученика)&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов [[Разработка:workflows/contracts | contracts ]]&lt;br /&gt;
* contractform - форма договора (шаблон)&lt;br /&gt;
* organizationid - юридическое лицо в таблице [[Разработка:storages/organizations | organizations ]], оплачивающее  договор, если ученик платит за себя сам - то не указывается.&lt;br /&gt;
* curatorid - куратор данного ученика от работодателя (по таблице [[Разработка:storages/persons | persons ]] или не указан)&lt;br /&gt;
* enddate - дата окончания договора&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject,$quiet=NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу(ы) плагина.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* dataobject(object) - запись.&lt;br /&gt;
* $quiet(bool) - определяет, создавать ли события, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id вставленной записи.&lt;br /&gt;
* bool - false, если операция не удалась.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_seller($pid = NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Ищет список действующих контрактов для куратора.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны-куратора в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - false, если контракты не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если id персоны не указано, устанавливаем id текущего пользователя.&lt;br /&gt;
# по SQL-запросу находим список необходимых контрактов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_client($pid = NULL)'''====&lt;br /&gt;
 &lt;br /&gt;
Ищет список действующих контрактов, заключенных данным клиентом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны-клиента в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - false, если контракты не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если id персоны не указано, устанавливаем id текущего пользователя.&lt;br /&gt;
# по SQL-запросу находим список необходимых контрактов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_student($pid = NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Ищет список действующих контрактов для студента.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны-студента в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - fals, если контракты не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# если id персоны не указано, устанавливаем id текущего пользователя.&lt;br /&gt;
# по SQL-запросу находим список необходимых контрактов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_list_by_status($status)'''====&lt;br /&gt;
&lt;br /&gt;
Ищет список контрактов по статусу.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $status(string) - статус контракта.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список контрактов.&lt;br /&gt;
* (bool) - false, если контракты не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_person_used($pid,$except=null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет есть ли другие активные договора, где используется учетная запись.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* $except(int) - id контракта, который следует исключить, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если контракты были найдены и false, если их нет.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
# формируем SQL-запрос.&lt;br /&gt;
# если задан контракт, который слудует исключить, исключаем его из поиска.&lt;br /&gt;
# находим конракты и возвращаем результат.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_seller($contractid = null,$personid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли персона куратором по контракту.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $contractid(int) - id контракта, по умолчанию - null.&lt;br /&gt;
* $personid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_student($contractid = null,$personid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли персона студентом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $contractid(int) - id контракта, по умолчанию - null.&lt;br /&gt;
* $personid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_client($contractid = null,$personid = null)'''====&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли персона клиентом.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $contractid(int) - id контракта, по умолчанию - null.&lt;br /&gt;
* $personid(int) - id персоны в таблице [[Разработка:storages/persons | persons ]], по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
is_personel($userid, $except=null, $where = 'moodle')&lt;br /&gt;
&lt;br /&gt;
Проверяет, упомянута ли данная персона в данном контракте.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $mdluser(int) - id пользователя в moodle&lt;br /&gt;
* $except(bool) - id контракта, который надо исключить из поиска&lt;br /&gt;
* $where(string) - идентификатор происхождения id пользователя: mоodle - id из таблицы mdl_user, fdo - из таблицы [[Разработка:storages/persons | persons ]] &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (bool) - true, если да и false, если нет.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_seller($id)'''====&lt;br /&gt;
&lt;br /&gt;
Находит ФИО продавца и его id по id контракта&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $id(int) - id контракта.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - ФИО продовца и его id.&lt;br /&gt;
* (bool) - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_contracts_for_person($pid = NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Находит список договоров для конкретной персоны.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $pid(int) - id персоны, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
*array - список контрактов.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
====Дополнительные методы:====&lt;br /&gt;
* Сгенерировать номер контракта&lt;br /&gt;
* Найти контракт по номеру&lt;br /&gt;
* Найти контракт по номеру пропуска&lt;br /&gt;
* Найти список действующих контрактов, относящихся к структурному подразделению&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |contracts&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу contracts.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |contracts&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице contracts.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |contracts&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы contracts.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/appointments&amp;diff=1966</id>
		<title>Разработка:storages/appointments</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/appointments&amp;diff=1966"/>
				<updated>2010-11-08T12:22:03Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = appointments&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''appointments'' - Сопоставление должностей с табельными номерами.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* eagreementid - id договора с сотрудником в таблице [[Разработка:storages/eagreements | eagreements]]&lt;br /&gt;
* schpositionid - ссылка на вакансию в штатном расписании (таблица [[Разработка:storages/schpositions | schpositions]])&lt;br /&gt;
* enumber - табельный номер (уникальное поле),&lt;br /&gt;
* worktime - ставка в часах/неделю,&lt;br /&gt;
* date - дата заключения договора в формате unixtime&lt;br /&gt;
* begindate - дата начала работы в формате unixtime&lt;br /&gt;
* enddate  - дата окончания работы в формате unixtime&lt;br /&gt;
* departmentid - подразделение, которому принадлежит учебный процесс в таблице [[Разработка:storages/departments | departments ]]&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/appointments | appointments ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_listing($limitfrom, $limitnum, $conds=null, $countonly=false)'''====&lt;br /&gt;
&lt;br /&gt;
находит фрагмент списка учебных периодов для вывода таблицы &lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $limitfrom(int) - начиная с какой записи просматривается фрагмент списка записей.&lt;br /&gt;
* $limitnum(int) - сколько записей нужно извлечь из базы.&lt;br /&gt;
* $conds(object) - список параметров для выборки периодов, по умолчанию - null.&lt;br /&gt;
* $countonly(bool) - определяет, нужно ли вернуть список записей или просто их количество, по умолчанию - false.&lt;br /&gt;
''Возвращаемое значение:''&lt;br /&gt;
* array - массив записей из базы&lt;br /&gt;
* bool - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_select_listing($inputconds)'''====&lt;br /&gt;
&lt;br /&gt;
показывает фрагмент sql-запроса после слова WHERE&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $inputconds(object) - список полей с условиями запроса в формате &amp;quot;поле_БД-&amp;gt;значение&amp;quot;.&lt;br /&gt;
''Возвращаемое значение:''&lt;br /&gt;
* string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof($select)'''====&lt;br /&gt;
&lt;br /&gt;
находит количество периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $select(string) - критерии отбора записей.&lt;br /&gt;
''Возвращаемое значение:''&lt;br /&gt;
* int - количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''is_enumber_unique($enumber)'''====&lt;br /&gt;
&lt;br /&gt;
Есть ли другие записи с таким табельным номером&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $enumber(string) - табельный номер.&lt;br /&gt;
''Возвращаемое значение:''&lt;br /&gt;
* bool&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_free_worktime($schpositionid)'''====&lt;br /&gt;
&lt;br /&gt;
находит допустимое время вакансии&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $schpositionid(int) - id вакансии из таблицы [[Разработка:storages/schpositions | schpositions ]]&lt;br /&gt;
''Возвращаемое значение:''&lt;br /&gt;
* int&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_person_by_appointment($appointment, $enum = false)'''====&lt;br /&gt;
&lt;br /&gt;
находит объект из таблицы persons по id в таблице [[Разработка:storages/appointments | appointments ]]&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $appointment(object) - объект из таблицы [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
* $appointment(int) - id объекта из таблицы [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
* $enum(bool) - возвращать ли табельный номер, по умолчанию - false.&lt;br /&gt;
''Возвращаемое значение:''&lt;br /&gt;
* object - объект из таблицы [[Разработка:storages/persons | persons ]].&lt;br /&gt;
* bool - false если ничего не нашлось.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_persons_by_appointments($appointments)'''====&lt;br /&gt;
&lt;br /&gt;
находит список персон по переданным записям отсортированный по ФИО&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* array $appointments - массив записей из таблицы [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
''Возвращаемое значение:''&lt;br /&gt;
* array - массив записей из таблицы [[Разработка:storages/persons | persons ]], упорядоченных по sortname ASC. К каждой записи добавлено поле enumber - табельный номер, поле appointmentid - id назначения на должность.&lt;br /&gt;
* bool false - если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_appointment_by_persons($personid)'''====&lt;br /&gt;
&lt;br /&gt;
Возвращает список табельных номеров для персоны.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $persons(int) - массив записей из таблицы [[Разработка:storages/persons | persons ]].&lt;br /&gt;
''Возвращаемое значение:''&lt;br /&gt;
* array - массив записей из таблицы [[Разработка:storages/appointments | appointments ]].&lt;br /&gt;
* bool false - если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |appointments&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |appointments&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |appointments&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/agroups&amp;diff=1965</id>
		<title>Разработка:storages/agroups</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/agroups&amp;diff=1965"/>
				<updated>2010-11-08T12:09:32Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = agroups&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''agroups'' - классы/академические группы. Связывают контракты на обучение и учебные программы при групповой форме обучения.&lt;br /&gt;
 &lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название академической группы/класса&lt;br /&gt;
* code - кодовое обозначение группы (текстовое поле, обязательное, уникальное)&lt;br /&gt;
* programmid - id учебной программы в таблице [[Разработка:storages/programms | programms ]], которую реализует академическая группа&lt;br /&gt;
* departmentid - отдел в таблице [[Разработка:storages/departments | departments ]], ответственный за группу&lt;br /&gt;
* agenum - порядковый номер текущего учебного периода (изменяется приказом по контингенту). Параллель группы может быти изменена только если группа находится в статусе &amp;quot;формируется&amp;quot;.&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/agroups | agroups ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject,$quiet=NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу(ы) плагина &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dataobject(object) - данные записи.&lt;br /&gt;
* $quiet(bool) - генерировать или нет события, по умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id вставленной записи.&lt;br /&gt;
* bool - false, если операция не удалась.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''search_group_code($code)'''====&lt;br /&gt;
&lt;br /&gt;
находит группу по коду&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $code - код группы.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - объект группы.&lt;br /&gt;
* bool - false, если группа не найдена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_groups_programm($prid, $status = 'learn', $agenum = null, $dpid = null)'''====&lt;br /&gt;
&lt;br /&gt;
находит все группы, обучающиеся по учебной программе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $prid(int) - id программы  в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $status(string) - статус группы, по умолчанию - 'learn'.&lt;br /&gt;
* $agenum(int) - номер периода, по умолчанию - null.&lt;br /&gt;
* $dpid(int) - id структурного подразделения, по умолчанию - null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - список групп.&lt;br /&gt;
* bool - false, если группы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список групп:&lt;br /&gt;
** если указывается статус - группы с указанным статусом,&lt;br /&gt;
** если статус указывается null - группы с любым статусом,&lt;br /&gt;
** если статус не указывается - группы со статусом learn.&lt;br /&gt;
** если указывается номер периода - группы с указанным периодом,&lt;br /&gt;
** если номер периода указывается null или не указывается - группы с любым периодом.&lt;br /&gt;
** если указывается id подразделения - группы указанного подразделения,&lt;br /&gt;
** если id подразделения указывается null или не указывается - группы любого подразделения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_department($dpid, $prid = null, $status = 'learn')'''====&lt;br /&gt;
&lt;br /&gt;
Получает все группы, относящиеся к структурному подразделению и обучающиеся по программе&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dpid(int) - id структурного подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $prid(int) - id программы в таблице [[Разработка:storages/programms | programms ]], по умолчанию - все(null).&lt;br /&gt;
* $status(string) - статус группы, по умолчанию - 'learn'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - список групп.&lt;br /&gt;
* bool - false, если группы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список групп:&lt;br /&gt;
** если указывается id программы - группы с указанным id,&lt;br /&gt;
** если id программы не указывается или указывается как null- группы с любым id.&lt;br /&gt;
** если указывается статус - группы с указанным статусом,&lt;br /&gt;
** если статус указывается null - группы с любым статусом,&lt;br /&gt;
** если статус не указывается - группы со статусом learn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_cstream($csid)'''====&lt;br /&gt;
&lt;br /&gt;
Получить все группы, подписанные на учебный процесс с данным id. &lt;br /&gt;
 &lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $csid(int) - id учебного процесса  в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) - список групп.&lt;br /&gt;
* (bool) - false, если группы не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_agroups($select)'''====&lt;br /&gt;
&lt;br /&gt;
находит количество групп&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $select(string) - критерии отбора записей.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_nocstream($csid)'''====&lt;br /&gt;
&lt;br /&gt;
находит список групп, не связаных с данным потоком&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $csid(int) - id учебного процесса.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - список групп.&lt;br /&gt;
* bool - false, если произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу agroups.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице agroups.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы agroups.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/agroups&amp;diff=1963</id>
		<title>Разработка:storages/agroups</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/agroups&amp;diff=1963"/>
				<updated>2010-11-08T11:56:08Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* search_group_code() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = agroups&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''agroups'' - классы/академические группы. Связывают контракты на обучение и учебные программы при групповой форме обучения.&lt;br /&gt;
 &lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название академической группы/класса&lt;br /&gt;
* code - кодовое обозначение группы (текстовое поле, обязательное, уникальное)&lt;br /&gt;
* programmid - id учебной программы в таблице [[Разработка:storages/programms | programms ]], которую реализует академическая группа&lt;br /&gt;
* departmentid - отдел в таблице [[Разработка:storages/departments | departments ]], ответственный за группу&lt;br /&gt;
* agenum - порядковый номер текущего учебного периода (изменяется приказом по контингенту). Параллель группы может быти изменена только если группа находится в статусе &amp;quot;формируется&amp;quot;.&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/agroups | agroups ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject,$quiet=NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу(ы) плагина &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dataobject(object) - данные записи.&lt;br /&gt;
* $quiet(bool) - генерировать или нет события, по умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id вставленной записи.&lt;br /&gt;
* bool - false, если операция не удалась.&lt;br /&gt;
&lt;br /&gt;
===='''search_group_code($code)'''====&lt;br /&gt;
&lt;br /&gt;
находит группу по коду&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $code - код группы.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* object - объект группы.&lt;br /&gt;
* bool - false, если группа не найдена.&lt;br /&gt;
&lt;br /&gt;
===='''get_groups_programm()'''====&lt;br /&gt;
&lt;br /&gt;
находит все группы, обучающиеся по учебной программе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $prid(int) - id программы  в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $status(string) - статус группы, по умолчанию - обучается(learn).&lt;br /&gt;
* $agenum(int) - номер периода.&lt;br /&gt;
* $dpid(int) - id структурного подразделения.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список групп.&lt;br /&gt;
* (bool) false - если группы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список групп:&lt;br /&gt;
** если указывается статус - группы с указанным статусом,&lt;br /&gt;
** если статус указывается null - группы с любым статусом,&lt;br /&gt;
** если статус не указывается - группы со статусом learn.&lt;br /&gt;
** если указывается номер периода - группы с указанным периодом,&lt;br /&gt;
** если номер периода указывается null или не указывается - группы с любым периодом.&lt;br /&gt;
** если указывается id подразделения - группы указанного подразделения,&lt;br /&gt;
** если id подразделения указывается null или не указывается - группы любого подразделения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_department()'''====&lt;br /&gt;
&lt;br /&gt;
Получает все группы, относящиеся к структурному подразделению и обучающиеся по программе&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dpid(int) - id структурного подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $prid(int) - id программы в таблице [[Разработка:storages/programms | programms ]], по умолчанию - все(null).&lt;br /&gt;
* $status(string) - статус группы, по умолчанию - обучается(learn).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* mixed array список групп или bool false если группы не найдены&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список групп:&lt;br /&gt;
** если указывается id программы - группы с указанным id,&lt;br /&gt;
** если id программы не указывается или указывается как null- группы с любым id.&lt;br /&gt;
** если указывается статус - группы с указанным статусом,&lt;br /&gt;
** если статус указывается null - группы с любым статусом,&lt;br /&gt;
** если статус не указывается - группы со статусом learn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_cstream()'''====&lt;br /&gt;
&lt;br /&gt;
Получить все группы, подписанные на учебный процесс с данным id. &lt;br /&gt;
 &lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $csid(int) - id учебного процесса  в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список групп.&lt;br /&gt;
* (bool) false - если группы не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_agroups()'''====&lt;br /&gt;
&lt;br /&gt;
находит количество групп&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $select(string) - критерии отбора записей&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - количество найденных записей&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_nocstream($csid)'''====&lt;br /&gt;
&lt;br /&gt;
находит список групп, не связаных с данным потоком&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $csid(int) - id учебного процесса&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - список групп&lt;br /&gt;
* bool false - если произошла ошибка&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу agroups.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице agroups.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы agroups.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1960</id>
		<title>Разработка:storages/ages</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1960"/>
				<updated>2010-11-08T11:49:23Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = ages&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''ages'' - учебные периоды (учебный год в школе, семестр в ВУЗе). Каждый учебный поток и итоговая отметка по курсу принадлежат какому-то одному учебному периоду.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название учебного периода&lt;br /&gt;
* begindate - дата и время начала по UTC&lt;br /&gt;
* enddate  - дата и время окончания по UTC&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, которые помещаются в этом учебном периоде.&lt;br /&gt;
* departmentid - структурное подразделение в таблице [[Разработка:storages/departments | departments ]], объявившее учебный период&lt;br /&gt;
* previousid - предыдущий учебный период&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/ages | ages ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
* '''+''' Получить список текущих учебных периодов для структурного подразделения. Возвращает массив объектов. По умолчанию - все периоды в статусе &amp;quot;идет учебный процесс&amp;quot;. Если второй параметр null - возвращаются все периоды, если строка - периоды в этом статусе, если массив - все периоды в таких статусах. Для удобства нужно сделать заготовку, которая принимает такой параметр и имя sql-колонки и возвращает соответствующий фрагмент sql-запроса - и поместить ее защищенным методом в storage_base.&lt;br /&gt;
* '''+''' Получить id учебного периода, являющегося x по счету после периода с заданным id. При этом x=1 - это сам исходный период (период для &amp;quot;первого класса), x=2 - это период, для которого период x=1 был предыдущим. Метод возвращает id или false, если однозначно установить id периода не удалось.&lt;br /&gt;
* Создать период для структурного подразделения: получает параметры &amp;quot;структурное подразделение&amp;quot;, &amp;quot;дата начала&amp;quot;, &amp;quot;дата конца&amp;quot;, &amp;quot;количество учебных недель&amp;quot;, &amp;quot;название&amp;quot;, &amp;quot;предыдущий период&amp;quot; - по умолчанию 0. Не указывать предыдущий период допускается только если для этого структурного подразделения еще не было создано периодов. Если для периода уже есть один &amp;quot;последующий период&amp;quot;, то больше его указывать в качестве &amp;quot;предыдущего&amp;quot; нельзя. Метод возвращает id созданного периода или false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_department_ages($departmentid, $status='active')'''====&lt;br /&gt;
&lt;br /&gt;
находит список всех или в указанном статусе учебных периодов структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $departmentid(int) - id учебного подразделения в таблице departments.&lt;br /&gt;
* $status(string) - статус учебного периода, или null если нужны периоды с любым статусом, по умолчанию 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - массив объектов из таблицы ages.&lt;br /&gt;
* bool - false, если ничего не найдено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_next_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит один из дочерних учебных периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов вперед отсчитать относительно переданного ageid. При этом переданный id считается первым.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода&lt;br /&gt;
* bool - false, если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_previous_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит предшествующий указанному в ageid учебный период&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов назад отсчитать относительно переданного ageid. При этом переданный ageid считается последним.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода или&lt;br /&gt;
* bool - false, если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''create_period_for_department($deptid, $datebegin, $dateend, $numweeks, $name, $previousid=null)'''====&lt;br /&gt;
&lt;br /&gt;
создаёт период для структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $deptid(int) - id учебного подразделения.&lt;br /&gt;
* $datebegin(int) - время начала периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $dateend(int) - время окончания периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $numweeks(int) - количество недель в учебном периоде.&lt;br /&gt;
* $name(string) - название учебного периода.&lt;br /&gt;
* $previosid(int) - id предыдущего учебного периода или null, если нет предыдущего периода, по умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id созданного периода.&lt;br /&gt;
* bool - false, если период создать нельзя.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_ages($select)'''====&lt;br /&gt;
&lt;br /&gt;
находит количество периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $select(int) - критерии отбора записей.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
===='''get_ages_by_idrange($minid, $maxid)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
получаеть список записей по диапазону id&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $minid(int) - минимальный id.&lt;br /&gt;
* $maxid(int) - максимальный id.&lt;br /&gt;
''Возвращает значения:''&lt;br /&gt;
* array - массив записей.&lt;br /&gt;
* bool - false, если ни один не найден.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agenum_byageid($startageid, $currentageid, $maxagenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит порядковый номер периода, считая от заданного периода&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $startageid(int) - id периода на котором нужно остановить поиск.&lt;br /&gt;
* $currentageid(int) - id периода, порядковый номер которого нам надо узнать.&lt;br /&gt;
* $maxagenum(int) - максимально возможный порядковый номер периода.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - порядковый номер периода.&lt;br /&gt;
* bool - false, если не находит.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
Надо реализовать удаление периода так: если к периоду ничего не привязано (потоки, подразделения и т.п.), то его можно удалять. Иначе - нельзя.&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы ages.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1957</id>
		<title>Разработка:storages/ages</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1957"/>
				<updated>2010-11-08T11:47:56Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* get_department_ages($departmentid, $status='active') */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = ages&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''ages'' - учебные периоды (учебный год в школе, семестр в ВУЗе). Каждый учебный поток и итоговая отметка по курсу принадлежат какому-то одному учебному периоду.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название учебного периода&lt;br /&gt;
* begindate - дата и время начала по UTC&lt;br /&gt;
* enddate  - дата и время окончания по UTC&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, которые помещаются в этом учебном периоде.&lt;br /&gt;
* departmentid - структурное подразделение в таблице [[Разработка:storages/departments | departments ]], объявившее учебный период&lt;br /&gt;
* previousid - предыдущий учебный период&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/ages | ages ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
* '''+''' Получить список текущих учебных периодов для структурного подразделения. Возвращает массив объектов. По умолчанию - все периоды в статусе &amp;quot;идет учебный процесс&amp;quot;. Если второй параметр null - возвращаются все периоды, если строка - периоды в этом статусе, если массив - все периоды в таких статусах. Для удобства нужно сделать заготовку, которая принимает такой параметр и имя sql-колонки и возвращает соответствующий фрагмент sql-запроса - и поместить ее защищенным методом в storage_base.&lt;br /&gt;
* '''+''' Получить id учебного периода, являющегося x по счету после периода с заданным id. При этом x=1 - это сам исходный период (период для &amp;quot;первого класса), x=2 - это период, для которого период x=1 был предыдущим. Метод возвращает id или false, если однозначно установить id периода не удалось.&lt;br /&gt;
* Создать период для структурного подразделения: получает параметры &amp;quot;структурное подразделение&amp;quot;, &amp;quot;дата начала&amp;quot;, &amp;quot;дата конца&amp;quot;, &amp;quot;количество учебных недель&amp;quot;, &amp;quot;название&amp;quot;, &amp;quot;предыдущий период&amp;quot; - по умолчанию 0. Не указывать предыдущий период допускается только если для этого структурного подразделения еще не было создано периодов. Если для периода уже есть один &amp;quot;последующий период&amp;quot;, то больше его указывать в качестве &amp;quot;предыдущего&amp;quot; нельзя. Метод возвращает id созданного периода или false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_department_ages($departmentid, $status='active')'''====&lt;br /&gt;
&lt;br /&gt;
находит список всех или в указанном статусе учебных периодов структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $departmentid(int) - id учебного подразделения в таблице departments.&lt;br /&gt;
* $status(string) - статус учебного периода, или null если нужны периоды с любым статусом, по умолчанию 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - массив объектов из таблицы ages.&lt;br /&gt;
* bool - false, если ничего не найдено.&lt;br /&gt;
&lt;br /&gt;
===='''get_next_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит один из дочерних учебных периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов вперед отсчитать относительно переданного ageid. При этом переданный id считается первым.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_previous_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит предшествующий указанному в ageid учебный период&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов назад отсчитать относительно переданного ageid. При этом переданный ageid считается последним.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода или&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''create_period_for_department($deptid, $datebegin, $dateend, $numweeks, $name, $previousid=null)'''====&lt;br /&gt;
&lt;br /&gt;
создаёт период для структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $deptid(int) - id учебного подразделения.&lt;br /&gt;
* $datebegin(int) - время начала периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $dateend(int) - время окончания периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $numweeks(int) - количество недель в учебном периоде.&lt;br /&gt;
* $name(string) - название учебного периода.&lt;br /&gt;
* $previosid(int) - id предыдущего учебного периода или null, если нет предыдущего периода, по умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id созданного периода.&lt;br /&gt;
* bool false - если период создать нельзя.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_ages($select)'''====&lt;br /&gt;
&lt;br /&gt;
находит количество периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $select(int) - критерии отбора записей.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
===='''get_ages_by_idrange($minid, $maxid)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
получаеть список записей по диапазону id&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $minid(int) - минимальный id.&lt;br /&gt;
* $maxid(int) - максимальный id.&lt;br /&gt;
''Возвращает значения:''&lt;br /&gt;
* array - массив записей.&lt;br /&gt;
* bool false - если ни один не найден.&lt;br /&gt;
&lt;br /&gt;
===='''get_agenum_byageid($startageid, $currentageid, $maxagenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит порядковый номер периода, считая от заданного периода&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $startageid(int) - id периода на котором нужно остановить поиск.&lt;br /&gt;
* $currentageid(int) - id периода, порядковый номер которого нам надо узнать.&lt;br /&gt;
* $maxagenum(int) - максимально возможный порядковый номер периода.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - порядковый номер периода.&lt;br /&gt;
* bool false - если не находит.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
Надо реализовать удаление периода так: если к периоду ничего не привязано (потоки, подразделения и т.п.), то его можно удалять. Иначе - нельзя.&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы ages.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/agroups&amp;diff=1956</id>
		<title>Разработка:storages/agroups</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/agroups&amp;diff=1956"/>
				<updated>2010-11-08T11:47:13Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* insert($dataobject,$quiet=NULL) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = agroups&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''agroups'' - классы/академические группы. Связывают контракты на обучение и учебные программы при групповой форме обучения.&lt;br /&gt;
 &lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название академической группы/класса&lt;br /&gt;
* code - кодовое обозначение группы (текстовое поле, обязательное, уникальное)&lt;br /&gt;
* programmid - id учебной программы в таблице [[Разработка:storages/programms | programms ]], которую реализует академическая группа&lt;br /&gt;
* departmentid - отдел в таблице [[Разработка:storages/departments | departments ]], ответственный за группу&lt;br /&gt;
* agenum - порядковый номер текущего учебного периода (изменяется приказом по контингенту). Параллель группы может быти изменена только если группа находится в статусе &amp;quot;формируется&amp;quot;.&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/agroups | agroups ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject,$quiet=NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу(ы) плагина &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dataobject(object) - данные записи.&lt;br /&gt;
* $quiet(bool) - генерировать или нет события, по умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id вставленной записи.&lt;br /&gt;
* bool - false, если операция не удалась.&lt;br /&gt;
&lt;br /&gt;
===='''search_group_code()'''====&lt;br /&gt;
&lt;br /&gt;
находит группу по коду&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $code - код группы&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* mixed object объект группы &lt;br /&gt;
* bool false если группа не найдена &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_groups_programm()'''====&lt;br /&gt;
&lt;br /&gt;
находит все группы, обучающиеся по учебной программе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $prid(int) - id программы  в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $status(string) - статус группы, по умолчанию - обучается(learn).&lt;br /&gt;
* $agenum(int) - номер периода.&lt;br /&gt;
* $dpid(int) - id структурного подразделения.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список групп.&lt;br /&gt;
* (bool) false - если группы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список групп:&lt;br /&gt;
** если указывается статус - группы с указанным статусом,&lt;br /&gt;
** если статус указывается null - группы с любым статусом,&lt;br /&gt;
** если статус не указывается - группы со статусом learn.&lt;br /&gt;
** если указывается номер периода - группы с указанным периодом,&lt;br /&gt;
** если номер периода указывается null или не указывается - группы с любым периодом.&lt;br /&gt;
** если указывается id подразделения - группы указанного подразделения,&lt;br /&gt;
** если id подразделения указывается null или не указывается - группы любого подразделения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_department()'''====&lt;br /&gt;
&lt;br /&gt;
Получает все группы, относящиеся к структурному подразделению и обучающиеся по программе&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dpid(int) - id структурного подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $prid(int) - id программы в таблице [[Разработка:storages/programms | programms ]], по умолчанию - все(null).&lt;br /&gt;
* $status(string) - статус группы, по умолчанию - обучается(learn).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* mixed array список групп или bool false если группы не найдены&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список групп:&lt;br /&gt;
** если указывается id программы - группы с указанным id,&lt;br /&gt;
** если id программы не указывается или указывается как null- группы с любым id.&lt;br /&gt;
** если указывается статус - группы с указанным статусом,&lt;br /&gt;
** если статус указывается null - группы с любым статусом,&lt;br /&gt;
** если статус не указывается - группы со статусом learn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_cstream()'''====&lt;br /&gt;
&lt;br /&gt;
Получить все группы, подписанные на учебный процесс с данным id. &lt;br /&gt;
 &lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $csid(int) - id учебного процесса  в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список групп.&lt;br /&gt;
* (bool) false - если группы не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_agroups()'''====&lt;br /&gt;
&lt;br /&gt;
находит количество групп&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $select(string) - критерии отбора записей&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - количество найденных записей&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_nocstream($csid)'''====&lt;br /&gt;
&lt;br /&gt;
находит список групп, не связаных с данным потоком&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $csid(int) - id учебного процесса&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - список групп&lt;br /&gt;
* bool false - если произошла ошибка&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу agroups.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице agroups.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы agroups.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1953</id>
		<title>Разработка:storages/ages</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1953"/>
				<updated>2010-11-08T11:38:20Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* get_ages_by_idrange($minid, $maxid) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = ages&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''ages'' - учебные периоды (учебный год в школе, семестр в ВУЗе). Каждый учебный поток и итоговая отметка по курсу принадлежат какому-то одному учебному периоду.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название учебного периода&lt;br /&gt;
* begindate - дата и время начала по UTC&lt;br /&gt;
* enddate  - дата и время окончания по UTC&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, которые помещаются в этом учебном периоде.&lt;br /&gt;
* departmentid - структурное подразделение в таблице [[Разработка:storages/departments | departments ]], объявившее учебный период&lt;br /&gt;
* previousid - предыдущий учебный период&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/ages | ages ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
* '''+''' Получить список текущих учебных периодов для структурного подразделения. Возвращает массив объектов. По умолчанию - все периоды в статусе &amp;quot;идет учебный процесс&amp;quot;. Если второй параметр null - возвращаются все периоды, если строка - периоды в этом статусе, если массив - все периоды в таких статусах. Для удобства нужно сделать заготовку, которая принимает такой параметр и имя sql-колонки и возвращает соответствующий фрагмент sql-запроса - и поместить ее защищенным методом в storage_base.&lt;br /&gt;
* '''+''' Получить id учебного периода, являющегося x по счету после периода с заданным id. При этом x=1 - это сам исходный период (период для &amp;quot;первого класса), x=2 - это период, для которого период x=1 был предыдущим. Метод возвращает id или false, если однозначно установить id периода не удалось.&lt;br /&gt;
* Создать период для структурного подразделения: получает параметры &amp;quot;структурное подразделение&amp;quot;, &amp;quot;дата начала&amp;quot;, &amp;quot;дата конца&amp;quot;, &amp;quot;количество учебных недель&amp;quot;, &amp;quot;название&amp;quot;, &amp;quot;предыдущий период&amp;quot; - по умолчанию 0. Не указывать предыдущий период допускается только если для этого структурного подразделения еще не было создано периодов. Если для периода уже есть один &amp;quot;последующий период&amp;quot;, то больше его указывать в качестве &amp;quot;предыдущего&amp;quot; нельзя. Метод возвращает id созданного периода или false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_department_ages($departmentid, $status='active')'''====&lt;br /&gt;
&lt;br /&gt;
находит список всех или в указанном статусе учебных периодов структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $departmentid(int) - id учебного подразделения в таблице departments.&lt;br /&gt;
* $status(string) - статус учебного периода, или null если нужны периоды с любым статусом, по умолчанию 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - массив объектов из таблицы ages.&lt;br /&gt;
* bool false - если ничего не найдено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_next_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит один из дочерних учебных периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов вперед отсчитать относительно переданного ageid. При этом переданный id считается первым.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_previous_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит предшествующий указанному в ageid учебный период&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов назад отсчитать относительно переданного ageid. При этом переданный ageid считается последним.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода или&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''create_period_for_department($deptid, $datebegin, $dateend, $numweeks, $name, $previousid=null)'''====&lt;br /&gt;
&lt;br /&gt;
создаёт период для структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $deptid(int) - id учебного подразделения.&lt;br /&gt;
* $datebegin(int) - время начала периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $dateend(int) - время окончания периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $numweeks(int) - количество недель в учебном периоде.&lt;br /&gt;
* $name(string) - название учебного периода.&lt;br /&gt;
* $previosid(int) - id предыдущего учебного периода или null, если нет предыдущего периода, по умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id созданного периода.&lt;br /&gt;
* bool false - если период создать нельзя.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_ages($select)'''====&lt;br /&gt;
&lt;br /&gt;
находит количество периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $select(int) - критерии отбора записей.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
===='''get_ages_by_idrange($minid, $maxid)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
получаеть список записей по диапазону id&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $minid(int) - минимальный id.&lt;br /&gt;
* $maxid(int) - максимальный id.&lt;br /&gt;
''Возвращает значения:''&lt;br /&gt;
* array - массив записей.&lt;br /&gt;
* bool false - если ни один не найден.&lt;br /&gt;
&lt;br /&gt;
===='''get_agenum_byageid($startageid, $currentageid, $maxagenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит порядковый номер периода, считая от заданного периода&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $startageid(int) - id периода на котором нужно остановить поиск.&lt;br /&gt;
* $currentageid(int) - id периода, порядковый номер которого нам надо узнать.&lt;br /&gt;
* $maxagenum(int) - максимально возможный порядковый номер периода.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - порядковый номер периода.&lt;br /&gt;
* bool false - если не находит.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
Надо реализовать удаление периода так: если к периоду ничего не привязано (потоки, подразделения и т.п.), то его можно удалять. Иначе - нельзя.&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы ages.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1952</id>
		<title>Разработка:storages/ages</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1952"/>
				<updated>2010-11-08T11:38:01Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* get_agenum_byageid($startageid, $currentageid, $maxagenum) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = ages&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''ages'' - учебные периоды (учебный год в школе, семестр в ВУЗе). Каждый учебный поток и итоговая отметка по курсу принадлежат какому-то одному учебному периоду.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название учебного периода&lt;br /&gt;
* begindate - дата и время начала по UTC&lt;br /&gt;
* enddate  - дата и время окончания по UTC&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, которые помещаются в этом учебном периоде.&lt;br /&gt;
* departmentid - структурное подразделение в таблице [[Разработка:storages/departments | departments ]], объявившее учебный период&lt;br /&gt;
* previousid - предыдущий учебный период&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/ages | ages ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
* '''+''' Получить список текущих учебных периодов для структурного подразделения. Возвращает массив объектов. По умолчанию - все периоды в статусе &amp;quot;идет учебный процесс&amp;quot;. Если второй параметр null - возвращаются все периоды, если строка - периоды в этом статусе, если массив - все периоды в таких статусах. Для удобства нужно сделать заготовку, которая принимает такой параметр и имя sql-колонки и возвращает соответствующий фрагмент sql-запроса - и поместить ее защищенным методом в storage_base.&lt;br /&gt;
* '''+''' Получить id учебного периода, являющегося x по счету после периода с заданным id. При этом x=1 - это сам исходный период (период для &amp;quot;первого класса), x=2 - это период, для которого период x=1 был предыдущим. Метод возвращает id или false, если однозначно установить id периода не удалось.&lt;br /&gt;
* Создать период для структурного подразделения: получает параметры &amp;quot;структурное подразделение&amp;quot;, &amp;quot;дата начала&amp;quot;, &amp;quot;дата конца&amp;quot;, &amp;quot;количество учебных недель&amp;quot;, &amp;quot;название&amp;quot;, &amp;quot;предыдущий период&amp;quot; - по умолчанию 0. Не указывать предыдущий период допускается только если для этого структурного подразделения еще не было создано периодов. Если для периода уже есть один &amp;quot;последующий период&amp;quot;, то больше его указывать в качестве &amp;quot;предыдущего&amp;quot; нельзя. Метод возвращает id созданного периода или false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_department_ages($departmentid, $status='active')'''====&lt;br /&gt;
&lt;br /&gt;
находит список всех или в указанном статусе учебных периодов структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $departmentid(int) - id учебного подразделения в таблице departments.&lt;br /&gt;
* $status(string) - статус учебного периода, или null если нужны периоды с любым статусом, по умолчанию 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - массив объектов из таблицы ages.&lt;br /&gt;
* bool false - если ничего не найдено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_next_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит один из дочерних учебных периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов вперед отсчитать относительно переданного ageid. При этом переданный id считается первым.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_previous_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит предшествующий указанному в ageid учебный период&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов назад отсчитать относительно переданного ageid. При этом переданный ageid считается последним.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода или&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''create_period_for_department($deptid, $datebegin, $dateend, $numweeks, $name, $previousid=null)'''====&lt;br /&gt;
&lt;br /&gt;
создаёт период для структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $deptid(int) - id учебного подразделения.&lt;br /&gt;
* $datebegin(int) - время начала периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $dateend(int) - время окончания периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $numweeks(int) - количество недель в учебном периоде.&lt;br /&gt;
* $name(string) - название учебного периода.&lt;br /&gt;
* $previosid(int) - id предыдущего учебного периода или null, если нет предыдущего периода, по умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id созданного периода.&lt;br /&gt;
* bool false - если период создать нельзя.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_ages($select)'''====&lt;br /&gt;
&lt;br /&gt;
находит количество периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $select(int) - критерии отбора записей.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
===='''get_ages_by_idrange($minid, $maxid)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
получаеть список записей по диапазону id&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $minid - минимальный id.&lt;br /&gt;
* $maxid - максимальный id.&lt;br /&gt;
''Возвращает значения:''&lt;br /&gt;
* array - массив записей.&lt;br /&gt;
* bool false - если ни один не найден.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agenum_byageid($startageid, $currentageid, $maxagenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит порядковый номер периода, считая от заданного периода&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $startageid(int) - id периода на котором нужно остановить поиск.&lt;br /&gt;
* $currentageid(int) - id периода, порядковый номер которого нам надо узнать.&lt;br /&gt;
* $maxagenum(int) - максимально возможный порядковый номер периода.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - порядковый номер периода.&lt;br /&gt;
* bool false - если не находит.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
Надо реализовать удаление периода так: если к периоду ничего не привязано (потоки, подразделения и т.п.), то его можно удалять. Иначе - нельзя.&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы ages.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1951</id>
		<title>Разработка:storages/ages</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1951"/>
				<updated>2010-11-08T11:37:30Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* get_numberof_ages($select) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = ages&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''ages'' - учебные периоды (учебный год в школе, семестр в ВУЗе). Каждый учебный поток и итоговая отметка по курсу принадлежат какому-то одному учебному периоду.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название учебного периода&lt;br /&gt;
* begindate - дата и время начала по UTC&lt;br /&gt;
* enddate  - дата и время окончания по UTC&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, которые помещаются в этом учебном периоде.&lt;br /&gt;
* departmentid - структурное подразделение в таблице [[Разработка:storages/departments | departments ]], объявившее учебный период&lt;br /&gt;
* previousid - предыдущий учебный период&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/ages | ages ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
* '''+''' Получить список текущих учебных периодов для структурного подразделения. Возвращает массив объектов. По умолчанию - все периоды в статусе &amp;quot;идет учебный процесс&amp;quot;. Если второй параметр null - возвращаются все периоды, если строка - периоды в этом статусе, если массив - все периоды в таких статусах. Для удобства нужно сделать заготовку, которая принимает такой параметр и имя sql-колонки и возвращает соответствующий фрагмент sql-запроса - и поместить ее защищенным методом в storage_base.&lt;br /&gt;
* '''+''' Получить id учебного периода, являющегося x по счету после периода с заданным id. При этом x=1 - это сам исходный период (период для &amp;quot;первого класса), x=2 - это период, для которого период x=1 был предыдущим. Метод возвращает id или false, если однозначно установить id периода не удалось.&lt;br /&gt;
* Создать период для структурного подразделения: получает параметры &amp;quot;структурное подразделение&amp;quot;, &amp;quot;дата начала&amp;quot;, &amp;quot;дата конца&amp;quot;, &amp;quot;количество учебных недель&amp;quot;, &amp;quot;название&amp;quot;, &amp;quot;предыдущий период&amp;quot; - по умолчанию 0. Не указывать предыдущий период допускается только если для этого структурного подразделения еще не было создано периодов. Если для периода уже есть один &amp;quot;последующий период&amp;quot;, то больше его указывать в качестве &amp;quot;предыдущего&amp;quot; нельзя. Метод возвращает id созданного периода или false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_department_ages($departmentid, $status='active')'''====&lt;br /&gt;
&lt;br /&gt;
находит список всех или в указанном статусе учебных периодов структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $departmentid(int) - id учебного подразделения в таблице departments.&lt;br /&gt;
* $status(string) - статус учебного периода, или null если нужны периоды с любым статусом, по умолчанию 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - массив объектов из таблицы ages.&lt;br /&gt;
* bool false - если ничего не найдено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_next_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит один из дочерних учебных периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов вперед отсчитать относительно переданного ageid. При этом переданный id считается первым.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_previous_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит предшествующий указанному в ageid учебный период&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов назад отсчитать относительно переданного ageid. При этом переданный ageid считается последним.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода или&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''create_period_for_department($deptid, $datebegin, $dateend, $numweeks, $name, $previousid=null)'''====&lt;br /&gt;
&lt;br /&gt;
создаёт период для структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $deptid(int) - id учебного подразделения.&lt;br /&gt;
* $datebegin(int) - время начала периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $dateend(int) - время окончания периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $numweeks(int) - количество недель в учебном периоде.&lt;br /&gt;
* $name(string) - название учебного периода.&lt;br /&gt;
* $previosid(int) - id предыдущего учебного периода или null, если нет предыдущего периода, по умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id созданного периода.&lt;br /&gt;
* bool false - если период создать нельзя.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_ages($select)'''====&lt;br /&gt;
&lt;br /&gt;
находит количество периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $select(int) - критерии отбора записей.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
===='''get_ages_by_idrange($minid, $maxid)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
получаеть список записей по диапазону id&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $minid - минимальный id.&lt;br /&gt;
* $maxid - максимальный id.&lt;br /&gt;
''Возвращает значения:''&lt;br /&gt;
* array - массив записей.&lt;br /&gt;
* bool false - если ни один не найден.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agenum_byageid($startageid, $currentageid, $maxagenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит порядковый номер периода, считая от заданного периода&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $startageid - id периода на котором нужно остановить поиск.&lt;br /&gt;
* $currentageid - id периода, порядковый номер которого нам надо узнать.&lt;br /&gt;
* $maxagenum - максимально возможный порядковый номер периода.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - порядковый номер периода.&lt;br /&gt;
* bool false - если не находит.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
Надо реализовать удаление периода так: если к периоду ничего не привязано (потоки, подразделения и т.п.), то его можно удалять. Иначе - нельзя.&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы ages.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/agroups&amp;diff=1950</id>
		<title>Разработка:storages/agroups</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/agroups&amp;diff=1950"/>
				<updated>2010-11-08T11:36:55Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* insert() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = agroups&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''agroups'' - классы/академические группы. Связывают контракты на обучение и учебные программы при групповой форме обучения.&lt;br /&gt;
 &lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название академической группы/класса&lt;br /&gt;
* code - кодовое обозначение группы (текстовое поле, обязательное, уникальное)&lt;br /&gt;
* programmid - id учебной программы в таблице [[Разработка:storages/programms | programms ]], которую реализует академическая группа&lt;br /&gt;
* departmentid - отдел в таблице [[Разработка:storages/departments | departments ]], ответственный за группу&lt;br /&gt;
* agenum - порядковый номер текущего учебного периода (изменяется приказом по контингенту). Параллель группы может быти изменена только если группа находится в статусе &amp;quot;формируется&amp;quot;.&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/agroups | agroups ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''insert($dataobject,$quiet=NULL)'''====&lt;br /&gt;
&lt;br /&gt;
Вставляет запись в таблицу(ы) плагина &lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dataobject(object) - данные записи&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id вставленной записи&lt;br /&gt;
* bool - false если операция не удалась&lt;br /&gt;
&lt;br /&gt;
===='''search_group_code()'''====&lt;br /&gt;
&lt;br /&gt;
находит группу по коду&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $code - код группы&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* mixed object объект группы &lt;br /&gt;
* bool false если группа не найдена &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_groups_programm()'''====&lt;br /&gt;
&lt;br /&gt;
находит все группы, обучающиеся по учебной программе.&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $prid(int) - id программы  в таблице [[Разработка:storages/programms | programms ]].&lt;br /&gt;
* $status(string) - статус группы, по умолчанию - обучается(learn).&lt;br /&gt;
* $agenum(int) - номер периода.&lt;br /&gt;
* $dpid(int) - id структурного подразделения.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список групп.&lt;br /&gt;
* (bool) false - если группы не найдены.&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список групп:&lt;br /&gt;
** если указывается статус - группы с указанным статусом,&lt;br /&gt;
** если статус указывается null - группы с любым статусом,&lt;br /&gt;
** если статус не указывается - группы со статусом learn.&lt;br /&gt;
** если указывается номер периода - группы с указанным периодом,&lt;br /&gt;
** если номер периода указывается null или не указывается - группы с любым периодом.&lt;br /&gt;
** если указывается id подразделения - группы указанного подразделения,&lt;br /&gt;
** если id подразделения указывается null или не указывается - группы любого подразделения.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_department()'''====&lt;br /&gt;
&lt;br /&gt;
Получает все группы, относящиеся к структурному подразделению и обучающиеся по программе&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $dpid(int) - id структурного подразделения в таблице [[Разработка:storages/departments | departments ]].&lt;br /&gt;
* $prid(int) - id программы в таблице [[Разработка:storages/programms | programms ]], по умолчанию - все(null).&lt;br /&gt;
* $status(string) - статус группы, по умолчанию - обучается(learn).&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* mixed array список групп или bool false если группы не найдены&lt;br /&gt;
''Структура работы:''&lt;br /&gt;
* формируем SQL-запрос и возвращаем список групп:&lt;br /&gt;
** если указывается id программы - группы с указанным id,&lt;br /&gt;
** если id программы не указывается или указывается как null- группы с любым id.&lt;br /&gt;
** если указывается статус - группы с указанным статусом,&lt;br /&gt;
** если статус указывается null - группы с любым статусом,&lt;br /&gt;
** если статус не указывается - группы со статусом learn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_cstream()'''====&lt;br /&gt;
&lt;br /&gt;
Получить все группы, подписанные на учебный процесс с данным id. &lt;br /&gt;
 &lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $csid(int) - id учебного процесса  в таблице [[Разработка:storages/cstreams | cstreams ]].&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* (array) список групп.&lt;br /&gt;
* (bool) false - если группы не найдены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_agroups()'''====&lt;br /&gt;
&lt;br /&gt;
находит количество групп&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $select(string) - критерии отбора записей&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - количество найденных записей&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_group_nocstream($csid)'''====&lt;br /&gt;
&lt;br /&gt;
находит список групп, не связаных с данным потоком&lt;br /&gt;
&lt;br /&gt;
''Аргументы:'' &lt;br /&gt;
* $csid(int) - id учебного процесса&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - список групп&lt;br /&gt;
* bool false - если произошла ошибка&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу agroups.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице agroups.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |agroups&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы agroups.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1947</id>
		<title>Разработка:storages/ages</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1947"/>
				<updated>2010-11-08T11:29:57Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* get_agenum_byageid() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = ages&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''ages'' - учебные периоды (учебный год в школе, семестр в ВУЗе). Каждый учебный поток и итоговая отметка по курсу принадлежат какому-то одному учебному периоду.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название учебного периода&lt;br /&gt;
* begindate - дата и время начала по UTC&lt;br /&gt;
* enddate  - дата и время окончания по UTC&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, которые помещаются в этом учебном периоде.&lt;br /&gt;
* departmentid - структурное подразделение в таблице [[Разработка:storages/departments | departments ]], объявившее учебный период&lt;br /&gt;
* previousid - предыдущий учебный период&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/ages | ages ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
* '''+''' Получить список текущих учебных периодов для структурного подразделения. Возвращает массив объектов. По умолчанию - все периоды в статусе &amp;quot;идет учебный процесс&amp;quot;. Если второй параметр null - возвращаются все периоды, если строка - периоды в этом статусе, если массив - все периоды в таких статусах. Для удобства нужно сделать заготовку, которая принимает такой параметр и имя sql-колонки и возвращает соответствующий фрагмент sql-запроса - и поместить ее защищенным методом в storage_base.&lt;br /&gt;
* '''+''' Получить id учебного периода, являющегося x по счету после периода с заданным id. При этом x=1 - это сам исходный период (период для &amp;quot;первого класса), x=2 - это период, для которого период x=1 был предыдущим. Метод возвращает id или false, если однозначно установить id периода не удалось.&lt;br /&gt;
* Создать период для структурного подразделения: получает параметры &amp;quot;структурное подразделение&amp;quot;, &amp;quot;дата начала&amp;quot;, &amp;quot;дата конца&amp;quot;, &amp;quot;количество учебных недель&amp;quot;, &amp;quot;название&amp;quot;, &amp;quot;предыдущий период&amp;quot; - по умолчанию 0. Не указывать предыдущий период допускается только если для этого структурного подразделения еще не было создано периодов. Если для периода уже есть один &amp;quot;последующий период&amp;quot;, то больше его указывать в качестве &amp;quot;предыдущего&amp;quot; нельзя. Метод возвращает id созданного периода или false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_department_ages($departmentid, $status='active')'''====&lt;br /&gt;
&lt;br /&gt;
находит список всех или в указанном статусе учебных периодов структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $departmentid(int) - id учебного подразделения в таблице departments.&lt;br /&gt;
* $status(string) - статус учебного периода, или null если нужны периоды с любым статусом, по умолчанию 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - массив объектов из таблицы ages.&lt;br /&gt;
* bool false - если ничего не найдено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_next_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит один из дочерних учебных периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов вперед отсчитать относительно переданного ageid. При этом переданный id считается первым.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_previous_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит предшествующий указанному в ageid учебный период&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов назад отсчитать относительно переданного ageid. При этом переданный ageid считается последним.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода или&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''create_period_for_department($deptid, $datebegin, $dateend, $numweeks, $name, $previousid=null)'''====&lt;br /&gt;
&lt;br /&gt;
создаёт период для структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $deptid(int) - id учебного подразделения.&lt;br /&gt;
* $datebegin(int) - время начала периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $dateend(int) - время окончания периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $numweeks(int) - количество недель в учебном периоде.&lt;br /&gt;
* $name(string) - название учебного периода.&lt;br /&gt;
* $previosid(int) - id предыдущего учебного периода или null, если нет предыдущего периода, по умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id созданного периода.&lt;br /&gt;
* bool false - если период создать нельзя.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_ages($select)'''====&lt;br /&gt;
&lt;br /&gt;
находит количество периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $select - критерии отбора записей.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
===='''get_ages_by_idrange($minid, $maxid)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
получаеть список записей по диапазону id&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $minid - минимальный id.&lt;br /&gt;
* $maxid - максимальный id.&lt;br /&gt;
''Возвращает значения:''&lt;br /&gt;
* array - массив записей.&lt;br /&gt;
* bool false - если ни один не найден.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agenum_byageid($startageid, $currentageid, $maxagenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит порядковый номер периода, считая от заданного периода&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $startageid - id периода на котором нужно остановить поиск.&lt;br /&gt;
* $currentageid - id периода, порядковый номер которого нам надо узнать.&lt;br /&gt;
* $maxagenum - максимально возможный порядковый номер периода.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - порядковый номер периода.&lt;br /&gt;
* bool false - если не находит.&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
Надо реализовать удаление периода так: если к периоду ничего не привязано (потоки, подразделения и т.п.), то его можно удалять. Иначе - нельзя.&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы ages.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	<entry>
		<id>http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1944</id>
		<title>Разработка:storages/ages</title>
		<link rel="alternate" type="text/html" href="http://docs.deansoffice.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0:storages/ages&amp;diff=1944"/>
				<updated>2010-11-08T11:25:22Z</updated>
		
		<summary type="html">&lt;p&gt;Puppetmaster: /* Дополнительные методы: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Plugin&lt;br /&gt;
| name = ages&lt;br /&gt;
| type = storages&lt;br /&gt;
}}&lt;br /&gt;
===Таблица в базе данных===&lt;br /&gt;
''ages'' - учебные периоды (учебный год в школе, семестр в ВУЗе). Каждый учебный поток и итоговая отметка по курсу принадлежат какому-то одному учебному периоду.&lt;br /&gt;
&lt;br /&gt;
====Подробный формат полей в таблице:====&lt;br /&gt;
* name - название учебного периода&lt;br /&gt;
* begindate - дата и время начала по UTC&lt;br /&gt;
* enddate  - дата и время окончания по UTC&lt;br /&gt;
* eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, которые помещаются в этом учебном периоде.&lt;br /&gt;
* departmentid - структурное подразделение в таблице [[Разработка:storages/departments | departments ]], объявившее учебный период&lt;br /&gt;
* previousid - предыдущий учебный период&lt;br /&gt;
* status - список статусов указан в одноименном плагине рабочих процессов  [[Разработка:workflows/ages | ages ]]&lt;br /&gt;
&lt;br /&gt;
===Дополнительные методы:===&lt;br /&gt;
&lt;br /&gt;
* '''+''' Получить список текущих учебных периодов для структурного подразделения. Возвращает массив объектов. По умолчанию - все периоды в статусе &amp;quot;идет учебный процесс&amp;quot;. Если второй параметр null - возвращаются все периоды, если строка - периоды в этом статусе, если массив - все периоды в таких статусах. Для удобства нужно сделать заготовку, которая принимает такой параметр и имя sql-колонки и возвращает соответствующий фрагмент sql-запроса - и поместить ее защищенным методом в storage_base.&lt;br /&gt;
* '''+''' Получить id учебного периода, являющегося x по счету после периода с заданным id. При этом x=1 - это сам исходный период (период для &amp;quot;первого класса), x=2 - это период, для которого период x=1 был предыдущим. Метод возвращает id или false, если однозначно установить id периода не удалось.&lt;br /&gt;
* Создать период для структурного подразделения: получает параметры &amp;quot;структурное подразделение&amp;quot;, &amp;quot;дата начала&amp;quot;, &amp;quot;дата конца&amp;quot;, &amp;quot;количество учебных недель&amp;quot;, &amp;quot;название&amp;quot;, &amp;quot;предыдущий период&amp;quot; - по умолчанию 0. Не указывать предыдущий период допускается только если для этого структурного подразделения еще не было создано периодов. Если для периода уже есть один &amp;quot;последующий период&amp;quot;, то больше его указывать в качестве &amp;quot;предыдущего&amp;quot; нельзя. Метод возвращает id созданного периода или false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_department_ages($departmentid, $status='active')'''====&lt;br /&gt;
&lt;br /&gt;
находит список всех или в указанном статусе учебных периодов структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $departmentid(int) - id учебного подразделения в таблице departments.&lt;br /&gt;
* $status(string) - статус учебного периода, или null если нужны периоды с любым статусом, по умолчанию 'active'.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* array - массив объектов из таблицы ages.&lt;br /&gt;
* bool false - если ничего не найдено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_next_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит один из дочерних учебных периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов вперед отсчитать относительно переданного ageid. При этом переданный id считается первым.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_previous_ageid($ageid, $agenum)'''====&lt;br /&gt;
&lt;br /&gt;
находит предшествующий указанному в ageid учебный период&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $ageid(int) - id учебного периода в таблице ages&lt;br /&gt;
* $agenum(int) - сколько периодов назад отсчитать относительно переданного ageid. При этом переданный ageid считается последним.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id периода или&lt;br /&gt;
* bool false - если установить id не удалось&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''create_period_for_department($deptid, $datebegin, $dateend, $numweeks, $name, $previousid=null)'''====&lt;br /&gt;
&lt;br /&gt;
создаёт период для структурного подразделения&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $deptid(int) - id учебного подразделения.&lt;br /&gt;
* $datebegin(int) - время начала периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $dateend(int) - время окончания периода в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].&lt;br /&gt;
* $numweeks(int) - количество недель в учебном периоде.&lt;br /&gt;
* $name(string) - название учебного периода.&lt;br /&gt;
* $previosid(int) - id предыдущего учебного периода или null, если нет предыдущего периода, по умолчанию null.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int - id созданного периода.&lt;br /&gt;
* bool false - если период создать нельзя.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_numberof_ages($select)'''====&lt;br /&gt;
&lt;br /&gt;
находит количество периодов&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $select - критерии отбора записей.&lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* int количество найденных записей.&lt;br /&gt;
&lt;br /&gt;
===='''get_ages_by_idrange($minid, $maxid)'''====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
получаеть список записей по диапазону id&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $minid - минимальный id.&lt;br /&gt;
* $maxid - максимальный id.&lt;br /&gt;
''Возвращает значения:''&lt;br /&gt;
* array - массив записей.&lt;br /&gt;
* bool false - если ни один не найден.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''get_agenum_byageid()'''====&lt;br /&gt;
&lt;br /&gt;
находит порядковый номер периода, считая от заданного периода&lt;br /&gt;
&lt;br /&gt;
''Аргументы:''&lt;br /&gt;
* $startageid - id периода на котором нужно остановить поиск&lt;br /&gt;
* $currentageid - id периода, порядковый номер которого нам надо узнать&lt;br /&gt;
* $maxagenum - максимально возможный номер agenum &lt;br /&gt;
''Возвращаемые значения:''&lt;br /&gt;
* mixed int - agenum&lt;br /&gt;
* bool false - если не находит&lt;br /&gt;
&lt;br /&gt;
===Планы:===&lt;br /&gt;
Надо реализовать удаление периода так: если к периоду ничего не привязано (потоки, подразделения и т.п.), то его можно удалять. Иначе - нельзя.&lt;br /&gt;
===События===&lt;br /&gt;
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.&lt;br /&gt;
====Перехватываемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые перехватывает этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |colspan=5 align=center | ''Этот плагин не перехватывает никаких событий''&lt;br /&gt;
 |}&lt;br /&gt;
====Генерируемые события====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |+ Таблица событий, которые генерирует этот плагин&lt;br /&gt;
 ! Тип плагина&lt;br /&gt;
 ! Код плагина&lt;br /&gt;
 ! Код события&lt;br /&gt;
 ! Доп. данные&lt;br /&gt;
 ! Пояснение&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |insert&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; объект с данными для вставки в таблицу.&lt;br /&gt;
''Пример:'' array('new' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при вставке новой записи в таблицу ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |update&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;new&amp;quot; обновленный объект, и в поле &amp;quot;old&amp;quot; объект со старыми данными, до обновления записи.&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject_old, 'new' =&amp;gt; $dataobject_new)&lt;br /&gt;
 |Генерируется каждый раз при обновлении записи в таблице ages.&lt;br /&gt;
 |-&lt;br /&gt;
 |storage&lt;br /&gt;
 |ages&lt;br /&gt;
 |delete&lt;br /&gt;
 |Массив, содержащий в поле &amp;quot;old&amp;quot; объект с данными, которые удаляются из таблицы&lt;br /&gt;
''Пример:'' array('old' =&amp;gt; $dataobject)&lt;br /&gt;
 |Генерируется каждый раз при удалении записи из таблицы ages.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Разработка]]&lt;br /&gt;
[[Категория:Плагины_storages]]&lt;/div&gt;</summary>
		<author><name>Puppetmaster</name></author>	</entry>

	</feed>