diff --git a/myproject/inventory/forms.py b/myproject/inventory/forms.py index 314b148..2eea45e 100644 --- a/myproject/inventory/forms.py +++ b/myproject/inventory/forms.py @@ -104,24 +104,6 @@ class WriteOffForm(forms.ModelForm): return cleaned_data -class ReservationForm(forms.ModelForm): - class Meta: - model = Reservation - fields = ['product', 'warehouse', 'quantity', 'order_item'] - widgets = { - 'product': forms.Select(attrs={'class': 'form-control'}), - 'warehouse': forms.Select(attrs={'class': 'form-control'}), - 'quantity': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.001'}), - 'order_item': forms.Select(attrs={'class': 'form-control'}), - } - - def clean_quantity(self): - quantity = self.cleaned_data.get('quantity') - if quantity and quantity <= 0: - raise ValidationError('Количество должно быть больше нуля') - return quantity - - class InventoryForm(forms.ModelForm): class Meta: model = Inventory diff --git a/myproject/inventory/templates/inventory/reservation/reservation_form.html b/myproject/inventory/templates/inventory/reservation/reservation_form.html deleted file mode 100644 index fb8262a..0000000 --- a/myproject/inventory/templates/inventory/reservation/reservation_form.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'inventory/base_inventory_minimal.html' %} -{% load inventory_filters %} -{% block inventory_title %}Новое резервирование{% endblock %} -{% block breadcrumb_current %}Резервирования{% endblock %} -{% block inventory_content %}

Резервирование товара

{% csrf_token %}
{{ form.product }}
{{ form.warehouse }}
{{ form.quantity|smart_quantity }}
{{ form.order_item }}
Отмена
- -{% endblock %} diff --git a/myproject/inventory/templates/inventory/reservation/reservation_list.html b/myproject/inventory/templates/inventory/reservation/reservation_list.html index 8e624fe..5f00072 100644 --- a/myproject/inventory/templates/inventory/reservation/reservation_list.html +++ b/myproject/inventory/templates/inventory/reservation/reservation_list.html @@ -1,6 +1,114 @@ {% extends 'inventory/base_inventory_minimal.html' %} {% load inventory_filters %} + {% block inventory_title %}Резервирования{% endblock %} {% block breadcrumb_current %}Резервирования{% endblock %} -{% block inventory_content %}

Активные резервирования Новое

{% if reservations %}{% for r in reservations %}{% endfor %}
ТоварКол-воСкладЗарезервированоДействия
{{ r.product.name }}{{ r.quantity|smart_quantity }}{{ r.warehouse.name }}{{ r.reserved_at|date:"d.m.Y" }}
{% else %}
Резервирований не найдено.
{% endif %}
+ +{% block inventory_content %} +
+
+

Активные резервирования

+ Только для просмотра +
+ +
+
+ + Информация: Резервы создаются автоматически через POS (витринные комплекты) и заказы. + Прямое управление резервами отключено для предотвращения несогласованности данных. +
+ + {% if reservations %} +
+ + + + + + + + + + + + + + {% for r in reservations %} + + + + + + + + + + {% endfor %} + +
ТоварКоличествоСкладВитринаЗаказЗарезервированоСтатус
+ {{ r.product.name }} + + {{ r.quantity|smart_quantity }} + + {{ r.warehouse.name }} + + {% if r.showcase %} + {{ r.showcase.name }} + {% else %} + + {% endif %} + + {% if r.order_item %} + + Заказ #{{ r.order_item.order.id }} + + {% else %} + + {% endif %} + + {{ r.reserved_at|date:"d.m.Y H:i" }} + + {{ r.get_status_display }} +
+
+ + + {% if is_paginated %} + + {% endif %} + {% else %} +
+ +
Активных резервирований не найдено
+

Резервы создаются автоматически при оформлении заказов и витринных комплектов в POS

+
+ {% endif %} +
+
{% endblock %} diff --git a/myproject/inventory/templates/inventory/reservation/reservation_update.html b/myproject/inventory/templates/inventory/reservation/reservation_update.html deleted file mode 100644 index be2d39e..0000000 --- a/myproject/inventory/templates/inventory/reservation/reservation_update.html +++ /dev/null @@ -1,6 +0,0 @@ -{% extends 'inventory/base_inventory_minimal.html' %} -{% block inventory_title %}Изменение резервирования{% endblock %} -{% block breadcrumb_current %}Резервирования{% endblock %} -{% block inventory_content %}

Изменение статуса резервирования

{% csrf_token %}
{{ form.status }}
Отмена
- -{% endblock %} diff --git a/myproject/inventory/urls.py b/myproject/inventory/urls.py index 7200be8..a9edf6b 100644 --- a/myproject/inventory/urls.py +++ b/myproject/inventory/urls.py @@ -16,7 +16,7 @@ from .views import ( # Transfer TransferListView, TransferBulkCreateView, TransferDetailView, TransferDeleteView, GetProductStockView, # Reservation - ReservationListView, ReservationCreateView, ReservationUpdateView, + ReservationListView, # Stock StockListView, StockDetailView, # StockBatch @@ -79,10 +79,8 @@ urlpatterns = [ path('transfers//delete/', TransferDeleteView.as_view(), name='transfer-delete'), path('api/product-stock/', GetProductStockView.as_view(), name='api-product-stock'), # API для получения количества товара - # ==================== RESERVATION ==================== + # ==================== RESERVATION (READ ONLY) ==================== path('reservations/', ReservationListView.as_view(), name='reservation-list'), - path('reservations/create/', ReservationCreateView.as_view(), name='reservation-create'), - path('reservations//update-status/', ReservationUpdateView.as_view(), name='reservation-update'), # ==================== STOCK (READ ONLY) ==================== path('stock/', StockListView.as_view(), name='stock-list'), diff --git a/myproject/inventory/views/__init__.py b/myproject/inventory/views/__init__.py index d9f8c6f..2c8c832 100644 --- a/myproject/inventory/views/__init__.py +++ b/myproject/inventory/views/__init__.py @@ -9,7 +9,7 @@ Inventory Views Package - inventory_ops.py: Инвентаризация и её строки - writeoff.py: Списания товара - transfer.py: Перемещения между складами -- reservation.py: Резервирования товара +- reservation.py: Резервирования товара (view-only) - stock.py: Справочник остатков (view-only) - batch.py: Справочник партий товара (view-only) - allocation.py: Распределение продаж по партиям (view-only) @@ -28,7 +28,7 @@ from .inventory_ops import ( ) from .writeoff import WriteOffListView, WriteOffCreateView, WriteOffUpdateView, WriteOffDeleteView from .transfer import TransferListView, TransferBulkCreateView, TransferDetailView, TransferDeleteView, GetProductStockView -from .reservation import ReservationListView, ReservationCreateView, ReservationUpdateView +from .reservation import ReservationListView from .stock import StockListView, StockDetailView from .allocation import SaleBatchAllocationListView from .movements import StockMovementListView @@ -60,7 +60,7 @@ __all__ = [ # Transfer 'TransferListView', 'TransferBulkCreateView', 'TransferDetailView', 'TransferDeleteView', 'GetProductStockView', # Reservation - 'ReservationListView', 'ReservationCreateView', 'ReservationUpdateView', + 'ReservationListView', # Stock 'StockListView', 'StockDetailView', # StockBatch diff --git a/myproject/inventory/views/reservation.py b/myproject/inventory/views/reservation.py index d7e5066..17604b0 100644 --- a/myproject/inventory/views/reservation.py +++ b/myproject/inventory/views/reservation.py @@ -1,46 +1,25 @@ # -*- coding: utf-8 -*- """ -Reservation (Резервирование товара) views -GROUP 2: MEDIUM PRIORITY +Reservation (Резервирование товара) views - READ ONLY +Резервы управляются только через POS и Orders """ -from django.views.generic import ListView, CreateView, UpdateView -from django.urls import reverse_lazy +from django.views.generic import ListView from django.contrib.auth.mixins import LoginRequiredMixin -from django.contrib import messages from ..models import Reservation -from ..forms import ReservationForm class ReservationListView(LoginRequiredMixin, ListView): + """ + Список резервирований (только для просмотра). + Управление резервами происходит через POS (витринные комплекты) и Orders. + """ model = Reservation template_name = 'inventory/reservation/reservation_list.html' context_object_name = 'reservations' paginate_by = 20 def get_queryset(self): + """Показываем все резервы со статусом 'reserved'""" return Reservation.objects.filter( status='reserved' - ).select_related('product', 'warehouse', 'order_item').order_by('-reserved_at') - - -class ReservationCreateView(LoginRequiredMixin, CreateView): - model = Reservation - form_class = ReservationForm - template_name = 'inventory/reservation/reservation_form.html' - success_url = reverse_lazy('inventory:reservation-list') - - def form_valid(self, form): - form.instance.status = 'reserved' - messages.success(self.request, f'Товар успешно зарезервирован.') - return super().form_valid(form) - - -class ReservationUpdateView(LoginRequiredMixin, UpdateView): - model = Reservation - fields = ['status'] - template_name = 'inventory/reservation/reservation_update.html' - success_url = reverse_lazy('inventory:reservation-list') - - def form_valid(self, form): - messages.success(self.request, f'Статус резервирования обновлен.') - return super().form_valid(form) + ).select_related('product', 'warehouse', 'order_item', 'showcase').order_by('-reserved_at')