Загрузка данных


-- =============================================
-- База данных: Сроки годности товаров
-- =============================================

CREATE DATABASE IF NOT EXISTS `goods_expiration` 
    CHARACTER SET utf8mb4 
    COLLATE utf8mb4_unicode_ci;

USE `goods_expiration`;

-- =============================================
-- 1. Справочник товаров
-- =============================================
CREATE TABLE `Товар` (
    `Код_товара`       VARCHAR(20)     NOT NULL,
    `Название`         VARCHAR(150)    NOT NULL,
    `Единица_измерения` VARCHAR(20)     NOT NULL DEFAULT 'шт',
    `Срок_годности_дни` INT             NOT NULL,
    `Характеристики`   TEXT            NULL,
    `Цена`             DECIMAL(12,2)   NOT NULL DEFAULT 0.00,
    
    PRIMARY KEY (`Код_товара`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =============================================
-- 2. Поставщики
-- =============================================
CREATE TABLE `Поставщик` (
    `Код_поставщика`   VARCHAR(20)     NOT NULL,
    `Название_фирмы`   VARCHAR(120)    NOT NULL,
    `Директор`         VARCHAR(100)    NULL,
    `Телефон`          VARCHAR(30)     NULL,
    `Адрес`            VARCHAR(255)    NULL,
    `Email`            VARCHAR(100)    NULL,
    
    PRIMARY KEY (`Код_поставщика`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =============================================
-- 3. Склады
-- =============================================
CREATE TABLE `Склад` (
    `Код_склада`       VARCHAR(20)     NOT NULL,
    `Название`         VARCHAR(100)    NOT NULL,
    `Адрес`            VARCHAR(255)    NULL,
    `Телефон`          VARCHAR(30)     NULL,
    `Ответственный`    VARCHAR(100)    NULL,
    
    PRIMARY KEY (`Код_склада`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =============================================
-- 4. Партии товаров (главная таблица модуля)
-- =============================================
CREATE TABLE `Партия_товара` (
    `Код_партии`       VARCHAR(30)     NOT NULL,
    `Код_товара`       VARCHAR(20)     NOT NULL,
    `Дата_производства` DATE            NULL,
    `Дата_поступления` DATE            NOT NULL,
    `Дата_истечения`   DATE            NOT NULL,
    `Количество`       INT UNSIGNED    NOT NULL DEFAULT 0,
    `Код_склада`       VARCHAR(20)     NOT NULL,
    `Код_поставщика`   VARCHAR(20)     NOT NULL,
    `Статус`           ENUM('В_норме', 'Близко_к_окончанию', 'Просрочен') 
                       NOT NULL DEFAULT 'В_норме',
    
    PRIMARY KEY (`Код_партии`),
    FOREIGN KEY (`Код_товара`)     REFERENCES `Товар`(`Код_товара`) ON DELETE RESTRICT,
    FOREIGN KEY (`Код_склада`)     REFERENCES `Склад`(`Код_склада`) ON DELETE RESTRICT,
    FOREIGN KEY (`Код_поставщика`) REFERENCES `Поставщик`(`Код_поставщика`) ON DELETE RESTRICT,
    
    INDEX idx_дата_истечения (`Дата_истечения`),
    INDEX idx_статус (`Статус`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =============================================
-- 5. Уведомления
-- =============================================
CREATE TABLE `Уведомление` (
    `ID_уведомления`   INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    `Код_партии`       VARCHAR(30)     NOT NULL,
    `Дата_уведомления` DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `Тип`              ENUM('Предупреждение', 'Просрочка', 'Информация') 
                       NOT NULL,
    `Сообщение`        TEXT            NOT NULL,
    `Отправлено`       TINYINT(1)      NOT NULL DEFAULT 0,
    
    PRIMARY KEY (`ID_уведомления`),
    FOREIGN KEY (`Код_партии`) REFERENCES `Партия_товара`(`Код_партии`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =============================================
-- 6. Представление (View) для удобного отчёта
-- =============================================
CREATE OR REPLACE VIEW `Товары_на_складе_с_сроками` AS
SELECT 
    t.`Название` AS Товар,
    p.`Код_партии`,
    p.`Дата_поступления`,
    p.`Дата_истечения`,
    DATEDIFF(p.`Дата_истечения`, CURDATE()) AS Дней_до_истечения,
    p.`Количество`,
    p.`Статус`,
    s.`Название` AS Склад,
    sup.`Название_фирмы` AS Поставщик
FROM `Партия_товара` p
JOIN `Товар` t ON p.`Код_товара` = t.`Код_товара`
JOIN `Склад` s ON p.`Код_склада` = s.`Код_склада`
JOIN `Поставщик` sup ON p.`Код_поставщика` = sup.`Код_поставщика`
ORDER BY p.`Дата_истечения`;