Добавлена функциональность витрин для POS: модели, сервисы, UI
- Создана модель Showcase (витрина) привязанная к складу - Расширена Reservation для поддержки витринных резервов - Добавлены поля в OrderItem для маркировки витринных продаж - Реализован ShowcaseManager с методами резервирования, продажи и разбора - Обновлён админ-интерфейс для управления витринами - Добавлена кнопка Витрина в POS (категории) и API для просмотра - Добавлена кнопка На витрину в панели действий POS - Миграции готовы к применению
This commit is contained in:
@@ -7,10 +7,29 @@ from decimal import Decimal
|
||||
from inventory.models import (
|
||||
Warehouse, StockBatch, Incoming, IncomingBatch, Sale, WriteOff, Transfer,
|
||||
Inventory, InventoryLine, Reservation, Stock, StockMovement,
|
||||
SaleBatchAllocation
|
||||
SaleBatchAllocation, Showcase
|
||||
)
|
||||
|
||||
|
||||
# ===== SHOWCASE =====
|
||||
@admin.register(Showcase)
|
||||
class ShowcaseAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'warehouse', 'is_active', 'created_at')
|
||||
list_filter = ('is_active', 'warehouse', 'created_at')
|
||||
search_fields = ('name', 'warehouse__name')
|
||||
date_hierarchy = 'created_at'
|
||||
fieldsets = (
|
||||
('Основная информация', {
|
||||
'fields': ('name', 'warehouse', 'description', 'is_active')
|
||||
}),
|
||||
('Даты', {
|
||||
'fields': ('created_at', 'updated_at'),
|
||||
'classes': ('collapse',)
|
||||
}),
|
||||
)
|
||||
readonly_fields = ('created_at', 'updated_at')
|
||||
|
||||
|
||||
# ===== WAREHOUSE =====
|
||||
@admin.register(Warehouse)
|
||||
class WarehouseAdmin(admin.ModelAdmin):
|
||||
@@ -269,13 +288,13 @@ class InventoryAdmin(admin.ModelAdmin):
|
||||
# ===== RESERVATION =====
|
||||
@admin.register(Reservation)
|
||||
class ReservationAdmin(admin.ModelAdmin):
|
||||
list_display = ('product', 'warehouse', 'quantity', 'status_display', 'order_info', 'reserved_at')
|
||||
list_filter = ('status', 'reserved_at', 'warehouse')
|
||||
search_fields = ('product__name', 'order_item__order__order_number')
|
||||
list_display = ('product', 'warehouse', 'quantity', 'status_display', 'context_info', 'reserved_at')
|
||||
list_filter = ('status', 'reserved_at', 'warehouse', 'showcase')
|
||||
search_fields = ('product__name', 'order_item__order__order_number', 'showcase__name')
|
||||
date_hierarchy = 'reserved_at'
|
||||
fieldsets = (
|
||||
('Резерв', {
|
||||
'fields': ('product', 'warehouse', 'quantity', 'status', 'order_item')
|
||||
'fields': ('product', 'warehouse', 'quantity', 'status', 'order_item', 'showcase')
|
||||
}),
|
||||
('Даты', {
|
||||
'fields': ('reserved_at', 'released_at', 'converted_at')
|
||||
@@ -296,11 +315,19 @@ class ReservationAdmin(admin.ModelAdmin):
|
||||
)
|
||||
status_display.short_description = 'Статус'
|
||||
|
||||
def order_info(self, obj):
|
||||
def context_info(self, obj):
|
||||
if obj.order_item:
|
||||
return f"ORD-{obj.order_item.order.order_number}"
|
||||
return format_html(
|
||||
'<span style="color: #0066cc;">📎 Заказ ORD-{}</span>',
|
||||
obj.order_item.order.order_number
|
||||
)
|
||||
elif obj.showcase:
|
||||
return format_html(
|
||||
'<span style="color: #ff9900;">🌺 Витрина: {}</span>',
|
||||
obj.showcase.name
|
||||
)
|
||||
return "-"
|
||||
order_info.short_description = 'Заказ'
|
||||
context_info.short_description = 'Контекст'
|
||||
|
||||
|
||||
# ===== STOCK =====
|
||||
|
||||
Reference in New Issue
Block a user