diff --git a/myproject/inventory/admin.py b/myproject/inventory/admin.py index ebb371a..3519fda 100644 --- a/myproject/inventory/admin.py +++ b/myproject/inventory/admin.py @@ -5,11 +5,11 @@ from django.db.models import Sum from decimal import Decimal from inventory.models import ( - Warehouse, StockBatch, Sale, WriteOff, Transfer, - Inventory, InventoryLine, Reservation, Stock, StockMovement, + Warehouse, StockBatch, Sale, WriteOff, + Inventory, InventoryLine, Reservation, Stock, SaleBatchAllocation, Showcase, WriteOffDocument, WriteOffDocumentItem, IncomingDocument, IncomingDocumentItem, Transformation, TransformationInput, - TransformationOutput + TransformationOutput, TransferDocument, TransferDocumentItem ) @@ -166,28 +166,6 @@ class WriteOffAdmin(admin.ModelAdmin): reason_display.short_description = 'Причина' -# ===== TRANSFER ===== -@admin.register(Transfer) -class TransferAdmin(admin.ModelAdmin): - list_display = ('batch', 'from_warehouse', 'to_warehouse', 'quantity', 'date') - list_filter = ('date', 'from_warehouse', 'to_warehouse') - search_fields = ('batch__product__name', 'document_number') - date_hierarchy = 'date' - fieldsets = ( - ('Перемещение', { - 'fields': ('batch', 'from_warehouse', 'to_warehouse', 'quantity', 'new_batch') - }), - ('Документ', { - 'fields': ('document_number',) - }), - ('Дата', { - 'fields': ('date',), - 'classes': ('collapse',) - }), - ) - readonly_fields = ('date', 'new_batch') - - # ===== INVENTORY LINE (INLINE) ===== class InventoryLineInline(admin.TabularInline): model = InventoryLine @@ -317,16 +295,6 @@ class StockAdmin(admin.ModelAdmin): readonly_fields = ('quantity_available', 'quantity_reserved', 'updated_at') -# ===== STOCK MOVEMENT (для аудита) ===== -@admin.register(StockMovement) -class StockMovementAdmin(admin.ModelAdmin): - list_display = ('product', 'change', 'reason', 'order', 'created_at') - list_filter = ('reason', 'created_at') - search_fields = ('product__name', 'order__order_number') - date_hierarchy = 'created_at' - readonly_fields = ('created_at',) - - # ===== WRITEOFF DOCUMENT (документы списания) ===== class WriteOffDocumentItemInline(admin.TabularInline): model = WriteOffDocumentItem diff --git a/myproject/inventory/forms.py b/myproject/inventory/forms.py index 69c59c6..fd2a074 100644 --- a/myproject/inventory/forms.py +++ b/myproject/inventory/forms.py @@ -4,8 +4,8 @@ from django.core.exceptions import ValidationError from decimal import Decimal from .models import ( - Warehouse, Sale, WriteOff, Transfer, Reservation, Inventory, InventoryLine, StockBatch, - TransferBatch, TransferItem, Showcase, WriteOffDocument, WriteOffDocumentItem, Stock, + Warehouse, Sale, WriteOff, Reservation, Inventory, InventoryLine, StockBatch, + TransferDocument, TransferDocumentItem, Showcase, WriteOffDocument, WriteOffDocumentItem, Stock, IncomingDocument, IncomingDocumentItem, Transformation, TransformationInput, TransformationOutput ) from products.models import Product @@ -157,7 +157,7 @@ class TransferHeaderForm(forms.ModelForm): Содержит информацию о складах-источнике и складе-назначении, примечания. """ class Meta: - model = TransferBatch + model = TransferDocument fields = ['from_warehouse', 'to_warehouse', 'notes'] widgets = { 'from_warehouse': forms.Select(attrs={'class': 'form-control'}), diff --git a/myproject/inventory/migrations/0005_refactor_transfer_models.py b/myproject/inventory/migrations/0005_refactor_transfer_models.py new file mode 100644 index 0000000..7de7f1f --- /dev/null +++ b/myproject/inventory/migrations/0005_refactor_transfer_models.py @@ -0,0 +1,38 @@ +# Generated migration for Transfer models refactoring + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0004_remove_incoming_batch_and_incoming'), + ('products', '0001_initial'), + ] + + operations = [ + # 1. Удаление устаревших моделей ПЕРЕД переименованием + migrations.DeleteModel( + name='Transfer', + ), + migrations.DeleteModel( + name='StockMovement', + ), + + # 2. Переименование моделей + migrations.RenameModel( + old_name='TransferBatch', + new_name='TransferDocument', + ), + migrations.RenameModel( + old_name='TransferItem', + new_name='TransferDocumentItem', + ), + + # 3. Переименование поля transfer_batch → transfer_document в TransferDocumentItem + migrations.RenameField( + model_name='transferdocumentitem', + old_name='transfer_batch', + new_name='transfer_document', + ), + ] diff --git a/myproject/inventory/models.py b/myproject/inventory/models.py index 0b5d50f..ce66eb7 100644 --- a/myproject/inventory/models.py +++ b/myproject/inventory/models.py @@ -215,35 +215,6 @@ class WriteOff(models.Model): super().save(*args, **kwargs) -class Transfer(models.Model): - """ - Перемещение товара между складами. Сохраняет партийность. - """ - batch = models.ForeignKey(StockBatch, on_delete=models.CASCADE, - related_name='transfers', verbose_name="Партия") - from_warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE, - related_name='transfers_from', verbose_name="Из склада") - to_warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE, - related_name='transfers_to', verbose_name="На склад") - quantity = models.DecimalField(max_digits=10, decimal_places=3, verbose_name="Количество") - document_number = models.CharField(max_length=100, blank=True, null=True, - verbose_name="Номер документа") - date = models.DateTimeField(auto_now_add=True, verbose_name="Дата операции") - new_batch = models.ForeignKey(StockBatch, on_delete=models.SET_NULL, null=True, blank=True, - related_name='transfer_sources', verbose_name="Новая партия") - - class Meta: - verbose_name = "Перемещение" - verbose_name_plural = "Перемещения" - ordering = ['-date'] - indexes = [ - models.Index(fields=['from_warehouse', 'to_warehouse']), - models.Index(fields=['date']), - ] - - def __str__(self): - return f"Перемещение {self.batch.product.name} ({self.quantity} шт): {self.from_warehouse} → {self.to_warehouse}" - class Inventory(models.Model): """ @@ -731,38 +702,6 @@ class Stock(models.Model): self.save() -class StockMovement(models.Model): - """ - Журнал всех складских операций (приход, списание, коррекция). - Используется для аудита. - """ - REASON_CHOICES = [ - ('purchase', 'Закупка'), - ('sale', 'Продажа'), - ('write_off', 'Списание'), - ('adjustment', 'Корректировка'), - ] - - product = models.ForeignKey(Product, on_delete=models.CASCADE, - related_name='movements', verbose_name="Товар") - change = models.DecimalField(max_digits=10, decimal_places=3, verbose_name="Изменение") - reason = models.CharField(max_length=20, choices=REASON_CHOICES, verbose_name="Причина") - order = models.ForeignKey('orders.Order', on_delete=models.SET_NULL, null=True, blank=True, - related_name='stock_movements', verbose_name="Заказ") - created_at = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания") - - class Meta: - verbose_name = "Движение товара" - verbose_name_plural = "Движения товаров" - indexes = [ - models.Index(fields=['product']), - models.Index(fields=['created_at']), - ] - - def __str__(self): - return f"{self.product.name}: {self.change} ({self.reason})" - - class DocumentCounter(models.Model): """ Счетчик номеров документов для различных операций. @@ -811,7 +750,7 @@ class DocumentCounter(models.Model): return obj.current_value -class TransferBatch(models.Model): +class TransferDocument(models.Model): """ Документ перемещения товара между складами. Один номер документа = одна операция перемещения множественных товаров. @@ -819,13 +758,13 @@ class TransferBatch(models.Model): from_warehouse = models.ForeignKey( Warehouse, on_delete=models.CASCADE, - related_name='transfer_batches_from', + related_name='transfer_documents_from', verbose_name="Склад-отгрузки" ) to_warehouse = models.ForeignKey( Warehouse, on_delete=models.CASCADE, - related_name='transfer_batches_to', + related_name='transfer_documents_to', verbose_name="Склад-приемки" ) document_number = models.CharField( @@ -866,13 +805,13 @@ class TransferBatch(models.Model): return f"Перемещение {self.document_number}: {total_items} товаров, {total_qty} шт ({self.from_warehouse} → {self.to_warehouse})" -class TransferItem(models.Model): +class TransferDocumentItem(models.Model): """ Строка документа перемещения (товар в перемещении). Связь между документом и товарами. """ - transfer_batch = models.ForeignKey( - TransferBatch, + transfer_document = models.ForeignKey( + TransferDocument, on_delete=models.CASCADE, related_name='items', verbose_name="Документ перемещения" @@ -880,13 +819,13 @@ class TransferItem(models.Model): product = models.ForeignKey( Product, on_delete=models.CASCADE, - related_name='transfer_items', + related_name='transfer_document_items', verbose_name="Товар" ) batch = models.ForeignKey( StockBatch, on_delete=models.CASCADE, - related_name='transfer_items', + related_name='transfer_document_items', verbose_name="Исходная партия (FIFO)" ) quantity = models.DecimalField( @@ -899,17 +838,17 @@ class TransferItem(models.Model): on_delete=models.SET_NULL, null=True, blank=True, - related_name='transfer_items_created', + related_name='transfer_document_items_created', verbose_name="Созданная партия на целевом складе" ) class Meta: verbose_name = "Строка перемещения" verbose_name_plural = "Строки перемещения" - unique_together = [['transfer_batch', 'batch']] + unique_together = [['transfer_document', 'batch']] ordering = ['id'] indexes = [ - models.Index(fields=['transfer_batch']), + models.Index(fields=['transfer_document']), models.Index(fields=['product']), ] diff --git a/myproject/inventory/templates/inventory/transfer/transfer_detail.html b/myproject/inventory/templates/inventory/transfer/transfer_detail.html index 06fef60..6e156a0 100644 --- a/myproject/inventory/templates/inventory/transfer/transfer_detail.html +++ b/myproject/inventory/templates/inventory/transfer/transfer_detail.html @@ -1,6 +1,6 @@ {% extends 'base.html' %} -{% block title %}Документ перемещения {{ transfer_batch.document_number }}{% endblock %} +{% block title %}Документ перемещения {{ transfer_document.document_number }}{% endblock %} {% block content %}
Склад-отгрузки
-{{ transfer_batch.from_warehouse.name }}
+{{ transfer_document.from_warehouse.name }}
Склад-приемки
-{{ transfer_batch.to_warehouse.name }}
+{{ transfer_document.to_warehouse.name }}
Примечания
-{{ transfer_batch.notes }}
+{{ transfer_document.notes }}
Дата создания
-{{ transfer_batch.created_at|date:"d.m.Y H:i" }}
+{{ transfer_document.created_at|date:"d.m.Y H:i" }}
Последнее обновление
-{{ transfer_batch.updated_at|date:"d.m.Y H:i" }}
+{{ transfer_document.updated_at|date:"d.m.Y H:i" }}