Please use this identifier to cite or link to this item: https://er.chdtu.edu.ua/handle/ChSTU/8972
Title: Автоматизована система роботи інтернет-магазину дрібнооптової торгівлі промисловими товарами
Authors: Чичужко, Марина Володимирівна
Коріненко, Назарій Володимирович
Issue Date: Jun-2022
Abstract: В даній кваліфікаційній роботі бакалавра було розроблено інтернет-магазин для дрібнооптової торгівлі товарами промислової групи. В рамках виконання роботи було проведено наступні види робіт: – знайдено та проаналізовано існуючі програми, які реалізують подібну функціональність; – досліджено предметну область, а саме, які є дані у компанії, що користуватиметься даним продуктом, які вимоги висуває компанія до інтернет-торгівлі; – проаналізовано діючі засоби розробки, а саме мова програмування Ruby, веб-фреймворк Rails, бібліотеки RubyOnRails для реалізації різноманітних необхідних для роботи будь-якого інтернет-магазину функцій; – спроектовано базу даних, яку стосується інформації, необхідної для діяльності інтернет-магазину; – розроблено веб-додаток, який створено з клієнтської та адміністративної частини і реалізує всі функції, наведені у завданні на виконання даної роботи.
URI: https://er.chdtu.edu.ua/handle/ChSTU/8972
Appears in Collections:174 Автоматизація, комп'ютерно-інтегровані технології та робототехніка (Автоматизація та комп'ютерно-інтегровані системи та компоненти)

Files in This Item:
File Description SizeFormat 
Б_174_2022_Коріненко.pdf
  Restricted Access
1.4 MBAdobe PDFView/Open Request a copy


Items in DSpace are protected by copyright, with all rights reserved, unless otherwise indicated.

Extracted text
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ 
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОІЧНИЙ УНІВЕРСИТЕТ 
 
Факультет інформаційних технологій і систем 
 
Кафедра робототехніки та спеціалізованих комп’ютерних систем 
         
 
 
 
Пояснювальна записка 
до кваліфікаційної роботи 
освітнього ступеня «бакалавр» 
 
  
на тему: 
АВТОМАТИЗОВАНА СИСТЕМА РОБОТИ ІНТЕРНЕТ-МАГАЗИНУ 
ДРІБНООПТОВОЇ ТОРГІВЛІ ПРОМИСЛОВИМИ ТОВАРАМИ 
 
 
 
Виконав:студент __4__курсу, групи АКІТС-2099 
 
Спеціальність  
151 «Автоматизація та комп'ютерно-інтегровані 
технології» 
(шифр і назва напряму підготовки) 
 
Студент_________Коріненко Н.В.______________ 
                                                       ( прізвище та ініціали)    
 
Керівник _________Чичужко М.В.______________ 
                                                       ( прізвище та ініціали)  
  
Рецензент _________Пономар Л.Л.__________ 
                                                             (прізвище та ініціали) 
 
 
 
 
 
 
 
 
Черкаси 2022 року 
 
 
ЗМІСТ 
СПИСОК СКОРОЧЕНЬ ТА УМОВНИХ ПОЗНАЧЕНЬ ................................. 5 
Вступ...................................................................................................................... 6 
1 ПОСТАНОВКА ЗАДАЧІ ................................................................................. 8 
1.1 Опис існуючих програм для інтернет-магазинів .................................... 8 
1.2 Опис предметної області ......................................................................... 12 
1.3 Постановка завдання ................................................................................ 13 
2 ОПИС ТЕХНОЛОГІЙ ТА ЗАСОБІВ РОЗРОБКИ ....................................... 16 
2.1 Мова програмування Ruby ...................................................................... 16 
2.1.1 Особливості мови програмування Ruby ......................................... 16 
2.1.2 Бібліотеки Ruby ................................................................................. 19 
2.2 Фреймворк Rails ....................................................................................... 20 
2.3 Ajax ............................................................................................................ 29 
3 ОПИС РОЗРОБКИ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ ........................... 31 
3.1 Структура бази даних .............................................................................. 31 
3.2 Використання gem бібліотек в додатку ................................................. 34 
3.3 Структура програми ................................................................................. 36 
ВИСНОВКИ ........................................................................................................ 41 
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ .......................................................... 42 
ДОДАТОК А ....................................................................................................... 45 
ДОДАТОК Б ....................................................................................................... 46 
ДОДАТОК В ....................................................................................................... 67 
ДОДАТОК Г ....................................................................................................... 74 
ЧДТУ.222079.001 ПЗ 
Змн. Лист № докум. Підпис Дата 
 Розроб. Коріненко Автоматизована система роботи Літ. Лист Листів 
 Перевір. Чичужко інтернет-магазину дрібнооптової У 2 74 
 Реценз.  
 торгівлі промисловими товарами 
 Н. Контр.  Пояснювальна записка ЧДТУ, АКІТС-2099 
 Затверд. Лукашенко 
 
СПИСОК СКОРОЧЕНЬ ТА УМОВНИХ ПОЗНАЧЕНЬ 
AJAX  Asynchronous JavaScript and XML 
DOM  Document Object Model 
HTTP  HyperText Transfer Protocol 
JRE – Java Runtime Environment 
UI  User Interface 
URL  Uniform Resource Locator 
ПЗ – Програмне забезпечення 
ОС – Операційна система 
   
   
 Лист 
ЧДТУ. 222079.001 ПЗ 
5 
Змн. Лист № докум. Підпис Дата 
 
ВСТУП 
В теперішній час інтернет-магазини повністю увійшли як в середовище 
діяльності бізнесу, так і в кожноденний побут людей. Просування інтернет-
магазинів охопило повністю телебачення і пресу. Мало хто з наших громадян не 
чув про "Розетку". Інтернет-магазини працюють для продажу всіх типів товарів, 
як звичайної електроніки або побутової техніки, так і для таких непростих для 
продажу через мережу інтернет речей, як одяг чи взуття. Вони охоплюють все 
більше покупців, створюючи значно серйознішу конкуренцію звичайним 
торговельним мережам, витісняючи частину з них з ринку роздрібних продажів. 
Типова робота  покупця в інтернет-магазині полягає в тому, що він може 
проводити перегляд товару, включно з зовнішніми зображеннями, читати 
короткий чи повний опис технічних характеристик, додавати до "кошика" 
потрібний об’єм товару і здійснювати купівлю обраного товару, оплачувати або 
банківською карткою через мережу інтернет (популярно на Заході), або при 
доставці товару (популярно в Україні).  
На ринку присутня величезна кількість реалізованих програмних 
продуктів, які дають можливість організувати стандартний інтернет-магазин. 
Вони включають в себе функції з оформлення роботи стандартних функцій. Крім 
того, вони включають адміністративну частину, яка дає можливість реалізувати 
оперативного керування магазином, додавати нові товари, обробляти замовлення 
тощо. Але існуючі продукти буває важко адаптувати до специфіки конкретного 
магазину, особливо, коли цей магазин суттєво відрізняється від стандарту. В 
такому випадку (а це буває нерідко) необхідно використовувати роботу 
програміста для того, щоб вдосконалити або навіть створити з початку продукт, 
який реалізував би всі вимоги користувача. 
Дана задача може бути простою і складною одночасно. Простою з того 
боку, що зрозумілими є багато речей відносно того, що і яким чином робити. Але 
завжди існують нюанси, для вирішення яких програмісту необхідно достатньо 
попрацювати, щоб користувач відчував себе по-справжньому задоволеним після 
покупки. 
 Лист 
ЧДТУ. 222079.001 ПЗ 
6 
Змн. Лист № докум. Підпис Дата 
 
Розробка інтернет-магазину полягає в проектуванні структури бази даних, 
створення програмного забезпечення, оформлення інтерфейсу. Вона вимагає 
вивчення інтернет-протоколів, веб-технологій в достатньо глибокому розумінні. 
Тобто, дана розробка включає широкий спектр дисциплін, які входять до 
навчального плану бакалавра. 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
7 
Змн. Лист № докум. Підпис Дата 
 
1 ПОСТАНОВКА ЗАДАЧІ 
1.1 Опис існуючих програм для інтернет-магазинів 
Сучасний інтернет-магазин може виконувати в себе значну кількість 
функцій. В різних магазинах закладено певний набір, в залежності від потреб 
клієнтів. Функції можуть включати в себе процедури роботи з товаром, фінансові 
функції, процедуру звітності, розділ замовлення і кошик тощо. Зміст функцій 
інтернет-магазину може складатися з: 
Роботи з товаром : 
–каталог товарів з складними будовами розділів; 
– необмежену кількість позицій товару і каталогів товару; 
– створення автоматично унікального коду товару для його пошуку в базі 
та ідентифікації за цим номером при замовленні; 
– довільний текст функцій кожного товару; 
– відображення зовнішнього вигляду при перегляді товару; 
– вбудовування відеороликів з відеооглядами покупців, наприклад, мережа 
YouTube; 
– побудова динамічних блоків для показу реклами і взаємозв'язку між 
схожими товарами - розділ "хіти продажів", розділ "нові додані товари", розділ 
"рекомендовані товари ", розділ "акційні товари" і багато інших функцій; 
– рейтинг товару в інтернет магазині і в цілому в мережі; 
– відгуки покупців про товар (як на основі відгуків із соціальних мереж, 
так і відгуками з сайту); 
– можливість створювати атрибути товару, що дозволяє додати один товар 
і, використовуючи атрибути, створити його варіації. Наприклад товар – 
навушники, а його атрибут – довжина шнура; 
– різні способи відображення товару: зображення у вигляді таблиці, у 
вигляді сітки, показ товарів із каталогів інтернет-магазину в режимі слайд-шоу; 
– інформація про складські запаси товару, що дозволяє завжди 
контролювати наявність товарів у інтернет-магазині, і виключає замовлення 
 Лист 
ЧДТУ. 222079.001 ПЗ 
8 
Змн. Лист № докум. Підпис Дата 
 
відсутнього товару; 
– створення заданих характеристик і атрибутів для товарів з подальшим 
пошуком за заданою його характеристикою; 
– фільтрація каталогу за атрибутами товарів; 
– сортування каталогу товарів за: назвою, ціною, рейтингом, кількістю 
продажів, датою створення, кількістю переглядів; 
– можливість імпорту списку товарів з Excel і 1-С в каталог магазину; 
– експорт списку товарів у файл; 
– функція "Список бажань" дозволяє додати обраний товар у свій список 
бажань для подальшого придбання; 
– додати товар до порівняння – допомагає клієнтам знайти відмінності між 
різними товарами. 
Грошові функції: 
– інтеграція з поширеними платіжними системами - Приват24, PayPal та 
інші; 
– створення рахунків безпосередньо на сайті – направлення рахунків 
покупцю, рахунок на роздрук, рахунок для керівництва магазину; 
– система заохочень, дисконтів і знижок; 
– побудова системи знижок залежно від суми товарів, кількості товарів в 
замовленні користувача, призначення товару та інших параметрів; 
– можливість оплати дисконтними картками з їх автоматичним створенням 
і налаштуванням строку активності дисконтної картки; 
– впровадження різних груп клієнтів з різними ціновими запросами для 
кожної групи; 
– облік податкових ставок. Встановлюється як для конкретних країн, так і 
для конкретного регіону країни; 
– автоматичне встановлення вартості послуг з доставки товару в 
залежності від розміру, типу і ваги товару; 
– функція автоматичного складання вартості товару, залежно від типу 
покупця, акції, знижки, наявності транспортних витрат та податків; 
 Лист 
ЧДТУ. 222079.001 ПЗ 
9 
Змн. Лист № докум. Підпис Дата 
 
– можливість зазначення собівартості товару, рекомендованої націнки, ціни 
продажу та інших видів націнок для різних цілей і для конкретного товару . На 
основі цих даних визначається прибуток від продажу конкретного товару; 
– автоматичний перерахунок вартості, залежно від курсу валют, за даними 
міжнародних фінансових систем, наприклад Yahoo! Finance; 
Модуль звітності: 
– перегляд фінансових форм про різні види прибутку з терміном деталізації 
від року до години; 
– модуль прогнозування обсягу продажів – прогнозує очікуваний розмір 
продажу наперед на основі звітів про обсяг минулих продажів; 
– перегляд службової інформації про перебіг статусів замовлень; 
– статистика переглядів інформації; 
– перегляд походження відвідувачів сайту; 
– інформація про останні відвідини сайту клієнтами (хто і звідки відвідував 
веб-ресурс); 
– системний журнал, в якому розміщаються всі дії проведені на сайті як 
клієнтами, так і співробітниками магазину; 
– інтеграція інтернет-магазину з мережею Google Analytics, що дозволяє 
формувати більш детальні звіти про дії клієнтів на сайті; 
Модуль замовлення і кошик: 
– можливість покупки товару без авторизації на сайті (замовлення 
стороннім відвідувачем товару в інтернет-магазині); 
– при замовленні товару стороннім користувачем автоматично створюється 
стандартний обліковий запис для цього користувача і реалізується вхід на сайт; 
– сповіщення працівників магазину про створення нового замовлення по e-
mail і SMS; 
– можливість надання замовленню різних статусів, з метою технічної 
обробки замовлення. Наприклад, замовлення в обробці, в процесі оформлення, 
очікування оплати, гроші отримані, замовлення в процесі доставки, товар 
доставлено. Статуси формуються і налаштовуються конкретно під вас і завдань і 
 Лист 
ЧДТУ. 222079.001 ПЗ 
10 
Змн. Лист № докум. Підпис Дата 
 
способу обробки замовлень; 
– інформування по e-mail або SMS покупця та працівника магазину про 
зміну статусу замовлень; 
– проста корзина замовлень, в якій можливо редагувати кількість товарів, 
видаляти зайві товари і переглядати сумму замовлення з урахуванням акцій, 
дисконтів та інших факторів, що впливають на вартість замовлення; 
– простий, повністю налаштовуємий під покупця інтерфейс роботи з 
замовленнями; 
– перегляд покупцем стану замовлення. 
В мережі інтернет існує багато онлайнових сервісів, які дають можливість 
створити свій інтернет-магазин, так званих конструкторів-шаблонів інтернет-
магазинів. Наприклад, Skynell [14]. Він дає можливість розробити дизайн і 
структуру магазину без навичок програмування та інших спеціальних знань. 
Користувач може самостійно розробити інтернет-магазин, додати товари без 
обмежень (при цьому повні можливості інтернет-магазину доступні всім 
користувачам безкоштовно) і включити його до роботи (рисунок 1.1).  
 
 
Рисунок 1.1 – Вигляд конструктору-шаблону інтернет-магазинів Skynell 
 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
11 
Змн. Лист № докум. Підпис Дата 
 
Система дає можливості для багатого оформлення, зручного керування 
сайтом та залучення нових клієнтів, а саме готові теми для можливих способів 
інтернет продажів, можливість створити дизайн інтернет-магазину самостійно, 
безліч варіантів кольорів, шрифтів і стилів для тексту, додати в інтернет-магазин 
товари і послуги майже без обмежень, здійснити багатопотокове завантаження 
товарів або імпорт переліку товарів у форматах XML тощо, стабільний хостинг, 
архівацію даних на декількох розподілених серверах в світових дата центрах, 
підтримка SEO параметрів для розміщення в пошукових системах та залучення 
цільових відвідувачів з різних пошукових систем Google,  
повна інтеграція з каталогом, що дозволяє залучати покупців як з пошукових 
систем так і з світового каталогу Skynell. 
До недоліку системи, типово, як для інших систем, можна вважати 
складність в налаштуванні під деякі незвичні вимоги користувача, адже не всі 
користувачі працюють на типових інтернет-магазинах, буває, що їх функції є 
дуже оригінальними. 
 
1.2 Опис предметної області 
Розроблюваний в роботі інтернет-магазин дрібнооптової торгівлі 
планується для продажу широкої номенклатури промислових товарів кінцевим 
роздрібним споживачам. На підприємстві, яке буде працювати на даному 
інтернет-магазині, застосовується програма складського обліку, яка не 
забезпечує прямий доступ до інформації бази, але дає можливість експортувати 
списки товарів в xls-файли.  
Кількість товарів у номенклатурі становить до п’яти тисяч найменувань. 
Вони поділені за рубриками. В рубриках існують підрубрики (може бути 
вкладеність до 3-х рівнів). Кожен товар має власний артикул, який вміщає в себе 
в тому числі рубрику і підрубрики товару. Товари можуть знаходитись як на 
центральному складі, так і на різноманітних торгівельних точках.  
Стан товарів оновлюється щоденно. так само можуть з’являтися нові 
 Лист 
ЧДТУ. 222079.001 ПЗ 
12 
Змн. Лист № докум. Підпис Дата 
 
товари, яких раніше не було на складі, тобто повністю нові товари. Таких товарів 
може бути до сотні за тиждень. 
Підприємство має постійних клієнтів, які є дрібнооптовими покупцями. 
Вони організовують продажі, вивчаючі прайс-листи чи отримуючи дані 
безпосередньо в представництвах фірми. Це зменшує зручність, оперативність у 
роботі клієнтів, а також вимагає додаткових годин праці з боку працівників 
фірми на контактування з клієнтами. Використання інтернет-магазину допомогло  
б зменшити витрати праці робітників фірми з одного боку, і зробило б роботу 
покупців більш зручнішою з іншого боку. 
Задача реалізації інтернет-магазину полягає в оперативному і простому 
інформуванні клієнтів про активні у фірми товари та їх ціни, а також в створенні 
самими клієнтами  замовлень у вигляді, зрозумілому для оброблення 
працівниками фірми. Після створення замовлення менеджер магазину повинен 
перетелефонувати до клієнта, сповістити його про те, що його замовлення в 
роботі та надавши інформацію про всі необхідні деталі, в тому числі стосовно 
механізму оплати. Потім менеджер має скласти дане замовлення та 
перетелефонувати до клієнта, проінформувавши його про можливість отримати 
товар. 
 
1.3 Постановка завдання 
Завданням даної бакалаврської роботи є розробка інтернет-магазину 
дрібнооптової торгівлі, який призначений для реалізації широкої номенклатури 
промислових товарів конкретному колу клієнтів.  
Програма повинна бути створена з двох частин – клієнтської та 
адміністративної. 
Клієнтська частина програми повинна реалізовувати для клієнта, який не 
залогувався в системі:  
– переглядати рубрики та підрубрики; 
– перебувати у системі (залогуватися в системі він може лише після дозволу 
 Лист 
ЧДТУ. 222079.001 ПЗ 
13 
Змн. Лист № докум. Підпис Дата 
 
адміністратора); 
– залогуватися в систему ("залогінитись"), якщо покупець зареєструвався в 
системі і адміністратор надав для нього допуск до системи. 
Клієнтська частина програми повинна реалізувати для клієнта, який увійшов 
у систему:  
– переглядати каталог товарів, активних на даний час, для кожної рубрики і 
підрубрики із наведенням повної назви товару, ціни, а також зображення товару; 
– переглядати зображення товару у збільшеному розмірі; 
– заносити товар до корзини для купівлі із вказанням кількості товару; 
– бачити склад товарів, які додані до корзини, з кількістю та вартістю 
кожної позиції товару; 
– бачити повну вартість товарів, доданих до корзини; 
– видаляти частину товарів з корзини; 
– переглядати зміст корзини у вигляді таблиці з фотографією малого 
розміру, ціною, назвою, вартістю; 
– редагувати кількість одиниць вибраного товару при відкритті корзини у 
вигляді таблиці; 
– оформляти доставку товарів; 
– одержувати повідомлення про оформлену доставку електронною поштою. 
Адміністративна частина програми повинна давати функції менеджеру 
фірми, який увійшов у систему з використанням адміністративного логіну:  
– переглядати весь каталог товарів для кожної рубрики і підрубрики із 
виведенням повної назви товару, артикулу, ціни, а також зображення товару; 
– додавати зображення товару; 
– імпортувати дані про активні товари та їх вартість з файлу MS Excel; 
– підтверджувати дозвіл на роботу з інтернет-магазином для користувачів, 
які зареєстровані у системі; 
– переглядати оформлені клієнтами замовлення; 
– друкувати інформацію про замовлення, включаючи перелік товарів з їх 
реквізитами; 
 Лист 
ЧДТУ. 222079.001 ПЗ 
14 
Змн. Лист № докум. Підпис Дата 
 
– позначати замовлення як такі, що знаходяться в роботі або вже 
доставлені. 
Інтерфейс програма повинен бути інтуїтивно зрозумілим як для клієнта, 
так і для адміністратора і працювати без перекосів на моніторах комп'ютерів з 
діагоналлю 13'' та більше.  
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
15 
Змн. Лист № докум. Підпис Дата 
 
2 ОПИС ТЕХНОЛОГІЙ ТА ЗАСОБІВ РОЗРОБКИ 
2.1 Мова програмування Ruby  
Ruby – сучасна повністю динамічна мова програмування з відкритим 
вихідним кодом з напрямленістю на простоту і продуктивність. Вона має 
елегантний синтаксис, який приємно читати і просто писати. Ruby - це досить 
ретельно збалансована мова програмування. Її творець Мацумото Юкіхіро (так 
само відомий як "Matz"), сполучив частини його улюблених мов (Perl, Smalltalk, 
Eiffel, Ada і Lisp) щоб створити нову мову, в якій парадигма функціонального 
програмування доповнюється принципами імперативного програмування. 
З часу випуску релізу версії в 1995 році, до Ruby залучились програмісти з 
усього світу. У 2006 році Ruby отримала світове визнання. У найбільших країнах 
по всьому світу активно працюють групи користувачів Ruby, а конференції, 
присвячені Ruby, заповнені на повну. 
Ruby-Talk, основний форум для обговорення мови Ruby, становив в 
середньому 200 повідомлень щодня в 2020 році. В останні роки ця кількість 
залишається постійною, незважаючи, що співтовариство стало використовувати 
кілька тематичних форумів замість одного загального. 
Індекс TIOBE, який визначає зростання популярності мов програмування, 
ставить Ruby на 9 місце серед міжнародних мов програмування. Багато в чому, 
зростання популярності мови забезпечує популярність програмного програм, 
написаних на Ruby, особливо – Ruby on Rails, середовищі розробки більшості 
відомих веб-додатків [2a]. 
Ruby зазвичай має абсолютно відкритий код. Відкритий для безоплатного 
використання, корегування, копіювання та розповсюдження. 
2.1.1 Особливості мови програмування Ruby 
У Ruby все – об'єкт. Для кожної долі інформації або коду можуть бути 
задані власні складові і дії. В об'єктно-орієнтованому програмуванні складові 
називаються змінними об'єкту, а дії – методами. Найчистіше об'єктно- 
орієнтований підхід Ruby може бути реалізований парою рядків коду, в яких 
 Лист 
ЧДТУ. 222079.001 ПЗ 
16 
Змн. Лист № докум. Підпис Дата 
 
проводяться дії над числом. 
5.times { print "Ми любимо Ruby ! Ruby - це чудово ! " } 
У багатьох мовах числа та інші прості типи даних не відносять до об'єктів. 
Ruby під впливом мови Smalltalk дозволяє встановити методи й перемінні об'єкту 
всім типам даних. Це спрощує застосування Ruby, оскільки  правила підходять 
до об'єктів всього Ruby. 
Ruby дуже гнучка мова, оскільки вона дає можливість його користувачам 
вільно модифікувати її частини. Основні частини складових Ruby можуть бути 
ирізані або перевизначені за бажанням. А існуючі частини підлягають 
модифікуванню. Ruby намагається майже не обмежувати користувача. 
Наприклад, додавання реалізується операцією плюс (+). Але, якщо 
програміст бажає використовувати для цього більш зрозуміле слово plus – можна 
створити такий метод прямо в Numeric, внутрішній клас мови програмування 
Ruby. 
class Numeric 
  def plus ( x ) 
    self . + ( x ) 
  end 
end 
y = 5.plus 6 
Оператори в Ruby – представляють синтаксичний «цукор» для методів. Їх 
також можна модифікувати. 
Блоки в Ruby також є простим джерелом модифікації. Програміст може 
внести замикання в будь-який метод, задаючи, як цей метод повинен діяти. 
Замикання опсиується блок і є однією з найбільш простих конструкцій які 
прийшли у світ Ruby із відомих імперативних мов програмування, таких як PHP 
або Visual Basic. 
Створення блоків було закладене в функціональних мовах програмування. 
Matz говорив, "замиканнями в рубі я бажав віддати авторитету культурі мови 
Lisp4". 
 Лист 
ЧДТУ. 222079.001 ПЗ 
17 
Змн. Лист № докум. Підпис Дата 
 
search_engines = 
  % w [ Google Yahoo MSN ] . map do | engine | 
    "http://www . " + Engine.downcase + ". Com " 
  end 
У коді вище блок занесено всередину конструкції do ... end. Метод map 
реалізує блок коду в представленому списку слів. Багато інших методів в Ruby 
створюють шлях, відкритий для програміста, щоб той створив власний блок 
коду, який детально описує, що той має зробити. 
На відміну від багатьох об'єктно- орієнтованих мов, Ruby спеціально 
дозволяє лише одиночне спадкування. Але Ruby також реалізує концепцію 
модулів (які називаються категоріями в Objective-C). Модулі – це набори 
методів. 
Класи можуть вільно складатися з модулів і отримувати всі його методи. 
Наприклад, будь-який клас, який забезпечує метод each, може застосувати 
модуль Enumerable, який додасть набір методів, що застосовують each для 
створення циклів. 
class MyArray 
  include Enumerable 
end 
В основному, рубісти вважають це більш прозорим, ніж множинне 
спадкування, яке на справді може бути достатньо складним і мати будь-які 
обмеження. 
Оскільки в Ruby часто пунктуація існує досить рідко і зазвичай існують 
англійські слова в якості ключових, деякі знаки пунктуації застосовано для 
прикраси Ruby. Ruby не вимагає оголошення змінних. У ньому 
використовуються звичайні конвенції іменування, для того щоб розділити 
площини видимості змінних. 
var може бути  як локальною змінною. 
$ var глобальна змінна. 
@ var змінна об'єкта. 
 Лист 
ЧДТУ. 222079.001 ПЗ 
18 
Змн. Лист № докум. Підпис Дата 
 
Дана символіка спрощує читабельність, дозволяючи програмісту просто 
ідентифікувати роль окремої змінної. Це також дозволяє не застосовувати 
складне self . для кожного об'єкту. 
Ruby наповнений іншими особливостями і конструкціями, наведемо деякі з 
них: 
– у Ruby представлений дійсний mark-and-sweep (познач і очисти) 
збирач зайвого для всіх Ruby об'єктів. Не потрібно вручну контролювати 
кількість посилань в сторонніх бібліотеках. Як зазначає Matz , "Це корисніше для 
вашого здоров'я"; 
– у Ruby є конструкції для компіляції виключень, як в Java або 
Python, які дозволяють логічніше працювати з помилками; 
– писати розширення на C в Ruby легше ніж в Perl або Python за 
допомогою досить елегантного API для виклику Ruby з C. Він включає в себе 
виклики для додавання Ruby в програмне забезпечення, щоб застосовувати його 
як скриптову мову. Також працює інтерфейс SWIG; 
– Ruby може закачувати сторонні бібліотеки динамічно, якщо 
реалізує операційна система; 
– у Ruby реалізовані окремі від операційної системи потоки. Таким 
чином, на будь-яких платформах, де працює Ruby, є можливість застосовувати 
багатопоточність, не залежно від того, чи реалізує дана система потоки, чи ні. 
Можна використовувати процеси багатопоточності навіть в MS –DOS; 
– Ruby відрізняється простою переносимістю: він був розроблений 
здебільшого на GNU/Linux, але працює на всіх типах UNIX, Mac OS X, DOS, 
BeOS, Windows 95/98/Me/NT XP/Vista//2000/ 8, OS/2 і так далі. 
2.1.2 Бібліотеки Ruby 
Як і в відомих мовах програмування, в Рубі можна застосовувати широкий 
набір сторонніх бібліотек. Значна частина з них реалізована у вигляді гема. 
RubyGems – менеджер пакетів Рубі, побудований для спрощення процесу 
створення, перенесення та встановлення бібліотек (в якомусь сенсі це 
 Лист 
ЧДТУ. 222079.001 ПЗ 
19 
Змн. Лист № докум. Підпис Дата 
 
розподілений пакетний менеджер, який має багато спільного із apt-get, але 
націлений на модулі Рубі). З появи версії Ruby 1.9 - RubyGems присутні за 
замовчуванням, хоча для попередніх версій його необхідно було встановлювати 
вручну. 
Деякі інші бібліотеки працюють як архіви (ZIP або tar.gz ) вихідного коду. 
Процес установки може бути досить відмінним, зазвичай інструкції з установки 
знаходяться в файлі README або INSTALL. 
Основне місце, де розміщено бібліотеки – RubyGems.org, зберігає 
бібліотеки Рубі у вигляді гемів. Можна знайти прямо на сайті або застосувати 
команду gem. 
2.2 Фреймворк Rails 
З часів свого створення в 2004 році, Ruby on Rails зразу став одним з 
найбільш відомих і разповсюджених фреймворків для створення динамічних веб-
додатків. Користувачі Rails реалізують широкий діапазон завдань, починаючи з 
стартапів і переходячи до величезних компаній: 37signals, GitHub, Shopify, 
Scribd, Groupon, Hulu, Twitter, LivingSocial, Yellow Pages – перелік сайтів, що 
побудовані на Rails продовжує зростати. Також існують інтенет-магазини з 
профілем розробки, що спеціалізуються на Rails, такі як Pivotal Labs, ENTP, 
thoughtbot, і Hashrocket, плюс безліч різних викладачів, консультантів та 
контрагенти [3a]. 
Що ж зробило Rails таким популярним? По-перше, Ruby on Rails повністю 
відкритий, доступний в силу MIT License, і, як результат, його можна встановити 
і використовувати безкоштовно. Rails також має неабиякий успіх завдяки своїм 
витонченим і компактном дизайном; завдячуючи податливості мови Ruby, що 
базується в його основі, Rails фактично являє предметно-орієнтовану мову 
(domain-specific language) для створення веб-додатків. У результаті достатньо 
спільних завдань веб-програмування, таких, як компіляція HTML, побудова 
моделей даних і маршрутизація URI – легкі з Rails, а фінальний код програм 
короткий і читабельний. 
 Лист 
ЧДТУ. 222079.001 ПЗ 
20 
Змн. Лист № докум. Підпис Дата 
 
Rails також активно адаптується до сучасних тенденцій у веб-технологіях. 
Наприклад, Rails був одним з перших, хто в цілому реалізував архітектурний 
стиль REST для веб-додатків. І коли інші фреймворки впевнено розробляють 
нові техніки, David Heinemeier Hansson - творець Rails і активна група Rails не 
зупиняючись використовувати їх ідеї. Мабуть, найбільш цікавим прикладом є 
обєднання Rails і Merb (конкуруюча веб-платформа), так що Rails тепер включає 
переваги від модульної конструкції Merb, надійного API, а також підвищеної 
продуктивності . 
Нарешті, Rails переважає від надзвичайно захопленої і різноманітної 
спільноти. Результати: тисячі open-source співрозробників, добре популярні 
конференції, значна кількість гемів (автономні вирішення простих проблем, 
таких як покроковий висновок, і завантаження зображень), суттєвий набір 
інформативних блогів і набір форумів і каналів IRC. Значна кількість активних 
програмістів Rails також спрощує обробку існуючих помилок додатків: алгоритм 
– "Шукай в Google інформацію про помилку"  майже завжди находить відповідне 
повідомлення в блозі чи гілці відповідного форуму. 
Rails пропонує задану структуру проекту, в якому реалізується розробка 
додатку (рисунок 2.1). В стандартній будові Rails додатку є директорія з назвою 
app/, що складається з трьох підкаталогів: models, views і controllers. Це натяк на 
те, що Rails володіє архітектурної схемою модель-представлення-контролер 
(MVC) (рисунок 2.2), яка забезпечує поділ між "логікою предметної області" (яка 
також зветься "бізнес-логікою") від логіки внесення і логіки представлення, 
відповідно до графічного інтерфейсу користувача (GUI). У випадку веб-додатків, 
"логіка предметної області" стандартно складається з моделі інформації для 
таких речей як статті, користувачі, продукти, а GUI це лише веб-сторінка в 
браузері. 
Взаємодіючи з програмним додатком Rails, браузер формує запит, який 
приймається веб-сервером і надсилається контролеру Rails, який відповідає за те, 
що робити далі. У деяких випадках контролер відразу візуалізує представлення, 
яке є шаблоном, що конвертує отримане в HTML і відсилає назад до браузеру. 
 Лист 
ЧДТУ. 222079.001 ПЗ 
21 
Змн. Лист № докум. Підпис Дата 
 
Більш типово для динамічних сайтів, коли контролер працює з моделлю, яка є 
об'єктом Ruby, який представляє собою елемент сайту (такий, як користувач) і 
контролює комунікацію з базою даних. Після виклику моделі, контролер 
наступне візуалізує представлення і повертає всю веб-сторінку браузеру як 
HTML. 
 
 
Рисунок 2.1 – Структура проекту Rails 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
22 
Змн. Лист № докум. Підпис Дата 
 
 
Рисунок 2.2 – Схематичне зображення модель-представлення-контролер (MVC) 
архітектури 
Кожна директорія має своє призначення, що приведено в таблиці 2.1 
Таблиця 2.1 – Огляд папок Rails за замовчуванням 
Файл/Папка Призначення 
app/ Основний код додатку (app), складається з моделей, 
контролерів, представлень і хелперві 
app/assets "Активи" додатку, а саме каскадні таблиці стилів (CSS), 
JavaScript файли та зображення 
bin/ Бінарні виконувані файли 
config/ Конфігурація додатки 
db/ Файли бази даних додатків 
doc/ Документація для програми 
lib/ Бібліотека модулів 
lib/assets Бібліотека "активів", таких як каскадні таблиці стилів (CSS), 
JavaScript файли та зображення 
log/ Файли логів додатки 
 Лист 
ЧДТУ. 222079.001 ПЗ 
23 
Змн. Лист № докум. Підпис Дата 
 
public/ Вільно доступні дані (наприклад , веб- браузерам ), такі як 
сторінки помилок додатки 
bin/rails Програма для генерації коду, створення консольних сесій 
або запуску локального веб-сервера 
test/ Тести додатку 
tmp/ Тимчасові файли 
vendor/ Код сторонніх розробників, сторонні плагіни і геми 
vendor/assets Сторонні "активи", а саме каскадні таблиці стилів (CSS), 
JavaScript файли та зображення 
Rakefile Службові завдання, створені за допомогою rake-команди 
Gemfile Геми, відповідні даному додатку 
Gemfile.lock Блокуючий список гемів, який реалізує використання всіма 
копіями додатку повністю однакових версій гемів 
config.ru Конфігураційний файл для Rack middleware 
.gitignore Правила опису файлів, які повинні ігноруватися Git 
  
Action Controller – це C в абревіатурі MVC. Після того, як роутинг 
встановить, який контролер застосовувати для обробки запиту, контролер є 
відповідальним за реалізацію запиту і створення відповідної відповіді. Зазвичай, 
Action Controller робить більшу частину нудної роботи і використовує прості 
способи, щоб зробити це по можливості максимально просто. 
Для більшості додатків, заснованих на REST, контролер формує запит (це 
невидимо для розробника), закачує або зберігає дані в моделі і використовує 
view для будови результуючого HTML. Якщо контролеру слід працювати трохи 
по іншому – не проблема, це всього лише типовий спосіб роботи контролера. 
Таким чином, можна представити собі контролер як зєднання між 
моделями і view. Він робить інформацію моделі доступними для view, так що 
можуть відображатися ці дані користувачеві, і він зберігає або модифікує дані від 
користувача в модель. 
Контролер – це клас Рубі, переданий від ApplicationController і включає 
 Лист 
ЧДТУ. 222079.001 ПЗ 
24 
Змн. Лист № докум. Підпис Дата 
 
методи, як і будь-який інший клас. Коли додаток формує запит, роутинг 
встановить, який контролер та екшн запустити, потім Rails будує екземпляр 
цього контролера і сформує метод з ім'ям , як у екшна. 
class ClientsController < ApplicationController 
  def new 
  end 
end 
Як варіант, якщо працівник перейде в /clients/new у даному додатку, щоб 
створити нового користувача, Rails побудує екземпляр ClientsController і виконає 
метод new. Зрозуміло, що порожній метод з наведеного прикладу буде добре 
працювати, так як Rails за замовчуванням виконає view new.html.erb, якщо екшн 
не заявить інше. 
ApplicationController успадковується від ActionController::Base, який 
описує кілька корисних методів. Тільки public методи можуть бути виконані як 
екшени. Хорошою практикою є зження області видимості методів, не 
призначених працювати, як екшени, таких, як сторонні методи і фільтри. 
Можливо, є необхідність отримати доступ до даних, створених 
користувачем, або до інших даних в екшнах контролера. Є два типи параметрів, 
працюючих у веб додатках. Перший – це параметри, передані як частина URL, 
так звані параметрами строки запиту. Строка запиту завжди стоїть після "?" в 
URL . Другий тип параметрів класично згадуються як дані POST. Ця інформація 
зазвичай передається з форми HTML, що надається користувачем. Вони 
називаються даними POST, так як зазвичай надсилаються тільки як частина 
HTTP запиту POST. Rails не знаходить будь-яких відмінностей між строковими 
параметрами і POST параметрами, і ті і інші доступні в хеші params у контролері. 
У модуля є сесія для кожного користувача в якій можливо зберігати 
короткі порції даних, які будуть розміщені між запитами. Сесія доступна тільки в 
контролері і у view, і може застосовувати один з декількох механізмів зберігання: 
ActionDispatch::Session::CookieStore - зберігає всі дані на клієнті; 
ActiveRecord::SessionStore – Зберігає інформацію в базі даних з 
 Лист 
ЧДТУ. 222079.001 ПЗ 
25 
Змн. Лист № докум. Підпис Дата 
 
використанням Active Record; 
ActionDispatch::Session::CacheStore – зберігає інформацію в кеші Rails; 
ActionDispatch::Session::MemCacheStore – зберігає інформацію в кластері 
Memcached (ця реалізація - продукт старих версій, замість неї правильніше 
розглянути використання сховища кеша). 
Всі сесії роблять з куками для зберігання унікального ID кожної сесії 
(обов'язково потрібно застосовувати куки, Rails не може передавати ID сесії в 
URL, так як це порушує надійність роботи). 
Для більшості способів зберігання цей ID застосовується для пошуку даних 
сесії на сервері, а саме в таблиці бази даних. Існує один виняток – це дефолтне і 
рекомендоване існування сесії – CookieStore – яке зберігає всю інформацію сесії 
в куках (ID залишається доступним, якщо він активний). Переваги цього в 
простоті, відсутності модифікації для нового додатка в порядку використання 
сесій. Інформація в куках криптографічно підписана, що створює їх захищеними 
від злому, але не зашифровані, тому будь-хто, хто отримав до них доступ, може 
вивчити їх вміст, але не модифікувати їх (Rails не прийме їх, якщо вони були 
модифіковані). 
CookieStore можуть зберігати до 4kB даних – значно менше, ніж інші - але 
цього майже вистачає. Зберігання більшого об’єму даних у сесії не 
рекомендується, незважаючи на те, як зберігаються вони у додатку. Слід 
навмисно уникати зберігання в сесії великих об'єктів (нічого, крім простих 
об'єктів Рубі, наприклад форми моделей), так як сервер може не об’єднати їх між 
запитами, що призведе до помилки. 
Якщо сесії користувачів не створюють критичні дані або відсутня 
необхідність в її збереженні на довгий період (скажімо, якщо вони 
використовуються для повідомлень у флеш), можна пропонувати використання 
ActionDispatch::Session::CacheStore. Цей метод збереже сесії з використанням 
реалізації кешу, яку можна адаптувати для свого додатку. Перевага метода в 
тому, що для зберігання сесій можна застосовувати існуючу інфраструктуру 
кешування без задіяння додаткових налаштувань або адміністрування. Недоліки, 
 Лист 
ЧДТУ. 222079.001 ПЗ 
26 
Змн. Лист № докум. Підпис Дата 
 
зрозуміло, в тому, що сесії стануть недовговічними і зазвичай зникати. 
Ресурсний роутинг дозволяє просто оголошувати всі звичайні маршрути 
для наведеного ресурсного контролера. Замість призначення окремих маршрутів 
для екшнів index, show, new, edit, create, update і delete, ресурсний маршрут 
призначає їх у єдиному рядку коду. 
Браузери запитують дані від Rails, проводячи запит по URL, 
використовуючи стандартний метод HTTP, такий як GET, PATCH, POST, PUT і 
DELETE. Кожен метод - це запит на створення операції з ресурсом. Ресурсний 
маршрут об’єднує безліч споріднених запитів з екшн в одному контролері. 
У Rails ресурсний маршрут створює з'єднання між методами HTTP і URL 
до активного екшн контролера. Стандартно, кожен екшен також з'єднується з 
заданою операцією CRUD в базі даних. 
Маршрути Rails встановлюються в тому порядку, в якому вони визначені, 
тому, якщо є get 'photos/poll' до resources :photos маршрут для екшна show у 
позиції resources співпаде до рядка get. Щоб це замінити, перемістіть рядок Get 
над рядком resources, щоб вона порівнювалася першою. 
Створення ресурсного маршруту також створить безліч хелперів 
доступними в контролері програми. У випадку з resources :photos:  
new_photo_path повертає /photos/new; 
photos_path повертає /photos; 
photo_path (:id) повертає /photos/:id (наприклад, photo_path (10) повертає 
/photos/10); 
edit_photo_path (:id) повертає /photos/:id/edit (наприклад, edit_photo_path 
(10) повертає /photos/10/edit). 
Кожен з цих хелперів має стандартний хелпер _url (такий як photos_url), 
який повертає той же маршрут з створеним поточними хостом, портом і 
префіксом шляху. 
Оскільки роутер застосовує як метод HTTP, так і URL, чотири URL 
поєднують з сімома різними екшн. 
Action Mailer реалізує відправку електронних листів з додаткА, 
 Лист 
ЧДТУ. 222079.001 ПЗ 
27 
Змн. Лист № докум. Підпис Дата 
 
застосовуючи модель і view розсильників. Таким чином, в Rails електронна 
пошта застосовується з допомогою створення інструментів розсилки, 
успадкованих від ActionMailer::Base, і формуються в app/mailers. Ці інструменти 
розсилки мають пов'язані view, які формуються серед view контролерів у 
app/views. 
Файлопровод (Asset Pipeline) являє собою фреймворк для з'єднання та 
мінімізації або скорочення ресурсів JavaScript і CSS. Він також створює 
можливість писати ці ресурси на інших мовах, таких як CoffeeScript, Sass і ERB. 
До Rails 3.1 ці можливості додавалися сторонніми бібліотеками Ruby, 
таким як Jammit і Sprockets. Rails 3.1 інтегрований зазвичай із Sprockets за 
допомогою Action Pack, який має похідність від гема Sprockets. 
Становлення файлопровода як типової особливості Rails означає, що всі 
розробники можуть скористатися превагами того, що їх ресурси будуть за 
умовчуванням оброблені, стиснуті і зменшені за допомогою типової бібліотеки, 
Sprockets. Це частина стратегії "просто за умовчанням", як було сказано David 
Heinemeier Hanson на представленні RailsConf 2020 року. 
Файлопровод зазвичай в Rails 3.1 включений. Він може бути відключений 
в версії /application.rb, якщо розмістити наступний рядок у опису класу програми: 
config.assets.enabled = false. 
Першою особливістю файлопровода є поєднання ресурсів. Це критично в 
середовищі виробництва, оскільки може скоротити кількість запитів, необхідних 
браузеру для побудови сторінок. Браузери обмежені в кількості запитів, які вони 
здатні виконати паралельно, тому скорочення запитів може означати швидке 
завантаження розробленої програми. 
Rails 2.x представив можливість з'єднувати ресурси JavaScript і CSS, при 
поміщенні :cache =>true в тілі методів stylesheet_link_tag і javascript_include_tag. 
Але цей способ мав значний перелік обмежень. Наприклад, не можна було 
сформувати кеш заздалегідь, не можна було явно задіяти ресурси, сформовані 
сторонніми бібліотеками. 
Починаючи з версії 3.1, стандартно  Rails з'єднує всі JavaScript файли в 
 Лист 
ЧДТУ. 222079.001 ПЗ 
28 
Змн. Лист № докум. Підпис Дата 
 
один типовий файл JS і всі CSS файли в один стандартний файл CSS. Можна 
сконфігурувати цю стратегію, згрупувавши файли довільним способом. В 
production Rails інтегрує мітку MD5 в кожне ім'я файлу, в результаті файл 
кешуєтся браузером. Кеш можна сформувати недійсним, змінивши цю мітку, що 
реалізується автоматично кожного разу, коли змінюється склад файлу. 
Другою функцією файлопроводу є мінімізація або стиснення ресурсів. Для 
файлів CSS це реалізується шляхом видалення пробілів і коментарів. Для 
JavaScript можуть бути реалізовані більш складні процеси. Можна вибирати з 
бібліотеки вбудованих опцій або визначити свої. 
Третьою особливістю файлопровода є те, що він дозволяє формувати ці 
ресурси на мові вищого рівня з наступною прекомпіляцією до фактичного 
ресурсу, який виконується безпосередньо при роботі програми. Підтримувані 
мови за замовчуванням становлять CoffeeScript для JavaScript, Sass для CSS і 
ERB для обох. 
2.3 Ajax 
AJAX (аякс) – це web технологія, що реалізує взаємодію з сервером без 
перезавантаження сторінки. Прикладами програми служать перевірка імені 
працівник на зайнятість при реєстрації, відправка позиції у кошик без 
перезавантаження, google suggest і так далі. AJAX створений на об'єкті 
XMLHttpRequest. Як видно з назви він створювався для роботи з XML, що, втім, 
не заважає програмувати на ньому і в інших цілях. 
Робота з Ajax стандартно реалізовується з використанням бібліотеки 
jQuery. jQuery – JavaScript-framework, бібліотека, що дає можливість більш 
зручно використовувати деякі можливості Javascript, такі як: обробка подій, 
створення візуальних ефектів, робота з DOM і підтримка AJAX. 
Принцип роботи такий: 
– клієнтська частина: працює на стороні клієнта, пишеться на 
JavaScript; 
– скрипт створено з двох частин; 
 Лист 
ЧДТУ. 222079.001 ПЗ 
29 
Змн. Лист № докум. Підпис Дата 
 
– серверна частина: працює на сервері, може бути реалізована на 
будь-якій мові програмування, яка розпізнає GET/POST запити. 
Етапи формування клієнтської частини: 
– створення екземпляра об'єкта XMLHttpRequest; 
– збір та підготовка даних для відправки запиту на сервер; 
– установка для нього процедури обробника події onreadystatechange. 
Ця подія виникає при кожній зміні стану об'єкта XMLHttpRequest. Дана функція 
по суті є базовою частиною скрипта, оскільки саме в ній проходить обробка 
відповіді сервера; 
– відкриття з'єднання із конкретизацією типу запиту (GET або POST), 
URL серверної частини, мітки асинхронного режиму і імені та пароля працівника 
(якщо необхідно); 
– безпосередньо формування запиту; 
– обробка результату серверної частини. 
Ajax є надзвичайно популярним додатком в даний час і його використання 
при розробці веб-додтаків швидко збільшується. Як кажуть, сучасні веб-додатки 
"товстіють" – клієнтська частина набуває все більшого функціоналу. 
 Лист 
ЧДТУ. 222079.001 ПЗ 
30 
Змн. Лист № докум. Підпис Дата 
 
3 ОПИС РОЗРОБКИ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ 
3.1 Структура бази даних 
Створена для даного додатку база даних складається з 7 таблиць, які 
пов’язані між собою. Схему бази даних наведено на рисунку 3.1. 
 
Рисунок 3.1 – Структура база даних 
Базу даних умовно можна розділити на 3 частини:  
– частина, що працює з користувачами, а саме три таблиці: таблиця 
ролей roles, таблиця користувачів users, таблиця зв'язку користувачів і ролей 
roles_users; 
– частина, що працює з довідниками, а саме дві таблиці: таблиця 
товарів goods та таблиця папок folders; 
– частина, що працює з замовленнями, а саме дві таблиці: таблиця 
кошиків замовлень baskets та таблиця пунктів замовлень basket_items. 
Базова таблиця бізнес-логіки baskets складається з полів: 
id – ідентифікатор, первинний ключ; 
 Лист 
ЧДТУ. 222079.001 ПЗ 
31 
Змн. Лист № докум. Підпис Дата 
 
user_id – код працівника з таблиці users, зовнішній ключ; 
ordered – поле логічного типу, яке встановлює, чи замовлення вже є 
зробленим; 
supplied – поле логічного типу, яке встановлює, чи замовлення вже є 
поставленим; 
order_time – дата і час замовлення; 
canceled – поле логічного типу, яке встановлює, чи замовлення є 
відміненим; 
cancellation_time – дата і час відміни замовлення; 
order_number – номер замовлення; 
in_process – поле логічного типу, яке встановлює, що замовлення є в 
процесі обробки. 
З таблицею baskets пов'язана таблиця basket_items, яка має поля: 
id – ідентифікатор, первинний ключ; 
dir_good_id – код товару з таблиці goods, зовнішній ключ; 
basket_id – код замовлення з таблиці baskets, зовнішній ключ; 
item_add_time – дата і час, в які було зроблено замовлення; 
amount – кількість одиниць товару, який було замовлено. 
Таблиця товарів goods має поля: 
id – ідентифікатор, первинний ключ; 
dir_folder_id – код папки з таблиці folders, зовнішній ключ; 
good_code – артикул товару; 
name – назва товару; 
wholesale_price – ціна товару; 
picture_file_size – розмір файлу фото товару; 
picture_file_name – назва файлу фото товару; 
picture_content_type – тип файлу фото товару; 
picture_updated_at – час оновлення файлу фото товару; 
 Лист 
ЧДТУ. 222079.001 ПЗ 
32 
Змн. Лист № докум. Підпис Дата 
 
new_good – поле логічного типу, яке встановлює, чи товар є новим товаром 
(потрібно для інформування клієнтів про надходження нових товарів); 
web_site_valid – чи товар відображатиметься на сайті; 
new_good_input_date – час та дата першого введення товару в базу; 
available – поле логічного типу, яке встановлює, чи товар наявний на сайті 
в даний час. 
Таблиця папок товарів folders має поля: 
parent_id – id папки верхнього рівня, є зовнішнім ключем, який посилається 
на цю ж таблицю, значення NULL або -1 вказує на папку вищого рівня; 
id – ідентифікатор, первинний ключ; 
code – код даної папки; 
deleted – чи папка вилучена; 
ancestry – код верхньої папки, потрібен для використання бібліотекою rails 
ancestry, значення NULL вказує на папку найвищого рівня. 
Таблиця користувачів users має всі поля, потрібні як для аутентифікації 
користувачів, так і для контактування з ними менеджера компанії: 
id – ідентифікатор, первинний ключ; 
email – електронна пошта клієнта, яка застосовується як в якості логіну, так 
і для контактування з менеджера клієнтом; 
encrypted_password – пароль в зашифрованому вигляді; 
sign_in_count – кількість входів користувача в систему; 
last_sign_in_at – дата та час останнього входу в систему; 
current_sign_in_at – дата та час поточного входу в систему; 
last_sign_in_ip – ip-адреса останнього входу в систему; 
current_sign_in_ip – ip-адреса поточного входу в систему; 
name – ім'я клієнта; 
address – адреса клієнта; 
company – назва фірми клієнта; 
 Лист 
ЧДТУ. 222079.001 ПЗ 
33 
Змн. Лист № докум. Підпис Дата 
 
confirmed – поле логічного типу, яке означає, чи підтверджено 
адміністрацією реєстрацію клієнта. 
phone – телефон клієнта, важлива інформація для наступного 
контактування з ним, тому користувач обов'язково повинен задати його, тому 
дане поле таблиці бази даних встановлено як not null; 
Таблиця roles описує ролі користувачів в системі – в даному випадку є 
тільки дві ролі – "менеджер" та "клієнт": 
name – назва ролі. 
id – ідентифікатор, первинний ключ; 
Таблиця roles_users описує те, якому користувачеві призначено яку роль: 
role_id – код ролі з таблиці roles; 
user_id – код користувача з таблиці users. 
3.2 Використання gem бібліотек в додатку 
В додатку використовується цілий набір бібліотек, без яких його створення 
стало б значно складним. 
Ancestry є gem-плагіном, який реалізує записам в RubyOnRails 
ActiveRecord моделі бути зформованими у вигляді дерева (або ієрархії). Він 
використовує один стандартно зрозумілий стовпчик бази даних, використовуючи 
варіації матеріалізованих шаблонів шляху. Він створює всі стандартні 
співвідношення деревоподібної структури (предків, батьків, корінь, дітей, братів 
і сестер, нащадків), і всі вони можуть бути зібрані в одному запиті SQL. 
Додатковими функціями є реалізація STI, скоупи, кешування глибини, легка 
міграція зі старих плагінів/gem'ів, обмеження глибини, відновлення цілісності, 
первірка цілісності, упорядкування (під)дерев в хеші і різних стратегій для 
боротьби з втрачених записами. 
Devise – це gem(бібліотека) rails для роботи з акаунтами юзерів, їх 
реєстрації, авторизації а також додаткових дій [12]. Він дуже зручний в роботі і 
підтримує купу додаткових функцій, проте його тестування може створити 
 Лист 
ЧДТУ. 222079.001 ПЗ 
34 
Змн. Лист № докум. Підпис Дата 
 
кілька неприємних проблем. 
Devise є гнучким способом аутентифікації для Rails на основі Warden. Він 
є: 
– являє собою комплексним рішенням MVC, заснованим на двигуні 
Rails; 
– заснованим на Rack; 
– дозволяє включати кілька моделів, що увійшли одночасно; 
– заснованим на концепції модульності: застосовувати тільки те, що 
дійсно потрібно. 
Він складається з 10 модулів, наведених далі 
Omniauthable: додає OmniAuth (https://github.com/intridea/omniauth) 
підтримку. 
Database Authenticatable: шифрує і зберігає пароль в базі даних для 
встановлення автентичності користувача, тоді як підписання аутентифікації 
може бути зроблено через POST запити або HTTP Basic Authentication. 
Confirmable : відправляє електронну пошту із наведенням підтвердження і 
перевіряє, чи є обліковий запис вже підтвердженим в процесі логування. 
Registerable: керує процесом реєстрації користувачів, а також дозволяє їм 
видаляти і знищувати їх обліковий запис. 
Recoverable: скидає пароль користувача і надає інструкції скидання. 
Rememberable: управляє генерацією та видаленням маркеру для 
запам'ятовування користувача від збереженого cookie. 
Trackable: веде облік кількості логів в систему, timestamps та IP-адреси. 
Timeoutable: закінчує сесії, які не мають жодної активності протягом 
певного періоду часу. 
Validatable: реалізує перевірку електронної пошти та паролю. Це 
необов'язковими і може бути змінено, можна встановити свої власні перевірки. 
Lockable: блокує обліковий запис після значного числа невдалих спроб 
входу в систему. Може розблокувати електронною поштою або в результаті 
закінчення заданого періоду часу. 
 Лист 
ЧДТУ. 222079.001 ПЗ 
35 
Змн. Лист № докум. Підпис Дата 
 
Devise гарантує потокобезпечність на YARV. Розробка реалізації 
потокобезпечності на JRuby триває. 
Підключення даних бібліотек та інших бібліотек, що є важливими для 
проектів та допомагають реалізувати функції даного проекту, прописано в файлі 
Gemfile у папці проекту: 
gem 'bcrypt-ruby' 
gem 'paperclip' 
gem 'therubyracer' 
gem 'devise' 
gem 'mysql2' 
gem 'ancestry' 
gem 'roo' 
gem 'haml' 
gem 'prawn' 
gem 'prawn_rails' 
gem 'cancan' 
gem "rmagick" 
Саме підключення проходить автоматично за допомогою менеджера gem 
при виконання Ruby-команди bundle install. 
3.3 Структура програми 
Проект даного додатку складає стандартну структуру для Ruby-програми, 
описану в пункті 2.2 (рисунок 3.2). 
Серверна частина програма поділена на 4 частини – базова частина, для 
роботи з товарами, для роботи з кошиком і адміністративна частина. Кожна з них 
має свій контролер, набір представлень, а також працює з певними моделями. 
Крім того, в програмі значну роль має файл menu.js, оскільки багато 
операцій реалізується за допомогою ajax-запитів. При цьому в проектах 
використовується цілий ряд бібліотек JavaScript, ядром і основою яких є 
бібліотека jquery. Зокрема, до проекту включені бібліотеки jquery-1.9.1.min.js, 
 Лист 
ЧДТУ. 222079.001 ПЗ 
36 
Змн. Лист № докум. Підпис Дата 
 
jquery.form.js (вона дає можливість використовувати ajax в роботі з html-
формами, зокрема, відсилати їх на сервер за допомогою ajax-запитів), 
jquery.validity.min.js (для перевірки правильності введеної покупцем інформації 
на боці клієнта). 
 
 
Рисунок 3.2 – Структура проекту програми 
Технологія роботи з ajax, яка застосовується в додатку – це відправка ajax-
запиту до контролера, з якого іде перехід на view, що реалізує відповідну 
частину сторінки, яка повертається в callback функцію ajax-запиту, і вставляється 
 Лист 
ЧДТУ. 222079.001 ПЗ 
37 
Змн. Лист № докум. Підпис Дата 
 
у конкретний елемент <div> відповідної html-сторінки. Часто запит формується з 
надсиланням даних форми, як наприклад у функції uploadPhoto, створеної для 
вставляння нового фото товару: 
function uploadPhoto(form_id){ 
    $("#"+form_id).ajaxSubmit(function(data){ 
        $('#content').html(data); 
        startSelectCropArea(); 
    }); 
} 
Хоча, більшість функцій застосовують прості ajax-запити, які тільки 
надсилають запит до контроллера і реалізують вставку результату, як наприклад, 
функція очищення кошика: 
function emptyCart(){ 
    $.get("goods/empty_cart", function(data){ 
        $('#shopping_cart').html(data); 
    }); 
} 
Важливою задачею в програмі була аутентифікація та авторизація 
користувачів. Вони були реалізована за допомогою бібліотек devise та cancan 
відповідно. Аутентифікація проходить за допомогою додавання до контролерів 
спеціального before_filter, який встановлює дію, що виконується кожного разу до 
виконання методу контролера, наприклад, в goods_controller є запис: 
before_filter :authenticate_user!, only: [:index,:update_cart,:make_order] 
Метод :authenticate_user! взято з бібліотеки devise. В даному випадку 
наведено, при виклику яких методів він буде застосовуватися (вичерпний 
перелік), але даний перелік включає повністю всі методи, оскільки за завданням 
користувач, що не залогувався, не може робити майже нічого – може лише 
переглядати існуючі папки у дереві. Дана бібліотека дає можливість автоматично 
реалізувати таблицю користувачів у базі даних, а також автоматично реалізувати 
веб-сторінки логіну та реєстрації користувача. 
 Лист 
ЧДТУ. 222079.001 ПЗ 
38 
Змн. Лист № докум. Підпис Дата 
 
Авторизацію користувача можна вивчити в контролері admin_controller – 
його методи може застосовувати тільки користувач з правами адміністратора, які 
прописуються заданим чином у таблиці бази даних roles та users_roles. На 
початку кожного методу наведеного контролера стоїть рядок:  
authorize! :administer, :shop 
Він описує доступ до операції. Наприклад, метод демонстрації замовлення 
має вигляд: 
  def show_order 
    authorize! :administer, :shop 
    @orders = Basket.current_orders 
    @non_confirmed_users = User.not_confirmed 
    @order = Basket.find(params[:order_id]) 
    @current_header = "Замовлення № #{@order.order_number}-
#{@order.order_time.strftime("%d-%m-%y")}: 
#{@order.user.name}"<<((@order.user.company.nil?)?'':", #{@order.user.company}") 
  end 
Для реалізації view в даному проекті було використано мову haml, яка має 
значні переваги перед erb. Особливістю її є велике число відступів для опису 
структури документу – вони потрібні не лише для простої зрозумілості 
програмісту, але і для опису семантики вкладеності. Прикладом є частина 
сторінки відображення кошика: 
    %div{style: "width: 100%; display: inline-block;"} 
      %table{style: "float: right; display: inline-block;"} 
        %tbody 
          %tr 
            %td{align: "right"} 
              %b Разом: 
            %td{align: "right"} 
              [email protected]_cart_total 
              грн 
 Лист 
ЧДТУ. 222079.001 ПЗ 
39 
Змн. Лист № докум. Підпис Дата 
 
Haml не використовує закриваючих тегів, в результаті чого текст стає 
коротшим. Знак % позначає початок аналогів html-тегів. 
 Лист 
ЧДТУ. 222079.001 ПЗ 
40 
Змн. Лист № докум. Підпис Дата 
 
ВИСНОВКИ 
В даній кваліфікаційній роботі бакалавра було розроблено інтернет-
магазин для дрібнооптової торгівлі товарами промислової групи. 
В рамках виконання роботи було проведено наступні види робіт: 
– знайдено та проаналізовано існуючі програми, які реалізують подібну 
функціональність; 
– досліджено предметну область, а саме, які є дані у компанії, що 
користуватиметься даним продуктом, які вимоги висуває компанія до інтернет-
торгівлі; 
– проаналізовано діючі засоби розробки, а саме мова програмування Ruby, 
веб-фреймворк Rails, бібліотеки RubyOnRails для реалізації різноманітних 
необхідних для роботи будь-якого інтернет-магазину функцій; 
– спроектовано базу даних, яку стосується інформації, необхідної для 
діяльності інтернет-магазину; 
– розроблено веб-додаток, який створено з клієнтської та адміністративної 
частини і реалізує всі функції, наведені у завданні на виконання даної роботи.  
В ході виконання роботи виникло достатньо проблем. Особливо складно 
розробляти частину, де застосовується JavaScript, який є достатньо непростим у 
відлагодженні. 
Створена система може бути в майбутньому вдосконалена та розширена. 
Зокрема, необхідно створити пошук товарів, а також реалізувати блок 
користувачів, які роблять некоректні дії. Доречним було б також створити 
функції, які дали б можливість проводити аналіз функціонування інтернет-
магазину. 
 Лист 
ЧДТУ. 222079.001 ПЗ 
41 
Змн. Лист № докум. Підпис Дата 
 
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ 
1. David Planagan, Yakibiro Matsumoto. The Ruby Programming Language.– 
O'Reilly, 2008.- pp. 429. 
2. Obie Fernandez. The Rails 3 Way.– Addison-Wesley, 2011.- pp.708. 
3. Мартін Р. Чистий код. Створення, аналіз і рефакторіг. [Текст] / Р. 
Мартін. — К.: УкрІНТЕІ, 2010 — 358 c. 
4. Пономаренко В. Проектування інформаційних систем. [Текст] / В. 
Пономаренко. — К. Київ: Видавничий центр «Академія», 2002 — 440 с. 
5. Ruby. A Programmer's Best Friend. [Електронний ресурс] Режим 
доступу: https://www.ruby-lang.org 
6. Рlataformatec/devise. [Електронний ресурс] Режим доступу: 
https://github.com/plataformatec/devise 
7. Ruby on Rails Tutorial. Learn by Example [Електронний ресурс] Режим 
доступу: www.railstutorial.org.  
8. Конструктор інтернет-магазинів [Електронний ресурс] Режим доступу: 
http://skynell.com/promo/shop.php Skynell  
9. Майкл Хартл Ruby on Rails Tutorial. Вивчення Rails на прикладах. 
[Електронний ресурс] Режим доступу: http://railstutorial.uа/ 
10. Advatages of Java at ibm.com. [Електронний ресурс].–  Режим доступу: 
https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/performance/advantage
s_java.html 
11. CSS Flexible Box LАyout Module [Electronic resource] // Офіцйний 
сайт W3C. – Mode of Аccess: https://www.w3.org/TR/css-flexbox-1/. 
12. Dixit S. Аn introduction to the Web Bluetooth АPI [Electronic resource] // 
Dev.operА: OperА SoftwАre АSА. – Mode of Аccess: 
https://dev.operА.com/Аrticles/web-bluetooth-intro/. 
13. Djiraj. JWT Role Based Authorization with Spring Security. 
[Електронний ресурс].–  Режим доступу: https://www.devglan.com/spring-
security/jwt-role-based-authorization 
 Лист 
ЧДТУ. 222079.001 ПЗ 
42 
Змн. Лист № докум. Підпис Дата 
 
14. Golovko O. V. FormulАtion of the Problem of MАximum Clique 
DeterminАtion in Non-Oriented GrАphs. InternАtionАl JournАl of Engineering & 
Technology. Vol. 7, no. 4.3 (2018): SpeciАl Issue 3. P. 293–297. 
15. Introduction to Web Technologies for FrontPАge Users [Electronic 
resource] // Офіційний ресурс MSDN. – Mode of Аccess: https 
https://msdn.microsoft.com/en-us/librАry/office/АА218647(v=office.11).Аspx. 
16. JАckson B. 100+ Аwesome Development Tools Аnd Resources / BriАn 
JАckson // Офіційний сайт keycdn [Electronic resource]. – Mode of Аccess: 
https://www.keycdn.com/blog/web-development-tools/. 
17. Listrovoy S. V. Development of method of definition mАximum clique in 
А nonoriented grАph. EАsternEuropeАn JournАl of Enterprise Technologies. 2018. 
Vol. 5, № 4 (89). – P. 12–17. EID: 2-s2.0-85032585697. 
18. Michael Hartl. Ruby on Rails Tutorial (Addison-Wesley Professional 
Ruby Series) 6th Edition. - Amazon.com Services LLC, 2018. – 208 с. 
19. MVC Design Pattern – JournalDev. [Електронний ресурс].–  Режим 
доступу: https://www.journaldev.com/16974/mvc-design-pattern 
20. MVC Pattern -Anshul vyas - Medium. [Електронний ресурс].–  Режим 
доступу: https://medium.com/@anshul.vyas380/mvc-pattern-3b5366e60ce4 
21. MАnifesto for Аgile SoftwАre Development [електронний ресурс] // 
Веб-портал АgilemАnifesto.org. – Режим доступу: http://www.АgilemАnifesto.org/ 
22. PostgreSQL : About. [Електронний ресурс].–  Режим доступу: 
https://www.postgresql.org/about/ 
23. Programming Ruby 1.9 (3rd edition): The Pragmatic Programmers' Guide, 
Dave Thomas, Chad Fowler, Andy Hunt, 2019  
24. Scrum | Digital Humanities LAB at CVCE powered by uni.lu. 
[Електронний ресурс].– Режим доступу: https://cvcedhlab.hypotheses.org/tag/scrum 
25. Spring | Home. [Електронний ресурс].–  Режим доступу: 
https://spring.io/ 
26. Timothy M. O'Brien "Jakarta Commons Cookbook". O'Reilly; ISBN 0-
596-00706-X 
 Лист 
ЧДТУ. 222079.001 ПЗ 
43 
Змн. Лист № докум. Підпис Дата 
 
27. Topical Guide | Spring Security Architecture. [Електронний ресурс].–  
Режим доступу: https://spring.io/guides/topicals/spring-security-architecture 
28. Website security – Learn web development | MDN. [Електронний 
ресурс].–  Режим доступу: https://developer.mozilla.org/en-US/docs/Learn/Server-
side/First_steps/Website_security 
29. What is REST – Learn to create timeless REST APIs. [Електронний 
ресурс].–  Режим доступу: https://restfulapi.net/ 
30. Бегг К. Бази даних. Проектування, реалізація і супровід. Теорія та 
практика / К. Бегг, Т. Конноллі. – 2003. – 1238 с. 
31. Берюх И. С. Вибір технології розробки програмного забезпечення 
інформаційних систем. ScienceRise. Харків, 2018. № 5/2. С. 40–43 
32. Брюс У. Javaсервлети і JSP. Збірник рецептів. [Текст] / У. Брюс. — 
Львів, Захід-Прес, 2009 — 768 с. 
33. Васильєв Н. Об'єктно-орієнтоване програмування. [Текст] / Н. 
Васильєв. — К. Львів: «Афіша», 2011 — 400 с. 
34. Вендров А. М. Сучасні технології створення програмного 
забезпечення [Електронний ресурс] / А. М. Вендров // Портал “CITFORUM”. – 
Режим доступа: http://citforum.ru/progrАmming/ 
АpplicАtion/progrАm/index.shtml#v 
35. Вольфсон Б. Гнучкі методології розробки [Електронний ресурс] / Б. 
Вольфсон // Електронна бібліотека Аdm-lib.ru. – Режим доступа: http://Аdm-
lib.ru/books/10/Gibkie-metodologii.pdf  
 Лист 
ЧДТУ. 222079.001 ПЗ 
44 
Змн. Лист № докум. Підпис Дата 
 
ДОДАТОК А 
Специфікація 
Позначення Найменування Примітка 
 Документація  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 Лист 
ЧДТУ. 222079.001 ПЗ 
45 
Змн. Лист № докум. Підпис Дата 
 
ДОДАТОК Б 
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
АВТОМАТИЗОВАНА СИСТЕМА РОБОТИ ІНТЕРЕНТ-МАГАЗИНУ 
ДРІБНООПТОВОЇ ТОРГІВЛІ ПРОМИСЛОВИМИ ТОВАРАМИ 
Лістинг програми 
 
 
UA.ЧДТУ.222079-01 12 01 
 
 
Листів 21 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2022 
 Лист 
ЧДТУ. 222079.001 ПЗ 
46 
Змн. Лист № докум. Підпис Дата 
 
class GoodsController < ApplicationController 
  before_filter :authenticate_user!, except: :add_picture_from_device 
  #, only: [:index, :create,:show,:add_picture,:add_to_cart,:show_cart,:empty_cart,:delete_cart_entry] 
  before_filter :set_current_user, only: :add_to_cart 
  skip_before_filter  :verify_authenticity_token 
 
  def index 
    @basket=Basket.find(@session_basket_id) unless @session_basket_id.nil? 
    self.current_folder=DirFolder.find(params[:folder_id]) 
    if self.current_folder.has_children? 
      @folders=self.current_folder.children 
      render :folders_list, layout: false 
    else 
      @goods=DirGood.available_goods_at_folder(params[:folder_id]) 
      if params[:work_type]=='admin' 
        render '/admin/admin_goods_list', layout: false 
      else 
        render :goods_list, layout: false 
      end 
    end 
  end 
    if !match_found 
      basket_item = BasketItem.new 
      basket_item.basket_id = @basket.id 
      @good = DirGood.find(params[:good_id]) 
      #@good.amount = @good.amount-params[:amount].to_i 
      #@good.save 
      basket_item.dir_good = @good 
      basket_item.amount = params[:amount] 
      basket_item.item_add_time = Time.now 
      basket_item.save 
    end 
    render partial: 'main/shopping_cart', layout: false 
  end 
 
  def show_cart 
    @basket=Basket.find(@session_basket_id) unless @session_basket_id.nil? 
    render partial: 'main/shopping_cart', layout: false 
  end 
 
  def empty_cart 
    @basket=Basket.find(@session_basket_id) unless @session_basket_id.nil? 
    BasketItem.delete_all(basket_id: @basket.id) 
    @basket.reload 
    #$basket.calculate_cart_total 
    render partial: 'main/shopping_cart', layout: false 
  end 
 Лист 
ЧДТУ. 222079.001 ПЗ 
47 
Змн. Лист № докум. Підпис Дата 
 
 
  def delete_cart_entry 
    @basket=Basket.find(@session_basket_id) unless @session_basket_id.nil? 
    BasketItem.delete(params[:cart_item_id]) 
    @basket.reload 
    #$basket.calculate_cart_total 
    render partial: 'main/shopping_cart', layout: false 
  end 
end 
 
 
class MainController < ApplicationController 
  def index 
    @basket=Basket.find(@session_basket_id) unless @session_basket_id.nil? 
  end 
end 
 
class BasketController < ApplicationController 
  before_filter :authenticate_user!, only: [:index,:update_cart,:make_order] 
  before_filter :set_current_user, only: :make_order 
  skip_before_filter  :verify_authenticity_token 
 
  def index 
    @basket=Basket.find(@session_basket_id) unless @session_basket_id.nil? 
    render 'index', layout: false 
  end 
 
  def update_cart 
    @basket=Basket.find(@session_basket_id) unless @session_basket_id.nil? 
    @basket.basket_items.all.each do |basket_item| 
      if basket_item.amount!=params[basket_item.id.to_s] 
        basket_item.amount = params[basket_item.id.to_s].to_i 
        basket_item.save 
      end 
    end 
    render 'index', layout: false 
  end 
 
  def make_order 
    @basket=Basket.find(@session_basket_id) unless @session_basket_id.nil? 
    @basket.ordered = true 
    @basket.order_time = Time.now 
    @basket.order_number = Basket.maximum("order_number")+1 rescue 1 
    @basket.save 
    self.session_basket_id = nil 
#    OrderMailer.order_confirmation_email(current_user,@basket).deliver 
    redirect_to root_path, flash: {order_completed: 'Ваше замовлення прийнято і на Вашу адресу 
 Лист 
ЧДТУ. 222079.001 ПЗ 
48 
Змн. Лист № докум. Підпис Дата 
 
надіслано електронний лист підтвердження. Наш менеджер сконтактує з Вами впродовж доби. Ви 
можете продовжити роботу, створивши нове замовлення'} 
  end 
end 
 
class AdminController < ApplicationController 
  before_filter :authenticate_user! 
  skip_before_filter  :verify_authenticity_token 
 
  def index 
    authorize! :administer, :shop 
    @folder_tree_ajax_function_name='loadAdminFolderContent' 
    @orders=Basket.current_orders 
    @current_header = (params[:message].nil?)?'Товари':params[:message] 
    @non_confirmed_users = User.not_confirmed 
  end 
 
  def input_goods_data 
    authorize! :administer, :shop 
    uploaded_io = params[:xlsx] 
 
    File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file| 
      file.write(uploaded_io.read) 
    end 
 
    file_path = Rails.root.join('public', 'uploads', uploaded_io.original_filename) 
    require 'roo' 
    excelx_file=Roo::Excel.new(file_path.to_s) 
    excelx_file.default_sheet = excelx_file.sheets.first 
 
    @input_goods = Hash.new 
    goods = Hash.new 
    DirGood.all.each do |good| 
      goods[good.good_code.strip] = good 
    end 
    folders = DirFolder.folders 
#    DirGood.update_all("available=false") 
    3.upto(excelx_file.last_row) do |line| 
      if ((true if Float(excelx_file.cell(line,'B').to_s.strip[0]) rescue false)&&(true if 
Float(excelx_file.cell(line,'S').to_s.strip) rescue false)) 
        good_article = excelx_file.cell(line,'B').to_s.strip 
        good_name = excelx_file.cell(line,'A') 
        if ((good=goods[good_article])==nil) 
          if (good_name.to_s!='') 
            good_wholesale_price = excelx_file.cell(line,'S') 
            @input_goods[excelx_file.cell(line,'B').to_s.strip] = [good_name, good_wholesale_price] 
            good = DirGood.new 
 Лист 
ЧДТУ. 222079.001 ПЗ 
49 
Змн. Лист № докум. Підпис Дата 
 
            good.good_code = good_article 
            good.name = good_name 
            good.wholesale_price = good_wholesale_price 
            good.dir_folder_id = find_folder_id(folders, good_article) 
            good.web_site_valid = true 
            good.new_good = true 
            good.new_good_input_date = Time.now 
            good.available = true 
            good.save 
          end 
        else 
          if (good_name.to_s=='') 
            good.available = false 
            good.name = good_name.to_s 
            good.save 
          else 
            if ((good.wholesale_price-excelx_file.cell(line,'S').to_f).abs>0.005) 
              good.wholesale_price = excelx_file.cell(line,'S').to_f 
              good.available = true 
              good.save 
            end 
            if (good_name!=good.name) 
              good.name = good_name 
              good.new_good = true 
              good.new_good_input_date = Time.now 
              good.available = true 
              good.save 
            end 
          end 
          goods.delete(good_article) 
        end 
      end 
    end 
    goods.each do |a_code, a_good| 
      if (a_good.available) 
        a_good.available = false 
        a_good.save 
      end 
    end 
    @input_goods = @input_goods.sort 
    @current_header = 'Товари, яких немає в базі даних інтернет-магазину' 
    @orders=Basket.current_orders 
    @non_confirmed_users = User.not_confirmed 
    #render :input_goods_data, layout: false 
  end 
 
  def add_dir_goods 
 Лист 
ЧДТУ. 222079.001 ПЗ 
50 
Змн. Лист № докум. Підпис Дата 
 
    authorize! :administer, :shop 
    params.each do |article,site_valid| 
      if site_valid=='on' 
        good = DirGood.good_by_article(article)[0] 
        good.web_site_valid = false 
        good.save 
      end 
    end 
    @orders = Basket.current_orders 
    @non_confirmed_users = User.not_confirmed 
  end 
 
  def show_order 
    authorize! :administer, :shop 
    @orders = Basket.current_orders 
    @non_confirmed_users = User.not_confirmed 
    @order = Basket.find(params[:order_id]) 
    @current_header = "Замовлення № #{@order.order_number}-
#{@order.order_time.strftime("%d-%m-%y")}: #{@order.user.name}"<<((@order.user.company.nil?)?'':", 
#{@order.user.company}") 
  end 
 
  def close_order 
    authorize! :administer, :shop 
    order = Basket.find(params[:order_id]) 
    if (params[:act]=='supplied') 
      order.supplied=true 
      @message = 'Замовлення виконано' 
    end 
    if (params[:act]=='canceled') 
      order.canceled=true 
      @message = 'Замовлення скасовано' 
    end 
    order.save 
    redirect_to action: "index", message: @message 
  end 
 
  def print_order 
    authorize! :administer, :shop 
    @order = Basket.find(params[:order_id]) 
    if !params[:in_process].nil? 
      @order.in_process=true 
      @order.save 
    end 
    render layout:false 
  end 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
51 
Змн. Лист № докум. Підпис Дата 
 
  def confirm_user 
    authorize! :administer, :shop 
    user = User.find(params[:user_id]) 
    user.confirmed = true 
    user.save 
    @non_confirmed_users = User.not_confirmed 
    render partial: 'admin_right_panel_users', layout: false 
  end 
 
  def add_picture 
    authorize! :administer, :shop 
    @good=DirGood.find(params[:id]) 
    @good.update_attributes(params[:dir_good]) 
    render :good_crop, layout: false 
  end 
 
  def crop_picture 
    authorize! :administer, :shop 
    @good=DirGood.find(params[:id]) 
    @good.crop_x = params[:crop_x] 
    @good.crop_y = params[:crop_y] 
    @good.crop_w = params[:crop_w] 
    @good.crop_h = params[:crop_h] 
    @good.update_attributes(:picture) 
    @goods=DirGood.where("dir_folder_id = ?",self.current_folder.id) 
    render :admin_goods_list, layout: false 
  end 
 
  private 
  def find_folder_id (folders, good_article) 
    folders_local = folders 
    codes_ar = article_to_folder_codes_array(good_article) 
    if (codes_ar.size < 2) 
      return 0 
    end 
    match_folder = nil 
    codes_ar.each do |article_number| 
      match_folder = search_in_folders_for_code(folders_local, article_number) 
      begin 
        folders_local = match_folder.children 
      rescue 
        return 0 
      end 
    end 
    return match_folder.id 
  end 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
52 
Змн. Лист № докум. Підпис Дата 
 
  def article_to_folder_codes_array(good_article) 
    s_ar = good_article.split('.') 
    s_ar.delete_at(s_ar.size-1) 
    return s_ar 
  end 
 
  def search_in_folders_for_code(folders, article_number) 
    if folders.nil? 
      return nil 
    end 
    folders.each do |folder| 
       if (folder.code==article_number.to_i) 
         return folder; 
       end 
    end 
    return nil; 
  end 
end 
 
class Basket < ActiveRecord::Base 
  belongs_to :user 
  has_many :basket_items 
  #belongs_to :temporary_user 
  attr_accessible :cancellation_time, :canceled, :order_time, :ordered, :supplied, :order_number, 
:in_process 
 
  scope :current_orders, where(ordered: true, canceled:false, supplied: false) 
 
  def calculate_cart_total 
    reload rescue nil 
    basket_items.sum{|item| 
      item.dir_good.wholesale_price*item.amount 
    } 
  end 
end 
 
class BasketItem < ActiveRecord::Base 
  belongs_to :dir_good 
  belongs_to :basket 
  attr_accessible :amount, :item_add_time 
end 
 
class User < ActiveRecord::Base 
  has_and_belongs_to_many :roles 
  # Include default devise modules. Others available are: 
  # :confirmable, :lockable, :timeoutable and :omniauthable 
  devise :database_authenticatable, :registerable, 
 Лист 
ЧДТУ. 222079.001 ПЗ 
53 
Змн. Лист № докум. Підпис Дата 
 
         :recoverable, :rememberable, :trackable, :validatable 
 
  # Setup accessible (or protected) attributes for your model 
  attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :company, 
:phone, :role_ids, :confirmed 
  # attr_accessible :title, :body 
  scope :not_confirmed, where('confirmed=false') 
 
  def role?(role) 
    return !!self.roles.find_by_name(role.to_s.camelize) 
  end 
 
  def active_for_authentication? 
    super && self.confirmed 
  end 
end 
 
class Role < ActiveRecord::Base 
  has_and_belongs_to_many :users 
  attr_accessible :name 
end 
 
index.haml 
.top 
  %h1 
    Кошик 
.middle 
  %form#update_cart_form{action: "basket/update_cart", method: "post"} 
    %table.cart 
      %tbody 
        %tr 
          %th Зображення 
          %th Назва 
          %th Кількість 
          %th Ціна 
          %th Всього 
        [email protected]_items.all.each do |cart_item| 
          %tr 
            %td 
              =link_to "#", :onclick => "showGood(#{cart_item.dir_good.id});" do 
                %img{alt: cart_item.dir_good.name, src: cart_item.dir_good.picture(:thumb), title: 
cart_item.dir_good.name} 
            %td 
              =link_to cart_item.dir_good.name, "#", :onclick => 
"showGood(#{cart_item.dir_good.id});" 
            %td 
              %input{name: cart_item.id, size: "3", type: "text", value: cart_item.amount}/ 
 Лист 
ЧДТУ. 222079.001 ПЗ 
54 
Змн. Лист № докум. Підпис Дата 
 
            %td 
              %nobr 
                =cart_item.dir_good.wholesale_price 
                грн 
            %td 
              %nobr 
                =cart_item.dir_good.wholesale_price*cart_item.amount 
                грн 
    %div{style: "width: 100%; display: inline-block;"} 
      %table{style: "float: right; display: inline-block;"} 
        %tbody 
          %tr 
            %td{align: "right"} 
              %b Разом: 
            %td{align: "right"} 
              [email protected]_cart_total 
              грн 
      %br/ 
    .buttons 
      %table 
        %tbody 
          %tr 
            %td{align: "left"} 
              %a.button{onclick: "updateCart();"} 
                %span Оновити 
            %td{align: "center"} 
              %a.button{onclick: "location = '/'"} 
                %span Додати інші товари 
            %td{align: "right"} 
              %a.button{onclick: "location = 'basket/make_order'"} 
                %span Оформити 
 
folders_list.haml 
.top 
  %h1 
    =@current_folder.name 
.List 
  - @folders.each do |folder| 
    .ListItem 
      %p.ProductImage 
        =link_to "#", :onclick => "loadFolderContent(#{folder.id});"  do 
          %img{alt: folder.name, src: "/images/evrika_logo.png", title: folder.name} 
      %p.ProductTitle 
        =link_to folder.name, '#', :onclick => "loadFolderContent(#{folder.id});" 
  .Clear 
 
goods_list.haml 
 Лист 
ЧДТУ. 222079.001 ПЗ 
55 
Змн. Лист № докум. Підпис Дата 
 
.top 
  %h1 
    =@current_folder.name 
.List 
  - @goods.each do |good| 
    .ListItem 
      %p.ProductImage 
        =link_to "#", :onclick => "showGood(#{good.id});" do 
          %img{alt: good.name, src: good.picture(:small), title: good.name, onError: 
"this.src='/images/small/missing.png';"} 
      %p.ProductTitle 
        =link_to good.name, "#", :onclick => "showGood(#{good.id});" 
      %p.ProductPrice 
        = good.wholesale_price 
        грн 
  .Clear 
 
application.haml 
!!! Strict 
%html{dir: "ltr", lang: "ru", "xml:lang" => "ru", xmlns: "http://www.w3.org/1999/xhtml"} 
  %head 
    %title Інтернет-магазин  
    =stylesheet_link_tag 'stylesheet' 
    =stylesheet_link_tag 'pwin' 
    =stylesheet_link_tag 'magnific-popup.css' 
    =stylesheet_link_tag 'folders_menu' 
    =stylesheet_link_tag 'jquery.Jcrop.min.css' 
    =javascript_include_tag 'jquery-1.9.1.min.js' 
    =javascript_include_tag 'jquery.form.js' 
    =javascript_include_tag 'scriptbreaker-multiple-accordion-1' 
    =javascript_include_tag 'folders_menu' 
    =javascript_include_tag 'jquery.magnific-popup.js' 
    =javascript_include_tag 'jquery.validity.min.js' 
    =javascript_include_tag 'jquery.Jcrop.min.js' 
    =yield(:head) 
    %script{:type=>"text/javascript"} 
      :plain 
        $(document).ready(function() { 
          $(".topnav").accordion({ 
          accordion:false, 
          speed: 500, 
          closedSign: '[+]', 
          openedSign: '[-]' 
          }); 
          $('.image-link').magnificPopup({type:'image', mainClass: 'mfp-with-zoom mfp-img-mobile'}); 
        }); 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
56 
Змн. Лист № докум. Підпис Дата 
 
  %body 
    .ContOuter1 
      .ContOuter2 
        #container 
          #header 
            =render partial: 'shared/header' 
          #column_left 
            =render partial: 'shared/navigation' 
          #column_right 
            =yield(:column_right) 
          #content 
            =yield 
          #footer 
            .div1 «Еврика» 2013 
            .div2 
              -#Powered by 
              -#= link_to 'Google', 'www.google.com' 
 
_right_column.haml 
#module_cart.box 
  .top     
    Кошик 
  .middle 
    #shopping_cart{style: "text-align: center;"} 
      =render partial: 'main/shopping_cart' 
.box 
  .top 
    Нові товари 
  .middle 
    %table{cellpadding: "2", cellspacing: "0", style: "width: 100%;"} 
      %tbody 
        -#- @hit_goods.each do |good| 
        -#  %tr 
        -#    %td{style: "width:1px", valign: "top"} 
        -#      %a{href: "http://arkos.ua/index.php?route=product/product&product_id=6872"} 
        -#        %img{alt: good.name, src: good.picture(:thumb)}/ 
        -#    %td{valign: "top"} 
        -#      %p.ProductTitle 
        -#        %a{href: 
"http://arkos1.ua/index.php?route=product/product&product_id=6872"}=good.name 
        -#      %p.ProductPrice 
        -#        =good.price 
        -#        грн 
 
_shopping_cart.haml 
.middle 
  -if @basket && @basket.basket_items.all.size!=0 
 Лист 
ЧДТУ. 222079.001 ПЗ 
57 
Змн. Лист № докум. Підпис Дата 
 
    %table{cellpadding: "2", cellspacing: "0", style: "width: 100%;"} 
      %tbody 
        [email protected]_items.all.each do |cart_item| 
          %tr 
            %td{align: "left", valign: "top", width: "1"} 
              %span.cart_remove{id: cart_item.id, onclick: "deleteCartEntry(#{cart_item.id});"} 
            %td{align: "right", valign: "top", width: "18"} 
              %nobr 
                =cart_item.amount 
                x 
            %td{align: "left", valign: "top"} 
              %a{href: "#", onclick: "showGood(#{cart_item.dir_good.id});"} 
                =cart_item.dir_good.name 
                шт 
            %td{align: "left", valign: "top"} 
              %nobr 
                =cart_item.dir_good.wholesale_price*cart_item.amount 
                грн 
    %br/ 
    %table{align: "right", cellpadding: "0", cellspacing: "0", style: "display:inline-block;"} 
      %tbody 
        %tr 
          %td{align: "right"} 
            %span.cart_module_total 
              %b Разом: 
          %td{align: "right"} 
            %span.cart_module_total 
              [email protected]_cart_total 
              грн 
    %div{style: "padding-top:5px;text-align:center;clear:both;"} 
      =link_to "Проглянути і оформити", "#", :onclick => "showCartFull();" 
    %div{style: "padding-top:5px;text-align:center;clear:both;"} 
      =link_to "Спорожнити кошик", "#", :onclick => "emptyCart();" 
  -else 
    %div 
      Поки що порожній 
 
order_confirmation_email.html.erb 
<h3>Ваше замовлення, оформлене в Інтернет-магазині компанії "", прийнято.</h3> 
<h3>Склад замовлення:</h3> 
<table style="border-spacing: 10px;"> 
  <thead> 
    <tr> 
      <th>Назва товару</th> 
      <th>Кількість</th> 
      <th>Ціна одиниці</th> 
      <th>Вартість</th> 
 Лист 
ЧДТУ. 222079.001 ПЗ 
58 
Змн. Лист № докум. Підпис Дата 
 
    </tr> 
  </thead> 
  <% @basket.basket_items.all.each do |cart_item| -%> 
      <tr> 
        <td><%= cart_item.dir_good.name %></td> 
        <td style="text-align: center;"><%= cart_item.amount %></td> 
        <td style="text-align: right;"><%= cart_item.dir_good.wholesale_price %> грн</td> 
        <td style="text-align: right;"><%= cart_item.dir_good.wholesale_price*cart_item.amount %> 
грн</td> 
      </tr> 
  <% end -%> 
  <tr> 
    <td style="font-weight: bold;">Всього:</td><td></td><td></td><td style="font-weight: bold; 
text-align: right;"><%= @basket.calculate_cart_total %> грн</td> 
  </tr> 
</table> 
 
_admin_right_panel.haml 
#module_admin_right_panel.box 
  .top 
    Синхронізувати товари 
  .middle 
    %div{style: "text-align: center;"} Завантаживши xls файл, можна синхронізувати інформацію 
про наявність товарів з системою Anthex 
    %div{style: "text-align: center;"} 
      = form_tag({action: "input_goods_data"}, multipart: true, id: 'input_goods_form', style: "max-
width: 60px; word-wrap : break-word;") do 
        =file_field_tag 'xlsx' 
        =submit_tag (value="Ввести дані з файлу"), :class => "button" 
        -#%button{onclick: 'inputGoodsData();'} 
        -#  %span Ввести дані з файлу 
  =render partial: '/admin/admin_right_panel_users' 
  .top 
    Наявні замовлення 
  .middle 
    %table{cellpadding: "2", cellspacing: "0", style: "width: 100%;"} 
      %tbody 
        - @orders.each do |order| 
          %tr 
            %td{style: "max-width: 60px; word-wrap : break-word;", valign: "top"} 
              =link_to "#{order.user.name}", "/admin/show_order?order_id=#{order.id}" 
              %br 
              =link_to "#{order.user.company}", "/admin/show_order?order_id=#{order.id}" 
            %td{valign: "top"} 
              %nobr 
                =order.order_time.strftime('%d/%m/%y %H:%M') 
            %td{valign: "top"} 
 Лист 
ЧДТУ. 222079.001 ПЗ 
59 
Змн. Лист № докум. Підпис Дата 
 
              %nobr{style: "margin-left: 2px"} 
                =order.calculate_cart_total 
                грн 
 
show_order.haml 
= content_for :column_right do 
  =render partial: 'admin_right_panel' 
 
.top 
  %h1 Сторінка роботи менеджера Інтернет-магазину «Еврика» 
.topTitle 
  %h1 
    =@current_header 
.middle 
  %div{style:"font-size: 14px"} 
    Ім'я: 
    [email protected] 
    %br 
    Організація: 
    [email protected] 
    %br 
    Телефон: 
    [email protected] 
    %br 
    Електронна пошта: 
    [email protected] 
    %br 
    Дата і час замовлення: 
    [email protected]_time.strftime('%d/%m/%y %H:%M') 
    %br 
    Загальна сума замовлення: 
    [email protected]_cart_total 
    грн 
  %br 
  %div 
    %table.cart 
      %tbody 
        %tr 
          %th Назва 
          %th Артикул 
          %th Ціна 
          %th Кількість 
          %th Сума 
        [email protected]_items.all.each do |order_item| 
          %tr 
            %td{align: "left", valign: "top"} 
              =order_item.dir_good.name 
 Лист 
ЧДТУ. 222079.001 ПЗ 
60 
Змн. Лист № докум. Підпис Дата 
 
            %td{align: "left", valign: "top"} 
              =order_item.dir_good.good_code 
            %td{align: "left", valign: "top"} 
              =order_item.dir_good.wholesale_price 
            %td{align: "left", valign: "top", width: "18"} 
              %nobr 
                =order_item.amount 
                шт 
            %td{align: "left", valign: "top"} 
              %nobr 
                =order_item.dir_good.wholesale_price*order_item.amount 
                грн 
 
    %table 
      %tbody 
        %tr 
          %td{align: "center"} 
            %form#set_order_supplied{action: "/admin/close_order", method: "post"} 
              %input{name: "order_id", type: "hidden", value: @order.id}/ 
              %input{name: "act", type: "hidden", value: 'supplied'}/ 
              =submit_tag (value='Замовлення виконано'), :class => "button" 
          %td{align: "center"} 
            %form#print_order{action: "/admin/print_order.pdf", method: "post", :target=>"_blank"} 
              %input{name: "order_id", type: "hidden", value: @order.id}/ 
              =submit_tag ('Надрукувати замовлення'), :class => "button" 
              %br 
              %input{name: "in_process", type: "checkbox", checked: true} 
              Відмітити як запущене в роботу 
          %td{align: "center"} 
            %form#set_order_canceled{action: "/admin/close_order", method: "post"} 
              %input{name: "order_id", type: "hidden", value: @order.id}/ 
              %input{name: "act", type: "hidden", value: 'canceled'}/ 
              =submit_tag ('Скасувати замовлення'), :class => "button" 
 
            -#%td{align: "left", valign: "top", width: "1"} 
            -#  %span.cart_remove{id: order_item.id, onclick: "deleteCartEntry(#{cart_item.id});"} 
 
_admin_right_panel_users.haml 
#admin_right_panel_users 
  .top 
    Підтвердити клієнта 
  .middle 
    %table{cellpadding: "2", cellspacing: "0", style: "width: 100%;"} 
      %tbody 
        - @non_confirmed_users.each do |user| 
          %tr 
            %td{style: "max-width: 100px; word-wrap : break-word;", valign: "top"} 
 Лист 
ЧДТУ. 222079.001 ПЗ 
61 
Змн. Лист № докум. Підпис Дата 
 
              =user.name 
              %br 
              =user.company 
            %td{valign: "top"} 
              %nobr 
                =user.created_at.strftime('%d/%m/%y') 
            %td{style: "max-width: 60px; word-wrap : break-word;", valign: "top"} 
              =link_to "ОК", "#", :onclick => "confirmUser(#{user.id});" 
 
/devise/new.html.haml 
%h2{style: "font-size: 22px;"} Реєстрація 
= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| 
  = devise_error_messages! 
  %div 
    = f.label :name, "Ім'я" 
    %br/ 
    = f.text_field :name, :autofocus => true 
  %div 
    = f.label :company, 'Організація' 
    %br/ 
    = f.text_field :company 
  %div 
    = f.label :phone, 'Контактний телефон' 
    %br/ 
    = f.text_field :phone 
  %div 
    = f.label :email, 'Адреса електронної пошти' 
    %br/ 
    = f.email_field :email 
  %div 
    = f.label :password, 'Пароль' 
    %br/ 
    = f.password_field :password 
  %div 
    = f.label :password_confirmation, 'Підтвердження паролю' 
    %br/ 
    = f.password_field :password_confirmation 
  %div= f.submit "Зареєструватись", :class => 'button' 
= render "devise/shared/links" 
 
/devise/edit.html.haml 
%h2 
  Редагувати #{resource_name.to_s.humanize} 
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { 
:method => :put }) do |f| 
  = devise_error_messages! 
  %div 
 Лист 
ЧДТУ. 222079.001 ПЗ 
62 
Змн. Лист № докум. Підпис Дата 
 
    = f.label :email 
    %br/ 
    = f.email_field :email, :autofocus => true 
  - if devise_mapping.confirmable? && resource.pending_reconfirmation? 
    %div 
      Currently waiting confirmation for: #{resource.unconfirmed_email} 
  %div 
    = f.label :password 
    %i (залиште порожнім, якщо не бажаєте змінювати) 
    %br/ 
    = f.password_field :password, :autocomplete => "off" 
  %div 
    = f.label :password_confirmation 
    %br/ 
    = f.password_field :password_confirmation 
  %div 
    = f.label :current_password 
    %i (введіть поточний пароль для підтвердження внесення змін) 
    %br/ 
    = f.password_field :current_password 
  %div= f.submit "Update", :class => 'button' 
%h3 Cancel my account 
%p 
  Unhappy? #{button_to "Cancel my account", registration_path(resource_name), :data => { 
:confirm => "Are you sure?" }, :method => :delete} 
= link_to "Back", :back 
 
folders_menu.js 
function loadFolderContent(folderId){ 
    var  work_type = "user"; 
    if ($(location).attr("pathname").indexOf("admin") != -1) 
        work_type = "admin"; 
    $.get("/goods", {folder_id:folderId, work_type:work_type}, function(data){ 
        $('#content').html(data); 
    }); 
} 
 
function showGood(goodId){ 
    $.get("goods/"+goodId, function(data){ 
        $('#content').html(data); 
        $('.image-link').magnificPopup({ 
            type: 'image' 
        }); 
    }); 
} 
 
//picture 
 Лист 
ЧДТУ. 222079.001 ПЗ 
63 
Змн. Лист № докум. Підпис Дата 
 
function uploadPhoto(form_id){ 
    $("#"+form_id).ajaxSubmit(function(data){ 
        $('#content').html(data); 
        startSelectCropArea(); 
    }); 
} 
 
function cropImage(){ 
    $("#crop_form").ajaxSubmit(function(data){ 
        $('#content').html(data); 
    }); 
 
} 
 
function update_crop(coords){ 
  $('#crop_x').val(coords.x); 
  $('#crop_y').val(coords.y); 
  $('#crop_w').val(coords.w); 
  $('#crop_h').val(coords.h); 
} 
 
function startSelectCropArea(){ 
    $('#cropbox').Jcrop({ 
        onChange: update_crop, 
        onSelect: update_crop, 
        setSelect: [0,0,250,250], 
        aspectRatio: 1 
    }); 
} 
//--------------------- 
 
function addToCart(){ 
    if (validateGoodItemNumber()){ 
        $("#add_to_cart_form").ajaxSubmit(function(data){ 
            $('#shopping_cart').html(data); 
        }); 
    } 
    else { 
        alert('В полі "Кількість" потрібно ввести додатне число'); 
    } 
//    $.get("goods/show_cart", function(data){ 
//        $('#shopping_cart').html(data); 
//    }); 
} 
function addToCartByEnter(event){ 
    if (event.keyCode==13){ 
        if (validateGoodItemNumber()){ 
 Лист 
ЧДТУ. 222079.001 ПЗ 
64 
Змн. Лист № докум. Підпис Дата 
 
            $("#update_cart_form").ajaxSubmit(function(data){ 
                $('#content').html(data); 
            }); 
            $.get("goods/show_cart", function(data){ 
                $('#shopping_cart').html(data); 
            }); 
        } 
        else { 
            alert('В полі "Кількість" потрібно ввести додатне число'); 
        } 
 
    } 
} 
 
function updateCart(){ 
    if (validateGoodItemNumber()){ 
        $("#update_cart_form").ajaxSubmit(function(data){ 
            $('#content').html(data); 
        }); 
        $.get("goods/show_cart", function(data){ 
            $('#shopping_cart').html(data); 
        }); 
    } 
    else { 
        alert('В полі "Кількість" потрібно ввести додатне число'); 
    } 
} 
 
function emptyCart(){ 
    $.get("goods/empty_cart", function(data){ 
        $('#shopping_cart').html(data); 
    }); 
} 
 
function deleteCartEntry(cartItemId){ 
    $.get("goods/delete_cart_entry", {cart_item_id:cartItemId},function(data){ 
        $('#shopping_cart').html(data); 
    }); 
} 
 
function showCartFull(){ 
    $.get("basket", function(data){ 
        $('#content').html(data); 
    }); 
} 
 
function inputGoodsData(){ 
 Лист 
ЧДТУ. 222079.001 ПЗ 
65 
Змн. Лист № докум. Підпис Дата 
 
    $("#input_goods_form").ajaxSubmit(function(data){ 
        $('#admin_content').html(data); 
    }); 
} 
 
function confirmUser(userId){ 
    $.post("/admin/confirm_user", {user_id:userId}, function(data){ 
        $('#admin_right_panel_users').html(data); 
    }); 
} 
 
//Validators 
function validateGoodItemNumber() { 
    $.validity.start(); 
    $("input") 
        .require() 
        .match("number") 
        .greaterThan(0); 
    var result = $.validity.end(); 
    return result.valid; 
} 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
66 
Змн. Лист № докум. Підпис Дата 
 
ДОДАТОК В 
Інструкція користувача 
1 Призначення програми 
Інтернет-магазин дрібнооптової торгівлі промисловими товарами дає 
можливість компанії, яка займається дрібнооптовою торгівлею, ефективно 
організувати продажі певному колу замовників (покупців). Додаток складається з 
бази даних MySQL та веб-програми.  
Програма складається з двох частин – клієнтської та адміністративної. 
Клієнтська частина програми дає можливість клієнту, який не увійшов у 
систему:  
– переглядати рубрики та підрубрики; 
– реєструватися у системі (увійти в систему він може лише після 
наступного схвалення адміністратором); 
– увійти в систему ("залогінитись"), якщо клієнт зареєструвався в 
системі і адміністратор поставив для нього допуск до системи. 
Клієнтська частина програми дає можливість клієнту, який увійшов у 
систему:  
– переглядати каталог товарів, наявних на даний час, для кожної 
рубрики і підрубрики із зазначенням повної назви товару, ціни, а також 
фотографії товару; 
– переглядати фото товару у збільшеному розмірі; 
– вибирати товар у корзину для купівлі із зазначенням кількості 
товару; 
– бачити перелік товарів, доданих до корзини, з кількістю та вартістю 
кожної одиниці товару; 
– бачити загальну вартість товарів, доданих до корзини; 
– видаляти товари з корзини; 
– переглядати корзину у вигляді таблиці з фотографією невеликого 
розміру, назвою, ціною, вартістю; 
– змінювати кількість одиниць вибраного товару при перегляді 
 Лист 
ЧДТУ. 222079.001 ПЗ 
67 
Змн. Лист № докум. Підпис Дата 
 
корзини у вигляді таблиці; 
– оформлювати покупку; 
– одержувати повідомлення про оформлену покупку електронною 
поштою. 
Адміністративна частина програми дає можливість менеджеру фірми, 
який увійшов у систему з використанням адміністративного логіну:  
– переглядати повний каталог товарів для кожної рубрики і 
підрубрики із зазначенням повної назви товару, артикулу, ціни, а також 
фотографії товару; 
– додавати фото товару; 
– імпортувати дані про наявні товари та їх ціни з файлу MS Excel; 
– підтверджувати права на роботу з інтернет-магазином для 
користувачів, які зареєструвались у системі; 
– переглядати зроблені клієнтами замовлення; 
– друкувати реквізити замовлення, включаючи список товарів з їх 
реквізитами; 
– відмічати замовлення як такі, що знаходяться в роботі або вже 
виконані. 
2 Умови виконання програми. Запуск програми  
Додаток складається з двох частин – shop.sql та файлу веб-програми shop. 
Дана програма написана на мові Ruby з використанням фреймворку Rails, 
що дає можливість запустити її на комп'ютерах з різними платформами. Для 
роботи вона потребує наступного встановленого на комп'ютері програмного 
забезпечення: 
– Ruby 2.0; 
– Rails 3.2.13; 
– SQL-сервер MySQL версії не нижче 5.1; 
– веб-сервер Passenger або аналогічний.  
Для запуску програми потрібно виконати наступні дії: 
– створити MySQL базу даних, використовуючи скрипт shop.sql; 
 Лист 
ЧДТУ. 222079.001 ПЗ 
68 
Змн. Лист № докум. Підпис Дата 
 
– задеплоїти проект, яких поставляється у вигляді папки shop, на сервер, 
зв'язавши його з сервером. 
При виборі технічних характеристик для  нормального функціонування 
проекту, потрібно зауважити, що проект вимагає як мінімум такої конфігурації 
апаратних засобів, що забезпечує функціонування 32 розрядного операційного 
середовища Windows. Архітектура ПЕОМ  повинна мати 512 Mb оперативної 
пам’яті. Для оптимальної роботи процесор повинен бути з частотою  2000Гц або 
вище. Мінімальний розмір вільного простору на твердому диску, необхідний для 
запуску системи – 64MB. 
Доступ до програми користувачем здійснюється з використанням веб-
браузера, в якому користувач повинен набрати адресу сервера, на якому 
встановлено додаток та ім'я програми ishop. 
3 Розгляд основних операцій, які виконуються в програмі  
Для початку роботи з програмою після того, як програму задеплоєно на 
сервері, потрібно завантажити браузер та набрати в рядку адреси адресу проекту, 
наприклад, http://localhost:3000/ishop. Відкривається стартова сторінка, на якій 
будь-який користувач може переглянути, які види товарів продає фірма, 
переглянувши дерево рубрик у лівій частині (рисунок В.1). 
 
Рисунок В.1 – Стартова сторінка програми 
 Лист 
ЧДТУ. 222079.001 ПЗ 
69 
Змн. Лист № докум. Підпис Дата 
 
 Для того, щоб скористатися програмою, потрібно увійти в систему, для 
чого потрібно перейти на сторінку логіну (посилання "Вхід" в правому 
верхньому куті) – на ній можна зайти в програму, ввівши ім'я та пароль (рисунок 
В.2).  
 
Рисунок В.2 – Вхід в програму 
Після цього на екран виводиться стартова сторінка для роботи клієнта – з 
дерева у лівій частині сторінки можна вибрати категорію товару, яка цікавить 
клієнта. При її виборі у центральній частині відображаються усі товари з цієї 
категорії (рисунок В.3). 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
70 
Змн. Лист № докум. Підпис Дата 
 
Рисунок В.3 – Перелік товарів певної категорії 
Потрібно вибрати певний товар, клікнувши на ньому. При цьому з'явиться 
сторінка даного товару (рисунок В.4). 
  
Рисунок В.4 – Сторінка вибраного товару 
На даній сторінці можна продивитись велике зображення товару, а також 
ввести кількість одиниць товару і натиснути кнопку "Додати до кошика" – дана 
кількість товару буде додана до кошика, також буде вирахувана загальна вартість 
даного товару та всіх товарів у кошику (рисунок В.5). 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
71 
Змн. Лист № докум. Підпис Дата 
 
Рисунок В.5 – Додавання вибраного товару до кошика 
В кінці користувач може проглянути весь кошик у табличному вигляді та 
оформити покупку (рисунок В.6). 
 
Рисунок В.6 – Оформлення покупки 
Для того, щоб увійти в адміністративну частину, потрібно набрати 
/administrator в рядку адреси. На сторінці адміністратора перелік товарів має 
інший вигляд (рисунок В.7). 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
72 
Змн. Лист № докум. Підпис Дата 
 
Рисунок В.7 – Стартова сторінка адміністратора 
За допомогою кнопки "Змінити фото" можна змінити фотографію товару. 
На правій панелі можна також побачити розділи "Підтвердити клієнта" і "Наявні 
замовлення". В першому є список клієнтів, які зареєструвалися, але 
адміністратор повинен підтвердити їх, щоб вони могли здійснювати покупки у 
магазині. В панелі "Наявні замовлення" є список тих замовлень, які зробили 
клієнти, але які ще не оброблені. 
 Лист 
ЧДТУ. 222079.001 ПЗ 
73 
Змн. Лист № докум. Підпис Дата 
 
ДОДАТОК Г 
Графічні матеріали  
Постановка задачі проекту 
Додаток повинен складатися з двох частин – клієнтської та 
адміністративної. 
 
Адміністративна частина програми повинна давати можливість 
менеджеру фірми, який увійшов у систему з використанням адміністративного 
логіну:  
 переглядати повний каталог товарів для кожної рубрики і підрубрики із 
зазначенням повної назви товару, артикулу, ціни, а також фотографії товару; 
 додавати фото товару; 
 імпортувати дані про наявні товари та їх ціни з файлу MS Excel; 
 підтверджувати права на роботу з інтернет-магазином для користувачів, 
які зареєструвались у системі; 
 переглядати зроблені клієнтами замовлення; 
 друкувати реквізити замовлення, включаючи список товарів з їх 
реквізитами; 
 відмічати замовлення як такі, що знаходяться в роботі або вже виконані. 
Клієнтська частина програми повинна давати можливість клієнту, який не 
увійшов у систему:  
 – переглядати рубрики та підрубрики; 
 – реєструватися у системі (увійти в систему він може лише після 
наступного схвалення адміністратором); 
 – увійти в систему, якщо клієнт зареєструвався в системі і адміністратор 
поставив для нього допуск до системи. 
Клієнтська частина програми повинна давати можливість клієнту, який 
увійшов у систему:  
 – переглядати каталог товарів, наявних на даний час, для кожної рубрики 
і підрубрики із зазначенням повної назви товару, ціни, а також фотографії 
товару; 
 – переглядати фото товару у збільшеному розмірі; 
 – вибирати товар у корзину для купівлі із зазначенням кількості товару; 
 – бачити перелік товарів, доданих до корзини, з кількістю та вартістю 
кожної одиниці товару; 
 – бачити загальну вартість товарів, доданих до корзини; 
 – видаляти товари з корзини; 
 Лист 
ЧДТУ. 222079.001 ПЗ 
74 
Змн. Лист № докум. Підпис Дата 
 
 – переглядати корзину у вигляді таблиці з фотографією невеликого 
розміру, назвою, ціною, вартістю; 
 – оформлювати покупку; 
 – одержувати повідомлення про оформлену покупку електронною 
поштою.  
 
Використані технології та засоби розробки 
 Мова програмування Ruby  
 Фреймворк Rails  
 Середовище розробки RubyMine 
 Бібліотеки (gem): 
• Devise – аутентифікація користувачів; 
• Cancan – авторизація користувачів; 
• Ancestry – формування дерева; 
• Paperclip – зберігання графічних зображень в проекті. 
Структура бази даних 
 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
75 
Змн. Лист № докум. Підпис Дата 
 
Структура програми 
 
app/  Основний код додатку 
(app), включає моделі, 
представлення, контролери 
і хелпери  
app/assets " Активи" додатку, такі, як 
каскадні таблиці стилів 
(CSS), JavaScript файли та 
зображення  
config/  Конфігурація додатки 
db/ Файли бази даних  
lib/  Бібліотека модулів  
log/  Файли логів додатки  
public/  Публічно доступні дані 
(наприклад , веб- браузерам 
 
), такі як сторінки помилок 
додатки  
Rakefile Службові завдання, 
доступні за допомогою 
rake-команди  
Gemfile Перелік бібліотек (gem). 
необхідних даному додатку  
 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
76 
Змн. Лист № докум. Підпис Дата 
 
Приклад функцій програми  
Клієнтська частина: 
 
Адміністративна частина 
 
 Лист 
ЧДТУ. 222079.001 ПЗ 
77 
Змн. Лист № докум. Підпис Дата