﻿--
-- Скрипт сгенерирован Devart dbForge Studio 2019 for MySQL, Версия 8.1.22.0
-- Домашняя страница продукта: http://www.devart.com/ru/dbforge/mysql/studio
-- Дата скрипта: 13.05.2021 23:27:33
-- Версия сервера: 5.7.25
-- Версия клиента: 4.1
--

-- 
-- Отключение внешних ключей
-- 
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

-- 
-- Установить режим SQL (SQL mode)
-- 
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

-- 
-- Установка кодировки, с использованием которой клиент будет посылать запросы на сервер
--
SET NAMES 'utf8';

--
-- Удалить функцию `addNewUser`
--
DROP FUNCTION IF EXISTS addNewUser;

--
-- Удалить функцию `handleLogin`
--
DROP FUNCTION IF EXISTS handleLogin;

--
-- Удалить функцию `isUserAdmin`
--
DROP FUNCTION IF EXISTS isUserAdmin;

--
-- Удалить таблицу `ord`
--
DROP TABLE IF EXISTS ord;

--
-- Удалить процедуру `partStock`
--
DROP PROCEDURE IF EXISTS partStock;

--
-- Удалить функцию `addNewOrd`
--
DROP FUNCTION IF EXISTS addNewOrd;

--
-- Удалить функцию `addNewPart`
--
DROP FUNCTION IF EXISTS addNewPart;

--
-- Удалить функцию `modifySupply`
--
DROP FUNCTION IF EXISTS modifySupply;

--
-- Удалить таблицу `part_shop`
--
DROP TABLE IF EXISTS part_shop;

--
-- Удалить таблицу `shop`
--
DROP TABLE IF EXISTS shop;

--
-- Удалить процедуру `partInfo`
--
DROP PROCEDURE IF EXISTS partInfo;

--
-- Удалить функцию `modifyPart`
--
DROP FUNCTION IF EXISTS modifyPart;

--
-- Удалить таблицу `part`
--
DROP TABLE IF EXISTS part;

--
-- Удалить процедуру `selectParts`
--
DROP PROCEDURE IF EXISTS selectParts;

--
-- Удалить таблицу `category`
--
DROP TABLE IF EXISTS category;

--
-- Удалить таблицу `order_info`
--
DROP TABLE IF EXISTS order_info;

--
-- Удалить таблицу `status`
--
DROP TABLE IF EXISTS status;

--
-- Удалить таблицу `user`
--
DROP TABLE IF EXISTS user;

--
-- Удалить таблицу `supplier`
--
DROP TABLE IF EXISTS supplier;

--
-- Создать таблицу `supplier`
--
CREATE TABLE supplier (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(255) NOT NULL,
  address varchar(255) NOT NULL,
  phone varchar(255) NOT NULL,
  email varchar(255) NOT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 3,
CHARACTER SET utf8,
COLLATE utf8_general_ci;

--
-- Создать индекс `name` для объекта типа таблица `supplier`
--
ALTER TABLE supplier
ADD UNIQUE INDEX name (name);

--
-- Создать таблицу `user`
--
CREATE TABLE user (
  id int(11) NOT NULL AUTO_INCREMENT,
  login varchar(255) NOT NULL,
  password varchar(255) NOT NULL,
  name varchar(255) NOT NULL,
  surname varchar(255) NOT NULL,
  phone bigint(12) NOT NULL,
  email varchar(50) NOT NULL,
  address varchar(255) NOT NULL,
  is_admin tinyint(1) NOT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 11,
AVG_ROW_LENGTH = 1820,
CHARACTER SET utf8,
COLLATE utf8_general_ci;

--
-- Создать индекс `email` для объекта типа таблица `user`
--
ALTER TABLE user
ADD UNIQUE INDEX email (email);

--
-- Создать индекс `login` для объекта типа таблица `user`
--
ALTER TABLE user
ADD UNIQUE INDEX login (login);

--
-- Создать индекс `phone` для объекта типа таблица `user`
--
ALTER TABLE user
ADD UNIQUE INDEX phone (phone);

--
-- Создать таблицу `status`
--
CREATE TABLE status (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(255) NOT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 4,
AVG_ROW_LENGTH = 8192,
CHARACTER SET utf8,
COLLATE utf8_general_ci;

--
-- Создать индекс `name` для объекта типа таблица `status`
--
ALTER TABLE status
ADD UNIQUE INDEX name (name);

--
-- Создать таблицу `order_info`
--
CREATE TABLE order_info (
  id int(11) NOT NULL AUTO_INCREMENT,
  id_user int(11) NOT NULL,
  id_status int(11) NOT NULL,
  date datetime NOT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 4,
AVG_ROW_LENGTH = 16384,
CHARACTER SET utf8,
COLLATE utf8_general_ci;

--
-- Создать внешний ключ
--
ALTER TABLE order_info
ADD CONSTRAINT FK_ord_status_id FOREIGN KEY (id_status)
REFERENCES status (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

--
-- Создать внешний ключ
--
ALTER TABLE order_info
ADD CONSTRAINT FK_ord_user_id FOREIGN KEY (id_user)
REFERENCES user (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

--
-- Создать таблицу `category`
--
CREATE TABLE category (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(255) NOT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 8,
AVG_ROW_LENGTH = 2340,
CHARACTER SET utf8,
COLLATE utf8_general_ci;

--
-- Создать индекс `name` для объекта типа таблица `category`
--
ALTER TABLE category
ADD UNIQUE INDEX name (name);

DELIMITER $$

--
-- Создать процедуру `selectParts`
--
CREATE PROCEDURE selectParts (upc varchar(255) CHARSET utf8, name varchar(255) CHARSET utf8, price_bottom dec(19, 2), price_upper dec(19, 2), categorys varchar(255) CHARSET utf8, suppliers varchar(255) CHARSET utf8)
BEGIN
  SELECT
    p.id,
    p.upc,
    p.name,
    p.price,
    c.id AS 'category',
    s.id AS 'supplier'
  FROM part p
    JOIN category c
      ON p.id_category = c.id
    JOIN supplier s
      ON p.id_supplier = s.id
  WHERE (upc = ''
  OR upc IS NULL
  OR p.upc LIKE CONCAT('%', upc, '%'))
  AND (name = ''
  OR name IS NULL
  OR p.name LIKE CONCAT('%', NAME, '%'))
  AND (p.price >= price_bottom
  AND p.price <= price_upper)
  AND (categorys = ''
  OR categorys IS NULL
  OR categorys LIKE CONCAT('%', CONVERT(p.id_category, char), '%'))
  AND (suppliers = ''
  OR suppliers IS NULL
  OR suppliers LIKE CONCAT('%', CONVERT(p.id_supplier, char), '%'));
END
$$

DELIMITER ;

--
-- Создать таблицу `part`
--
CREATE TABLE part (
  id int(11) NOT NULL AUTO_INCREMENT,
  upc varchar(255) NOT NULL,
  name varchar(255) NOT NULL,
  price decimal(19, 2) NOT NULL,
  id_category int(11) NOT NULL,
  id_supplier int(11) NOT NULL,
  description text DEFAULT NULL,
  image varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 22,
AVG_ROW_LENGTH = 2340,
CHARACTER SET utf8,
COLLATE utf8_general_ci;

--
-- Создать индекс `upc` для объекта типа таблица `part`
--
ALTER TABLE part
ADD UNIQUE INDEX upc (upc);

--
-- Создать внешний ключ
--
ALTER TABLE part
ADD CONSTRAINT FK_part_category_id FOREIGN KEY (id_category)
REFERENCES category (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

--
-- Создать внешний ключ
--
ALTER TABLE part
ADD CONSTRAINT FK_part_supplier_id FOREIGN KEY (id_supplier)
REFERENCES supplier (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

DELIMITER $$

--
-- Создать функцию `modifyPart`
--
CREATE FUNCTION modifyPart (id int, upc varchar(255) CHARSET utf8, name varchar(255) CHARSET utf8, price dec(19, 2), category_id varchar(255) CHARSET utf8, supplier_id varchar(255) CHARSET utf8)
RETURNS int(11)
BEGIN
  UPDATE part p
  SET p.upc = upc,
      p.name = name,
      p.price = price,
      p.id_category = category_id,
      p.id_supplier = supplier_id
  WHERE p.id = id;

  RETURN 1;
END
$$

--
-- Создать процедуру `partInfo`
--
CREATE PROCEDURE partInfo (id int)
BEGIN
  SELECT
    p.upc,
    p.name,
    p.price,
    c.name AS 'category',
    s.name AS 'supplier',
    p.description,
    p.image
  FROM part p
    JOIN category c
      ON p.id_category = c.id
    JOIN supplier s
      ON p.id_supplier = s.id
  WHERE p.id = id;
END
$$

DELIMITER ;

--
-- Создать таблицу `shop`
--
CREATE TABLE shop (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(255) NOT NULL,
  address varchar(255) NOT NULL,
  phone varchar(255) NOT NULL,
  email varchar(255) NOT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 3,
AVG_ROW_LENGTH = 8192,
CHARACTER SET utf8,
COLLATE utf8_general_ci;

--
-- Создать индекс `UK_shop` для объекта типа таблица `shop`
--
ALTER TABLE shop
ADD UNIQUE INDEX UK_shop (name, address);

--
-- Создать таблицу `part_shop`
--
CREATE TABLE part_shop (
  id int(11) NOT NULL AUTO_INCREMENT,
  id_part int(11) NOT NULL,
  id_shop int(11) NOT NULL,
  count int(11) NOT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 15,
AVG_ROW_LENGTH = 2048,
CHARACTER SET utf8,
COLLATE utf8_general_ci;

--
-- Создать индекс `UK_stock` для объекта типа таблица `part_shop`
--
ALTER TABLE part_shop
ADD UNIQUE INDEX UK_stock (id_part, id_shop);

--
-- Создать внешний ключ
--
ALTER TABLE part_shop
ADD CONSTRAINT FK_part_shop_shop_id FOREIGN KEY (id_shop)
REFERENCES shop (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

--
-- Создать внешний ключ
--
ALTER TABLE part_shop
ADD CONSTRAINT FK_stock_part_id FOREIGN KEY (id_part)
REFERENCES part (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

DELIMITER $$

--
-- Создать функцию `modifySupply`
--
CREATE FUNCTION modifySupply (part_id int, shop_id int, supply int)
RETURNS int(11)
BEGIN
  UPDATE part_shop ps
  SET ps.count = ps.count + supply
  WHERE ps.id_part = part_id
  AND ps.id_shop = shop_id;


  RETURN 1;
END
$$

--
-- Создать функцию `addNewPart`
--
CREATE FUNCTION addNewPart (upc varchar(255) CHARSET utf8, name varchar(255) CHARSET utf8, price dec(19, 2), category_id int, supplier_id int)
RETURNS int(11)
BEGIN
  DECLARE part_id int;
  DECLARE shop_id int;
  DECLARE n int;
  DECLARE i int;

  INSERT IGNORE INTO part
    VALUES (NULL, upc, name, price, category_id, supplier_id);

  SELECT
    LAST_INSERT_ID() INTO part_id;

  SELECT
    COUNT(*)
  FROM shop s INTO n;

  SET i = 1;
  WHILE i <= n DO
    INSERT IGNORE INTO part_shop
      VALUES (NULL, part_id, i, 0);
    SET i = i + 1;
  END WHILE;

  RETURN 1;
END
$$

--
-- Создать функцию `addNewOrd`
--
CREATE FUNCTION addNewOrd (user_id int, part_id int, shop_id int, ord_count int)
RETURNS int(11)
BEGIN
  DECLARE order_info_id int;
  DECLARE part_shop_id int;
  DECLARE part_count int;

  SELECT
    ps.id,
    ps.count INTO part_shop_id, part_count
  FROM part_shop ps
  WHERE ps.id_part = part_id
  AND ps.id_shop = shop_id;

  IF (part_count < ord_count) THEN
    RETURN 0;
  END IF;

  INSERT IGNORE INTO order_info
    VALUES (NULL, user_id, 1, CURDATE());

  SELECT
    LAST_INSERT_ID() INTO order_info_id;

  UPDATE part_shop ps
  SET ps.count = ps.count - ord_count
  WHERE ps.id = part_shop_id;

  INSERT IGNORE INTO ord
    VALUE (NULL, order_info_id, part_shop_id, ord_count);

  RETURN 1;
END
$$

--
-- Создать процедуру `partStock`
--
CREATE PROCEDURE partStock (id int)
BEGIN
  SELECT
    s.name,
    ps.count
  FROM part p
    JOIN part_shop ps
      ON p.id = ps.id_part
    JOIN shop s
      ON ps.id_shop = s.id
  WHERE ps.id_part = id;
END
$$

DELIMITER ;

--
-- Создать таблицу `ord`
--
CREATE TABLE ord (
  id int(11) NOT NULL AUTO_INCREMENT,
  id_order_info int(11) NOT NULL,
  id_part_shop int(11) NOT NULL,
  count int(11) NOT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 2,
CHARACTER SET utf8,
COLLATE utf8_general_ci;

--
-- Создать индекс `FK_ord_parts_ord_id` для объекта типа таблица `ord`
--
ALTER TABLE ord
ADD INDEX FK_ord_parts_ord_id (id_order_info);

--
-- Создать индекс `FK_ord_parts_part_id` для объекта типа таблица `ord`
--
ALTER TABLE ord
ADD INDEX FK_ord_parts_part_id (id_part_shop);

--
-- Создать индекс `UK_ord` для объекта типа таблица `ord`
--
ALTER TABLE ord
ADD UNIQUE INDEX UK_ord (id_order_info, id_part_shop);

--
-- Создать внешний ключ
--
ALTER TABLE ord
ADD CONSTRAINT FK_ord_order_info_id FOREIGN KEY (id_order_info)
REFERENCES order_info (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

--
-- Создать внешний ключ
--
ALTER TABLE ord
ADD CONSTRAINT FK_ord_part_shop_id FOREIGN KEY (id_part_shop)
REFERENCES part_shop (id) ON DELETE NO ACTION ON UPDATE NO ACTION;

DELIMITER $$

--
-- Создать функцию `isUserAdmin`
--
CREATE FUNCTION isUserAdmin (login varchar(255) CHARSET utf8)
RETURNS tinyint(1)
BEGIN
  DECLARE is_user_admin bool;
  SELECT
    is_admin INTO is_user_admin
  FROM user u
  WHERE u.login = login;
  RETURN is_user_admin;
END
$$

--
-- Создать функцию `handleLogin`
--
CREATE FUNCTION handleLogin (login varchar(255) CHARSET utf8, password varchar(255) CHARSET utf8)
RETURNS int(11)
BEGIN
  DECLARE existing_users int;
  SELECT
    COUNT(*) INTO existing_users
  FROM user u
  WHERE u.login = login
  AND u.PASSWORD = [REDACTED]

  IF (existing_users > 0) THEN
    RETURN 1;
  ELSE
    RETURN 0;
  END IF;
END
$$

--
-- Создать функцию `addNewUser`
--
CREATE FUNCTION addNewUser (login varchar(255) CHARSET utf8, password varchar(255) CHARSET utf8, name varchar(255) CHARSET utf8, surname varchar(255) CHARSET utf8, phone varchar(255) CHARSET utf8, email varchar(255) CHARSET utf8, address varchar(255) CHARSET utf8)
RETURNS int(11)
BEGIN
  DECLARE loginCount int;
  DECLARE phoneCount int;
  DECLARE emailCount int;

  SELECT
    COUNT(*) INTO loginCount
  FROM user u
  WHERE u.login = login;

  IF (loginCount > 0) THEN
    RETURN 0;
  END IF;

  SELECT
    COUNT(*) INTO phoneCount
  FROM user u
  WHERE u.phone = phone;

  IF (phoneCount > 0) THEN
    RETURN 1;
  END IF;

  SELECT
    COUNT(*) INTO emailCount
  FROM user u
  WHERE u.email = email;

  IF (emailCount > 0) THEN
    RETURN 2;
  END IF;

  INSERT IGNORE INTO user
    VALUES (NULL, login, password, name, surname, phone, email, address, 0);

  RETURN 3;
END
$$

DELIMITER ;

-- 
-- Вывод данных для таблицы supplier
--
INSERT INTO supplier VALUES
(1, 'Compart', 'ул. Гидротехников, д. 155', '+7 (911) 324-03-22', 'office@comp.ru'),
(2, 'WalrusTorg', 'ул. Пролетарская, д. 154', '+7 (905) 259-21-89', 'office@waltorg.ru');

-- 
-- Вывод данных для таблицы category
--
INSERT INTO category VALUES
(5, 'Блок питания'),
(2, 'Видеокарта'),
(7, 'Жесткий диск'),
(6, 'Корпус'),
(4, 'Материнская плата'),
(3, 'Оперативная память'),
(1, 'Процессор');

-- 
-- Вывод данных для таблицы shop
--
INSERT INTO shop VALUES
(1, 'Магазин в ТК Алоха', 'ул. Тютчевская, д. 2', '+7 (932) 139-73-10', 'tutchevskaya15@novparts.ru'),
(2, 'Магазин у ст. м. Чёрная речка', 'ул. Савушкина, д. 56', '+7 (924) 098-32-12', 'savushkina56@novparts.ru');

-- 
-- Вывод данных для таблицы part
--
INSERT INTO part VALUES
(15, '75764839123', 'AMD Ryzen 5 3600 OEM', 15990.99, 1, 2, NULL, NULL),
(16, '321981321321', 'Gigabyte GeForce GTX 1050Ti', 15990.99, 2, 2, NULL, NULL),
(17, '123453289123', 'Palit Gaming Pro GeForce RTX 3070', 119000.99, 2, 1, NULL, NULL),
(18, '987654321321', 'MSI X470 AM4 Gaming Plus Max', 7990.99, 4, 2, NULL, NULL),
(19, '541269041211', 'norm', 1999.99, 7, 1, NULL, NULL),
(20, '123456543214', 'eee', 199.12, 4, 2, NULL, NULL),
(21, '999999999999', 'test', 1234.99, 4, 1, NULL, NULL);

-- 
-- Вывод данных для таблицы user
--
INSERT INTO user VALUES
(1, 'erius', 'Roge2003', 'Егор', 'Капралов', 89052592189, 'egor_kapralov2003@mail.ru', 'ул. Рогожский Поселок, д. 113', 1),
(2, 'WalrusYT', 'LubluMamy2003', 'Илья', 'Тат', 89630899425, 'taytsev@mail.ru', 'ул. Дружбы, д. 7', 0),
(3, 'arcwarden', 'pudgemom', 'Стэко', 'Слэйв', 89577366567, 'xrenxrenxrenxren@mail.ru', 'ул. Ращупкина, д. 21', 0),
(4, 'pupkin', 'vasya123', 'Вася', 'Пупкин', 89113451232, 'vasya_pupkin@mail.ru', 'ул. Ясеневая, д. 77', 0),
(5, 'erius1', 'wasd123', 'egor', 'karpov', 89052592169, 'wasd@mail.ru', 'ул. Пушкина, д. 1', 0),
(6, 'black', 'bigpig', 'слэкос', 'на бабках', 822813371488, 'xrenxrenxrenxren@yandex.dot', 'не скажу', 0),
(7, 'ernest', 'wasd', 'Ерог', 'Карпов', 89052592117, 'egor_kapralov1993@mail.ru', 'нет', 0),
(9, 'elka', '123', 'Елена', 'Комарова', 1111111111, 'ekom@yandex.ru', 'не скажу', 0),
(10, 'erius123', 'wasd', 'Егор', 'Капралов', 8888888888, 'egor_kapralov321312@mail.ru', 'не скажу', 0);

-- 
-- Вывод данных для таблицы status
--
INSERT INTO status VALUES
(2, 'Можно забрать'),
(1, 'Ожидает прибытия'),
(3, 'Отменен');

-- 
-- Вывод данных для таблицы part_shop
--
INSERT INTO part_shop VALUES
(1, 15, 1, 0),
(2, 15, 2, 0),
(3, 16, 1, 8),
(4, 16, 2, 0),
(5, 17, 1, 0),
(6, 17, 2, 0),
(7, 18, 1, 0),
(8, 18, 2, 0),
(9, 19, 1, 0),
(10, 19, 2, 0),
(11, 20, 1, 0),
(12, 20, 2, 0),
(13, 21, 1, 0),
(14, 21, 2, 0);

-- 
-- Вывод данных для таблицы order_info
--
INSERT INTO order_info VALUES
(3, 1, 1, '2021-04-07 00:00:00');

-- 
-- Вывод данных для таблицы ord
--
INSERT INTO ord VALUES
(1, 3, 3, 2);

-- 
-- Восстановить предыдущий режим SQL (SQL mode)
-- 
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

-- 
-- Включение внешних ключей
-- 
/*!40014 SET FOREIGN_KEY_CHECKS = @OLD_FOREIGN_KEY_CHECKS */;