You are on page 1of 57

Національний університет «Львівська політехніка»

Кафедра програмного забезпечення

КУРСОВА РОБОТА
з дисципліни «Бази даних»
на тему:
«База даних для роботи кейтерингової компанії»
Виконала: студентка
спеціальності 121
«Інженерія програмного забезпечення»
групи П3-34
Калюжка Юлія Віталіївна

Керівник:
асистент кафедри програмного забезпечення,
Цимбалюк Т.М.

Оцінка:
Національна шкала___________________
Кількість балів_______Оцінка ECTS____

Члени комісії ____________ Павич Н.Я.


(підпис)

____________ Цимбалюк Т.М.


(підпис)

Львів – 2019 рік


2

ЗМІСТ
РОЗДІЛ 1. ПОСТАНОВКА ЗАДАЧІ ОБЛІКУ РОБОТИ КЕЙТЕРИНГОВОЇ
КОМПАНІЇ...................................................................................................................3
1.1.Опис предметної області...................................................................................3
1.2. Постановка завдання.........................................................................................4
1.3. Специфікація вимог до системи обліку кейтерингової компанії.................6
1.3.1. Вступ 6
1.3.2. Загальний опис 6
1.3.3. Характеристики системи 9
1.3.4. Вимоги зовнішніх інтерфейсів 11
РОЗДІЛ 2. ПРОЕКТУВАННЯ БАЗИ ДАНИХ.......................................................13
2.1. Концептуальне моделювання предметної області.......................................13
2.1.1. Опис сутностей 13
2.1.2. Опис зв’язків між сутностями 20
2.2. Логічне проектування БД...............................................................................21
2.3. Проектування типових запитів і транзакцій.................................................23
РОЗДІЛ 3. РЕАЛІЗАЦІЯ ПРОГРАМНОГО ПРОДУКТУ РОБОТИ З БАЗОЮ
ДАНИХ.......................................................................................................................25
3.1. Реалізація доступу до бази даних..................................................................25
3.2. Реалізація функціональних характеристик системи....................................28
3.2.1. Авторизація 28
3.2.2. Реєстрація працівників 29
3.2.3. Додавання, редагування і видалення інформації про клієнта 31
3.2.4. Оформлення, редагування і видалення замовлення31
3.2.5. Додавання, редагування і видалення страв у меню 33
3.2.6. Підтвердження готовності страви 34
3.2.7. Створення чека для клієнта 34
3.3. Опис роботи програми....................................................................................35
ВИСНОВКИ...............................................................................................................48
СПИСОК ЛІТЕРАТУРИ...........................................................................................49
Додаток А. Скрипт створення БД............................................................................50
3

РОЗДІЛ 1. ПОСТАНОВКА ЗАДАЧІ ОБЛІКУ РОБОТИ


КЕЙТЕРИНГОВОЇ КОМПАНІЇ
1.1. Опис предметної області
Дана предметна область являє собою систему для зберігання даних для
кейтерингової компанії (клієнти, рецепти, декор, теми, замовлення, страви). А
також слугує для автоматизації робочого процесу: від поступлення замовлення
до його доставки.
Процес роботи з розробленою системою для роботи кейтерингової
компанії відбувається в декілька етапів:
1. Реєстрація адміністратора, який контролюватиме весь процес
приготування і поставки замовлень.
2. Занесення в базу даних інформацію про клієнтів.
3. Занесення в базу даних інформації про замовлення.
4. Реєстрація кухара, який матиме змогу створювати страви у меню,
записувати рецепти і готувати замовлення.
5. Занесення в базу даних інформації про меню та рецепти до страв.
6. Занесення в базу даних інформації про приготування замовленої
страви.
7. Реєстрація бухгалтера, який матиме змогу контролювати фінансові
операції в кейтеринговій компанії.
8. Обрахування вартості замовлень.
Дана база даних для роботи кейтерингової компанії дозволяє полегшити
процес створення і виконання замовлення. Дана СУБД дозволяє заносити,
зберігати і змінювати дані в БД. Дана БД може вдосконалюватися і розвиватися,
якщо з'являться нові вимоги у користувачів. Системою керує адміністратор,
який має абсолютно необмежений доступ до всіх операцій з нею, також веде
клієнтську базу і вносить дані по замовленню. Кухар є особою, яка відповідає за
меню, рецепти і контролює процес приготування замовлених страв. Фінансові
операції контролює бухгалтер. Він займається розрахунком вартості замовлення
та контролем транзакцій клієнтів. Кухар може додавати і видаляти страви в
4

меню, редагувати рецепти та змінювати наявні інгредієнти. Адміністратор має


доступ до перегляду всієї інформації про замовлення, контролю роботи
бухгалтера і кухара.
Актуальність даного завдання обумовлена потребою наявності системи
для організації роботи кейтерингових компаній.

1.2. Постановка завдання


Мета створення системи – збільшення ефективності роботи кейтерингової
компанії. Дана система полегшує роботу із процесом обслуговування
замовлення в кейтеринговій компанії.
Інформаційна система повинна бути розроблена на основі сучасних
інформаційних технологій, що означає: використання системи управління
базами даних, яка забезпечує надійну роботу з великими обсягами даних,
високу швидкість доступу до даних, безпеку їх зберігання; можливість роботи в
локальній обчислювальній мережі з необмеженою кількістю робочих місць, що
забезпечує формування бази даних в режимі реального часу; повну інтеграцію
даних, які вводяться в систему, що дозволяє здійснювати всебічний аналіз
діяльності компанії.
Дана база даних буде містити детальну інформацію про весь процес
приготування замовлень, які наявні у компанії. У ній буде міститися інформація
про кухарів, які формують меню, рецепти і контролюють процес приготування,
а також бухгалтерів, які займаються розрахунком вартості замовлення та
контролем транзакцій клієнтів.
Представлена база даних повинна мати такі функціональні можливості:
 містити необхідну інформацію про замовлення;
 забезпечувати зручність для процесу створення нового замовлення;
 забезпечувати можливість швидкого доступу до перегляду стану
приготування замовлення;
 забезпечення зручного і наочного інтерфейсу користувача, який не
має навичок роботи з базами даних;
5

 забезпечення надійного зберігання інформації;


 забезпечувати захист від несанкціонованого доступу
(використовувати паролі і захист на рівні користувачів);
 контролювати надмірність, несуперечливість, збереження і
достовірність інформації, що зберігається в базі даних.
Захист від несанкціонованого доступу здійснюється за допомогою вікна
авторизації, в якому здійснюється вибір користувача системи і введення пароля
для відкриття доступу до бази. Залежно від користувача доступ до даних буде
різним. Якщо до системи звертається:
1) Кухар – здійснює вхід в систему після введення пароля і має змогу
змінювати меню, рецепти, інгредієнти та статус приготування
замовлених страв.
2) Бухгалтер – здійснює вхід в систему після введення пароля і має
доступ до контролю над усіма фінансовими операціями компанії,
зокрема розраховує вартість замовлення та контролює транзакцій
клієнтів.
3) Адміністратор – може здійснити вхід у систему після введення пароля
і має повний доступ до бази даних, веде клієнтську базу і вносить дані
по замовленню має можливість додавати кухарів, бухгалтера та ін.
Бізнес-правила:
 У кожного кухара є страви, що закріплені за ним.
 Бухгалтер має доступ до вартості страв і замовлень.
 У базі даних міститься вся інформація про замовлення.
Бізнес-процеси:
 Кухар змінює статус приготування стави та в кінцевому результаті
змінює статус усього замовлення.
 Бухгалтер розраховує загальну вартість замовлення додаючи вартість
кожної страви, вартість декору.
 Бухгалтер контролює транзакції клієнтів.
 Кухар додає нові рецепти і оновлює меню.
6

 Адміністратор приймає замовлення і вносить дані по замовленню в


таблицю.
 Адміністратор веде клієнтську базу.

Рис.1.1. Діаграма прецедентів

1.3. Специфікація вимог до системи обліку роботи кейтерингової


компанії
1.3.1.Вступ
Призначення даного продукту полягає в автоматизації роботи як
приватного резидента, так і великої кейтерингової компанії, виконанні обліку
замовлень.
Мета даного продукту – надати зручний інтерфейс ведення обліку
замовлень.

1.3.2. Загальний опис


1.3.2.1. Перспективи продукту
Даний продукт не буде популярним як член якогось сімейства продуктів,
оскільки його буде використовувати якась певна фірма для полегшення роботи,
вносячи свої корективи, та підключаючи різні бази даних. Продукт не матиме
комерційного використання, так як він створюється для конкретної компанії.
Продукт буде прямо залежати від БД, в якій міститиметься інформація про
замовлення, меню та клієнтів.
7

1.3.2.2. Характеристика продукту


Основними функціями продукту є:
 Зберігання бази даних, що містить інформацію про меню, рецепти,
замовлення.
 Внесення змін до меню та рецептів.
 Зберігання клієнтської бази.
 Забезпечення простого процесу для обрахунку вартості замовлення.

1.3.2.3. Класи користувачів та їх характеристики


Оскільки дана система повинна використовуватися всередині організації,
користувачами будуть працівники цієї організації. Поділ користувачів буде
відбуватись за рівнями доступу, як наведено у наступній таблиці.

Таблиця 1.1. Класи користувачів


Тип користувача Права доступу

Доступ до контролю над усіма


фінансовими операціями компанії,
Бухгалтер зокрема розрахуванням вартості
замовлення та контролем транзакцій
клієнтів.
Перегляд об’єктів, які до нього
прив’язані (меню, рецепти,
Кухар
інгредієнти) і зміна статусу
приготування
Повний доступ до елементів системи,
без будь-яких обмежень. Приймає
Адміністратор
замовлення клієнтів. Веде клієнтську
базу.

1.3.2.4. Середовище функціонування


8

Для функціонування системи необхідна платформа повинна відповідати


наступним вимогам:
Таблиця 1.2. Вимоги до платформи
IntelCeleron частотою 1.9Ghz або вище. RAM 4GB і вище,
Процесор інтегрована графіка.

Мінімум 4GB вільного дискового простору і з можливістю


Пам’ять розширення.

Операційна
ОС Windows 8 і новіші.
система
Додаткові Microsoft .NET Framework 3.5, а також Microsoft SQL Server
програмні 2012 і вище для організації бази даних, а також роботи з
компоненти системою керування базою.
Наявність доступу до мережі інтернет є бажаною для
Інтернет своєчасного оновлення компонентів системи.

1.3.2.5. Обмеження проектування та реалізації


 продукт повинен мати українську та англійську мови;
 наявність засобів шифрування та безпеки даних.
 доступ до програми може бути захищений паролем.

1.3.2.6. Документація користувача


Документація користувача повинна містити наступні компоненти:
 інструкція з використання;
 on-line допомога;
 інструкція з налаштування;
 інформація про розробника.

1.3.3. Характеристики системи


1.3.3.1. Авторизація користувачів
9

1.3.3.1.1. Опис і пріоритет


Пріоритет високий. Авторизація користувача відповідно до його типу.
1.3.3.1.2. Послідовність дія/відгук

Форма
Користувач База даних
входу

1.3.3.1.3. Функціональні вимоги


REQ-1: Вибір типу користувача при вході в систему.
REQ-2: Введення даних входу (логін/пароль) та перевірка їх коректності.
REQ-3: Приховування даних входу.

1.3.3.2. Керування меню компанії


1.3.3.2.1. Опис і пріоритет
Пріоритет високий. Додавання, редагування та видалення даних меню,
рецептів, інгредієнтів, зміна статусу замовлення.
1.3.3.2.2. Послідовність дія/відгук

Форма
Кухар редагування База даних
даних

1.3.3.2.3. Функціональні вимоги


REQ-1: Додавання даних меню, рецептів, інгредієнтів. Передбачити
можливість неправильного введення даних.
REQ-2: Редагування даних меню, рецептів, інгредієнтів. Передбачити
можливість неправильного введення даних.
REQ-3: Видалення даних меню, рецептів, інгредієнтів. Передбачити запит
на видалення із повторним підтвердженням операції.
REQ-4: Зміна статусу замовлення. Передбачити можливість
неправильного введення даних.
10

1.3.3.3. Керування фінансовими операціями компанії


1.3.3.3.1. Опис і пріоритет
Пріоритет високий. Розрахування вартості замовлення та контроль
транзакцій клієнтів.
1.3.3.3.2. Послідовність дія/відгук

Форма
Бухгалтер редагування База даних
даних

1.3.3.3.3. Функціональні вимоги


REQ-1: Редагування інформації про транзакції. Передбачити можливість
неправильного введення даних.
REQ-2: Розрахування вартості замовлення. Передбачити можливість
неправильного введення даних.

1.3.3.4. Взаємодія з клієнтами


1.3.3.4.1. Опис і пріоритет
Пріоритет високий. Внесення замовлення в базу даних, ведення
клієнтської бази.
1.3.3.4.2. Послідовність дія/відгук

Форма
Адміністратор редагування База даних
даних

1.3.3.4.3. Функціональні вимоги


REQ-1: Внесення інформації про клієнтів до бази даних. Передбачити
можливість неправильного введення даних.
REQ-2: Редагування даних про клієнтів. Передбачити можливість
неправильного введення даних.
11

REQ-3: Додавання замовлення в базу даних. Передбачити можливість


неправильного введення даних.

1.3.4. Вимоги зовнішніх інтерфейсів


1.3.4.1. Апаратні інтерфейси
Комп'ютер на якому буде виконуватись дана програма повинен мати
наступні апаратні характеристики:
 32-х бітний або 64-х бітний процесор з тактовою частотою 1 ГГц, або
більше;
 1 ГБ ОЗП (х86) або ж 2 ГБ ОЗП (х64);
 200 МБ вільного дискового простору;
 Графічний пристрій з підтримкою DirectX9.

1.3.4.2. Програмні інтерфейси


Для повноцінної роботи SS необхідно встановити наступні програмні
компоненти:
 ОС Windows 8 / Windows 10 32-х бітної або ж 64-х бітної версії;
 .Netframework 4.0.

1.3.4.3. Комунікаційні інтерфейси


Для коректної роботи ПК повинен мати порт RJ-45 або ж модуль Wi-Fi, а
локальна мережа підтримувати стандарт FastEthernet.

1.3.5. Нефункціональні вимоги до проекту


1.3.5.1. Вимоги продуктивності
Система повинна максимально ефективно використовувати апаратні
ресурси платформи, на якій вона запущена. При виконанні запитів до бази
даних не повинна виникати затримка.
1.3.5.2. Вимоги надійності
12

Система повинна виконувати періодичне збереження даних для того, що


запобігти великим втратам у разі непередбачуваних ситуацій (перебої
електроенергії тощо).

1.3.5.3. Вимоги безпеки


Кожен користувач має певний тип доступу прив’язаний до облікового
запису, доступ здійснюється за допомогою логіну та паролю. Пароль повинен
бути прихований під час введення.

1.3.5.4. Атрибути якості програмного продукту


Навчання роботі із системою повинно займати мінімальну кількість часу,
система повинна бути стабільною та ефективно використовувати апаратні
ресурси.

РОЗДІЛ 2. ПРОЕКТУВАННЯ БАЗИ ДАНИХ


13

2.1. Концептуальне моделювання предметної області


2.1.1. Опис сутностей
Задля реалізації роботи кейтерингової компанії у БД було створено
наступні сутності: «Користувачі», «Інформація про користувачів», «Клієнти»,
«Типи клієнтів», «Замовлені фуршети», «Замовлені страви» «Приготування»,
«Статус приготування», «Статус замовлення», «Меню», «Інгредієнти», «Теми
декору», «Теми», «Декор», «Тип страви», «Одиниці виміру», «Інгредієнти в
рецепті».
Сутність Користувачі

Рис. 2.1. Таблиця «Користувачі»


Дана сутність містить інформацію для ідентифікації користувачів, які
зареєструвалися:
 id — ідентифікаційний номер користувача;
 login — визначає логін, за яким користувач заходить у систему;
 password — визначає пароль, за яким користувач заходить у систему;
 user_role — визначає роль, за якою користувач авторизується у
системі.
Сутність Інформація про користувачів

Рис. 2.2. Таблиця «Інформація про користувачів»

Дана сутність містить інформацію про зареєстрованих працівників:


14

 id_info — ідентифікаційний номер запису в таблиці;


 user_name — ім’я працівника;
 user_surname — прізвище працівника;
 salary — заробітна плата працівника;
 users_id — ідентифікаційний номер працівника в таблиці Users.
Сутність Клієнти

Рис. 2.3. Таблиця «Клієнти»


Дана сутність містить інформацію про клієнтів:
 id (PK) — ідентифікаційний номер клієнта;
 name — ім’я клієнта ;
 type_client_id — тип клієнта;
 contact — телефон клієнта.
Сутність Тип клієнта

Рис. 2.4. Таблиця «Типи клієнтів»


Дана сутність містить інформацію про типи клієнтів
 id — ідентифікаційний номер типу клієнта;
 type — назва типу клієнта.
15

Сутність Замовлені фуршети

Рис. 2.5. Таблиця «Замовлені фуршети»


Дана сутність містить інформацію про замовлені фуршети:
 id — ідентифікаційний номер замовленого фуршету;
 client_id — ідентифікаційний номер клієнта, який замовив фуршет;
 status_id — статус замовлення;
 theme_id — ідентифікаційний номер теми для декору;
 data_order — дата замовлення;
 date_event — дата події;
 payment — плата за замовлення;
 suma — загальна сума замовлення;
 address — адреса доставки замовлення.
Сутність Статус замовлення

Рис. 2.6. Таблиця «Статус замовлення»


Дана сутність містить різні статуси для контролю обробки замовлення:
 id_status_order — ідентифікаційний номер статусу;
 name— назва статусу.
16

Сутність Замовлені страви

Рис. 2.7. Таблиця «Замовлені страви»


Дана сутність містить інформацію про замовлені страви, а саме:
 id — ідентифікаційний номер замовленої страви;
 ordering_buffet_id— ідентифікаційний номер фуршету;
 menu_id — ідентифікаційний номер рецепту;
 count — кількість замовлених одиниць.
Сутність Меню

Рис. 2.8. Таблиця «Меню»


Дана сутність містить усю інформацію про наявні страви, а саме:
 id — ідентифікаційний номер страви;
 type_dish_id — тип страви;
 size — розмір;
 price — ціна.
Сутність Приготування

Рис. 2.9. Таблиця «Приготування»


17

Дана сутність містить інформацію про стан приготування страв,


замовлених фуршетів:
 id — ідентифікаційний номер приготування;
 ordering_dishes_id — ідентифікаційний номер замовленої страви;
 status_cooking_id — статус приготування страви;
 recieve_time — час замовлення;
 execute_time — час виконання.
Сутність Статус приготування

Рис. 2.10. Таблиця «Статус приготування»


Дана сутність містить різні статуси для контролю обробки замовлення:
 id_status_cook — ідентифікаційний номер статусу;
 status_name — назва статусу.
Сутність Тип страви

Рис. 2.11. Таблиця «Тип страви»


Дана сутність містить різні типи страв:
 id — ідентифікаційний номер типу;
 type — назва типу.
Сутність Декор

Рис. 2.12. Таблиця «Декор»


18

Дана сутність містить інформацію декор:


 id — ідентифікаційний номер декору;
 name — назва декору;
 price — вартість декору.
Сутність Теми

Рис. 2.13. Таблиця «Теми»


Дана сутність містить теми доступні для оформлення замовлень:
 id — ідентифікаційний номер теми;
 name — назва теми;
 cost — вартість теми.
Сутність Теми декору

Рис. 2.14. Таблиця «Теми декору»


Дана сутність містить інформацію тип газопостачання:
 id — ідентифікаційний номер теми декору;
 theme_id — ідентифікаційний номер теми;
 decor_id — ідентифікаційний номер декору;
 count — кількість декору.
Сутність Інгредієнти

Рис. 2.15. Таблиця «Інгредієнти»


19

Дана сутність містить інформацію про інгредієнти для страв:


 id — ідентифікаційний номер інгредієнта;
 name — назва інгредієнта.
Сутність Інгредієнти в рецепті

Рис. 2.16. Таблиця «Інгредієнти в рецепті»


Дана сутність містить інформацію інгредієнти, які використовуються в
рецепті :
 id — ідентифікаційний номер;
 recipe_id — ідентифікаційний номер рецепта;
 ingredient_id — ідентифікаційний номер інгредієнта;
 unit_of_measurement_id — ідентифікаційний номер одиниць виміру;
 count — кількість інгредієнтів для рецепту.
Сутність Одиниці виміру

Рис. 2.17. Таблиця «Одиниці виміру»


Дана сутність містить інформацію тип зручностей:
 id — ідентифікаційний номер одиниці виміру;
 name — назва одиниці виміру.
20

2.1.2. Опис зв’язків між сутностями


Між сутностями було встановлено наступні зв’язки:
 Між сутностями Замовлені фуршети та Замовлені страви було
встановлено зв’язок один до багатьох (один фуршет містить багато
замовлених страв).
 Між сутностями Замовлені фуршети та Статуси було встановлено
зв’язок один до одного, тому що в кожен момент часу фуршет може
мати тільки один статус.
 Сутність Замовлені фуршети пов'язана відношенням один до одного з
сутністю Клієнти.
 Сутність Замовлені фуршети пов'язана відношенням один до одного з
сутністю Теми, тому що кожен фуршет має тільки одну тематику.
 Сутність Клієнти пов'язана відношенням один до одного з сутністю
Типи клієнтів, тому що кожен клієнт відповідає одному типу.
 Сутність Теми пов'язана відношенням один до багатьох з сутністю
Теми декору, тому що одній темі може відповідати багато декору.
 Сутність Декор пов'язана відношенням один до багатьох з сутністю
Теми декору, тому що один декор може використовуватися у багатьох
темах.
 Сутність Замовлені страви пов'язана відношенням один до одного з
сутністю Приготування, тому що кожна страва має свій процес
приготування.
 Сутність Приготування пов'язана відношенням один до одного з
сутністю Статуси.
 Сутність Замовлені страви пов'язана відношенням один до одного з
сутністю Меню, тому що одній замовленій страві відповідає один
рецепт.
 Між сутностями Замовлені страви та Одиниці виміру було
встановлено зв’язок один до одного.
21

 Між сутностями Меню та Одиниці виміру було встановлено зв’язок


один до одного.
 Між сутностями Меню та Тип страви було встановлено зв’язок один
до одного.
 Між сутностями Меню та Інгредієнти в рецепті було встановлено
зв’язок один до багатьох, тому що один рецепт містить багато
інгредієнтів.
 Між сутностями Інгредієнти та Інгредієнти в рецепті було
встановлено зв’язок багато до одного.
 Між сутностями Одиниці виміру та Інгредієнти в рецепті було
встановлено зв’язок один до одного.

2.2. Логічне проектування БД


Логічна модель — це загальний погляд на дані, модель даних у певній
предметній області. Інколи її називають концептуальною моделлю даних.
Такою моделлю і є модель типу сутність-зв'язок.
Фізична модель — це модель даних, реалізована у вигляді опису бази
даних. Вона може бути реалізована на двох рівнях, а саме у вигляді
трансформаційної моделі і моделі в системі керування базами даних.
У рамках даної роботи було створено логічну та фізичну моделі БД для
роботи кейтерингової компанії.
22

Рис. 2.18. Логічна модель БД

Рис. 2.19. Фізична модель БД

Після перенесення моделі в середовище SQL Server, схема якої


представлена на рисунку 2.20, було створено збережену процедуру, тригери та
накладено певні обмеження на атрибути сутностей.
23

Рис. 2.20. Діаграма, побудована в середовищі SQL Server


Були додані наступні обмеження:
 Усі первинні ключі не можуть бути рівні NULL (Обмеження SQL) та
менші 0.
 На усі атрибути з вторинними ключами було накладено обмеження з
умовою більшою за 0.
 На усі атрибути, що позначають кількість було накладено обмеження
з умовою більшою за 0.
 Усі поля з датами обмежені на 100 років.

2.3. Проектування типових запитів і транзакцій


У ході проектування системи управління базою даних було спроектовано
ряд запитів, а саме:
 Запит на виведення інформації про замовлення (таблиця
«Ordering_buffet»)
 Запит на додавання даних по замовленню (таблиця «Ordering_buffet»).
 Запит на видалення замовлення (таблиця «Ordering_buffet»).
 Запит на додавання нової страви (таблиця «Menu»).
 Запит на видалення страви (таблиця «Menu»).
 Запит на додавання нових інгредієнтів (таблиця «Ingredient»).
24

 Запит на видалення інгредієнтів (таблиця «Ingredient»).


 Запит на додавання даних про клієнта (таблиця «Client»).
 Запит на перегляд даних про оплату (таблиця «Ordering_buffet»).
 Запит на перегляд даних про ціни замовлених страв (таблиця «Menu»).
 Запит на перегляд статусу приготування замовлених страв (таблиця
«Cooking»).
 Запит на редагування статусу приготування замовлених страв
(таблиця «Cooking»).
 Запит на редагування статусу замовлень (таблиця «Ordering_buffet»).
 Запит на додавання нової теми (таблиця «Themes»)
 Запит на додавання декору (таблиця «Decor»)
 Запит на редагування даних для теми декору (таблиця
«Theme_of_decor»)
 Запит на редагування інгредієнтів в рецепті (таблиця
«Ingredients_in_recipes»)
 Запит на видалення в рецепті (таблиця «Ingredients_in_recipes»)
 Запит на додавання типу страви (таблиця «Type_dish»)
 Запит на редагування інформації про користувачів (таблиця «Users»)
 Запит на редагування інформації по замовлених стравах (таблиця
«Ordering_dishes»)
Індекси в даній системі будуть використовуватися виключно за
замовчуванням середовища SQL Server, через відсутність великих потоків
даних для зберігання.
25

РОЗДІЛ 3. РЕАЛІЗАЦІЯ ПРОГРАМНОГО ПРОДУКТУ РОБОТИ З


БАЗОЮ ДАНИХ
3.1. Реалізація доступу до бази даних
Для реалізації доступу до даних БД обрано ADO.NET Entity Framework —
це Object / Relational Mapping (ORM) структура, яка дозволяє розробникам
працювати з реляційними даними за допомогою об'єктів, спеціалізованих для
доменів. Це усуває необхідність в написання більшої частини коду для доступу
до даних, який зазвичай потрібен розробникам. Використовуючи Entity
Framework, розробники видають запити, що використовують LINQ, а потім
маніпулюють даними, як сильно типізованими об'єктами. Entity Framework
надає можливість взаємодії з об'єктами як за допомогою LINQ у вигляді LINQ
to Entities, так і з використанням Entity SQL.
Реалізація платформи Entity Framework ORM надає такі послуги, як:
 відстеження змін;
 дозвіл ідентичності;
 відкладеності завантаження;
 переклад запитів.
Внаслідок цього, розробники можуть зосередитися на бізнес-логіці своїх
програм, а не приділяти значну увагу основам доступу до даних. ADO.NET
Entity Framework – це удосконалена технологія, що дає розробникам
автоматизований механізм для доступу і зберігання даних в базі даних.
Застосування Entity Framework дає наступні переваги:
 застосування можуть працювати з концептуальною моделлю в
термінах наочної області – зокрема з успадкованими типами,
складними елементами і зв'язками;
 зіставлення між концептуальною моделлю і схемою, специфічною для
конкретного сховища, можуть мінятися без зміни коду застосування;
 застосування звільняються від жорстких залежностей від конкретного
ядра СУБД або схеми зберігання;
26

 розробники мають можливість працювати з узгодженою моделлю


об'єктів застосування, яка може бути зіставлена з різними схемами
зберігання, які, можливо, реалізовані в різних системах управління
даними;
 декілька концептуальних моделей можуть бути зіставлені з єдиною
схемою зберігання;
 підтримка інтегрованих в мову запитів (LINQ) забезпечує під час
компіляції перевірку синтаксису запиту щодо концептуальної моделі.
Entity Framework ORM (Object / Relational Mapping) є інструментом для
зберігання даних з доменних об’єктів до реляційної бази даних, як MS SQL
Server, в автоматизованому режимі, без особливого програмування. Дані
можуть розподілятися по декількох системах зберігання даних, у кожній з яких
застосовуються свої протоколи, але навіть в застосуваннях, що працюють з
однією системою зберігання даних, необхідно підтримувати баланс між
вимогами системи зберігання даних і вимогами написання ефективного і
зручного для обслуговування коду застосування.
Є загальновідомий принцип проектування в моделюванні даних, який
полягає в розділенні моделі даних на наступні три частини:
 концептуальна;
 логічна;
 фізична.

Рис. 3.1. Діаграма компонентів


27

Рис. 3.2. Створення нової моделі даних ADO.NET Entity Framework

Рис. 3.3. Встановлення параметрів з'єднання з БД


28

Рис. 3.4. Діаграма моделі даних ADO.NET Entity Framework

3.2. Реалізація функціональних характеристик системи


3.2.1. Авторизація
Авторизація реалізована наступним чином:
За допомогою елементів форми TextBox користувач вводить свій логін і
пароль. Приховування пароля реалізовано за допомогою властивості
PasswordChar. На основі обраного логіна та типу користувача відбувається
підключеня до бази даних та встановлення дозволів класу користувача. Якщо
введені дані правильні та при спробі з'єднатися з SQL Server, не виникло
29

виняткової ситуації, тоді відкривається головне вікно програми відповідно до


ролі користувача, що проходить авторизацію, при завантаженні якого форма
авторизації закривається. Якщо ж виникла помилка, або введені дані були
хибними згенерується повідомлення про помилку за допомогою елемента
MessageBox.
Catering_company catering_Company;
private void Onload(object sender, EventArgs e)
{ try {
catering_Company = new Catering_company();
if (catering_Company.Database.Exists()) {
statusConnect.Text = "Статус: З'єднано з сервером";
st.Background = Brushes.LawnGreen;
}
else {
statusConnect.Text = "Статус: Нема з'єднання";
st.Background = Brushes.Red;
}
}
catch (SqlException ex)
{
statusConnect.Text = "Статус: Нема з'єднання";
MessageBox.Show(Convert.ToString(ex));
st.Background = Brushes.Red;
}}
Hash Hash = new Hash();
ControllerPanel controller = new ControllerPanel();
private void Login_Click(object sender, RoutedEventArgs e)
{ try {
catering_Company = new Catering_company();
string hash = Hash.CreateMD5Hash(password.Password);
var logdata = catering_Company.users.Where(l => l.login ==
login.Text).FirstOrDefault();
if (logdata != null && hash == logdata.password &&
controller.Create_Window(logdata.id)) //перевірка паролю
{
this.Hide();
}
else
{
MessageBox.Show("Помилка!");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

3.2.2. Реєстрація працівників


Для того, щоб мати можливість зареєструвати працівника, у систему має
зайти користувач з роллю 0. Після цього відкриється вікно адміністратора,
який, увівши дані про працівника і обравши роль реєструє нового юзера в
системі. Для цього викликається наступна функція:
private void Registr(object sender, RoutedEventArgs e)
{
30
if(checkLogin(login.Text) && login.Text != "" && Name.Text != "" && Surename.Text !=
"" &&
salary.Value != 0 && password.Password == repeat.Password && password.Password !=
""){
users Users = new users();
Users.login = login.Text;
Users.password = Hash.CreateMD5Hash(password.Password);
Users.user_role = role.SelectedIndex;
catering_Company.users.Add(Users);
users_info info = new users_info();
info.user_name = Name.Text;
info.user_surname = Surename.Text;
info.salary = (decimal)salary.Value;
info.users_id = Users.id;
catering_Company.users_info.Add(info);
catering_Company.SaveChanges();
InitUsers();
MessageBox.Show("Нового працівника додано успішно!");
login.Text = "";
password.Password = "";
repeat.Password = "";
Name.Text = "";
Surename.Text = "";
salary.Value = 0;
}
else
{
MessageBox.Show("Потрібно заповнити всі поля");
}
}

Також адміністратор має можливість видалити працівника за допомогою


функції DeleteUser():
private void DeleteUser_Click(object sender, RoutedEventArgs e)
{
try
{
var bufItem = Users.SelectedItem;
var bufCol = Users.CurrentColumn;
if (Users.SelectedIndex != 0)
{
Users.CurrentCell = new DataGridCellInfo(Users.Items[0], Users.Columns[0]);
Users.CurrentCell = new DataGridCellInfo(bufItem, bufCol);
}
else
{
Users.CurrentCell = new DataGridCellInfo(Users.Items[1], Users.Columns[0]);
Users.CurrentCell = new DataGridCellInfo(bufItem, bufCol);

}
var SelectedUser = Users.SelectedItem as UserCollection;
var user = catering_Company.users.Single(x => x.id == SelectedUser.id);
var info = catering_Company.users_info.Single(x => x.id_info ==
SelectedUser.id_info);
catering_Company.users_info.Remove(info);
catering_Company.users.Remove(user);
catering_Company.SaveChanges();
InitUsers();
MessageBox.Show("Успішно видалено");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
31

3.2.3. Додавання, редагування і видалення інформації про клієнта


Увійшовши до системи від імені адміністратора, користувач має
можливість додати в базу даних інформацію про клієнта, який бажає зробити
замовлення фуршету.
private void AddClient_Click(object sender, RoutedEventArgs e)
{
var client = ClientList.ItemsSource.Cast<ClientCollection>().ToList();
if (client.Count == 0 && clientName.Text != "" && clientType.SelectedIndex != -1
&& contactClient.Text != "")
{
client clientNew = new client();
clientNew.name = clientName.Text;
clientNew.type_client_id = clientType.SelectedIndex + 1;
clientNew.contact = contactClient.Text;
catering_Company.client.Add(clientNew);
catering_Company.SaveChanges();
MessageBox.Show("Клієнта додано успішно!");
SearchClient();
ClientList.SelectedIndex = 0;
}
else
{
MessageBox.Show("Потрібно заповнити всі поля або дана особа вже існує");
}
}
Також адміністратор має можливість пошуку клієнта серед усього списку,
якщо він повторно бажає зробити замовлення:
private void SearchClient()
{
var i = clientCollection.GetAllClients();
var filters = (from c in i
where c.name.Contains(clientName.Text) &&
c.contact.Contains(contactClient.Text)
select new ClientCollection
{
id = c.id,
name = c.name,
contact = c.contact,
type_client_id = c.type_client_id,
type_client_str = c.type_client_str,
}).ToList();
ClientList.ItemsSource = filters;
}

3.2.4. Оформлення, редагування і видалення замовлення


Адміністратор має змогу оформити замовлення, обравши його деталі.
Після цього воно буде додано до бази даних зі статусом «виконується» і кухар
зможе приступити до його виконання.
При оформленні замовлення, адміністратор обирає бажані
характеристики, а саме тему фуршету, декорації, які будуть використані, а
також бажане меню.
32
private void AddEditDishes_Click(object sender, RoutedEventArgs e)
{
var dishes = OrderDishesGread.ItemsSource.Cast<OrderDish>();
var selectedDish = OrderDishesGread.SelectedItem as OrderDish;
var selectOrder = Orders.SelectedItem as OrderCollections;
var contr = dishes.SingleOrDefault(x => x.menu_id == (dishCombo.SelectedIndex + 1));
if (contr == null)
{
ordering_dishes Dishes = new ordering_dishes();
Dishes.count = (int)countDish.Value;
Dishes.menu_id = dishCombo.SelectedIndex + 1;
Dishes.ordering_buffet_id = selectOrder.id;
catering_Company.ordering_dishes.Add(Dishes);
cooking cooking = new cooking();
cooking.status_cooking_id = 1;
cooking.ordering_dishes_id = Dishes.id;
cooking.recieve_time = DateTime.Today;
catering_Company.cooking.Add(cooking);
catering_Company.SaveChanges();
}
else
{
var orderDish = catering_Company.ordering_dishes.SingleOrDefault(x => x.id ==
selectedDish.id_orderDish);
orderDish.count = (int)countDish.Value;
catering_Company.SaveChanges();
}
int i = Orders.SelectedIndex;
initOrder(i);
}
Також передбачена можливість редагування вже доданого замовлення.
private void EditAdd_Click(object sender, RoutedEventArgs e)
{
var select = Decors.ItemsSource.Cast<DecorTheme>();
var selectOrder = Orders.SelectedItem as OrderCollections;
var selectedItem = Decors.SelectedItem as DecorTheme;
var h = select.SingleOrDefault(x => x.decor_id == (decorItem.SelectedIndex + 1));
if (h == null)
{
theme_of_decor newTheme = new theme_of_decor();
newTheme.count = (int)countDecor.Value;
newTheme.ordering_buffet_id = selectOrder.id;
newTheme.decor_id = decorItem.SelectedIndex + 1;
catering_Company.theme_of_decor.Add(newTheme);
catering_Company.SaveChanges();

}
else
{
var deco = catering_Company.theme_of_decor.SingleOrDefault(x => x.id ==
selectedItem.id);
deco.count = (int)countDecor.Value;
catering_Company.SaveChanges();
}
int i = Orders.SelectedIndex;
initOrder(i);
SetSumTheme();
}

За потреби, адміністратор має змогу видалити замовлення.


private void DeleteOrder_Click(object sender, RoutedEventArgs e)
{
var select = Orders.SelectedItem as OrderCollections;
if (select != null)
{
var orderDelete = catering_Company.ordering_buffet.Single(x => x.id == select.id);
33
catering_Company.ordering_buffet.Remove(orderDelete);
catering_Company.SaveChanges();
}
}

3.2.5. Додавання, редагування і видалення страв у меню


Увійшовши до системи як кухар, користувач має можливість переглянути
меню, яке є у базі даних і внести зміни до нього.
Обравши відповідні пункти меню, кухар може створити нову страву.
List<RecipeContent> GetRecipeContent(string recipe_title)
{
var result = (from menu_item in catering_entity.menu
.Where(m => m.dish_name == recipe_title)
join ingr_in_r in catering_entity.ingredients_in_recipes
on menu_item.id equals ingr_in_r.recipe_id
join ingredient_item in catering_entity.ingredient
on ingr_in_r.ingredient_id equals ingredient_item.id
join unit_item in catering_entity.units_of_measurement
on ingr_in_r.unit_of_measurement_id equals unit_item.id
select new RecipeContent
{
menu_id = menu_item.id,
id = ingr_in_r.id,
dish_name = menu_item.dish_name,
ingredient = ingredient_item.name,
count = ingr_in_r.count,
unit = unit_item.name
}).ToList();
return result;
}
Змінити рецепт уже існуючої страви.
private void EditBtn_Click(object sender, RoutedEventArgs e)
{
fillComboBoxes();
recipe_title = (RecipesGrid.SelectedItem as MenuTable).name;
content = GetRecipeContent(recipe_title).ToList();
var item = catering_entity.menu.First(m => m.dish_name == recipe_title);
menuId = item.id;
IngredientsGrid1.ItemsSource = content;
nameTextBox.Text = recipe_title;
popupEditRecipe.IsOpen = true;
}
Видалити рецепт з бази даних.
private void deleteBtn_Click(object sender, RoutedEventArgs e)
{
DeleteIngredConfirm confWindow = new DeleteIngredConfirm();
if (confWindow.ShowDialog() == true)
{
int menu_id = (RecipesGrid.SelectedItem as MenuTable).menu_id;
var deleteDish = catering_entity.menu.First(c => c.id == menu_id);
catering_entity.menu.Remove(deleteDish);
catering_entity.SaveChanges();
RecipesGrid.ItemsSource = GetRecipes().ToList();
}
else
{
confWindow.Hide();
}
}
34

3.2.6. Підтвердження готовності страви


Кухар повинен виконати замовлення і після цього підтвердити його
готовність. Статус готовності страви змінюється на «готово». Усі зміни
зберігаються в базі даних.
public void SetData(int id_order)
{
cooking cook = catering_entity.cooking.Find(id_order);
if (cook.status_cooking_id == 2)
{
MessageBox.Show("Замовлення готове");
}
else
{
cook.status_cooking_id = 2;
cook.execute_time = DateTime.Now;
}
catering_entity.SaveChanges();
}

3.2.7. Створення чека для клієнта


Увійшовши, як бухгалтер, користувач формує для кожного клієнта чек, на
якому відображається інформація про замовлення і його вартість.
List<OrdersBuffCollection> GetOrders()
{
var ActiveOrders =
(from ord_buf in catering_entity.ordering_buffet
join st in catering_entity.status_order
on ord_buf.status_id equals st.id_status_order
join th in catering_entity.themes
on ord_buf.theme_id equals th.id
select new OrdersBuffCollection
{
id_order_buffet = ord_buf.id,
theme = th.name,
sum_buffet = ord_buf.suma,
payment = ord_buf.payment,
date_event = ord_buf.data_event,
date_order = ord_buf.data_order,
address = ord_buf.address,
status_buffet = st.name
}).ToList();
return ActiveOrders;
}
public void GetData(int id_order)
{
Checks = GetChecks(id_order).ToList();
lblCheck.Content = "Клієнт: " + Checks.Single().client_name + "\n" +
"Мобільний телефон: " + Checks.Single().client_phone + "\n" +
"Замовлення на тему: " + Checks.Single().theme + "\n" +
"Загальна сума: " + Checks.Single().sum;
}
Після формування чека, бухгалтер підтверджує оплату замовлення
клієнтом і його статус змінюється на «Оплачено».
public void SetTransData(int id_order)
{
ordering_buffet transaction = catering_entity.ordering_buffet.Find(id_order); ;
transaction.status_id = 2;
35
catering_entity.SaveChanges();
popupGetCheck.IsOpen = false;
MessageBox.Show("Оплату підтверджено");
var getord = GetOrders();
dgAccounter.ItemsSource = getord.ToList();
}

3.3. Опис роботи програми


Після запуску програми з’являється форма авторизації. Користувачу
необхідно ввести свій логін, пароль і натиснути кнопку «Увійти».

Рис. 3.5. Форма авторизації

Якщо при введені даних, необхідних для авторизації, виникли помилки,


то програма покаже відповідне повідомлення про помилку.

Рис. 3.6. Помилка при авторизації


У разі успішної авторизації відкриється вікно користувача програми,
функціональність і вміст якого залежать від ролі авторизованого юзера.
Якщо в системі авторизується користувач з роллю 1, то програма
ідентифікує його як Кухаря і надасть доступ до вікна як на рисунку 3.7.
36

Рис. 3.7. Вікно Кухаря


На вкладці «Замовлення» Кухар бачить інформацію про замовлення
страв, які необхідно виконати. Натиснувши правою кнопкою миші на
замовлення, він має можливість його підтвердити за допомогою контекстного
меню.

Рис. 3.8. Контекстне меню


37

Після підтвердження цих дій статус змінюється.

Рис. 3.9. Підтвердження замовлення

Рис. 3.10. Повідомлення про підтвердження

Відкривши вкладку «Рецепти», кухар має можливість додати новий


рецепт, а також переглянути інформацію, відредагувати або видалити вже
існуючі рецепти за допомогою контекстного меню.

Рис. 3.11. Вкладка «Рецепти»


38

Натиснувши кнопку «Додати рецепт», з’являється спливаюче вікно, в


якому, заповнивши усі необхідні поля, кухар може додати нову страву в базу
даних.

Р
ис. 3.12. Додавання страви

Рис. 3.13. Повідомлення про успішне додавання

Натиснувши правою кнопкою миші на потрібну страву, відкривається


контекстне меню, за допомогою якого користувач може переглянути рецепт,
відредагувати його, або зовсім видалити страву з бази даних.
39

Р
ис. 3.14. Контекстне меню

Рис. 3.15. Редагування рецепту


40

Рис. 3.16. Перегляд рецепту

Якщо в системі авторизується користувач з роллю 2, то програма


ідентифікує його як Бухгалтера і надасть доступ до вікна як на рисунку 3.16.

Р
ис. 3.17. Вікно Бухгалтера
41

Обравши потрібну подію і викликавши контекстне меню, бухгалтер має


змогу сформувати чек для неї.

Рис. 3.18. Контекстне меню

Рис. 3.19. Формування чека


42

Натиснувши кнопку «Підтвердити оплату» з’явиться вікно підтвердження


оплати.

Рис. 3.20. Підтвердження оплати

Рис. 3.21. Оплата

У разі, якщо оплату буде підтверджено, з’явиться відповідне


повідомлення, а статус замовлення зміниться на «Оплачено».

Рис. 3.22. Зміна статусу замовлення


43

Якщо в системі авторизується користувач з роллю 0, то програма


ідентифікує його як Адміністратора і надасть доступ до вікна як на рисунку
3.23.

Рис. 3.23. Вікно Адміністратора

Адміністратор може додавати нових працівників, а також оформляти,


редагувати та видаляти замовлення.
Для того, щоб оформити нове замовлення, необхідно ввести прізвище та
ім’я замовника, обрати тип особи, а також ввести контактний номер телефону і
натиснути «+». У разі успішного додавання нового клієнта, буде виведено
відповідне повідомлення, а інформація про клієнта з’явиться у таблиці.
44

Рис. 3.24. Введення даних про клієнта

Рис. 3.25. Повідомлення про додавання клієнта


Після цього необхідно обрати тематику заходу, дату і адресу, де
відбуватиметься подія.

Рис. 3.26. Додавання події


45

У разі успішного додання події, з’явиться відповідне повідомлення і


відкриється вікно для того, щоб вказати деталі замовлення.

Рис. 3.27. Деталі замовлення


На вкладці «Всі замовлення» відображається інформація про всі
замовлення, прийняті компанією.

Рис. 3.28. Усі замовлення


46

Правий клік на потрібному замовленні, дозволяє відредагувати або


видалити замовлення.

Рис. 3.29. Контекстне меню


У разі вибору пункту «Редагувати замовлення», відкриється відповідне
вікно, де адміністратор може внести зміни для цього замовлення. У разі ж
вибору пункту «Видалити», існуюче замовлення буде видалено з бази даних.
Для того, щоб додати нового працівника, необхідно перейти на вкладку
«Персонал». На ній відображається список усіх працівників компанії і
інформація про їхні заробітні плати.

Рис. 3.30. Працівники


47

На вкладці «Додати працівника», адміністратор має змогу зареєструвати


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

Рис. 3.31. Додавання нового працівника


У разі успішного додання працівника, з’явиться відповідне повідомлення.

Рис. 3.32. Повідомлення про додання нового працівника


Після цього він з’явиться у списку працівників.

Рис. 3.33. Список працівників


48

ВИСНОВКИ
Результатом даної курсової роботи є база даних для обліку роботи
кейтерингової компанії та програмне забезпечення для роботи з нею.
У ході роботи над проектом було використано такі програмні продукти як
Microsoft Visual Studio 2017, Microsoft SQL Server Management Studio 2017,
PowerDesigner. Microsoft Visual Studio являє собою середовище розробки
даного проекту. PowerDesigner використовувався для проектування моделей
бази даних. Сама ж база даних була реалізована за допомогою MS SQL Server.
В якості технології зв’язку між додатком і базою даних використано
технологію ADO.NET Entity Framework. Користувацький інтерфейс
побудований на основі Windows Presentation Foundation.
Виконуючи цю курсову роботу, я оволоділа навичками концептуального
проектування баз даних, а також організації взаємодії бази даних з програмним
забезпеченням за допомогою технології ADO.NET Entity Framework, навчилася
проектувати типові запити та транзакції.
Основним недоліком розробленого додатку є неможливість його
взаємодії з іншими базами даних, а саме програмний продукт залежить від
певної бази даних і серверу, змінити які неможливо без редагування коду.
У програмі реалізовано всі функціональні вимоги, описані в специфікації
вимог до ПЗ. Система забезпечує авторизований доступ до бази даних із
врахуванням прав користувачів.
Для подальшого покращення програми, варто додати наступний
функціонал:
 функцію відміни попередньої операції;
 функція оптимізації БД;
 функція бекапу і відновлення;
 більш детальні повідомлення про помилки в роботі БД;
 можливість прямого редагування полів таблиць бази даних;
 більш зручний користувацький інтерфейс.
49

СПИСОК ЛІТЕРАТУРИ
1. Дудзяний І. М. Об’єктно-орієнтоване моделювання програмних
систем. Львів: Видавництво ЛНУ ім. Івана Франка, 2007. 107 с.
2. Мак-Дональд М. WPF 4:Windows Presentation Foundation в NET 4.0 с
примерами на C# 2010 для профессионалов. М.: Вильямс, 2011. 1024
с.
3. Пасічник В. В., Резніченко В. А. Організація баз даних та знань. Київ:
Видавнича група BHV, 2006. – 384 с.
4. Петкович Д. Microsoft SQL Server 2012. Руководство для
начинающих: пер. с англ. СПб.: БХВ-Петербург, 2013. 816 с.
5. Руководство по WPF. METANIT.COM Сайт о программировании.
URL: https://metanit.com /sharp/wpf/.
6. Entity Framework Database First. MSDN: Introduction to Entity
Framework. URL: https://msdn.microsoft.com/en-
us/library/jj206878(v=vs.113).aspx
7. Introduction to WPF MSDN: Windows Presentation Foundation. URL:
https://msdn.microsoft.com/ru-ru/library/aa970268(v=vs.100).aspx
8. SQL Server Documentation URL: https://docs.microsoft.com/ru-ru/sql/sql-
server/sql-server-technical-documentation

Додаток А. Скрипт створення БД


50
USE [Catering company]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[client](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](max) NULL,
[type_client_id] [int] NULL,
[contact] [nvarchar](max) NULL,
CONSTRAINT [PK_client] PRIMARY KEY CLUSTERED
([id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[cooking](
[id] [int] IDENTITY(1,1) NOT NULL,
[ordering_dishes_id] [int] NULL,
[status_cooking_id] [int] NULL,
[recieve_time] [datetime] NULL,
[execute_time] [datetime] NULL,
CONSTRAINT [PK_cooking] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[decor](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](max) NULL,
[price] [money] NULL,
CONSTRAINT [PK_decor] PRIMARY KEY CLUSTERED
(
[id] ASC
51
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ingredient](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](max) NULL,
CONSTRAINT [PK_ingredient] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ingredients_in_recipes](
[id] [int] IDENTITY(1,1) NOT NULL,
[recipe_id] [int] NULL,
[ingredient_id] [int] NULL,
[unit_of_measurement_id] [int] NULL,
[count] [int] NULL,
CONSTRAINT [PK_ingredients_in_recipes] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[menu](
[id] [int] IDENTITY(1,1) NOT NULL,
[type_dish_id] [int] NULL,
[dish_name] [nvarchar](max) NULL,
[size] [int] NULL,
[price] [money] NULL,
CONSTRAINT [PK_menu] PRIMARY KEY CLUSTERED
52
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ordering_buffet](
[id] [int] IDENTITY(1,1) NOT NULL,
[client_id] [int] NULL,
[status_id] [int] NULL,
[theme_id] [int] NULL,
[data_order] [datetime] NULL,
[data_event] [datetime] NULL,
[payment] [int] NULL,
[suma] [money] NULL,
[address] [nvarchar](max) NULL,
CONSTRAINT [PK_ordering_buffet] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ordering_dishes](
[id] [int] IDENTITY(1,1) NOT NULL,
[ordering_buffet_id] [int] NULL,
[menu_id] [int] NULL,
[count] [int] NULL,
CONSTRAINT [PK_ordering_dishes] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
53
GO
CREATE TABLE [dbo].[status_cooking](
[id_status_cook] [int] IDENTITY(1,1) NOT NULL,
[status_name] [nvarchar](50) NULL,
CONSTRAINT [PK_status_cooking] PRIMARY KEY CLUSTERED
(
[id_status_cook] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[status_order](
[id_status_order] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NULL,
CONSTRAINT [PK_status_order] PRIMARY KEY CLUSTERED
(
[id_status_order] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[theme_of_decor](
[id] [int] IDENTITY(1,1) NOT NULL,
[theme_id] [int] NULL,
[decor_id] [int] NULL,
[count] [int] NULL,
CONSTRAINT [PK_theme_of_decor] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[themes](
54
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](max) NULL,
[cost] [money] NULL,
CONSTRAINT [PK_Themes] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[type_client](
[id] [int] IDENTITY(1,1) NOT NULL,
[type] [nvarchar](max) NULL,
CONSTRAINT [PK_type_client] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[type_dish](
[id] [int] IDENTITY(1,1) NOT NULL,
[type] [nvarchar](max) NULL,
CONSTRAINT [PK_type_dish] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[units_of_measurement](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](max) NULL,
CONSTRAINT [PK_units_of_measurement] PRIMARY KEY CLUSTERED
55
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[users](
[id] [int] IDENTITY(1,1) NOT NULL,
[login] [nvarchar](max) NOT NULL,
[password] [nvarchar](max) NOT NULL,
[user_role] [int] NOT NULL,
CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[users_info](
[id_info] [int] IDENTITY(1,1) NOT NULL,
[user_name] [nvarchar](max) NULL,
[user_surname] [nvarchar](max) NULL,
[salary] [money] NULL,
[users_id] [int] NULL,
CONSTRAINT [PK_users_info] PRIMARY KEY CLUSTERED
(
[id_info] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[client] WITH CHECK ADD CONSTRAINT [FK_client_type_client] FOREIGN
KEY([type_client_id])
REFERENCES [dbo].[type_client] ([id])
GO
ALTER TABLE [dbo].[client] CHECK CONSTRAINT [FK_client_type_client]
GO
56
ALTER TABLE [dbo].[cooking] WITH CHECK ADD CONSTRAINT [FK_cooking_ordering_dishes]
FOREIGN KEY([ordering_dishes_id])
REFERENCES [dbo].[ordering_dishes] ([id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[cooking] CHECK CONSTRAINT [FK_cooking_ordering_dishes]
GO
ALTER TABLE [dbo].[cooking] WITH CHECK ADD CONSTRAINT [FK_cooking_status_cooking]
FOREIGN KEY([status_cooking_id])
REFERENCES [dbo].[status_cooking] ([id_status_cook])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[cooking] CHECK CONSTRAINT [FK_cooking_status_cooking]
GO
ALTER TABLE [dbo].[ingredients_in_recipes] WITH CHECK ADD CONSTRAINT
[FK_ingredients_in_recipes_ingredient] FOREIGN KEY([ingredient_id])
REFERENCES [dbo].[ingredient] ([id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[ingredients_in_recipes] CHECK CONSTRAINT
[FK_ingredients_in_recipes_ingredient]
GO
ALTER TABLE [dbo].[ingredients_in_recipes] WITH CHECK ADD CONSTRAINT
[FK_ingredients_in_recipes_menu] FOREIGN KEY([recipe_id])
REFERENCES [dbo].[menu] ([id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[ingredients_in_recipes] CHECK CONSTRAINT
[FK_ingredients_in_recipes_menu]
GO
ALTER TABLE [dbo].[ingredients_in_recipes] WITH CHECK ADD CONSTRAINT
[FK_ingredients_in_recipes_units_of_measurement] FOREIGN KEY([unit_of_measurement_id])
REFERENCES [dbo].[units_of_measurement] ([id])
GO
ALTER TABLE [dbo].[ingredients_in_recipes] CHECK CONSTRAINT
[FK_ingredients_in_recipes_units_of_measurement]
GO
ALTER TABLE [dbo].[menu] WITH CHECK ADD CONSTRAINT [FK_menu_type_dish] FOREIGN
KEY([type_dish_id])
REFERENCES [dbo].[type_dish] ([id])
GO
ALTER TABLE [dbo].[menu] CHECK CONSTRAINT [FK_menu_type_dish]
GO
ALTER TABLE [dbo].[ordering_buffet] WITH CHECK ADD CONSTRAINT
[FK_ordering_buffet_client] FOREIGN KEY([client_id])
REFERENCES [dbo].[client] ([id])
57
GO
ALTER TABLE [dbo].[ordering_buffet] CHECK CONSTRAINT [FK_ordering_buffet_client]
GO
ALTER TABLE [dbo].[ordering_buffet] WITH CHECK ADD CONSTRAINT
[FK_ordering_buffet_status_order] FOREIGN KEY([status_id])
REFERENCES [dbo].[status_order] ([id_status_order])
GO
ALTER TABLE [dbo].[ordering_buffet] CHECK CONSTRAINT [FK_ordering_buffet_status_order]
GO
ALTER TABLE [dbo].[ordering_buffet] WITH CHECK ADD CONSTRAINT
[FK_ordering_buffet_Themes] FOREIGN KEY([theme_id])
REFERENCES [dbo].[themes] ([id])
GO
ALTER TABLE [dbo].[ordering_buffet] CHECK CONSTRAINT [FK_ordering_buffet_Themes]
GO
ALTER TABLE [dbo].[ordering_dishes] WITH CHECK ADD CONSTRAINT [FK_ordering_dishes_menu]
FOREIGN KEY([menu_id])
REFERENCES [dbo].[menu] ([id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[ordering_dishes] CHECK CONSTRAINT [FK_ordering_dishes_menu]
GO
ALTER TABLE [dbo].[ordering_dishes] WITH CHECK ADD CONSTRAINT
[FK_ordering_dishes_ordering_buffet] FOREIGN KEY([ordering_buffet_id])
REFERENCES [dbo].[ordering_buffet] ([id])
GO
ALTER TABLE [dbo].[ordering_dishes] CHECK CONSTRAINT [FK_ordering_dishes_ordering_buffet]
GO
ALTER TABLE [dbo].[theme_of_decor] WITH CHECK ADD CONSTRAINT [FK_theme_of_decor_decor]
FOREIGN KEY([decor_id])
REFERENCES [dbo].[decor] ([id])
GO
ALTER TABLE [dbo].[theme_of_decor] CHECK CONSTRAINT [FK_theme_of_decor_decor]
GO
ALTER TABLE [dbo].[theme_of_decor] WITH CHECK ADD CONSTRAINT [FK_theme_of_decor_Themes]
FOREIGN KEY([theme_id])
REFERENCES [dbo].[themes] ([id])
GO
ALTER TABLE [dbo].[theme_of_decor] CHECK CONSTRAINT [FK_theme_of_decor_Themes]
GO
ALTER TABLE [dbo].[users_info] WITH CHECK ADD CONSTRAINT [FK_users_info_users] FOREIGN
KEY([users_id])
REFERENCES [dbo].[users] ([id])
GO
ALTER TABLE [dbo].[users_info] CHECK CONSTRAINT [FK_users_info_users]
GO

You might also like