diff --git a/HISTORY.md b/HISTORY.md index 2aafa6f..cf9e425 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,15 @@ # История изменений ERP WaterSurf +## 2025-02-26 00:25 UTC – Единое отображение чисел с разделителями разрядов + +**Задача**: Везде, где выводятся числовые значения, показывать их с разделителем разрядов и запятой как десятичным разделителем. + +**Решение**: Добавлен шаблонный фильтр **ws_num** (documents/templatetags/document_filters.py): формат «1 851 635,50», неразрывный пробел между разрядами. Фильтр подключён во всех списках документов и на странице экономики заказа (суммы, маржа, проценты). + +**Изменения**: document_filters.py, шаблоны списков документов и customer_order_detail.html (load document_filters, вывод через |ws_num:2 или |ws_num:1). + +--- + ## 2025-02-26 00:15 UTC – Экономика заказа клиента: связи и отчёт **Задача**: Цепочка «Заказ клиента → Поступления денежных средств (несколько) → Заказ поставщику по заказу → Расход на оплату поставщику; плюс прочие расходы по заказу (логистика)». По заказу клиента видеть: сколько поступило, сколько потрачено, маржа, маржинальность, рентабельность. diff --git a/app/documents/templatetags/__init__.py b/app/documents/templatetags/__init__.py new file mode 100644 index 0000000..5c04f89 --- /dev/null +++ b/app/documents/templatetags/__init__.py @@ -0,0 +1 @@ +# Пакет тегов и фильтров для шаблонов документов diff --git a/app/documents/templatetags/document_filters.py b/app/documents/templatetags/document_filters.py new file mode 100644 index 0000000..aae0d60 --- /dev/null +++ b/app/documents/templatetags/document_filters.py @@ -0,0 +1,53 @@ +"""Фильтры для отображения чисел в шаблонах документов.""" +from django import template +from decimal import Decimal + +register = template.Library() + + +@register.filter +def ws_num(value, decimal_places=2): + """ + Форматирование числа с разделителем разрядов (неразрывный пробел) + и запятой как десятичным разделителем. + Пример: 1851635.5 -> "1 851 635,50" + """ + if value is None: + return "—" + try: + places = int(decimal_places) + except (TypeError, ValueError): + places = 2 + try: + if isinstance(value, (Decimal, float)): + n = float(value) + else: + n = float(value) + except (TypeError, ValueError): + return "—" + if places == 0: + s = f"{int(round(n))}" + else: + s = f"{n:.{decimal_places}f}" + if "." in s: + int_part, dec_part = s.split(".", 1) + else: + int_part, dec_part = s, "0" * places + # Разделитель тысяч — неразрывный пробел + if int_part.startswith("-"): + rest = int_part[1:] + formatted = "" + while len(rest) > 3: + formatted = "\u202f" + rest[-3:] + formatted + rest = rest[:-3] + int_part = "-" + rest + formatted if rest else "-" + formatted.lstrip("\u202f") + else: + formatted = "" + rest = int_part + while len(rest) > 3: + formatted = "\u202f" + rest[-3:] + formatted + rest = rest[:-3] + int_part = (rest + formatted) if rest else formatted.lstrip("\u202f") + if places == 0: + return int_part + return f"{int_part},{dec_part}" diff --git a/app/templates/documents/cash_expense_list.html b/app/templates/documents/cash_expense_list.html index 9f1344f..691b0a6 100644 --- a/app/templates/documents/cash_expense_list.html +++ b/app/templates/documents/cash_expense_list.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +{% load document_filters %} {% block title %}Расходы денежных средств — ERP WaterSurf{% endblock %} {% block content %}
Организация: {{ object.organization }}
Клиент: {{ object.client }}
Вид заказа: {{ object.order_kind }}
-Стоимость заказа: {{ object.total_amount|floatformat:2 }}
+Стоимость заказа: {{ object.total_amount|ws_num:2 }}