Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
ДОПУЩЕН К ЗАЩИТЕ
Заместитель директора
по учебной работе
______________ И.В.Малафей
«___»________________ 2021
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
ДП Т.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» для у
организации благотворительных
Т. Контр. Багласова Т.Г.
акций с целью сбора средств
Н. Контр. Багласова Е.В. нуждающимся в социально-
Утверд. Багласова Т.Г. финансовой поддержке
Введение
4
1 Объектно-ориентированный анализ и проектирование приложения
5
Разрабатываемое Web-приложение имеет название «Be A Blessing», что в свою очередь
переводится на русский язык, как «Будь Благословлён». Такое название обусловлено тем, что
приложение в первую очередь предназначено для внесения денег в благотворительную
компанию, для людей которое находятся в сложной социально-финансовой ситуации.
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-приложения
Логическая структура web-приложения отображает то, как именно связаны между собой
страницы одного сайта. При разработке приложения для управления коллекциями
максимальная связь страниц достигнута при помощи постоянного отображения навигационной
панели сайта, благодаря этому навигация по сайту не вызывает никаких затруднений.
Структура Web-приложения представлена в графической части на листе 4.
Разделы и страницы представляются в виде файлов и каталогов. Необходимо продумать
их структуру, способы именования и полное дерево каталогов. Это важный момент, поскольку
определяет способы связи между страницами. В приложении используется Model-view-
controller -концепция.
9
Model-view-controller (MVC) схема использования нескольких шаблонов
проектирования, с помощью которых модель данных приложения, пользовательский интерфейс
и взаимодействие с пользователем разделены на три отдельных компонента таким образом,
чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные.
Данная схема проектирования часто используется для построения архитектурного каркаса,
когда переходят от теории к реализации в конкретной предметной области [12].
Концепция MVC позволяет разделить данные, представление и обработку действий
пользователя на три отдельных компонента:
модель предоставляет знания: данные и методы работы с этими данными, реагирует
на запросы, изменяя своё состояние. Не содержит информации, как эти знания можно
визуализировать.
представление, вид отвечает за отображение информации (визуализацию). Часто в
качестве представления выступает форма (окно) с графическими элементами.
контроллер. Обеспечивает связь между пользователем и системой: контролирует ввод
данных пользователем и использует модель и представление для реализации необходимой
реакции.
Помимо изолирования видов от логики приложения, концепция MVC существенно
уменьшает сложность больших приложений. Код получается гораздо более
структурированным, и, тем самым, облегчается поддержка, тестирование и повторное
использование решений.
Дерево каталогов и файлов Web-приложения представлено на рисунке 2.1.
10
- «j» папка, содержащая код административной части приложения;
- «App_Browsers» папка, которая содержит код клиентской части приложения.
11
Рисунок 2.2 Макет главной страницы
Окно входа будет представлять собой форму валидации для заполнения данных, где
данными являются «e-mail», пароль, также, по желанию можно восстановить пароль, если его
забыл пользователь. Макет окна регистрации представлен на рисунке 2.3.
12
Рисунок 2.4 Макет копании
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;
– диаграммы сущность-связь;
– сетевые диаграммы;
– модели бизнес-процессов;
– организационные схемы;
– электрические схемы;
– каркасные схемы и модели.
15
Рисунок 2.5 Структура базы данных
16
Таблица «Organization» хранит информацию об организации, структура приведена в
таблице 2.2.
17
Таблица «Campaign» хранит информацию о компании, структура приведена в таблице
2.4.
18
Таблица «Donation» хранит информацию о добавленных деньгах в компанию, структура
приведена в таблице 2.5.
21
3 Реализация Web-приложения
jQuery('#card-token-field').val(token.id);
const details = {
shopping_cart: {
payment_info: jQuery('#new_shopping_cart :input').serialize(),
campaigns_donations: [],
},
};
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», код которого представлен ниже,
отвечает за отображение профиля пользователя и действий над профилем.
useEffect(() => {
if (categories === undefined) {
return;
}
//Наследованная стрелочная функция от category
const category =>
categories.find(
({ id }) => campaignItemCategoriesIds.indexOf(id) !== -1
) || categories[0];
setSelectedId(category.id);
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);
26
4 Описание Web-приложения
27
появляется уведомление об ошибке. Главная страница отображает компании всех
пользователей, зарегистрированных в системе и когда-либо создаваемых компании.
28
5 Методика испытаний
29
Рисунок 5.1 Окно авторизации
30
Рисунок 5.2 Результат авторизации
31
Рисунок 5.3 Окно аудита компании
32
4. Нажать на кнопку «Export Результат:
Report». Экспорт данных в Excel.
33
Рисунок 5.5 Диалоговое окно для деакцивации пользователя
34
Таблица 5.5 Тест-кейс функции поиска компании в приложении
№ Функция Шаги выполнения Результат
35
Таблица 5.6 Тест-кейс функции приглашения пользователя в приложение
№ Функция Шаги выполнения Результат
36
Рисунок 5.10 Результат отправки письма для входа в приложение
37
Рисунок 5.11 Добавление денег в компанию
39
6 Применение
40
7 Охрана труда и окружающей среды на предприятии
Согласно статьям 13 Закона Республики Беларусь «Об охране труда» и 226 Трудового
кодекса Республики Беларусь работодатель (наниматель) обязан осуществлять (обеспечить)
подготовку (обучение), переподготовку, стажировку, инструктаж, повышение квалификации и
41
проверку знаний, работающих (работников) по вопросам охраны труда в порядке,
установленном Правительством Республики Беларусь или уполномоченным им органом.
Обучение, инструктаж и проверка знаний, работающих по вопросам охраны труда
являются важными элементами системы мер по предупреждению аварий и травматизма на
производстве, обеспечению права граждан на здоровые и безопасные условия труда и носят
непрерывный многоуровневый характер.
Обучение и проверка знаний по вопросам охраны труда работающих проводятся самим
индивидуальным предпринимателем, инструкцией о порядке подготовки (обучения),
переподготовки, стажировки, инструктажа, повышения квалификации и проверки знаний,
работающих по вопросам охраны труда, утвержденной Постановлением Министерства труда и
социальной защиты Республики Беларусь от 28.11.2008 г. № 175 и разработанными в
соответствии с ними отраслевыми документами.
В соответствии с указанными документами ответственность за организацию
своевременного и качественного обучения и проверки знаний, работающих в целом по
предприятию, учреждению возлагается на директора.
На предприятии составляется и утверждается Перечень должностей руководителей и
специалистов, проходящих периодическую проверку знаний по вопросам охраны труда.
Специалисты и руководители предприятия не позднее одного месяца со дня вступления в
должность, а также периодически не реже одного раза в три года проходят проверку знаний по
охране труда в соответствующих комиссиях.
Виды инструктажей:
вводный инструктаж;
первичный инструктаж;
повторные инструктаж;
целевой инструктаж;
внеплановый инструктаж.
Порядок расследования несчастных случаев на производстве определен Правилами
расследования несчастных случаев на производстве и профессиональных заболеваний,
утвержденными постановлением Совета Министров Республики Беларусь от 15 января
2004 г. № 30.
Цели расследования несчастных случаев:
установить причины, вызвавшие несчастный случай;
наметить мероприятия, направленные на предотвращение подобных несчастных
случаев;
подготовка документов, для компенсации вреда потерпевшим;
привлечение ответственных лиц к нарушению
Основными видом контроля в ИП являются: контроль за соблюдением
законодательства об охране труда, осуществляемый руководителем.
контроль за соблюдением законодательства по охране труда, осуществляется
руководителем и специалистами организации в соответствии с них должностными
обязанностями;
контроль по охране труда, осуществляемый службой охраны труда:
это контроль за соблюдением требований безопасности на производственном объекте,
осуществляемый инспектирующей их организацией;
периодический контроль за соблюдением законодательства об охране труда,
осуществляемый руководителями структурных подразделений организаций с участием
общественных инспекторов профсоюза по охране труда (уполномоченных лиц по охране труда
работников)
общественный контроль за соблюдением законодательства об охране труда,
осуществляемый профсоюзом.
42
7.2 Разработка инженерно-технических решений по снижению шума в
рабочей зоне помещений с ЭВМ
43
При проведении органами государственной экспертизы условий труда Республики
Беларусь проверок соблюдения законодательства о труде и пенсионном обеспечении по
вопросам предоставления компенсаций работникам за работу с вредными и (или) опасными
условиями труда и анализа документов, предоставляемых нанимателями в электронном виде по
аттестации рабочих местах по условиям труда (далее - аттестация), участились случаи
выявления неправильной оценки условий труда по шуму на рабочих местах работников
организаций республики.
В целях предупреждения неправильной оценки ультрафиолетового излучения и как
следствие необоснованного установления работникам компенсаций по условиям труда,
определения обязанностей нанимателя по профессиональному пенсионному страхованию
работников в соответствии с Законом Республики Беларусь «О профессиональном пенсионном
страховании», Министерство труда и социальной защиты при оценке условий труда по
ультрафиолетовому излучению разъясняет следующее.
В соответствии с пунктом 6 Положения о порядке проведения аттестации рабочих мест
по условиям труда, утвержденного постановлением Совета Министров Республики Беларусь от
22 февраля 2008 г. № 253, оценка фактического состояния условий труда на рабочем месте при
аттестации производится в порядке, определяемом Министерством труда и социальной защиты.
Защита расстоянием — это удаление обслуживающего персонала от источников УФ-
излучения на безопасную величину. Расстояния, на которых уровни УФ-излучения не
представляют опасности для работающих, определяются только экспериментально в каждом
конкретном случае в зависимости от условий работы, состава производственной атмосферы,
вида источника излучения, отражающих свойств конструкций помещения и оборудования и т.д.
В первую очередь следует использовать защитную одежду с длинным рукавом и
капюшоном для предотвращения попадания ультрафиолета на кожу.
Также наиболее рациональным методом защиты является экранирование (укрытие)
источников излучений с помощью различных материалов и светофильтров, не пропускающих
или снижающих интенсивность излучений.
Для защиты работающих от избытка УФ-излучения используют противосолнечные
экраны, жалюзи, оконные стекла со специальным покрытием, стекла «хамелеоны» и др. В
производственных условиях применяются стены, кабины, щитки, ширмы, очки с защитными
стеклами. Полную защиту от УФ-излучения всех волн обеспечивает флинтглас (стекло с
оксидом свинца) толщиной 2 мм. Кабины изготавливаются высотой 1,8-2 м, причем их стенки
не должны доходить до пола на 25-30 см для улучшения проветривания.
44
R120-K0 RE 75-K0 E 30-K0 REI 60-K0 RE 30-K0 REI 120-K0 R 60-K0
45
7.4 Охрана окружающей среды
47
Мусороперерабатывающие заводы — это наиболее перспективный метод
обезвреживания твердых бытовых отходов, причиняющий наименьший ущерб окружающей
среде. Основными продуктами переработки твердых бытовых отходов является компост,
находящий применение в сельском хозяйстве как удобрение, и некомпостируемый остаток
(камни, глиняные черепки, пластмассы, стекло), представляющий собой обезвреженную массу
и составляющий до 30 % от объема исходного мусора.
48
8 Экономический раздел
49
Расчет осуществляется по формуле (8.1).
n
Р м=К Тр ∑ ( Н pi Ц i−O di Ц di ), (8.1)
i=1
Рэ=K э ×T р (8.2)
Н дз
Рдз=Р оз , (8.3)
100
Н ос
Рос =(Р оз + Рдз ) , (8.4)
100
Н бгс
О стр =(Роз + Рдз ) . (8.5)
100
51
платежи, компенсация за износ (амортизацию) использованного в процессе создания научно-
технической продукции оборудования по договоренности. Рпр рассчитывается по формуле (8.6).
Н пр
Рпр=Р оз , (8.6)
100
Н кос
Ркос =Роз , (8.7)
100
Ур
П=С п , (8.9)
100
Ц отп =С п + П . (8.10)
Н НДС
НДС =Ц отп , (8.11)
100
52
Электроэнергия Рэ 55,76
Основная заработная плата научно-производственного
персонала
Роз 380,16
Дополнительная заработная плата научно-производственного
персонала
Рдз 38,02
53
Заключение
54
Список информационных источников
2 Елецкий Т.В Экономика предприятия: учебное пособие / Елецкий Т.В – Под ред. Э.В.
Крум, – Мн.: Выш.шк., 2005
55
17 Микроклимат производственных помещений [Электронный ресурс] – Режим доступа:
http://protrud.com/обучение/учебный-курс/микроклимат-производственных-помещений/ – Дата
доступа: 16.03.2021
56
Приложение А
(обязательное)
Текст модулей приложения
# frozen_string_literal: true
module Admin
class CampaignsController < AdminController
def index
authorize(Campaign)
@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 // Запрос для сортировки где статус в процессе обработки
private
def order_params
sort_params.to_h.transform_keys { |k| Arel.sql(transform_sort(k)) }
end
def transform_sort(key)
send("sort_#{key}")
rescue NoMethodError // Обработчик ошибки
key
57
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
@users = policy_scope(
User
.includes(:organization)
58
.left_outer_joins(:organization)
.where(filter_params)
.order(order_params)
).page(params[:page])
end
private
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
private
def permitted_params
@permitted_params ||= params.permit(:format, :search, :page, :status, sort: {})
end
end
end
end
# frozen_string_literal: true
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 //подсчет всех
уведомлений
private
def set_notification
@notification = Notification.find(params[:id])
end
# frozen_string_literal: true
attr_accessor :password
phony_normalize :phone
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)
}
after_save :clean_password
before_validation :assign_email_from_cognito, on: :create, if: -> { email.blank? } //проверка
валидации
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_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 clean_password
63
self.password = nil
end
AWS_USER_ROLES = {
'admin' => 'administrative user'
}.freeze
include ActiveModel::Model
include ActiveModel::Validations
validate :validate_role
errors.add(:email, e.message)
false
end
64
return unless inviter.organization_admin? && !%w[organization_admin
referring_partner].include?(role)
private
cognito.admin_create_user(options)
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
include CampaignStateMachine
include Campaigns::ItemsHelper
attr_accessor :processing_admin
has_rich_text :internal_notes
has_one_attached :photo
where(status: status)
}
enum status: {
pending: 0,
resubmitted: 1,
rejected: 2,
active: 3,
unfunded: 4,
funded: 5,
shipped: 6,
fulfilled: 7,
archived: 8
} //статусы которые могут быть у компании
before_create :determine_region
def self.statuses_count
pluck(:status).each_with_object(Hash.new(0)) do |status, total|
total[status] += 1
end
end
def name
title
end
def latest_pending_update
67
campaign_updates.latest_pending
end
def kit_baskets
{
hygiene_kits: hygiene_kits,
school_supply_kits: school_supply_kits,
household_supply_kits: household_supply_kits
}
end
def amount_raised
@amount_raised ||= donations.select { |d| d.status = 'successful' }.inject(0) { |sum, d| sum +
d.amount }
end
def recalcuate_campaign_total_cost
self.total_cost = campaign_items.map(&:total_cost).sum
end
end
# frozen_string_literal: true
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
organization_admin_owns
end
def show?
return true if user&.admin?
organization_admin_owns
end
organization_admin_owns
end
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
def permitted_attributes
return %i[referrer] + base_attributes if user.organization_admin?
return base_attributes unless user.admin? || user.fulfillment_specialist?
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
false
end
def update?
edit?
end
def purchase_information?
ship?
end
def unpublish?
return unless record && user
def allocate_funds?
user&.admin? && record&.active?
71
end
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 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_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_contingency_fee
@total_contingency_fee ||= campaign_items.map(&:contingency_fee).sum
end
# rubocop:enable Rails/HelperInstanceVariable
private
def fulfillment_specialist_fulfillment_back_link(campaign)
edit_fulfillment_specialist_audit_campaign_path(campaign)
end
def referring_partner_fulfillment_back_link(campaign)
referring_partner_campaign_path(campaign)
end
# frozen_string_literal: true
module FulfillmentSpecialist
class CampaignsController < FulfillmentSpecialistController
before_action :set_campaign, except: :index
redirect_to fulfillment_specialist_campaign_path(@campaign)
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
errors = ::Paypal::DonationsBuilder.build(params.permit(*attributes_for_permition))
protected
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 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
# 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
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)
def require_no_current_user
return unless current_user
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
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
78
end
end
# frozen_string_literal: true
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])
def remove_donations
ShoppingCartItem.where(buyable_type: 'Donation',
targetable_type: 'Campaign', targetable_id: @campaign.id).destroy_all
redirect_to campaigns_path
end
def set_item
@item = ShoppingCartItem.find(params[:shopping_cart_item_id])
end
end
80