diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index e16af2b9..b760fb84 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -23,6 +23,7 @@ import { QcastContext } from '@/app/QcastProvider' import { useCanvasMenu } from '@/hooks/common/useCanvasMenu' import { useSwal } from '@/hooks/useSwal' import { sanitizeIntegerInputEvent } from '@/util/input-utils' +import { logger } from '@/util/logger' import { CalculatorInput } from '@/components/common/input/CalcInput' import Image from 'next/image' @@ -1030,42 +1031,76 @@ export default function StuffDetail() { form.setValue('installHeight', installHeight) form.setValue('remarks', info.remarks) - if (info.saleStoreLevel === '1') { - setSelOptions(info.saleStoreId) - form.setValue('saleStoreId', info.saleStoreId) - form.setValue('saleStoreName', info.saleStoreName) - form.setValue('saleStoreLevel', info.saleStoreLevel) + // [PLANREQ-MATCH 2026-05-12] 매핑 정책 재정의 — 미매칭 시 list append 폐지, 로그인 초기값 reset 으로 전환 + // - 진입 가드 (2차점 로그인 storeLvl='2'): 1차 hidden·본인 firstAgent 고정 → 1차 derive skip, 2차 매핑만 검증, 실패 시 2차만 본인 store 로 reset + // - T01 / 1차점: 1차 게이트 — 1차 매핑 실패 = 전체 실패. info.saleStoreLevel='2' 케이스는 firstAgent derive + 2차 lookup 둘 다 성공해야 set. 한쪽이라도 실패 시 1,2차 모두 로그인 초기값으로 reset + const resetSaleStoresToLoginDefaults = () => { + if (session?.storeId === 'T01') { + setSelOptions('T01') + form.setValue('saleStoreId', 'T01') + form.setValue('saleStoreLevel', session?.storeLvl) + setOtherSelOptions('') + form.setValue('otherSaleStoreId', '') + form.setValue('otherSaleStoreLevel', '') + } else if (session?.storeLvl === '1') { + setSelOptions(session?.storeId) + form.setValue('saleStoreId', session?.storeId) + form.setValue('saleStoreLevel', session?.storeLvl) + setOtherSelOptions('') + form.setValue('otherSaleStoreId', '') + form.setValue('otherSaleStoreLevel', '') + } + // storeLvl='2' 는 별도 처리 — resetSaleStoresToLoginDefaults() 호출되지 않음 + } + + if (session?.storeId !== 'T01' && session?.storeLvl === '2') { + // 2차점 로그인: 1차 derive skip, 2차 매핑만 검증 + const matched2 = otherSaleStoreList.some((o) => o.saleStoreId === info.saleStoreId) + if (matched2) { + setOtherSelOptions(info.saleStoreId) + form.setValue('otherSaleStoreId', info.saleStoreId) + form.setValue('otherSaleStoreName', info.saleStoreName) + form.setValue('otherSaleStoreLevel', info.saleStoreLevel) + } else { + // 2차 매핑 실패 → 2차만 본인 store 로 reset + setOtherSelOptions(session?.storeId) + form.setValue('otherSaleStoreId', session?.storeId) + form.setValue('otherSaleStoreLevel', session?.storeLvl) + } + } else if (info.saleStoreLevel === '1') { + // T01 / 1차점 + planreq 가 1차 ID — 1차 매핑만 시도 + const matched1 = saleStoreList.some((s) => s.saleStoreId === info.saleStoreId) + if (matched1) { + setSelOptions(info.saleStoreId) + form.setValue('saleStoreId', info.saleStoreId) + form.setValue('saleStoreName', info.saleStoreName) + form.setValue('saleStoreLevel', info.saleStoreLevel) + setOtherSelOptions('') + form.setValue('otherSaleStoreId', '') + form.setValue('otherSaleStoreLevel', '') + } else { + resetSaleStoresToLoginDefaults() + } } else { - setOtherSelOptions(info.saleStoreId) - form.setValue('otherSaleStoreId', info.saleStoreId) - form.setValue('otherSaleStoreName', info.saleStoreName) - form.setValue('otherSaleStoreLevel', info.saleStoreLevel) + // T01 / 1차점 + planreq 가 2차 ID — firstAgent derive + 2차 lookup 동시 필요 + const matched2 = otherSaleStoreList.some((o) => o.saleStoreId === info.saleStoreId) get({ url: `/api/object/saleStore/${info.saleStoreId}/firstAgent` }).then((res) => { - if (res?.firstAgentId) { - const firstAgent = { saleStoreId: res.firstAgentId, saleStoreName: res.firstAgentName } - setSaleStoreList((prev) => { - const exists = prev.some((s) => s.saleStoreId === res.firstAgentId) - return exists ? prev : [...prev, firstAgent] - }) - setShowSaleStoreList((prev) => { - const exists = prev.some((s) => s.saleStoreId === res.firstAgentId) - return exists ? prev : [...prev, firstAgent] - }) - setSelOptions(res.firstAgentId) - form.setValue('saleStoreId', res.firstAgentId) + const firstId = res?.firstAgentId + const matchedFirst = firstId && saleStoreList.some((s) => s.saleStoreId === firstId) + if (matched2 && matchedFirst) { + setSelOptions(firstId) + form.setValue('saleStoreId', firstId) form.setValue('saleStoreName', res.firstAgentName) form.setValue('saleStoreLevel', '1') + setOtherSelOptions(info.saleStoreId) + form.setValue('otherSaleStoreId', info.saleStoreId) + form.setValue('otherSaleStoreName', info.saleStoreName) + form.setValue('otherSaleStoreLevel', info.saleStoreLevel) } else { - setSelOptions('') - form.setValue('saleStoreId', '') - form.setValue('saleStoreName', '') - form.setValue('saleStoreLevel', '') + resetSaleStoresToLoginDefaults() } }).catch(() => { - setSelOptions('') - form.setValue('saleStoreId', '') - form.setValue('saleStoreName', '') - form.setValue('saleStoreLevel', '') + resetSaleStoresToLoginDefaults() }) } } @@ -1256,7 +1291,6 @@ export default function StuffDetail() { const onValid = async (actionType) => { const formData = form.getValues(); if(actionType !== 'save') return false - console.log('Action type:', actionType); // 'save' 또는 'tempSave' let errors = {} let fieldNm @@ -1459,7 +1493,7 @@ export default function StuffDetail() { type: 'alert', icon: 'error', }) - console.log('error::::::', error) + logger.error('error::::::', error) }) } else { // 수정모드일때는 PUT @@ -1492,7 +1526,7 @@ export default function StuffDetail() { type: 'alert', icon: 'error', }) - console.log('error::::::', error) + logger.error('error::::::', error) }) } } @@ -1583,7 +1617,7 @@ export default function StuffDetail() { type: 'alert', icon: 'error', }) - console.log('error::::::', error) + logger.error('error::::::', error) }) } else { setIsGlobalLoading(true) @@ -1607,7 +1641,7 @@ export default function StuffDetail() { type: 'alert', icon: 'error', }) - console.error('error::::::', error) + logger.error('error::::::', error) }) } } @@ -1677,7 +1711,7 @@ export default function StuffDetail() { type: 'alert', icon: 'error', }) - console.log('error::::::', error) + logger.error('error::::::', error) }) }, }) @@ -2034,13 +2068,12 @@ export default function StuffDetail() { getOptionLabel={(x) => x.saleStoreName} getOptionValue={(x) => x.saleStoreId} isDisabled={ - session?.storeLvl === '1' + // [PLANREQ-MATCH 2026-05-11] T01 또는 1차 user(storeLvl='1') 은 2차 enable, 2차 user(storeLvl='2') 만 disable + session?.storeId === 'T01' || session?.storeLvl === '1' ? otherSaleStoreList.length > 0 ? false : true - : otherSaleStoreList.length === 1 - ? true - : false + : true } isClearable={true} value={otherSaleStoreList.filter(function (option) { @@ -2633,15 +2666,14 @@ export default function StuffDetail() { getOptionLabel={(x) => x.saleStoreName} getOptionValue={(x) => x.saleStoreId} isDisabled={ + // [PLANREQ-MATCH 2026-05-11] T01 또는 1차 user(storeLvl='1') 은 2차 enable, 2차 user(storeLvl='2') 만 disable managementState?.tempFlg === '0' ? true - : session?.storeLvl === '1' + : session?.storeId === 'T01' || session?.storeLvl === '1' ? otherSaleStoreList.length > 0 ? false : true - : otherSaleStoreList.length === 1 - ? true - : false + : true } isClearable={managementState?.tempFlg === '0' ? false : true} value={otherSaleStoreList.filter(function (option) {