Fix: общая сумма над таблицей; автор подставляется всегда (профиль или ФИО/логин)
Made-with: Cursor
This commit is contained in:
@@ -1,5 +1,13 @@
|
||||
# История изменений ERP WaterSurf
|
||||
|
||||
## 2025-02-26 16:35 UTC – Общая сумма над таблицей; автор всегда подставляется при создании
|
||||
|
||||
**Изменения**: Блок «Общая сумма заказа» перенесён над табличную часть «Товары» в формах заказа клиента и заказа поставщику. Поле «Автор» в моделях — ForeignKey на справочник Employee; при создании документа автор теперь подставляется всегда: сначала из профиля пользователя (UserProfile.employee), при отсутствии — создаётся/берётся сотрудник с именем из ФИО или логина пользователя. В контексте для отображения используется тот же хелпер, чтобы надпись «Автор» показывала будущего автора уже при открытии формы создания.
|
||||
|
||||
**Файлы**: order_form.html, supplier_order_form.html (общая сумма над таблицей), documents/views.py (_get_author_for_request, set_author с fallback).
|
||||
|
||||
---
|
||||
|
||||
## 2025-02-26 16:15 UTC – Форма заказа: общая сумма и автор только для отображения
|
||||
|
||||
**Задача**: В форме заказа показывать общую сумму заказа (сумма стоимостей строк табличной части) как надпись; поле «Автор» сделать надписью (не вводом), при создании документа подставлять текущего пользователя и сохранять, при открытии — только отображать.
|
||||
|
||||
@@ -8,6 +8,7 @@ from django.contrib import messages
|
||||
from django.http import HttpResponseRedirect
|
||||
|
||||
from users.utils import get_author_employee
|
||||
from references.models import Employee
|
||||
from .models import (
|
||||
CustomerOrder,
|
||||
SupplierOrder,
|
||||
@@ -32,14 +33,28 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def set_author(form, request):
|
||||
"""Подставить автора из профиля пользователя при создании документа."""
|
||||
"""Подставить автора при создании документа: из профиля пользователя (UserProfile.employee) или сотрудник по имени пользователя."""
|
||||
if form.instance.pk:
|
||||
return # при редактировании автора не меняем
|
||||
author = get_author_employee(request.user)
|
||||
author = _get_author_for_request(request)
|
||||
if author:
|
||||
form.instance.author = author
|
||||
|
||||
|
||||
def _get_author_for_request(request):
|
||||
"""Сотрудник-автор: из профиля пользователя или по ФИО/логину."""
|
||||
if not request.user.is_authenticated:
|
||||
return None
|
||||
author = get_author_employee(request.user)
|
||||
if author:
|
||||
return author
|
||||
name = (request.user.get_full_name() or "").strip() or request.user.username
|
||||
author = Employee.objects.filter(name=name).first()
|
||||
if not author:
|
||||
author = Employee.objects.create(name=name)
|
||||
return author
|
||||
|
||||
|
||||
# --- Заказы клиентов ---
|
||||
class CustomerOrderList(LoginRequiredMixin, ListView):
|
||||
model = CustomerOrder
|
||||
@@ -56,7 +71,7 @@ class CustomerOrderCreate(LoginRequiredMixin, CreateView):
|
||||
ctx = super().get_context_data(**kwargs)
|
||||
ctx["formset"] = CustomerOrderItemFormSet(instance=self.object) if self.object and self.object.pk else CustomerOrderItemFormSet()
|
||||
ctx["title"] = "Заказ клиента"
|
||||
ctx["author_display"] = get_author_employee(self.request.user) if not self.object or not self.object.pk else self.object.author
|
||||
ctx["author_display"] = _get_author_for_request(self.request) if not self.object or not self.object.pk else self.object.author
|
||||
return ctx
|
||||
|
||||
def form_valid(self, form):
|
||||
@@ -138,7 +153,7 @@ class SupplierOrderCreate(LoginRequiredMixin, CreateView):
|
||||
ctx = super().get_context_data(**kwargs)
|
||||
ctx["formset"] = SupplierOrderItemFormSet(instance=self.object) if self.object and self.object.pk else SupplierOrderItemFormSet()
|
||||
ctx["title"] = "Заказ поставщику"
|
||||
ctx["author_display"] = get_author_employee(self.request.user) if not self.object or not self.object.pk else self.object.author
|
||||
ctx["author_display"] = _get_author_for_request(self.request) if not self.object or not self.object.pk else self.object.author
|
||||
return ctx
|
||||
|
||||
def form_valid(self, form):
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
</div>
|
||||
<div class="ws-form-section">
|
||||
<h3 class="ws-form-section-title">Товары</h3>
|
||||
<p class="ws-order-total-row"><strong>Общая сумма заказа:</strong> <span id="order-total-sum" class="ws-num">—</span></p>
|
||||
{{ formset.management_form }}
|
||||
<div class="ws-table-wrap">
|
||||
<table class="ws-table ws-table-items" id="order-items">
|
||||
@@ -77,7 +78,6 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<p class="ws-order-total-row"><strong>Общая сумма заказа:</strong> <span id="order-total-sum" class="ws-num">—</span></p>
|
||||
<div class="ws-btn-group" style="margin-top: 0.75rem;">
|
||||
<button type="button" class="btn btn-ws-secondary" id="add-order-row">+ Добавить строку</button>
|
||||
</div>
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
</div>
|
||||
<div class="ws-form-section">
|
||||
<h3 class="ws-form-section-title">Товары</h3>
|
||||
<p class="ws-order-total-row"><strong>Общая сумма заказа:</strong> <span id="supplier-order-total-sum" class="ws-num">—</span></p>
|
||||
{{ formset.management_form }}
|
||||
<div class="ws-table-wrap">
|
||||
<table class="ws-table ws-table-items" id="supplier-order-items">
|
||||
@@ -91,7 +92,6 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<p class="ws-order-total-row"><strong>Общая сумма заказа:</strong> <span id="supplier-order-total-sum" class="ws-num">—</span></p>
|
||||
<div class="ws-btn-group" style="margin-top: 0.75rem;">
|
||||
<button type="button" class="btn btn-ws-secondary" id="add-supplier-order-row">+ Добавить строку</button>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user