Улучшения инвентаризации: автоматическое проведение документов, оптимизация запросов и улучшения UI

- Автоматическое проведение документов списания и оприходования после завершения инвентаризации
- Оптимизация SQL-запросов: устранение N+1, bulk-операции для Stock, агрегация для StockBatch и Reservation
- Изменение формулы расчета разницы: (quantity_fact + quantity_reserved) - quantity_available
- Переименование поля 'По факту' в 'Подсчитано (факт, свободные)'
- Добавлены столбцы 'В резервах' и 'Всего на складе' в таблицу инвентаризации
- Перемещение столбца 'В системе (свободно)' после 'В резервах' с визуальным выделением
- Центральное выравнивание значений в столбцах таблицы
- Автоматическое выделение текста при фокусе на поле ввода количества
- Исправление форматирования разницы (убраны лишние нули)
- Изменение статуса 'Не обработана' на 'Не проведено'
- Добавление номера документа для инвентаризаций (INV-XXXXXX)
- Отображение всех типов списаний в debug-странице (WriteOff, WriteOffDocument, WriteOffDocumentItem)
- Улучшение отображения документов в детальном просмотре инвентаризации с возможностью перехода к ним
This commit is contained in:
2025-12-21 23:59:02 +03:00
parent bb821f9ef4
commit a8ba5ce780
16 changed files with 1619 additions and 194 deletions

View File

@@ -11,6 +11,8 @@ from .views import (
SaleListView, SaleCreateView, SaleUpdateView, SaleDeleteView, SaleDetailView,
# Inventory
InventoryListView, InventoryCreateView, InventoryDetailView, InventoryLineCreateBulkView,
InventoryLineAddView, InventoryLineUpdateView, InventoryLineDeleteView,
InventoryCompleteView,
# WriteOff
WriteOffListView, WriteOffCreateView, WriteOffUpdateView, WriteOffDeleteView,
# Transfer
@@ -79,7 +81,12 @@ urlpatterns = [
path('inventory-ops/', InventoryListView.as_view(), name='inventory-list'),
path('inventory-ops/create/', InventoryCreateView.as_view(), name='inventory-create'),
path('inventory-ops/<int:pk>/', InventoryDetailView.as_view(), name='inventory-detail'),
path('inventory-ops/<int:pk>/lines/add/', InventoryLineCreateBulkView.as_view(), name='inventory-lines-add'),
path('inventory-ops/<int:pk>/lines/add-bulk/', InventoryLineCreateBulkView.as_view(), name='inventory-lines-add'),
# AJAX endpoints для работы со строками инвентаризации
path('inventory-ops/<int:inventory_id>/lines/add/', InventoryLineAddView.as_view(), name='inventory-line-add'),
path('inventory-ops/<int:inventory_id>/lines/<int:line_id>/update/', InventoryLineUpdateView.as_view(), name='inventory-line-update'),
path('inventory-ops/<int:inventory_id>/lines/<int:line_id>/delete/', InventoryLineDeleteView.as_view(), name='inventory-line-delete'),
path('inventory-ops/<int:inventory_id>/complete/', InventoryCompleteView.as_view(), name='inventory-complete'),
# ==================== WRITEOFF (одиночные записи) ====================
path('writeoffs/', WriteOffListView.as_view(), name='writeoff-list'),