пз (1218617), страница 6
Текст из файла (страница 6)
'timestamp' => $time,
'session' => $session,
'buytime' => time(),
'phone' => $phone
))
->execute();
И его обновление:
db_update('orders')
->fields(array('confirmed' => 1))
->where('oid='.$order['oid'])
->execute();
Для рассылки смс сообщений, которые содержат в себе информацию о сеансе и код для получения купленных билетов, в модуле используется API МТС Коммуникатора. Отправка сообщений происходит при помощи запросов к Soap серверу МТС.
$client = new SoapClient("http://www.mcommunicator.ru/m2m/m2m_api.asmx?wsdl",
array(
"trace" => 1,
"exceptions" => 0
));
$result = $client->SendMessage(
array (
"login" => "Limonad",
"password" => md5(‘123’),
"msid" => $num,
"message" => $text,
"naming" => 'LIMONAD'
)
);
Таким образом, модуль реализует функционал оплаты, создания и отображения заказов в личном кабинете пользователя, оповещения пользователя о покупке билета.
3.3.4 Модуль «UCS»
Профессиональная билетная система «UCS-Премьера», разработанная компанией UCS, позволяет полностью контролировать процесс бронирования и продажи билетов в кинотеатрах, театрах, парках отдыха, на стадионе или в цирке. Система представляет собой комплекс, состоящий из кассовых терминалов (компьютеров с подключенным специальным принтером для печати билетов) и менеджерского компьютера, на котором производятся все настройки системы, а также формируются отчеты о деятельности кинотеатра [28].
Модуль UCS разделён на две части - функционал запросов с сервером UCS и форма покупки билетов.
Первая часть находится в файле limonad_ucs.socket.inc. Все запросы отправляются с использованием сокета – программного интерфейса для внутри компьютерной сети. При этом на сервер отправляется строка вида ServiceID=1248141170&Encoding=UTF-8&Version=3&QueryCode=GetHalls, где QueryCode – код запроса системы UCS.
В модуле используются следующие виды запросов:
– GetHalls – информации о залах;
– GetMovies –список всех фильмов в текущем прокате;
– GetSessions – список всех сеансов фильма, где Movies – идентификатор фильмов;
– GetSessionPrices – получение цены на сеанс, где Sessions – идентификатор сеансов;
– GetHallPlan – статус мест сеанса, где Sessions – идентификатор сеансов;
– SaleReservation – резервация мест, где Sessions – идентификатор сеанса, Places – резервируемые места в формате [l=0; f=0;r=1;p=5], ReservationID – ID заказа, CardCode – код карты администратора;
– Login – операция авторизации, требуемая для некоторых других запросов, где CardCode – номер карты администратора, CardPIN – пин-код карты;
– SaleApproved – подтверждение покупки, где CardCode – номер карты администратора, ReservationID – номер заказа, Sessions – номер сеанса;
– SaleCancel – отмена резервации, где CardCode – номер карты администратора, ReservationID – номер заказа, Sessions – номер сеанса;
– GetSales – список всех резерваций, где CardCode – номер карты администратора.
Ниже приведён код реализующий подключение, отправку запроса и получение ответа от сервера.
$address = '77.82.83.56';
$port = '9193';
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, $address, $port);
$query = limonad_ucs_get_query($params);
$length = sprintf('%010d', strlen($query)).'&';
$query = $length.$query;
socket_write($socket, $query, strlen($query));
$l = socket_read($socket, 11);
$result = '';
while($str = socket_read($socket, 1024)){
$result .= $str;
}
if(isset($socket)){
socket_close($socket);
}
$object = simplexml_load_string($result, 'SimpleXMLElement', LIBXML_NOCDATA);
$json = json_encode($object);
$array = json_decode($json,TRUE);
Здесь функция limonad_ucs_get_query - дополнительная функция, формирующая строку запроса из массива $params. После выполнения запроса массив $array будет содержать обработанной ответ от сервера.
Помимо функций запросов, первая часть модуля содержит в себе функцию импорта фильмов и расписаний, использующую данные, полученные от сервера UCS. Данная функция вызывается каждый день процедурой Cron.
В процессе импорта происходит создание новых материалов типа «фильм». Пример кода:
$node = new stdClass;
$node->title = $movie['Name'];
$node->type = "movie";
node_object_prepare($node);
$node->language = LANGUAGE_NONE;
$node->uid = $user->uid;
$node->status = 1;
$node->promote = 0;
$node->field_year[$node->language][0]['value'] = 2016;
$node->field_trailer[$node->language][0]['value'] = 'http://trailers.ru/12345’;
…
Импорт также можно запускать вручную. Для этого создана отдельная страница, на которой используются пакетные операции (рисунок 22).
foreach($movies['Data']['Movies']['Movie'] as $movie){
$info['movie'] = $movie;
$batch['operations'][] = array('limonad_ucs_import', array($info));
}
batch_set($batch);
batch_process('ucs/finish');
Данный код будет выполнять функцию limonad_ucs_import для каждого фильма, полученного в ответе. По окончании пакетных операций произойдёт переадресация на страницу ucs/finish.
Рисунок 22 – Импорт фильмов
Вторая часть модуля содержит в себе функции, описывающие форму для покупки билета. Здесь используются запросы для получения статуса мест, а также их цен в зависимости от зон. Для того, чтобы не отправлять запросы на сервер слишком часто, применяется система кэша Drupal.
$session_info = cache_get('session_info_'.$sess_id);
if(!$session_info){
$session_info = limonad_ucs_socket('hall', $session->field_session_ucs_id['und'][0]['value']);
cache_set('session_info_'.$sess_id, $session_info, 'cache', strtotime('+5 minutes'));
}else{
if($session_info->expire < time()){
cache_clear_all('session_info'.$sess_id, 'cache');
$session_info = limonad_ucs_socket('hall', $session->field_session_ucs_id['und'][0]['value']);
cache_set('session_info_'.$sess_id, $session_info, 'cache', strtotime('+5 minutes'));
}else{
$session_info = $session_info->data;
}
}
cache_get получает содержимое кэша и если время действия кэша истекло, то выполняется функция cache_set, которая сохраняет данные. Для принудительного обновления данных можно воспользоваться ссылкой «Обновить» на форме покупки билетов.
3.3.5 Модуль «Limonad R-Keeper»
R-Keeper – программно-аппаратный комплекс, разработанный для предприятий общественного питания [29]. Сайт кинотеатра «Лимонад» имеет возможность прикрепления накопительных карт системы R-Keeper.
Модуль содержит в себе изменения стандартной страницы личного кабинета:
– блок редактирования личной информации;
– место в рейтинге;
– форма для прикрепления бонусной карты;
– история комментариев;
– список покупок.
Для получения данных о бонусной карте R-Keeper также применяются запросы через socket, но в данном случае на сервер отправляются данные в формате XML.
ServiceID=1248141170&QueryCode=Query_CardSystem&QueryText='.$string.'&Encoding=UTF-8&Version=3'
где $string – строка в формате XML.
Например,
<?xml version="1.0" encoding="Windows-1251" standalone="yes" ?><Message Action="Get card info" Terminal_Type="'.$terminal_type.'" Global_Type="'.$global_type.'"><Card_Code>'.$card.'</Card_Code><Include>Account, Holder</Include></Message>
Здесь $terminal_type и $global_type – некоторые идентификаторы системы и $card – номер карты.
3.3.6 Модуль «Limonad Module»
Модуль содержащий в себе код, который не был вынесен в отдельное расширение, но который не может быть реализован другими средствами.
Так здесь были реализованы следующие функции:
– открытие форм регистрации, авторизации и комментариев во всплывающем окне;
– изменение полей выше упомянутых форм;
– функционал системы голосований;
– фильтр по дате в расписании сеансов;
– показ трейлера на главной странице во всплывающем окне;
– обновление кэша расписания сеанса каждые 10 минут;
– форматирование слайдера на главной, страниц списка сеансов, фильма и зала.
3.4 Технико-экономическое обоснование
3.4.1 Требуемое техническое обеспечение
Система управления содержимым Drupal имеет ряд требований к серверу.
В качестве программного web-сервера требуется Apache HTTPD (для использования чистых ссылок потребуется расширение mod_rewrite) либо Microsoft IIS (Internet Information Services).
Drupal по умолчанию поддерживает следующие системы управления базами данных: MySQL (версия 5.0.15 и выше для Drupal 7, а также требует расширения PDO database для PHP), PostgreSQL(требуется PostgreSQL 8.3 и выше), SQLite (3.3.7+). Работа с другими СУБД поддерживается при установке дополнительных модулей: MSSQL, Oracle, Mongodb, FileMaker, Riak. В настоящее время Drupal поддерживает соединение с базой данных используя mysql (стандартное расширение MySQL), mysqli (улучшенное расширение) и pgsql (для баз данных PostgreSQL).
Для Drupal 7 рекомендуется использовать PHP версии 5.3+ (достаточная версия: 5.2.5+), требуются расширения Hash и JSON (по умолчанию включены).
Для эффективной работы web-портала необходимо не менее 32Мб оперативной памяти. Требуемый объём памяти также зависит от установленных дополнительных модулей. Кроме того, на текущий момент сайт требует не менее 750Мб свободного места на жёстком диске сервера.
Для работы с изображениями требуются графические библиотеки, такие как GD. Библиотека GD включена по умолчанию начиная с версии PHP 4.3 [30].
3.4.2 Оценка трудоёмкости и сроков модернизации программного продукта
Анализ различных подходов к нормированию процесса программирования показал, что в качестве основного фактора, определяющего трудоемкость и длительность разработки программы, следует принять размер исходного текста записи алгоритмов и данных.
Для быстрой приближенной оценки трудоемкости и длительности разработки программного изделия может использоваться базовая модель. Эта модель состоит из двух простейших формул. Затраты труда (или трудоемкость разработки программного изделия – t определяются по формуле, (чел.–мес.):
(1)
где
– число тысяч исходных команд.
Число исходных команд равно 5112, соответственно
t = 3,6 (5,112)1,2 = 25,5 (чел.-мес.)
Продолжительность разработки программного изделия Т, рассчитывается по формуле:
(2)
Производительность труда группы разработчиков программного изделия Пр, определяется по формуле:
(3)
Среднее число исполнителей Чи рассчитывается исходя из определенных или заданных характеристик трудоемкости и длительности разработки программного изделия по формуле:
(4)
Для планирования и организации создания программного продукта требуются нормативные данные по распределению трудоемкости и длительности работ по этапам разработки. Распределение трудоёмкости по этапам разработки программного изделия выглядит следующим образом:
– планирование и анализ требований, 10%;
– проектирование программного изделия, 16%;
– программирование (вёрстка и JavaScript), 25%;
– программирование (PHP), 35%;
– тестирование, 22%.
Распределение длительности по этапам разработки программного изделия будет следующим:
– планирование и анализ требований, 24%;
– проектирование программного изделия, 30%;
– программирование, 48%;
– тестирование, 22%.
3.4.2 Оценка затрат на создание















