From 91321745d492accbd3f811cccfae84273d9cb4c1 Mon Sep 17 00:00:00 2001 From: ysCha Date: Thu, 14 May 2026 16:29:38 +0900 Subject: [PATCH] =?UTF-8?q?[1423]=20=E8=A8=AD=E8=A8=88=E4=BE=9D=E9=A0=BC?= =?UTF-8?q?=20import=20=EB=A7=A4=ED=95=91=20=EC=A0=95=EC=B1=85=20=EC=9E=AC?= =?UTF-8?q?=EC=A0=95=EC=9D=98=20=E2=80=94=20=EB=AF=B8=EB=A7=A4=EC=B9=AD=20?= =?UTF-8?q?=EC=8B=9C=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=EA=B0=92=20reset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 118 ++++++++++++++-------- 1 file changed, 75 insertions(+), 43 deletions(-) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 0d6f12a8..fc0d1b88 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' @@ -1045,42 +1046,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() }) } } @@ -1271,7 +1306,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 @@ -1474,7 +1508,7 @@ export default function StuffDetail() { type: 'alert', icon: 'error', }) - console.log('error::::::', error) + logger.error('error::::::', error) }) } else { // 수정모드일때는 PUT @@ -1507,7 +1541,7 @@ export default function StuffDetail() { type: 'alert', icon: 'error', }) - console.log('error::::::', error) + logger.error('error::::::', error) }) } } @@ -1598,7 +1632,7 @@ export default function StuffDetail() { type: 'alert', icon: 'error', }) - console.log('error::::::', error) + logger.error('error::::::', error) }) } else { setIsGlobalLoading(true) @@ -1622,7 +1656,7 @@ export default function StuffDetail() { type: 'alert', icon: 'error', }) - console.error('error::::::', error) + logger.error('error::::::', error) }) } } @@ -1692,7 +1726,7 @@ export default function StuffDetail() { type: 'alert', icon: 'error', }) - console.log('error::::::', error) + logger.error('error::::::', error) }) }, }) @@ -2051,13 +2085,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) { @@ -2650,15 +2683,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) {