Упрощена логика системы путём замены отдельной сущности "Магазин" на универсальную сущность "Склад", которая может использоваться как точка самовывоза. Изменения: - Расширена модель Warehouse: добавлены адрес, контакты, флаг is_pickup_point - Модель Order: поле pickup_shop заменено на pickup_warehouse - Обновлены все формы, сервисы, views, admin для работы со складами - Обновлены шаблоны HTML и JavaScript код - Удалено приложение shops полностью - Пересозданы миграции БД - Обновлён навбар (удалена ссылка на магазины) Преимущества: - Упрощена архитектура системы - Единая точка управления складами и точками самовывоза - Интеграция с системой инвентаризации 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
311 lines
14 KiB
Python
311 lines
14 KiB
Python
# Generated by Django 5.0.10 on 2025-11-14 20:45
|
||
|
||
import django.db.models.deletion
|
||
from django.db import migrations, models
|
||
|
||
|
||
class Migration(migrations.Migration):
|
||
|
||
initial = True
|
||
|
||
dependencies = [
|
||
('inventory', '0001_initial'),
|
||
('orders', '0001_initial'),
|
||
('products', '0001_initial'),
|
||
]
|
||
|
||
operations = [
|
||
migrations.AddField(
|
||
model_name='incoming',
|
||
name='product',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='incomings', to='products.product', verbose_name='Товар'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='incoming',
|
||
name='batch',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='inventory.incomingbatch', verbose_name='Партия'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='inventoryline',
|
||
name='inventory',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lines', to='inventory.inventory', verbose_name='Инвентаризация'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='inventoryline',
|
||
name='product',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='products.product', verbose_name='Товар'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='reservation',
|
||
name='order_item',
|
||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='orders.orderitem', verbose_name='Позиция заказа'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='reservation',
|
||
name='product',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='products.product', verbose_name='Товар'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='sale',
|
||
name='order',
|
||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sales', to='orders.order', verbose_name='Заказ'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='sale',
|
||
name='product',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sales', to='products.product', verbose_name='Товар'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='salebatchallocation',
|
||
name='sale',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='batch_allocations', to='inventory.sale', verbose_name='Продажа'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='stock',
|
||
name='product',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='stocks', to='products.product', verbose_name='Товар'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='stockbatch',
|
||
name='product',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='stock_batches', to='products.product', verbose_name='Товар'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='salebatchallocation',
|
||
name='batch',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sale_allocations', to='inventory.stockbatch', verbose_name='Партия'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='incoming',
|
||
name='stock_batch',
|
||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='incomings', to='inventory.stockbatch', verbose_name='Складская партия'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='stockmovement',
|
||
name='order',
|
||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='stock_movements', to='orders.order', verbose_name='Заказ'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='stockmovement',
|
||
name='product',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='movements', to='products.product', verbose_name='Товар'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='transfer',
|
||
name='batch',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfers', to='inventory.stockbatch', verbose_name='Партия'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='transfer',
|
||
name='new_batch',
|
||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transfer_sources', to='inventory.stockbatch', verbose_name='Новая партия'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='transferitem',
|
||
name='batch',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfer_items', to='inventory.stockbatch', verbose_name='Исходная партия (FIFO)'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='transferitem',
|
||
name='new_batch',
|
||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transfer_items_created', to='inventory.stockbatch', verbose_name='Созданная партия на целевом складе'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='transferitem',
|
||
name='product',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfer_items', to='products.product', verbose_name='Товар'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='transferitem',
|
||
name='transfer_batch',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='inventory.transferbatch', verbose_name='Документ перемещения'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='warehouse',
|
||
index=models.Index(fields=['is_active'], name='inventory_w_is_acti_3ddeac_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='warehouse',
|
||
index=models.Index(fields=['is_default'], name='inventory_w_is_defa_4b7615_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='warehouse',
|
||
index=models.Index(fields=['is_pickup_point'], name='inventory_w_is_pick_e86268_idx'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='transferbatch',
|
||
name='from_warehouse',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfer_batches_from', to='inventory.warehouse', verbose_name='Склад-отгрузки'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='transferbatch',
|
||
name='to_warehouse',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfer_batches_to', to='inventory.warehouse', verbose_name='Склад-приемки'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='transfer',
|
||
name='from_warehouse',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfers_from', to='inventory.warehouse', verbose_name='Из склада'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='transfer',
|
||
name='to_warehouse',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfers_to', to='inventory.warehouse', verbose_name='На склад'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='stockbatch',
|
||
name='warehouse',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='stock_batches', to='inventory.warehouse', verbose_name='Склад'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='stock',
|
||
name='warehouse',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='stocks', to='inventory.warehouse', verbose_name='Склад'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='sale',
|
||
name='warehouse',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sales', to='inventory.warehouse', verbose_name='Склад'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='reservation',
|
||
name='warehouse',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='inventory.warehouse', verbose_name='Склад'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='inventory',
|
||
name='warehouse',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='inventories', to='inventory.warehouse', verbose_name='Склад'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='incomingbatch',
|
||
name='warehouse',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='incoming_batches', to='inventory.warehouse', verbose_name='Склад'),
|
||
),
|
||
migrations.AddField(
|
||
model_name='writeoff',
|
||
name='batch',
|
||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='writeoffs', to='inventory.stockbatch', verbose_name='Партия'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='incoming',
|
||
index=models.Index(fields=['batch'], name='inventory_i_batch_i_c50b63_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='incoming',
|
||
index=models.Index(fields=['product'], name='inventory_i_product_39b00d_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='incoming',
|
||
index=models.Index(fields=['-created_at'], name='inventory_i_created_563ec0_idx'),
|
||
),
|
||
migrations.AlterUniqueTogether(
|
||
name='incoming',
|
||
unique_together={('batch', 'product')},
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='stockmovement',
|
||
index=models.Index(fields=['product'], name='inventory_s_product_cbdc37_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='stockmovement',
|
||
index=models.Index(fields=['created_at'], name='inventory_s_created_05ebf5_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='transferitem',
|
||
index=models.Index(fields=['transfer_batch'], name='inventory_t_transfe_f7479b_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='transferitem',
|
||
index=models.Index(fields=['product'], name='inventory_t_product_0e0ec9_idx'),
|
||
),
|
||
migrations.AlterUniqueTogether(
|
||
name='transferitem',
|
||
unique_together={('transfer_batch', 'batch')},
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='transferbatch',
|
||
index=models.Index(fields=['document_number'], name='inventory_t_documen_143275_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='transferbatch',
|
||
index=models.Index(fields=['from_warehouse', 'to_warehouse'], name='inventory_t_from_wa_2a41f1_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='transferbatch',
|
||
index=models.Index(fields=['-created_at'], name='inventory_t_created_b6fd05_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='transfer',
|
||
index=models.Index(fields=['from_warehouse', 'to_warehouse'], name='inventory_t_from_wa_578feb_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='transfer',
|
||
index=models.Index(fields=['date'], name='inventory_t_date_e1402d_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='stockbatch',
|
||
index=models.Index(fields=['product', 'warehouse'], name='inventory_s_product_022460_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='stockbatch',
|
||
index=models.Index(fields=['created_at'], name='inventory_s_created_10279b_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='stockbatch',
|
||
index=models.Index(fields=['is_active'], name='inventory_s_is_acti_0dd559_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='stock',
|
||
index=models.Index(fields=['product', 'warehouse'], name='inventory_s_product_112b63_idx'),
|
||
),
|
||
migrations.AlterUniqueTogether(
|
||
name='stock',
|
||
unique_together={('product', 'warehouse')},
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='sale',
|
||
index=models.Index(fields=['product', 'warehouse'], name='inventory_s_product_084314_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='sale',
|
||
index=models.Index(fields=['date'], name='inventory_s_date_8972d4_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='sale',
|
||
index=models.Index(fields=['order'], name='inventory_s_order_i_7d13ea_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='reservation',
|
||
index=models.Index(fields=['product', 'warehouse'], name='inventory_r_product_fa0d33_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='reservation',
|
||
index=models.Index(fields=['status'], name='inventory_r_status_806333_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='reservation',
|
||
index=models.Index(fields=['order_item'], name='inventory_r_order_i_ae991f_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='incomingbatch',
|
||
index=models.Index(fields=['document_number'], name='inventory_i_documen_679096_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='incomingbatch',
|
||
index=models.Index(fields=['warehouse'], name='inventory_i_warehou_cc3a73_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='incomingbatch',
|
||
index=models.Index(fields=['-created_at'], name='inventory_i_created_59ee8b_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='writeoff',
|
||
index=models.Index(fields=['batch'], name='inventory_w_batch_i_b098ce_idx'),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name='writeoff',
|
||
index=models.Index(fields=['date'], name='inventory_w_date_70c7e3_idx'),
|
||
),
|
||
]
|