/fortnet-php

Проходы по пропуску

Primary LanguagePHP

Система пропусков

Система пропусков показывает проходы по пропуску и позволяет выгрузить эти записи в Excel.

pic1 pic2

Порядок регистрации прохода (§1)

  1. пропуск прислоняют к датчику
  2. датчик отправляет команду системе Fortnet
  3. система Fortnet записывает проход в БД (Firebird)

Порядок загрузки страницы со статистикой проходов (§2)

  1. браузер отправляет запрос на сервер
  2. сервер вызывает php и просит его выполнить файл index.php
  3. файл index.php подключает другие файлы и настраивает среду выполнения
  4. по условиям запроса определяется, какой контроллер и какое действие надо вызвать
  5. условия запроса выступает в роли фильтров выборки данных из БД
  6. получение данных из БД
  7. при необходимости: обработка данных, группировка
  8. отправка результата браузеру

Порядок выгрузки данных для Excel (§3)

  • формирование файла Excel на сервере с Ruby (см. extra/ruby/)

    1. браузер отправляет запрос на сервер с Ruby
    2. скрипт на Ruby вызывает API этой системы для получения статистики проходов
    3. шаги 2-7 (§2)
    4. отправка результата на сервер с Ruby
    5. формирование файла Excel с данными и стилями
    6. отправка файла браузеру
  • формирование файла Excel в этой системе

    1. шаги 1-7 (§2)
    2. формирование файла Excel с данными и стилями
    3. отправка файла браузеру

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

Настройка (§4)

Кодировка

Кодировка по умолчанию - UTF-8. Можно поставить cp1251:

  1. Заменить "AddDefaultCharset utf-8" на "AddDefaultCharset windows-1251" в файле .htaccess
  2. Изменить кодировку файла config/texts.ini на windows-1251 (может встречаться в программах под названием ANSI)
  3. Добавить/изменить параметр "encoding" в файле config/database.php

Названия кодировок в Firebird

База данных

Настройки подключения к БД находятся в файле config/database.php

Режим отладки

По умолчанию при возникновении ошибки появляется сообщение с подробной информацией, в том числе с названиями выполняемых файлов. Вы можете отключить это, изменив параметр debug в файле config/app.ini

Способ выгрузки данных для Excel

Параметр export в файле config/app.ini указывает адрес (URL) скрипта, который будет запрашивать данные и формировать файл Excel. Если этот параметр пуст, то файл будет формироваться в этой системе. (См. §3)

Для разработчиков (§5)

Кратко об архитектуре

Это приложение использует фреймворк Slim, потому что он легковесный и позволяет снять ряд проблем по маршрутизации, и библиотеку Zepto как лёгкую замену jQuery, к которому все привыкли. Источник вдохновения при построении архитектуры - Rails. Автор постарался сделать так, чтобы структура папок и приёмы программирования были близки к таковым в Rails. Дополнительными ограничениями в архитектуре были принципы DRY, KISS и YAGNI.

Функция t - сокращение для функции Text::get, возвращающей текст из файла config/texts.ini. $h в шаблонах - экземпляр класса Helper, содержащего все функции из хелперов в папке app/helpers/.

API

Поиск id по имени человека (по подстроке в столбце NAME)

search_people.json?people=Иван,Захарч

Результат

{
  "search_people":{
    "Иван":{"ID":202,"NAME":"Иван Васечкин"},
    "Захарч":{"ID":38,"NAME":"Павел Захарченко"}
  }
}

Посещения

visits.json?person=202,38&date_start=2013-09-17&date_end=2013-09-18

Результат

{
  "visits":[
    {"THIS_DAY":"2013-09-17","MIN_DATETIME":"2013-09-17 10:48:44","MAX_DATETIME":"2013-09-17 20:56:32","USER_ID":38,"DIFF":["10:07",1,"9:07"]},
    {"THIS_DAY":"2013-09-17","MIN_DATETIME":"2013-09-17 09:29:09","MAX_DATETIME":"2013-09-17 18:31:08","USER_ID":202,"DIFF":["9:01",1,"8:01"]},
    {"THIS_DAY":"2013-09-18","MIN_DATETIME":"2013-09-18 10:32:25","MAX_DATETIME":"2013-09-18 19:47:18","USER_ID":38,"DIFF":["9:14",1,"8:14"]},
    {"THIS_DAY":"2013-09-18","MIN_DATETIME":"2013-09-18 09:24:49","MAX_DATETIME":"2013-09-18 18:44:28","USER_ID":202,"DIFF":["9:19",1,"8:19"]}
  ]
}

Столбцы:

  • THIS_DAY - день
  • MIN_DATETIME - первый проход в этот день
  • MAX_DATETIME - последний проход в этот день
  • USER_ID - id из предыдущего запроса (search_people)
  • DIFF - разница времени: всего (max-min), время на обед (1 час, если "всего" более 1 часа, иначе 0), рабочее время ("всего" минус "время на обед")

TODO

  • Сделать код ещё легче и быстрее.
  • Если это приложение будет использовать кто-то, кто не понимает по-русски, то можно:
    • простой способ - перевести config/texts.ini
    • посложнее - добавить язык в config/app.ini, перевести config/texts.ini и положить файлы с текстами в config/locales/, например config/locales/ru.ini
  • Упростить изменение кодировки:
    • Добавить выбор кодировки в config/app.ini
    • Передавать header(Charset) в соответствии с указанной кодировкой; убрать строку "AddDefaultCharset" из .htaccess.
    • Добавить в Text::get изменение кодировки текста в соответствии с указанной кодировкой.
  • Сейчас в системе есть только один шаблон. Когда будет больше шаблонов, надо будет добавить папку app/views/layouts/ и хранить в ней layout; переопределить в классе App функцию render, добавив загрузку layout.