diff --git a/backend-node/src/services/entityJoinService.ts b/backend-node/src/services/entityJoinService.ts index a8f6c482..280051d0 100644 --- a/backend-node/src/services/entityJoinService.ts +++ b/backend-node/src/services/entityJoinService.ts @@ -403,18 +403,25 @@ export class EntityJoinService { const fromClause = `FROM ${tableName} main`; // LEFT JOIN 절들 (위에서 생성한 별칭 매핑 사용, 각 sourceColumn마다 별도 JOIN) + // 멀티테넌시: 모든 조인에 company_code 조건 추가 (다른 회사 데이터 혼합 방지) const joinClauses = uniqueReferenceTableConfigs .map((config) => { const aliasKey = `${config.referenceTable}:${config.sourceColumn}`; const alias = aliasMap.get(aliasKey); - // table_column_category_values는 특별한 조인 조건 필요 (회사별 필터링만) + // table_column_category_values는 특별한 조인 조건 필요 (회사별 필터링) if (config.referenceTable === "table_column_category_values") { - // 멀티테넌시: 회사 데이터만 사용 (공통 데이터 제외) return `LEFT JOIN ${config.referenceTable} ${alias} ON main.${config.sourceColumn} = ${alias}.${config.referenceColumn} AND ${alias}.table_name = '${tableName}' AND ${alias}.column_name = '${config.sourceColumn}' AND ${alias}.company_code = main.company_code AND ${alias}.is_active = true`; } - return `LEFT JOIN ${config.referenceTable} ${alias} ON main.${config.sourceColumn} = ${alias}.${config.referenceColumn}`; + // user_info는 전역 테이블이므로 company_code 조건 없이 조인 + if (config.referenceTable === "user_info") { + return `LEFT JOIN ${config.referenceTable} ${alias} ON main.${config.sourceColumn} = ${alias}.${config.referenceColumn}`; + } + + // 일반 테이블: company_code가 있으면 같은 회사 데이터만 조인 (멀티테넌시) + // supplier_mng, customer_mng, item_info 등 회사별 데이터 테이블 + return `LEFT JOIN ${config.referenceTable} ${alias} ON main.${config.sourceColumn} = ${alias}.${config.referenceColumn} AND ${alias}.company_code = main.company_code`; }) .join("\n"); diff --git a/frontend/components/numbering-rule/NumberingRuleDesigner.tsx b/frontend/components/numbering-rule/NumberingRuleDesigner.tsx index bfdb69c2..21b9c749 100644 --- a/frontend/components/numbering-rule/NumberingRuleDesigner.tsx +++ b/frontend/components/numbering-rule/NumberingRuleDesigner.tsx @@ -149,11 +149,12 @@ export const NumberingRuleDesigner: React.FC = ({ const existing = savedRules.find((r) => r.ruleId === currentRule.ruleId); // 저장 전에 현재 화면의 테이블명과 menuObjid 자동 설정 + // 메뉴 기반으로 채번규칙 관리 (menuObjid로 필터링) const ruleToSave = { ...currentRule, - scopeType: "table" as const, // ⚠️ 임시: DB 제약 조건 때문에 table 유지 - tableName: currentTableName || currentRule.tableName || null, // 현재 테이블명 자동 설정 (빈 값은 null) - menuObjid: menuObjid || currentRule.menuObjid || null, // 🆕 메뉴 OBJID 설정 (필터링용) + scopeType: "menu" as const, // 메뉴 기반 채번규칙 + tableName: currentTableName || currentRule.tableName || null, // 현재 테이블명 (참고용) + menuObjid: menuObjid || currentRule.menuObjid || null, // 메뉴 OBJID (필터링 기준) }; console.log("💾 채번 규칙 저장:", {