Участник:ArmorAdmin/Распределение судебных дел — различия между версиями
м (→Метод 3. Случайное распределение с учётом нагрузки) |
м (LostArtilleryMan переименовал страницу Участник:ГОВНЮК/Распределение судебных дел в Участник:ArmorAdmin/Распределение судебных дел поверх пере…) |
||
(не показано 13 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
− | + | {{DISPLAYTITLE:Распределение судебных дел}} | |
{{Библиография | {{Библиография | ||
− | |Автор = [[Участник:ArmorAdmin|Чобиток Василий]], 30 ноября 2009 г. | + | |Автор = [[Участник:ArmorAdmin|Чобиток Василий]], 30 ноября — 3 декабря 2009 г. |
|Источник = | |Источник = | ||
|Добавил = | |Добавил = | ||
− | }} | + | }}<href rel="author" href="https://plus.google.com/107836225500495979443/" target="blank" style="display: none;">G+</href> |
+ | |||
+ | : ''Данная статья отражает личное мнение человека, посвятившего достаточно большую часть своей трудовой деятельности вопросам автоматизации судов Украины.'' | ||
+ | : ''В этой статье. О юридически-правовых и организационных вопросах, связанных с распределением судебных дел, поступающих в суды. О реализации распределения в программном коде. Наглядно демонстрируется что проблема «сто́ит» не человеко-месяцы и человеко-годы, а считанные человеко-часы. Приведённые примеры кода программы могут быть непонятны широкому кругу читателей, но оценить минимальный объём кода, решающего поставленную задачу, по плечу любому.'' | ||
== Часть 1. Юридически-историческая == | == Часть 1. Юридически-историческая == | ||
Строка 57: | Строка 60: | ||
«Стой там, иди сюда!» | «Стой там, иди сюда!» | ||
− | Всё таки, какой принцип использовать? Распределять поочерёдно или случайно? Невинное терминологическое уточнение «профессиональным невеждой», который не очень-то и пытался вникнуть в суть, в предметную область. В первом чтении принцип распределения был расписан в третьей части статьи, рецензент не вник, споткнулся на первом упоминании понятия «распределение» и, как положено, дал ему | + | Всё таки, какой принцип использовать? Распределять поочерёдно или случайно? Невинное терминологическое уточнение «профессиональным невеждой», который не очень-то и пытался вникнуть в суть, в предметную область. В первом чтении принцип распределения был расписан в третьей части статьи, рецензент не вник, споткнулся на первом упоминании понятия «распределение» и, как положено, дал ему уточнение (ведь кто-то ж может не понять!) — распределять последовательно. А в третьей части статьи так и остался случайный принцип! |
'''Вывод:''' Формально закон невыполним, в нём заложено два взаимоисключающих принципа распределения. В реальности человек, который будет исполнять закон, должен будет сознательно пойти на определённый компромисс. Главное, чтобы он понимал, в чём этот компромисс состоит. | '''Вывод:''' Формально закон невыполним, в нём заложено два взаимоисключающих принципа распределения. В реальности человек, который будет исполнять закон, должен будет сознательно пойти на определённый компромисс. Главное, чтобы он понимал, в чём этот компромисс состоит. | ||
Строка 77: | Строка 80: | ||
Вот зачем нужно распределение дел — для оптимизации и упрощения работы суда, уменьшения затрат, повышения сервиса для «клиентов» суда. Именно это в первую очередь приближает суд к простым людям, делает его доступным, а не эфемерная борьба с коррупцией. Вы думаете с «чистыми руками» коррупция снизилась? Нет! Просто возросла «цена вопроса». | Вот зачем нужно распределение дел — для оптимизации и упрощения работы суда, уменьшения затрат, повышения сервиса для «клиентов» суда. Именно это в первую очередь приближает суд к простым людям, делает его доступным, а не эфемерная борьба с коррупцией. Вы думаете с «чистыми руками» коррупция снизилась? Нет! Просто возросла «цена вопроса». | ||
− | Давайте представим, мы приходим к председателю суда и говорим: «Ты — коррупционер! Поэтому мы будем внедрять в твоём суде автоматизированное распределение!». Этот председатель если не скажет, то подумает: «дебилы, просто дебилы». И автоматизированное распределение у него в суде нормально никогда не заработает. Предложи | + | Давайте представим, мы приходим к председателю суда и говорим: «Ты — коррупционер! Поэтому мы будем внедрять в твоём суде автоматизированное распределение!». Этот председатель если не скажет, то подумает: «дебилы, просто дебилы». И автоматизированное распределение у него в суде нормально никогда не заработает, ведь если председатель не коррупционер, то распределение для борьбы с коррупцией ему ни к чему, а если коррупционар — тем более. Предложи председателю ежедневно экономить несколько часов его работы, разгрузить суд от толп посетителей и он будет счастлив такой фантастической перспективе. |
− | Критиканство штука хорошая, а могу ли я предложить что-то конкретное? Могу. Собственно поэтому | + | Критиканство штука хорошая, а могу ли я предложить что-то конкретное? Могу. Собственно поэтому и затеял эту статью. |
Я могу продемонстрировать, что автоматизация распределения судей не требует сверхусилий и тысяч строк программного кода. | Я могу продемонстрировать, что автоматизация распределения судей не требует сверхусилий и тысяч строк программного кода. | ||
Строка 359: | Строка 362: | ||
'''Время на реализацию:''' 10 мин | '''Время на реализацию:''' 10 мин | ||
− | На самом деле со временем на реализацию я немного утрировал. Если в системе делопроизводства нет поправочных коэффициентов для административных должностей, которые могут занимать судьи, то следует добавить в структуру базы данных соответствующее поле и заполнить его значениями. Но, а в тестовом примере на реализацию ушло меньше 10 | + | На самом деле со временем на реализацию я немного утрировал. Если в системе делопроизводства нет поправочных коэффициентов для административных должностей, которые могут занимать судьи, то следует добавить в структуру базы данных соответствующее поле и заполнить его значениями. Но, а в тестовом примере на реализацию ушло меньше 10 минут. |
− | Как учитываются должностные обязанности? Например, председатель суда кроме обязанностей судьи выполняет дополнительные функции, связанные с руководством судом. Допустим, что на управленческие функции у него уходит 40 % времени (число взято с потолка, для примера). Это означает, что будучи обычным судьёй он мог бы рассматривать на 40 % дел больше, чем в роли председателя. Таким образом, если у председателя сейчас 100 дел, то они соответствуют 140 делам обычного судьи. Соответственно, при распределении необходимо дела судей умножать на коэффициент, который | + | Как учитываются должностные обязанности? Например, председатель суда кроме обязанностей судьи выполняет дополнительные функции, связанные с руководством судом. Допустим, что на управленческие функции у него уходит 40 % времени (число взято с потолка, для примера). Это означает, что будучи обычным судьёй он мог бы рассматривать на 40 % дел больше, чем в роли председателя. Таким образом, если у председателя сейчас 100 дел, то они соответствуют 140 делам обычного судьи. Соответственно, при распределении необходимо дела судей умножать на некий коэффициент, который учитывал бы их обязанности (в данном случае для председателя — 1.4). |
Сама программная реализация предельно проста — берём предыдущий пример и добавляем всего одну строчку: | Сама программная реализация предельно проста — берём предыдущий пример и добавляем всего одну строчку: | ||
Строка 374: | Строка 377: | ||
</source> | </source> | ||
− | На самом деле с точки зрения правильного проектирования решение не совсем верное, но, во-первых, проектирование не тема данной статьи, во-вторых, любой уважающий себя программист | + | На самом деле с точки зрения правильного проектирования решение не совсем верное, но, во-первых, проектирование не тема данной статьи, во-вторых, любой уважающий себя программист может сделать правильно в качестве домашнего задания (хотя, и так работает). |
=== Учитываем специализацию === | === Учитываем специализацию === | ||
+ | |||
+ | '''Время на реализацию:''' 1 час | ||
+ | |||
+ | '''Ссылка на рабочий пример:''' http://armor.kiev.ua/court/prof.php?method=randombalance | ||
На первый взгляд эта задача может показаться сложной. Если подумать, верно применить инкапсуляцию, то с минимальной доработкой можно учесть специализацию судей и, при этом, реализованные ранее алгоритмы даже не будут затронуты! | На первый взгляд эта задача может показаться сложной. Если подумать, верно применить инкапсуляцию, то с минимальной доработкой можно учесть специализацию судей и, при этом, реализованные ранее алгоритмы даже не будут затронуты! | ||
− | { | + | Для начала создадим тестовые данные. В файл <code>params.php</code> добавляем такие настройки: |
+ | |||
+ | <source lang="php"> | ||
+ | $params['isProf'] = true; // учитывать при распределении специализацию судьи | ||
+ | |||
+ | /** | ||
+ | * Коды категорий дел | ||
+ | */ | ||
+ | $params['profName'] = array ( | ||
+ | '1' => 'криминальное дело', | ||
+ | '2' => 'гражданское дело', | ||
+ | '2-а' => 'административное дело', | ||
+ | '3' => 'административное правонарушение', | ||
+ | ); | ||
+ | |||
+ | /** | ||
+ | * Код категории дела и перечень кодов судей, | ||
+ | * которые могут рассматривать дела этой категории | ||
+ | */ | ||
+ | $params['prof'] = array ( | ||
+ | '1' => array ('02', '04', '05'), | ||
+ | '2' => array ('01', '02', '03', '06'), | ||
+ | '2-а' => array ('01', '04', '05'), | ||
+ | '3' => array ('01', '02', '03', '05', '06'), | ||
+ | ); | ||
+ | |||
+ | </source> | ||
+ | |||
+ | Категории дел даны для примера. В реальности может быть задан большой и разветвлённый справочник, но сам алгоритм от этого не изменится. | ||
+ | |||
+ | Как ранее было указано, чтобы учесть специализацию не требуется изменять уже разработанные алгоритмы. У нас есть метод <code>isPresence</code> класса <code>distribution</code>, определяющий доступность судьи для распределения. Доработаем его. Проведём небольшой рефакторинг предыдущей реализации этого метода и добавим проверку на соответствие специализации судьи поступившему делу. Получим следующий код: | ||
+ | |||
+ | <source lang="php"> | ||
+ | public function isPresence ($arbiter) { | ||
+ | global $params; | ||
+ | /* доступность по рабочему календарю (упрощённый пример) */ | ||
+ | if (!empty($arbiter['holiday']) and ($arbiter['holiday'] <= $params['holidayInterval'])) | ||
+ | return false; | ||
+ | /* доступность по специализации */ | ||
+ | if (($params['isProf']) and | ||
+ | isset($this->caseType) and | ||
+ | !in_array($arbiter['code'], $params['prof'][$this->caseType])) | ||
+ | return false; | ||
+ | return true; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | == Заключение == | ||
+ | |||
+ | Как было продемонстрировано, проблема распределения судебных дел таковой не является. Если вникнуть, понять что нужно сделать, то реализовать алгоритм распределения можно за пару рабочих дней. Ещё от силы неделя нужна на разработку интерфейса администратора для настройки системы распределения. Округлим до двух недель. Добавим два-три месяца на организационно-управленческие мероприятия… | ||
+ | |||
+ | Так почему же в нашем государстве '''это''' до сих пор остаётся проблемой? | ||
== Примечания == | == Примечания == | ||
<references /> | <references /> | ||
− | [[Категория:Личные заметки]] | + | [[Категория:Личные заметки|Распределение судебных дел]] |
+ | [[Категория:Программная инженерия|Распределение судебных дел]] |
Текущая версия на 05:47, 20 декабря 2015
- Автор(ы): Чобиток Василий, 30 ноября — 3 декабря 2009 г.
- Данная статья отражает личное мнение человека, посвятившего достаточно большую часть своей трудовой деятельности вопросам автоматизации судов Украины.
- В этой статье. О юридически-правовых и организационных вопросах, связанных с распределением судебных дел, поступающих в суды. О реализации распределения в программном коде. Наглядно демонстрируется что проблема «сто́ит» не человеко-месяцы и человеко-годы, а считанные человеко-часы. Приведённые примеры кода программы могут быть непонятны широкому кругу читателей, но оценить минимальный объём кода, решающего поставленную задачу, по плечу любому.
Содержание
Часть 1. Юридически-историческая
Неделю назад открыл новый закон, которым с 1 января 2010 года вносятся изменения в Кодекс административного судопроизводства Украины в связи с внедрением автоматизированной системы делопроизводства[1]. Открыл, просмотрел и выпал в осадок…
В начале этого года руководство попросило меня проанализировать новый законопроект, посвященный внедрению автоматизированной системы документооборота в административных судах Украины[2].
После анализа сообщил:
Замечание у меня одно, но принципиальное. Вот это: «Справи розподіляються незалежно від спеціалізації суддів[3]» — категорически неверно. Должно быть: «Справи розподіляються в залежності від спеціалізації суддів[4]» или вообще убрать эту фразу.
Руководство даже как-то вроде обиделось — замечаний мало. Ну и что ж, что мало? В целом законопроект нормальный, адекватный, но только одно это замечание может перечеркнуть всю его ценность. Распределять судебные дела независимо от специализации судей глупо и категорически неверно, всё равно что на заводе поступившие заказы распределять независимо от специализации рабочих — фрезеровщику подкинуть токарную работу, токарю — ковку, а жестянщику предложить литьё.
Современный суд подобен фабрике: тысячи дел, поступающих в суд за один месяц, десятки дел, поступающих к судье за один день, требуют максимальной оптимизации и интенсификации работы суда в целом и каждого судьи в отдельности.
Специализация — один из путей оптимизации работы судьи. В самом деле, вместо того, чтобы вникать в огромное число всевозможных законодательных актов, рассматривая разнородные дела, судья, специализирующийся на делах определённой категории, досконально изучает и знает законодательную базу и судебную практику по своей специализации. Как результат, качество рассмотрения дел выше, вероятность судебной ошибки и трудозатраты ниже.
Кроме меня этот законопроект давали на анализ толпе юристов. Лучше бы этого не делали. Юристы, они в большинстве своём как журналисты — профессиональные невежды. Нет, моё замечание про специализацию на удивление было учтено, но вот другие изменения и дополнения, внесенные «профессиональными невеждами», при прочтении принятого закона и заставили меня выпасть в осадок.
Итак, в Кодекс административного судопроизводства добавлена статья 15-1 «Автоматизированная система документооборота суда», в части 1 статьи перечислен ряд пунктов, среди которых интересны 1) и 6):
1. В адміністративних судах функціонує автоматизована система документообігу суду, що забезпечує: 1) об'єктивний та неупереджений розподіл справ між суддями з додержанням принципів черговості та однакової кількості справ для кожного судді; ... 6) розподіл справ між суддями;
Тавтология, масло масляное, металлическая железяка… Я понимаю, что «повторение — мать учения», но зачем в законе в одном пункте повторять то, что уже было сказано ранее в другом?
Далее, в п. 1) части 1 статьи 15-1 первого чтения законопроекта было написано: «об’єктивний та неупереджений розподіл справ між суддями[5]». В принятом законе добавлено: «з додержанням принципів черговості та однакової кількості справ». Вроде бы ничего такого, типичная фишка юриста даже самому простому термину давать уточнения[6], вот только как это уточнение согласуется с частью 3 данной статьи?
3. Визначення судді або колегії суддів для розгляду конкретної справи здійснюється автоматизованою системою документообігу суду під час реєстрації відповідних документів за принципом вірогідності, який враховує кількість справ, що перебувають на розгляді у суддів...
Итого получаем, что в соответствии с законом дела распределяются:
- с соблюдением принципа очерёдности и одинакового количества дел;
- в соответствии с принципом вероятности, который учитывает количество дел, находящихся в рассмотрении у судьи.
«Стой там, иди сюда!»
Всё таки, какой принцип использовать? Распределять поочерёдно или случайно? Невинное терминологическое уточнение «профессиональным невеждой», который не очень-то и пытался вникнуть в суть, в предметную область. В первом чтении принцип распределения был расписан в третьей части статьи, рецензент не вник, споткнулся на первом упоминании понятия «распределение» и, как положено, дал ему уточнение (ведь кто-то ж может не понять!) — распределять последовательно. А в третьей части статьи так и остался случайный принцип!
Вывод: Формально закон невыполним, в нём заложено два взаимоисключающих принципа распределения. В реальности человек, который будет исполнять закон, должен будет сознательно пойти на определённый компромисс. Главное, чтобы он понимал, в чём этот компромисс состоит.
Часть 2. Распределение — я так вижу
Поскольку по направлению автоматизации делопроизводства и документооборота судов с небольшими перерывами я работаю с 1999 года, то считаю себя вправе высказать собственное мнение по вопросу распределения судебных дел.
В различной валюте десятки и сотни тысяч государственных и средств зарубежных доноров за последние годы потрачено на всевозможные мероприятия. Семинары и конференции на всех уровнях, периодически наезжающие консультанты из-за океана, поездки по обмену опытом, тендеры на создание пилотных проектов программ, внедрение пилотных программ в модельных и пилотных судах… Много шума из ничего — результат почти нулевой.
Как я продемонстрирую далее, вопрос не сто́ит и выеденного яйца — времени и сил для его решения требуется мизер. На самом деле проблема в том, что задачу решают не те люди и не с теми целями. Когда задачу распределения судебных дел загоняют в проекты вроде «Вызовы тысячелетия» с целью борьбы со «всепожирающей» коррупцией в судебной системе, а параллельно «чисті руки» запускают свои клешни в эту систему, наполняя сосуд правосудия мутной водичкой… Не может автоматизация распределения судебных дел решить проблему коррупции. Не может и не должна.
Так зачем же пресловутое распределение необходимо?
Решить к какому судье попадёт поступившее дело — управленческая функция. И некоторые председатели судов воспринимают это буквально, ведь если он — председатель, то есть управленец, то он и должен принимать решение, накладывать резолюцию по каждому поступившему делу. Это занимает у председателя часы работы, он привлекает к этой задаче других управленцев — своего заместителя, руководителя аппарата суда. Такие председатели работают как управленец-функционер и я считаю такую модель работы крайне неудачной, она ведёт к значительным потерям времени и низкой эффективности работы суда.
Есть председатели судов, которые считают, что управленец должен определять стратегию и методологию. Так, определив порядок распределения дел, закрепив его приказом по суду, они делегируют свою «управленческую» функцию распределения работникам аппарата. Путь судебного дела сокращается в разы, ведь кто будет судьёй по делу и даже на когда назначено предварительное заседание становится известно уже в момент регистрации судебного дела. Можете себе представить, вы обращаетесь в суд с иском и тут же, не отходя от окошка вам сообщают, что судья такой-то, дата, время и место заседания такие-то. Фантастика? В некоторых, к сожалению, далеко немногих судах, это реальность!
Вот зачем нужно распределение дел — для оптимизации и упрощения работы суда, уменьшения затрат, повышения сервиса для «клиентов» суда. Именно это в первую очередь приближает суд к простым людям, делает его доступным, а не эфемерная борьба с коррупцией. Вы думаете с «чистыми руками» коррупция снизилась? Нет! Просто возросла «цена вопроса».
Давайте представим, мы приходим к председателю суда и говорим: «Ты — коррупционер! Поэтому мы будем внедрять в твоём суде автоматизированное распределение!». Этот председатель если не скажет, то подумает: «дебилы, просто дебилы». И автоматизированное распределение у него в суде нормально никогда не заработает, ведь если председатель не коррупционер, то распределение для борьбы с коррупцией ему ни к чему, а если коррупционар — тем более. Предложи председателю ежедневно экономить несколько часов его работы, разгрузить суд от толп посетителей и он будет счастлив такой фантастической перспективе.
Критиканство штука хорошая, а могу ли я предложить что-то конкретное? Могу. Собственно поэтому и затеял эту статью.
Я могу продемонстрировать, что автоматизация распределения судей не требует сверхусилий и тысяч строк программного кода.
К сожалению то, что я говорил о юристах, редактировавших законопроект, то же самое можно сказать и о современных программистах. Они не хотят вникать в суть, любая предметная область вне их интересов, интересен программный код сам по себе. А как по мне, интересна предметная область, отраженная в программном коде.
Чтобы продемонстрировать, что распределение может быть реализовано минимальными усилиями человека, вникнувшего в суть задачи, я решил накидать несколько работающих прототипов системы распределения с использованием разных алгоритмов распределения.
Часть 3. Программная реализация
Автоматизированная система распределения не должна быть программой «сама в себе». Отдельное приложение «Распределение» смысла не имеет. В любом случае это должен быть модуль системы автоматизированного документооборота суда.
Система распределения — чёрный ящик, который на вход получает от системы делопроизводства все необходимые для распределения данные, а на выходе выдаёт судью (код судьи) на которого распределено поступившее дело.
Для демонстрации того, как может работать система распределения примем следующие допущения и начальные условия:
- такая система делается в рамках существующей системы автоматизированного документооборота, в которой уже есть: справочник судей, категорирование судебных дел, элементы работы с документами, известно число находящихся в производстве у судей дел, информация о присутствии судьи на работе (периоды отпусков, командировки и т.п.);
- взаимодействие с системой делопроизводства имитируется созданием нескольких массивов с тестовыми данными. Считается, что такие массивы полноценная система распределения должна получать в рамках системы, в которую она интегрирована;
- распределять дела на судей, которым до отпуска осталось пять и менее дней, не допускается (число дней условное, в промышленной системе оно должно быть настраиваемым);
- делаем вид, что система уже работала ранее и последним судебное дело получил судья Денисов (см. таблицу ниже);
- для простоты демонстрации через web примеры пишутся на языке PHP, а взаимодействие с пользователем происходит через обычный web-интерфейс в браузере.
Тестовые данные
Код | Фамилия | Должность | До отпуска, дн. | Всего дел | Закрыто | В производстве |
---|---|---|---|---|---|---|
01 | Андреев | судья | 134 | 99 | 35 | |
02 | Борисов | заместитель председателя | 3 | 100 | 50 | 50 |
03 | Васильев | судья | 6 | 200 | 125 | 75 |
04 | Гришин | председатель | 90 | 78 | 12 | |
05 | Денисов | судья | 180 | 145 | 35 | |
06 | Елизаров | судья | 170 | 152 | 18 |
Файл params.php
с тестовыми данными имеет вид:
<?php
$params['arbiters'] = array (
array (
'code' => '01',
'name' => 'Андреев',
'holiday' => '',
'post' => '0',
'casesAll' => '134',
'casesClose' => '99',
),
/**
* остальные судьи заданы аналогично
* весь массив см. в таблице выше
*/
);
$params['post'] = array ( 'судья', 'заместитель председателя', 'председатель' ); // должности
$params['postK'] = array ( 1, 1.2, 1.4 ); // коэффициент, учитывающий должность при распределении
$params['method'] = 'serial'; // serial, random, randombalance - текущий метод распределения
$params['last'] = 4;
$params['holidayInterval'] = 5; // дней до отпуска без распределения
В этом файле некоторые настройки заданы на будущее.
Метод 1. Распределение в порядке очерёдности
Время на реализацию: 3 часа (с учетом времени на создание тестовых данных и проектирование системы для обеспечения дальнейшего подключения других алгоритмов распределения).
Ссылка на рабочий пример: http://armor.kiev.ua/court/?method=serial
Суть метода заключается в том, что судьи выстроены в очередь и каждое новое поступившее дело распределяется следующему в очереди судье. При этом, предусмотрена функция проверки доступности судьи для распределения. Если судья в распределении не участвует, он пропускается. Метод распределения в порядке очерёдности предусмотрен в частности текущей редакцией Кодекса административного судопроизводства.
Файл distribution.php
содержит класс distribution
, отвечающий за распределение судей. Сам класс не содержит в себе алгоритм распределения. Для обеспечения возможности подключать другие алгоритмы первый алгоритм serial
инкапсулирован (используем шаблон проектирования Strategy).
<?php
/**
* Определение класса distribution
* отвечает за распределение дел между судьями
*/
include_once ('params.php');
class distribution {
public $arbiters, $last, $method;
function __construct() {
global $params;
$this->arbiters = $params['arbiters'];
$this->last = $params['last'];
$this->method = $params['method'];
}
/* доступность судьи для распределения */
public function isPresence ($arbiter) {
global $params;
return empty($arbiter['holiday']) or ($arbiter['holiday'] > $params['holidayInterval']);
}
/* число доступных для распределения судей */
public function presenceCount () {
$counter = 0;
foreach ($this->arbiters as $arb) {
if ($this->isPresence ($arb)) $counter++;
}
return $counter;
}
/* вызвать распределение. Возвращает судью, на которого распределено дело */
public function distribut () {
if ($this->presenceCount () == 0) return false;
$method = new $this->method ();
$this->last = $method->distribut($this);
$this->arbiters[$this->last]['casesAll']++;
return $this->arbiter ();
}
/* последний судья, на которого пришлось распределение */
function arbiter () {
return $this->arbiters[$this->last];
}
}
Файл serial.php
— наш первый алгоритм распределения.
<?php
/**
* Алгоритм распределения судей в порядке очерёдности
*/
class serial {
function distribut ($distributor) {
$last = $distributor->last;
do {
$last++;
if ($last >= count($distributor->arbiters)) {
$last = 0;
}
if ($distributor->isPresence($distributor->arbiters[$last])) {
return $last;
}
} while (true);
}
}
Метод 2. Случайное распределение
Время на реализацию: 1 час (с учетом некоторого рефакторинга ранее написанного кода).
Ссылка на рабочий пример: http://armor.kiev.ua/court/?method=random
Чисто случайное распределение в судах, как правило, не используется, но это возможный вариант. Суть метода в том, что выбирается список судей, которым на текущий момент можно распределить, после чего требуемый судья выбирается из этого списка случайно.
Файл random.php
<?php
/**
* Алгоритм случайного распределения судей
*/
class random {
function distribut ($distributor) {
$validList = array ();
foreach ($distributor->arbiters as $key => $arb) {
if ($distributor->isPresence ($arb)) $validList[] = $key;
}
return $validList[array_rand($validList)];
}
}
Делов-то. Новый метод добавлен с использованием шести строчек программного кода. Чтобы он заработал в файле настройки необходимо установить значение $params['method'] = 'random'
.
Метод 3. Случайное распределение с учётом нагрузки
Время на реализацию: 1 час
Ссылка на рабочий пример: http://armor.kiev.ua/court/?method=randombalance
Как и в предыдущем методе, здесь распределение происходит только для дозволенного списка судей.
Этот вариант распределения соответствует ч. 3 ст. 15-1, которая вводится новым законом. Принцип распределения здесь определяется как вероятностный (то есть случайный), но с учетом числа дел, находящихся на рассмотрении у судей. От этого положения многие впадают в ступор: как это случайно, но с учётом числа дел? — или случайно, или с учётом числа…
На самом деле случайность с учётом числа дел легко пояснить. Давайте представим, что у меня четыре дела, а у вас — шесть. К кому должно попасть новое дело? С учетом числа дел, конечно ко мне. Однако, процесс должен быть случайным. Для этого, по числу дел я беру четыре монеты, а вы — шесть. Трясём и бросаем свои монеты. Новое дело должно попасть к тому, у кого выпадет меньше орлов (если поровну — бросаем заново). У кого вероятнее всего выпадет меньше орлов? У меня, так как монет у меня меньше и выпасть может от 0 до 4 орлов, а у вас — от 0 до 6. У меня математическое ожидание μ = 2, а у вас — μ = 3, то есть то, что дело попадёт скорее ко мне, чем к вам составляет 3 к 2 или 1.5 к 1. А если у меня всего одно дело? Тогда у меня μ = 0.5, то есть вероятность распределить ко мне — 6 к 1, но гарантии того, что новое дело попадёт ко мне всё равно нет!
Таким образом, возможность распределить новое дело судье с меньшей нагрузкой выше, и чем меньше дел у судьи, тем выше такая возможность. Однако, эта возможность всё равно случайна.
Собственно, эти положения и реализуют восемь строчек кода приведённого ниже алгоритма.
Файл randombalance.php
:
<?php
/**
* Алгоритм случайного распределения судей
* с учетом числа дел, находящихся в производстве
*/
class randombalance {
function distribut ($distributor) {
$validList = array ();
foreach ($distributor->arbiters as $key => $arb) {
if ($distributor->isPresence ($arb)) {
$cases = $arb['casesAll'] - $arb['casesClose'];
$validList[$key] = rand(0, $cases);
}
}
asort($validList);
reset($validList);
return key($validList);
}
}
Учитываем должностные обязанности
Время на реализацию: 10 мин
На самом деле со временем на реализацию я немного утрировал. Если в системе делопроизводства нет поправочных коэффициентов для административных должностей, которые могут занимать судьи, то следует добавить в структуру базы данных соответствующее поле и заполнить его значениями. Но, а в тестовом примере на реализацию ушло меньше 10 минут.
Как учитываются должностные обязанности? Например, председатель суда кроме обязанностей судьи выполняет дополнительные функции, связанные с руководством судом. Допустим, что на управленческие функции у него уходит 40 % времени (число взято с потолка, для примера). Это означает, что будучи обычным судьёй он мог бы рассматривать на 40 % дел больше, чем в роли председателя. Таким образом, если у председателя сейчас 100 дел, то они соответствуют 140 делам обычного судьи. Соответственно, при распределении необходимо дела судей умножать на некий коэффициент, который учитывал бы их обязанности (в данном случае для председателя — 1.4).
Сама программная реализация предельно проста — берём предыдущий пример и добавляем всего одну строчку:
/* так было */
$cases = $arb['casesAll'] - $arb['casesClose'];
/* так стало */
$cases = $arb['casesAll'] - $arb['casesClose'];
$cases = (integer) ($params['postK'][$arb['post']] * $cases);
На самом деле с точки зрения правильного проектирования решение не совсем верное, но, во-первых, проектирование не тема данной статьи, во-вторых, любой уважающий себя программист может сделать правильно в качестве домашнего задания (хотя, и так работает).
Учитываем специализацию
Время на реализацию: 1 час
Ссылка на рабочий пример: http://armor.kiev.ua/court/prof.php?method=randombalance
На первый взгляд эта задача может показаться сложной. Если подумать, верно применить инкапсуляцию, то с минимальной доработкой можно учесть специализацию судей и, при этом, реализованные ранее алгоритмы даже не будут затронуты!
Для начала создадим тестовые данные. В файл params.php
добавляем такие настройки:
$params['isProf'] = true; // учитывать при распределении специализацию судьи
/**
* Коды категорий дел
*/
$params['profName'] = array (
'1' => 'криминальное дело',
'2' => 'гражданское дело',
'2-а' => 'административное дело',
'3' => 'административное правонарушение',
);
/**
* Код категории дела и перечень кодов судей,
* которые могут рассматривать дела этой категории
*/
$params['prof'] = array (
'1' => array ('02', '04', '05'),
'2' => array ('01', '02', '03', '06'),
'2-а' => array ('01', '04', '05'),
'3' => array ('01', '02', '03', '05', '06'),
);
Категории дел даны для примера. В реальности может быть задан большой и разветвлённый справочник, но сам алгоритм от этого не изменится.
Как ранее было указано, чтобы учесть специализацию не требуется изменять уже разработанные алгоритмы. У нас есть метод isPresence
класса distribution
, определяющий доступность судьи для распределения. Доработаем его. Проведём небольшой рефакторинг предыдущей реализации этого метода и добавим проверку на соответствие специализации судьи поступившему делу. Получим следующий код:
public function isPresence ($arbiter) {
global $params;
/* доступность по рабочему календарю (упрощённый пример) */
if (!empty($arbiter['holiday']) and ($arbiter['holiday'] <= $params['holidayInterval']))
return false;
/* доступность по специализации */
if (($params['isProf']) and
isset($this->caseType) and
!in_array($arbiter['code'], $params['prof'][$this->caseType]))
return false;
return true;
}
Заключение
Как было продемонстрировано, проблема распределения судебных дел таковой не является. Если вникнуть, понять что нужно сделать, то реализовать алгоритм распределения можно за пару рабочих дней. Ещё от силы неделя нужна на разработку интерфейса администратора для настройки системы распределения. Округлим до двух недель. Добавим два-три месяца на организационно-управленческие мероприятия…
Так почему же в нашем государстве это до сих пор остаётся проблемой?
Примечания
- ↑ Закон України Про внесення змін до деяких законодавчих актів України щодо запровадження автоматизованої системи документообігу в адміністративних судах. URL: http://zakon1.rada.gov.ua/cgi-bin/laws/main.cgi?nreg=1475-17
- ↑ Проект Закона України Про внесення змін до деяких законодавчих актів України щодо запровадження автоматизованої системи документообігу в адміністративних судах. URL: http://gska2.rada.gov.ua/pls/zweb_n/webproc34?id=&pf3511=34950&pf35401=138959 (MS Word)
- ↑ укр. Дела распределяются независимо от специализации судей.
- ↑ укр. Дела распределяются в зависимости от специализации судей.
- ↑ укр. объективное и беспристрастное распределение дел между судьями
- ↑ Типичный юрист пишет примерно так: «А это весёлая птица-синица, Которая ловко ворует пшеницу, Которая в тёмном чулане хранится В доме, Который построил Джек.»