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

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

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

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

РАЗРАБОТКА ВЕБ-ПРИЛОЖЕНИЯ КОМПАНИИ «BE A BLESSING» ДЛЯ


ОРГАНИЗАЦИИ БЛАГОТВОРИТЕЛЬНЫХ АКЦИЙ С ЦЕЛЬЮ СБОРА СРЕДСТВ
НУЖДАЮЩИМСЯ В СОЦИАЛЬНО-ФИНАНСОВОЙ ПОДДЕРЖКЕ

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

ДП Т.795030.401

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

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

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

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

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

Рецензент ( )

2021
Содержание
Введение 4
1 Объектно-ориентированный анализ и проектирование приложения 5
1.1 Назначение и цели создания Web-приложения 5
1.2 Проектирование модели 6
2 Проектирование Web-приложения 9
2.1 Требования к Web-приложению 9
2.2 Структура Web-приложения 9
2.3 Проектирование макета web-приложения 11
2.4 Программно-технические средства, необходимые для разработки приложения 13
2.5 Защита и сохранность данных 15
2.6 Организация и ведение информационной базы 15
3 Реализация Web-приложения 21
3.1 Разработка административной части приложения 21
3.2 Разработка клиентской части приложения 21
3.3 Описание используемых функций и процедур 21
4 Описание Web-приложения 26
4.1 Общие сведения 26
4.2 Функциональное назначение 26
4.3 Описание разделов web-приложения 26
5 Методика испытаний 28
5.1 Технические требования 28
5.2 Функциональное тестирование 28
6 Применение 38
6.1 Назначение программы 38
6.2 Программно-аппаратное обеспечение сервера и клиента 38
7 Охрана труда и окружающей среды на предприятии 39
7.1 Правовые, нормативные, социально-экономические и организационные вопросы
охраны труда 39
7.2 Разработка инженерно-технических решений по снижению шума в рабочей зоне
помещений с ЭВМ 41
7.3 Пожарная безопасность 42
7.4 Охрана окружающей среды 44
8 Экономический раздел 46
8.1 Технико-экономическое обоснование разработки программного средства 46
8.2 Составление плана по разработке программного средства 46
8.3 Определение цены программного средства 46
8.4 Экономическая эффективность разработки 50
Заключение 52
ДП Т.795030.401
Список информационных источников
Изм. Лист № докум. Подпись Дата 53
Приложение А – Текст программы
Разраб. Гром А.А. Разработка вэб-приложения55 Лит.
Провер. Ржеутская Н.В. компании «Be a Blessing» для у
организации благотворительных
Т. Контр. Багласова Т.Г.
акций с целью сбора средств
Н. Контр. Багласова Е.В. нуждающимся в социально-
Утверд. Багласова Т.Г. финансовой поддержке
Введение

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


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

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

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

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


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

5
Разрабатываемое Web-приложение имеет название «Be A Blessing», что в свою очередь
переводится на русский язык, как «Будь Благословлён». Такое название обусловлено тем, что
приложение в первую очередь предназначено для внесения денег в благотворительную
компанию, для людей которое находятся в сложной социально-финансовой ситуации.

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

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


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

Рисунок 1.1  Диаграмма «Сущность-связь»

Исходя из предметной области можно выделить следующие сущности разработки:


«Комментарий», «Фонд», «Вещи для компании», «Тип», «Пользователь».

6
Для сущности «Комментарий» атрибутом будет являться:
– текст;
– дата
Для сущности «Фонд» атрибутами будут являться:
– название;
– картинка;
– описание.
Для сущности «Вещи для компании» атрибутами будут являться:
– автомобили;
– обувь;
– электроника.
Для сущности «Тип» атрибутами будут являться:
– открыта;
– закрыта.
Для сущности «Пользователь» атрибутами будут являться:
– статус;
– имя;
– электронная почта;
– пароль.
Диаграмма вариантов использования описывает функциональное назначение системы
или, другими словами, то, что система будет делать в процессе своего функционирования. Она
является исходным концептуальным представлением или концептуальной моделью системы в
процессе ее проектирования и разработки.
Суть данной диаграммы состоит в следующем: проектируемая система представляется в
виде множества так называемых вариантов использования, предоставляемых системой
множеству актеров или сущностей, взаимодействующих с системой. При этом актером (actor)
или действующим лицом называется любая сущность, взаимодействующая с системой извне.
Это может быть человек, техническое устройство, программа или любая другая система,
которая может служить источником воздействия на моделируемую систему так, как определит
сам разработчик. В свою очередь, вариант использования (use case) служит для описания
сервисов, которые система предоставляет актеру. Другими словами, каждый вариант
использования определяет некоторый набор действий, совершаемый системой при диалоге с
актером [25].
Варианты использования определяют функциональные возможности. Каждый из них
представляет определенный способ использования. Таким образом, каждый вариант
использования соответствует последовательности действий для того, чтобы клиент мог
получить определенный результат.
Исходя из диаграммы вариантов использования можно выделить следующие «includes»
функции, которые включают в авторизацию такие возможности как:
- добавление комментариев;
- просмотр компаний других пользователей;
- добавление компаний;
- изменение данных в базе данных.
Также эти функции расширяются с помощью «extend» функции – обработки запроса на
сервере.
Диаграмма структуры веб-приложения представлена в графической части на листе 1.
Диаграмма вариантов использования представлена в графической части на листе 3.
Диаграмма развертывания представляет физическое расположение системы, показывая,
на каком физическом оборудовании запускается та или иная составляющая программного
обеспечения. В отличие от диаграмм логического представления, диаграмма развертывания
является единой для системы в целом, поскольку должна всецело отражать особенности ее
реализации. Диаграмма развертывания завершает процесс объектно-ориентированного анализа

7
и проектирования для конкретной программной системы и ее разработка, как правило, является
последним этапом спецификации модели [11].
Для диаграммы развертывания проектируемой системы представлены все компоненты,
существующие на этапе исполнения, а именно:
 база данных Postgres;
 cs, html, css скрипты;
 web-сервер;
 web-браузер;
 html-страницы.
Диаграмма развертывания представлена в графической части на листе 4.
При моделировании поведения проектируемой или анализируемой системы возникает
необходимость детализировать особенности алгоритмической и логической реализации
выполняемых системой операций. Для моделирования процесса выполнения операций в языке
UML используются так называемые диаграммы деятельности. Каждое состояние на диаграмме
деятельности соответствует выполнению некоторой элементарной операции, переход в
следующее состояние срабатывает только при завершении этой операции. Графически
диаграмма деятельности представляется в форме графа, вершинами которого являются
состояния действия, а дугами – переходы от одного состояния действия к другому.
Основная цель использования диаграмм деятельности – визуализация особенностей
реализации операций классов, когда необходимо представить алгоритмы их выполнения [7].
Диаграмма деятельности представлена в графической части на листе 2.

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

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

Разрабатываемое программное средство будет представлять собой Web-приложение,


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

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

Логическая структура web-приложения отображает то, как именно связаны между собой
страницы одного сайта. При разработке приложения для управления коллекциями
максимальная связь страниц достигнута при помощи постоянного отображения навигационной
панели сайта, благодаря этому навигация по сайту не вызывает никаких затруднений.
Структура Web-приложения представлена в графической части на листе 4.
Разделы и страницы представляются в виде файлов и каталогов. Необходимо продумать
их структуру, способы именования и полное дерево каталогов. Это важный момент, поскольку
определяет способы связи между страницами. В приложении используется Model-view-
controller -концепция.
9
Model-view-controller (MVC)  схема использования нескольких шаблонов
проектирования, с помощью которых модель данных приложения, пользовательский интерфейс
и взаимодействие с пользователем разделены на три отдельных компонента таким образом,
чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные.
Данная схема проектирования часто используется для построения архитектурного каркаса,
когда переходят от теории к реализации в конкретной предметной области [12].
Концепция MVC позволяет разделить данные, представление и обработку действий
пользователя на три отдельных компонента:
 модель предоставляет знания: данные и методы работы с этими данными, реагирует
на запросы, изменяя своё состояние. Не содержит информации, как эти знания можно
визуализировать.
 представление, вид   отвечает за отображение информации (визуализацию). Часто в
качестве представления выступает форма (окно) с графическими элементами.
 контроллер. Обеспечивает связь между пользователем и системой: контролирует ввод
данных пользователем и использует модель и представление для реализации необходимой
реакции.
Помимо изолирования видов от логики приложения, концепция MVC существенно
уменьшает сложность больших приложений. Код получается гораздо более
структурированным, и, тем самым, облегчается поддержка, тестирование и повторное
использование решений.
Дерево каталогов и файлов Web-приложения представлено на рисунке 2.1.

Рисунок 2.1 – Дерево каталогов

Описание структуры дерева каталогов:


- «blessingsthoughactions-web»  главная папка приложения;
- «assets»  папка, в которой содержатся различные логотипы;
- «сhannels»  папка, в которой каналы для подключения сокетов;
- «controllers»  папка, в которой находится код контроллеров;
- «filters»  папка, в которой фильтры для сортировок;
- «models»  папка, в которой находятся модели программы;
- «Services»  папка, в которой находится функции контроллеров;
- «views»  папка, содержащая представления;

10
- «j»  папка, содержащая код административной части приложения;
- «App_Browsers»  папка, которая содержит код клиентской части приложения.

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

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


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

11
Рисунок 2.2  Макет главной страницы

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

Рисунок 2.3  Макет окна авторизации

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


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

12
Рисунок 2.4  Макет копании

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


приложения

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


- операционная система Windows 10 Professional;
- среда разработки Visual Studio Code;
- среда разработки Visual Studio 2019;
- язык программирования Ruby;
- библиотеки ReactJS, jQuery, Puma;
- система управления реляционными базами данных PostgresSQL;
- браузер Google Chrome;
- язык разметки HTML;
- язык стилей CSS;
- программа для построения диаграмм Draw.io.
Операционная система – это набор управляющих программ, предназначенных для
управления ресурсами вычислительной системы как единого комплекса, другими словами
операционная система – это набор программного обеспечения, который обеспечивает работу
компьютера. Основными функциями операционной системы являются:
- управление файловой системой (запись, изменение, копирование файлов, контроль
доступа);
- управление выполнением программ (распределение процессорного времени, загрузка
программ с диска в оперативную память, перехват потенциально опасных действий);
- управление памятью (кэширование, распределение, контроль сохранности данных);
- диалог с пользователем (чтение команд с клавиатуры, с мыши, вывод информации на
экран, на принтер).

13
Windows 10 – является наиболее популярной и удобной операционной системой.
Система призвана стать единой для разных устройств, таких как персональные компьютеры,
планшеты, смартфоны, консоли и т.д [9].
HTML (HyperText Markup Language) – язык разметки гипертекста – предназначен для
создания Web-страниц. CSS (Cascading Style Sheets – Каскадные Таблицы Стилей) – условный
язык описания внешнего вида документа. В основном, конечно же, CSS используется
создателями веб-страниц для задания цветов, шрифтов, расположения отдельных блоков и
других аспектов представления внешнего вида этих веб-страниц. Основной целью разработки
CSS являлось разделение описания логической структуры веб-страницы (которое производится
с помощью HTML или других языков разметки) от описания внешнего вида этой веб-страницы
(которое теперь производится с помощью формального языка CSS) [6].
Ruby – это язык программирования, с помощью которого веб-страницам придается
интерактивность. С его помощью создаются приложения, которые включаются в HTML-код
(например, анкеты или формы регистрации, которые заполняются пользователем). Часто Ruby
путают с языком программирования Elixir, однако общего между ними очень мало. К тому же,
некоторые сравнивают Ruby с языками Python, Self, Javascript. Однако это особенный язык,
который существует сам по себе [23].
Данное web-приложение разрабатывается в среде программирования Visual Studio 2019 и
Visual Studio Code 1.45. Они содержат богатый набор различных типов данных и компонентов,
облегчающих создание программного продукта под Windows и MacOS.
Visual Studio – это набор инструментов и средств, предназначенных для разработчиков
программ, с широким набором поддерживаемых языков программирования. Visual Studio
включает в себя редактор исходного кода с поддержкой технологии IntelliSense и
возможностью простейшего рефакторинга кода. Встроенный отладчик может работать как
отладчик уровня исходного кода, так и отладчик машинного уровня. Остальные встраиваемые
инструменты включают в себя редактор форм для упрощения создания графического
интерфейса приложения, веб-редактор, дизайнер классов и дизайнер схемы базы данных. Visual
Studio позволяет создавать и подключать сторонние дополнения (плагины) для расширения
функциональности практически на каждом уровне, включая добавление поддержки
систем контроля версий исходного кода (как, например, Subversion и Visual SourceSafe),
добавление новых наборов инструментов (например, для редактирования и визуального
проектирования кода на предметно-ориентированных языках программирования) или
инструментов для прочих аспектов процесса разработки программного обеспечения [13].
Visual Studio Code – это редактор исходного кода,
разработанный Microsoft для Windows, Linux и macOS [14]. Позиционируется как «лёгкий»
редактор кода для кроссплатформенной разработки веб- и облачных приложений. Включает в
себя отладчик, инструменты для работы с Git, подсветку синтаксиса, IntelliSense и средства
для рефакторинга. Имеет широкие возможности для кастомизации: пользовательские
темы, сочетания клавиш и файлы конфигурации. Распространяется бесплатно, разрабатывается
как программное обеспечение с открытым исходным кодом, но готовые сборки
распространяются под проприетарной лицензией.
Google Chrome – браузер, разрабатываемый компанией Google на основе свободного
браузера Chromium и движка Blink (до апреля 2013 года использовался WebKit). Первая
публичная бета-версия для Windows вышла 2 сентября 2008 года, а первая стабильная – 11
декабря 2008 года. По данным StatCounter, Chrome используют около 300 миллионов интернет-
пользователей, что делает его самым популярным браузером в мире – его рыночная доля на
сентябрь 2018 года составляет 60.6 % [21].
Postgres – кроссплатформенная база данных документов. В то время как традиционные
реляционные базы данных имеют типичный дизайн схемы, основанный на столбцах и таблицах,
Postgres не требует схем. Данные хранятся в гибких документах с помощью языка запросов на
основе JSON (JavaScript Object Notation). Содержание, размер и количество полей в документах
могут отличаться от одного к другому. Это означает, что структура данных будет меняться со
временем [26].
14
Язык запросов SQL – это запросы, которые составляются (программистами) из
последовательности SQL – инструкций. Эти инструкции задают, что надо сделать с входным
набором данных для генерации выходного набора. Все запросы Access строит на основе SQL.
Draw.io – это приложение на диске Google для создания диаграмм [15], которое
позволяет рисовать:
– блок-схемы;
– UML;
– диаграммы сущность-связь;
– сетевые диаграммы;
– модели бизнес-процессов;
– организационные схемы;
– электрические схемы;
– каркасные схемы и модели.

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

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


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

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

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


которой являются сущности и их связи.
Реляционная модель основана на математическом понятии отношения, представлением
которого является таблица. В реляционной модели отношения используются для хранения
информации об объектах, представленных в базе данных. Отношение имеет вид двухмерной
таблицы, в которой строки соответствуют записям, а столбцы – атрибутам. Каждая запись
должна однозначно характеризоваться в таблице. Для этого используют первичные и
вторичные ключи. Достоинством реляционной модели является простота и удобство
физической реализации.
Реляционная модель базы данных подразумевает нормализацию всех таблиц данных.
Нормализация – это формальный метод анализа отношений на основе их первичного ключа и
функциональных зависимостей, существующих между их атрибутами [8].
На рисунке 2.5 представлена структура базы данных. Структура данных и их краткое
описание приводятся в таблицах 2.1 – 2.9.

15
Рисунок 2.5  Структура базы данных

Таблица «User» хранит информацию о пользователях, структура приведена в


таблице 2.1.

Таблица 2.1 – Структура таблицы «User»


Имя поля Тип поля Размер поля, байт Описание поля
Bio Text 20000 –
Cognito_id String 100 Идентификатор
пользователя
Email String 50 Почта
пользователя
First_name String 100 Имя
пользователя
Last_name String 100 Фамилия
пользователя
Job_title String 100 Название работы
Passion Text 20000 Увлечение
пользователя
Phone String 100 Номер
пользователя
Receives_notification Boolean 2 Получать
уведомления
Receives_profile Boolean 2 Получать
notification уведомления в
профиле
Role Integer 4 Роль пользователя
Status Integer 4 Статус
пользователя

16
Таблица «Organization» хранит информацию об организации, структура приведена в
таблице 2.2.

Таблица 2.2 – Структура таблицы «Organization»


Имя поля Тип поля Размер поля, байт Описание поля
Ein String 100 Идентификатор
организации
Name String 100 Название
организации
Phone String 100 Номер телефона
организации
Website String 100 Сайт организации

Таблица «OrganizationApplication» хранит информацию о подачи заявки на регестрацию


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

Таблица 2.3 – Структура таблицы «OrganizationApplication»


Имя поля Тип поля Размер поля, байт Описание поля
Applicant_email String 4 Почта заявителя
Applicant_first_name String 100 Имя заявителя
организации
Applicant_last_name String 100 Фамилия заявителя
организации
Ein Integer 100 Идентификатор
организации
Notes Text 20000 Заметки об
организации
Organization_name String 100 Название
организации
Phone String 100 Телефонный номер
организации
Status Integer 7 Статус компании
Website Integer 100 Сайт организации

17
Таблица «Campaign» хранит информацию о компании, структура приведена в таблице
2.4.

Таблица 2.4 – Структура таблицы «Campaign»


Имя поля Тип поля Размер поля, байт Описание поля
Archive_reason String 100 Причина закрытия
компании
Date_needed_by Date – Дата, до которой
надо закрыть
компанию
Description Text 20000 Описание
компании
Notes Text 20000 Заметки к
компании
Postal_code String 100 Почтовый код
Recipient_name String 100 Имя заявителя
компании
Region String 70 Регион, где
зарагестированна
компания
Short_description Text 20000 Краткое описание
компании
Status Integer 7 Статут в которой
находится компания
Title String 2 Назыание
компании
Total_cost Decimal 4 Стоймость
компании

18
Таблица «Donation» хранит информацию о добавленных деньгах в компанию, структура
приведена в таблице 2.5.

Таблица 2.5 – Структура таблицы «Donation»


Имя поля Тип поля Размер поля, байт Описание поля
Amount Nvarchar 100 Сумма денег,
которые
пользователь хочет
внести в компанию
Anonymous Boolean 2 Сделать вннесение
денег анонимным
или нет
Basket_inclusion Boolean 2 Статус добавления
компании в корзину
First_name String 100 Имя пользователя,
который хочет
внести деньги в
компанию
Last_name String 100 Фамилия
пользователя,
который хочет
внести деньги в
компанию
Email String 100 Электронная почта
пользователя,
который хочет
внести деньги в
компанию
Location String 100 Места, из которых
пользователь может
внести деньги в
компанию
Status Boolean 5 Статус отправки
денег
Transaction_id Boolean 2 Идентификатор
транзакции
Transaction_type Integer 4 Тип транзакции

Таблица «CampaingUpdate» хранит информацию об обнавлении компании, структура


приведена в таблице 2.6.

Таблица 2.6 – Структура таблицы «CampaingUpdate»


Имя поля Тип поля Размер поля, байт Описание поля
Message Text 20000 Сообщение об
обнавлении копании
Notes Text 20000 Заметки об
обнавлении копании
19
Status Integer 7 Статус обновления
компании

Таблица «Comment» хранит информацию о комментариях к компании, структура


приведена в таблице 2.7.

Таблица 2.7 – Структура таблицы «Comment»


Имя поля Тип поля Размер поля, байт Описание поля
Content Text 4 Идентификатор
резюме
Parant_id Integer 4 Идентификатор
резюме
Private Boolean 4 Идентификатор
проекта

Таблица «Notification» хранит информацию о запросе на создание проекта, структура


приведена в таблице 2.8.

Таблица 2.8 – Структура таблицы «Notification»


Имя поля Тип поля Размер поля, байт Описание поля
Message String 100 Сообщение
оповещения
Source_id Integer 2 Идентификатор
оповещения
Source_type String 100 Описание причины
оповещения
Status Integer 2 Статус оповещения
Target_id Integer 10 Идентификатор
оповещения
Target_type String 100 Описание
оповещения

Таблица «Document» хранит информацию о готовом проекте, структура приведена в


таблице 2.9.

Таблица 2.9 – Структура таблицы «ShoppingCartItem»


Имя поля Тип поля Размер поля, байт Описание поля
Amount Decimal 4 Сумма денег в
корзине, которые
хочет внести
пользователь
Buyable_id Integer 100 Идентификатор
пользователя
Buyable_type String – Описание сколько
денег уже есть в
компании
Targetable_id Integer 4 Индефикатор цели
Targetable_type String 100 Описание через
20
сколько будут
внесены все деньги

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

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

В каталоге «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(содержит перевод систем);
- Каталог «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, которые затем появляются на веб-странице. Компоненты
позволяют разделить пользовательский интерфейс на независимые, повторно используемые
части и работать с каждой из частей отдельно.
22
Все компоненты находятся в папке «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;
});
//Ввод средств в форму
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,
23
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);

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,
24
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);

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;
}
25
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>
))}
</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Описание разделов Web-приложения

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


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

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.

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

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


правильность работы приложения. Одной из основных задач тестирования является устранение
ошибок, происходящих при вводе данных.
Функциональное тестирование  это тестирование функций приложения на соответствие
требованиям. Оценка производится в соответствии с ожидаемыми и полученными результатами
(на основании функциональной спецификации), при условии, что функции отрабатывали на
различных значениях [27].
Функциональное тестирование в основном включает тестирование черного ящика и не
касается исходного кода приложения. Это тестирование проверяет пользовательский
интерфейс, API, базу данных, безопасность, связь клиент / сервер и другие функциональные
возможности тестируемого приложения. Тестирование может проводиться либо вручную, либо
с использованием автоматизации.

Тестирование Web-приложения будет производиться последовательно, переходя из


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

29
Рисунок 5.1  Окно авторизации

Таблица 5.1  Тест-кейс функции авторизации


№ Функция Шаги выполнения Результат

Авторизация в 1. Заполнить требуемые поля Ожидаемый результат:


приложении данными: Произойдёт переход на страницу
- "Email Address"  главной административной части;
vicod14593@xhypm.com; Фактический результат:
1
- "Password" – Password@123; Все поля заполнены,
2. Нажать на кнопку «Log in». пердставленно на рисунке 5.1
Результат: успешный переход на
главную страницу, представлен на
рисунке 5.2.

30
Рисунок 5.2  Результат авторизации

Таблица 5.2  Тест-кейс функции аудита новой компании


№ Функция Шаги выполнения Результат

Аудит новой 1. Запустить проложение; Ожидаемый результат:


компании 2. Нажать на главной форме Произойдёт добавление запроса
нажать на вкладку «Audit»; в базу;
3. Нажимаем на кнопку «Audit» и Фактический результат:
проверяем как заполненна форма; Все поля заполнены,
2
4. Добавить или изменить цену на представлено на рисунке 5.3
продукт если есть протребность; Результат: Добавление в базу
5. Добовлем комментарий к данных новой компании и
компании отбражение ее в списке
6. Нажимаем на кнопку «Approve» одобренных компаний,
представлен на рисунке 5.4.

31
Рисунок 5.3  Окно аудита компании

Рисунок 5.4  Результат добавления одобренной компании

Таблица 5.3  Тест-кейс функции экспорта данных в Excel


№ Функция Шаги выполнения Результат

3 Экспорт данных в 1. Запустить приложение; Ожидаемый результат:


Excel 2. На главной форме выбрать Экспорт данных в Excel.
вкладку «Reports»; Фактический результат:
3. Из выпадающего окна выбираем Все поля заполнены,
вкладку «Donors»; представлено на рисунке 5.5.

32
4. Нажать на кнопку «Export Результат:
Report». Экспорт данных в Excel.

Рисунок 5.5  Окно проверки экспорта данных

Рисунок 5.4  Результат экспорта данных в Excel

Таблица 5.4  Тест-кейс функции деакцивации пользователя


№ Функция Шаги выполнения Результат

Деактивация 1. Нажать на пункт панели меню Ожидаемый результат:


пользователя в «Users»; Произойдёт деакцивациия
приложении 2. Выбрать из списка пользователя; пользователя в приложении.
3. На отобразившейся странице Фактический результат:
4
нажать кнопку «Deactivate»; Кнопка нажата, представлено на
4. В отобразившемся диалоговом рисунке 5.5;
окне нажать кнопку «Yes». Результат: деакцивация
пользователя в приложении,
представлено на рисунке 5.6.

33
Рисунок 5.5  Диалоговое окно для деакцивации пользователя

Рисунок 5.6  Результат деакцивации пользователя

34
Таблица 5.5  Тест-кейс функции поиска компании в приложении
№ Функция Шаги выполнения Результат

Поиск компании в 1.Нажать на пункт панели меню Ожидаемый результат:


приложении «Campaings»; Произойдёт отображение
2.На открывшейся странице, нужной компании в списке
представленной на рисунке 5.7, в Фактический результат:
5
поиской строке вводим название Введены нужные данные.
компании; Результат: отображение нужной
3. Нажать на кнопку «Search». компании, представлено на
рисунке 5.8.

Рисунок 5.7  Окно данных о компаниях

Рисунок 5.8  Результат поиска компании

35
Таблица 5.6  Тест-кейс функции приглашения пользователя в приложение
№ Функция Шаги выполнения Результат

Приглавшение 1. Нажать на пункт панели меню Ожидаемый результат:


пользовательй в «Users»; Заполнение всех полей, после
приложение 2. На открывшейся странице, этого произойдёт отпрвка письма
представленной на рисунке 5.9, на электронную почту для входа в
нажимаем кнопку «Invite User»; аккаунт;
3. Заполнить требуемые поля Фактический результат:
6 данными: Заполнение всех полей в форме,
- "First Name"  Aliaksei; представлено на рисунке 5.9.
- "Last Name" – Hrom; Результат: отправка приглашения
- “Email Address”  для входа пользователя в
aliakseihrom@gmail.com; приложение, представлено на
- “Role”  Admin; рисунке 5.10
4. Нажать на кнопку «Send».

Рисунок 5.9  Окно для запроса на приглашение пользователя в приложение

36
Рисунок 5.10  Результат отправки письма для входа в приложение

Таблица 5.7  Тест-кейс функции внесения денег в компанию


№ Функция Шаги выполнения Результат

Внесение денег в 1. На главной странице выбираем Ожидаемый результат:


компанию компанию; Произойдет добавление средств
2. На открывшейся странице, на счет копании.
представленной на рисунке 5.11, Фактический результат:
вносим сумму денег в копанию и Добавление денег в компанию.
7 нажимаем на кнопку «Give»; Результат: отображение
3. На открывшейся странице, внессеных денег в компанию,
представленной на рисунке 5.12, представлено на рисунке 5.13.
заполяем данные карты;
4. Нажать на кнопку «Place My
Donation».

37
Рисунок 5.11  Добавление денег в компанию

Рисунок 5.12  Внесение данных для карточки


38
Рисунок 5.13  Результат успешного внесения денег в компанию

39
6 Применение

6.1 Назначение программы

Web-приложение для компании “Be a Blessing” для организации благотварительных


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

Приложение создано с использованием базы данных Postgres. Оно обладает рядом


достоинств, повышающих его эффективность и полезность.

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

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


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

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

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


вопросы охраны труда
Общество с ограниченной ответственностью «Айтихардгруп» – это группа компаний,
которая специализируется на создании и разработки ПО, и действует в соответствии с
действующим законодательством Республики Беларусь.
Охрана труда в данной фирме обеспечивается системой законодательных актов
Республики Беларусь, социально-экономических, организационных, технических и лечебно-
профилактических мероприятий и средств
Система управления охраной труда – это регламентированная законодательством
совокупность методов и средств управления, направленных на организацию обеспечения
безопасности, сохранения жизни, здоровья и работоспособности человека в процессе труда.
Система управления включает в себя выявление производственных опасностей, оценку рисков
гибели и травмирования работников, разработку и реализацию эффективных мер по их
снижению и устранению, а также осуществляет постоянный мониторинг и измерение
результативности в области охраны труда.
В данной организации имеется перечень следующих обязанностей работодателя для
создания здоровых и безопасных условий труда:
 обеспечивать безопасность при эксплуатации зданий (помещений;
 предоставлять при необходимости места для выполнения работ (оказания услуг);
 принимать меры по предотвращению аварийных ситуаций, сохранению жизни и
здоровья работающих при возникновении таких ситуаций, оказанию потерпевшим при
несчастных случаях на производстве необходимой помощи;
 осуществлять обучение, стажировку, инструктаж и проверку знаний, работающих по
вопросам охраны труда;
 обеспечивать в порядке, установленном законодательством, расследование и учет
несчастных случаев на производстве, профессиональных заболеваний, техническое
расследование причин аварий, инцидентов на опасных производственных объектах, разработку
и реализацию мер по их профилактике и предупреждению;
 не допускать к работе работающего, появившегося на работе в состоянии
алкогольного, наркотического или токсического опьянения, а также в состоянии, связанном с
болезнью, препятствующем выполнению работ.
 В свою очередь работающий обязан:
 соблюдать требования по охране труда, а также правила поведения на территории
организации, в производственных, вспомогательных и бытовых помещениях;
 заботиться о личной безопасности и личном здоровье, а также о безопасности
окружающих в процессе выполнения работ либо во время нахождения на территории
организации;
 обеспечения здоровых и безопасных условий труда, немедленному извещению своего
непосредственного руководителя или иного уполномоченного должностного лица нанимателя о
неисправности оборудования, инструмента, приспособлений, транспортных средств, средств
защиты, об ухудшении состояния своего здоровья;
 немедленно сообщать работодателю о любой ситуации, угрожающей жизни или
здоровью работающих и окружающих, несчастном случае, произошедшем на производстве.

Согласно статьям 13 Закона Республики Беларусь «Об охране труда» и 226 Трудового
кодекса Республики Беларусь работодатель (наниматель) обязан осуществлять (обеспечить)
подготовку (обучение), переподготовку, стажировку, инструктаж, повышение квалификации и

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

42
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 .
Воздействие УФ-С в этом случае не допускается.
При использовании специальной одежды и средств защиты лица и рук, не
пропускающих УФ-излучение (спилк, кожа, ткани с пленочным покрытием и т.п.), допустимая
интенсивность облучения в области УФ-В + УФ-С (200-315 нм) не должна превышать 1 Вт/м2.
Основными способами защиты работников от воздействия ультрафиолетового излучения
являются защита расстоянием, экранирование рабочих мест, специальная краска с водным
составом и т.д.

43
При проведении органами государственной экспертизы условий труда Республики
Беларусь проверок соблюдения законодательства о труде и пенсионном обеспечении по
вопросам предоставления компенсаций работникам за работу с вредными и (или) опасными
условиями труда и анализа документов, предоставляемых нанимателями в электронном виде по
аттестации рабочих местах по условиям труда (далее - аттестация), участились случаи
выявления неправильной оценки условий труда по шуму на рабочих местах работников
организаций республики.
В целях предупреждения неправильной оценки ультрафиолетового излучения и как
следствие необоснованного установления работникам компенсаций по условиям труда,
определения обязанностей нанимателя по профессиональному пенсионному страхованию
работников в соответствии с Законом Республики Беларусь «О профессиональном пенсионном
страховании», Министерство труда и социальной защиты при оценке условий труда по
ультрафиолетовому излучению разъясняет следующее.
В соответствии с пунктом 6 Положения о порядке проведения аттестации рабочих мест
по условиям труда, утвержденного постановлением Совета Министров Республики Беларусь от
22 февраля 2008 г. № 253, оценка фактического состояния условий труда на рабочем месте при
аттестации производится в порядке, определяемом Министерством труда и социальной защиты.
Защита расстоянием — это удаление обслуживающего персонала от источников УФ-
излучения на безопасную величину. Расстояния, на которых уровни УФ-излучения не
представляют опасности для работающих, определяются только экспериментально в каждом
конкретном случае в зависимости от условий работы, состава производственной атмосферы,
вида источника излучения, отражающих свойств конструкций помещения и оборудования и т.д.
В первую очередь следует использовать защитную одежду с длинным рукавом и
капюшоном для предотвращения попадания ультрафиолета на кожу.
Также наиболее рациональным методом защиты является экранирование (укрытие)
источников излучений с помощью различных материалов и светофильтров, не пропускающих
или снижающих интенсивность излучений.
Для защиты работающих от избытка УФ-излучения используют противосолнечные
экраны, жалюзи, оконные стекла со специальным покрытием, стекла «хамелеоны» и др. В
производственных условиях применяются стены, кабины, щитки, ширмы, очки с защитными
стеклами. Полную защиту от УФ-излучения всех волн обеспечивает флинтглас (стекло с
оксидом свинца) толщиной 2 мм. Кабины изготавливаются высотой 1,8-2 м, причем их стенки
не должны доходить до пола на 25-30 см для улучшения проветривания.

7.3 Пожарная безопасность

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


горючие жидкости, пыли, волокна, газы, легковоспламеняющиеся газы, трудно горючие
жидкости и прочие взрывоопасные или пожароопасные вещества. Все материалы находятся в
холодном состоянии. Исходя из этих сведений можно уверенно сказать, что все помещения
подходят под категорию Д по ТКП 474-2013. Так как все помещения подходят под категорию
Д, следовательно, ни одно из помещений не имеет зон по ПУЭ.
Здание, в котором находятся помещения ООО «Айтихардгруп» согласно паспорту, на
это здание, имеет II степень огнестойкости. При более подробной характеристике можно
выделить пределы огнестойкости определённых конструкций.

Таблица 7.1 – Пределы огнестойкости конструкций по СНБ 2.02.01 - 98


Несущие Самонесущие Наружные Перекрытия Настилы Внутренние Марши и
элементы стены ненесущие между стены площадки
здания стены этажные лестниц

44
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, пожарные краны. Огнетушители установлены в легкодоступных и заметных
местах (коридорах, возле входов и выходов из помещений) таким образом, что они не мешают
во время эвакуации. Для размещения первичных средств устанавливаются пожарные посты.
Они располагаются на видных местах и окрашиваются в красный цвет.
Кран пожарный - применяются в комплекте с пожарным стволом и пожарным рукавом
на внутреннем противопожарном водоснабжении. Может использоваться как для тушения
небольшого пожара, так и для серьезного противостояния огню в качестве дополнительного
средства пожаротушения.
По всему зданию, а также отдельно в офисах расположены дренчерные системы
водяного пожаротушения. Они представляют собой напорный трубопровод и оросители, однако
последние не имеют теплового элемента. Сама по себе система не реагирует на пожар, поэтому
«пусковым механизмом» служит система пожарной сигнализации, которая также расположена
по всему зданию, в непосредственной близости от каждого оросителя.
Для безопасной эвакуации людей в случае чрезвычайных ситуаций разработан
эффективный план эвакуации, копии которого, расположены на каждом этаже, на видном
месте. В случае чрезвычайной ситуации эвакуация будет производится через 2 дополнительные
лестницы внутри здания, и одну пожарную лестницу снаружи.
В соответствии с п.6 ст.17 Закона Республики Беларусь от 15.06.1993 N 2403-XII (ред. от
30.11.2010) «О пожарной безопасности» и Положением для проведения профилактических
мероприятий по предупреждению и тушению пожаров в организациях организуются
добровольные пожарные дружины из числа рабочих и специалистов организаций в случае, если
на предприятии работает более 15 человек. На ЧП «Вектор удачи» работают менее 15 человек,
следовательно, пожарной дружины не существует, а обязанности на случай возникновения
пожара распределяются между работниками.
Основные задачи ДПД:
 контроль за соблюдением противопожарного режима;
 проведение разъяснительных работ по соблюдению противопожарного режима на
рабочем месте и правилам осторожного обращения с огнем в быту;
 надзор за исправностью средств пожаротушения и их укомплектованностью;
 вызов пожарной службы в случае возникновения пожара, принятие мер по его
тушению имеющимися средствами пожаротушения.

45
7.4 Охрана окружающей среды

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


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

47
Мусороперерабатывающие заводы — это наиболее перспективный метод
обезвреживания твердых бытовых отходов, причиняющий наименьший ущерб окружающей
среде. Основными продуктами переработки твердых бытовых отходов является компост,
находящий применение в сельском хозяйстве как удобрение, и некомпостируемый остаток
(камни, глиняные черепки, пластмассы, стекло), представляющий собой обезвреженную массу
и составляющий до 30 % от объема исходного мусора.

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

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

Необходимо рассчитать экономическую эффективность разработки web-приложения.


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

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

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

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


Количество Трудоемкость,
Наименование этапов и видов работ Исполнитель
исполнителей человеко-дни
Подготовительный техник-программист 1 1

Выбор методов и средств техник-программист 1 2

Разработка алгоритмов и программ техник-программист 1 24

Отладка программ и анализ результатов техник-программист 1 10


Оформление документации и подготовка
техник-программист 1 3
к сдаче разработки

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

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


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

49
Расчет осуществляется по формуле (8.1).
n
Р м=К Тр ∑ ( Н pi Ц i−O di Ц 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 кВт/ч. Исходя из вышеизложенного
получаем, что на электроэнергию было затрачено:
Рэ = 143 × 0,38994 = 55,76
Определяется основная заработная плата научно-технического персонала,
непосредственно занятого выполнением работ.
К этой статье относятся основная заработная плата работников, а также премии,
входящие в фонд заработной платы. Среднее количество рабочих дней в месяце равно 21, а
средняя продолжительность рабочего дня составляет восемь часов. Следовательно, часовая
заработная плата определяется делением размера оклада на количество рабочих часов в месяце
(то есть на 168 часов).
50
Тарифная ставка первого разряда на предприятии составляет 92 руб. Трудоемкость
определяется исходя из данных, представленных в таблице 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 88,40
результатов
Оформление техник-
документации и программист
подготовка к сдаче
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
Также рассчитываются отчисления на страхование от несчастных случаев на
производстве и профессиональных заболеваний (Остр) по ставке действующего
законодательства (Нбгс принимается равным от 0,3 до 0,9%). Для расчетов среднее значение Н бгс
принимается равным 0,6%. Остр рассчитывается по формуле (8.5).

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

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


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

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

Ц отп =С п + П . (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

52
Электроэнергия Рэ 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”.
В технико-экономическом обосновании были рассмотрены следующие вопросы:
 составление плана по разработке программы;
 расчет стоимости разработки.
В первой части технико-экономического обоснования был рассчитан срок разработки по
созданию программного средства. Он составил 320 часов.
Во второй части технико-экономического обоснования была рассчитана стоимость
разработки программного продукта, которая составила 1241,93 рублей.
Основное преимущество разработки программного средства в том, что сейчас
количество благотворительных фондов активно продолжает расти. И главной проблемой для
благотворительного фонда становится осведомленность благотворителей о нем. Эту проблему
может решить единая платформа, основной идеей которой выступит возможность множества
благотворительных фондов принимать на ее счет денежные средства.
Исходя из всего изложенного выше, можно сделать следующие выводы: срок разработки
проекта составит 320 часов. Путем несложных расчетов получена его стоимость - 1241,93
рубль. Большую часть расходов составит заработная плата сотрудникам. Основным же
преимуществом нашего проекта станет гибкость платформы, наличие множества возможностей
и для тех, кто на ней будет представлен, и тех, кто будет перечислять средства на нее. В том
числе работники фондов, представленных на платформе, смогут проверять пополняемость, в то
время как пользователи, жертвующие деньги, смогут потребовать отчет реализации/траты
перечисляемых средств.

53
Заключение

В рамках дипломного проекта на тему «Разработка вэб-приложения компании «Be a


Blessing» для организации благотворительных акций с целью сбора средств нуждающимся в
социально-финансовой поддержке» было разработано программное средство,
автоматизирующее работу аудита компании и внесения денежных средств в компанию.
Для достижения цели были решены следующие задачи:
– осуществлена возможность создания акций;
– реализован просмотр акций и компаний других пользователей Web-приложения;
– организована вкладка Audit, где можно проверить компании;
– под каждой публикацией можно писать комментарии;
– можно вносить акции денежные средства;
– реализовано хранение информации на сервере;
– обеспечено хранение необходимой информации в базе данных;
– разработаны необходимые программные модули компонентов сайта для организации
поиска информации;
– приложение корректно отображается на различных браузерах.
В дипломном проекте были также рассмотрены вопросы охраны труда и окружающей
среды, такие как основные правовые, разработка инженерно-технических решений по
снижению шума в рабочей зоне вычислительных центров, вопросы пожарной безопасности,
охраны окружающей среды.
В экономическом разделе были произведены расчеты экономического эффекта
программного средства, расчеты заработной платы исполнителей, была проведена оценка
сложности и трудоемкости разработки программного средства, были проведены расчеты
всевозможных отчислений и расходов, был рассчитан срок разработки по созданию
программного средства, который составил 320 часов, а также была рассчитана стоимость
разработки программного продукта, которая составила 1241,93 рублей.
Разработка имеет интуитивно понятный графический интерфейс, позволяющий даже с
минимальными знаниями компьютера пользоваться приложением.
Web-приложение реализовано в полном объеме и в соответствии с заданными
требованиями, полностью отлажено и протестировано. Поставленные задачи выполнены.

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

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


учащихся по специальности 2-40 0101 «Программное обеспечение технологий»/
Т.Г.Багласова.– Минск: КБП, 2020

2 Елецкий Т.В Экономика предприятия: учебное пособие / Елецкий Т.В – Под ред. Э.В.
Крум, – Мн.: Выш.шк., 2005

3 Экономика предприятия. Практикум / М.:Юрайт ; под ред. Степанова С.A – Минск :


М.:Юрайт, 2017. – 390 с

4 Общие требования к тестовым документам: ГОСТ 2.105-95. – Введ. 01.01.1996. –


Минск: Межгос. совет по стандартизации, метрологии и сертификации, 1995.

5 Описание и текст программы. Требования к содержанию, оформлению и контролю


качества: ГОСТ 19.402-2000. – Введ. 01.09.2001. – Минск: Межгос. совет по стандартизации,
метрологии и сертификации, 2000.

6 HTML [Электронный ресурс]  Режим доступа: https://ru.wikipedia.org/wiki/HTML 


Дата доступа: 20.04.2021

7 Диаграмма деятельности [Электронный ресурс] – Режим доступа: http://it-


gost.ru/articles/view_articles/96  Дата доступа: 22.04.2021

8 Hормализация таблиц [Электронный ресурс]  StudFiles  Режим доступа:


https://studfile.net/preview/7003805/page:17/  Дата доступа: 12.04.2021

9 Windows 10 [Электронный ресурс]  Microsoft  Режим доступа:


https://www.microsoft.com/ru-ru/software-download/windows10  Дата доступа: 20.04.2021

10 Диаграмма развертывания [Электронный ресурс]  Режим доступа:


https://flexberry.github.io/ru/fd_deployment-diagram.html  Дата доступа: 16.04.2021

11 Model-View-Controller [Электронный ресурс]  Режим доступа:


https://ru.hexlet.io/blog/posts/chto-takoe-mvc-rasskazyvaem-prostymi-slovami  Дата доступа:
12.04.2021

12 Visual Studio [Электронный ресурс]  Microsoft 2020  Режим доступа:


https://visualstudio.microsoft.com/ru/downloads/  Дата доступа: 10.04.2021

13 Visual Studio Code [Электронный ресурс]  Wikipedia 2020  Режим доступа:


https://ru.wikipedia.org/wiki/Visual_Studio_Code  Дата доступа: 22.04.2021

14 Draw.IO [Электронный ресурс]  Режим доступа: https://app.diagrams.net/  Дата


доступа: 12.03.2021

15 Авторизация [Электронный ресурс]  Diphost 2019  Режим доступа:


https://wiki.diphost.ru/Authentication/  Дата доступа: 20.04.2021

16 Регистрация [Электронный ресурс]  Wikipedia 2020  Режим доступа:


https://ru.wikipedia.org/wiki/Регистрация  Дата доступа: 22.04.2021

55
17 Микроклимат производственных помещений [Электронный ресурс] – Режим доступа:
http://protrud.com/обучение/учебный-курс/микроклимат-производственных-помещений/ – Дата
доступа: 16.03.2021

18 Заказчик [Электронный ресурс] – Wikipedia 2020 – Режим доступа:


https://ru.wikipedia.org/wiki/Заказчик  Дата доступа: 22.04.2021

19 Менеджер проекта [Электронный ресурс] – Skillbox 2020 – Режим доступа:


https://skillbox.ru/media/management/gayd_po_professii_menedzher_proektov/ – Дата доступа:
03.03.2021

20 Google Chrome [Электронный ресурс] – Google 2021 – Режим доступа:


https://www.google.com/intl/ru/chrome/ – Дата доступа: 12.04.2021

21 Программный проект [Электронный ресурс] – Academic 2019 – Режим доступа:


https://dic.academic.ru/dic.nsf/ruwiki/.  Дата доступа: 20.04.2021

22 Ruby [Электронный ресурс] – Ruby 2021 – Режим доступа: https://ruby-lang.com  Дата


доступа: 14.04.2021

23 Резюме [Электронный ресурс]  Wikipedia 2020  Режим доступа:


https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B7%D1%8E%D0%BC%D0%B5/  Дата
доступа: 12.03.2021

24 Диаграмма вариантов использования (use case) [Электронный ресурс]  fkn+antitotal 


Режим доступа: http://fkn.ktu10.com/?q=node/2236  Дата доступа: 12.04.2021

25 Руководство по PostgreSQL [Электронный ресурс] – Metanit 2021 – Режим доступа:


https://metanit.com/nosql/postgressql/ Дата доступа: 10.04.2021

26 Особенности тестирования веб-приложений [Электронный ресурс]  Режим доступа:


https://quality-lab.ru/blog/key-principles-of-web-testing/  Дата доступа: 20.04.2021

56
Приложение А
(обязательное)
Текст модулей приложения
# 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) // Избавление от N+1
.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
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

def transform_sort(key)
send("sort_#{key}")
rescue NoMethodError // Обработчик ошибки
key

57
end

def sort_goal_amount //метод чтобы доставать из бд компании где макс стоймость


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

def sort_amount_raised //метод для выводв компаний где сумма внесенных денег
больше 0
<<-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(
User
.includes(:organization)
58
.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

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 //модуль для создания экспорта из базы
class ReportsController < AdminController
before_action :set_donations
59
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

60
def single_toogle
authorize(Notification, :single?)

@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//Связь с моделью сессий через  AWS
has_one :default_shipping_address,
-> { where(type: 'shipping') },
class_name: 'Address',
as: :addressable,
inverse_of: :addressable,
dependent: :destroy

has_one_attached :photo
61
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)
}

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
62
def deactivate! // Функция проверки что пользователь деактевирован
User.transaction do
inactive!

cognito.admin_disable_user(
user_pool_id: ENV.fetch('AWS_COGNITO_POOL_ID'),
username: cognito_id
)
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
63
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

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?

64
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('_', ' ') },
{ 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

65
# 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
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


66
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
}

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
67
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|
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

68
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

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
69
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?
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
70
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

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?
71
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: {
description: 'Tracking number', placeholder: '774906988706', requirement: '*'
},
order_number: { description: 'Order Number', placeholder: '24567834', requirement: '*' }
}.freeze. //добавеление статических данных в формы

72
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
((array_of_delevery_etas.max - Time.zone.now) / 60 / 60 / 24).to_i
end
73
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//метод создания для реферального партнера


74
if @campaign.update(permitted_attributes(@campaign))
flash[:success] = 'The campaign has been updated.'
else
flash.now[:danger] = @campaign.errors.full_messages.to_sentence
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
75
skip_before_action :throw_acknowledge_terms_confirmation
skip_before_action :authenticate_request

def create //метод для создания запроса на обработку платежа


response = validate_ipn_notification(request.raw_post)

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.'
76
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
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

77
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

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
78
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|
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.'
79
flash[:danger] = message

redirect_to campaigns_path
end

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

80