diff --git a/frontend/src/pages/Suppliers/CategoryPage.tsx b/frontend/src/pages/Suppliers/CategoryPage.tsx
index 21c3f74..e22320e 100644
--- a/frontend/src/pages/Suppliers/CategoryPage.tsx
+++ b/frontend/src/pages/Suppliers/CategoryPage.tsx
@@ -7,6 +7,7 @@ import { nextId } from "../../lib/api";
import { useAddSupplier, useMaterials, useQuotes, useRemoveSupplier, useStoreData, useSuppliers } from "../../hooks";
import { useAppStore } from "../../store";
import { topicByName } from "../../lib/topics";
+import { daysBetween } from "../../lib/formatters";
import { Header, PageLayout } from "../../components/layout/Header";
import { EmptyState } from "../../components/EmptyState";
import { Combobox } from "../../components/Combobox";
@@ -15,7 +16,6 @@ import { materialLabel } from "../../lib/quoteUtils";
import { Button } from "../../components/ui/button";
// صفحهی تأمینکنندههای یک دسته + فرم افزودن تأمینکننده
-// (سلسلهمراتب دامنه: دسته → تأمینکننده؛ در v2.6 دسته = تاپیک)
export function CategoryPage() {
useStoreData();
const { category: catParam = "" } = useParams();
@@ -36,12 +36,29 @@ export function CategoryPage() {
contact: "",
});
- // همهی تأمینکنندهها برای انتخاب سریع (task: کومبوکس کششده)
+ // همهی تأمینکنندهها برای انتخاب سریع
const supplierOptions = useMemo(
() => suppliers.map((s) => ({ id: s.id, name: s.name })),
[suppliers],
);
+ // محاسبه میانگین زمان تحویل اختصاصی هر تأمینکننده بر اساس سفارشهای تحویلشده
+ const supLeadTimes = useMemo(() => {
+ const map = new Map
();
+ suppliers.forEach((s) => {
+ const supQuotes = quotes.filter(
+ (q) => q.supplier_id === s.id && q.status === "arrived" && q.accepted_date && q.arrived_date
+ );
+ const times = supQuotes
+ .map((q) => daysBetween(q.arrived_date, q.accepted_date))
+ .filter((x): x is number => x != null);
+
+ const avg = times.length ? Math.round(times.reduce((a, b) => a + b, 0) / times.length) : null;
+ map.set(s.id, avg);
+ });
+ return map;
+ }, [quotes, suppliers]);
+
if (!cat) return ;
const sups = suppliersOfCategory(cat, cat, suppliers);
@@ -69,7 +86,6 @@ export function CategoryPage() {
toast.error("نام تأمینکننده را وارد کنید.");
return;
}
- // تأمینکننده دقیقاً زیر همین دسته ثبت میشود (۱ دسته به ازای هر تأمینکننده)
const s: Supplier = {
id: nextId("s", suppliers),
topic: cat,
@@ -101,7 +117,15 @@ export function CategoryPage() {
) : (
{sups.map((s) => (
-
+
))}
)}
@@ -161,4 +185,4 @@ export function CategoryPage() {
);
-}
+}
\ No newline at end of file
diff --git a/frontend/src/pages/Suppliers/supplierUtils.tsx b/frontend/src/pages/Suppliers/supplierUtils.tsx
index e52e862..69fae33 100644
--- a/frontend/src/pages/Suppliers/supplierUtils.tsx
+++ b/frontend/src/pages/Suppliers/supplierUtils.tsx
@@ -1,7 +1,9 @@
import { Link } from "react-router-dom";
-import { MapPin, Phone, User, Plus } from "lucide-react";
+import { MapPin, Phone, User, Plus, Timer } from "lucide-react";
import type { Material, Supplier } from "../../lib/types";
import { normalize } from "../../lib/normalize";
+import { fmtNum } from "../../lib/formatters";
+
export function topicCategories(topic: string, materials: Material[], suppliers: Supplier[]): string[] {
const out = new Set