Вы находитесь на странице: 1из 75

Частное учреждение образования

«Колледж бизнеса и права»

ДОПУЩЕН К ЗАЩИТЕ
Заместитель директора
по учебной работе
______________ И.В.Малафей
«___»________________ 2021

Разработка веб-приложения компании «Be a Blessing» для организации


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

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

ДП Т.795011.401

Председатель цикловой комиссии (Т.Г. Багласова )

Руководитель проекта (Н.В. Ржиутская)

Консультант по экономической части (М.А. Григораш )

Консультант по охране труда (В.С. Кудласевич)

Учащийся (А.А. Гром )

Рецензент ( )

2021
Содержание
Введение 3
1 Объектно-ориентированный анализ и проектирование приложения 4
1.1 Назначение и цели создания Web-приложения 4
1.2 Проектирование модели 6
2 Проектирование Web-приложения 9
2.1 Требования к Web-приложению 9
2.2 Структура Web-приложения 9
2.3 Проектирование макета Web-приложения 12
2.4 Программно-технические средства, необходимые для разработки приложения 14
2.5 Защита и сохранность данных 16
2.6 Организация и ведение информационной базы(модели) 16
3 Реализация Web-приложения 18
3.1 Разработка административной части приложения 18
3.2 Разработка клиентской части приложения 19
3.3 Описание используемых функций и процедур 20
4 Описание Web-приложения 22
4.1 Общие сведения 22
4.2 Функциональное назначение 22
4.3 Описание разделов сайта 22
5 Методика испытаний 30
5.1 Технические требования 30
5.2 Функциональное тестирование 30
6 Применение 33
6.1 Назначение приложения 33
6.2 Программно-аппаратное обеспечение сервера и клиента 33
7 Охрана труда и окружающей среды 34
7.1 Правовые, нормативные, социально-экологические и организационные вопросы охраны труда 34
7.2 Обеспечение электробезопасности при эксплуатации ПЭВМ. 36
7.3 Пожарная безопасность 38
7.4 Охрана окружающей среды 39
8 Экономический раздел 41
8.1 Технико-экономическое обоснование разработки программного средства 41
8.2 Составление плана по разработке программного средства 41
8.3 Определение цены программного средства 41
8.4 Экономическая эффективность разработки 45
Заключение 47
Список информационных источников 48
Приложение А. Текст программных модулей 49

Разработка веб-приложения компании


Изм. Лист № докум. Подпись Дата
ДП Т.795011.401 ПЗ
«Be a Blessing» для организации
благотворительных акций с целью сбора
Разраб. Гром А.А. средств нуждающимся в социально- Лит. Лист Листов
Изм. Лист Ржиутская
Провер. № докум.
Н.В. Подпись Дата 74
финансовой поддержке 2
Разраб.
Т. контр. Багласова Т.Г. Лит. Лист Листов
Провер. Маркевич К.О.
Багласова Е.В. 2 44
Н. контр.
Т. контр.
Утверд.
Михалевич
Багласова В.Ю.
Т.Г. ОП Т.717013 КБП
Н. контр.
Утверд. Отчет по преддипломной КБП
практике
3
Введение

В настоящее время существует большое количество web-приложений и сайтов,


предоставляющих возможность вносить деньги на счета благотворительных компаний. В эпоху
потребления важным занятием становится возможность делится помогать нуждающимся
людям, для это существую web-приложения, в которых можно это сделать. Самым популярным
аналогом данного приложения является web-приложение «Uniceft»
Задачей на дипломное проектирование является реализация web-приложения для
внесения денег в благотворительные организации, которое будет предоставлять возможность
создания собственной учетной записи по приглашениям и публикации компаний, в которые
надо будет внести деньги. Также будет обеспечено хранение необходимой информации в базе
данных.
Отчет по преддипломной практике состоит из шести разделов, содержащих
необходимую информацию по организации эксплуатации программного приложения.
В первом разделе «Объектно-ориентированный анализ и проектирование приложения»
раскрывается организационная сущность задачи, описывается предметная область, и
назначение и цели создания Web-приложения. Описываются новые возможности Web-
приложения, а также ее отличия от предыдущих версий, перечисляются основные функции
приложения. Строится информационная модель, отражающая сущности задачи, их свойства и
взаимосвязи.
Во втором разделе «Проектирование Web-приложения» перечисляются требования к
Web-приложению, его структура проектирование макета, программно-технические средства
необходимые для разработки, защита и сохранность данных, организация и ведение
информационной базы(модели).
В третьем разделе «Реализация Web-приложения» описываются этапы разработки
административной и клиентской части Web-приложения. Также описываются используемые
функции и процедуры.
В четвертом разделе «Описание Web-приложения» приводятся общие сведения о
приложении, ее функциональное назначение и описание разделов сайта.
В пятом разделе «Методика испытаний» описываются требования к техническим
средствам для проведения испытаний, требования к совместимости сайта с различными
браузерами разными настройками браузеров. Представляются результаты функционального
тестирования.
Шестой раздел «Применение» предназначен для описания сведений о назначении сайта
и области его применения классе решаемых задач, ограничениях, накладываемых на область
применения, требования к техническим и программным ресурсам, организация диалога с
пользователем, способы ввода информации.
Седьмой раздел «Охрана труда и окружающей среды» содержит информацию по
вопросам трудового законодательства, анализ влияния особенностей трудовой деятельности на
здоровье и работоспособность человека, требования пожарной безопасности и охраны
окружающей среды.
В восьмом экономическом разделе описывается технико-экономическое обоснование
разработки программного средства, составляется план по разработке программного средства,
определяется цена программного средства и экономическая эффективность разработки.
В заключении будет проанализирована поставленная задача, определена степень
соответствия поставленной задачи и выполненной работы.
Приложение А будет содержать текст модулей Web-приложения.

Графическая часть представлена диаграммами вариантов использования, развертывания,


деятельности и структурой web-приложения. Диаграмма вариантов использования
соответствует последовательности действий для всех функций программы. Диаграмма
развертывания представляет физическое расположение всех компонентов. Диаграмма
4
деятельности для всех основных функций, без которых невозможно полноценное
использование приложения. Структура web-приложения отображает как именно связаны между
собой страницы [2].

5
1 Объектно-ориентированный анализ и проектирование приложения

1.1 Назначение и цели создания Web-приложения

Рынок приложений для внесения денежных средств в организации на сегодняшний на


сегодняшний день является перенасыщенным, тем не менее, даже несмотря на это, такие web-
приложения привлекают инвесторов простотой организации. Во многом на это повлиял опыт
других стран, в которых, не смотря ни на что, интернет бизнес не только успешно
функционирует, но и успешно развивается.
Web-приложение внесения денежных средств в организации направлено на построение
сообществ в Интернете где людей могут помогать другим людям если они попали в
проблемную ситуацию.
Благотворительные площадки – это интернет-площадка, сайт, который позволяет
зарегистрированным на нем пользователям размещать информацию о фонда или компаниях, в
которые можно вносить деньги которые пойдут на благотворительные цели. Контент на этой
площадке создается непосредственно самими пользователями.
Фонд – это некоммерческая организация, размещённая пользователем на
благотворительной площадке для внесения добровольных денежных взносов и др.
Пользователь – это конкретное лицо либо организация, которое посещает интернет-
пространство и пользуется действующей системой для того, чтобы выполнять конкретные
задачи или функции.
Комментарий – это мнение пользователя по поводу того или иного материала. Чем
больше мнений соберет та или иная компания, тем активнее она обсуждается.
Чтобы пользоваться приложением нужно пройти регистрацию – процесс, где посетитель
вводит логин, пароль и e-mail (иногда телефон), после которого ему предоставляются права на
пользование социальной сетью. После регистрации посетитель становится пользователем и
может зайти на сайт после того, как пройдёт авторизацию.
Авторизация – предоставление определённому лицу или группе лиц прав на выполнение
определённых действий; а также процесс проверки (подтверждения) данных прав при попытке
выполнения этих действий.
Проектирование данного Web-приложения принципиально отличается от
проектирования обычных сайтов тем, что на первый план выходит взаимодействие типа
человек-человек, вместо человек-компьютер. Перед тем как рисовать экраны и именовать
разделы, надо определиться с тем, как люди будут взаимодействовать с организациями в
приложении. Всегда, проектируя интерфейс сайта, где есть социальное взаимодействие, надо
видеть второго человека, который пользуется данным приложением.
На основе предметной области можно выделить такие функции как:
– возможность авторизации пользователя;
– возможность регистрации пользователя;
– возможность добавления фонда;
– возможность удаления фонда если он не пройдет проверку;
– возможность просмотра фонда или компании после ее создания и проверки;
– возможность добавления комментария;
– возможность внесения денег в компанию или фонд.
Самым популярным аналогом приложения является Web-приложение «Instagram»,
которое имеет некоторые схожести с разрабатываемым приложением. «Uniceft» – приложение
для обмена фотографиями и видеозаписями с элементами социальной сети, позволяющее
снимать фотографии и видео, применять к ним фильтры, а также распространять их через свой
сервис и ряд других социальных сетей.
Разрабатываемое Web-приложение имеет название «Be A Blessing», что в свою очередь
переводится на русский язык, как «Будь Благославлен». Такое название обусловленно тем, что

6
приложение в первую очередь предназначено для управления своей личной коллекцией
фотографий, где они могут храниться, не занимая место на персональных устройствах.
На основе предметной области можно выделить такие функции как:
– авторизации пользователя;
– регистрации пользователя;
– добавления фонда;
– удаления фонда если он не пройдет проверку;
– просмотра фонда или компании после ее создания и проверки;
– добавления комментария;
– внесения денег в компанию или фонд.
Самым популярным аналогом приложения является Web-приложение «Unicef», которое
имеет некоторые схожести с разрабатываемым приложением. «Unicef» – приложение для вноса
денег в благотворительные компании.
В основу разработки приложения входит задача сохранить лучшее в интерфейсе.
«Unicef» обладает рядом недостатков: большое количество надоедливой рекламы, много спама
и т.д. Особенностью разрабатываемого Web-приложения «Be a Blessing» является отсутствие
данных недостатков.

1.2 Проектирование модели

Нереляционная база данных – это база данных, в которой в отличие от большинства


традиционных систем баз данных не используется табличная схема строк и столбцов. В этих
базах данных применяется модель хранения, оптимизированная под конкретные требования
типа хранимых данных.
Схема «сущность-связь» (также ERD или ER-диаграмма) – это разновидность блок-
схемы, где показано, как разные «сущности» (люди, объекты, концепции и так далее) связаны
между собой внутри системы. ER-диаграммы чаще всего применяются для проектирования и
отладки реляционных баз данных в сфере образования, исследования и разработки
программного обеспечения и информационных систем для бизнеса. ER-диаграммы (или ER-
модели) полагаются на стандартный набор символов, включая прямоугольники, ромбы, овалы и
соединительные линии, для отображения сущностей, их атрибутов и связей. Эти диаграммы
устроены по тому же принципу, что и грамматические структуры: сущности выполняют роль
существительных, а связи – глаголов. Диаграмма «сущность-связь» представлена ниже на
рисунке 2.

7
Рисунок 2
Исходя из предметной области можно выделить следующие сущности разработки:
«Комментарий», «Фонд», «Вещи для компании», «Тип», «Пользователь».
Для сущности «Комментарий» атрибутом будет являться:
– текст;
– дата
Для сущности «Фонд» атрибутами будут являться:
– название;
– картинка;
– описание.
Для сущности «Вещи для компании» атрибутами будут являться:
– автомобили;
– обувь;
– электроника.
Для сущности «Тип» атрибутами будут являться:
– открыта;
– закрыта.
Для сущности «Пользователь» атрибутами будут являться:
– статус;
– имя;
– электронная почта;
– пароль.
Диаграмма вариантов использования описывает функциональное назначение системы
или, другими словами, то, что система будет делать в процессе своего функционирования. Она
является исходным концептуальным представлением или концептуальной моделью системы в
процессе ее проектирования и разработки.
Суть данной диаграммы состоит в следующем: проектируемая система представляется в
виде множества так называемых вариантов использования, предоставляемых системой
множеству актеров или сущностей, взаимодействующих с системой. При этом актером (actor)
или действующим лицом называется любая сущность, взаимодействующая с системой извне.
Это может быть человек, техническое устройство, программа или любая другая система,
которая может служить источником воздействия на моделируемую систему так, как определит
сам разработчик. В свою очередь, вариант использования (use case) служит для описания
сервисов, которые система предоставляет актеру. Другими словами, каждый вариант
использования определяет некоторый набор действий, совершаемый системой при диалоге с
актером.
Варианты использования определяют функциональные возможности. Каждый из них
представляет определенный способ использования. Таким образом, каждый вариант
использования соответствует последовательности действий для того, чтобы клиент мог
получить определенный результат.
Исходя из диаграммы вариантов использования можно выделить следующие «includes»
функции, которые включают в авторизацию такие возможности как:
- добавление комментариев;
- просмотр публикаций других пользователей;
- добавление поста;
- изменение данных в базе данных.
Также эти функции расширяются с помощью «extend» функции – обработки запроса на
сервере.
Диаграмма вариантов использования представлена в графической части на листе 1.
При моделировании поведения проектируемой или анализируемой системы возникает
необходимость детализировать особенности алгоритмической и логической реализации
выполняемых системой операций. Для моделирования процесса выполнения операций в языке
UML используются так называемые диаграммы деятельности.
8
Для разработки Web-приложения используется MERN-стэк технологий. Стек – это
некоторый набор технологий, используемых для решения задачи. MERN – это набор
компонентов с открытым исходным кодом, которые вместе обеспечивают сквозную структуру
для создания динамических веб-приложений; начиная с верхней части (код, выполняемый в
браузере) до нижней части (база данных).
Стек состоит из:
- нереляционная база данных «Postgres SQL»;
- инструмент для работы с web-приложениями «Ruby On Rails»;
- библиотека для разработки пользовательских интерфейсов «Ruby On Rails»,
«ReactJs» ;
- серверная платформа для работы с «Puma»;
Postgres SQL – это нереляционная база данных с открытым исходным кодом, которая
обеспечивает сохраняемость данных вашего приложения и разработана с учетом
масштабируемости, что придает гибкости действиям разработчика. MongoDB устраняет разрыв
между хранилищами ключей и значений, которые являются быстрыми и масштабируемыми, и
реляционными базами данных, которые имеют богатую функциональность. Вместо хранения
данных в строках и столбцах, как это было бы с реляционной базой данных, MongoDB хранит
данные JSON в коллекциях с динамическими схемами.
React (иногда называемый ReactJS) – библиотека JavaScript, разработанная Facebook для
создания интерактивных/реактивных пользовательских интерфейсов. Как и Angular, React
разбивает интерфейсное приложение на компоненты. Каждый компонент может содержать свое
собственное состояние, а родитель может передавать свое состояние вниз к своим дочерним
компонентам, и эти компоненты могут передавать изменения обратно к родителю с помощью
функций обратного вызова.
Сторонние модули, включая драйвер MongoDB, могут быть установлены с помощью
инструмента npm. Структура Web-приложения представлена в графической части на листе 2.
Блок-схема алгоритма – графическое изображение алгоритма в виде связанных между
собой с помощью стрелок (линий перехода) и блоков – графических символов, каждый из
которых соответствует одному шагу алгоритма. Внутри блока дается описание
соответствующего действия. В данном приложении блок схема представляет собой алгоритм
пошагового использования приложения. На первом шаге пользователь сталкивается с
авторизацией, где на выбор он может авторизоваться или зарегистрироваться, а после войти в
систему под своим профилем. В самом приложении дается выбор действий, разрешенных
пользователю. Вся блок-схема алгоритма представлена на в графической части на листе 3.
Диаграмма развертывания – это тип UML-диаграммы, которая показывает архитектуру
исполнения системы, включая такие узлы, как аппаратные или программные середы
исполнения, а также промежуточное программное обеспечение, соединяющие их. Эта
диаграмма обычно используется для визуального аппаратного и программного обеспечения
системы. Эта диаграмма также помогает моделировать аппаратную топологию системы по
сравнению с другими типами UML-диаграммы, которые в основном описывают логические
компоненты системы. Вид диаграммы компонентов для данной проектируемой системы
представлен в графической части на листе 4.

9
2 Проектирование Web-приложения

2.1 Требования к Web-приложению

Стилистическое оформление Web-приложения должно соответствовать техническому


заданию. После согласования графического эскиза сайта с преподавателем, переделка
стилистического оформления Web-приложения невозможна (за исключением незначительных
поправок).
Требования к графическому дизайну:
- дизайн Web-приложения должен соответствовать техническому заданию;
- дизайн Web-приложения должен быть лаконичным и в то же время выглядеть
стильно, современно.
- приветствуется использование небольших, но стильных графических элементов
(пиктограмм) в оформлении контента Web-приложения.
- предпочтительные цвета Web-приложения синий, теплый желтый, белый.
Требования к шрифтовому оформлению:
- размер (кегль) шрифтов должен обеспечивать удобство восприятия текста при
минимально допустимом размере экрана.
- предпочтителен шрифт без засечек.
Web-приложение должно обеспечивать корректное отображение данных в следующих
браузерах:
- Internet Еxplorer;
- Opera;
- Mozilla Firefox;
- Google Chrome.
Система управления контентом Web-приложения должна обеспечить пользователю Web-
приложения возможность выполнения следующих действий:
- реализовать регистрацию и авторизацию в приложение;
- осуществить возможность создания собственной акций;
- реализовать просмотр акций для других пользователей web-приложения;
- организовать вкладку company, где видны все акции;
- возможность оставлять комментарии под публикациями;
- возможность вносить деньги в акции;
- реализовать хранение информации на сервере;
- обеспечить хранение необходимой информации в базе данных.
Компоновка страниц Web-приложения должна обеспечивать автоматическое
масштабирование страниц в зависимости от ширины рабочего поля браузера пользователя.
Минимальное разрешение экрана, при котором необходимо обеспечить полноценное
отображение страниц (без полосы горизонтальной прокрутки), составляет 1024х768. Также сайт
должен адекватно выглядеть при разрешении 1024х768.

2.2 Структура Web-приложения

Логическая структура web-приложения отображает то, как именно связаны между собой
страницы одного сайта. При разработке приложения для управления коллекциями
максимальная связь страниц достигнута при помощи постоянного отображения навигационной
панели сайта, благодаря этому навигация по сайту не вызывает никаких затруднений. Главная
страница сайта имеет определённую структуру, представленную в соответствии с рисунком 3.
10
Рисунок 3

Сайт вместе с его административным разделом, не заполненный контентом, состоит из


40.rb файлов, 6.js файлов, 7.yml 5 главных каталога дата (Data), база данных (Db),
приложение(app), тесты(test), хранилище(storage), которые в свою очередь разбиты на
подкаталоги. Все файлы и папки, относящиеся к серверной части раздела находятся в папке
«config».
Серверная часть раздела Web-приложения состоит из папок:
- «environments», в этой папке хранятся конфигурационные файлы приложения
приложения;
- «initializer», в этой папке хранится файл для проверки и запуска серверных настроек;
- «locales», в этой папке хранятся файл представляющие собой локализацию языка
приложения;
- «webpack», где хранятся файлы отвечающие за погрузку js части приложения.
В корневой директории «app» находятся 13 файлов. Описание физической структуры
серверной части приведено в таблице 1.

Таблица 1 – Описание физической структуры административной части


Имя файла Директория Описание
application.rb \config Настройки девелоперской части
boot.rb \ config Настройки выбора части
puma.rb \config Настройки части продакшена
pages_controller.rb \controller Функции компаний
user.rb \models Модель данных пользователя
organization.rb \models Модель данных организации
production.rb \config Настройки части продакшена

11
Продолжение таблицы 1
Имя файла Директория Описание
campaign_controller.rb \controller Функции страницы пользователя
\
Настройки сокрытия системы контроля
.gitignore blessingsthroughacti
версий git
ons-web
metrics_ controller.rb \controller Точка входа сервера
\
package-lock.json blessingsthroughacti Скрипты всех подгружаемых пакетов
ons-web
\
package.json blessingsthroughacti Скрипты основных настроек
ons-web
routes.rb \config Пути где переходят ссылки

Файлы и папки, относящиеся к клиентской части находятся в корневом каталоге Web-


приложения, который состоит из папки:
- «views», в этой папке хранятся папки и файлы дизайна Web-приложения. В корневой
директории находятся двадцать семь файлов. Описание физической структуры клиентской
части (пользовательской) приведено в таблице 2.

Таблица 2 – Описание физической структуры клиентской части


Имя файла Директория Описание
\views
_campaign.html.haml Создание акций
\campaigns
\views
_filters.html.haml Добавление фильтров на страницу
\campaigns
\views
edit.html.haml Возможность редактирования акции
\campaigns
\views
index.html.haml Возможность просмотра всех акции
\campaigns
\views Возможность просмотра одной конкретной
show.html.haml
\campaigns акции
\users
_create.js.haml Создание приглашения в компанию
\invitation
\users
new.html.haml Страница авторизации в приложение
\sessions
\users
edit.html.haml Возможность редактирования профиля
\profile
\views Возможность менять роли у пользователя в
change_role.html.haml
\admin приложении
\views
index.html.haml Просмотр все пользователь приложения
\admin
\views
edit.html.haml Возможность изменить данные у комании
\admin

12
Продолжение таблицы 2
Имя файла Директория Описание
\views
export.xls.haml Возможность выгрузки данных
\reports
\views
show.html.haml Возможность просмотра данных
\reports

2.3 Проектирование макета Web-приложения

Дизайн сайта будет «адаптивным» – вариант веб-дизайна, при котором ширина


страницы сайта будет адаптирована под любое разрешение. То есть на мониторах с большим
разрешением страница будет выводиться на весь экран.
Так как большая часть информации будет представлена не текстом, а навигационными
элементами, то для удобства восприятия был выбран именно этот тип. Также в дизайне сайта
широкое распространение получили компоненты, подгруженные из views и javascript
библиотек из-за того, что информация, помещаемая на сайт, будет структурирована, а
компоненты позволяют легко представить структурированную информацию в удобном для
восприятия виде.
На главной странице будет расположена навигационная панель со ссылками на под
страницы, а также главная область – область контента, в которой расположены диограммы.
Макет главной страницы представлен ниже на рисунке 4.

13
Рисунок 4

Окно входа будет представлять собой форму валидации для заполнения данных, где
данными являются «e-mail», парол, так же, по желанию можно востановить пароль, если его
забыл пользователь. Макет окна регистрации представлен на рисунке 5.

14
Рисунок 5
Окно акции будет представлять собой страницу, на которой находится вся необходимая
информация в виде названия проекта, его описания, изображения акции, возможность увидеть
его организатора, информация о количестве активности, и количество внесенных
пожертвований. Макет профиля пользователя представлен на рисунке 6.

15
Рисунок 6

2.4 Программно-технические средства, необходимые для разработки


приложения

Инструментами разработки будут являться:


- операционная система Windows 10 Professional;
- среда разработки Visual Studio Code;
- язык программирования Ruby;
- библиотеки ReactJS, jQuery, Puma;
- реляционная база данных PostgresSQL;
- браузер GoogleChrome;
- язык разметки HTML;
- язык стилей CSS;
- программа для построения диаграмм UMLet.
Операционная система – это набор управляющих программ, предназначенных для
управления ресурсами вычислительной системы как единого комплекса, другими словами,
операционная система – это набор программного обеспечения, который обеспечивает работу
компьютера. Основными функциями операционной системы являются:
- управление файловой системой (запись, изменение, копирование файлов, контроль
доступа);
16
- управление выполнением программ (распределение процессорного времени, загрузка
программ с диска в оперативную память, перехват потенциально опасных действий);
- управление памятью (кэширование, распределение, контроль сохранности данных);
диалог с пользователем (чтение команд с клавиатуры, с мыши, вывод информации на
экран, на принтер).
Ruby – это язык программирования, с помощью которого веб-страницам придается
интерактивность. С его помощью создаются приложения, которые включаются в HTML-код
(например, анкеты или формы регистрации, которые заполняются пользователем). Часто Ruby
путают с языком программирования Elixir, однако общего между ними очень мало. К тому же,
некоторые сравнивают Ruby с языками Python, Self, Javascript. Однако это особенный язык,
который существует сам по себе.
HTML (HyperText Markup Language) - язык разметки гипертекста – предназначен для
создания Web-страниц.
CSS (Cascading Style Sheets – Каскадные Таблицы Стилей) – условный язык описания
внешнего вида документа. В основном, конечно же, CSS используется создателями веб-страниц
для задания цветов, шрифтов, расположения отдельных блоков и других аспектов
представления внешнего вида этих веб-страниц. Основной целью разработки CSS являлось
разделение описания логической структуры веб-страницы (которое производится с помощью
HTML или других языков разметки) от описания внешнего вида этой веб-страницы (которое
теперь производится с помощью формального языка CSS).
Разработка приложения будет производится в редакторе кода Visual Studio Code. Visual
Studio Code – это редактор исходного кода. Он поддерживает ряд языков программирования,
подсветку синтаксиса, IntelliSense, рефакторинг, отладку, навигацию по коду, поддержку Git и
другие возможности. Многие возможности Visual Studio Code недоступны через графический
интерфейс, зачастую они используются через палитру команд или JSON файлы (например,
пользовательские настройки). Палитра команд представляет собой подобие командной строки,
которая вызывается сочетанием клавиш. Основные преимущества Visual Studio Code (VS Code)
в том, что он является бесплатным, мощным, популярным, с большим количеством
дополнений.
Postgres – кроссплатформенная база данных документов. MongoDB (нереляционная)
документно-ориентированная база данных. В то время как традиционные реляционные базы
данных имеют типичный дизайн схемы, основанный на столбцах и таблицах, Postgres не
требует схем. Данные хранятся в гибких документах с помощью языка запросов на основе
JSON (JavaScript Object Notation). Содержание, размер и количество полей в документах могут
отличаться от одного к другому. Это означает, что структура данных будет меняться со
временем.
React – библиотека JavaScript для создания пользовательских интерфейсов. React
первоначально был создан инженером-программистом в Facebook, а позже был открыт. Он
поддерживается Facebook, а также сообществом разработчиков и отдельных разработчиков.
Библиотека React может использоваться для создания представлений, отображаемых в
HTML. Реактивные взгляды носят декларативный характер. Это означает, что разработчикам не
нужно беспокоиться об управлении последствиями изменений состояния представления
(объекта, определяющего поведение компонентов) или изменений в данных.
Вместо того чтобы полагаться на шаблоны для автоматизации создания повторяющихся
элементов HTML или DOM (объектная модель документа), React использует
полнофункциональный язык программирования (JavaScript) для создания повторяющихся или
условных элементов DOM.

2.5 Защита и сохранность данных

Конфиденциальность – обеспечение исключительно авторизованного доступа к


информации: информация не должна предоставляться и не должна раскрываться

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

Для каждого пользователя существует отдельный аккаунт, что позволяет пользователям


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

2.6 Организация и ведение информационной базы

Если в реляционных базах данных содержимое составляют таблицы, то в mongodb база


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

Таблица 2 – Структура таблицы «Пользователи»


Тип Размер поля,
Имя поля Описание поля
поля байт
id bigint 4 Идентификатор пользователя
first_name nvarchar 100 Имя пользователя
last_name nvarchar 100 Фамилия пользователя
email nvarchar 50 Почта пользователя
role int 4 Роль пользователя
job_title nvarchar 30 Название работы

18
Таблица «Адреса компаний» хранит информацию об компаниях, структура которой
представлена в таблице 3.

Таблица 3 – Структура таблицы «Адреса компаний»


Тип Размер поля,
Имя поля Описание поля
поля байт
id int 4 Идентификатор компании
city nvarchar 25 Город откуда компания
state nvarchar 25 Штат компании

Таблица «Резервный фонд» хранит информацию о фондах, которые могут находится на


проверке, структура которой представлена в таблице 4.

Таблица 4 – Структура таблицы «Резервный фонд»


Размер
Тип
Имя поля поля, Описание поля
поля
байт
id int 4 Идентификатор фонда
status nvarchar 50 Статус фонда
amount nvarchar 50 Количество фондов в резерве

Таблица «Уведомления» хранит информацию об уведомлениях, которые получают


пользователи. Структура таблицы представлена в таблице 5.

Таблица 5 – Структура таблицы «Уведомления»


Тип Размер поля,
Имя поля Описание поля
поля Байт
id int 4 Идентификатор уведомления
user_id nvarchar 30 Идентификатор пользователя

19
Таблица «Предметы компании» хранит предметы, которые можно внести в компанию,
структура которой представлена в таблице 6.

Таблица 6 – Структура таблицы «Предметы компании»


Тип Размер поля,
Имя поля Описание поля
поля Байт
id int 4 Идентификатор предмета

campaing_id int 4 Идентификатор компании


tracking_numbe
int 10 Номер компании
r
status int 8 Статус компании
difficult_transpo Транспорт для доставки предметов
nvarchar 30
rt компании
delivery_eta date 4 Сумма оплаты за услугу
url nvarchar 1 Ссылка на фонд

20
3 Реализация Web-приложения

3.1 Разработка административной части приложения

Веб браузеры взаимодействуют с веб-серверами при помощи гипертекстового


транспортного протокола (HTTP). Когда пользователь нажимает на ссылку на веб-
странице, заполняет форму или запускаете поиск, HTTP запрос отправляется из вашего браузера
на целевой сервер.
HTTP – широко распространённый протокол передачи данных, изначально
предназначенный для передачи гипертекстовых документов (то есть документов, которые
могут содержать ссылки, позволяющие организовать переход к другим документам).
Запрос включает в себя URL, определяющий  затронутый ресурс, метод, определяющий
требуемое действие (например, получить, удалить или опубликовать ресурс) и может включать
дополнительную информацию, закодированную в параметрах URL (пары поле-значение,
оправленные как строка запроса), как POST запрос (данные, отправленные методом HTTP
POST), или в  куки-файлах.
Веб серверы ожидают сообщений с клиентскими запросами, обрабатывают их по
прибытию и отвечают веб-браузеру при помощи ответного HTTP сообщения. Ответ содержит
строку состояния, показывающую, был ли запрос успешным, или нет.
Тело успешного ответа на запрос может содержать запрашиваемые данные (например,
новую HTML страницу, или изображение), который может отображаться через веб-браузер.
URL (или URL адрес) – это форма уникального адреса конкретного веб-ресурса в сети
Интернет. Он может ссылаться на веб-сайт, какой-то индивидуальный документ или
изображение. Пользователю Интернета нужно вставить этот код в поле поиска, чтобы найти
нужный сайт, документ, папку или изображение. На простом языке это означает следующее:
благодаря URL адресу пользователь узнает информацию о том, где находятся нужные ему
данные.
В каталоге «config» находятся три документа «boot.rb», «application.rb», «puma.rb».
«Config» является сокращением от английского слова «configuration», в нем находятся
конфигурационные файлы приложения, в которых записаны настройки этого самого
приложения. В первую очередь при запуске приложения читается файл «master.key», который
перенаправляет на файл «puma.rb» при разработки приложения, или при релизе приложения на
хостинг, читается файл «spring.rb. В них находятся URI базы данных PostgresSQL, которые
являются экспортируемым объектом.
Роуты – это система маршрутов (путей, url'ов) на сайте. Благодаря роутам, ссылки имеют
красивые и ясные для пользователей наименовния.

3.2 Разработка клиентской части приложения

Клиентская часть приложения – это скрипты, написанные на языке программирования


Ruby и Javascript (JS) и исполняемые в браузере пользователя.
Клиентская часть Web-приложения разработана при помощи библиотеки React и Ruby on
Rails, которая подгружается при помощи Yarn и Bundle. Yarn – менеджер пакетов, входящий в
состав webpacker.yml.
Каталог «webpack» нужен для разработки — это различные сторонние библиотеки,
которые можно использовать в проекте.
Каталог «locales» генерируется при загрузке приложения и включает в себя такие файлы
как:
- en.yml(лежит перевод системы);
21
Каталог «javascript» генерируется при загрузке React.js и jQuery и включает в себя
подкаталог «packs» и «src».
Подкаталог «src» содержит в себе, как и React компоненты и jQuery компоненты,
которые представлены в файлах:
- «clipboard.js»;
- «currency_input.js»;
- «input_masks.js»;
- «deactivate_user_modal.js»;
- «CategorySelect.tsx»;
- «index.tsx»;
- «new_user_acknowledge_terms_confirmation.js»;
- «navbar.js».
Подкаталог «reducers», которая хранит в себе функцию отвечающая за изменение
состояний представленная в файле «userReducer.js».

3.3 Описание используемых функций и процедур

При разработке Web-приложения используютется создание jQuery компонентов.


Компоненты аналогичны функциям JavaScript. Они хранят состояние с помощью свойств и
возвращают элементы jQuery, которые затем появляются на веб-странице. Компоненты
позволяют разделить пользовательский интерфейс на независимые, повторно используемые
части и работать с каждой из частей отдельно.
Все компоненты находятся в папке «src» которая находится в папке javascript.
Компонент «Donations» находится в документе «donations.js» код которого представлен
ниже, отвечает за создание поста в приложении.

//Импортируем функции из других файлов и библиотек


import jQuery from 'jquery';
import { loadStripe } from '@stripe/stripe-js';
//Создаем функцию для создания поста
//Помещаем ключ для создания свзяси с платежной системой Stripe
jQuery(document).on('turbolinks:load', async () => {
const stripe = await loadStripe(process.env.STRIPE_PUBLIC_KEY);
const currencyInput = jQuery('.currency-input');
//Объявляем переменные
currencyInput.on('keyup', function () {
const nStr = (this.value + '').replace(/,/g, '');
const enteredAmount = nStr.split('.');
let enteredAmountFirstDig = enteredAmount[0];
const amountWithPoint =
enteredAmount.length > 1 ? '.' + enteredAmount[1] : '';
const rgx = /(\d+)(\d{3})/; //Создание регулярного выражения
while (rgx.test(enteredAmountFirstDig)) {
enteredAmountFirstDig = enteredAmountFirstDig.replace(
rgx,
'$1' + ',' + '$2'
);
}
this.value = enteredAmountFirstDig + amountWithPoint;
});
//Ввод средств в форму
22
currencyInput.keypress(function (e) {
if (
e.which !== 8 &&
e.which !== 0 &&
e.which !== 46 &&
(e.which < 48 || e.which > 57)
){
return false;
}
if (jQuery('#shopping_cart').length > 0) {
const elements = stripe.elements({
cssSrc:
'https://fonts.googleapis.com/css2?
family=Montserrat:ital,wght@0,400;0,600;0,700;1,400&display=swap',
});//Добавление формы для ввода. карты
const cardElement = elements.create('card', {
hidePostalCode: true,
});
cardElement.mount('#card-stripe-container');
cardElement.update({
style: {
base: {
fontSize: '16px',
fontWeight: 400,
fontFamily: "'Montserrat', sans-serif",
},
},
}); const address_line1_card_field = () => jQuery('#card_address_line1').val();
const address_line2_card_field = () => jQuery('#card_address_line2').val();
const card_address_card_city_field = () =>
jQuery('#card_address_city').val();
const card_address_state_card_field = () =>
jQuery('#card_address_state').val();
const card_address_zip_card_field = () => jQuery('#card_address_zip').val(); //Объяаляем
id на поля в форму для передачи данных в базу данных
return(
jQuery('#shopping_cart_internal_process').on(
'click',
async function (event) {
event.preventDefault();
//Добавляем обработчик ошибок
const { token, error: err } = await stripe.createToken(cardElement, {
card: {
name: jQuery('#card_name').val(),
address_line1: address_line1_card_field(),
address_line2: address_line2_card_field(),
address_city: card_address_card_city_field(),
address_state: card_address_state_card_field(),
address_zip: card_address_zip_card_field(),
},
});

jQuery('#card-token-field').val(token.id);

23
const details = {
shopping_cart: {
payment_info: jQuery('#new_shopping_cart :input').serialize(),
campaigns_donations: [],
},
};

const campaignsDonationsForms = jQuery('.new_buyable');


campaignsDonationsForms.each(function (index, el) {
details.shopping_cart.campaigns_donations.push(
jQuery(el).serialize()
);
});

if (err) {
return;
}
//Создание AJAX запроса для передачи данных на сторонний сервис
jQuery.ajax({
type: 'POST',
url: jQuery('#new_shopping_cart')[0].action,
data: details,
success(data) {
return false;
},
error(data) {
return false;
},
});
}
); }
Компонент «Profile» находится в документе «Profile.js» код которого представлен ниже,
отвечает за отображение профиля пользователя и действий над профилем.

//Импортируем функции из других файлов и библиотек


import React,{useEffect,useState,useContext} from 'react'
import {UserContext} from '../../App
//Создание интерфейса
interface CategorySelectProps {
categories: Array<ItemCategory>;
campaignItemIndex: number;
campaignItemCategoriesIds: Array<number>;
onSelect?: (category: ItemCategory) => void;
label?: string;
}
//Объявляем форму для выбора катерогрий
const CategorySelect: React.FC<CategorySelectProps> = ({
campaignItemIndex,
campaignItemCategoriesIds,
categories,
label,
onSelect,
}) => {
const [selectedId, setSelectedId] = useState<number>(null);
24
useEffect(() => {
if (categories === undefined) {
return;
}
//Наследованная стрелочная функция от category
const category =>
categories.find(
({ id }) => campaignItemCategoriesIds.indexOf(id) !== -1
) || categories[0];

setSelectedId(category.id);

if (onSelect !== undefined && !category.subcategories) {


onSelect(category);
}
}, [categories]);

if (!categories || !selectedId) {
return null;
}

const selectedCategory = categories.find(


(category) => category.id === selectedId
);

if (!selectedCategory) {
return null;
}
//Верстка при помощи ReactJS
return (
<React.Fragment>
<div className="form-group flex-grow mx-2">
<label>{label}</label>
<div className="select-wrapper">
<select
className="form-control"
// eslint-disable-next-line max-len
name={`campaign[campaign_items_attributes][${campaignItemIndex}]
[campaign_item_categories_attributes][${selectedId}][item_category_id]`}
value={selectedId}
onChange={(event) => {
const id = parseInt(event.target.value);
setSelectedId(id);

if (onSelect !== undefined) {


onSelect(categories.find((category) => category.id === id));
}
}}
>
{categories.map((category) => (
<option key={`option-${category.id}`} value={category.id}>
{category.name}
</option>
25
))}
</select>
</div>
</div>
<CategorySelect
campaignItemIndex={campaignItemIndex}
campaignItemCategoriesIds={campaignItemCategoriesIds}
categories={selectedCategory.subcategories}
label={selectedCategory.name}
onSelect={onSelect}
/>
</React.Fragment>
);
};

export default CategorySelect;

26
4 Описание Web-приложения

4.1 Общие сведения

Главная цель – достичь максимального качества выполненных задач, предоставить


готовый, высокотехнологичный продукт, соответствующий современным требованиям. Сделать
удобным, доступным сервис по обслуживанию и дальнейшему содержанию сайта.
Для установки приложения необходимо скачать переместить папку с проектом в удобное
для запуска место. Для загрузки всех необходимых модулей при помощи командной строки
(bundle exec install). После чего необходимо прописать команду «npm install» или «yarn install» в
командной строке, для загрузки всех модулей сервера. Для установки всех модулей в
клиентскую часть необходимо зайти в папку «app» и так же прописать «rails db: migrate».
Запуск приложения осуществляется при помощи rails s и командной строки, можно
использовать любую командную строку, имеющуюся на компьютере. Для запуска клиентской
части приложения необходимо в командной строке зайти в папку «client» и прописать команду
«npm start». Для запуска серверной части приложения необходимо в командной строке зайти в
папку «server» и прописать команду «bin/webpack-dev-server»
Верстка страниц осуществляется при помощи библиотеки ReactJS.

4.2 Функциональное назначение

Web-приложение для управления акциями направлено на создание акции и компаний в


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

4.3 Описание разделов сайта

Сайт имеет навигационную панель, которая находится в верхней шапке и отображается


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

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

28
5 Методика испытаний

5.1 Технические требования

Минимальные системные требования для проведения технических испытаний:


- 400 МБ свободного места на жестком диске;
- 1 ГБ оперативной памяти;
- процессор Intel Core 1,6 Ггц или совместимый аналог;
- операционная система семейства Microsoft Windows 10;
- Visual Studio 2019;
- интернет 2048/512 (Кбит/с).
Все технические испытания будут проводится в браузере Google Chrome версии
89.0.4038.122 на стандартных настройках.
Компьютер должен работать под управлением операционной системы, начиная с
Windows10 и выше. На компьютере должен быть установлен браузер. Браузер – это
специальная программа, которая предназначена для просмотра Web-страниц. Рекомендуется
использовать браузер Google Chrome.
В настоящее время существует много Web-браузеров, каждый из которых обладает
своими преимуществами и недостатками. Одним из самых популярных и используемых на
компьютере это браузеры – Internet Explorer, Mozilla Firefox, Opera, Safari, Google Chrome. И по
большому счету нет большой разницы, какой из них вы используете.

5.2 Функциональное тестирование

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


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

29
Таблица 8 – Тест – кейсы для проведения функционального тестирования
Модуль / Ожидаемый Фактический
№ Шаги воспроизведения
Функция результат результат
Аудит Добавление Добавление в
новой в базу базу данных
компании данных новой
1. Запустить приложение
новую компании и
2. На главной форме нажать на
компанию. отображаем его
вкладку «Аудит».
на форме.
3. Нажимаем на кнопку «Audit» и
Пример
проверяем как заполнена форма.
001 проверки
4. Добавить или изменить цену на
представлен на
продукт если есть потребность
рисунке 8.
5. Добавляем комментарий к
Пример
компании
результата
6. Нажать на кнопку approve.
представлен на
рисунке 9

Рисунок 8

30
Рисунок 9

Таблица 9 – Тест – кейсы для проведения функционального тестирования


Модуль / Ожидаемый Фактический
№ Шаги воспроизведения
Функция результат результат
Экспорт 1. Запустить приложение Экспорт Экспорт
данных в 2. На главной форме выбрать данных в данных в
Excel вкладку «Отчеты» Excel Excel. Пример
3. Из выпадающего окна работы с
выбираем вкладку «Донаты» функцией
002 3. Нажать на кнопку «Export представлен на
Report» рисунке 10.
Пример
результата
представлен на
рисунке 11

31
Рисунок 10

Рисунок 11

Таблица 10 – Тест – кейсы для проведения опытного тестирования


Модуль / Ожидаемый Фактический
№ Шаги воспроизведения
Функция результат результат
Экспорт 1. Запустить приложение Экспорт Экспорт
данных в 2. На главной форме выбрать данных в данных в Excel.
Excel вкладку «Отчеты» Excel Пример работы
3. Из выпадающего окна выбираем с функцией
вкладку «Доходы» представлен на
003
3. Нажать на кнопку «Export рисунке 12.
Report» Пример
результата
представлен на
рисунке 13

32
Рисунок 12

Рисунок 13

Таблица 11 – Тест – кейсы для проведения опытного тестирования


Модуль / Ожидаемый Фактический
№ Шаги воспроизведения
Функция результат результат
Не 1. Запустить приложение Переход на Фактический
правильны 2. На главной форме выбрать главную результат не
й ввод вкладку «Войти» страницу с соответствует
данных в 3. В поле «Email address» ввести коллекциями ожидаемому
004
Login «vicod14593@xhypm.com» всех что можно
форму 4. В поле «Password» ввести пользователей наблюдать на
«testuser»; рисунке 14
5. Нажимаем кнопку Log In

33
Рисунок 14

34
6 Применение

6.1 Назначение приложения

Web-приложение для управления акциями направлено на создание акции и компаний в


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

6.2 Программно-аппаратное обеспечение сервера и клиента

Для корректной работы Web-приложения на компьютере пользователя должен быть


установлен любой современный браузер.
Хостинг должен соответствовать следующим минимальным требованиям:
- предоставлять не менее 300Мб, дискового пространства;
- поддерживать язык программирования JavaScript;
- предоставлять одну MongoDB базу данных;
- CPU не менее 100 МГерц;
- выделять не менее 60 Гбайт трафика.
Хостинг должен быстро и оперативно реагировать на любые обращения, в решении
проблемных вопросов используя email, Slack, Skype, WEB форму.

35
7 Охрана труда и окружающей среды на предприятии

7.1 Правовые, нормативные, социально-экономические и организационные


вопросы охраны труда

Общество с ограниченной ответственностью «Айтихардгруп» – это группа компаний,


которая специализируется на создании и разработки ПО, и действует в соответствии с
действующим законодательством Республики Беларусь.
Охрана труда в данной фирме обеспечивается системой законодательных актов
Республики Беларусь, социально-экономических, организационных, технических и лечебно-
профилактических мероприятий и средств
Система управления охраной труда – это регламентированная законодательством
совокупность методов и средств управления, направленных на организацию обеспечения
безопасности, сохранения жизни, здоровья и работоспособности человека в процессе труда.
Система управления включает в себя выявление производственных опасностей, оценку рисков
гибели и травмирования работников, разработку и реализацию эффективных мер по их
снижению и устранению, а также осуществляет постоянный мониторинг и измерение
результативности в области охраны труда.
В данной организации имеется перечень следующих обязанностей работодателя для
создания здоровых и безопасных условий труда:
 обеспечивать безопасность при эксплуатации зданий (помещений;
 предоставлять при необходимости места для выполнения работ (оказания услуг);
 принимать меры по предотвращению аварийных ситуаций, сохранению жизни и
здоровья работающих при возникновении таких ситуаций, оказанию потерпевшим при
несчастных случаях на производстве необходимой помощи;
 осуществлять обучение, стажировку, инструктаж и проверку знаний, работающих
по вопросам охраны труда;
 обеспечивать в порядке, установленном законодательством, расследование и учет
несчастных случаев на производстве, профессиональных заболеваний, техническое
расследование причин аварий, инцидентов на опасных производственных объектах, разработку
и реализацию мер по их профилактике и предупреждению;
 не допускать к работе работающего, появившегося на работе в состоянии
алкогольного, наркотического или токсического опьянения, а также в состоянии, связанном с
болезнью, препятствующем выполнению работ.
 В свою очередь работающий обязан:
 соблюдать требования по охране труда, а также правила поведения на территории
организации, в производственных, вспомогательных и бытовых помещениях;
 заботиться о личной безопасности и личном здоровье, а также о безопасности
окружающих в процессе выполнения работ либо во время нахождения на территории
организации;
 обеспечения здоровых и безопасных условий труда, немедленному извещению
своего непосредственного руководителя или иного уполномоченного должностного лица
нанимателя о неисправности оборудования, инструмента, приспособлений, транспортных
средств, средств защиты, об ухудшении состояния своего здоровья;
 немедленно сообщать работодателю о любой ситуации, угрожающей жизни или
здоровью работающих и окружающих, несчастном случае, произошедшем на производстве.
Согласно статьям 13 Закона Республики Беларусь «Об охране труда» и 226 Трудового
кодекса Республики Беларусь работодатель (наниматель) обязан осуществлять (обеспечить)
подготовку (обучение), переподготовку, стажировку, инструктаж, повышение квалификации и
36
проверку знаний, работающих (работников) по вопросам охраны труда в порядке,
установленном Правительством Республики Беларусь или уполномоченным им органом.
Обучение, инструктаж и проверка знаний, работающих по вопросам охраны труда
являются важными элементами системы мер по предупреждению аварий и травматизма на
производстве, обеспечению   права граждан на здоровые и безопасные условия труда и носят
непрерывный многоуровневый характер.
Обучение и проверка знаний по вопросам охраны труда работающих проводятся самим
индивидуальным предпринимателем, инструкцией о порядке подготовки (обучения),
переподготовки, стажировки, инструктажа, повышения квалификации и проверки знаний,
работающих по вопросам охраны труда, утвержденной Постановлением Министерства труда и
социальной защиты Республики Беларусь от 28.11.2008 г.  № 175 и разработанными в
соответствии с ними отраслевыми документами.
В соответствии с указанными документами ответственность за организацию
своевременного и качественного обучения и проверки знаний, работающих в целом по
предприятию, учреждению возлагается на директора.
На предприятии составляется и утверждается Перечень должностей руководителей и
специалистов, проходящих периодическую проверку знаний по вопросам охраны труда.
Специалисты и руководители предприятия не позднее одного месяца со дня вступления в
должность, а также периодически не реже одного раза в три года проходят проверку знаний по
охране труда в соответствующих комиссиях.
Виды инструктажа:
 вводный инструктаж;
 первичный инструктаж;
 повторный инструктаж;
 внеплановый инструктаж;
 целевой инструктаж.
Порядок расследования несчастных случаев на производстве определен Правилами
расследования несчастных случаев на производстве и профессиональных заболеваний,
утвержденными постановлением Совета Министров Республики Беларусь от 15 января
2004 г. № 30.
Цели расследования несчастных случаев:
 установить причины, вызвавшие несчастный случай;
 наметить мероприятия, направленные на предотвращение подобных несчастных
случаев;
 подготовка документов, для компенсации вреда потерпевшим;
 привлечение ответственных лиц к нарушению
Основными видом контроля в ИП являются: контроль за соблюдением законодательства
об охране труда, осуществляемый руководителем.
 контроль за соблюдением законодательства по охране труда, осуществляется
руководителем и специалистами организации в соответствии с них должностными
обязанностями;
 контроль по охране труда, осуществляемый службой охраны труда:
 это контроль за соблюдением требований безопасности на производственном
объекте, осуществляемый инспектирующей их организацией;
 периодический контроль за соблюдением законодательства об охране труда,
осуществляемый руководителями структурных подразделений организаций с участием
общественных инспекторов профсоюза по охране труда (уполномоченных лиц по охране труда
работников)
 общественный контроль за соблюдением законодательства об охране труда,
осуществляемый профсоюзом.

37
7.2 Разработка инженерно-технических решений по снижению шума в
рабочей зоне помещений с ЭВМ

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


увеличения количества активных элементов в чипе и увеличения излучении, из за этого
подминатеся уровень выделения ультрафиолетовое излучения. ультрафиолетовое излучения -
это электромагнитное излучение в оптической области в диапазоне 200-400 нм с частотой
колебаний от 1013 до 1016 Гц, примыкающее со стороны коротких волн к видимому свету. Оно
относится к неионизирующим излучениям. Естественным источником УФ-излучения является
Солнце. В промышленности источниками этого излучения могут быть газоразрядные
источники света, компьютеры, принтеры, лазеры и др. Это, в свою очередь, приводит к
необходимости интенсификации охлаждения, что до недавнего времени, применительно к
бытовым персональным компьютерам, достигалось за счет увеличения эффективной площади
радиаторов и увеличения скорости вентилятора, обдувающего радиатор. Последнее приводит к
существенному росту излучаемого шума. И вот уже во многих офисах с большим
сосредоточением компьютеров шумность в помещении определяется не остатками шума,
проникающего с улицы через герметичные пластиковые окна, а собственно самими
компьютерами. А ведь шум один из важных факторов, определяющих работоспособность
человека.
В паспортных данных компьютеров УФ-излучение с длиной волны 400-315 нм имеет
слабое биологическое действие, область волн 315—280 нм характеризуется сильным
воздействием на кожу. Для волн 280-200 нм свойственно бактерицидное действие. УФ-
излучение характеризуется двояким действием на организм: с одной стороны, опасностью
переоблучения, а с другой - необходимостью для нормального функционирования организма.
Длительное воздействие больших доз УФ-излучения может привести к серьезным
поражениям глаз и кожи. Острые поражения глаз обычно проявляются в виде кератитов
(воспаления роговицы) и помутнения хрусталика глаза. Продолжительное воздействие больших
доз УФ-излучения особенно в области излучения 280-200 нм оказывает сильное
разрушительное действие на клетку, а также бактерицидное действие вследствие коагуляции
белков, что может привести к развитию рака кожи. Пораженный участок кожи имеет отечность,
ощущается жжение и зуд, появляются дерматиты. Воздействие повышенных доз УФ-излучения
на центральную нервную систему сопровождается головной болью, тошнотой,
головокружением, повышением температуры тела, утомляемостью, нервным возбуждением и
др.
В зависимости от УФ-дефицита и контингента населения рекомендуются дозы в
пределах 0,125-0,75 эритемной дозы (10-60 мэрч/м2)
Допустимая интенсивность УФ-излучения нормируется СанПиН 2.2.4.13-45-2005.
Нормативные значения интенсивности излучения установлены в соответствии с его
продолжительным воздействия на работающих, его спектрального состава, обязательного
использования индивидуальных средств защиты.
Допустимая интенсивность УФ-облучения работающих при наличии незащищенных
участков поверхности кожи не более 0,2 м2(лицо, шея, кисти рук и др.), общей
продолжительности воздействия излучения (50% рабочей смены) и длительности однократного
облучения свыше 5 мин и более не должна превышать для УФ-А - 10 Вт/м2, УФ-В - 0,01 Вт/м2 .
Воздействие УФ-С в этом случае не допускается.
38
При использовании специальной одежды и средств защиты лица и рук, не
пропускающих УФ-излучение (спилк, кожа, ткани с пленочным покрытием и т.п.), допустимая
интенсивность облучения в области УФ-В + УФ-С (200-315 нм) не должна превышать 1 Вт/м2.
Основными способами защиты работников от воздействия ультрафиолетового излучения
являются защита расстоянием, экранирование рабочих мест, специальная краска с водным
составом и т.д.
При проведении органами государственной экспертизы условий труда Республики
Беларусь проверок соблюдения законодательства о труде и пенсионном обеспечении по
вопросам предоставления компенсаций работникам за работу с вредными и (или) опасными
условиями труда и анализа документов, предоставляемых нанимателями в электронном виде по
аттестации рабочих местах по условиям труда (далее - аттестация), участились случаи
выявления неправильной оценки условий труда по шуму на рабочих местах работников
организаций республики.
В целях предупреждения неправильной оценки ультрафиолетового излучения и как
следствие необоснованного установления работникам компенсаций по условиям труда,
определения обязанностей нанимателя по профессиональному пенсионному страхованию
работников в соответствии с Законом Республики Беларусь «О профессиональном пенсионном
страховании», Министерство труда и социальной защиты при оценке условий труда по
ультрафиолетовому излучению разъясняет следующее.
В соответствии с пунктом 6 Положения о порядке проведения аттестации рабочих мест
по условиям труда, утвержденного постановлением Совета Министров Республики Беларусь от
22 февраля 2008 г. № 253, оценка фактического состояния условий труда на рабочем месте при
аттестации производится в порядке, определяемом Министерством труда и социальной защиты.
Защита расстоянием — это удаление обслуживающего персонала от источников УФ-
излучения на безопасную величину. Расстояния, на которых уровни УФ-излучения не
представляют опасности для работающих, определяются только экспериментально в каждом
конкретном случае в зависимости от условий работы, состава производственной атмосферы,
вида источника излучения, отражающих свойств конструкций помещения и оборудования и т.д.
В первую очередь следует использовать защитную одежду с длинным рукавом и
капюшоном для предотвращения попадания ультрафиолета на кожу.
Также наиболее рациональным методом защиты является экранирование (укрытие)
источников излучений с помощью различных материалов и светофильтров, не пропускающих
или снижающих интенсивность излучений.
Для защиты работающих от избытка УФ-излучения используют противосолнечные
экраны, жалюзи, оконные стекла со специальным покрытием, стекла «хамелеоны» и др. В
производственных условиях применяются стены, кабины, щитки, ширмы, очки с защитными
стеклами. Полную защиту от УФ-излучения всех волн обеспечивает флинтглас (стекло с
оксидом свинца) толщиной 2 мм. Кабины изготавливаются высотой 1,8-2 м, причем их стенки
не должны доходить до пола на 25-30 см для улучшения проветривания.

39
7.3 Обеспечение пожарной безопасности

Во всех помещениях, находящихся в распоряжении ООО «Айтихардгруп» отсутствуют


горючие жидкости, пыли, волокна, газы, легковоспламеняющиеся газы, трудно горючие
жидкости и прочие взрывоопасные или пожароопасные вещества. Все материалы находятся в
холодном состоянии. Исходя из этих сведений можно уверенно сказать, что все помещения
подходят под категорию Д по ТКП 474-2013. Так как все помещения подходят под категорию
Д, следовательно, ни одно из помещений не имеет зон по ПУЭ.
Здание, в котором находятся помещения ООО «Айтихардгруп» согласно паспорту, на
это здание, имеет II степень огнестойкости. При более подробной характеристике можно
выделить пределы огнестойкости определённых конструкций.
Таблица 7.1 – Пределы огнестойкости конструкций по СНБ 2.02.01 - 98
Несущие Самонесущие Наружные Перекрыти Настилы Внутренние Марши и
элементы стены ненесущие я между стены площадки
здания стены этажные лестниц
R120-K0 RE 75-K0 E 30-K0 REI 60-K0 RE 30-K0 REI 120-K0 R 60-K0

Расшифровка обозначений таблицы 7.1:


 R 120 - предел огнестойкости 120 мин – по потере несущей способности;
 RE 75 - предел огнестойкости 75 мин – по потере несущей способности и потере
целостности независимо от того, какое из двух предельных состояний наступит ранее;
 Е 30 – предел огнестойкости 30 мин – по потери целостности или
теплоизолирующей способности независимо от того, какое из двух предельных состояний
наступит ранее.
 REI 60 - предел огнестойкости 60 мин – по потере несущей способности,
целостности и теплоизолирующей способности независимо от того, какое из трех предельных
состояний наступит ранее;
 RE 30 - предел огнестойкости 30 мин – по потере несущей способности и потере
целостности независимо от того, какое из двух предельных состояний наступит ранее;
 REI 120 - предел огнестойкости 120 мин – по потере несущей способности,
целостности и теплоизолирующей способности независимо от того, какое из трех предельных
состояний наступит ранее;
 R 60 - предел огнестойкости 60 мин – по потере несущей способности;
 К0 - не пожароопасные;
Первичные средства пожаротушения, используемые на предприятии: огнетушители
пенные оп-5, пожарные краны. Огнетушители установлены в легкодоступных и заметных
местах (коридорах, возле входов и выходов из помещений) таким образом, что они не мешают
во время эвакуации. Для размещения первичных средств устанавливаются пожарные посты.
Они располагаются на видных местах и окрашиваются в красный цвет.
Кран пожарный - применяются в комплекте с пожарным стволом и пожарным рукавом
на внутреннем противопожарном водоснабжении. Может использоваться как для тушения
небольшого пожара, так и для серьезного противостояния огню в качестве дополнительного
средства пожаротушения.
По всему зданию, а также отдельно в офисах расположены дренчерные системы
водяного пожаротушения. Они представляют собой напорный трубопровод и оросители, однако
последние не имеют теплового элемента. Сама по себе система не реагирует на пожар, поэтому
40
«пусковым механизмом» служит система пожарной сигнализации, которая также расположена
по всему зданию, в непосредственной близости от каждого оросителя.
Для безопасной эвакуации людей в случае чрезвычайных ситуаций разработан
эффективный план эвакуации, копии которого, расположены на каждом этаже, на видном
месте. В случае чрезвычайной ситуации эвакуация будет производится через 2 дополнительные
лестницы внутри здания, и одну пожарную лестницу снаружи.
В соответствии с п.6 ст.17 Закона Республики Беларусь от 15.06.1993 N 2403-XII (ред. от
30.11.2010) «О пожарной безопасности» и Положением для проведения профилактических
мероприятий по предупреждению и тушению пожаров в организациях организуются
добровольные пожарные дружины из числа рабочих и специалистов организаций в случае, если
на предприятии работает более 15 человек. На ЧП «Вектор удачи» работают менее 15 человек,
следовательно, пожарной дружины не существует, а обязанности на случай возникновения
пожара распределяются между работниками.
Основные задачи ДПД:
 контроль за соблюдением противопожарного режима;
 проведение разъяснительных работ по соблюдению противопожарного режима на
рабочем месте и правилам осторожного обращения с огнем в быту;
 надзор за исправностью средств пожаротушения и их укомплектованностью;
 вызов пожарной службы в случае возникновения пожара, принятие мер по его
тушению имеющимися средствами пожаротушения.

7.4 Обеспечение охраны окружающей среды

Охрана окружающей среды является неотъемлемым условием обеспечения


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

41
биохимический – наряду с химическими реагентами применяются микроорганизмы,
которые питаются загрязняющими веществами;
химический – используется для удаления из стоков различных кислот и щелочей;
физико-химический – включает в себя несколько способов удаления загрязнений.
Основными методами обезвреживания твердых бытовых отходов являются
мусоросжигательные заводы, мусороперерабатывающие заводы и санкционированные свалки.
Санкционированные свалки — это такое складирование твердых бытовых отходов,
которое предусматривает долговременную переработку отходов при участии кислорода воздуха
и микроорганизмов.
Мусоросжигание – это наиболее сложный и «высокотехнологичный» вариант обращения
с отходами. Сжигание требует предварительной обработки ТБО (с получением т.н. топлива,
извлеченного из отходов). Серьезные проблемы возникают также с захоронением золы от
мусоросжигания, которая по весу составляет до 30 % от исходного веса отходов и которая в
силу своих физических и химических свойств не может быть захоронена на обычных свалках.
Для безопасного захоронения золы применяются специальные хранилища с контролем и
очисткой стоков.
Мусоросжигание уменьшает объем отходов, попадающих на свалки, и может
использоваться для производства электроэнергии. Хотя сжигание всех отходов без разбора –
это технология прошлого, современные мусоросжигательные установки, оборудованные
системами очистки выбросов, генераторами электроэнергии и используемые в комбинации с
другими методами утилизации ТБО могут помочь справиться с потоком мусора, особенно в
плотно населенных областях.
Мусороперерабатывающие заводы — это наиболее перспективный метод
обезвреживания твердых бытовых отходов, причиняющий наименьший ущерб окружающей
среде. Основными продуктами переработки твердых бытовых отходов является компост,
находящий применение в сельском хозяйстве как удобрение, и некомпостируемый остаток
(камни, глиняные черепки, пластмассы, стекло), представляющий собой обезвреженную массу
и составляющий до 30 % от объема исходного мусора.

42
8 Экономический раздел

8.1 Технико-экономическое обоснование разработки программного средства

Необходимо рассчитать экономическую эффективность разработки программного


средства.
В технико-экономическом обосновании будут рассмотрены следующие вопросы:
 составление плана по разработке программного средства;
 расчет стоимости разработки;
 экономическая эффективность разработки.
В первой части технико-экономического обоснования необходимо рассчитать срок
разработки по созданию программного средства для создания благотворительных
пожертвований в фонды “Be A Blessing”
Во второй части технико-экономического обоснования необходимо рассчитать
стоимость разработки программного средства с момента получения первого варианта
технического задания и заканчивая оформлением документации и сдачей разработки.
В третьей части необходимо оценить экономическую эффективность программного
средства.

8.2 Составление плана по разработке программного средства

План разработки программного средства представлен в таблице 8.1.

Таблица 8.1 - План разработки программного средства


Наименование этапов и видов Количество Трудоемкость,
Исполнитель
работ исполнителей человеко-дни
Подготовительный техник-программист 1 1
Выбор методов и средств техник-программист 1 2
Разработка алгоритмов и
техник-программист 1 24
программ
Отладка программ и анализ
техник-программист 1 10
результатов
Оформление документации и
техник-программист 1 3
подготовка к сдаче разработки

8.3 Определение цены программного средства

В условиях рыночных отношений научно-техническая продукция также является


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

43
Определяются материальные затраты на выполнение работ по теме, включая стоимость
покупных комплектующих изделий и полуфабрикатов на изготовление макетов и опытных
образцов.
Расчет осуществляется по формуле (8.1).
n
Р м=К Тр ∑ ❑( Н pi Ц i−Odi Ц di ), (8.1)
i=1

где Ктзр - коэффициент, учитывающий транспортно-заготовительные расходы Ктзр≈от 1,05 до


1,10;
Hpi – норма расхода i-го вида материалов на макет или опытный образец (кг, м, и так
далее);
Цi – действующая отпускная цена за единицу i-го вида материала, руб.;
Odi – возвратные отходы i-го вида материала (кг, м, и так далее);
Цdi – цена за единицу возвращенных отходов i-го вида материала, руб.;
n – количество применяемых видов материалов.
Расчет целесообразно представить в таблице 8.2.

Таблица 8.2 - Расчет затрат на материалы, покупные полуфабрикаты и комплектующие изделия


Наименование материалов Единица Количес Цена при- НДС, руб. Цена с
покупных полуфабрикатов измерения тво обретения НДС, руб.
и комплектующих изделий без НДС,
руб.

Бумага пачка 1 7,95 1,59 9,54

Ручка шариковая штука 1 0,50 0,10 0,60

Папка-скоросшиватель штука 1 1,50 0,30 1,80

Диск штука 1 0,80 0,16 0,96

Всего расходов 12,90

Всего с транспортно-заготовительными расходами 13,55

Затраты на электроэнергию находятся исходя из продолжительности периода разработки


программного обеспечения, количества кВт/ч, затраченных на его проектирование и тарифа за 1
кВт/ч. по следующей формуле:

Рэ=K э ×T р (8.2)

где Кэ – стоимость одного кВт/ч,руб;


Тр – количество кВт/ч.
Тарифы на электроэнергию применяются согласно приложения к Декларации «Об
уровне тарифов на электроэнергию, отпускаемую РУП Электроэнергетики ГПО “Белэнерго”
для юридических лиц и ИП» на соответствующий период времени, когда разрабатывается
программное обеспечение.
Одноставочный тариф для непромышленного потребления с 01.01.2021 г. составляет
0,38994 руб. за 1 кВт/ч. Время реализации проекта 40 дней, среднее потребление энергии в
месяц составило 75 кВт/ч, то есть было потреблено 143 кВт/ч. Исходя из вышеизложенного
получаем, что на электроэнергию было затрачено:

44
Рэ = 143 × 0,38994 = 55,76

Определяется основная заработная плата научно-технического персонала,


непосредственно занятого выполнением работ.
К этой статье относятся основная заработная плата работников, а также премии,
входящие в фонд заработной платы. Среднее количество рабочих дней в месяце равно 21, а
средняя продолжительность рабочего дня составляет восемь часов. Следовательно, часовая
заработная плата определяется делением размера оклада на количество рабочих часов в месяце
(то есть на 168 часов).
Тарифная ставка первого разряда на предприятии составляет 89 руб. Трудоемкость
определяется исходя из данных, представленных в таблице 8.1.
Произведение трудоемкости на сумму часовой заработной платы определяет затраты
по зарплате для работника на все время разработки.
Расчет основной заработной платы по теме приведен в таблице 8.3.

Таблица 8.3 - Расчет затрат на основную заработную плату научно-производственного


персонала
Часовая Затраты по
Наименование Тарифный Трудоемкость,
Исполнитель Разряд тарифная заработной
этапов работ коэффициент (чел/час)
ставка, руб. плате, руб.
Подготови- техник-
тельный программист
7 2,03 1,08 8 8,64
Выбор методов техник-
и средств программист
7 2,03 1,08 16 17,28
Разработка
техник-
алгоритмов и
программист
7 2,03 1,08 192 207,36
программ
Отладка
техник-
программ и анализ
программист
7 2,03 1,08 80 86,4
результатов
Оформление
документации и техник-
7 2,03 1,08 24 25,92
подготовка к сдаче программист
разработки
345,60
Всего
380,16
Всего с коэффициентом премий

Определяется дополнительная заработная плата исполнителей, включающая


разнообразные предусмотренные трудовым законодательством выплаты, по формуле (8.3).

Н дз
Рдз=Р оз , (8.3)
100

где Ндз - норматив дополнительной заработной платы, Ндз ≈ от 10 до 25 %.

Рдз = 380,16 × 10 / 100 = 38,02

Рассчитываются отчисления органам социальной защиты по формуле (8.4):

Н ос
Рос =(Р оз+ Рдз ) , (8.4)
100

где Нос- норма отчислений на социальную защиту, Нос=34%.

Рос = (380,16 + 38,02) × 34 / 100 = 142,18


45
Также рассчитываются отчисления на страхование от несчастных случаев на
производстве и профессиональных заболеваний (Остр) по ставке действующего
законодательства (Нбгс принимается равным от 0,3 до 0,9%). Для расчетов среднее значение
Нбгс принимается равным 0,6%. Остр рассчитывается по формуле (8.5).

Н бгс
О стр =(Роз + Рдз ) . (8.5)
100

где Остр = (380,16 + 38,02) × 0,6 / 100 = 2,51

Определяются прочие прямые расходы, связанные с амортизационными отчислениями


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

Н пр
Рпр=Р оз , (8.6)
100

где Нпр– норматив прямых расходов, Нпр≈от 10 до 20 %.

Рпр = 380,16 × 20 / 100 = 76,03

Исчисляются косвенные (накладные) расходы по формуле (8.7).

Н кос
Ркос =Роз , (8.7)
100

где Нкос - норматив косвенных расходов, Нкос≈от 50 до 100%.

Ркос = 380,16 × 55 / 100 = 209,09

Определяется полная себестоимость научно-технической продукции как сумма всех


групп затрат по формуле (8.8).

С п=Р м + Рэ+ Роз + Р дз+ Р ос +О стр + Рпр + Ркос . (8.8)

Сп = 13,55 + 55,76 + 380,16 + 38,02 + 142,18 + 2,51 + 76,03 + 209,09 = 917,30

По среднему уровню рентабельности в процентах от полной себестоимости


определяется плановая прибыль единицы научно-технической продукции по формуле (8.9).

Ур
П=С п , (8.9)
100

где Ур - средний уровень рентабельности, Ур ≈от 10 до 30%.

П = 917,30 × 10 / 100 = 91,73

Определяется приближенная (ориентировочная) отпускная цена научно-технической


продукции по формуле (8.10).

46
Ц отп =С п + П . (8.10)

Цотп = 917,30 + 91,73 = 1009,03

Определяется налог на добавленную стоимость (НДС) по формуле (8.11).

Н НДС
НДС =Ц отп , (8.11)
100

где ННДС - ставка налога НДС, ННДС=20 %.

НДС = 1009,03 × 20 / 100 = 201,81

Определяется цена научно-технической продукции с учетом НДС по формуле (8.12).

Ц отп =Ц отп + НДС ( 8.12)

Цотп = 1009,03 + 201,81 = 1210,84

Все приведенные выше расчеты целесообразно объединить в сводную таблицу 8.4.

Таблица 8.4 - Расчет ориентировочной цены научно-технической продукции


Условные
Статьи затрат Сумма, руб.
обозначения
Материалы, покупные полуфабрикаты и 13,55
Рм
комплектующие изделия
Электроэнергия Рэ 55,76
Основная заработная плата научно- 380,16
Роз
производственного персонала
Дополнительная заработная плата научно- 38,02
Рдз
производственного персонала
Отчисления на социальную защиту и на страхование Рос 142,18
от несчастных случаев Остр 2,51
Прочие прямые расходы Рпр 76,03

Накладные расходы Ркос 209,09

Полная себестоимость Сп 917,30

Плановые накопления (прибыль) П 91,73

Отпускная цена (без НДС) Ц 1009,03

Налог на добавленную стоимость РНДС 201,81

Отпускная цена с НДС Цотп 1210,84

8.4 Экономическая эффективность разработки

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


теме создания благотворительных пожертвований в фонды “Be A Blessing”
В технико-экономическом обосновании были рассмотрены следующие вопросы:

47
- составление плана по разработке программы;
- расчет стоимости разработки.
В первой части технико-экономического обоснования был рассчитан срок разработки по
созданию программного средства. Он составил 320 часов.
Во второй части технико-экономического обоснования была рассчитана стоимость
разработки программного продукта, которая составила 1241,93 рублей.
Основное преимущество разработки программного средства в том, что сейчас
количество благотворительных фондов активно продолжает расти. И главной проблемой для
благотворительного фонда становится осведомленность благотворителей о нем. Эту проблему
может решить единая платформа, основной идеей которой выступит возможность множества
благотворительных фондов принимать на ее счет денежные средства. (я хз, зачем это написала,
мне кажется важным сказать об этом)
Исходя из всего исложенного выше, можно сделать следущие выводы: срок разработки
проекта составит 320 часов. Путем несложных расчетов получена его стоимость - 1241,93
рубль. Большую часть расходов составит заработная плата сотрудникам. Основным же
преимуществом нашего проекта станет гибкость платформы, наличие множества возможностей
и для тех, кто на ней будет представлен, и тех, кто будет перечислять средства на нее. В том
числе работники фондов, представленных на платформе, смогут проверять пополняемость, … в
то время как пользователи, жертвующие деньги, смогут потребовать отчет реализации/траты
перечисляемых средств.

48
Заключение

В рамках преддипломной практики было разработано web-приложение для создания


благотворительных акций и компаний «Be a Blessing».
Для достижения цели преддипломной были решены следующие задачи:
– осуществлена возможность создания акций;
– реализован просмотр акций и компаний других пользователей web-приложения;
– организована вкладка Audit, где можно проверить компании;
– под каждой публикацией можно писать комментарии;
– можно вносить акции денежные средства;
– реализовано хранение информации на сервере;
– обеспечено хранение необходимой информации в базе данных;
– разработаны необходимые программные модули компонентов сайта для организации
поиска информации;
– приложение корректно отображается на различных браузерах.
Web-приложение имеет интуитивно понятный графический интерфейс, позволяющий с
минимальным знанием интернета пользоваться данным приложением.
Программа реализована в полном объёме и в соответствии с техническим заданием,
полностью отложена и протестирована. Поставленные задачи были выполнены.

49
Список информационных источников

1 Багласова Т.Г. Методические указания по выполнению дипломного проекта для


учащихся по специальности 2-40 0101 «Программное обеспечение технологий» / Т.Г.Багласова.
– Минск: КБП, 2020
2 Багласова Т.Г. Методические указания по оформлению курсовых и дипломных
проектов / Т.Г.Багласова, К.О.Якимович. – Минск: КБП, 2020
3 ГОСТ 2.105-95 ЕСКД. Общие требования к текстовым документам. – М.: Из-во
стандартов, 1995
4 UMLet [Электронный ресурс]. / Сайт о программном средстве UMLet –
https://www.umlet.com// /, 2010-2021. – Режим доступа : https://www.umlet.com//. – Дата
доступа : 04.04.2021
5 Хавербеке Марейн, Выразительный JavaScript. Современное веб-программирование.
3-е изд. – СПб.: Питер, 2019. – 480 с.: ил. – (Серия «Для профессионалов»).
6 Документация библиотеки React [Электронный ресурс]. – React, 2021. – Режим
доступа : https://ru.reactjs.org/docs/getting-started.html. – Дата доступа : 03.04.2021
7 Руководство по PostgreSQL [Электронный ресурс]. – Metanit, 2021. – Режим
доступа : https://metanit.com/nosql/postgressql/. – Дата доступа : 02.04.2021
8 Документация Ruby on Rails [Электронный ресурс]. – Ruby on Rails, 2021. – Режим
доступа : https://nodejs.org/ru/docs/. – Дата доступа : 08.04.2021
9 Руководство по Ruby [Электронный ресурс]. – Ruby, 2021. – Режим доступа :
https://ruby-lang.com – Дата доступа : 10.04.2021
10 Михнюк, Т.Ф. Охрана труда / Т.Ф. Михнюк. – Минск : ИВЦ Минфина, 2009. – 365 с.
11 Экономика предприятия. Практикум / Э. В. Крум [и др.] ; под ред. Э. В. Крум. –
Минск : Издательство Гревцова, 2009. – 355 с.
12

50
Приложение А
(обязательное)
Текст модулей приложения

# frozen_string_literal: true

module Admin
class CampaignsController < AdminController
def index
authorize(Campaign)

params[:sort] ||= { "status = #{Campaign.statuses['resubmitted']}" => :desc, 'status' => :asc,


'date_needed_by' => :asc }

@campaigns = policy_scope(
Campaign
.eager_load(:referrer, :organization, :campaign_items, :donations)
.where.not(status: 'pending')
.search(params[:search])
.left_outer_joins(:organization, :referrer)
.order(order_params)
).page(params[:page])
end

def show
@campaign = Campaign.find(params[:id])
authorize(@campaign)
end

private

# This is necessary to get rid of an unsafe warning


# We are using strong parameters, so we aren't allowing SQL injection
def order_params
sort_params.to_h.transform_keys { |k| Arel.sql(transform_sort(k)) }
end

def sort_params
params.fetch(:sort, {}).permit(
:id,
:title,
:status,
:date_needed_by,
:pct_to_goal,
:amount_raised,
:goal_amount,
:postal_code,
'organizations.name',
'users.first_name'
)
end
51
def transform_sort(key)
send("sort_#{key}")
rescue NoMethodError
key
end

def sort_goal_amount
<<-SQL
(
SELECT COALESCE(total_cost, 999999999) FROM campaigns
)
SQL
end

def sort_amount_raised
<<-SQL
(
SELECT COALESCE(SUM(donations.amount), 0) FROM donations
WHERE donations.campaign_id = campaigns.id
)
SQL
end

def sort_status
status_order = Campaign.statuses.sort.to_h.values.each_with_index.map.to_a
order_sql = status_order.map { |status_integer, index| "WHEN
campaigns.status='#{status_integer}' THEN #{index}" }.join(' ')

<<-SQL
CASE #{order_sql} END
SQL
end

def sort_pct_to_goal
"(#{sort_goal_amount} - #{sort_amount_raised})"
end
end
end

# frozen_string_literal: true

module Admin
class UsersController < AdminController
include Users::ToggleUser

before_action :set_user, except: %i[index create]

def index
authorize(User)

params[:sort] ||= { last_name: 'asc' }

@users = policy_scope(
52
User
.includes(:organization)
.left_outer_joins(:organization)
.where(filter_params)
.order(order_params)
).page(params[:page])
end

def create
authorize(User)
@invite = UserInvite.new(user_invite_params.merge(inviter: current_user))
@user = @invite.create if @invite.valid?
end

def update
if @user.update(permitted_attributes(@user))
flash[:success] = 'The user has been updated.'
else
flash[:danger] = "Unable to update the user. Errors: #{@user.errors.full_messages.to_sentence}"
end
redirect_back(fallback_location: admin_users_path)
end

private

def set_user
@user ||= User.find(params[:id])
authorize(@user)
end

# This is necessary to get rid of an unsafe warning


# We are using strong parameters, so we aren't allowing SQL injection
def order_params
sort_params.to_h.transform_keys { |k| Arel.sql(k) }
end

def sort_params
params.fetch(:sort, {}).permit(:first_name, :last_name, :email, 'organizations.name')
end

def filter_params
params.fetch(:filters, {}).permit(:role, :status)
end

def user_invite_params
params.require(:user_invite).permit(:first_name, :last_name, :email, :role)
end
end
end

# frozen_string_literal: true

module Admin
module Reports
53
class ReportsController < AdminController
before_action :set_donations

def show; end

def export
timestamp = Time.now.utc.strftime('%Y%m%d%H%M%S')
response.headers['Content-Disposition'] = %
(attachment;filename="#{timestamp}_#{controller_name}.xls")
end

private

def set_donations
@donations = "#{controller_name.capitalize}DonationFilters".constantize.new(
current_user, permitted_params,
Donation.eager_load(:campaign).where('campaigns.title LIKE ?',
"%#{permitted_params[:search]}%")
.page(permitted_params[:page]).per(15)
).apply
end

def permitted_params
@permitted_params ||= params.permit(:format, :search, :page, :status, sort: {})
end
end
end
end

# frozen_string_literal: true

class NotificationsController < ApplicationController


before_action :set_notification, only: :single_toogle

def index
authorize(Notification)
@notifications = policy_scope(Notification.includes(:source, :target)).order('created_at desc')
end

def read_all
authorize(Notification, :read_all?)
current_user.notifications.update_all(status: 'read') # rubocop:disable Rails/SkipsModelValidations
redirect_to(notifications_path)
end

def unread_all
authorize(Notification, :unread_all?)
current_user.notifications.update_all(status: 'unread') # rubocop:disable
Rails/SkipsModelValidations
redirect_to(notifications_path)
end

def single_toogle
authorize(Notification, :single?)
54
@notification.update(status: @notification.next_status)

@read_class_action = toogle_class_action('read')
@unread_class_action = toogle_class_action('unread')
@notifications_count = current_user.notifications.unread.count

respond_to { |format| format.js }


end

private

def set_notification
@notification = Notification.find(params[:id])
end

def toogle_class_action(conditional)
@notification.status == conditional ? 'removeClass' : 'addClass'
end
end

# frozen_string_literal: true

class User < ApplicationRecord


include UserStateMachine
include Users::CampaignsScopes

attr_accessor :password

phony_normalize :phone

belongs_to :organization, optional: true


has_many :campaigns,
inverse_of: :referrer,
foreign_key: 'referrer_id',
dependent: :destroy
has_many :campaign_updates,
dependent: :destroy
has_many :notifications, dependent: :destroy
has_one :user_session, dependent: :destroy
has_one :default_shipping_address,
-> { where(type: 'shipping') },
class_name: 'Address',
as: :addressable,
inverse_of: :addressable,
dependent: :destroy

has_one_attached :photo

accepts_nested_attributes_for :default_shipping_address, update_only: true, reject_if: lambda { |


attributes|
# don't save default shipping address if it's blank
attributes.except(:state).map(&:blank?).uniq.include?(false)
}
55
enum role: {
admin: 0,
fulfillment_specialist: 1,
organization_admin: 2,
referring_partner: 3,
donor: 4
}

enum status: {
active: 0,
inactive: 1
}

scope :by_organization, ->(organization_id) { where(organization_id: organization_id) }

validates :email, presence: true


validates :organization, presence: true, if: -> { organization_admin? || referring_partner? }
validates :phone, phony_plausible: true
validates :bio, length: { maximum: 500 }
validates :photo, blob: {
content_type: ['image/png', 'image/jpg', 'image/jpeg'],
size_range: 0..5.megabytes
}
validate :update_password, if: -> { password.present? }
validate :update_email, if: -> { persisted? && email_changed? }

after_save :clean_password
before_validation :assign_email_from_cognito, on: :create, if: -> { email.blank? }

def name
"#{first_name} #{last_name}".strip
end

def activate!
User.transaction do
active!

cognito.admin_enable_user(
user_pool_id: ENV.fetch('AWS_COGNITO_POOL_ID'),
username: cognito_id
)
rescue ArgumentError => e
errors.push(e.message)
end
end

def deactivate!
User.transaction do
inactive!

cognito.admin_disable_user(
user_pool_id: ENV.fetch('AWS_COGNITO_POOL_ID'),
username: cognito_id
56
)
rescue ArgumentError => e
errors.push(e.message)
end
end

def update_password
cognito.admin_set_user_password(
user_pool_id: ENV.fetch('AWS_COGNITO_POOL_ID'),
username: cognito_id,
password: password,
permanent: true
)
rescue StandardError
errors.add(:password, 'is invalid')
end

def assign_email_from_cognito
cognito_user = cognito.admin_get_user(
user_pool_id: ENV.fetch('AWS_COGNITO_POOL_ID'),
username: cognito_id
)
self.email = cognito_user.user_attributes.find { |attribute| attribute.name == 'email' }.value
end

def update_email
cognito.admin_update_user_attributes(
user_pool_id: ENV.fetch('AWS_COGNITO_POOL_ID'),
username: cognito_id,
user_attributes: [
{ name: 'email', value: email },
{ name: 'email_verified', value: 'true' }
]
)
rescue StandardError
errors.add(:email, 'is invalid')
end

def self.by_email(attributes, role = 'donor')


User.find_by(attributes.slice('email')) || User.create(attributes.merge('role' => role))
end

def clean_password
self.password = nil
end

def cognito
@cognito ||= Aws::CognitoIdentityProvider::Client.new
end
end
# frozen_string_literal: true

class UserInvite
include Rails.application.routes.url_helpers
57
AWS_USER_ROLES = {
'admin' => 'administrative user'
}.freeze

include ActiveModel::Model
include ActiveModel::Validations

attr_accessor :inviter, :email, :first_name, :last_name, :role, :organization, :accepting_application,


:processing_admin

validates :inviter, presence: true, unless: :accepting_application


validates :first_name, presence: true
validates :last_name, presence: true
validates :email, presence: true

validate :validate_role

def create
return false unless valid?

existing_user = User.find_by(email: email)


response = create_cognito_user(existing_user.present?)
existing_user.presence || create_user(response.user.username)
rescue Aws::CognitoIdentityProvider::Errors::UsernameExistsException,
Aws::CognitoIdentityProvider::Errors::UnsupportedUserStateException
errors.add(:email, 'Email is already in use.')
false
rescue Aws::CognitoIdentityProvider::Errors::InvalidParameterException => e
raise unless e.message.include?('email')

errors.add(:email, e.message)
false
end

def validate_role
return if accepting_application
return if inviter.admin?
return unless inviter.organization_admin? && !%w[organization_admin referring_partner].include?
(role)

errors.add(:role, 'Invalid role.')


end

private

def create_cognito_user(existing_user_exists)
options = {
user_pool_id: ENV.fetch('AWS_COGNITO_POOL_ID'),
username: email,
user_attributes: [
{ name: 'email', value: email },
{ name: 'email_verified', value: 'True' },
{ name: 'custom:user_role', value: AWS_USER_ROLES[role] || role.sub('_', ' ') },
58
{ name: 'custom:inviter_name', value: inviter&.name || processing_admin&.name }
],
desired_delivery_mediums: ['EMAIL'],
client_metadata: { route: dashboard_route }
}
options[:message_action] = 'RESEND' if existing_user_exists

cognito.admin_create_user(options)
end

def dashboard_route
send("#{role}_dashboard_url")
rescue NameError
raise "Dashboard route for #{role} has't been defined."
end

def create_user(cognito_id)
user = User.new(
cognito_id: cognito_id,
status: 'active',
email: email,
first_name: first_name,
last_name: last_name,
organization: organization,
role: role
)
return false unless user.save

user
end

def cognito
@cognito ||= Aws::CognitoIdentityProvider::Client.new
end
end

# frozen_string_literal: true

class Campaign < ApplicationRecord


ACCEPTING_PHOTO_FORMATS = 'image/png,image/jpg,image/gif,image/jpeg'

include CampaignStateMachine
include Campaigns::ItemsHelper

attr_accessor :processing_admin

belongs_to :referrer, class_name: 'User'


belongs_to :organization
has_many :donations, dependent: :destroy
has_many :campaign_updates, dependent: :destroy
has_many :campaign_items, dependent: :destroy
has_many :campaign_item_categories, through: :campaign_items
has_many :item_categories, through: :campaign_item_categories
has_many :comments, dependent: :destroy
59
has_one :fulfillment_assigment, class_name: 'FulfillmentSpecialistsCampaign', dependent: :destroy
has_one :shipping_address, -> { where(type: 'shipping') },
class_name: 'Address', as: :addressable, inverse_of: :addressable, dependent: :destroy

has_rich_text :internal_notes
has_one_attached :photo

scope :search, lambda { |term|


return all if term.blank?

where('title ILIKE ?', "%#{term}%")


}

scope :with_status, lambda { |status|


return all if status.blank?

where(status: status)
}

scope :pending_audit, lambda {


left_outer_joins(:campaign_updates)
.where(status: %w[pending resubmitted])
.or(
left_outer_joins(:campaign_updates)
.where(campaign_updates: { status: %w[pending] })
)
}

accepts_nested_attributes_for :shipping_address, update_only: true


accepts_nested_attributes_for :campaign_items

enum status: {
pending: 0,
resubmitted: 1,
rejected: 2,
active: 3,
unfunded: 4,
funded: 5,
shipped: 6,
fulfilled: 7,
archived: 8
}

validates :recipient_name, presence: true


validates :postal_code, presence: true
validates :date_needed_by, presence: true
validates :title, presence: true
validates :short_description, presence: true, length: { maximum: 500 }
validates :description, presence: true
validates :photo, blob: {
content_type: ACCEPTING_PHOTO_FORMATS.split(','),
size_range: 0..5.megabytes
}

60
validates :archive_reason, presence: { if: -> { archived? },
message: 'Unpublish reason is required.' }
validates :campaign_items, presence: true, on: :create

before_create :determine_region

before_save :recalcuate_campaign_total_cost, if: :campaign_items_prices_have_changed?

def self.statuses_count
pluck(:status).each_with_object(Hash.new(0)) do |status, total|
total[status] += 1
end
end

def determine_region
self.region = Region.region_by_zip(postal_code)
end

def name
title
end

def latest_approved_update
campaign_updates.latest_approved
end

def latest_pending_update
campaign_updates.latest_pending
end

def latest_rejected_update
campaign_updates.latest_rejected
end

def kit_baskets
{
hygiene_kits: hygiene_kits,
school_supply_kits: school_supply_kits,
household_supply_kits: household_supply_kits
}
end

def needed_donations_amount
@needed_donations_amount ||= total_cost - amount_raised
end

def amount_raised
@amount_raised ||= donations.select { |d| d.status = 'successful' }.inject(0) { |sum, d| sum +
d.amount }
end

def campaign_items_prices_have_changed?
%i[item_cost estimated_shipping_cost sales_tax_pct].any? do |item_field|
campaign_items.any? do |item|
61
item.changes.key?(item_field) &&
item.changes[item_field].first != item.changes[item_field].last
end
end
end

def recalcuate_campaign_total_cost
self.total_cost = campaign_items.map(&:total_cost).sum
end
end

# frozen_string_literal: true

class UserPolicy < ApplicationPolicy


class Scope < Scope
def resolve
return scope.all if user.admin?
return scope.where(organization: user.organization) if user.organization_admin?
end
end

def base_attributes
attrs = %i[photo first_name last_name email phone bio password job_title passions
receives_notifications
receives_profile_notifications]
attrs << { default_shipping_address_attributes: %i[street_1 street_2 city state postal_code] }
attrs
end

def permitted_attributes
return base_attributes + %i[role] if user&.organization_admin? || user&.admin?

base_attributes
end

def index?
user&.admin? || user&.organization_admin?
end

def create?
user&.admin? || user&.organization_admin?
end

def update?
return true if user&.admin?

organization_admin_owns
end

def show?
return true if user&.admin?

organization_admin_owns
end
62
def activate?
return true if user&.admin?

organization_admin_owns
end

def deactivate?
return true if user&.admin?

organization_admin_owns
end

def active_campaigns?
return true if user&.admin?

organization_admin_owns
end

def reassign_campaigns?
return true if user&.admin?

organization_admin_owns
end

private

def organization_admin_owns
user&.organization_admin? && user.organization == record.organization
end
end

frozen_string_literal: true

class CampaignPolicy < ApplicationPolicy


def campaign_items_attributes
attrs = [:id, :difficult_transport, :special_instructions,
fields: {}, campaign_item_categories_attributes: %i[item_category_id]]

return attrs unless user.admin? || user.fulfillment_specialist?

%i[item_cost estimated_shipping_cost sales_tax_pct


delivery_eta retailer_name url tracking_number order_number] + attrs
end

def base_attributes
[:recipient_name, :title, :short_description, :description, :date_needed_by,
:postal_code, :photo, :hygiene_kits, :school_supply_kits, :household_supply_kits,
shipping_address_attributes: %i[street_1 street_2 city state postal_code],
campaign_items_attributes: campaign_items_attributes]
end

def permitted_attributes
return %i[referrer] + base_attributes if user.organization_admin?
63
return base_attributes unless user.admin? || user.fulfillment_specialist?

%i[status notes internal_notes tracking_number order_number] + base_attributes


end

def index?
true
end

def show?
user || record.active?
end

def new?
%w[organization_admin referring_partner].include?(user&.role)
end

def create?
new?
end

def edit?
return true if user.admin? || user.fulfillment_specialist? || referring_partner_owns
return true if record.rejected? && organization_admin_owns

false
end

def update?
edit?
end

def ship?
user.fulfillment_specialist? && record.funded?
end

def print_campaign_comments?
user&.referring_partner? || user&.organization_admin?
end

def purchase_information?
ship?
end

def put_statistics?
user&.admin? || user&.organization_admin? || user&.referring_partner?
end

def breakdown_report?
user&.admin? || user&.organization_admin?
end

def unpublish?
return unless record && user
64
user_can_manage_campaign? && campaign_can_be_unpublished?
end

def move_donations?
return unless record && user

user_can_manage_campaign? && (record.archived? || record.unfunded?) &&


record.amount_raised.positive?
end

def allocate_funds?
user&.admin? && record&.active?
end

class Scope < Scope


include Users::CampaignsScopes

def resolve
return unless user

send("#{user.role}_campaigns_scope")
end
end

private

def referring_partner_owns
user.referring_partner? && record.referrer == user
end

def organization_admin_owns
user.organization_admin? && record.organization == user.organization
end

def campaign_can_be_unpublished?
record.pending? || record.rejected? || record.resubmitted? || record.active?
end

def user_can_manage_campaign?
referring_partner_owns || organization_admin_owns || user.admin? || user.fulfillment_specialist?
end
end

# frozen_string_literal: true

module Campaigns
module ItemsHelper
FULFILLMENT_STRING_FIELDS = {
retailer_name: { description: 'Retailer Name', placeholder: 'John Smith', requirement: '*' },
url: {
description: 'URL of item purchased', placeholder: 'https://www.example.com/', requirement: '*'
},
tracking_number: {
65
description: 'Tracking number', placeholder: '774906988706', requirement: '*'
},
order_number: { description: 'Order Number', placeholder: '24567834', requirement: '*' }
}.freeze

FULFILLMENT_COST_FIELDS = {
item_cost: {
description: 'Actual Item cost', placeholder: '$0.00', additional_label: '$', requirement: '*'
},
estimated_shipping_cost: {
description: 'Est. Shipping Cost (To 35234)', placeholder: '$0.00', additional_label: '$',
requirement: '*'
},
sales_tax_pct: {
description: 'Sales Tax', placeholder: '7.5%', additional_label: '%', requirement: '*'
}
}.freeze

# rubocop:disable Rails/HelperInstanceVariable
def total_fulfillment_fee
@total_fulfillment_fee ||= campaign_items.map(&:fulfillment_fee).sum
end

def total_actual_item_cost
@total_actual_item_cost ||= campaign_items.map { |item| item.item_cost || 0 }.sum
end

def total_estimated_shipping_cost
@total_estimated_shipping_cost ||= campaign_items.map { |item| item.estimated_shipping_cost || 0
}.sum
end

def total_donation_fee
@total_donation_fee ||= campaign_items.map(&:donation_fee).sum
end

def total_credit_card_processing_fee
@total_credit_card_processing_fee ||= campaign_items.count *
CampaignItem::CREDIT_CARD_PROCESSING_FEE
end

def total_contingency_fee
@total_contingency_fee ||= campaign_items.map(&:contingency_fee).sum
end

def total_tax_cents
@total_tax_cents ||= campaign_items.map(&:tax_cents).sum
end

def latest_delivery_eta
array_of_delevery_etas = campaign_items.compact.map(&:delivery_eta).compact
@latest_delivery_eta ||= if array_of_delevery_etas.empty?
0
else
66
((array_of_delevery_etas.max - Time.zone.now) / 60 / 60 / 24).to_i
end
end

# rubocop:enable Rails/HelperInstanceVariable

def fulfillment_back_link(campaign, user)


link_to('Go back', send("#{user.role}_fulfillment_back_link", campaign),
class: 'btn btn-secondary mr-10')
end

private

def fulfillment_specialist_fulfillment_back_link(campaign)
edit_fulfillment_specialist_audit_campaign_path(campaign)
end

def admin_fulfillment_back_link(campaign)
edit_admin_audit_campaign_path(campaign)
end

def referring_partner_fulfillment_back_link(campaign)
referring_partner_campaign_path(campaign)
end

def organization_admin_fulfillment_back_link(campaign)
organization_admin_campaign_path(campaign)
end
end
end

# frozen_string_literal: true

module FulfillmentSpecialist
class CampaignsController < FulfillmentSpecialistController
before_action :set_campaign, except: :index

def index
authorize(Campaign)

@filters = DashboardCampaignFilters.new(current_user, permitted_params, Campaign)


@all_campaigns ||= policy_scope(
@filters.apply.eager_load(:referrer, :organization, fulfillment_assigment: :user)
).page(permitted_params[:page]).search(permitted_params[:search])

@campaigns = @all_campaigns.with_status(permitted_params[:status] || (params[:status] =


'funded'))
end

def update
if @campaign.update(permitted_attributes(@campaign))
flash[:success] = 'The campaign has been updated.'
else
flash.now[:danger] = @campaign.errors.full_messages.to_sentence
67
end

redirect_to fulfillment_specialist_campaign_path(@campaign)
end

def show; end

def purchase_information
set_fulfillment_campaign_assigment
end

def ship
if @campaign.shipped!
flash[:success] = { message: 'Campaign has successfully been updated.',
options: { time_before_close: 5000 } }
else
flash[:danger] = "Campaign Can Not Be Shipped:
#{@campaign.errors.full_messages.to_sentence}"
end

redirect_to fulfillment_specialist_campaigns_path
end

private

def permitted_params
params.permit(:search, :page, :status, sort: {})
end

def set_campaign
@campaign = Campaign.find(params[:id])
authorize(@campaign)
end

def set_fulfillment_campaign_assigment
FulfillmentSpecialistsCampaign.find_or_initialize_by(campaign_id: @campaign.id).tap do |f|
f.user = current_user
f.save
end
end
end
end

# frozen_string_literal: true

module Paypal
class PaymentNotificationsController < ApplicationController
protect_from_forgery except: :create
skip_before_action :throw_acknowledge_terms_confirmation
skip_before_action :authenticate_request

def create
response = validate_ipn_notification(request.raw_post)

68
return unless (response == 'VERIFIED') && %w[Pending Accepted].include?
(params[:payment_status])

return unless params[:receiver_email] == 'vlad-frolov-2011@yandex.by'

errors = ::Paypal::DonationsBuilder.build(params.permit(*attributes_for_permition))

head(errors.empty? ? :ok : :internal_server_error)


end

protected

def validate_ipn_notification(raw)
uri = URI.parse('https://ipnpb.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate')
http = Net::HTTP.new(uri.host, uri.port)
http.open_timeout = 60
http.read_timeout = 60
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.use_ssl = true
http.post(uri.request_uri, raw, 'Content-Length' => raw.size.to_s,
'User-Agent' => 'My custom user agent').body
end

def attributes_for_permition
%i[custom first_name last_name payer_email residence_country mc_gross txn_id memo]
end
end
end

# frozen_string_literal: true

module Users
class PasswordsController < ApplicationController
layout 'auth'

skip_before_action :authenticate_request
before_action :redirect_to_dashboard, only: %i[new create]

def new; end

def create
if forgot_password(params[:email])
flash[:success] = 'Please check your email address for a verification code to reset your password.'
redirect_to(new_users_session_path)
else
flash[:danger] = 'An error has occurred. Please try again.'
redirect_to(new_users_password_path)
end
end

def edit; end

# rubocop:disable Metrics/MethodLength
def update
69
if confirm_forgot_password(params[:code], params[:email], params[:password])
flash[:success] = 'Your password has been updated.'
redirect_to(new_users_session_path)
else
flash.now[:danger] = 'An error has occurred. Please try again.'
render(:edit)
end
rescue Aws::CognitoIdentityProvider::Errors::InvalidPasswordException
flash.now[:danger] = 'Your password must meet the password security requirements.'
render(:edit)
rescue Aws::CognitoIdentityProvider::Errors::LimitExceededException
flash.now[:danger] = 'Attempt limit exceeded. Please try again after some time.'
render(:edit)
rescue Aws::CognitoIdentityProvider::Errors::ExpiredCodeException
flash[:danger] = 'Invalid code provided. Please request a new password change.'
redirect_to(new_users_password_path)
end
# rubocop:enable Metrics/MethodLength

private

def redirect_to_dashboard
redirect_to(after_sign_in_path(current_user)) if current_user.present?
end
end
end

# frozen_string_literal: true

class ApplicationController < ActionController::Base


include SessionAuthenticatable
include Pundit

rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized


rescue_from ActiveRecord::RecordNotFound, with: :record_not_found

before_action :current_cart
before_action :throw_acknowledge_terms_confirmation, unless:
:user_applied_all_acknowledge_terms?

layout :determine_layout

def user_not_authorized
flash[:warning] = 'You are not authorized to perform this action.'
redirect_to(root_path)
end

def require_any_role(roles)
return if roles.include?(current_user&.role)

flash[:warning] = 'You do not have access to this content.'


redirect_to(root_path)
end

70
def require_no_current_user
return unless current_user

flash[:warning] = 'You do not have access to this content.'


redirect_to(root_path)
end

def determine_layout
if %w[admin fulfillment_specialist organization_admin].include?(current_user&.role)
@layout = 'admin'
return 'admin'
end

@layout = 'application'
end

helper_method :layout
attr_reader :layout

private

def user_applied_all_acknowledge_terms?
return true unless current_user

AcknowledgeTermsConfirmation.find_by(user_email: current_user.email, target: :new_user,


confirm_terms_and_conditions: true, confirm_privacy_policy: true,
confirm_understanding_of_participation: true)
end

def throw_acknowledge_terms_confirmation
redirect_to new_users_acknowledge_terms_confirmation_path
end

def current_cart
return @current_cart if @current_cart

@current_cart = ShoppingCart.find_by(id: session[:cart_id]) || ShoppingCart.create


session[:cart_id] = @current_cart.id

@current_cart
end
end

# frozen_string_literal: true

class ShoppingCartItemsController < ApplicationController


skip_before_action :authenticate_request

before_action :set_campaign, only: :create


before_action :set_item, only: :remove

def create
@item = @current_cart.shopping_cart_items.new(permitted_attributes(ShoppingCartItem)).tap do |
i|
71
i.amount = permitted_attributes(ShoppingCartItem)[:amount].gsub(/,/, '').to_d
i.save
end

if @item.persisted?
flash[:success] = 'Item has been succesfully added'
else
flash[:danger] = @item.errors.full_messages.to_sentence
end

redirect_back(fallback_location: campaigns_path(@campaign))
end

def remove
@item.tap do |i|
i.targetable = nil
i.buyable = nil
i.destroy!
end

respond_to do |format|
format.js
end
end

private

def set_campaign
@campaign = Campaign.find_by(id: params[:format])

remove_donations unless @campaign.active?


end

def remove_donations
ShoppingCartItem.where(buyable_type: 'Donation',
targetable_type: 'Campaign', targetable_id: @campaign.id).destroy_all

message = 'This campaign has already been fully funded! Please


find and donate to another worthy cause.'
flash[:danger] = message

redirect_to campaigns_path
end

def set_item
@item = ShoppingCartItem.find(params[:shopping_cart_item_id])
end
end

72
ОТ Т.795011 ГЧ

Подп. и дата Взам.инв.№ Инв.№дубл. Подп. и дата


Изм.

Инв.№дубл. Подп. и дата


Лист

Подп. и дата Взам.инв.№


№ докум.

Инв.№дубл. Подп. и дата


Подпись Датаа

Инв.№дубл. Подп. и дата


Подп. и дата Взам.инв.№

Подп. и дата Взам.инв.№


ДП Т.795011 ГЧ
Лит.
Масса
Масштаб

Разработка веб-приложения компании


«Be a Blessing» для организации
благотворительных акций с целью сбора
средств нуждающимся в социально-
финансовой поддержке

Структура веб-приложения
ОТ Т.795011 ГЧ

№подл. Подп. и дата Взам.инв.№ Инв.№дубл. Подп. и дата

Инв.№дубл. Подп. и дата

№подл. Подп. и дата Взам.инв.№

Инв.№дубл. Подп. и дата

Инв.№дубл. Подп. и дата


№подл. Подп. и дата Взам.инв.№

№подл. Подп. и дата Взам.инв.№


ДП Т.795011 ГЧ
ОТ Т.7Ч
Масса Лит.
Масштаб

Разработка веб-приложения компании


«Be a Blessing» для организации
благотворительных акций с целью сбора
средств нуждающимся в социально-
финансовой поддержке

Диаграмма вариантов
использования
ОТ Т.795011 ГЧ

нв. Подп. и дата Взам.инв.№ Инв.№дубл. Подп. и дата


дл.
Изм. Лист
Разраб.

Подп. и дата Взам.инв.№ Инв.№дубл. Подп. и дата


нв.
дл.
Масюлионис Г.С.
№ докум.

Подп. и дата Взам.инв.№ Инв.№дубл. Подп. и дата

нв.
дл.
Подпись Датаа

Подп. и дата Взам.инв.№ Инв.№дубл. Подп. и дата

нв.
дл.
ДП Т.795011 ГЧ
Лит.
У
Масса
Масштаб

Разработка веб-приложения компании


«Be a Blessing» для организации
благотворительных акций с целью сбора
средств нуждающимся в социально-
финансовой поддержке

Диаграмма развертывания

Вам также может понравиться