diff --git a/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor-item/page.tsx index ad6622da..7649d280 100644 --- a/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor-item/page.tsx @@ -142,7 +142,7 @@ export default function SubcontractorItemPage() { try { const filters: any[] = []; if (outsourcingDivisionCode) { - filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode }); + filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode }); } if (searchKeyword) { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); diff --git a/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor/page.tsx index 934c03c5..d649ab56 100644 --- a/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor/page.tsx @@ -141,6 +141,10 @@ export default function SubcontractorManagementPage() { if (res.data?.success) optMap[col] = flatten(res.data.data || []); } catch { /* skip */ } } + try { + const res = await apiClient.get(`/table-categories/item_info/division/values`); + if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []); + } catch { /* skip */ } setCategoryOptions(optMap); const priceOpts: Record = {}; @@ -413,11 +417,12 @@ export default function SubcontractorManagementPage() { }); const allItems = res.data?.data?.data || res.data?.data?.rows || []; const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number)); - const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T"; + const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code; setItemSearchResults(allItems.filter((item: any) => { if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false; + if (!outsourcingCode) return true; const div = item.division || ""; - return div.includes(OUTSOURCING_CODE) || div.includes("외주"); + return div.includes(outsourcingCode); })); } catch { /* skip */ } finally { setItemSearchLoading(false); } }; diff --git a/frontend/app/(main)/COMPANY_10/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_10/purchase/purchase-item/page.tsx index 7f211a88..be24eb98 100644 --- a/frontend/app/(main)/COMPANY_10/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_10/purchase/purchase-item/page.tsx @@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [ { key: "item_name", label: "품명" }, { key: "size", label: "규격" }, { key: "unit", label: "단위" }, - { key: "standard_price", label: "기준단가" }, - { key: "standard_price", label: "구매단가" }, + { key: "standard_price", label: "기준단가/구매단가" }, { key: "currency_code", label: "통화" }, { key: "status", label: "상태" }, ]; @@ -150,8 +149,11 @@ export default function PurchaseItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "s" }); + // 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링 + const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code; + if (purchaseCode) { + filters.push({ columnName: "division", operator: "contains", value: purchaseCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_10/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_10/sales/customer/page.tsx index 61e1269d..c500c7ae 100644 --- a/frontend/app/(main)/COMPANY_10/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_10/sales/customer/page.tsx @@ -811,9 +811,10 @@ export default function CustomerManagementPage() { const searchItems = async () => { setItemSearchLoading(true); try { - const filters: any[] = [ - { columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }, - ]; + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + const filters: any[] = salesCode + ? [{ columnName: "division", operator: "contains", value: salesCode }] + : []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, diff --git a/frontend/app/(main)/COMPANY_10/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_10/sales/sales-item/page.tsx index d02bfef5..895b99a4 100644 --- a/frontend/app/(main)/COMPANY_10/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_10/sales/sales-item/page.tsx @@ -150,8 +150,11 @@ export default function SalesItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }); + // 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링 + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + if (salesCode) { + filters.push({ columnName: "division", operator: "contains", value: salesCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor-item/page.tsx index ad6622da..7649d280 100644 --- a/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor-item/page.tsx @@ -142,7 +142,7 @@ export default function SubcontractorItemPage() { try { const filters: any[] = []; if (outsourcingDivisionCode) { - filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode }); + filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode }); } if (searchKeyword) { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); diff --git a/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor/page.tsx index 934c03c5..d649ab56 100644 --- a/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor/page.tsx @@ -141,6 +141,10 @@ export default function SubcontractorManagementPage() { if (res.data?.success) optMap[col] = flatten(res.data.data || []); } catch { /* skip */ } } + try { + const res = await apiClient.get(`/table-categories/item_info/division/values`); + if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []); + } catch { /* skip */ } setCategoryOptions(optMap); const priceOpts: Record = {}; @@ -413,11 +417,12 @@ export default function SubcontractorManagementPage() { }); const allItems = res.data?.data?.data || res.data?.data?.rows || []; const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number)); - const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T"; + const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code; setItemSearchResults(allItems.filter((item: any) => { if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false; + if (!outsourcingCode) return true; const div = item.division || ""; - return div.includes(OUTSOURCING_CODE) || div.includes("외주"); + return div.includes(outsourcingCode); })); } catch { /* skip */ } finally { setItemSearchLoading(false); } }; diff --git a/frontend/app/(main)/COMPANY_16/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_16/purchase/purchase-item/page.tsx index 1e44c7cd..b7aad57e 100644 --- a/frontend/app/(main)/COMPANY_16/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_16/purchase/purchase-item/page.tsx @@ -176,8 +176,7 @@ const ITEM_GRID_COLUMNS = [ { key: "item_name", label: "품명" }, { key: "size", label: "규격" }, { key: "unit", label: "단위" }, - { key: "standard_price", label: "기준단가" }, - { key: "standard_price", label: "구매단가" }, + { key: "standard_price", label: "기준단가/구매단가" }, { key: "currency_code", label: "통화" }, { key: "status", label: "상태" }, ]; @@ -313,8 +312,11 @@ export default function PurchaseItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "s" }); + // 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링 + const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code; + if (purchaseCode) { + filters.push({ columnName: "division", operator: "contains", value: purchaseCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_16/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_16/sales/customer/page.tsx index eb3898d9..e5821403 100644 --- a/frontend/app/(main)/COMPANY_16/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_16/sales/customer/page.tsx @@ -811,9 +811,10 @@ export default function CustomerManagementPage() { const searchItems = useCallback(async () => { setItemSearchLoading(true); try { - const filters: any[] = [ - { columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }, - ]; + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + const filters: any[] = salesCode + ? [{ columnName: "division", operator: "contains", value: salesCode }] + : []; const res = await apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, dataFilter: { enabled: true, filters }, diff --git a/frontend/app/(main)/COMPANY_16/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_16/sales/sales-item/page.tsx index 7b9c09c6..83514f0a 100644 --- a/frontend/app/(main)/COMPANY_16/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_16/sales/sales-item/page.tsx @@ -311,8 +311,11 @@ export default function SalesItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }); + // 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링 + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + if (salesCode) { + filters.push({ columnName: "division", operator: "contains", value: salesCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor-item/page.tsx index ad6622da..7649d280 100644 --- a/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor-item/page.tsx @@ -142,7 +142,7 @@ export default function SubcontractorItemPage() { try { const filters: any[] = []; if (outsourcingDivisionCode) { - filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode }); + filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode }); } if (searchKeyword) { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); diff --git a/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor/page.tsx index 934c03c5..d649ab56 100644 --- a/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor/page.tsx @@ -141,6 +141,10 @@ export default function SubcontractorManagementPage() { if (res.data?.success) optMap[col] = flatten(res.data.data || []); } catch { /* skip */ } } + try { + const res = await apiClient.get(`/table-categories/item_info/division/values`); + if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []); + } catch { /* skip */ } setCategoryOptions(optMap); const priceOpts: Record = {}; @@ -413,11 +417,12 @@ export default function SubcontractorManagementPage() { }); const allItems = res.data?.data?.data || res.data?.data?.rows || []; const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number)); - const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T"; + const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code; setItemSearchResults(allItems.filter((item: any) => { if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false; + if (!outsourcingCode) return true; const div = item.division || ""; - return div.includes(OUTSOURCING_CODE) || div.includes("외주"); + return div.includes(outsourcingCode); })); } catch { /* skip */ } finally { setItemSearchLoading(false); } }; diff --git a/frontend/app/(main)/COMPANY_29/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_29/purchase/purchase-item/page.tsx index 7f211a88..be24eb98 100644 --- a/frontend/app/(main)/COMPANY_29/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_29/purchase/purchase-item/page.tsx @@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [ { key: "item_name", label: "품명" }, { key: "size", label: "규격" }, { key: "unit", label: "단위" }, - { key: "standard_price", label: "기준단가" }, - { key: "standard_price", label: "구매단가" }, + { key: "standard_price", label: "기준단가/구매단가" }, { key: "currency_code", label: "통화" }, { key: "status", label: "상태" }, ]; @@ -150,8 +149,11 @@ export default function PurchaseItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "s" }); + // 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링 + const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code; + if (purchaseCode) { + filters.push({ columnName: "division", operator: "contains", value: purchaseCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_29/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_29/sales/customer/page.tsx index 61e1269d..c500c7ae 100644 --- a/frontend/app/(main)/COMPANY_29/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_29/sales/customer/page.tsx @@ -811,9 +811,10 @@ export default function CustomerManagementPage() { const searchItems = async () => { setItemSearchLoading(true); try { - const filters: any[] = [ - { columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }, - ]; + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + const filters: any[] = salesCode + ? [{ columnName: "division", operator: "contains", value: salesCode }] + : []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, diff --git a/frontend/app/(main)/COMPANY_29/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_29/sales/sales-item/page.tsx index d02bfef5..895b99a4 100644 --- a/frontend/app/(main)/COMPANY_29/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_29/sales/sales-item/page.tsx @@ -150,8 +150,11 @@ export default function SalesItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }); + // 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링 + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + if (salesCode) { + filters.push({ columnName: "division", operator: "contains", value: salesCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_30/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_30/outsourcing/subcontractor-item/page.tsx index ad6622da..7649d280 100644 --- a/frontend/app/(main)/COMPANY_30/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_30/outsourcing/subcontractor-item/page.tsx @@ -142,7 +142,7 @@ export default function SubcontractorItemPage() { try { const filters: any[] = []; if (outsourcingDivisionCode) { - filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode }); + filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode }); } if (searchKeyword) { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); diff --git a/frontend/app/(main)/COMPANY_30/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_30/outsourcing/subcontractor/page.tsx index 934c03c5..d649ab56 100644 --- a/frontend/app/(main)/COMPANY_30/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_30/outsourcing/subcontractor/page.tsx @@ -141,6 +141,10 @@ export default function SubcontractorManagementPage() { if (res.data?.success) optMap[col] = flatten(res.data.data || []); } catch { /* skip */ } } + try { + const res = await apiClient.get(`/table-categories/item_info/division/values`); + if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []); + } catch { /* skip */ } setCategoryOptions(optMap); const priceOpts: Record = {}; @@ -413,11 +417,12 @@ export default function SubcontractorManagementPage() { }); const allItems = res.data?.data?.data || res.data?.data?.rows || []; const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number)); - const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T"; + const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code; setItemSearchResults(allItems.filter((item: any) => { if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false; + if (!outsourcingCode) return true; const div = item.division || ""; - return div.includes(OUTSOURCING_CODE) || div.includes("외주"); + return div.includes(outsourcingCode); })); } catch { /* skip */ } finally { setItemSearchLoading(false); } }; diff --git a/frontend/app/(main)/COMPANY_30/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_30/purchase/purchase-item/page.tsx index 7f211a88..be24eb98 100644 --- a/frontend/app/(main)/COMPANY_30/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_30/purchase/purchase-item/page.tsx @@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [ { key: "item_name", label: "품명" }, { key: "size", label: "규격" }, { key: "unit", label: "단위" }, - { key: "standard_price", label: "기준단가" }, - { key: "standard_price", label: "구매단가" }, + { key: "standard_price", label: "기준단가/구매단가" }, { key: "currency_code", label: "통화" }, { key: "status", label: "상태" }, ]; @@ -150,8 +149,11 @@ export default function PurchaseItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "s" }); + // 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링 + const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code; + if (purchaseCode) { + filters.push({ columnName: "division", operator: "contains", value: purchaseCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_30/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_30/sales/customer/page.tsx index 61e1269d..c500c7ae 100644 --- a/frontend/app/(main)/COMPANY_30/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_30/sales/customer/page.tsx @@ -811,9 +811,10 @@ export default function CustomerManagementPage() { const searchItems = async () => { setItemSearchLoading(true); try { - const filters: any[] = [ - { columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }, - ]; + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + const filters: any[] = salesCode + ? [{ columnName: "division", operator: "contains", value: salesCode }] + : []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, diff --git a/frontend/app/(main)/COMPANY_30/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_30/sales/sales-item/page.tsx index d02bfef5..895b99a4 100644 --- a/frontend/app/(main)/COMPANY_30/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_30/sales/sales-item/page.tsx @@ -150,8 +150,11 @@ export default function SalesItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }); + // 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링 + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + if (salesCode) { + filters.push({ columnName: "division", operator: "contains", value: salesCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor-item/page.tsx index ad6622da..7649d280 100644 --- a/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor-item/page.tsx @@ -142,7 +142,7 @@ export default function SubcontractorItemPage() { try { const filters: any[] = []; if (outsourcingDivisionCode) { - filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode }); + filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode }); } if (searchKeyword) { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); diff --git a/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor/page.tsx index 934c03c5..ed0e71d8 100644 --- a/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor/page.tsx @@ -141,6 +141,11 @@ export default function SubcontractorManagementPage() { if (res.data?.success) optMap[col] = flatten(res.data.data || []); } catch { /* skip */ } } + // item_info의 division 카테고리도 로드 (품목 검색 시 외주관리 코드 조회용) + try { + const res = await apiClient.get(`/table-categories/item_info/division/values`); + if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []); + } catch { /* skip */ } setCategoryOptions(optMap); const priceOpts: Record = {}; @@ -413,11 +418,12 @@ export default function SubcontractorManagementPage() { }); const allItems = res.data?.data?.data || res.data?.data?.rows || []; const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number)); - const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T"; + const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code; setItemSearchResults(allItems.filter((item: any) => { if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false; + if (!outsourcingCode) return true; // 카테고리 미로드 시 전체 표시 const div = item.division || ""; - return div.includes(OUTSOURCING_CODE) || div.includes("외주"); + return div.includes(outsourcingCode); })); } catch { /* skip */ } finally { setItemSearchLoading(false); } }; diff --git a/frontend/app/(main)/COMPANY_7/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_7/purchase/purchase-item/page.tsx index 7f211a88..be24eb98 100644 --- a/frontend/app/(main)/COMPANY_7/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_7/purchase/purchase-item/page.tsx @@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [ { key: "item_name", label: "품명" }, { key: "size", label: "규격" }, { key: "unit", label: "단위" }, - { key: "standard_price", label: "기준단가" }, - { key: "standard_price", label: "구매단가" }, + { key: "standard_price", label: "기준단가/구매단가" }, { key: "currency_code", label: "통화" }, { key: "status", label: "상태" }, ]; @@ -150,8 +149,11 @@ export default function PurchaseItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "s" }); + // 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링 + const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code; + if (purchaseCode) { + filters.push({ columnName: "division", operator: "contains", value: purchaseCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_7/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_7/sales/customer/page.tsx index 61e1269d..c500c7ae 100644 --- a/frontend/app/(main)/COMPANY_7/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_7/sales/customer/page.tsx @@ -811,9 +811,10 @@ export default function CustomerManagementPage() { const searchItems = async () => { setItemSearchLoading(true); try { - const filters: any[] = [ - { columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }, - ]; + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + const filters: any[] = salesCode + ? [{ columnName: "division", operator: "contains", value: salesCode }] + : []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, diff --git a/frontend/app/(main)/COMPANY_7/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_7/sales/sales-item/page.tsx index 1558ac64..ae32e908 100644 --- a/frontend/app/(main)/COMPANY_7/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_7/sales/sales-item/page.tsx @@ -150,8 +150,11 @@ export default function SalesItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }); + // 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링 + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + if (salesCode) { + filters.push({ columnName: "division", operator: "contains", value: salesCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor-item/page.tsx index ad6622da..7649d280 100644 --- a/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor-item/page.tsx @@ -142,7 +142,7 @@ export default function SubcontractorItemPage() { try { const filters: any[] = []; if (outsourcingDivisionCode) { - filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode }); + filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode }); } if (searchKeyword) { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); diff --git a/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx index 934c03c5..1118d571 100644 --- a/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx @@ -141,6 +141,11 @@ export default function SubcontractorManagementPage() { if (res.data?.success) optMap[col] = flatten(res.data.data || []); } catch { /* skip */ } } + // item_info의 division 카테고리도 로드 (품목 검색 시 외주관리 코드 조회용) + try { + const res = await apiClient.get(`/table-categories/item_info/division/values`); + if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []); + } catch { /* skip */ } setCategoryOptions(optMap); const priceOpts: Record = {}; @@ -413,11 +418,12 @@ export default function SubcontractorManagementPage() { }); const allItems = res.data?.data?.data || res.data?.data?.rows || []; const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number)); - const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T"; + const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code; setItemSearchResults(allItems.filter((item: any) => { if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false; + if (!outsourcingCode) return true; const div = item.division || ""; - return div.includes(OUTSOURCING_CODE) || div.includes("외주"); + return div.includes(outsourcingCode); })); } catch { /* skip */ } finally { setItemSearchLoading(false); } }; diff --git a/frontend/app/(main)/COMPANY_8/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_8/purchase/purchase-item/page.tsx index 7f211a88..be24eb98 100644 --- a/frontend/app/(main)/COMPANY_8/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_8/purchase/purchase-item/page.tsx @@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [ { key: "item_name", label: "품명" }, { key: "size", label: "규격" }, { key: "unit", label: "단위" }, - { key: "standard_price", label: "기준단가" }, - { key: "standard_price", label: "구매단가" }, + { key: "standard_price", label: "기준단가/구매단가" }, { key: "currency_code", label: "통화" }, { key: "status", label: "상태" }, ]; @@ -150,8 +149,11 @@ export default function PurchaseItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "s" }); + // 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링 + const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code; + if (purchaseCode) { + filters.push({ columnName: "division", operator: "contains", value: purchaseCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_8/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_8/sales/customer/page.tsx index 61e1269d..c500c7ae 100644 --- a/frontend/app/(main)/COMPANY_8/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_8/sales/customer/page.tsx @@ -811,9 +811,10 @@ export default function CustomerManagementPage() { const searchItems = async () => { setItemSearchLoading(true); try { - const filters: any[] = [ - { columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }, - ]; + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + const filters: any[] = salesCode + ? [{ columnName: "division", operator: "contains", value: salesCode }] + : []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, diff --git a/frontend/app/(main)/COMPANY_8/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_8/sales/sales-item/page.tsx index d02bfef5..895b99a4 100644 --- a/frontend/app/(main)/COMPANY_8/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_8/sales/sales-item/page.tsx @@ -150,8 +150,11 @@ export default function SalesItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }); + // 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링 + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + if (salesCode) { + filters.push({ columnName: "division", operator: "contains", value: salesCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_9/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_9/outsourcing/subcontractor-item/page.tsx index ad6622da..7649d280 100644 --- a/frontend/app/(main)/COMPANY_9/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_9/outsourcing/subcontractor-item/page.tsx @@ -142,7 +142,7 @@ export default function SubcontractorItemPage() { try { const filters: any[] = []; if (outsourcingDivisionCode) { - filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode }); + filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode }); } if (searchKeyword) { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); diff --git a/frontend/app/(main)/COMPANY_9/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_9/outsourcing/subcontractor/page.tsx index 934c03c5..d649ab56 100644 --- a/frontend/app/(main)/COMPANY_9/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_9/outsourcing/subcontractor/page.tsx @@ -141,6 +141,10 @@ export default function SubcontractorManagementPage() { if (res.data?.success) optMap[col] = flatten(res.data.data || []); } catch { /* skip */ } } + try { + const res = await apiClient.get(`/table-categories/item_info/division/values`); + if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []); + } catch { /* skip */ } setCategoryOptions(optMap); const priceOpts: Record = {}; @@ -413,11 +417,12 @@ export default function SubcontractorManagementPage() { }); const allItems = res.data?.data?.data || res.data?.data?.rows || []; const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number)); - const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T"; + const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code; setItemSearchResults(allItems.filter((item: any) => { if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false; + if (!outsourcingCode) return true; const div = item.division || ""; - return div.includes(OUTSOURCING_CODE) || div.includes("외주"); + return div.includes(outsourcingCode); })); } catch { /* skip */ } finally { setItemSearchLoading(false); } }; diff --git a/frontend/app/(main)/COMPANY_9/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_9/purchase/purchase-item/page.tsx index 7f211a88..be24eb98 100644 --- a/frontend/app/(main)/COMPANY_9/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_9/purchase/purchase-item/page.tsx @@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [ { key: "item_name", label: "품명" }, { key: "size", label: "규격" }, { key: "unit", label: "단위" }, - { key: "standard_price", label: "기준단가" }, - { key: "standard_price", label: "구매단가" }, + { key: "standard_price", label: "기준단가/구매단가" }, { key: "currency_code", label: "통화" }, { key: "status", label: "상태" }, ]; @@ -150,8 +149,11 @@ export default function PurchaseItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "s" }); + // 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링 + const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code; + if (purchaseCode) { + filters.push({ columnName: "division", operator: "contains", value: purchaseCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) { diff --git a/frontend/app/(main)/COMPANY_9/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_9/sales/customer/page.tsx index 61e1269d..c500c7ae 100644 --- a/frontend/app/(main)/COMPANY_9/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_9/sales/customer/page.tsx @@ -811,9 +811,10 @@ export default function CustomerManagementPage() { const searchItems = async () => { setItemSearchLoading(true); try { - const filters: any[] = [ - { columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }, - ]; + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + const filters: any[] = salesCode + ? [{ columnName: "division", operator: "contains", value: salesCode }] + : []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, diff --git a/frontend/app/(main)/COMPANY_9/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_9/sales/sales-item/page.tsx index d02bfef5..895b99a4 100644 --- a/frontend/app/(main)/COMPANY_9/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_9/sales/sales-item/page.tsx @@ -150,8 +150,11 @@ export default function SalesItemPage() { try { const filters: { columnName: string; operator: string; value: any }[] = []; - // 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭) - filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" }); + // 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링 + const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code; + if (salesCode) { + filters.push({ columnName: "division", operator: "contains", value: salesCode }); + } // DynamicSearchFilter에서 전달된 필터 추가 for (const f of searchFilters) {