Модуль "Склады" предназначен для учёта физических товаров на складах компании. Каждый товар на складе — это конкретная единица продукции с серийным номером, опциями и параметрами.
Основные функции:
Ведение реестра складов (физические локации)
Учёт товарных единиц на каждом складе
Отслеживание статуса товара (на складе / привязан к заказу)
Пользователи группы Производство (group_id = 4) имеют ограниченный доступ:
// Listing.php — фильтрация для производстваif ($this->authUser->group_id == 4) { // Производство if ($this->authUser->stock_id) { $query->where('id', $this->authUser->stock_id); // Только свой склад } else { $query->where('id', 0); // Нет доступа }}
// Edit.php, Control.php — проверка доступа к конкретному складуif ($this->authUser->group_id == 4) { if (!$this->authUser->stock_id || $this->authUser->stock_id != $this->id) { abort(403, 'Доступ запрещён'); }}
┌─────────────────────────────────────────────────────────────────────────────┐│ Склады [+ Создать] │├─────────────────────────────────────────────────────────────────────────────┤│ [Поиск...] [Столбцы ▾] │├──────┬─────────────────┬────────────────────────────┬──────────┬────────────┤│ ☐ │ Имя │ Адрес │ Телефон │ Активен │├──────┼─────────────────┼────────────────────────────┼──────────┼────────────┤│ ☐ │ Вертек │ Московская обл., д. Елкино │ │ [●] ││ ☐ │ Склад СПБ │ Шушары Московское ш. 121 │ +7(812)..│ [●] ││ ☐ │ Базис │ Московская обл. Верховье │ │ [●] │└──────┴─────────────────┴────────────────────────────┴──────────┴────────────┘Действия:✅ [Изменить] — модальное редактирование✅ [Удалить] — с подтверждением✅ Клик по строке → переход в карточку складаОсобенности:- Создание через модальное окно (не отдельная страница)- Inline-редактирование через модалку- ToggleColumn для активности
class ProductStock extends Model{ // Товар из каталога public function product() { return $this->belongsTo(Product::class); } // Склад public function stock() { return $this->belongsTo(Stock::class); } // Опции (many-to-many через option_product_stock) public function options() { return $this->belongsToMany(Option::class, 'option_product_stock'); } // Легаси-связь с позициями заказа public function orderItems() { return $this->hasMany(OrderItem::class, 'product_stock_id'); } // Новая связь через pivot public function orderItemsPivot() { return $this->belongsToMany(OrderItem::class, 'order_item_product_stock'); }}
SELECT s.name as stock, p.name as product, ps.sn, ps.height, ps.in_stock, GROUP_CONCAT(o.name SEPARATOR ', ') as optionsFROM product_stocks psJOIN stocks s ON ps.stock_id = s.idJOIN products p ON ps.product_id = p.idLEFT JOIN option_product_stock ops ON ps.id = ops.product_stock_idLEFT JOIN options o ON ops.option_id = o.idGROUP BY ps.idORDER BY s.name, ps.created_at DESC;
SELECT ps.sn, p.name as product, s.name as stock, o.id as order_id, oi.id as order_item_idFROM product_stocks psJOIN products p ON ps.product_id = p.idJOIN stocks s ON ps.stock_id = s.idLEFT JOIN order_item_product_stock oips ON ps.id = oips.product_stock_idLEFT JOIN order_items oi ON oips.order_item_id = oi.idLEFT JOIN orders o ON oi.order_id = o.idWHERE ps.in_stock = 0;
SELECT s.name, COUNT(ps.id) as total_items, SUM(CASE WHEN ps.in_stock = 1 THEN 1 ELSE 0 END) as in_stock, SUM(CASE WHEN ps.in_stock = 0 THEN 1 ELSE 0 END) as in_ordersFROM stocks sLEFT JOIN product_stocks ps ON s.id = ps.stock_idGROUP BY s.id, s.name;
Документ подготовлен на основе анализа исходного кода проекта