fix(recommerce): использовать in_stock для определения наличия в API

- Добавить константу RECOMMERCE_INFINITY_COUNT = 999999 в mappers.py
- Изменить логику: product.in_stock определяет count (0 или 999999)
- Добавить test_count.py для тестирования поля count
- Обновить документацию recommerce_api.md с секцией Product Availability

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-13 14:35:10 +03:00
parent 36090382c1
commit eff9778539
3 changed files with 139 additions and 10 deletions

View File

@@ -1,7 +1,7 @@
from typing import List, Dict, Any, Optional
from django.conf import settings
from .client import RecommerceClient
from .mappers import to_api_product, from_api_order
from .mappers import to_api_product, from_api_order, RECOMMERCE_INFINITY_COUNT
from .exceptions import RecommerceError
# Imports for typing only to avoid circular dependency issues at module level if possible
# but for simplicity in this structure we'll import inside methods if needed or use 'Any'
@@ -39,13 +39,10 @@ class RecommerceService:
# Получаем остаток, если нужно
stock_count = None
if fields is None or 'count' in fields:
# Пытаемся получить остаток.
# Логика получения остатка может зависеть от вашей системы inventory.
# Здесь предполагаем, что у product есть метод или связь для получения общего остатка.
# Для простоты используем первый попавшийся Stock или 0
# В реальном проекте тут должна быть логика выбора склада
stock = product.stocks.first()
stock_count = int(stock.quantity_free) if stock else 0
# Используем in_stock для определения наличия в формате Recommerce:
# - in_stock=False → count=0 (нет в наличии)
# - in_stock=True → count=999999 (есть в наличии, "бесконечность")
stock_count = RECOMMERCE_INFINITY_COUNT if product.in_stock else 0
data = to_api_product(product, stock_count=stock_count, fields=fields)
@@ -74,8 +71,8 @@ class RecommerceService:
RecommerceError: Если отсутствует обязательное поле parent_category_sku
"""
# Для создания нужны все поля
stock = product.stocks.first()
stock_count = int(stock.quantity_free) if stock else 0
# Используем in_stock для определения наличия в формате Recommerce
stock_count = RECOMMERCE_INFINITY_COUNT if product.in_stock else 0
data = to_api_product(product, stock_count=stock_count, fields=None, for_create=True)