Веб-приложение для мониторинга каталога продукции предприятия

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    58,95 Кб
  • Опубликовано:
    2017-01-15
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Веб-приложение для мониторинга каталога продукции предприятия

Содержание

ВВЕДЕНИЕ

1.      АНАЛИЗ ИНФОРМАЦИИ И ПОСТАНОВКА ЗАДАЧ

1.1    Язык PHP

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

1.1.2 Синтаксис

1.2    База данных MySQL

1.2.1 Происхождение MySQL

1.2.2 Платформы

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

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

1.3.1 osCommerce

1.3.2 VirtueMart

1.3.3 Magento

1.4    Presta Shop

1.4.1 Преимущества

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

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

1.5.1 Язык XML

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

1.5.3 Объявление XML

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

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

1.6    Office Open XML

1.6.1 Стандартизация

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

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

2.2    Подключение к базе данных

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

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

3.      ФОРМАТ XLS

4.      СТИЛИ ФОРМАТИРОВАНИЯ КАТАЛОГА ПРОДУКЦИИ

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

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

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

4.4    Макросы

5.      ОСНОВНЫЕ ПОЛОЖЕНИЯ РАСЧЁТА СТОИМОСТИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

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

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

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

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

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

6.      ЭКСПЕРТНЫЙ МЕТОД ОЦЕНКИ УСЛОВИЙ ТРУДА

ЗАКЛЮЧЕНИЕ

СПИСОК ИМПОЛЬЗУЕМЫХ ИСТОЧНИКОВ

ПРИЛОЖЕНИЕ А


 

Введение


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

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

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

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

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

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


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

1.1      Язык PHP

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

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

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

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

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

·        автоматическое извлечение POST и GET-параметров, а также переменных окружения веб-сервера в предопределённые массивы;

·        взаимодействие с большим количеством различных систем управления базами данных (MySQL, MySQLi, SQLite, PostgreSQL, Oracle (OCI8), Oracle, Microsoft SQL Server, Sybase,ODBC, mSQL, IBM DB2, Cloudscape и Apache Derby, Informix, Ovrimos SQL, Lotus Notes, DB++, DBM, dBase, DBX, FrontBase, FilePro, Ingres II, SESAM, Firebird / InterBase, Paradox File Access, MaxDB, Интерфейс PDO);

·        автоматизированная отправка HTTP-заголовков;

·        работа с HTTP-авторизацией;

·        работа с cookies и сессиями;

·        работа с локальными и удалёнными файлами, сокетами;

·        обработка файлов, загружаемых на сервер;

·        работа с XForms.

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

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

1.1.2 Синтаксис

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

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

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

<?php

echo 'Hello, world!';

?>

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

<?= 'Hello, world!' ?>

Открывающий тег вида <?= используется для сокращённой записи конструкций используемых для вывода строки.исполняет код, находящийся внутри ограничителей, таких как <?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-строках (строках, созданных при помощи оператора <<<).рассматривает переход на новую строку как пробел, так же как HTML и другие языки со свободным форматом. Инструкции разделяются с помощью точки с запятой (;), за исключением некоторых случаев, после объявления конструкции if/else и циклов.

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

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

1.2      База данных MySQL

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

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

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

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

1.2.1 Происхождение MySQL

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

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

1.2.2 Платформы

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.2.3 История выпусков

MySQL 4.0

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

·        практически полная реализация ANSI SQL-99, плюс расширения;

·        межплатформенная совместимость;

·        независимые типы таблиц (MyISAM для быстрого чтения, InnoDB для транзакций и ссылочной целостности);

·        транзакции;

·        поддержка SSL;

·        кэширование запросов;

·        репликация: один головной сервер на одного подчинённого, много подчинённых на одного головного;

·        полнотекстовая индексация и поиск с использованием типа таблиц MyISAM;

·        внедрённая библиотека базы данных;

·        поддержка Юникода (UTF-8);

·        таблицы InnoDB, обеспечивающие соответствие требованиям ACID;

·        встроенный сервер, позволяющий включать MySQL в автономные приложения.4.1

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

·        вложенные запросы и производные таблицы.

·        новая система кодировок и сортировок;

·        более быстрый и гибкий протокол клиент-сервер с поддержкой подготовленных запросов, обеспечивающий их оптимальное исполнение;

·        новая программа установки и настройки для Microsoft Windows и Linux;

·        защищённые через OpenSSL соединения клиент-сервер;

·        высоко-оптимизированная библиотека, которая может быть использована в сторонних программах;

·        полноценная поддержка Юникода (UTF-8 и UCS2);

·        стандартные пространственные типы данных GIS, для хранения географической информации;

·        улучшенный полнотекстовый поиск и система помощи.5.0

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

·        хранимые процедуры и функции;

·        обработчики ошибок;

·        курсоры;

·        триггеры;

·        представления;

·        информационная схема (так называемый системный словарь, содержащий метаданные).5.1

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

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

·        Изменено поведение ряда операторов, для обеспечения большей совместимости со стандартом SQL2003.

·        Построчная репликация (англ. row-based replication), при которой в бинарный лог будет записываться только информация о реально измененных строках таблицы вместо оригинального (и, возможно, медленного) текста запроса. Построчную репликацию можно использовать только для определенных типов sql-запросов, в терминах MySQL - смешанная репликация (англ. mixed replication).

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

·        Дополнительный набор функций для обработки XML, реализация поддержки XPath.

·        Новые средства диагностики проблем и утилиты для анализа производительности. Расширены возможности по управлению содержимым лог-файлов, логи теперь могут быть сохранены и в таблицах general_log и slow_log. Утилита mysqlslap позволяет провести нагрузочное тестирование БД с записью времени реакции на каждый запрос.

·        Для упрощения операции обновления подготовлена утилита mysql_upgrade, которая выполнит проверку всех существующих таблиц на предмет совместимости с новой версией, и при необходимости выполнит надлежащие корректировки.

·        MySQL Cluster отныне выпущен как отдельный продукт, базирующийся на MySQL 5.1 и хранилище NDBCLUSTER.

·        Значительные изменения в работе MySQL Cluster, такие, как, например, возможность хранения табличных данных на диске.

·        Возврат к использованию встроенной библиотеки libmysqld, отсутствовавшей в MySQL 5.0.

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

·        Реализация парсера полнотекстового поиска в виде plug-in.

·        Новый тип таблиц Maria (устойчивый к сбоям клон MyISAM).5.5

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

·        Использование по умолчанию движка InnoDB.

·        Поддержка полусинхронного (semi-synchronous) механизма репликации, основанного на патчах к InnoDB от компании Google.

·        Улучшение функций по секционированию данных. Расширенный синтаксис для разбиения больших таблиц на несколько частей, размещенных в файловых системах (partitioning). Добавлены операции RANGE, LIST и метод оптимизации «partition pruning».

·        Новый механизм оптимизации вложенных запросов и JOIN-операций.

·        Переработана система внутренних блокировок.

Интегрированы патчи Google с оптимизацией работы InnoDB на процессорах с большим количеством ядер.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.3      Обзор различных CMS интернет магазинов

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

1.3.1 osCommerce

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

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

·        Совместим со всеми браузерами

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

·        Вы можете добавлять неограниченное количество товаров и разделов

·        Легкая настройка резервного копирования данных (поверьте, это важно)

·        Просмотр статистики заказов и покупателей

·        Поддерживает несколько валют

·        Покупатели могут просматривать историю своих заказов

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

·        Удобный поиск по сайту

·        Покупатель может иметь несколько адресов для доставки

·        Движок поддерживает многие типа платежей (оплата карточкой, чеком, платежным поручением)

·        Поддержка модулей платежных систем (PayPal, Приват24, Webmoney, Яндекс.Деньги, RuPay и так далее)

·        Различная форма оплаты для разных областей

·        Стоимость доставки рассчитывается на основе зоны доставки, веса и цены заказанного товара.

·        Возможность рассчитать налог на товар

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

ПЛЮСЫ:

·        огромное количество форумов поддержки

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

·        несколько тысяч дополнений и плагинов

·        практически неограниченный функционал

МИНУСЫ:

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

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

·        “недружелюбный” интерфейс для пользователя

·        сложность в редактировании дизайна

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

1.3.2 VirtueMart

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

ПЛЮСЫ:

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

·        Возможность расширения. Написано огромное количество модулей, плагинов и компонентов, которые разрабатывали специально по VirtueMart. Мало того, с каждым днем появляется все больше и больше дополнительных разработок, что не может не радовать. По сути, вы сможете построить магазин любой сложности, без необходимости приобретать дорогостоящие модули.

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

МИНУСЫ:

·        Слабая защита скрипта. Если вы планируете сделать большой интернет магазин, то посмотрите в сторону других CMS, так как VirtueMart не сможет вам предоставить качественный уровень защиты ваших данных.

·        Частые “глюки”. Они возникают в основном из-за установки сторонних компонентов. Многие программисты пишут свои модули для VirtueMart, но мало кто проверяет совместимость написанных модулей, поэтому и возникают постоянные конфликты внутри системы.

·        Необходимо время, чтобы ознакомиться с системой. VirtueMart - мощное дополнение к Joomla, но новичку будет трудно разобраться и сообразить что к чему. При возникновении каких-либо проблем часто нужно обращаться к специалисту или искать ответ на специализированных форумах.

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

1.3.3 Magento

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

ПЛЮСЫ:

·        Возможность устанавливать несколько интернет магазинов на одну систему и управлять ими с единого центра. Подобного свойства нет ни у одной другой CMS системы.

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

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

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

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

·        Посетители могут оставлять отзывы, ставить оценку товара.

·        Грамотная SEO оптимизация движка.

МИНУСЫ:

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

·        “Прожорливость” движка. Для CMS Magento требуется качественный быстрый хостинг. Лучший вариант, когда хостинг-провайдер находится в той стране, где и вы.

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

·        Отсутствие модулей для русскоязычных покупателей. Дело даже не в поддержке русского языка, а отсутствие расширений для отечественного сегмента рынка. Например, в Magento нет поддержки российских платежных система (Яндекс. Деньги и Webmoney), которые очень популярны на рынке России. Вам придется нанимать программистов для написания скриптов, что не очень выгодно, особенно если вы планируете бесплатно создать интернет магазин.

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

1.4      Presta Shop

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

За те несколько лет, которые прошли с момента выпуска еще никому не знакомой Prestashop до современной Prestashop-мании, произошло почти 2,5 миллиона скачиваний продукта с сайта разработчика. Каждые полминуты один решительный вебмастер нажимает кнопку «Download for free» на этом сайте! Вы можете в этом убедиться сами, зайдя на prestashop.com! Тем не менее, в этом количестве очень мало скачиваний из России. Оно и понятно - русской версии Prestashop на официальном сайте не найти (хотя ходят слухи, что ее вот-вот русифицирует разработчик) и поэтому русификацией занялись сами пользователи. На #"896530.files/image001.gif">,                       (5.1)

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

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

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

         По формуле (5.1) определим общий объем ПО:=542 + 373 + 893 +475 + 375 + 765 + 1300 =5458 условных машинных команд.

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

Номер функции

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

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

101

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

542

203

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

373

305

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

893

309

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

475

506

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

375

507

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

765

703

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

1300

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

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

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

,                                       (5.2)

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

Тн - нормативная трудоемкость ПО, человеко-дней;сл - дополнительный коэффициент сложности ПО.

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

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

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

,                                (5.3)

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

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

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

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

,                                              (5.4)

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

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

,                                            (5.5)

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

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

Результаты расчетов уточненной трудоемкости и общей плановой численности разработчиков на разных стадиях разработки по формулам (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) определим общую плановую численность разработчиков на стадии рабочего проекта

 чел.

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


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

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

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

.                                              (5.6)

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

,                                                  (5.7)

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

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

По формулам (5.6) и (5.7) определим месячные и тарифные ставки начальника отдела (Tмо, Tчо) и инженера программиста 1-й категории (Tмп, Tчп) =262000*3.98=1042760 рублей;чо = 1042760/169,8 =6141,107 рублей;мп=262000*2,48 = 649760рублей;чп =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 руб.

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

Отчисления в фонд социальной защиты населения Зсз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 Вт в час составят:

РЭ = 


,                                             (5.12)

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

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

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

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

, ден. ед.              (5.13)

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

По формуле (5.13) определим общую сумму расходов=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 рублей.

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


Общая сумма расходов на разработку (с затратами на сопровождение и адаптацию) как полная себестоимость ПО Сп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 рублей.

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

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


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

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

Для проведения экспертного анализа необходимо прежде всего определить его цель. Правильно сформулированная цель позволит избежать неконкретных оценок и получить объективные результаты. Далее требуется определить и четко сформулировать вопросы, на которые должны ответить эксперты. Вопросы - перечень факторов - помещают в анкету (экспертный лист), в которой указывают условия ответов. Чтобы избежать «навязывания» эксперту предопределенного результата, вопросы располагаются в случайной последовательности. Для получения такой последовательности могут быть использованы таблицы равномерно распределенных случайных чисел (таблицы 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.  (сумма рангов)=1   

где n - число факторов;- номер фактора;ij - ранг фактора по оценке 1- го эксперта.

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

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

                        Ri1 Ri2....Rij.... R1n

                 ∑Rij=   Rji Rj2.... Rij.... Rjn

                         Rm1 Rm2....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=1, 2;u - число факторов с совпавшими рангами в группе с номером 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 - расхождение групповых оценок;i 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

Отсюда

                1    mi -mj

    Е(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...номер итерации;i=(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

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

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

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

5. Роберт Шелдон, Джоффрей Мойе. MySQL 5: базовый курс = Beginning MySQL. - М.: «Диалектика» <http://ru.wikipedia.org/w/index.php?title=%D0%94%D0%B8%D0%B0%D0%BB%D0%B5%D0%BA%D1%82%D0%B8%D0%BA%D0%B0_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2007. - 880 с. - ISBN 978-5-8459-1167-4 <http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9785845911674>

. Поль Дюбуа. MySQL, 3-е издание = MySQL, 3ed. - М.: «Вильямс» <http://ru.wikipedia.org/w/index.php?title=%D0%92%D0%B8%D0%BB%D1%8C%D1%8F%D0%BC%D1%81_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2006. - 1168 с. - ISBN 5-8459-1119-2 <http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/5845911192>

. Дмитрий Котеров, Алексей Костарев. PHP. В подлиннике. - Спб.: «БХВ-Петербург» <http://ru.wikipedia.org/w/index.php?title=%D0%91%D0%A5%D0%92-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2005. - С. 1120. - ISBN 5-94157-245-Х

. Мэтт Зандстра. PHP: объекты, шаблоны и методики программирования, 3-е издание = PHP Objects, Patterns and Practice, Third Edition. - М.: «Вильямс» <http://ru.wikipedia.org/w/index.php?title=%D0%92%D0%B8%D0%BB%D1%8C%D1%8F%D0%BC%D1%81_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2010. - С. 560. - ISBN 978-5-8459-1689-1 <http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9785845916891>

. Кристиан Дари, Эмилиан Баланеску. PHP и MySQL: создание интернет-магазина = Beginning PHP and MySQL E-Commerce: From Novice to Professional. - М.:«Вильямс» <http://ru.wikipedia.org/w/index.php?title=%D0%92%D0%B8%D0%BB%D1%8C%D1%8F%D0%BC%D1%81_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2010. - ISBN 978-5-8459-1602-0 <http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9785845916020>

. Джейсон Ленгсторф. PHP и jQuery для профессионалов = Pro PHP and jQuery. - М.: «Вильямс» <http://ru.wikipedia.org/w/index.php?title=%D0%92%D0%B8%D0%BB%D1%8C%D1%8F%D0%BC%D1%81_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2010. - С. 352. - ISBN 978-5-8459-1693-8 <http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9785845916938>

. Кузнецов Максим, Симдянов Игорь. Самоучитель MySQL 5. - Спб.: «БХВ-Петербург» <http://ru.wikipedia.org/w/index.php?title=%D0%91%D0%A5%D0%92-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2006. - С. 560. - ISBN 5-94157-754-0 <http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/5941577540>

. Кузнецов Максим, Симдянов Игорь. MySQL 5. В подлиннике. - Спб.: «БХВ-Петербург» <http://ru.wikipedia.org/w/index.php?title=%D0%91%D0%A5%D0%92-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2006. - С. 1024. - ISBN 5-94157-928-4 <http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/5941579284>

. Костарев А. Ф. PHP 5. - Спб.: «БХВ-Петербург» <http://ru.wikipedia.org/w/index.php?title=%D0%91%D0%A5%D0%92-%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2008. - С. 1104. - ISBN 978-5-9775-0315-0 <http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9785977503150>

. Квентин Зервас. Web 2.0: создание приложений на PHP = Practical Web 2.0 Applications with PHP. - М.: «Вильямс» <http://ru.wikipedia.org/w/index.php?title=%D0%92%D0%B8%D0%BB%D1%8C%D1%8F%D0%BC%D1%81_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2009. - С. 544. - ISBN 978-5-8459-1590-0 <http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9785845915900>

. Эд Леки-Томпсон, Алек Коув, Стивен Новицки, Хьяо Айде-Гудман. PHP 5 для профессионалов = Professional PHP 5. - М.: «Диалектика» <http://ru.wikipedia.org/w/index.php?title=%D0%94%D0%B8%D0%B0%D0%BB%D0%B5%D0%BA%D1%82%D0%B8%D0%BA%D0%B0_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2006. - С. 608. - ISBN 0-7645-7282-2 <http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/0764572822>

Приложение А

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

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

index.php

<?php_include_path(get_include_path() . PATH_SEPARATOR .

 'Classes/');_once 'PHPExcel.php';_once 'PHPExcel/IOFactory.php';

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

define('NAME', 'Название');('PRICE', 'Цена');('NUMBER', 'Номер');

*/

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

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_Reporting(E_ALL & ~E_NOTICE);('DEBUG', false);('_PS_DEBUG_SQL_', false);('PS_SHOP_PATH', 'catalog.esm.by');('PS_WS_AUTH_KEY', 'HNY7LS6196SK1P656HMW4ELY6OMIHGE7');_include_path('Classes/');_once 'Classes/PSWebServiceLibrary.php';('../config/config.inc.php');('db_conn.php');_time_limit(300);

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){

   $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_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/>';

 }

}

?>

Похожие работы на - Веб-приложение для мониторинга каталога продукции предприятия

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!