Fix Product filtering and add kit disassembly functionality

Fixed:
- Replace is_active with status='active' for Product filtering in IncomingModelForm
- Product model uses status field instead of is_active

Added:
- Showcase field to ProductKit for tracking showcase placement
- product_kit field to Reservation for tracking kit-specific reservations
- Disassemble button in POS terminal for showcase kits
- API endpoint for kit disassembly (release reservations, mark discontinued)
- Improved reservation filtering when dismantling specific kits

Changes:
- ShowcaseManager now links reservations to specific kit instances
- POS terminal modal shows disassemble button in edit mode
- Kit disassembly properly updates stock aggregates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-20 23:03:47 +03:00
parent d3060176c0
commit ff0756498c
11 changed files with 221 additions and 14 deletions

View File

@@ -516,9 +516,6 @@ class ProductKitAdmin(admin.ModelAdmin):
filter_horizontal = ('categories', 'tags')
readonly_fields = ('photo_preview_large', 'base_price', 'archived_at', 'archived_by', 'order')
actions = [
restore_items,
delete_selected,
hard_delete_selected,
show_poor_quality_photos,
show_excellent_quality_photos,
show_all_quality_levels,

View File

@@ -0,0 +1,27 @@
# Generated by Django 5.0.10 on 2025-11-20 11:24
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('inventory', '0004_showcase_is_default_and_more'),
('orders', '0003_historicalorderitem_is_from_showcase_and_more'),
('products', '0007_add_kit_to_attribute'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='productkit',
name='showcase',
field=models.ForeignKey(blank=True, help_text='Витрина, на которой выложен временный комплект', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='temporary_kits', to='inventory.showcase', verbose_name='Витрина'),
),
migrations.AddIndex(
model_name='productkit',
index=models.Index(fields=['showcase'], name='products_pr_showcas_08c1ca_idx'),
),
]

View File

@@ -104,12 +104,23 @@ class ProductKit(BaseProductEntity):
help_text="Заказ, для которого создан временный комплект"
)
showcase = models.ForeignKey(
'inventory.Showcase',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='temporary_kits',
verbose_name="Витрина",
help_text="Витрина, на которой выложен временный комплект"
)
class Meta:
verbose_name = "Комплект"
verbose_name_plural = "Комплекты"
indexes = [
models.Index(fields=['is_temporary']),
models.Index(fields=['order']),
models.Index(fields=['showcase']),
]
constraints = [
# Уникальное имя для активных комплектов (исключаем архивированные и снятые)