From 4d121e95af0778e45e49b9332c809e1a0f8f9912 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Fri, 2 Jan 2026 15:30:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE:=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D0=B0=20free=5Fqty=20=D0=BA=D0=B0=D0=BA=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE?= =?UTF-8?q?=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: - free_qty передавался как float(decimal) в JSON API - При конвертации Decimal→float терялась точность - JavaScript показывал -0.050000000000044 вместо -0.05 Решение: - free_qty теперь передаётся как строка: str(free_qty) - Добавлено отдельное поле free_qty_sort (float) для сортировки - После сортировки free_qty_sort удаляется из результата - JavaScript parseFloat() корректно парсит строку без потери точности Результат: - Отображение остатков точное: -0.05 вместо -0.050000000000044 - Нет округления на фронте - видны реальные данные - Сортировка по остаткам работает корректно --- myproject/pos/views.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/myproject/pos/views.py b/myproject/pos/views.py index 51a9a5e..230ac46 100644 --- a/myproject/pos/views.py +++ b/myproject/pos/views.py @@ -803,7 +803,8 @@ def get_items_api(request): 'type': 'product', 'available_qty': str(available), 'reserved_qty': str(reserved), - 'free_qty': float(free_qty) # Для сортировки + 'free_qty': str(free_qty), # Передаём как строку для сохранения точности + 'free_qty_sort': float(free_qty) # Для сортировки отдельное поле }) # Prefetch для первого фото комплектов @@ -853,22 +854,23 @@ def get_items_api(request): 'sku': k.sku or '', 'image': image_url, 'type': 'kit', - 'free_qty': 0 # Для сортировки комплекты всегда внизу + 'free_qty': '0', # Строка для консистентности с товарами + 'free_qty_sort': 0 # Комплекты всегда внизу при сортировке }) - # Объединяем и сортируем по free_qty DESC + # Объединяем и сортируем по free_qty_sort DESC all_items = products + kits - all_items.sort(key=lambda x: x['free_qty'], reverse=True) + all_items.sort(key=lambda x: x['free_qty_sort'], reverse=True) # Пагинация paginator = Paginator(all_items, page_size) page_obj = paginator.get_page(page) - # Удаляем временное поле free_qty из результата + # Удаляем временное поле free_qty_sort из результата (оставляем free_qty как строку) items_to_return = [] for item in page_obj.object_list: item_copy = item.copy() - item_copy.pop('free_qty', None) + item_copy.pop('free_qty_sort', None) # Удаляем только free_qty_sort items_to_return.append(item_copy) return JsonResponse({