fix(moysklad): убираем выдумку Kind полностью — у MoySklad этого поля нет
Проверил через API под реальным токеном (entity/counterparty?expand=group,tags): у MoySklad **нет** поля «Поставщик/Покупатель» у контрагентов вообще. Есть только: - group (группа доступа сотрудников, у всех "Основной") - tags (произвольные ярлыки, у большинства пусто) - state (пользовательская цепочка статусов) - companyType (legal/individual/entrepreneur — это наш Type) Один и тот же контрагент может быть поставщиком в одной приёмке и покупателем в другом чеке — классификация контекстная, не атрибут сущности. Изменения: - ImportCounterpartiesAsync.ResolveKind теперь ВСЕГДА возвращает Unspecified. Никаких эвристик по тегам — просто null для Kind. - useSuppliers хук теперь useCounterparties — возвращает ВСЕХ контрагентов, не фильтрует по Kind. Селекторы поставщика в Supply/RetailSale показывают всех. Пользователь сам выбирает кто поставщик в этом конкретном документе. - Создание контрагента в UI: дефолт Kind = Unspecified, не Supplier. Поле Kind в нашей модели остаётся для пользователей которые сами хотят классифицировать. Но импорт его не трогает. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
50f12ef7f0
commit
e9a82dd528
|
|
@ -39,20 +39,14 @@ public async Task<MoySkladImportResult> ImportCounterpartiesAsync(string token,
|
|||
{
|
||||
var orgId = _tenant.OrganizationId ?? throw new InvalidOperationException("No tenant organization in context.");
|
||||
|
||||
// MoySklad сам НЕ имеет встроенного "Supplier/Customer" поля у контрагентов.
|
||||
// Классификация обычно через теги ("Поставщик"/"Покупатель") или группы. Если их нет —
|
||||
// оставляем Unspecified, не выдумываем за пользователя.
|
||||
// MoySklad НЕ имеет поля "Поставщик/Покупатель" у контрагентов вообще — это
|
||||
// не наша выдумка, проверено через API: counterparty entity содержит только
|
||||
// group (группа доступа), tags (произвольные), state (пользовательская цепочка
|
||||
// статусов), companyType (legal/individual/entrepreneur). Никакой role/kind.
|
||||
// Поэтому при импорте ВСЕГДА ставим Unspecified — пользователь сам решит.
|
||||
// Параметр tags оставлен ради совместимости сигнатуры, не используется.
|
||||
static foodmarket.Domain.Catalog.CounterpartyKind ResolveKind(IReadOnlyList<string>? tags)
|
||||
{
|
||||
if (tags is null || tags.Count == 0) return foodmarket.Domain.Catalog.CounterpartyKind.Unspecified;
|
||||
var lower = tags.Select(t => t.ToLowerInvariant()).ToList();
|
||||
var hasSupplier = lower.Any(t => t.Contains("постав"));
|
||||
var hasCustomer = lower.Any(t => t.Contains("покуп") || t.Contains("клиент"));
|
||||
if (hasSupplier && hasCustomer) return foodmarket.Domain.Catalog.CounterpartyKind.Both;
|
||||
if (hasSupplier) return foodmarket.Domain.Catalog.CounterpartyKind.Supplier;
|
||||
if (hasCustomer) return foodmarket.Domain.Catalog.CounterpartyKind.Customer;
|
||||
return foodmarket.Domain.Catalog.CounterpartyKind.Unspecified;
|
||||
}
|
||||
=> foodmarket.Domain.Catalog.CounterpartyKind.Unspecified;
|
||||
|
||||
static foodmarket.Domain.Catalog.CounterpartyType ResolveType(string? companyType)
|
||||
=> companyType switch
|
||||
|
|
|
|||
|
|
@ -20,8 +20,8 @@ export const useCountries = () => useLookup<Country>('countries', '/api/catalog/
|
|||
export const useCurrencies = () => useLookup<Currency>('currencies', '/api/catalog/currencies')
|
||||
export const useStores = () => useLookup<Store>('stores', '/api/catalog/stores')
|
||||
export const usePriceTypes = () => useLookup<PriceType>('price-types', '/api/catalog/price-types')
|
||||
export const useSuppliers = () => useQuery({
|
||||
queryKey: ['lookup:suppliers'],
|
||||
queryFn: async () => (await api.get<PagedResult<Counterparty>>('/api/catalog/counterparties?pageSize=500&kind=1')).data.items,
|
||||
staleTime: 5 * 60 * 1000,
|
||||
})
|
||||
// MoySklad-style: контрагент один, может быть и поставщиком, и покупателем
|
||||
// в разных документах. Не фильтруем по Kind — пользователь сам выбирает.
|
||||
export const useCounterparties = () => useLookup<Counterparty>('counterparties', '/api/catalog/counterparties')
|
||||
// Алиас для обратной совместимости со старым кодом форм Supply/RetailSale.
|
||||
export const useSuppliers = useCounterparties
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@ interface Form {
|
|||
}
|
||||
|
||||
const blankForm: Form = {
|
||||
// Kind по умолчанию Unspecified — MoySklad не имеет такого поля у контрагентов,
|
||||
// не выдумываем за пользователя. Пусть выберет вручную если нужно.
|
||||
name: '', legalName: '', kind: CounterpartyKind.Unspecified, type: CounterpartyType.LegalEntity,
|
||||
bin: '', iin: '', taxNumber: '', countryId: '',
|
||||
address: '', phone: '', email: '',
|
||||
|
|
|
|||
Loading…
Reference in a new issue