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