diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 82723a3..ce90d74 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -959,17 +959,12 @@ export const api = { }, create: async (m: Material): Promise => { const lookup = await fetchLookup(); + // v2.5: category_id اختیاری است — اگر نامِ تایپ‌شده یکی از ۸ دسته‌ی ثابت + // نباشد، متریال به‌صورت سراسری (بدون دسته) ساخته می‌شود و دسته‌اش بعداً + // از اولین تأمین‌کننده‌ی مرتبط استنتاج می‌شود (first-link-wins). + // دسته‌ی rogue دیگر هرگز ساخته نمی‌شود — فقط تطبیق با ۸ دسته‌ی موجود؛ + // در صورت نبود تطبیق، خطا نمی‌دهیم و category_id را null می‌فرستیم. const categoryId = m.category ? lookup.categoryNameToId.get(norm(m.category)) : undefined; - // دسته‌ها همان ۸ دسته‌ی ثابت سیستم‌اند و هرگز به‌صورت خودکار ساخته - // نمی‌شوند — قبلاً این‌جا برای هر نامِ ناشناخته یک رکورد material_categories - // می‌ساخت و باگ «پریز» (دسته‌ی rogue) را به وجود آورد. - if (!categoryId) { - throw new Error( - m.category - ? `دسته «${m.category}» در سامانه تعریف نشده است — یکی از ۸ دسته‌ی موجود را انتخاب کنید` - : "دسته‌ی متریال مشخص نیست — یکی از ۸ دسته‌ی موجود را انتخاب کنید", - ); - } // واحد مرجع — اگر تعریف نشده، بساز (بک‌اند canonical_unit_id الزامی دارد) const unitName = m.base_unit || "عدد"; const unitId = await unitIdByNameOrCreate(lookup, unitName); @@ -988,7 +983,7 @@ export const api = { if (defId) attrs.push({ attribute_definition_id: defId, value: spec }); } const raw = await postData("/materials", { - category_id: categoryId, + category_id: categoryId ?? null, name, topic: m.topic || null, canonical_unit_id: unitId,