Структура БД
Обновлено: 12.08.2026CRM "Леотехно" — это система управления заказами, клиентами и товарами.
База данных содержит 15 основных таблиц, которые охватывают:
- Пользователей и роли — авторизация и разграничение прав
- Клиентов — контрагенты, адреса, телефоны, скидки
- Товары — ассортимент, цены, остатки
- Заказы — счета, позиции, статусы, история
- Логи и уведомления — аудит, почта, уведомления
- Настройки — конфигурация системы
Ниже представлено подробное описание каждой таблицы.
🔗 Связи между таблицами
users (1) ─────┐
├── clients (manager_id)
├── orders (created_by)
├── discount_history (changed_by)
├── order_status_history (changed_by)
└── activity_logs (user_id)
clients (1) ───┬── client_phones
├── delivery_addresses
├── discount_history
├── notification_emails
├── carts
└── orders
orders (1) ────┬── order_items
├── order_status_history
├── notification_log
└── clients
products (1) ──┴── order_items
📑 Содержание
- Пользователи системы (users)
- Клиенты (clients)
- Телефоны клиентов (client_phones)
- Адреса доставки (delivery_addresses)
- Товары (products)
- Заказы/счета (orders)
- Позиции заказа (order_items)
- История статусов (order_status_history)
- Корзины (carts)
- История скидок (discount_history)
- Лог активности (activity_logs)
- Email-уведомления (notification_emails)
- Лог уведомлений (notification_log)
- Права доступа для ролей пользователей (permissions)
- Настройки системы (settings)
- Полный список таблиц
Таблица: users
Описание
Хранит данные о пользователях системы — администраторах, менеджерах и просмотрщиках.
Назначение
- Аутентификация и авторизация
- Разграничение прав доступа
- Аудит действий
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
username |
varchar(50) | ✅ | Логин пользователя (уникальный) |
email |
varchar(255) | ✅ | Email (уникальный) |
password_hash |
varchar(255) | ✅ | Хеш пароля (bcrypt) |
full_name |
varchar(255) | ❌ | Полное имя пользователя |
role |
enum | ✅ | Роль: admin, manager, viewer |
is_active |
tinyint(1) | ❌ | Активен (1) / Неактивен (0) |
status |
enum | ❌ | active, inactive, deleted |
last_login |
timestamp | ❌ | Время последнего входа |
deleted_at |
timestamp | ❌ | Время удаления |
deactivated_at |
timestamp | ❌ | Время деактивации |
deactivated_by |
int(11) | ❌ | ID пользователя, кто деактивировал |
deleted_by |
int(11) | ❌ | ID пользователя, кто удалил |
created_at |
timestamp | ✅ | Дата создания |
updated_at |
timestamp | ✅ | Дата обновления |
Роли пользователей
| Роль | Права |
|---|---|
admin |
Полный доступ ко всему |
manager |
Управление клиентами, заказами, товарами |
viewer |
Только просмотр |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
username |
username |
UNIQUE |
email |
email |
UNIQUE |
idx_username |
username |
INDEX |
idx_email |
email |
INDEX |
idx_role |
role |
INDEX |
idx_status |
status |
INDEX |
idx_is_active |
is_active |
INDEX |
idx_deleted_at |
deleted_at |
INDEX |
Связи
clients— закрепленные менеджеры (manager_id)orders— созданные заказы (created_by)discount_history— изменения скидок (changed_by)order_status_history— изменения статусов (changed_by)activity_logs— логи действий (user_id)
Пример запроса
-- Получить всех активных менеджеров
SELECT * FROM users
WHERE role = 'manager'
AND status = 'active'
AND is_active = 1;
-- Последние 10 входов в систему
SELECT full_name, email, last_login
FROM users
WHERE last_login IS NOT NULL
ORDER BY last_login DESC
LIMIT 10;
Примечания
- Пароли хешируются с помощью
password_hash() (bcrypt) - Удаление — мягкое (
status = 'deleted') - Деактивация — мягкая (
status = 'inactive')
2. clients — Клиенты
Таблица: clients
Описание
Хранит информацию о клиентах/контрагентах компании.
Назначение
- Управление клиентской базой
- Индивидуальные условия (скидки, отсрочка)
- Авторизация клиентов в личном кабинете
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
company_name |
varchar(255) | ✅ | Название компании |
tax_id |
varchar(50) | ❌ | УНП (ИНН) |
legal_address |
text | ❌ | Юридический адрес |
email |
varchar(255) | ✅ | Email (используется как логин) |
contact_person |
varchar(255) | ❌ | Контактное лицо (ФИО) |
contact_phone |
varchar(50) | ❌ | Контактный телефон |
comment |
text | ❌ | Комментарий менеджера |
manager_id |
int(11) | ❌ | Закрепленный менеджер (users.id) |
password_hash |
varchar(255) | ✅ | Хеш пароля для входа |
is_active |
tinyint(1) | ❌ | Активен (1) / Неактивен (0) |
discount_percent |
decimal(5,2) | ❌ | Индивидуальная скидка (%) |
payment_delay |
int(11) | ❌ | Индивидуальная отсрочка (дней) |
created_by |
int(11) | ❌ | ID пользователя, создавшего клиента |
created_at |
timestamp | ✅ | Дата создания |
updated_at |
timestamp | ✅ | Дата обновления |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
email |
email |
UNIQUE |
idx_company_name |
company_name |
INDEX |
idx_email |
email |
INDEX |
idx_tax_id |
tax_id |
INDEX |
idx_discount |
discount_percent |
INDEX |
idx_payment_delay |
payment_delay |
INDEX |
idx_manager_id |
manager_id |
INDEX |
Связи
users— закрепленный менеджер (многие к одному)client_phones— телефоны (один ко многим)delivery_addresses— адреса доставки (один ко многим)orders— заказы (один ко многим)discount_history— история скидок (один ко многим)notification_emails— уведомления (один ко многим)carts— корзины (один ко многим)
Пример запроса
-- Получить клиентов с наибольшей суммой заказов
SELECT
c.company_name,
COUNT(o.id) as orders_count,
SUM(o.total_amount) as total_spent
FROM clients c
LEFT JOIN orders o ON c.id = o.client_id
WHERE o.status != 'cancelled' AND o.status != 'sent'
GROUP BY c.id
ORDER BY total_spent DESC
LIMIT 10;
Примечания
- Клиенты могут входить в личный кабинет через
email + password_hash - Скидка применяется автоматически при создании заказа
- Если
payment_delayне указан — используется значение из настроек
3. client_phones — Телефоны клиентов
Таблица: client_phones
Описание
Хранит телефоны клиентов. Поддерживает несколько номеров на одного клиента.
Назначение
- Хранение всех контактов клиента
- Выбор основного номера
- Типизация телефонов (рабочий, мобильный, домашний)
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
client_id |
int(11) | ✅ | ID клиента |
phone |
varchar(20) | ✅ | Номер телефона |
type |
enum | ❌ | Тип: work, mobile, home |
is_primary |
tinyint(1) | ❌ | Основной телефон (1 — да) |
created_at |
timestamp | ✅ | Дата создания |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
idx_client |
client_id |
INDEX |
idx_phone |
phone |
INDEX |
Связи
clients— клиент (многие к одному)
Пример запроса
-- Получить все телефоны клиента
SELECT phone, type, is_primary
FROM client_phones
WHERE client_id = 2
ORDER BY is_primary DESC, type;
Примечания
- Если у клиента один телефон, он автоматически становится основным
- При добавлении нового телефона можно указать
is_primary = 1
4. delivery_addresses — Адреса доставки
Таблица: delivery_addresses
Описание
Хранит адреса доставки клиентов. Один клиент может иметь несколько адресов.
Назначение
- Хранение всех адресов клиента
- Выбор адреса при создании заказа
- Активность/неактивность адресов
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
client_id |
int(11) | ✅ | ID клиента |
address |
text | ✅ | Адрес доставки |
contact_person |
varchar(255) | ❌ | Контактное лицо для адреса |
contact_phone |
varchar(20) | ❌ | Телефон для адреса |
is_primary |
tinyint(1) | ❌ | Основной адрес (1 — да) |
is_active |
tinyint(1) | ❌ | Активен (1 — да) |
created_at |
timestamp | ✅ | Дата создания |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
idx_client |
client_id |
INDEX |
idx_active |
is_active |
INDEX |
Связи
clients— клиент (многие к одному)orders— заказы (один ко многим) черезdelivery_address_id
Пример запроса
-- Получить все активные адреса клиента
SELECT address, contact_person, contact_phone
FROM delivery_addresses
WHERE client_id = 2 AND is_active = 1
ORDER BY is_primary DESC;
Примечания
- Адреса можно деактивировать (
is_active = 0), чтобы не показывать в выборе - Основной адрес используется по умолчанию в заказах
5. products — Товары
Таблица: products
Описание
Хранит товары/продукцию компании (герметики, клеи и т.д.).
Назначение
- Управление ассортиментом
- Ценообразование
- Учет остатков
- Группировка товаров
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
product_group |
varchar(100) | ✅ | Группа товара |
name |
varchar(255) | ✅ | Наименование |
gtin |
varchar(20) | ❌ | Штрихкод (уникальный) |
volume |
int(11) | ✅ | Объем (в мл или граммах) |
unit |
varchar(50) | ❌ | Единица: мл, г, кг |
per_box |
int(11) | ✅ | Количество в коробке |
color |
varchar(50) | ❌ | Цвет (HEX или название) |
price |
decimal(10,2) | ✅ | Цена с НДС |
description_url |
varchar(500) | ❌ | Ссылка на описание товара |
stock_quantity |
int(11) | ❌ | Остаток на складе |
is_active |
tinyint(1) | ❌ | Активен (1 — да) |
created_at |
timestamp | ✅ | Дата создания |
updated_at |
timestamp | ✅ | Дата обновления |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
gtin |
gtin |
UNIQUE |
idx_group |
product_group |
INDEX |
idx_gtin |
gtin |
INDEX |
idx_active |
is_active |
INDEX |
idx_unit |
unit |
INDEX |
Связи
order_items— позиции заказов (один ко многим)
Пример запроса
-- Товары с низким остатком (< 10)
SELECT
product_group,
name,
stock_quantity,
price
FROM products
WHERE stock_quantity < 10
AND is_active = 1
ORDER BY stock_quantity ASC;
-- Топ-10 самых продаваемых товаров
SELECT
p.name,
p.product_group,
SUM(oi.quantity) as total_sold,
p.price
FROM products p
JOIN order_items oi ON p.id = oi.product_id
JOIN orders o ON oi.order_id = o.id
WHERE o.status != 'cancelled'
GROUP BY p.id
ORDER BY total_sold DESC
LIMIT 10;
Примечания
- Группы товаров: Полиуретаны, Гибридные (MS полимер), Силиконы, GOM Клея
- Цена всегда указывается с НДС
stock_quantityобновляется автоматически при создании заказов
6. orders — Заказы/счета
Таблица: orders
Описание
Хранит заказы/счета клиентов.
Назначение
- Управление заказами
- Формирование счетов
- Отслеживание статусов
- Расчет сумм со скидками
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
invoice_number |
varchar(50) | ✅ | Номер счета (уникальный) |
client_id |
int(11) | ✅ | ID клиента |
delivery_address_id |
int(11) | ❌ | Адрес доставки |
order_date |
date | ✅ | Дата заказа |
desired_delivery_date |
date | ❌ | Желаемая дата доставки |
desired_delivery_time |
varchar(50) | ❌ | Желаемое время доставки |
planned_delivery_date |
date | ❌ | Планируемая дата доставки |
payment_delay |
int(11) | ❌ | Отсрочка платежа (дней) |
status |
enum | ❌ | Статус заказа |
subtotal |
decimal(12,2) | ✅ | Сумма до скидки |
subtotal_original |
decimal(12,2) | ❌ | Исходная сумма без скидки |
discount_percent |
decimal(5,2) | ❌ | Скидка (%) |
discount_amount |
decimal(12,2) | ❌ | Сумма скидки |
total_amount |
decimal(12,2) | ✅ | Итоговая сумма |
vat_amount |
decimal(10,2) | ❌ | Сумма НДС |
comment |
text | ❌ | Комментарий к заказу |
manager_comment |
text | ❌ | Комментарий менеджера |
created_by |
int(11) | ❌ | ID создателя заказа |
created_at |
timestamp | ✅ | Дата создания |
updated_at |
timestamp | ✅ | Дата обновления |
Статусы заказов
| Статус | Описание |
|---|---|
sent |
Счет отправлен клиенту |
accepted |
Счет принят клиентом |
planned |
Запланирована отгрузка |
shipped |
Отгружен |
cancelled |
Отменен |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
invoice_number |
invoice_number |
UNIQUE |
idx_client |
client_id |
INDEX |
idx_invoice |
invoice_number |
INDEX |
idx_status |
status |
INDEX |
idx_order_date |
order_date |
INDEX |
Связи
clients— клиент (многие к одному)delivery_addresses— адрес доставки (многие к одному)order_items— позиции заказа (один ко многим)order_status_history— история статусов (один ко многим)notification_log— уведомления (один ко многим)
Пример запроса
-- Заказы за последние 30 дней
SELECT
invoice_number,
order_date,
status,
total_amount
FROM orders
WHERE order_date >= CURDATE() - INTERVAL 30 DAY
ORDER BY order_date DESC;
-- Сумма заказов по статусам
SELECT
status,
COUNT(*) as count,
SUM(total_amount) as total
FROM orders
GROUP BY status;
Примечания
invoice_numberгенерируется автоматически:ORD-YYYYMM-XXXXsubtotal_original— сумма без скидки (для истории)- При обновлении скидки пересчитываются автоматически
7. order_items — Позиции заказа
Таблица: order_items
Описание
Хранит позиции заказа (товары, количество, цены).
Назначение
- Детализация заказа
- Фиксация цен на момент заказа
- Расчет НДС по каждой позиции
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
order_id |
int(11) | ✅ | ID заказа |
product_id |
int(11) | ✅ | ID товара |
quantity |
int(11) | ✅ | Количество (> 0) |
unit |
varchar(10) | ❌ | Единица измерения |
price_at_time |
decimal(10,2) | ✅ | Цена с НДС на момент заказа |
price_without_vat |
decimal(10,2) | ❌ | Цена без НДС |
vat_amount |
decimal(10,2) | ❌ | НДС на единицу |
total |
decimal(12,2) | ✅ | Сумма с НДС |
total_without_vat |
decimal(10,2) | ❌ | Сумма без НДС |
total_vat |
decimal(10,2) | ❌ | Сумма НДС |
created_at |
timestamp | ✅ | Дата создания |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
idx_order |
order_id |
INDEX |
idx_product |
product_id |
INDEX |
Связи
orders— заказ (многие к одному)products— товар (многие к одному)
Пример запроса
-- Детали заказа с товарами
SELECT
o.invoice_number,
p.name as product_name,
oi.quantity,
oi.price_at_time,
oi.total
FROM orders o
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id
WHERE o.id = 1;
Примечания
- Цены фиксируются на момент создания заказа
- При изменении цены товара — старые заказы не пересчитываются
quantityпроверяется на> 0 (CHECK constraint)
8. order_status_history — История статусов
Таблица: order_status_history
Описание
Хранит историю изменения статусов заказов.
Назначение
- Аудит изменений статусов
- Отслеживание времени каждого статуса
- Анализ цикла заказа
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
order_id |
int(11) | ✅ | ID заказа |
old_status |
varchar(50) | ❌ | Старый статус |
new_status |
varchar(50) | ✅ | Новый статус |
changed_by |
int(11) | ❌ | ID пользователя, изменившего статус |
comment |
text | ❌ | Комментарий к изменению |
created_at |
timestamp | ✅ | Время изменения |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
idx_order |
order_id |
INDEX |
idx_created |
created_at |
INDEX |
Связи
orders— заказ (многие к одному)users— пользователь (многие к одному)
Пример запроса
-- Весь жизненный цикл заказа
SELECT
new_status,
comment,
created_at
FROM order_status_history
WHERE order_id = 1
ORDER BY created_at ASC;
Примечания
- При создании заказа добавляется запись с
new_status = 'sent' - Каждое изменение статуса логируется
old_statusможет бытьNULLдля первого статуса
9. carts — Корзины
Таблица: carts
Описание
Хранит корзины клиентов (временные данные).
Назначение
- Сохранение товаров до оформления заказа
- Поддержка сессий для неавторизованных пользователей
- Восстановление корзины при возврате
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
session_id |
varchar(64) | ✅ | ID сессии (уникальный) |
client_id |
int(11) | ❌ | ID клиента (если авторизован) |
items |
longtext JSON | ✅ | Товары в корзине (JSON) |
total |
decimal(12,2) | ❌ | Общая сумма |
expires_at |
timestamp | ✅ | Время истечения |
created_at |
timestamp | ✅ | Дата создания |
updated_at |
timestamp | ✅ | Дата обновления |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
session_id |
session_id |
UNIQUE |
idx_session |
session_id |
INDEX |
idx_expires |
expires_at |
INDEX |
Связи
clients— клиент (многие к одному)
Пример запроса
-- Очистить просроченные корзины
DELETE FROM carts WHERE expires_at < NOW();
Примечания
items— JSON-массив с товарами:[{"product_id": 1, "quantity": 2}]expires_at— корзины автоматически удаляются через 7 дней- Для авторизованных клиентов корзина восстанавливается после входа
10. discount_history — История скидок
Таблица: discount_history
Описание
Хранит историю изменений скидок клиентов.
Назначение
- Аудит изменений скидок
- Отслеживание кто и когда менял скидку
- Анализ динамики скидок
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
client_id |
int(11) | ✅ | ID клиента |
old_discount |
decimal(5,2) | ❌ | Старая скидка (%) |
new_discount |
decimal(5,2) | ❌ | Новая скидка (%) |
changed_by |
int(11) | ❌ | ID пользователя, изменившего скидку |
reason |
text | ❌ | Причина изменения |
created_at |
timestamp | ✅ | Время изменения |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
idx_client |
client_id |
INDEX |
idx_created |
created_at |
INDEX |
Связи
clients— клиент (многие к одному)users— пользователь (многие к одному)
Пример запроса
-- История скидок клиента
SELECT
c.company_name,
dh.old_discount,
dh.new_discount,
u.full_name as changed_by,
dh.reason,
dh.created_at
FROM discount_history dh
JOIN clients c ON dh.client_id = c.id
LEFT JOIN users u ON dh.changed_by = u.id
WHERE dh.client_id = 2
ORDER BY dh.created_at DESC;
Примечания
- Записывается каждое изменение скидки
reason— свободное поле для комментария менеджера
11. activity_logs — Лог активности
Таблица: activity_logs
Описание
Хранит логи действий пользователей в системе.
Назначение
- Аудит системы
- Отслеживание изменений
- Безопасность
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
user_id |
int(11) | ❌ | ID пользователя |
action |
varchar(100) | ✅ | Действие |
entity_type |
varchar(50) | ❌ | Тип сущности |
entity_id |
int(11) | ❌ | ID сущности |
old_values |
JSON | ❌ | Старые значения (JSON) |
new_values |
JSON | ❌ | Новые значения (JSON) |
ip_address |
varchar(45) | ❌ | IP-адрес |
user_agent |
text | ❌ | User Agent |
created_at |
timestamp | ✅ | Время действия |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
idx_user |
user_id |
INDEX |
idx_action |
action |
INDEX |
idx_entity |
entity_type, entity_id |
INDEX |
idx_created |
created_at |
INDEX |
Связи
users— пользователь (многие к одному)
Пример запроса
-- Последние 20 действий в системе
SELECT
u.full_name,
action,
entity_type,
entity_id,
created_at
FROM activity_logs al
LEFT JOIN users u ON al.user_id = u.id
ORDER BY created_at DESC
LIMIT 20;
Примечания
- Логируются все CRUD-операции
old_valuesиnew_values— JSON для сравнения
IP и User Agent помогают в расследованиях инцидентов
12. notification_emails — Email-уведомления
Таблица: notification_emails
Описание
Хранит email-адреса для уведомлений.
Назначение
- Рассылка уведомлений клиентам
- Дополнительные email для копий
- Управление подписками
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
client_id |
int(11) | ❌ | ID клиента (если привязан) |
email |
varchar(255) | ✅ | Email-адрес |
receive_notifications |
tinyint(1) | ❌ | Получать уведомления (1 — да) |
is_primary |
tinyint(1) | ❌ | Основной email (1 — да) |
is_active |
tinyint(1) | ❌ | Активен (1 — да) |
created_at |
timestamp | ✅ | Дата создания |
updated_at |
timestamp | ✅ | Дата обновления |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
idx_client_email |
client_id, email |
UNIQUE |
idx_client |
client_id |
INDEX |
idx_email |
email |
INDEX |
Связи
clients— клиент (многие к одному)
Пример запроса
-- Получить все активные email для уведомлений
SELECT email, is_primary
FROM notification_emails
WHERE receive_notifications = 1
AND is_active = 1
AND (client_id = 2 OR client_id IS NULL);
Примечания
client_id = NULL— системные email (например,[email protected])is_primary— основной email для связи- При отписке можно установить
receive_notifications = 0
13. notification_log — Лог уведомлений
Таблица: notification_log
Описание
Хранит историю отправленных уведомлений (email, Telegram, системные).
Назначение
- Отслеживание доставки уведомлений
- Диагностика проблем с отправкой
- Аудит коммуникаций с клиентами
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
order_id |
int(11) | ✅ | ID заказа |
type |
varchar(50) | ✅ | Тип уведомления |
status |
varchar(20) | ✅ | Статус отправки: success, failed, pending |
created_at |
timestamp | ✅ | Время отправки |
Типы уведомлений
| Тип | Описание |
|---|---|
order_created |
Создан новый заказ |
order_status_changed |
Изменен статус заказа |
payment_reminder |
Напоминание об оплате |
delivery_confirmation |
Подтверждение доставки |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
idx_order |
order_id |
INDEX |
Связи
orders— заказ (многие к одному)
Пример запроса
-- Получить все уведомления по заказу
SELECT * FROM notification_log
WHERE order_id = 1
ORDER BY created_at DESC;
Примечания
status = 'success'— уведомление отправлено успешноstatus = 'failed'— ошибка при отправке (лог для отладки)status = 'pending'— в очереди на отправку- Лог хранится для аудита и диагностики проблем с почтой
14. permissions — Права доступа
Таблица: permissions
Описание
Хранит права доступа для ролей пользователей.
Назначение
- Разграничение доступа к функционалу
- Гибкая настройка прав для ролей
- Аудит доступов
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
role |
varchar(50) | ✅ | Роль: admin, manager, viewer |
permission |
varchar(100) | ✅ | Право (например, manage_users) |
created_at |
timestamp | ✅ | Дата создания |
Права доступа
| Роль | Права |
|---|---|
admin |
Полный доступ: manage_users, manage_roles, manage_clients, manage_products, manage_orders, manage_settings, manage_discounts, view_reports |
manager |
Ограниченный доступ: manage_clients, manage_products, manage_orders, manage_discounts, view_reports |
viewer |
Только просмотр: view_orders |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
unique_permission |
role, permission |
UNIQUE |
idx_role |
role |
INDEX |
Связи
users— через полеrole(логическая связь)
Пример запроса
-- Получить все права для роли admin
SELECT * FROM permissions WHERE role = 'admin';
-- Проверить, есть ли у менеджера право на управление клиентами
SELECT * FROM permissions
WHERE role = 'manager' AND permission = 'manage_clients';
Примечания
- Права назначаются через админку
- При добавлении новой роли нужно явно указать права
- Удаление права автоматически отключает функционал у всех пользователей этой роли
15. settings — Настройки системы
Таблица: settings
Описание
Хранит настройки системы в формате ключ-значение.
Назначение
- Централизованное хранение конфигурации
- Гибкое управление через админку
- Поддержка разных типов данных
Структура
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
int(11) | ✅ | Первичный ключ |
setting_key |
varchar(50) | ✅ | Ключ настройки (уникальный) |
setting_value |
text | ❌ | Значение настройки |
setting_type |
enum | ❌ | Тип: string, int, boolean, json |
created_at |
timestamp | ✅ | Дата создания |
updated_at |
timestamp | ✅ | Дата обновления |
Основные настройки
| Ключ | Значение | Тип | Описание |
|---|---|---|---|
theme |
light |
string | Тема оформления |
currency |
BYN |
string | Валюта системы |
vat_rate |
20 |
int | Ставка НДС (%) |
vat_enabled |
1 |
boolean | Включен ли НДС |
payment_delay |
30 |
int | Отсрочка по умолчанию (дней) |
delivery_day |
Четверг |
string | День доставки |
main_email |
[email protected] |
string | Основной email |
extra_emails |
["[email protected]"] |
json | Дополнительные email |
company_name |
ООО "ЛЕОТЕХНО" |
string | Название компании |
company_address |
223021, РБ... |
string | Адрес компании |
company_phone |
+375 (44) 757-10-07 |
string | Телефон компании |
company_unp |
692072247 |
string | УНП компании |
company_bank |
ЗАО "Статусбанк" |
string | Банк |
company_account |
BY05IRJS3012... |
string | Расчетный счет |
timezone |
Europe/Minsk |
string | Часовой пояс |
telegram_enabled |
0 |
string | Включен ли Telegram |
order_conditions |
Условия заказа... |
string | Условия заказа |
Индексы
| Имя | Поля | Тип |
|---|---|---|
PRIMARY |
id |
PRIMARY |
setting_key |
setting_key |
UNIQUE |
idx_key |
setting_key |
INDEX |
Пример запроса
-- Получить все настройки
SELECT * FROM settings;
-- Получить конкретную настройку
SELECT setting_value FROM settings WHERE setting_key = 'vat_rate';
-- Обновить настройку
UPDATE settings
SET setting_value = '25', updated_at = NOW()
WHERE setting_key = 'vat_rate';
Примечания
- Добавление новых настроек происходит через админку
- Тип json используется для хранения массивов
- При изменении настройки обновляется
updated_at - Настройки кешируются для быстрого доступа
🚀 Теперь полный список — 15 таблиц!
| # | Таблица | Назначение |
|---|---|---|
| 1 | users |
Пользователи системы |
| 2 | clients |
Клиенты/контрагенты |
| 3 | client_phones |
Телефоны клиентов |
| 4 | delivery_addresses |
Адреса доставки |
| 5 | products |
Товары |
| 6 | orders |
Заказы/счета |
| 7 | order_items |
Позиции заказов |
| 8 | order_status_history |
История статусов |
| 9 | carts |
Корзины |
| 10 | discount_history |
История скидок |
| 11 | activity_logs |
Лог активности |
| 12 | notification_emails |
Email-уведомления |
| 13 | notification_log |
Лог уведомлений |
| 14 | permissions |
Права доступа |
| 15 | settings |
Настройки системы |
Теперь полный комплект! 🎉