Программное обеспечение для мониторинга каталога продукции предприятия, анализа склада, получения информации об актуальной стоимости товара



Содержание

Введение

Под веб-приложением понимается любые программные комплексы, имеющие возможность подключения к ним по глобальным, либо локальным сетям ,и обладающими возможностью обрабатывать пользовательские запросы и давать на них ответы. Все труднее представить себе программные продукты, которые не имеют веб-интерфейса, кроме того приложения, написанные ранее без использования веб-технологий все чаще переделываются с использованием таковых. Поэтому программы становятся веб-ресурсами, а проектирование и собственно прикладное программирование становятся важным навыком современного инженера. 

Интернет технологии проникают во все сферы жизни общества. Одним из направлений развития предприятий, реализующих продукцию, либо услуги стало создание интернет-каталогов и интернет-магазинов. Создание подобных ресурсов экономит время, как работников самого предприятия, так и конечных пользователей, благодаря автоматизации работы с каталогами продукции. Нет необходимости стоять в длинных очередях и не надо беспокоиться о наличии какого-либо товара. Также существует возможность автоматизации процесса покупки товара.

Заказав товар, вы оговариваете с менеджером условие и время доставки, возможную упаковку товара и его стоимость. Оплата проводится или через вашу кредитную карту, либо через банковский счет или по наличному расчету.

Также актуальной является задача предоставления актуального каталога продукции конечному пользователю. Он должен знать количество, качество и стоимость товара в реальном времени. Для этого существует необходимость разработки программного обеспечения, для мониторинга состояния склада и баз данных предприятия и предоставления ссылок для доступа к этому каталогу конечного пользователя.

В данном дипломном проекте разработано программное обеспечение для мониторинга каталога продукции предприятия, анализа склада, получения информации об актуальной стоимости товара, с учетом налоговой политики. Информация предоставляется в удобном для пользователя виде, доступном для просмотра на большом количестве электронных платформ, как мобильных, так и стационарных.

  1. Анализ информации и постановка задач

Веб-технологии плотно вошли в нашу жизнь, и для их развития и поддержки работоспособности было разработано большое число технологий для организации соединения между пользователем и сервером, для отображения ответа сервера в виде, удобном для пользователя, а также средств разработки, созданных для ускорения и удешевления процесса разработки и поддержки веб-приложений, рассмотрим технологии, которые мы использовали в ходе дипломного проектирования.

  1. ЯзыкPHP

PHP(англ. PHP:Hypertext Preprocessor — «PHP:препроцессоргипертекста»; первоначальноPersonal Home Page Tools — «Инструменты для создания персональных веб-страниц»; произноситсяпи-эйч-пи) —скриптовый языкпрограммирования общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинствомхостинг-провайдерови является одним из лидеров среди языков программирования, применяющихся для созданиядинамических веб-сайтов.

Язык и его интерпретатор разрабатываются группой энтузиастов в рамках проекта с открытым кодом. Проект распространяется под собственной лицензией, несовместимой с GNU GPL.

  1. Области применения

В области программирования для сети Интернет PHP — один из популярных сценарных языков (наряду с JSP, Perl и языками, используемыми в ASP.NET) благодаря своей простоте, скорости выполнения, богатой функциональности, кроссплатформенности и распространению исходных кодов на основе лицензии PHP.

Популярность в области построения веб-сайтов определяется наличием большого набора встроенных средств для разработки веб-приложений. Основные из них:

В настоящее время PHP используется сотнями тысяч разработчиков. Согласно рейтингу корпорации TIOBE, базирующемся на данных поисковых систем, в июне 2013 года PHP находился на 5 месте среди языков программирования. К крупнейшим сайтам, использующим PHP, относятся Facebook, Wikipedia и др.

Входит в LAMP — распространённый набор программного обеспечения для создания и хостинга веб-сайтов (Linux, Apache, MySQL, PHP).

  1. Синтаксис

Синтаксис PHP подобен синтаксису языка Си. Некоторые элементы, такие как ассоциативные массивы и цикл foreach, заимствованы из Perl.

Для работы программы не требуется описывать какие-либо переменные, используемые модули и т. п. Любая программа может начинаться непосредственно с оператора PHP.

Простейшая программа Hello world на PHP выглядит следующим образом:

<?php

 echo 'Hello, world!';

?>

Также возможен более короткий вариант вывода строки:

<?= 'Hello, world!' ?>

Открывающий тег вида <?= используется для сокращённой записи конструкций используемых для вывода строки.

PHP исполняет код, находящийся внутри ограничителей, таких как <?php ?>. Всё, что находится вне ограничителей, выводится без изменений. В основном это используется для вставки PHP-кода в HTML-документ, например, так:

<html>

<head>

 <title>Тестируем PHP</title>

</head>

<body>

 <?php echo 'Hello, world!'; ?>

</body>

</html>

Помимо ограничителей <?php ?>, допускается использование дополнительных вариантов, таких как <? ?> и <script language="php"> </script>. Кроме того, до версии 6.0 допускается использование ограничителей языка программирования ASP <% %> (конструкции <? ?> и <% %> могут быть выключены в конфигурационном файле php.ini).

Имена переменных начинаются с символа $, тип переменной объявлять не нужно. Имена переменных, функций и классов чувствительны к регистру. Константы также чувствительны к регистру. Переменные обрабатываются в строках, заключённых в апострофы или двойные кавычки, и heredoc-строках (строках, созданных при помощи оператора <<<).

PHP рассматривает переход на новую строку как пробел, так же как HTML и другие языки со свободным форматом. Инструкции разделяются с помощью точки с запятой (;), за исключением некоторых случаев, после объявления конструкции if/else и циклов.

Переменные в функцию можно передавать как по значению, так и по ссылке (используется знак &).

PHP поддерживает три типа комментариев: в стиле языка Си (ограниченные /* */), C++ (начинающиеся с // и идущие до конца строки) и оболочки UNIX (с # до конца строки).

Дальше мы разберемMySQL, так как она является одной из самы распространенных системой управления базами данных.

  1. База данныхMySQL

MySQL — свободная реляционная система управления базами данных. Разработку и поддержку MySQL осуществляет корпорация Oracle, получившая права на торговую марку вместе с поглощённой Sun Microsystems, которая ранее приобрела шведскую компанию MySQL AB. Продукт распространяется как под GNU General Public License, так и под собственной коммерческой лицензией. Помимо этого, разработчики создают функциональность по заказу лицензионных пользователей. Именно благодаря такому заказу почти в самых ранних версиях появился механизм репликации.

MySQL является решением для малых и средних приложений. Входит в состав серверов WAMP, AppServ, LAMP и в портативные сборки серверов Денвер, XAMPP. Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы.

Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типаMyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей. Более того, СУБД MySQL поставляется со специальным типом таблиц EXAMPLE, демонстрирующим принципы создания новых типов таблиц. Благодаря открытой архитектуре и GPL-лицензированию, в СУБД MySQL постоянно появляются новые типы таблиц.

26 февраля 2008 года Sun Microsystems приобрела MySQL AB за $1 млрд, 27 января 2010 года Oracle приобрела Sun Microsystems за$7,4 млрд и включила MySQL в свою линейку СУБД.

Сообществом разработчиков MySQL созданы различные ответвления кода, такие как Drizzle, OurDelta, Percona Server, и MariaDB. Все эти ответвления уже существовали на момент поглощения компании Sun корпорацией Oracle.

  1. ПроисхождениеMySQL

MySQL возникла как попытка применить mSQL к собственным разработкам компании: таблицам, для которых использовались ISAM — подпрограммы низкого уровня. В результате был выработан новый SQL-интерфейс, но API-интерфейс остался в наследство от mSQL. Откуда происходит название «MySQL» — доподлинно неизвестно. Разработчики дают два варианта: либо потому, что практически все наработки компании начинались с префикса My, либо в честь девочки по имени My, дочери Майкла Монти Видениуса, одного из разработчиков системы.

Логотип MySQL в виде дельфина носит имя «Sakila». Он был выбран из большого списка предложенных пользователями «имён дельфина». Имя «Sakila» было отправлено Open Source-разработчиком Ambrose Twebaze.

  1. Платформы

MySQL портирована на большое количество платформ: AIX, BSDi, FreeBSD, HP-UX, Linux, Mac OS X, NetBSD, OpenBSD, OS/2 Warp, SGI IRIX, Solaris, SunOS, SCO OpenServer,UnixWare, Tru64, Windows 95, Windows 98, Windows NT, Windows 2000, Windows XP, Windows Server 2003, WinCE, Windows Vista и Windows 7. Существует также порт MySQL к OpenVMS. Важно отметить, что на официальном сайте СУБД для свободной загрузки предоставляются не только исходные коды, но и откомпилированные и оптимизированные под конкретные операционные системы готовые исполняемые модули СУБД MySQL.

  1. История выпусков

MySQL 4.0

Несмотря на то, что версия 4.0 является устаревшей, она всё ещё имеет значительное распространение. Основные возможности этой версии:

MySQL 4.1

Рекомендованной версией на 2005 год является MySQL 4.1 вышла 27 октября 2004. Она содержит следующие нововведения:

MySQL 5.0

Версия MySQL 5.0 вышла 24 октября 2005 года, в этой версии значительно расширена функциональность, которая ставит MySQL в один ряд с коммерческими СУБД. Если раньше СУБД MySQL обвиняли в недостаточной поддержке стандарта SQL, то с появлением пятой версии этой популярной базы данных, появилась практически полная поддержка стандарта SQL. MySQL 5.0 содержит следующие нововведения:

MySQL 5.1

Версия MySQL 5.1 продолжает путь к стандарту SQL:2003. MySQL 5.1 содержит следующие нововведения.

MySQL 5.5

Ветка MySQL 5.5 базируется на невыпущенной серии MySQL 5.4 и содержит ряд значительных улучшений, связанных с повышением масштабируемости и производительности, среди которых:

Интегрированы патчи Google с оптимизацией работы InnoDB на процессорах с большим количеством ядер.

MySQL 6.0

Версия MySQL 6.0 была заморожена на стадии альфа-тестирования. Первоначально было принято решение о создании версии 5.2, вскоре эта версия была переименована в 6.0. Однако, позже информация о MySQL 6.0 исчезла с сайта, а разработчики сосредоточились на версии 5.5 и следующей за ней версии 5.6.

Одним из основных нововведений версии 6.0 планировался новый тип таблиц Falcon, разработанный в качестве потенциальной замены для InnoDB компании Innobase, приобретённой компанией Oracle. В связи с приобретением в 2010 году Sun Microsystems тем же Oracle, судьба Falcon остаётся под вопросом.

Рисунок 1.1 – График выхода различных версийMySQL

Далее рассмотрим несколько бесплатных CMS интернет магазинов и подробнее тот, который мы будем использовать для своего проекта.

  1. Обзор различныхCMS интернет магазинов

Content Management System (система управления содержимым) — информационная система или компьютерная программа для обеспечения и организации совместного процесса создания, редактирования и управления контентом.

  1. osCommerce

Один из старейших движков. Работа по созданию будущей CMS началась в Германии в начале 2000-года. Изначально программа называлась The Exchange Project, а самая популярная версия была выпущена в 2003 году под названием osCommerce 2.2 Milestone 2. Разработчики системы давно работают над версией 3.0., но их детище все еще не увидело свет. От части, это компенсируется огромным количеством всевозможных расширений и плагинов, которые создают на энтузиазме сотни тысяч поклонников osCommerce.

OsCommerce сформировал вокруг себя большое сообщество (свыше 200 тысяч участников), которые с каждым днем вносят свой вклад в улучшение системы. На данный момент существует свыше 5 тыс. различных дополнений и модулей, позволяя подстраивать магазин под нужны любого владельца интернет площадок. На базе CMS osCommerce работают свыше 20 тысяч магазинов по всему миру.

Стандартные функциональные возможности движка:

Как видите, установив “голую” версию движка интернет магазина osCommerce вы получаете уже вполне рабочую систему, на которой можно создать интернет магазин, без необходимости устанавливать дополнительные модули и настраивать их.

ПЛЮСЫ:

МИНУСЫ:

Не рекомендуется использовать для начинающих онлайн предпринимателей.

  1. VirtueMart

VirtueMart — программное обеспечения, для создания интернет-магазинов. Работает как дополнение к CMS системе Joomla. Идеально подходит для сайтов с низкой и средней степенью нагрузки. На VirtueMart сделано более 100 тыс. интернет магазинов, что делает его самым популярным дополнением к Джумле. Что ж, перейдем сразу к плюсам и минуса данного движка.

ПЛЮСЫ:

МИНУСЫ:

Рекомендуется для тех, кто только хочет разобраться в тонкостях создания интернет магазина и не знает с чего начать. Но учтите, что серьезные проекты на такой CMS не создаются.

  1. Magento

Популярная система для управления содержимым интернет-магазинов. По данным сайта Alexa.com, Magento является самой популярным движком для онлайн магазинов в 2011 году. Magento в основном рассчитана на западного потребителя, и слабо представлена отечественном рынке. Среди западных компаний, которые используют для своих магазинов этот движок, можно выделить Nokia, Samsung, Nestle, Lenovo и множество других крупных корпораций. Тем не менее, отечественные фирмы не спешат переходить на Magento, отчасти это связано со слабой русскоязычной поддержкой.

ПЛЮСЫ:

МИНУСЫ:

Prestashop – сравнительно молодой движок для интернет-магазинов. Первая версия вышла в свет в 2008 году в Париже, и это, несомненно, плюс – мы видим прекрасную новую систему управления контентом, адаптированную под современные потребности интернет-магазинов, а не старый движок, на который «налеплены» обновления для соответствия запросам вебмастеров. Рассмотрим Prestashop как можно более подробно и выясним, отчего же так популярна эта CMS сейчас.

За те несколько лет, которые прошли с момента выпуска еще никому не знакомой Prestashop до современной Prestashop-мании, произошло почти 2,5 миллиона скачиваний продукта с сайта разработчика. Каждые полминуты один решительный вебмастер нажимает кнопку «Download for free» на этом сайте! Вы можете в этом убедиться сами, зайдя на prestashop.com! Тем не менее, в этом количестве очень мало скачиваний из России. Оно и понятно – русской версии Prestashop на официальном сайте не найти (хотя ходят слухи, что ее вот-вот русифицирует разработчик) и поэтому русификацией занялись сами пользователи. На http://prestadev.ru/download/ вы можете скачать версию движка 1.4 (последняя вышедшая на данный момент – 1.5). Следует пояснить для новичков, только познающих системы управления контентом, что CMS – это не программа и просто загрузить и изучить ее не получится. Чтобы увидеть Prestashop, нужно загрузить скачанные файлы на хостинг вашего сайта!

  1. Преимущества

Какие же плюсы имеет Prestashop перед другими движками? И собственно, имеет ли? При первом обзоре, мы видим – да, с плюсами у Prestashop все в полном порядке. С самого начала работы, Prestashop нас «кормит пряниками», да так, чтобы потом мы даже взгляд не бросали в сторону других CMS.

Первое преимущество, которое нам доводится узнать – абсолютная бесплатность и открытый исходный код.Не нужно ничего оплачивать ни до, ни после скачивания. Но вот купить что-нибудь, если уж так хочется вложиться в свой сайт на полную, у вас будет возможность. Всегда можно купить более красивые и уникальные модули и шаблоны – хотя у Prestashop есть свои бесплатные. Также у вас есть возможность поизучать на досуге исходный код CMS. Возможно, после этого вы решите написать свой движок, уяснив, как работает система. Бесплатность и открытый исходный код говорят в первую очередь о чем? Правильно, о том, что CMS создана для людей, а не для денег. Отчасти благодаря этому Prestashop в 2011 году завоевала звание лучшей Европейской системы управления контентом и получила награду.

Итак, идем далее. Второе преимущество Prestashop – удобство. Устанавливать модули и пользоваться ими достаточно просто. Для того, чтобы установить новые модули в другие CMS, зачастую требуются профессиональные навыки вебмастера. Здесь же справится любой новичок, именно поэтому выбор Prestashop будет для них идеален.

И наконец, третье и самое главное преимущество – гибкость и функциональность. Огромное разнообразие шаблонов, модулей, настроек. Нужно заметить, что из-за расширенного функционала, движок работает немного медленнее некоторых конкурентов, но то, что мы получаем взамен, компенсирует этот недостаток с лихвой.

  1. Функциональность

Каталог:

Статистика:

Безопасность:

Управление:

Модули магазина:

  1. Формат представления данныхXML

XML (англ. eXtensible Markup Language — расширяемый язык разметки) — рекомендованный Консорциумом Всемирной паутины (W3C) язык разметки. Спецификация XML описывает XML-документы и частично описывает поведение XML-процессоров (программ, читающих XML-документы и обеспечивающих доступ к их содержимому). XML разрабатывался как язык с простым формальным синтаксисом, удобный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком, с подчёркиванием нацеленности на использование в Интернете. Язык называется расширяемым, поскольку он не фиксирует разметку, используемую в документах: разработчик волен создать разметку в соответствии с потребностями к конкретной области, будучи ограниченным лишь синтаксическими правилами языка. Сочетание простого формального синтаксиса, удобства для человека, расширяемости, а также базирование на кодировках Юникод для представления содержания документов привело к широкому использованию как собственно XML, так и множества производных специализированных языков на базе XML в самых разнообразных программных средствах.

  1. ЯзыкXML

Спецификация XML описывает язык и ряд вопросов, касающихся кодировки и обработки документов. Материал этой секции представляет собой сокращённое изложение описания языка в Спецификации XML, адаптированное для настоящей статьи.

Нормативным считается английский вариант документа, поэтому основные термины приводятся с их английскими оригиналами.

Перевод основных терминов в основном следует доступному в интернете переводу Спецификации на русский язык, исключение составляют термины tag и declaration.

Для термина tag здесь используется перевод тег как соответствующий текущим нормам русского языка.

Для термина declaration отдано предпочтение распространённому переводу объявление (против также распространённой кальки декларация).

В литературе и интернете могут встречаться и иные переводы основных терминов.

  1. Логическая и физическая структура документа

С логической точки зрения, документ состоит из пролога и корневого элемента. Корневой элемент — обязательная часть документа, пролог, вообще говоря, может отсутствовать.

Пролог может включать объявления, инструкции обработки, комментарии.

Пролог следует начинать с объявления XML, хотя в определённой ситуации допускается отсутствие этого объявления.

Корневой элемент может включать (а может не включать) вложенные в него элементы и символьные данные, а также комментарии. Вложенные в корневой элемент элементы, в свою очередь, могут включать вложенные в них элементы, символьные данные и комментарии, и так далее.

Элементы документа должны быть правильно вложены: любой элемент, начинающийся внутри другого элемента (то есть любой элемент документа, кроме корневого), должен заканчиваться внутри элемента, в котором он начался.

Символьные данные могут встречаться внутри элементов как непосредственно так и в специальных секциях CDATA.

Объявления, инструкции обработки и элементы могут иметь связанные с ними атрибуты. Атрибуты (англ. attribute) используются для связывания с логической единицей текста пар имя-значение.

С физической точки зрения, символы, составляющие документ, делятся на разметку (англ. markup) и символьные данные (англ. character data).

Объявления и инструкции обработки, включая их атрибуты, а также комментарии полностью принадлежат разметке. К разметке также принадлежат теги, обозначающие границы элементов, включая их атрибуты, а также последовательности символов, обрамляющие секции CDATA.

Часть документа, не принадлежащая разметке, составляет символьные данные документа.

  1. Объявление XML

Объявление XML объявляет версию языка, на которой написан документ. Поскольку интерпретация содержимого документа, вообще говоря, зависит от версии языка, то Спецификация предписывает начинать документ с объявления XML. В первой (1.0) версии языка использование объявления не было обязательным, в последующих версиях оно обязательно. Таким образом, версия языка определяется из объявления, и если объявление отсутствует, то принимается версия 1.0.

Кроме версии XML, объявление может также содержать информацию о кодировке документа.

Пример:

<?xml version="1.1" encoding="UTF-8" ?>

Или

<?xml version="1.0" encoding="windows-1251"?>

  1. Элемент и его разметка

Элемент (англ. element) является понятием логической структуры документа. Каждый документ содержит один или несколько элементов. Границы элементов представлены начальными конечным тегами. Имя элемента в начальном и конечном тегах элемента должно совпадать. Элемент может быть также представлен тегом пустого, то есть не включающего в себя другие элементы и символьные данные, элемента.

Тег (англ. tag) — конструкция разметки, которая содержит имя элемента.

Начальный тег: <element1>

Конечный тег: </element1>

Тег пустого элемента: <empty_element1 />

В элементе атрибуты могут использоваться только в начальном теге и теге пустого элемента.

Пример кулинарного рецепта, размеченного с помощьюXML:

<recipe name="хлеб" preptime="5" cooktime="180">

 <title>Простойхлеб</title>

 <composition>

   <ingredient amount="3" unit="стакан">Мука</ingredient>

   <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient>

   <ingredient amount="1.5" unit="стакан">Тёплаявода</ingredient>

   <ingredient amount="1" unit="чайнаяложка">Соль</ingredient>

</composition>

 <instructions>

   <step>Смешать все ингредиенты и тщательно замесить.</step>

   <step>Закрыть тканью и оставить на один час в тёплом помещении.</step>

   <!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... -->

   <step>Замесить ещё раз, положить на противень и поставить в духовку.</step>

 </instructions>

</recipe>

  1. Эффективность использования XML

XML — язык разметки, другими словами, средство описания документа. Именно в нише документов, текстов, где доля разнотипных символьных данных велика, а доля разметки мала — XML успешен. С другой стороны, обмен данными в открытых системах не сводится к обмену документами. Избыточность разметки XML (а в целях разработки языка прямо указано, что лаконичность не является приоритетом проекта) сказывается в ситуациях, когда данные не вписываются в традиционную модель документа. Лента новостей, например, оформляемая с использованием синтаксиса XML (форматы RSS, Atom), представляет собой не документ в традиционном понимании, а поток однотипных мини-документов — многословная и избыточная разметка в этом случае составляет существенную часть передаваемых данных.

W3C озабочен эффективностью применения XML, и соответствующие рабочие группы занимаются этой проблемой (к началу 2013 года нормативные документы не разработаны).

Другая ситуация, когда форматы XML могут оказаться не лучшим решением - работа с данными с простой структурой и небольшим по объёму содержанием полей данных. В этом случае доля разметки в общем объёме велика, а программная обработка XML может оказаться неоправданно затратной, по сравнению с работой с данными более простой структуры. В этой области разработчики рассматривают средства, изначально ориентированные на данные, такие как INI, YAML, JSON.

  1. OfficeOpenXML

Office Open XML (OOXML, DOCX, проект ISO/IEC IS 29500:2008) — серия форматов файлов для хранения электронных документов пакетов офисных приложений — в частности, Microsoft Office. Формат представляет собой zip-архив, содержащий текст в виде XML, графику и другие данные, которые могут быть переведены в последовательность битов (сериализованы) с применением защищённых патентами двоичных форматов, спецификации которых были опубликованы Microsoft для пользователей OOXML на условиях Microsoft Open Specification Promise.

Первоначально формат создавался как замена прежнему двоичному формату документов, который использовали приложения Microsoft Office вплоть до версии Office 2003 включительно. В 2006 году формат Office Open XML был объявлен свободным и открытым форматом Ecma International. Он является форматом по умолчанию для приложений Microsoft Office 2007 и более поздних.

Две разные версии OOXML определены в ECMA-376 и в ISO 29500:2008. Полная поддержка формата ISO 29500 ожидается в Microsoft Office 2010.

  1. Стандартизация

К 2005 году участились призывы к госструктурам переходить на открытые форматы. Если в бывшем СССР культура пользования лицензионным ПО была ещё слаба, в Европе закрытый формат правительственных документов фактически стал требованием платить из государственных бюджетов Microsoft — американской компании — несколько сотен долларов за рабочее место. Осознав, что у неё нет подходящего формата, а конкуренты, OASIS, проводят свой ODF через ISO, Microsoft на основе своих DOC и XLS создала свой XML-формат и провела его через Ecma International и ISO. Началась эта процедура в 2006 году и закончилась в 2008 — чуть больше двух лет на всё (ODF начали стандартизировать ещё в 2002-м). Оппоненты обнаружили в этом начинании множество нарушений внутренних процедур ISO.

  1. Ecma International

Microsoft заявила, что Office Open XML будет открытым стандартом, и представила его на утверждение Ecma International (ECMA). 8 декабря 2005 года ECMA организовала технический комитет 45 (TC45), чтобы «выпустить формальный стандарт для офисных приложений, полностью совместимый с форматами Office Open XML, представленными Microsoft». Предложениетакжеподдержали Apple Inc., Barclays Capital, BP, the British Library, Essilor, Intel, NextPage., Statoil ASAи Toshiba.

  1. ISO/IEC

5 сентября 2007 года принятие варианта OOXML как стандарта ISO/IEC 29500 было временно отклонено по результатам голосования.

В марте 2008 года изменённая спецификация была принята как будущий стандарт ISO/IEC 29500. В частности, в Норвегии при этом были отмечены нарушения процесса стандартизации. Позже оказалось, что файлы, сохраняемые Microsoft Office 2007, не проходят тестов на соответствие стандарту, что нарушает правила принятия стандарта через процедуру Fast-Tracking, требующие, чтобы существовали реализации стандарта.

В мае 2008 были поданы апелляции от ЮАР, Бразилии и Индии, Венесуэлы. Также подана жалоба о нескольких нарушениях от Open Source Leverandørforeningen в Дании.

Публикация ISO/IEC DIS 29500 была отложена на период рассмотрения апелляций (30 дней).

В июле руководители ISO и IEC порекомендовали Technical Management Board отклонить апелляции, указав в качестве причины то, что проект стандарта был принят голосованием в соответствии с директивами ISO/IEC JTC 1.

В августе ISO отклонила апелляции стран, выступающих против принятия OOXML как стандарта, так как они не смогли получить поддержку необходимого числа участников ISO для приостановления принятия стандарта

В конце августа государственные IT-организации Бразилии, ЮАР, Венесуэлы, Эквадора, Кубы и Парагвая опубликовали заявление о сомнениях в нейтральности ISO.

В Норвегии, где из 21 голоса «против» и двух голосов «за» получилось «за», 29 сентября 2008 года 13 членов технической комиссии в знак протеста вышли из состава Standard Norge (no).

По данным собрания ISO/IEC JTC1/SC34, подкомиссии ISO/IEC JTC1, в начале октября SC34 отправила OASIS неопубликованный запрос на передачу ей контроля над стандартомISO/IEC 26300 (ODF), обосновывая это стремлением к лучшей совместимости между стандартами. В Groklaw также обратили внимание на то, что 9 из 20 присутствовавших на собрании в июле являлись сотрудниками или консультантами Microsoft, либо членами ECMA TC45. В результате появились подозрения в попытке захвата Microsoft контроля над ODF.

Таким образом, было принято решение о разработке программного обеспечения для мониторинга каталога продукции, использующее следующие технологии:

– языкPHP в качестве языка программирования для написания веб-приложения;

MySQL – база данных, хранящая каталог продукции;

PrestaShopCMS, предоставляющая доступ к каталогу для пользователей и администраторов;

– Форматы данныхXML иXLSX для предоставления каталога продукции пользователю, в формате удобном для восприятия.

  1. Разработка программного обеспечения

Разработанное программное обеспечение представляет собой веб приложение для мониторинга каталога продукции предприятия. Данное приложение должно облегчить работу с каталогами продукции предприятий, как обычным пользователям, так и владельцем данного предприятия. Владельцем позволяет уменьшить затрату времени и ресурсов для обновления своего каталога. В свою очередь пользователи всегда получают свежий каталог в свои руки. Все это позволяет убрать некоторые несоответствия между покупателем и продавцом из-за устаревшего каталога.

В разработке мы используем CMS Prestashop который мы и подключаем к нашей базе данных. В качестве языка программирования мы выбрали php, так как он является широко распространенным и более простым в освоении. В качестве базы данных взята MySQL.

  1. Структура программного обеспечения

Исходный код каталога продукции представляет собой набор модулей, написанных на языке php и исполняемых на веб-сервере.

Каждый модуль представляет собой класс, выполняющий определенную функцию.

Рассмотрим основной модуль, отвечающий за подключение к базе и предоставление пользователю готового каталога. Модуль написан в файлеindex.php.

Основой файлаindex.php служит класс ExcelWriter. В классе предусмотрены следующие поля:

Также в классе предусмотрены методы:

Для подключения к базе данных MySQL используется метод конструктора класса.

Внутри конструктора осуществляется подключение к базе данных с использование логина и пароля для получения доступа, также указываетсяURL базы данных и ее название:

public function __construct($hostname, $username, $password, $dbName)

   {

       $this->objPHPExcel = new PHPExcel();

       $this->activeSheetIndex = 0;

       $this->row = self::MIN_ROW;

       mysql_connect($hostname, $username, $password) OR DIE("Немогусоздатьсоединениесбазойданных.");

       mysql_select_db($dbName) or die(mysql_error());

       $this->getParentCategory(2, false);

       $this->writeExcelFile();

}

Для получения информации о продукции используются следующие таблицы базы данных:

Формирование каталога продукции начинается с получения информации о категориях товаров с использованиемSQL-запросов к базе данных.

Данный запрос получает название категории товара по ее идентификатору:

"SELECT name FROM  ps_category_lang WHERE id_category=" .$category;

Данный запрос предназначен для получения идентификаторов подкатегорий указанной категории товара:

"SELECT id_category FROM ps_category WHERE id_parent =" .$category;

Следующий запрос предназначен для получения информации о продуктах из выбранной подкатегории:

"SELECT b.name, b.description_short, c.id_image, d.price FROM ps_category_product a, ps_product_lang b, ps_image c, ps_product d WHERE a.id_product = b.id_product AND a.id_product = c.id_product AND a.id_product = d.id_product AND b.id_lang = 7 AND c.cover = 1 AND a.id_category =" .$category;

Запрос для получения информации о дополнительных файла для товара:

'SELECT id_attachment FROM ps_attachment_lang WHERE name LIKE \'Паспорт '.$p_name.$type.'\'';

Запрос для получения информации о производителе продукта:

'SELECT id_manufacturer FROM ps_manufacturer WHERE name LIKE \'' .$p_manufacture.'\'';

  1. Подключение к файловой системе

Из файловой системы мы получаем изображение товара и дополнительные файлы если таковые имеются. Также добавляется изображение в заголовке каталога.

Код добавления заголовочной части к каждой странице:

private function setHeader()

   {

       $iDrawing = new PHPExcel_Worksheet_Drawing();

       $iDrawing->setPath("images/header_logo.png");

       $iDrawing->setCoordinates("A1");

       $iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());

       $this->objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);

       $this->objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(60);

       $this->objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);

}

Функция получения изображения товара из файловой системы:

private function getProductImage($id){

       $t = 1;

       $x = $id;

       $tmp[] = NULL;

       while($x != 0){

           $tmp[] = $x % ($t * 10);

           $x = (int)($x / 10);

       }

       $path = "../shop1/img/p/";

       foreach (array_reverse($tmp) as $value) {

           $path .= $value."/";

       }

       $path .= $id."-home_default.jpg";

       echo "<img src=\"".$path."\" />";

       $iDrawing = new PHPExcel_Worksheet_Drawing();

       $iDrawing->setPath($path);

       $iDrawing->setCoordinates("A".$this->row);

       $iDrawing->setOffsetY(10);

       $iDrawing->setOffsetX(10);

       $iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());

       $this->objPHPExcel->getActiveSheet()->getRowDimension($this->row)->setRowHeight($iDrawing->getHeight());

}

Изображения товара хранятся в директории /shop1/img/p/" сервера.

  1. Формирование каталога

Под формирование каталога понимаем создание структуры файла каталога продукции на диске, для этого используются специальные функции работы с потоками ввода-вывода. Кроме всего каталог должен обладать определенным форматированием для наглядности предоставления информации пользователю.

Каталог должен иметь заголовочную часть, в которой имеется информация о предприятии: контакты, название, логотип. Для его создания используется функция:

private function setHeader()

   {

       $iDrawing = new PHPExcel_Worksheet_Drawing();

       $iDrawing->setPath("images/header_logo.png");

       $iDrawing->setCoordinates("A1");

       $iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());

       $this->objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);

       $this->objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(60);

       $this->objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);

}

Основой составления структуры служит метод getParentCategory, это рекурсивный метод, те он может вызывать себя на исполнение внутри своего тела. Это сделано для получения списка подкатегорий категории.

Сначала с помощьюSQL-запроса к базе данных мы получаем список категорий корневой категории каталога, если у категории есть подкатегории, мы рекурсивно получим этот список подкатегорий, иначе приступим к получению списка продукции. Для оформления заголовков категории используются следующие функции:

$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(0, $this->row)->applyFromArray($this->h2Style)->applyFromArray($this->borderOutline);

$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(1, $this->row)->applyFromArray($this->borderOutline);

$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(2, $this->row)->applyFromArray($this->borderOutline);

$this->objPHPExcel->getActiveSheet()->mergeCellsByColumnAndRow(0, $this->row, 2, $this->row);

Для оформления заголовков категории используются стили h2Style иborderOutline:

private $borderOutline = array(

       'borders' => array(

           'outline' => array(

               'style' => PHPExcel_Style_Border::BORDER_THIN,

           )

       )

   );

   private $h2Style = array(

       'font' => array(

           'name' => 'Tahoma',

           'size' => '9',

           'bold' => true,

           'color' => array('argb' => 'FF333333')

       ),

       'alignment' => array(

           'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,

           'vertical' => PHPExcel_Style_Alignment::VERTICAL_TOP

       ),

       'fill' => array(

           'type' => PHPExcel_Style_Fill::FILL_SOLID,

'startcolor' => array('argb' => 'FFC4C4C4')

       )

   )

Каждая категория являющаяся потомком базовой отображается на отдельной страницеxls-документа. Подкатегории данных категорий отображаются на странице категории в виде раскрывающегося списка.

Следующим этапом является получение списка товаров. Из базы данных с помощьюSQL-запроса получаем название, краткое описание, код изображения товара и его цену. Затем записываем результат в активную страницу:

$name = iconv('windows-1251', 'utf-8', $res3['name']);

           $image = iconv('windows-1251', 'utf-8', $res3['id_image']);

           $price = iconv('windows-1251', 'utf-8', $res3['price']);

           // Currency

           $price = round($price * get_currency());

           $description_short = iconv('windows-1251', 'utf-8', $res3['description_short']);

           $this->objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $this->row, $name);

           $this->objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $this->row, $description_short);

           $this->objPHPExcel->getActiveSheet()->setCellValueExplicitByColumnAndRow(2, $this->row, $price, PHPExcel_Cell_DataType::TYPE_NUMERIC);

           $this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(0, $this->row)->applyFromArray($this->mProductName)->getAlignment()->setWrapText(true);

           $this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(1, $this->row)->applyFromArray($this->mDescription)->getAlignment()->setWrapText(true);

           $this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(2, $this->row)->applyFromArray($this->mDescription)->getNumberFormat()->setFormatCode('#,##руб');

           $this->getProductImage($image);

           $this->row++;

Для оформления продукта применяются стили:

private $mProductName = array(

       'alignment' => array(

           'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,

           'vertical' => PHPExcel_Style_Alignment::VERTICAL_BOTTOM

       ),

       'font' => array(

           'name' => 'Tahoma',

           'size' => '10',

           'bold' => false,

           'color' => array('argb' => 'FF333333')

       ),

   );

   private $mDescription = array(

       'alignment' => array(

           'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,

           'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER

       ),

       'font' => array(

           'name' => 'Tahoma',

           'size' => '8',

           'bold' => false,

           'color' => array('argb' => 'FF333333')

)

   );

Для получения изображения продуктов применяется следующая функция:

private function getProductImage($id){

       $t = 1;

       $x = $id;

       $tmp[] = NULL;

       while($x != 0){

           $tmp[] = $x % ($t * 10);

           $x = (int)($x / 10);

       }

       $path = "../shop1/img/p/";

       foreach (array_reverse($tmp) as $value) {

           $path .= $value."/";

       }

       $path .= $id."-home_default.jpg";

       echo "<img src=\"".$path."\" />";

       $iDrawing = new PHPExcel_Worksheet_Drawing();

       $iDrawing->setPath($path);

       $iDrawing->setCoordinates("A".$this->row);

       $iDrawing->setOffsetY(10);

       $iDrawing->setOffsetX(10);

       $iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());

       $this->objPHPExcel->getActiveSheet()->getRowDimension($this->row)->setRowHeight($iDrawing->getHeight());

}

Далее полученный объект сохраняется на диск:

$objWriter = PHPExcel_IOFactory::createWriter($this->objPHPExcel, 'Excel2007');

Последним этапом является предоставление ссылки на документ каталога продукции пользователю.

Для удобства восприятия и для обеспечения кроссплатформенности, каталог продукции сохраняется в форматеxls, в следующей главе рассмотрим этот формат подробнее.

  1. ФорматXLS

Microsoft Excel (также иногда называется Microsoft Office Excel) — программа для работы с электронными таблицами, созданная корпорацией Microsoft для Microsoft Windows, Windows NT и Mac OS. Она предоставляет возможности экономико-статистических расчетов, графические инструменты и, за исключением Excel 2008 под Mac OS X, язык макропрограммирования VBA (Visual Basic for Application). Microsoft Excel входит в состав Microsoft Office и на сегодняшний день Excel является одним из наиболее популярных приложений в мире.

Рассмотрим структуру файла формата XLS более подробно:

В корне файл формата XLS содержит несколько папок: _rels; docProps; xl. Папки и их содержимое мы рассмотрим ниже. Еще в корне файла находится файл формата xml под названием [Content_Types], его мы сейчас рассмотрим подробнее. В файле [Content_Types] определяются типы ключевого содержимого документа, например основного текста документа, стилей, параметров и свойств файла. Как было показано ранее, в этом файле также определяются типы файлов.

Рисунок 3.1 - Корневой каталог файла XLS

В папке docProps содержится два файла формата xml:app; core.

Рисунок 3.2 - Содержание папки docProps

В папке xl содержатся папки:_rels; theme; worksheets. Так же содержатся файлы: sharedStrings; styles; workbook. Содержание папок мы разберем ниже. В файле styles содержатся стили оформления документа. Файл workbook отвечает за содержание информации в документе фоматаXLS.

Рисунок 3.3 - Содержание папки xl

В папке theme содержится файл theme1 отвечающий за стили оформления самого документа формата XLS.

Рисунок 3.4 - Содержание папки theme

В папке worksheets содержатся по умолчанию файлы: sheet 1; sheet 2; sheet 3. Эти файлы содержат информацию для отображения на листах документа.

Рисунок 3.5 - Содержание папки worksheets

После подробного просмотра файла формата XLS, разберем оформление и структуру конечного каталога продукции.

  1. Стили форматирования каталога продукции

В данной главе описаны все стили и способы форматирования каталога продукции, которые использованы в данном приложении. Так же приведены скриншоты готового каталога продукции, который получает конечный пользователь.

  1. Стили форматирования текста

В конечном каталоге продукции получаемым пользователем, все стили форматирования текста заранее заложены в код программы, которая формирует их при каждом запросе пользователем свежего каталога продукции. Подробное описание каждого стиля текста: его шрифт, размер. Так же задано оформление всего каталога продукции: цвет ячеек, размер.

Рисунок 4.1 – Структура каталога

В готовом каталоге продукции, для удобства навигации, все категории продукции приведены на одной странице с возможностью перехода по ним при клике мышкой (рисунок 4.1).

Каждая категория продукции отображена на отдельном листеxls-документа.

  1. Организация структуры каталога

Каждая страница каталога представляет собой список подкатегорий выбранной категории товаров, для удобства навигации, подкатегории товаров обладают возможностью сворачиваться и разворачиваться при клике на значок плюс либо минус в левой части страницы (рисунок 4.2).

Рисунок 4.2 – Список подкатегорий товара каталога

Рисунок 4.3 – Подкатегория товаров каталога

После того, как содержимое страницы развернуто, пользователь получает доступ к списку товаров, сформированном в виде таблицы (рисунок 4.3).

Список товаров содержит информацию об артикуле товара, краткое его описание и цену с учетом налогов. Данная информация берется из базы данных и добавляется в соответствующую ячейку таблицы. Также информация о товаре содержит изображение товара, если таковое имеется. Изображения товаров получаются из файловой системы. (Рисунок 4.4).

Рисунок 4.4 – Список товаров категории

  1. Добавление изображений в каталог

Данное приложение получает из базы данных уникальный идентификатор изображения соответствующего товара из категории, а именно их порядковый номер. Сами же картинки хранятся в файловой системе, откуда они с использованием координат соответствующих ячеек таблицы вставляются в конечный прайс-лист. Таким способом пользователь может не только узнать технические характеристики и другую информацию о продукте, но и узнать, как выглядит этот продукт.

  1. Макросы

В нашем прайс-листе формируются макросы для осуществления навигации по категориям каталога продукции. В документе используются макросы для перехода из содержания в выбранную подкатегорию, а также для разворачивания/сворачивания информации из подкатегории внутри категории товаров. Эта функция позволяет пользователю ориентироваться по каталогу продукции проще и быстрее. Макросы добавляются в файловую систему и затем на основе файловой системы формируется файл формата XLS.

  1. Основные положения расчёта стоимости программного обеспечения

Программное обеспечение (ПО) является материальным объектом специфической интеллектуальной деятельности специалистов, состоящим из программно документально оформленного проекта, реализующего свои потребительские свойства и качества в составе функционирующих вычислительных систем или систем обработки данных. По стоимости и срокам службы ПО относится к основным производственным фондам предприятия.

Каждое ПО, как реальная продукция, имеет определенный жизненный цикл, т.е. период от начала разработки и до снятия с эксплуатации, включающей три стадии: разработку (проектирование), производство (создание) и использование (сопровождение).

Программное обеспечение, как товарная продукция, может быть двух видов:

Широкое применение средств вычислительной техники требует постоянного обновления и совершенствования ПО. Выбор эффективных проектов ПО связан с их экономической оценкой и расчетом экономического эффекта.

Расчет экономического эффекта ПО основан на принципах “Комплексной оценки эффективности мероприятий, направленных на ускорение научно-технического прогресса”. Экономический эффект может определяться как у разработчика, так и у пользователя.

У разработчика экономический эффект выступает в виде чистой прибыли, остающейся в распоряжении предприятия от реализации ПО, а у пользователя – в виде экономии трудовых, материальных и финансовых ресурсов, получаемой от:

Стоимостная оценка ПО у разработчиков предполагает составление сметы затрат, которая включает следующие статьи:

На основании сметы затрат рассчитывается себестоимость и отпускная цена ПО. Сумма основной заработной платы рассчитывается на основе численности специалистов, соответствующих тарифных ставок и фонда рабочего времени. Численность специалистов, календарные сроки разработки программы и фонда рабочего времени определяются по укрупненным нормам времени на разработку, сопровождение и адаптацию программного обеспечения или экспертным путем. Расчет трудоемкости ПО с использованием укрупненных норм времени осуществляется в основном в крупных научно-технических организациях для решения сложных задач программного обеспечения ВТ. В мелких и средних научно-технических организациях трудоемкость, численность исполнителей и сроки разработки ПО определяются экспертным путем с использованием данных по базовым моделям. При определении трудоемкости ПО учитываются объем ПО (в тыс. условных машинных команд или исходных команд), объем документации (тыс. строк), новизна и сложность ПО, язык программирования, степень использования типовых (стандартных) программ.

Исходные данные

Расчет основной заработной платы исполнителей, занятых разработкой ПО, производится на основе исходных данных, представленных в таблице.

В выполнение работ задействованы следующие разработчики ПО:

Таблица 5.1 – Исходные данные

Наименование показателей

Буквенные

обозначения

Единицы

измерения

Количество

Коэффициент новизны

единиц

1,0

Группа сложности

единиц

3

Дополнительный коэффициент сложности

kсл

единиц

1,18

Поправочный коэффициент, учитывающий использование типовых программ

единиц

0,9

Установленная плановая продолжительность разработки

лет

0,094

Годовой эффективный фонд времени

Фэф

дней

255

Продолжительность рабочего дня

ч

8

Тарифная ставка 1-го разряда

Tм1

руб.

262000

Коэффициент премирования

kп

единиц

1,4

Норматив дополнительной заработной платы

Hзд

%

10

Ставка отчислений в фонд социальной защиты населения

Hзсз

%

35

Ставка чрезвычайного налога

Hнч

%

3

Норматив на сопровождение и адаптацию ПО

Hрса

%

10

Ставка налога на добавленную стоимость

Hдс

%

20

Норматив амортизации ВТ

На

%

12,5

  1. Определение объема программного обеспечения

Объем ПО определяется путем подбора аналогов на основании классификации типов ПО, каталога функций ПО и каталога аналогов ПО в разрезе функций, которые постоянно обновляются и утверждаются в установленном порядке. На основании информации о функциях разрабатываемого ПО, по каталогу функций определяется объем функций. Затем по каталогу аналогов в разрезе функций уточняется объем функций. На основании этих данных составлена таблица 5.2.

Общий объем ПО рассчитывается по формуле 5.1:

,(5.1)

где – общий объем ПО, условных машинных команд;

– объем функций ПО, условных машинных команд;

n  - общее число функций.

По формуле (5.1) определим общий объем ПО:

V0 =542 + 373 + 893 +475 + 375 + 765 + 1300 =5458  условных машинных команд.

Таблица 5.2 – Объем программного обеспечения

Номер

функции

Содержание функций

Объем (условных машинных команд)

101

Организация ввода / вывода

542

203

Управление памятью

373

305

Обработка файлов

893

309

Формирование файла

475

506

Обработка ошибочных и сбойных ситуаций

375

507

Обеспечение интерфейса между компонентами

765

703

Расчет показателей

1300

  1. Расчет трудоемкости программного обеспечения

На основании общего объема ПО определяется нормативная трудоемкость Tн по таблицам. Нормативная трудоемкость устанавливается с учетом сложности ПО. Выделяется три группы сложности, в которых учтены следующие составляющие ПО: языковой интерфейс, ввод-вывод, организация данных, режимы работы, операционная система и техническая среда. Кроме того, устанавливаются дополнительные коэффициенты сложности ПО.

С учетом дополнительного коэффициента сложности kсл (таблица 1) рассчитывается общая трудоемкость ПО (формула5.2)

, (5.2)

где                 То – общая трудоемкость ПО, человеко-дней;

Тн – нормативная трудоемкость ПО, человеко-дней;

kсл – дополнительный коэффициент сложности ПО.

Объему в 5458 условных машинных команд (3-я группа сложности ПО) соответствует нормативная трудоемкость 95 человеко-дней. По формуле определим общую трудоемкость ПО:

человеко-дня.

При решении сложных задач с длительным периодом разработки ПО трудоемкость определяется по стадиям разработки (техническое задание – ТЗ, эскизный проект – ЭП, технический проект – ТП, рабочий проект – РП и внедрение – ВН) с учетом новизны, степени использования типовых программ и удельного веса трудоемкости стадий разработки ПО в общей трудоемкости разработки ПО. При этом на основании общей трудоемкости рассчитывается уточненная трудоемкость с учетом распределения по стадиям (формула 5.3)

,(5.3)

где           Ту – уточненная трудоемкость ПО, человеко-дней;

Тi – трудоемкость разработки ПО на i-й стадии, человеко-дней;

m – количество стадий разработки.

Трудоемкость ПО по стадиям определяется с учетом новизны и степени использования в разработке типовых программ и ПО  (формула 5.4)

,(5.4)

где Tстi – трудоемкость разработки ПО на i-й стадии (технического задания, эскизного проекта, технического проекта, рабочего проекта и внедрения), человеко-дней;

              kн – поправочный коэффициент, учитывающий степень новизны ПО;

              kт – поправочный коэффициент, учитывающий степень использования в разработке типовых программ и ПО;

            dстi – удельный вес трудоемкости i-й стадии разработки ПО в общей трудоемкости ПО.

На основании уточненной трудоемкости разработки ПО и установленного периода разработки рассчитывается общая плановая численность разработчиков ПО (формула 5.5)

, (5.5)

где  Чр – плановая численность разработчиков, чел.;

                    Фэф – годовой эффективный фонд времени работы одногоработника в течение года, дней в год;

Tрд – плановая продолжительность разработки ПО, лет.

Результаты расчетов уточненной трудоемкости и общей плановой численности разработчиков на разных стадиях разработки по формулам (5.4) и (5.5) представлены в таблице 5.3.

Таблица 5.3 - Результаты расчетов трудоемкости

Стадии разработки

Итого

ТЗ

ЭП

ТП

РП

ВН

Коэффициенты удельных весов трудоемкости стадий,dстi

0,11

0,09

0,11

0,55

0,14

1,0

Коэффициенты, учитывающие использование типовых программ,kт

-

-

-

0,9

-

-

Коэффициенты новизны,kн

1,0

1,0

1,0

1,0

1,0

-

Уточняющая трудоемкостьTу стадий, человеко-дней

13

11

13

58

17

112

Численность Чр исполнителей, чел.

1,8

1,8

1,8

1,9

1,9

1,8

СрокTр разработки, лет

0,026

0,026

0,026

0,13

0,03

0,24

Например, по формуле (5.4) определим уточненную трудоемкость на стадии рабочего проекта

человеко-дней.

Например, по формуле (5.5) определим общую плановую численность разработчиков на стадии рабочего проекта

чел.

  1. Расчет заработной платы разработчиков программного обеспечения

Уточненная трудоемкость и общая плановая численность разработчиков служат базой для расчета основной заработной платы. По данным о спецификации и сложности выполняемых функций составляется штатное расписание группы специалистов-исполнителей, участвующих в разработке ПО с определением образования, специальности, квалификации и должности.

В соответствии с тарифными разрядами и коэффициентами должностей руководителей научных организаций каждому исполнителю устанавливается разряд и тарифный коэффициент.

Месячная тарифная ставка каждого исполнителя Тм определяется путем умножения действующей месячной тарифной ставки 1-го разряда Тм1 на тарифный коэффициент Тk, соответствующий установленному разряду (формула5.6)

.             (5.6)

Часовая тарифная ставка рассчитывается путем деления месячной тарифной ставки на установленный при семичасовом рабочем дне фонд рабочего времени – 169,8 часов (формула 36)

,(5.7)

где           Т ч – часовая тарифная ставка, ден. ед.;

Т м   - месячная тарифная ставка, ден. ед.

По формулам (5.6) и (5.7) определим месячные и тарифные ставки начальника отдела (Tмо, Tчо) и инженера программиста 1-й категории (Tмп, Tчп)

Tmo=262000*3.98=1042760 рублей;

Tчо =  1042760/169,8 =6141,107 рублей;

Tмп=262000*2,48 = 649760рублей;

Tчп =649760/169,8 = 3826,62рублей.

Основная заработная плата исполнителей ПО рассчитывается  по формуле 5.8

,(5.8)

где   n – количество исполнителей, занятых разработкой ПО;

Тчi - часовая тарифная ставка i-го исполнителя, ден. ед.;

Фэi – эффективный фонд рабочего времени i-го исполнителя, дней;

Тч – количество часов работы в день, ч;

 kп – коэффициент премирования.

По формуле (37) определим основную заработную плату исполнителей ПО

Зоi=(6141,107 *1*25*1,4) + (3826,62*4*50*1,4) = 214938,78+ 1071453,6=

=1286392,38 рублей.

Дополнительная заработная плата на ПО Здi включает выплаты, предусмотренные законодательством о труде (оплата, отпусков, льготных часов, времени выполнения государственных обязанностей и других выплат, не связанных с основной деятельностью исполнителей), и определяется по нормативу в процентах к основной заработной плате (формула 5.9)

,(5.9)

где Здi – дополнительная заработная плата исполнителей ПО, ден. ед.;

Нд – норматив дополнительной заработной платы в целом по научной организации

По формуле (5.9) определим дополнительную заработную плату на ПО

Здi = (1286392,38 *10)/100 = 128639,238 руб.

  1. Расчет отчислений, налогов и затрат

Отчисления в фонд социальной защиты населения Зсзi определяются в соответствии с действующими законодательными актами по нормативу в процентном отношении к фонду основной и дополнительной заработной платы исполнителей (формула 5.10).

,(5.10)

где Нзсз – норматив отчислений в фонд социальной защиты населения, %.

По формуле (5.10) определим отчисления в фонд социальной защиты населения.

Зсзi=(1286392,38 + 128639,238)*35/100 = 495261,06  рублей.

Расходы по статье “спецоборудование” Pci включают затраты средств на приобретение вспомогательных специального назначения технических и программных средств, необходимых для разработки ПО, включая расходы на их проектирование, изготовление, отладку, установку и эксплуатацию. Затраты по этой статье определяются в соответствии со сметой расходов, которая составляется перед разработкой ПО. Данная статья включается в смету расходов на разработку ПО в том случае, когда приобретаются специальное оборудование или специальные программы, предназначенные для разработки и создания только данного ПО.

В небольших научных организациях и на малых предприятиях, где ОПФ являются лишь средства ВТ, амортизационные отчисления на ПО Аoi можно определить прямым счетом по формуле 5.11:

,(5.11)

где Аoi – амортизационные отчисления по конкретному средству ВТ в расчете на год, ден. ед.;

           Тф – фактический срок использования основной ВТ (здесь равен 110 дней или 0,3 года);

           Псi  - первоначальная стоимость ВТ.

По формуле (6.1) определим сумму амортизационных отчислений

рублей

Расходы на электроэнергию при 8-ми часовом рабочем дне, продолжительности разработки в 50 дней, цене 1217 рублей за один кВт и потребляемой компьютером мощности в размере 200 Вт  в час составят:

РЭ =

Расходы по статье “прочие затраты” Пзi на ПО включают затраты на приобретение и подготовку специальной научно-технической информации и специальной литературы. Определяются по нормативу, разрабатываемому в целом по научной организации, в процентах к основной заработной плате (формула 5.12)

,(5.12)

где Hпз – норматив прочих затрат в целом по научной организации, %.

По формуле (5.12) определим прочие затраты

Пзi= (1286392,38 *3)/100 = 38591,77  рублей.

Общая сумма расходов по всем статьям сметы Срi на ПО рассчитывается по формуле 5.13

, ден. ед.                (5.13)

где Mi = 5000 – затраты на бумагу;

По формуле (5.13) определим общую сумму расходов

Cpi=1286392,38+128639,238+495261,06+5000+56250++38591,77=2058814,449

рублей.

Кроме того, организация-разработчик осуществляет затраты на сопровождение и адаптацию ПО Pсаi (формула 5.14), которые определяются по нормативу Hрса

,(5.14)

где Hрса – норматив расходов на сопровождение и адаптацию, %.

По формуле (5.14) определим расходы на сопровождение и адаптацию

Рcai = 2058814,449*10/100=205881,4449 рублей.

  1. Расчет себестоимости, отпускной цены и прибыли

Общая сумма расходов на разработку (с затратами на сопровождение и адаптацию) как полная себестоимость ПО Спi определяется по формуле 5.15

, ден. ед.   (5.15)

По формуле (5.15) определим полную себестоимость ПО

Сni= 2058814,449+205881,4449= 2264695,894 рублей.

Рентабельность и прибыль по создаваемому ПО определяются исходя из результатов анализа рыночных условий, переговоров с заказчиком (потребителем) и согласования с ним отпускной цены, включающей дополнительно налог на добавленную стоимость. Прибыль рассчитывается по формуле 5.16

,(5.16)

где  Прi – прибыль от реализации ПО заказчика, ден. ед.;

Урпi – уровень рентабельности ПО, принимаем 25 %;

Спi – себестоимость ПО, ден. ед.

По формуле (5.16) определим прибыль от реализации создаваемого ПО

Пpi= 2264695,894 *25/100 = 566173,97 рублей.

В цену ПО включается налог на добавленную стоимость, который рассчитывается по нормативу, установленному действующим законодательством, в процентах к общей сумме добавленной стоимости (формула 5.17)

,(5.17)

где  Ндсi – налог на добавленную стоимость, ден. ед.;

       Дсi – добавленная стоимость, ден. ед.;

       Нндс – норматив налога на добавленную стоимость, %.

Действующим законодательством предусмотрены льготы по налогу на добавленную стоимость. От налога на добавленную стоимость освобождается реализация научно-исследовательских работ, которые выполняются на основе хозяйственных договоров для потребителей Республики Беларусь, работы и услуги учебно-опытных участков и учебных хозяйств, учреждений образования и другие работы.

Добавленная стоимость на ПО рассчитывается по формуле 5.18

,(5.18)

На реализацию создаваемого ПО льготы по налогу на добавленную стоимость Ндсi не распространяются. В связи с этим добавленная стоимость на ПО определяется по формуле (5.18)

ДСi=1286392,38 +128639,238+495261,06+56250+566173,97 = 2532716,643 рублей

По формуле (5.17) определим налог на добавленную стоимость

Ндсi=2532716,643 *20/100 = 506543,32 рублей.

Прогнозируемая отпускная цена ПО представляет собой сумму себестоимости, прибыли и налога на добавленную стоимость (формула 5.19)

ден. ед.(5.19)

По формуле (5.19) определим прогнозируемую отпускную цену ПО

Цoi= 2264695,894 +566173,97 +506543,32 = 3337413,194 рублей.

Прибыль от реализации ПО остается организации, разработчику и предоставляет собой эффект от создания нового программного обеспечения вычислительной техники.

  1. Экспертный метод оценки условий труда

Условия труда определяются совместным действием большого числа факторов: технических, санитарно-гигиенических, организационных и др. Для разработки наиболее эффективных мероприятий по улучшению условий труда часто требуется установить значение отдельных факторов. Знание степени влияния тех или иных факторов на условия труда позволяет более успешно решать задачи предупреждения производственного травматизма и профессиональных заболеваний, повышения производительности труда.

Сложность оценки условий труда состоит в том, что определяющие их факторы в ряде случаев не поддаются количественному измерению либо измеряются косвенным путем. Такие факторы, как недостатки в организации работ, слабая трудовая дисциплина, сложность работы в ночное время, удобство пользования приспособлениями, отсутствие средств защиты и другие, прямых измерителей не имеют и оцениваются качественными показателями. Факторы, оцениваемые количественно, например уровни шума, освещенности, вибраций, имеют разные измерители, не позволяющие непосредственно ответить на вопрос, влияние какого из факторов сказывается на условиях труда наиболее неблагоприятного. Поэтому для исследования и практического решения целого ряда задач охраны труда в последние годы широко применяют экспертный метод, основанный на обобщении многолетнего опыта наиболее квалифицированных специалистов в той или иной области охраны труда на железнодорожном транспорте.

Для проведения экспертного анализа необходимо прежде всего определить его цель. Правильно сформулированная цель позволит избежать неконкретных оценок и получить объективные результаты. Далее требуется определить и четко сформулировать вопросы, на которые должны ответить эксперты. Вопросы – перечень факторов – помещают в анкету (экспертный лист), в которой указывают условия ответов. Чтобы избежать «навязывания» эксперту предопределенного результата, вопросы располагаются в случайной последовательности. Для получения такой последовательности могут быть использованы таблицы равномерно распределенных случайных чисел (таблицы 6.1;6.2).

Таблица 6.1 – Таблица равномерно распределенных случайных чисел

Технические факторы

Rij

Rij

1

2

3

4

5

6

7

8

9

10

11

12

 Недостаточно контрастная окраска подвижного состава

  Выступающие за габарит подвижного состава детали вагонов и груза

 Отсутствие благоустроенных переходов через пути

 Недостаточная эффективность тормозных средств подвижного состава

 Недостатки станционной технологической связи, вызывающие необходимость частых переходов через пути

 Неровное и скользкое основание под вагоном в рабочей зоне

 Несовершенство сигнализации и оповещения о приближении подвижного состава

 Неиспользование переходов через пути из-за неудобного их размещения

 Наличие негабаритных мест в рабочей зоне

 Неудобное размещение служебных помещений на станции

 Недостаточный обзор при управлении из кабины локомотива

 Недостаточный обзор при наблюдении за свободностью пути с подножки вагона

11

9

3

10

2

6

5

7

1

4

8

12

81

56

32

81

41

58

74

24

68

38

76

72

Важным этапом экспериментального анализа является формирование групп экспертов. Каждый эксперт должен быть достаточно компетентен в оценке рассматриваемых вопросов. Для оценки компетентности используют различные методы, наиболее простым из которых является изучение сведений о производственном опыте и квалификации эксперта. В ряде случаев формируют группы экспертов, имеющих разное отношение к оценке условий труда, - исполнителей, организаторов работ, представителей органов надзора за охраной труда.

Одним из наиболее распространенных в экспертном методе является способ ранговых оценок. При заполнении анкеты эксперт присваивает фактору, оказывающему наибольшее влияние на условия труда, самый высокий ранг – 1, другим факторам – ранги 2, 3 и т.д. по мере убывания их влияния.

В качестве примеров в таблицах 6.1 и 6.2 приведены результаты заполнения анкетi-м экспертом (i= 1, ... 9) при оценке факторов безопасности труда на сортировочной станции.

Так  же приведены суммы рангов каждого фактора ∑Rij

Таблица 6.2 - Таблица равномерно распределенных случайных чисел

Организационно -технологические факторы

Rij

Rij

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 Потери бдительности при переходе через пути в зоне движения неуправляемых отцепов

 Внезапные толчки стоящих поездов в момент их технологической обработки

 Недостаточный обзор в рабочей зоне

 Несогласованность действий исполнителей и организаторов работ

 Внезапные толчки стоящих составов при переходе через пути, занятые подвижным составом

 Неправильная оценка опасной ситуации машинистом локомотива

 Недостаточная квалификация работников и незнание ими местных условий станции

 Нарушение правил перехода через пути

 Поспешные действия при переходе через путь

 Недостатки в организации технологии работы станции

 Недооценка опасности движущегося подвижного состава

 Внезапные толчки вагонов при переходе через путь между группами вагонов

  Невосприятие опасности на фоне помех

  Недостаточный контроль за выполнением требований безопасности

 Нарушение установленного порядка ограждения работ

 Нарушение правил подачи оповестительных сигналов

1

13

5

2

12

15

11

6

7

10

3

16

8

4

9

14

12

52

87

27

84

117

112

30

48

117

92

93

100

34

5

43

При заполнении анкет может оказаться, что эксперт присвоил разным факторам одинаковые ранги. В этом случае при обработке анкет ранги нормализуют суммы рангов в каждом экспертном листе должна быть равна

                              ∑Rij=n(n + 1)/2.    (сумма рангов)

                               j=1

где n – число факторов;

       j – номер фактора;

      Rij – ранг фактора по оценке 1- го эксперта.

Это требование выполняется, если всем факторам имеющим совпавшие ранги, присвоить одинаковые, в том числе и дробные ранги, которые численно равны среднему значению мест этих факторов в экспертном листе.

На основании анкет, заполненных m экспертами, составляется матрица рангов

Ri1Ri2....Rij....R1n

                                   ∑Rij=RjiRj2....Rij....Rjn

Rm1Rm2....Rmj....Rmn

где Rij – ранг. присвоенный i-м экспертом j-му фактору (i=1, ..., m; j=1,...n).

Итоговую оценку влияния j-го фактора устанавливают на основе подсчета суммы ∑Rij рангов по столбцам. Самым влиятельным фактором признается тот, у которого  сумма рангов наименьшая. Располагая факторы в порядке возрастания суммы их рангов, получают диаграмму рангов, которая может явиться основанием для последующего принятия решений.

Результаты, полученные способом ранговых оценок, можно использовать только в том случае, если имеется достаточная согласованность мнений экспертов. Согласованность мнений определяют с помощью коэффициента конкордации W, рассчитываемого по формуле

            n

       12∑dj2

           j=1

    W=—————— n

                 m2(n3 - n)- m ∑Ti

                                  j=1

При этом

          m

   dj= ∑ R ij – 0,5m(n+1);

         i=1

          u

   Ti= ∑ (tu3 – tu),

         k=1

где u – число групп факторов, которые имеют совпавшие ранги в экспертном листе i-го эксперта;

       k – номер группы с совпавшими рангами, k=1, 2;

       tu – число факторов с совпавшими рангами в группе с номером k в экспертном листе j-го эксперта.

Если в анкетах экспертов отсутствуют совпавшие ранги, то естественно

    m

    ∑ Ti =0.

    i=1

Коэффициент конкордации может принимать значения от 0 до 1. При значении W=0 не существует связи между оценками экспертов, т.е. нет согласованности их мнений. Значение W=1 свидетельствует о наличии полной согласованности. Изменению коэффициента конкордации от 0 до 1 соответствует повышению степени согласованности мнений экспертов. В примерах рассмотренных в табл.6.1 и 6.2 значения  W соответственно равны 0,4 и 0,6.

Для оценки значимости вычисленных значений W используют критерий согласия  z2  . Из математической статистики известно, что величина m(n-1) W соответствует z2 – распределению с (n-1) степенью свободы. Распределение случайных величин z2 характеризует случайные отклонения сумм квадратов нормально распределенной величины с нулевым математическим ожиданием. Если задать некоторый уровень значимости q, то с вероятностью (1-q) текущее значение z2 ≤ z42 соответствуют случайным отклонениям. Если окажется, что значения z2 > z42 , то с вероятностью (1-q), можно утверждать, что обнаруженные отклонения от нуля не случайны и не описываются распределением z2 .

Задавшись уровнем значимости, например q=0,05, по таблицам 6.1 и 6.2

z2 – распределения определяют  z42 соответствующие (n-1) степени свободы.

Значение коэффициента конкордации существенно отличается от нуля, если m(n-1)W > z42 . В таком случае следует признать, что согласованность экспертов достаточно и с вероятностью (1-q) не может определяться случайными совпадениями оценок.

В первом из рассмотренных примеров имеем z2 =39,4, во втором z2=81,1.  Следовательно, значимость вычисленных значений коэффициента конкордации подтверждается.

При определении согласованности групповых оценок используют коэффициент корреляции рангов p, рассчитывается по формуле

                    n

                 6∑d2j

                   j=1

    p= 1- —————— ,

                            m 3 - n

где dj = Ri – Rj – расхождение групповых оценок;

       Ri Rj  – соответственно ранги j-го фактора по оценкам, полученным в первой и во второй группах.

Коэффициент корреляции рангов изменяется от -1 до +1. При p= +1 имеет место однозначная и полная согласованность групповых оценок, при p=-1 оценки полностью противоположны. Если 0≤p≤ 1, имеет место положительная корреляция. Групповые оценки можно признать согласованными, если значение коэффициента корреляции рангов существенно отличается от нуля.

Опыт применения способа ранговых оценок показал его пригодность для решения многих задач по охране труда. Недостатком этого способа является то, что с увеличением числа рассматриваемых факторов до 15-20 эксперты, как правило, испытывают затруднения в присвоении рангов.

Как недостаток следует отметить и отсутствие сопоставимой количественной шкалы качественных оценок. От такого недостатка свободен способ бальных оценок, при котором заранее, на стадии разработки анкеты опроса экспертов, устанавливают шкалу баллов. При этом максимальный балл присваивают наиболее неблагоприятному фактору условий труда. Каждый j-й фактор (j=1,.....,n) получает от i-го эксперта (i=1,...,m) бальную оценку qij.

При использовании бальных оценок следует иметь в виду возможность систематического их завышения или занижения отдельными экспертами. Для нейтрализации влияния заниженных или завышенных оценок на результаты исследования условий труда оценки экспертов умножают на весовой коэффициентb. Дляi-го эксперта он составит

                         n

                 bi=1/∑qij

                         j=1

Очевидно, что чем выше совокупность бальных оценок i-го эксперта, тем ниже его весовой коэффициент. Приведенные бальные оценки i-го эксперта ωij определяют в виде произведения ωij =biqj.

Итоговые сравнительные оценки j-го фактора рассчитывают суммированием оценок ωij . После того как итоговые сравнительные оценки будут найдены, проводят ранжирование факторов, располагая их по мере убывания итоговых оценок. Согласованность мнений экспертов оценивают с использованием коэффициента конкордации W.

Способ бальных оценок эффективен при сравнительном анализе преимуществ и недостатков различных вариантов технических решений улучшения условий труда. Однако при анализе большого числа вариантов эксперты, как и в случае использования способа ранговых оценок. испытывают затруднения с ранжированием факторов.

При необходимости более четкого ранжирования применяют способ парных сравнений. Экспертам предлагают анкету с перечнем факторов, каждый из которых следует сравнить со всеми остальными. Результаты сравнения эксперты записывают в матрицу, подобную таблице шахматного турнира. Если,  например эксперт считает, что фактор, указанный в первой строке, имеет большее влияние, чем фактор, указанный во втором столбце, то на пересечении первой строки и второго столбца он ставит цифру 1. В противном случае эксперт ставит 0. Если сравниваемые факторы равноценны по влиянию, то он должен проставить знак 1/2.

При сравнении следует иметь в виду возможность нарушения транзитивности, когда в результате парного сравнения оказывается, что i-й фактор влиятельнееj-го,j-й сильнееk-го, аk-й в свою очередь более влиятелен, чем i-й. В таких случаях проводят дополнительные вычисления и последовательными приближениями находят итоговые оценки факторов.

Как указывалось, сравнительную оценку rij пары i-го и j-го факторов варьируют в трех условиях: rij=1; rij=0; rij=0,5. Пусть из общего числа m экспертов i-му фактору отдали предпочтение m i специалистов. Число экспертов, считывающих i-й и j-й факторы равноценными, равно m n . И наконец j-му фактору отдали предпочтение m j экспертов. При этих условиях оценка математического ожидания величины rij составит

            1 mi  +0,5mn +0mj    mi            0,5mn

      Е(rij)= —————— = ——— + ———,

                       m                      m              m

а величины rij

                   mj       0,5mn

      Е(rij)= —— + ———,

                   m           m

Очевидно, что сумма математических ожиданий Е(rij)+ Е(rij)=1, а

                                mi –mj

их разность Е(rij)-Е(rij)= ———.

m

Отсюда

                    1mimj

      Е(rij)= —— + ———    (i,j=1,....,n).

                     2          2m

Совокупность E(rij) образует матрицу А=[ E(rij)]i, j=1,...,n. На основе этой матрицы определяют относительную важность факторов. Для каждого фактора находят коэффициентыki,...,kn относительной важности, которые в совокупности можно рассматривать как координаты вектораk.

Координаты собственного вектора матрицы. А есть коэффициенты относительной важности. Координаты вектораk вычисляют последовательными приближениями

              1

       ki=——Aki-1,

             £i

где i=1,2...номер итерации;

ki=(ki1,...., kin) – вектор коэффициентов относительной важности;

£i – нормирующий коэффициент. определяемый из выражения

n  n

        £i=  ∑ ∑ E (rij)kji-1

i=1 j=1

Последовательные приближения производят до тех пор, пока значения£i иki не окажутся близкими к£i-1 iиki-1.

 Вычисления коэффициентов относительной важности позволяют не только провести ранжировку, но и построить шкалу количественных оценок. Наиболее влиятельным считают фактор с наибольшим коэффициентом относительной важности. Ранжировку факторов выполняют по цепочке неравенствk1>k2>...>kn.

Экспертный метод оценки условий труда является наиболее сложным и трудоемким способом. Результаты математической обработки результатов экспертного анализа служат основанием для разработки целенаправленных мероприятий по улучшению условий труда.

Заключение

В данном дипломном проекте реализована возможность генерации каталога продукции предприятия в реальном времени в виде файлаMS Excel.

Каталог позволяет наглядно предоставить актуальную информацию для пользователя. Что в свою очередь улучшает качество отношений между предприятием и клиентами, позволяет организовывать процесс учета продукции в электронном виде, а также позволяет избежать искажения информации при передаче конечному пользователю.

В ходе работы над проектом были изучены язык программированияPHP, СУБДMySQL. Рассмотрены форматыXLSX,XML, серверApache. Также был проведен анализ существующих систем управления контентом.

В рамках главы, относящейся к охране труда, в дипломном проекте рассмотрены экспертный метод оценки условий труда.

В рамках экономической части дипломного проекта выполнен расчет стоимости разработки программного обеспечения, а также выполнен расчет заработной платы разработчика программного обеспечения.

Список импользуемых источников

1. В. Васвани. MySQL: использование и администрирование = MySQL Database Usage & Administration. — М.: «Питер», 2011. — 368 с. — ISBN 978-5-459-00264-5

2.Кузнецов Максим, Симдянов Игорь. MySQL на примерах. — Спб.: «БХВ-Петербург», 2008. — С. 952. — ISBN 978-5-9775-0066-1

3. Стив Суэринг, Тим Конверс, Джойс Парк. PHP и MySQL. Библия программиста, 2-е издание = PHP 6 and MySQL 6 Bible. — М.: «Диалектика», 2010. — С. 912. — ISBN 978-5-8459-1640-2

4. Кузнецов Максим, Симдянов Игорь. PHP . Практика создания Web-сайтов. — 2-е изд. перераб. и доп. — Спб.: «БХВ-Петербург», 2008. — С. 1264. — ISBN 978-5-9775-0203-0

5. Роберт Шелдон, Джоффрей Мойе. MySQL 5: базовый курс = Beginning MySQL. — М.: «Диалектика», 2007. — 880 с. — ISBN 978-5-8459-1167-4

6. Поль Дюбуа. MySQL, 3-е издание = MySQL, 3ed. — М.: «Вильямс», 2006. — 1168 с. — ISBN 5-8459-1119-2

7. Дмитрий Котеров, Алексей Костарев. PHP. В подлиннике. — Спб.: «БХВ-Петербург», 2005. — С. 1120. — ISBN 5-94157-245-Х

8. Мэтт Зандстра. PHP: объекты, шаблоны и методики программирования, 3-е издание = PHP Objects, Patterns and Practice, Third Edition. — М.: «Вильямс», 2010. — С. 560. — ISBN 978-5-8459-1689-1

9. Кристиан Дари, Эмилиан Баланеску. PHP и MySQL: создание интернет-магазина = Beginning PHP and MySQL E-Commerce: From Novice to Professional. — М.:«Вильямс», 2010. — ISBN 978-5-8459-1602-0

10. Джейсон Ленгсторф. PHP и jQuery для профессионалов = Pro PHP and jQuery. — М.: «Вильямс», 2010. — С. 352. — ISBN 978-5-8459-1693-8

11. Кузнецов Максим, Симдянов Игорь. Самоучитель MySQL 5. — Спб.: «БХВ-Петербург», 2006. — С. 560. — ISBN 5-94157-754-0

12. Кузнецов Максим, Симдянов Игорь. MySQL 5. В подлиннике. — Спб.: «БХВ-Петербург», 2006. — С. 1024. — ISBN 5-94157-928-4

13. Костарев А. Ф. PHP 5. — Спб.: «БХВ-Петербург», 2008. — С. 1104. — ISBN 978-5-9775-0315-0

14. Квентин Зервас. Web 2.0: создание приложений на PHP = Practical Web 2.0 Applications with PHP. — М.: «Вильямс», 2009. — С. 544. — ISBN 978-5-8459-1590-0

15. Эд Леки-Томпсон, Алек Коув, Стивен Новицки, Хьяо Айде-Гудман. PHP 5 для профессионалов = Professional PHP 5. — М.: «Диалектика», 2006. — С. 608. — ISBN 0-7645-7282-2

Приложение А

(обязательное)

ЛИСТИНГ ГЕНЕРАТОРА КАТАЛОГА ПРОДУКЦИИ ПРЕДПРИЯТИЯ

index.php

<?php

set_include_path(get_include_path() . PATH_SEPARATOR .

   'Classes/');

require_once 'PHPExcel.php';

require_once 'PHPExcel/IOFactory.php';

/*define('DATE', 'Прайс сформирован:');

define('NAME', 'Название');

define('PRICE', 'Цена');

define('NUMBER', 'Номер');

*/

$eWriter = new ExcelWriter("localhost", "root", "", "catalogesm");

class ExcelWriter

{

   const MIN_ROW = 8;

   private $objPHPExcel;

   private $activeSheetIndex;

   private $row;

   private $mProductName = array(

       'alignment' => array(

           'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,

           'vertical' => PHPExcel_Style_Alignment::VERTICAL_BOTTOM

       ),

       'font' => array(

           'name' => 'Tahoma',

           'size' => '10',

           'bold' => false,

           'color' => array('argb' => 'FF333333')

       ),

   );

   private $mDescription = array(

       'alignment' => array(

           'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,

           'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER

       ),

       'font' => array(

           'name' => 'Tahoma',

           'size' => '8',

           'bold' => false,

           'color' => array('argb' => 'FF333333')

       )

   );

   private $borderOutline = array(

       'borders' => array(

           'outline' => array(

               'style' => PHPExcel_Style_Border::BORDER_THIN,

           )

       )

   );

   private $h2Style = array(

       'font' => array(

           'name' => 'Tahoma',

           'size' => '9',

           'bold' => true,

           'color' => array('argb' => 'FF333333')

       ),

       'alignment' => array(

           'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,

           'vertical' => PHPExcel_Style_Alignment::VERTICAL_TOP

       ),

       'fill' => array(

           'type' => PHPExcel_Style_Fill::FILL_SOLID,

           'startcolor' => array('argb' => 'FFC4C4C4')

       )/*,

       'borders' => array(

           'outline' => array(

               'style' => PHPExcel_Style_Border::BORDER_THIN,

           ),

           'bottom' => array(

               'style' => PHPExcel_Style_Border::BORDER_THIN,

           )

       )*/

   );

   public function __construct($hostname, $username, $password, $dbName)

   {

       $this->objPHPExcel = new PHPExcel();

       $this->activeSheetIndex = 0;

       $this->row = self::MIN_ROW;

       mysql_connect($hostname, $username, $password) OR DIE("Немогусоздатьсоединениесбазойданных.");

       mysql_select_db($dbName) or die(mysql_error());

       $this->getParentCategory(2, false);

       $this->writeExcelFile();

   }

   private function setHeader()

   {

       $iDrawing = new PHPExcel_Worksheet_Drawing();

       $iDrawing->setPath("images/header_logo.png");

       $iDrawing->setCoordinates("A1");

       $iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());

       $this->objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);

       $this->objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(60);

       $this->objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);

   }

   private function getParentCategory($category, $parent)

   {

       $name_query = "SELECT name FROM  ps_category_lang WHERE id_category=" . $category;

       $name_query_result = mysql_query($name_query) or die(mysql_error());

       $res2 = mysql_fetch_array($name_query_result);

       if (!$parent) {

           $this->objPHPExcel->createSheet($this->activeSheetIndex);

           $this->objPHPExcel->setActiveSheetIndex($this->activeSheetIndex);

           $str = iconv('windows-1251', 'utf-8', $res2['name']);

           $this->objPHPExcel->getActiveSheet()->setTitle($str);

           $this->activeSheetIndex++;

           $this->row = self::MIN_ROW;

           $this->setHeader();

           echo "<h1>" . $res2['name'] . "</h1><br />\n";

       } else {

           echo "<h2>" . $res2['name'] . "</h2><br />\n";

           $str = iconv('windows-1251', 'utf-8', $res2['name']);

           $this->objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $this->row, $str);

           $this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(0, $this->row)->applyFromArray($this->h2Style)->applyFromArray($this->borderOutline);

           $this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(1, $this->row)->applyFromArray($this->borderOutline);

           $this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(2, $this->row)->applyFromArray($this->borderOutline);

           $this->objPHPExcel->getActiveSheet()->mergeCellsByColumnAndRow(0, $this->row, 2, $this->row);

           $this->row++;

       }

       $parent_query = "SELECT id_category FROM ps_category WHERE id_parent =" . $category;

       $result = mysql_query($parent_query) or die(mysql_error());

       while ($res = mysql_fetch_array($result)) {

           if ($category != 2) {

               $this->getParentCategory($res['id_category'], true);

           } else {

               $this->getParentCategory($res['id_category'], false);

           }

       }

       $product_query = "SELECT b.name, b.description_short, c.id_image, d.price FROM ps_category_product a, ps_product_lang b, ps_image c, ps_product d WHERE a.id_product = b.id_product AND a.id_product = c.id_product AND a.id_product = d.id_product AND b.id_lang = 7 AND c.cover = 1 AND a.id_category =" . $category;

       $product_query_result = mysql_query($product_query) or die(mysql_error());

       while ($res3 = mysql_fetch_array($product_query_result)) {

           echo "<p>" . $res3['name'] . "</p>\n";

           $name = iconv('windows-1251', 'utf-8', $res3['name']);

           $image = iconv('windows-1251', 'utf-8', $res3['id_image']);

           $price = iconv('windows-1251', 'utf-8', $res3['price']);

           // Currency

           $price = round($price * 8700);

           $description_short = iconv('windows-1251', 'utf-8', $res3['description_short']);

           $this->objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $this->row, $name);

           $this->objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $this->row, $description_short);

           $this->objPHPExcel->getActiveSheet()->setCellValueExplicitByColumnAndRow(2, $this->row, $price, PHPExcel_Cell_DataType::TYPE_NUMERIC);

           $this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(0, $this->row)->applyFromArray($this->mProductName)->getAlignment()->setWrapText(true);

           $this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(1, $this->row)->applyFromArray($this->mDescription)->getAlignment()->setWrapText(true);

           $this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(2, $this->row)->applyFromArray($this->mDescription)->getNumberFormat()->setFormatCode('#,##руб');

           $this->getProductImage($image);

           $this->row++;

       }

   }

   private function getProductImage($id){

       $t = 1;

       $x = $id;

       $tmp[] = NULL;

       while($x != 0){

           $tmp[] = $x % ($t * 10);

           $x = (int)($x / 10);

       }

       $path = "../shop1/img/p/";

       foreach (array_reverse($tmp) as $value) {

           $path .= $value."/";

       }

       $path .= $id."-home_default.jpg";

       echo "<img src=\"".$path."\" />";

       $iDrawing = new PHPExcel_Worksheet_Drawing();

       $iDrawing->setPath($path);

       $iDrawing->setCoordinates("A".$this->row);

       $iDrawing->setOffsetY(10);

       $iDrawing->setOffsetX(10);

       $iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());

       $this->objPHPExcel->getActiveSheet()->getRowDimension($this->row)->setRowHeight($iDrawing->getHeight());

   }

   public function writeExcelFile()

   {

       $objWriter = PHPExcel_IOFactory::createWriter($this->objPHPExcel, 'Excel2007');

       $objWriter->save('price.xlsx');

   }

}

?>

products.php

<?php

Error_Reporting(E_ALL & ~E_NOTICE);

define('DEBUG', false);

define('_PS_DEBUG_SQL_', false);

define('PS_SHOP_PATH', 'catalog.esm.by');

define('PS_WS_AUTH_KEY', 'HNY7LS6196SK1P656HMW4ELY6OMIHGE7');

set_include_path('Classes/');

require_once 'Classes/PSWebServiceLibrary.php';

require('../config/config.inc.php');

include('db_conn.php');

set_time_limit(300);

class Products

{

   private $last_p_manufacture = '';

   private $last_id_manufacture = 0;

   private $last_p_category = '';

   private $last_id_category = 0;

   private $last_id_category_par = 0;

   private $last_id_category_par_par = 0;

   public function glob_files($path){

       $file_size = filesize($path);

       $FILES = glob(_PS_DOWNLOAD_DIR_.'/*');

       foreach($FILES as $key => $file){

           if( filesize( $file ) == $file_size ){

               if (md5_file($path) == md5_file($file)){

                   return ($file);

               }

           }

       }

       return (false);

   }

   public function encodestring($string)

   {

       $table = array(

           'А' => 'A',

           'Б' => 'B',

'В' => 'V',

           'Г' => 'G',

           'Д' => 'D',

           'Е' => 'E',

           'Ё' => 'YO',

           'Ж' => 'ZH',

           'З' => 'Z',

           'И' => 'I',

           'Й' => 'J',

           'К' => 'K',

           'Л' => 'L',

           'М' => 'M',

           'М' => 'N',

           'О' => 'O',

           'П' => 'P',

           'Р' => 'R',

           'С' => 'S',

           'Т' => 'T',

           'У' => 'U',

           'Ф' => 'F',

           'Х' => 'H',

           'Ц' => 'C',

           'Ч' => 'CH',

           'Ш' => 'SH',

           'Щ' => 'CSH',

           'Ь' => '',

           'Ы' => 'Y',

           'Ъ' => '',

           'Э' => 'E',

           'Ю' => 'YU',

           'Я' => 'YA',

           'а' => 'a',

           'б' => 'b',

           'в' => 'v',

           'г' => 'g',

           'д' => 'd',

           'е' => 'e',

           'ё' => 'yo',

           'ж' => 'zh',

           'з' => 'z',

           'и' => 'i',

           'й' => 'j',

           'к' => 'k',

           'л' => 'l',

           'м' => 'm',

           'н' => 'n',

           'о' => 'o',

           'п' => 'p',

           'р' => 'r',

           'с' => 's',

           'т' => 't',

           'у' => 'u',

           'ф' => 'f',

           'х' => 'h',

           'ц' => 'c',

           'ч' => 'ch',

           'ш' => 'sh',

           'щ' => 'csh',

           'ь' => '',

           'ы' => 'y',

           'ъ' => '',

           'э' => 'e',

           'ю' => 'yu',

'я' => 'ya',

       );

       $output = str_replace(

           array_keys($table),

           array_values($table),$string

       );

       return $output;

   }

   public function Attachment($id_for_attach,$p_name, $doc_path, $id_product){

       if(file_exists($doc_path.$id_for_attach.'.pdf')){

           $mime = 'application/pdf';

           $path = $doc_path.$id_for_attach.'.pdf';

           $type = '.pdf';

           filetype($path);

       }

       elseif(file_exists($doc_path.$id_for_attach.'.doc')){

           $mime = 'application/msword';

           $path = $doc_path.$id_for_attach.'.doc';

           $type = '.doc';

       }

       elseif(file_exists($doc_path.$id_for_attach.'.docx')){

           $mime = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';

           $path = $doc_path.$id_for_attach.'.docx';

           $type = '.docx';

       }

       elseif(file_exists($doc_path.$id_for_attach.'.rar')){

           $mime = 'application/octet-stream';

           $path = $doc_path.$id_for_attach.'.rar';

           $type = '.rar';

       }

       elseif(file_exists($doc_path.$id_for_attach.'.zip')){

           $mime = 'application/x-zip-compressed';

           $path = $doc_path.$id_for_attach.'.zip';

$type = '.zip';

       }

else{

echo 'Не удалось найти приложение - ';

return;

       }

       $comparison_file = $this->glob_files($path);

       $p_name_download = $this->encodestring($p_name);

       echo $p_name_download;

       if ($comparison_file == TRUE){

           $comparison_file = basename($comparison_file);

           $attachment = new Attachment();

           $attachment->name[7] = 'Паспорт '.$p_name.$type;

           $attachment->file = $comparison_file;

           $attachment->mime = $mime;

           $attachment->file_name = $p_name_download.$type;

           $attachment->add();

           $attachment->attachProduct($id_product);

           $attach_query = 'SELECT id_attachment FROM ps_attachment_lang WHERE name LIKE \'Паспорт '.$p_name.$type.'\'';

           $attach_query_result = mysql_query($attach_query) or die(mysql_error());

           $attach_query_par = mysql_fetch_array ($attach_query_result);

           $attachment->attachToProduct($id_product, $attach_query_par);

       }

       else{

           do $uniqid = sha1(microtime());

           while (file_exists(_PS_DOWNLOAD_DIR_.$uniqid));

           if (copy($path, _PS_DOWNLOAD_DIR_.$uniqid)){

               if (isset($uniqid))

               {

                   $attachment = new Attachment();

                   $attachment->name[7] = 'Паспорт '.$p_name.$type;

                   $attachment->file = $uniqid;

                   $attachment->mime = $mime;

                   $attachment->file_name = $p_name_download.$type;

                   $attachment->add();

                   $attachment->attachProduct($id_product);

                   $attach_query = 'SELECT id_attachment FROM ps_attachment_lang WHERE name LIKE \'Паспорт '.$p_name.$type.'\'';

                   $attach_query_result = mysql_query($attach_query) or die(mysql_error());

                   $attach_query_par = mysql_fetch_array ($attach_query_result);

                   $attachment->attachToProduct($id_product, $attach_query_par);

               }

           }

       }

   }

   public function link_rewrite($str){

       if (function_exists('mb_strtolower'))

           $str = mb_strtolower($str, 'utf-8');

       $str = trim($str);

       if (!function_exists('mb_strtolower'))

       $this->replaceAccentedChars($str);

   $str = preg_replace('/[^a-zA-Z0-9\s\'\:\/\[\]-\pL]/u', '', $str);

   $str = preg_replace('/[\s\'\:\/\[\]-]+/', ' ', $str);

   $str = str_replace(array(' ', '/'), '-', $str);

   if (!function_exists('mb_strtolower'))

       $str = strtolower($str);

   return $str;

   }

   public function replaceAccentedChars($str)

   {

       $patterns = array(

           /* Lowercase */

           '/[\x{0105}\x{00E0}\x{00E1}\x{00E2}\x{00E3}\x{00E4}\x{00E5}]/u',

           '/[\x{00E7}\x{010D}\x{0107}]/u',

           '/[\x{010F}]/u',

           '/[\x{00E8}\x{00E9}\x{00EA}\x{00EB}\x{011B}\x{0119}]/u',

           '/[\x{00EC}\x{00ED}\x{00EE}\x{00EF}]/u',

           '/[\x{0142}\x{013E}\x{013A}]/u',

           '/[\x{00F1}\x{0148}]/u',

           '/[\x{00F2}\x{00F3}\x{00F4}\x{00F5}\x{00F6}\x{00F8}]/u',

           '/[\x{0159}\x{0155}]/u',

           '/[\x{015B}\x{0161}]/u',

           '/[\x{00DF}]/u',

           '/[\x{0165}]/u',

           '/[\x{00F9}\x{00FA}\x{00FB}\x{00FC}\x{016F}]/u',

           '/[\x{00FD}\x{00FF}]/u',

           '/[\x{017C}\x{017A}\x{017E}]/u',

           '/[\x{00E6}]/u',

           '/[\x{0153}]/u',

           /* Uppercase */

           '/[\x{0104}\x{00C0}\x{00C1}\x{00C2}\x{00C3}\x{00C4}\x{00C5}]/u',

           '/[\x{00C7}\x{010C}\x{0106}]/u',

           '/[\x{010E}]/u',

           '/[\x{00C8}\x{00C9}\x{00CA}\x{00CB}\x{011A}\x{0118}]/u',

           '/[\x{0141}\x{013D}\x{0139}]/u',

           '/[\x{00D1}\x{0147}]/u',

           '/[\x{00D3}]/u',

           '/[\x{0158}\x{0154}]/u',

           '/[\x{015A}\x{0160}]/u',

           '/[\x{0164}]/u',

           '/[\x{00D9}\x{00DA}\x{00DB}\x{00DC}\x{016E}]/u',

           '/[\x{017B}\x{0179}\x{017D}]/u',

           '/[\x{00C6}]/u',

           '/[\x{0152}]/u');

       $replacements = array(

           'a', 'c', 'd', 'e', 'i', 'l', 'n', 'o', 'r', 's', 'ss', 't', 'u', 'y', 'z', 'ae', 'oe',

           'A', 'C', 'D', 'E', 'L', 'N', 'O', 'R', 'S', 'T', 'U', 'Z', 'AE', 'OE'

       );

       return preg_replace($patterns, $replacements, $str);

   }

   public function PS_new_product($id_for_img, $image_path, $doc_path, $p_name, $p_desc, $p_desc_sh, $p_price, $p_category, $p_manufacture, $p_parent) {

       $webService = new PrestaShopWebservice(PS_SHOP_PATH, PS_WS_AUTH_KEY, DEBUG);

       $p_category = trim($p_category);

       $p_manufacture = trim($p_manufacture);

       $p_desc = trim($p_desc);

       $p_desc = strip_tags($p_desc, '<ul><ol><li><table><tr><td><tbody>');

       $p_desc = preg_replace('/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i','<$1$2>', $p_desc);

       $p_desc_sh = preg_replace('/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i','<$1$2>', $p_desc_sh);

       $p_desc_sh = strip_tags($p_desc_sh, '<p><div><ul><ol><li><table><tr><td><tbody>');

       $p_desc_sh = trim($p_desc_sh);

       if ($p_manufacture != $this->last_p_manufacture)

       {

           $manufacturer_query = 'SELECT id_manufacturer FROM ps_manufacturer WHERE name LIKE \'' .$p_manufacture.'\'';

           $manufacturer_query_result = mysql_query($manufacturer_query) or die(mysql_error());

           $this->last_id_manufacture = mysql_fetch_array($manufacturer_query_result);

           $this->last_id_manufacture = $this->last_id_manufacture['id_manufacturer'];

           $this->last_p_manufacture = $p_manufacture;

       }

       if (($p_parent == 0) || ($p_parent == NULL)){

           if ($p_category != $this->last_p_category)

           {

               $category_query = 'SELECT id_category FROM ps_category_lang WHERE name LIKE \'' .$p_category.'\'';

               $category_query_result = mysql_query($category_query) or die(mysql_error());

               $this->last_id_category = mysql_fetch_array($category_query_result);

               $this->last_id_category = (integer)$this->last_id_category['id_category'];

               $this->last_p_category = $p_category;

               $category_par_query = 'SELECT id_parent FROM ps_category WHERE id_category = '.$this->last_id_category;

               $category_par_query_result = mysql_query($category_par_query) or die(mysql_error());

               $this->last_id_category_par = mysql_fetch_array($category_par_query_result);

               $this->last_id_category_par = (integer)$this->last_id_category_par['id_parent'];

               $category_par_par_query = 'SELECT id_parent FROM ps_category WHERE id_category = '.$this->last_id_category_par;

               $category_par_par_query_result = mysql_query($category_par_par_query) or die(mysql_error());

               $this->last_id_category_par_par = mysql_fetch_array($category_par_par_query_result);

               $this->last_id_category_par_par = (integer)$this->last_id_category_par_par['id_parent'];

           }

       }

       else{

           if ($p_category != $this->last_p_category)

           {

               $category_par_query = 'SELECT id_category FROM ps_category_lang WHERE name LIKE \'' .$p_parent.'\'';

               $category_par_query_result = mysql_query($category_par_query) or die(mysql_error());

               $this->last_id_category_par = mysql_fetch_array ($category_par_query_result);

               $this->last_id_category_par = (integer)$this->last_id_category_par['id_category'];

               $category_par_par_query = 'SELECT id_parent FROM ps_category WHERE id_category = '.$this->last_id_category_par;

               $category_par_par_query_result = mysql_query($category_par_par_query) or die(mysql_error());

               $this->last_id_category_par_par = mysql_fetch_array($category_par_par_query_result);

               $this->last_id_category_par_par = (integer)$this->last_id_category_par_par['id_parent'];

               $category_query = 'SELECT id_category FROM ps_category_lang WHERE name LIKE \'' .$p_category.'\' AND id_category = (SELECT id_category FROM ps_category WHERE id_parent LIKE \''.$this->last_id_category_par.'\')';

               $category_query_result = mysql_query($category_query) or die(mysql_error());

               $this->last_id_category = mysql_fetch_array($category_query_result);

               $this->last_id_category = (integer)$this->last_id_category['id_category'];

               $this->last_p_category = $p_category;

           }

       }

       $p_link_rewrite = $this->link_rewrite($p_name);

       $p_meta_title = $p_manufacture.' '.$p_name;

       $p_desc_sh_no_tags = strip_tags($p_desc_sh);

       preg_match('`[:\.\r\n]`',$p_desc_sh_no_tags, $M);

       $p_meta_description = substr($p_desc_sh_no_tags, 0, strpos($p_desc_sh_no_tags, $M[0])+1);

       $p_meta_keywords = mb_strtolower($p_manufacture,'UTF-8').' '.$p_link_rewrite.','.$p_link_rewrite.','.mb_strtolower($p_manufacture,'UTF-8');

       $p_l_id = '7';

       $xml = $webService -> get(array('url' => PS_SHOP_PATH . '/api/products?schema=blank'));

       $resources = $xml -> children() -> children();

       unset($resources -> id);

       $resources -> id_manufacturer = $this->last_id_manufacture;

       $resources -> id_manufacturer['xlink:href'] = PS_SHOP_PATH . '/api/manufactures/' . $this->last_id_manufacture;

       unset($resources -> id_supplier);

       $resources -> id_category_default = $this->last_id_category;

       $resources -> id_category_default['xlink:href'] = PS_SHOP_PATH . '/api/categories/' . $this->last_id_category;

       unset($resources -> cache_default_attribute);

       unset($resources -> id_default_combination);

       $resources -> id_tax_rules_group = 4;

       $resources -> id_tax_rules_group['xlink:href'] = PS_SHOP_PATH . '/api/id_tax_rules_group/' . 4;

       unset($resources -> position_in_category);

       unset($resources -> manufacturer_name);

       unset($resources -> quantity);

       $resources -> id_shop_default = 1;

       $resources -> minimal_quantity = 1;

       $resources -> price = $p_price;

       $resources -> active = 1;

       $resources -> available_for_order = 1;

       unset($resources -> available_date);

       $resources -> condition = 'new';

       $resources -> show_price = 1;

       $resources -> indexed = 1;

       $resources -> visibility = 'both';

       unset($resources -> advanced_stock_management);

       unset($resources -> date_add);

       unset($resources -> date_upd);

       $node = dom_import_simplexml($resources -> meta_description -> language[0][0]);

       $no = $node -> ownerDocument;

       $node -> appendChild($no -> createCDATASection($p_meta_description));

       $resources -> meta_description -> language[0][0] = $p_meta_description;

       $resources -> meta_description -> language[0][0]['id'] = $p_l_id;

       $resources -> meta_description -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;

       $node = dom_import_simplexml($resources -> meta_keywords -> language[0][0]);

       $no = $node -> ownerDocument;

       $node -> appendChild($no -> createCDATASection($p_meta_keywords));

       $resources -> meta_keywords -> language[0][0] = $p_meta_keywords;

       $resources -> meta_keywords -> language[0][0]['id'] = $p_l_id;

       $resources -> meta_keywords -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;

       $resources -> meta_title -> language[0][0] = $p_meta_title;

       $resources -> meta_title -> language[0][0]['id'] = $p_l_id;

       $resources -> meta_title -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;

       $resources -> link_rewrite -> language[0][0] = $p_link_rewrite;

       $resources -> link_rewrite -> language[0][0]['id'] = $p_l_id;

       $resources -> link_rewrite -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;

       $resources -> name -> language[0][0] = $p_name;

       $resources -> name -> language[0][0]['id'] = $p_l_id;

       $resources -> name -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;

       $node = dom_import_simplexml($resources -> description -> language[0][0]);

       $no = $node -> ownerDocument;

       $node -> appendChild($no -> createCDATASection($p_desc));

       $resources -> description -> language[0][0]['id'] = $p_l_id;

       $resources -> description -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;

       $node = dom_import_simplexml($resources -> description_short -> language[0][0]);

       $no = $node -> ownerDocument;

       $node -> appendChild($no -> createCDATASection($p_desc_sh));

       $resources -> description_short -> language[0][0]['id'] = $p_l_id;

       $resources -> description_short -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;

       unset($resources -> available_now);

       unset($resources -> available_later);

       $resources ->associations->categories->category[0]->id = $this->last_id_category_par_par;

       $resources -> associations->categories->category[0]['xlink:href'] = PS_SHOP_PATH . '/api/categories/' . $this->last_id_category_par_par;

       $resources ->associations->categories->category[1]->id = $this->last_id_category_par;

       $resources -> associations->categories->category[1]['xlink:href'] = PS_SHOP_PATH . '/api/categories/' . $this->last_id_category_par;

       $resources ->associations->categories->category[2]->id = $this->last_id_category;

       $resources -> associations->categories->category[2]['xlink:href'] = PS_SHOP_PATH . '/api/categories/' . $this->last_id_category;

       unset($resources -> associations->product_features);

       $opt = array('resource' => 'products');

       $opt['postXml'] = $xml -> asXML();

       $xml = $webService -> add($opt);

       unset($opt);

       $product_id_image_query = 'SELECT id_product FROM ps_product_lang WHERE id_product=(SELECT MAX(id_product) FROM ps_product) AND name LIKE \'' .$p_name.'\'';

       $product_id_image_query_result = mysql_query($product_id_image_query) or die(mysql_error());

       $product_id_image = mysql_fetch_array($product_id_image_query_result);

       $product_id_image = $product_id_image['id_product'];

       $url = 'http://catalog.esm.by/api/images/products/'.$product_id_image;

       $ch = curl_init();

       curl_setopt($ch, CURLOPT_URL, $url);

       curl_setopt($ch, CURLOPT_POST, true);

       curl_setopt($ch, CURLOPT_USERPWD, PS_WS_AUTH_KEY.':');

       if (file_exists($image_path.$id_for_img.'.jpg')){

           $format = 'jpg';

       }

       elseif (file_exists($image_path.$id_for_img.'.png')){

           $format = 'png';

       }

       elseif (file_exists($image_path.$id_for_img.'.gif')){

           $format = 'gif';

       }

       elseif (file_exists($image_path.$id_for_img.'.jpeg')){

           $format = 'jpeg';

       }

       else

           echo 'Строка '.$id_for_img.' - ' .$p_name.' - не удалось загрузить изображение.<br/>';

$image_path = $image_path.$id_for_img.'.'.$format;

       curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => '@'.$image_path.';type=image/'.$format));

       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

       curl_exec($ch);

       curl_close($ch);

       $this->Attachment($id_for_img, $p_name, $doc_path, $product_id_image);

       echo 'Строка '.$id_for_img.' - ' .$p_name.' - продукт добавлен.<br/>';

}

}

?>




Похожие работы, которые могут быть Вам интерестны.

1. Программное обеспечение для байесовского анализа. Процедура получения новых значений параметров в Sawtooth

2. РАЗРАБОТКА СИСТЕМЫ РАБОТЫ ПОДСИСТЕМЫ ЛРГИЧЕСКОГО АНАЛИЗА СКЛАДА ТОРГОВОГО ПРЕДПРИЯТИЯ

3. Разработка каталога продукции с применением технологий My SQL, HTML и PHP

4. Базовое системное программное обеспечение ПК

5. Бизнес-план программное обеспечение Neuromaps

6. Программное и техническое обеспечение организации ООО «Дружба»

7. Программное обеспечение для пропускной системы на основе технологии NFC

8. Источники получения информации ребенком

9. Улучшение качества обслуживания пассажиров автовокзала в области получения ими справочной информации

10. Правовое обеспечение оценки стоимости земли и природных ресурсов