Общие сведения
Каждый месяц мне, как и другим жителям моего многоквартирного дома, приходится проделывать процедуру под названием "заполнение справки о расходах холодной и горячей воды". Данная процедура включает в себя заполнение бланка, в котором указываются: ФИО, номер квартиры, номера счётчиков холодной и горячей воды, предыдущие показания счётчиков холодной и горячей воды, дата подачи предыдущих показаний и, разумеется, текущие показания счётчиков холодной и горячей воды. Вдобавок, бланк заполняется в двух экземплярах. Ясно, что вся информация кроме текущих показаний либо не меняется вообще, либо может быть вычислена на основе уже имеющихся данных, причём эту задачу совсем несложно автоматизировать. Именно этой цели и служит web-приложение meter-webapp. Ещё одна приятная мелочь - email-напоминалка, которая отслеживает подал человек показания счётчиков в текущем месяце или нет.
Краткая техническая информация
- Домашняя страница проекта: http://code.google.com/p/meter-webapp
- Приложение развёрнуто по адресу: http://water.entropyware.info/
- Язык программирования: Perl
- Технология: CGI/Apache
- Шаблонизатор: Template Toolkit
- Хранение данных: Class::DBI/SQLite
Тестирование
- Модульные тесты для всех пользовательских ORM-классов, порождённых от Class::DBI::*
- Тест, проверяющий функционирование ORM-классов в комплексе
- Тест, проверяющий работу web-приложения на самом вернем уровне
Все тесты самостоятельно создают для себя всё необходимое окружение и убирают за собой после завершения. Тесты первых двух типов создают для себя временную БД со всеми необходимыми таблицами. Результат манипуляции с данными проверяется при помощи модуля Test::DatabaseRow.
Функциональный тест также создаёт временную БД, инициализирует её, генерирует конфигурационный файл Apache-а, запускает instance на выделенном порту и полностью имитирует работу нескольких пользователей с сайтом: регистрацию, логин, настройку информации по квартире, подачу показаний и т.д. Все вышеперечисленное осуществляется при помощи модуля Test::WWW::Mechanize. После завершения теста, все временные файлы удаляются.
Если выставить переменную окружения - DONT_CLEANUP, то все временные конфиги, базы данных будут оставлены для ручного изучения и анализа.
На данный момент набор тестов покрывает не все случаи и будет расширяться.
Что дальше
- Если получится, то "распространить среди жильцов нашего ЖЭКа" (C).
- Do TODO

Ух ты! А у нас раз в год приходит дядько, который сам снимает показания со всех водяных и отопительных счётчиков у всех жильцов. Сами снимаем только с электрического - тоже раз в год.
ОтветитьУдалитьИ никаких предыдущих показаний, только текущие. Информацию можно донести следующими способами:
- бесплатной почтовой карточкой
- бесплатным звонком
- е-мейлом
- веб-сайтом
Вот где цивилизация! И наверное ещё формат, в котором подаются эти показания унифицирован, а не так что в каждой управляющей компании свои бланки и свои требования)
ОтветитьУдалитьДа нет, весь формат - это либо белое поле на бланке, либо форма для ввода на сайте. Не знаю, о каком ты формате, но даже способы информирования у разных энергокомпаний разные - у некоторых только открытку можно послать. Моя - типа, продвинутая. На день рождения даже открытки со всякой фигнёй посылают.
ОтветитьУдалить> либо может быть вычислена на основе уже имеющихся данных, причём эту задачу совсем несложно автоматизировать
ОтветитьУдалитьПоследнее кажется не работает. Можно пойти ещё дальше и позволить системе самой интерполировать данные без участия пользователя. Ему останется только раз в месяц кликнуть на "распечатать текущий отчёт" и раз в два-три месяца вводить текущие показания.
Когда человек вводит показания счётчиков впервые, то действительно придётся заполнить все поля формы. Если в базе уже что-то есть, то берётся самая свежая запись с её помощью заполняются почти все поля формы. Т.е. на второй месяц использования вводить нужно только два значения - текущие показания счётчиков ХВ и ГВ.
ОтветитьУдалитьПо поводу интерполяции - неплохая идея, даже до счётчиков ходить не надо :) Надо поднакопить статистики и посмотреть, сколько вообще найдётся желающих.
Можно даже так: всегда заполнять текущие показания средними значениями, а человек, если требуется, может их откорректировать.
ОтветитьУдалитьА можно даже и так: на форме ввода оставить только поле для одной даты (без всяких начал и концов периода) и поля для показаний двух счётчиков. На форме ввода ничего не интерполировать и не подставлять, чтобы не сбивать пользователя.
ОтветитьУдалитьРаспечатку делать на основе имеющихся данных за любой указываемый период. И если на начало либо конец нет точных данных, то интерполиравать их и печатать вверху крупными буквами: "Внимание! Данные на [начало|конец|начало и конец] периода были вычислены на основе данных для других дат и могут быть неточными! Для внесения точных показаний воспользуйтесь формой ввода данных."
> А можно даже и так: на форме ввода оставить только поле для одной даты (без всяких начал и концов периода)
ОтветитьУдалитьДело в том, что если человек не подаст показания счётчиков в период с 25-го числа до последнего дня месяца, то счёт за воду в этом месяце ему будет выставлен по нормативу, а не по фактическим показаниям счётчиков. Соответственно, чтобы не платить за воду второй раз, в следующем месяце нужно будет явно указать показания счётчиков не только на конец периода, но и на начало.
> Дело в том, что если человек не подаст показания счётчиков ...
ОтветитьУдалитьЯ этого не предлагаю. Я предлагаю отказаться от понятия "начало/конец периода" для входных данных. Это понятие здесь искусственно. У счётчика нет начала периода. Есть только показание в момемт времени.
А вот у отчёта есть. Задал интервал - получил отчёт. Надо за месяц - получи за месяц, надо за 5 дней - получи за пять. Не нравятся интерполируемое значение 25-го числа - вводи точное значение на 25 число. Будет ли это концом предыдущего периода или началом следующего - не играет роли.
> Я предлагаю отказаться от понятия "начало/конец периода" для входных данных. Это понятие здесь искусственно.
ОтветитьУдалитьДа, пожалуй искусственно. К тому же, показание на начало периода, как правило, дублирует уже имеющуюся информацию. Проблема в том, что люди зачастую скептически относятся к переменам, даже не успев разобраться в чём же они состоят / не могу полностью исключить себя из их числа :-) /
Пример из жизни: сегодня с утра я беседовал с главным инженером по нашему дому - Мариной. Я показывал ей систему в действии. Я только начал рассказывать про бланк и его избыточность, как она возразила, (1) что да, там много повторяющейся информации, но так требует бухгалтерия и с этим ничего не поделаешь. Я ответил, что всё останется по прежнему и бланк останется таким какой он есть. Потом я сказал, что система доступна через интернет. Марина спросила, (2) а как быть с подписью человека на бланке? Я ответил, что и подпись останется. За этим последовал третий вопрос: (3) а как быть бабушкам и дедушками, которые привыкли "по-старинке"? Я и к этому вопросу был готов - всё просто, новая система не заменяет старую, а только дополняет, никто не заставляет ей пользоваться.
Только после того как Марина убедилась, что новая система полностью backward compatible со старой (даже бланк делается в 2-х экземплярах, чтобы люди могли подшивать корешки в папку) и я беру на себя обязательства по консультированию пользователей, она сказала что всё клёво и наверняка найдутся желающие воспользоваться этой возможностью. В итоге, я заручился её поддержкой и содействием в плане распространения "агитационных материалов" через диспетчерскую службу и информационные стенды.
После этого разговора, я понял, что чем меньше новая система будет отличаться от того к чему люди привыкли за полтора года заполнения бланков, как в плане использования так и в плане конечного результата, тем меньше будет у них внутреннего сопротивления и вопросов в "службу поддержки" :)
Если пользователь зайдёт на сайт, который позиционирует себя как drop-in replacement и не найдёт на форме подачи показаний полей "Начало периода/Конец периода", которые он заполнял на протяжении полутора лет, то у него наверняка возникнут вопросы (у меня бы точно возникли). Возможно пользователь почитает документацию, в которой будет написано, что значения интерполируются (не уверен, что все знают что это такое) автоматически. Возможно он напишет мне письмо. А может просто бросит и вернётся к тому что ему знакомо. Лично я бы почитал доку, но многие просто не станут тратить время, хотя оно бы и окупилось.
Интерполяция значений пригодится, когда у меня дойдут руки сделать визуализацию данных о потреблении воды в виде графика.
добрый день! У нас по 2 счетчика ХВ и ГВ (всего 4), а система позволяет ввести только по одному значению. Как можно добавить по второму счетчику ГВ и ХВ? Большое спасибо!
ОтветитьУдалитьДобрый день Наталья!
ОтветитьУдалитьК сожалению, на данный момент эта возможность не реализована. Как временное решение, можно завести второй аккаунт и вторую пару счётчиков вести там. Но предварительно лучше позвонить в бухгалтерию УК (их телефон есть на квитанции на оплату ЖКУ) и спросить как они отнесутся к двум бланкам.
Я со своей стороны буду иметь в виду, что уже второй человек обратился с подобной просьбой и в очередной итерации разработки приложения постараюсь это сделать.