diff --git a/src/app/api/survey-sales/[id]/route.ts b/src/app/api/survey-sales/[id]/route.ts
index fb48ec4..db5c9df 100644
--- a/src/app/api/survey-sales/[id]/route.ts
+++ b/src/app/api/survey-sales/[id]/route.ts
@@ -19,25 +19,54 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
}
}
+const getNewSrlNo = async (srlNo: string, storeId: string) => {
+ let newSrlNo = srlNo
+ console.log('srlNo:: ', srlNo)
+ if (srlNo.startsWith('一時保存')) {
+ //@ts-ignore
+ const lastSurvey = await prisma.SD_SURVEY_SALES_BASIC_INFO.findFirst({
+ where: {
+ SRL_NO: {
+ startsWith: storeId,
+ },
+ },
+ orderBy: {
+ ID: 'desc',
+ },
+ })
+ const lastNo = lastSurvey ? parseInt(lastSurvey.SRL_NO.slice(-3)) : 0
+ newSrlNo =
+ storeId +
+ new Date().getFullYear().toString().slice(-2) +
+ (new Date().getMonth() + 1).toString().padStart(2, '0') +
+ new Date().getDate().toString().padStart(2, '0') +
+ (lastNo + 1).toString().padStart(3, '0')
+ }
+ return newSrlNo
+}
+
export async function PUT(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
try {
const { id } = await params
const body = await request.json()
- const { detailInfo, ...basicInfo } = body
+ const { detailInfo, ...basicInfo } = body.survey
+ // PUT 요청 시 임시저장 여부 확인 후 임시저장 시 기존 SRL_NO 사용, 기본 저장 시 새로운 SRL_NO 생성
+ const newSrlNo = body.isTemporary ? body.survey.srlNo : await getNewSrlNo(body.survey.srlNo, body.storeId)
// @ts-ignore
const survey = await prisma.SD_SURVEY_SALES_BASIC_INFO.update({
where: { ID: Number(id) },
data: {
...convertToSnakeCase(basicInfo),
+ SRL_NO: newSrlNo,
UPT_DT: new Date(),
DETAIL_INFO: {
- update: convertToSnakeCase(detailInfo)
- }
+ update: convertToSnakeCase(detailInfo),
+ },
},
include: {
- DETAIL_INFO: true
- }
+ DETAIL_INFO: true,
+ },
})
return NextResponse.json(survey)
} catch (error) {
@@ -84,49 +113,24 @@ export async function PATCH(request: NextRequest, { params }: { params: Promise<
const { id } = await params
const body = await request.json()
- if (body.submit) {
+ // 제출 시 기존 SRL_NO 확인 후 '임시저장'으로 시작하면 새로운 SRL_NO 생성
+ const newSrlNo = await getNewSrlNo(body.srlNo, body.storeId)
+
+ if (body.targetId) {
// @ts-ignore
const survey = await prisma.SD_SURVEY_SALES_BASIC_INFO.update({
where: { ID: Number(id) },
data: {
SUBMISSION_STATUS: true,
SUBMISSION_DATE: new Date(),
+ SUBMISSION_TARGET_ID: body.targetId,
UPT_DT: new Date(),
+ SRL_NO: newSrlNo,
},
})
+ console.log(survey)
return NextResponse.json({ message: 'Survey confirmed successfully' })
}
- // } else {
- // // @ts-ignore
- // const hasDetails = await prisma.SD_SURVEY_SALES_DETAIL_INFO.findUnique({
- // where: { BASIC_INFO_ID: Number(id) },
- // })
-
- // if (hasDetails) {
- // //@ts-ignore
- // const result = await prisma.SD_SURVEY_SALES_BASIC_INFO.update({
- // where: { ID: Number(id) },
- // data: {
- // UPT_DT: new Date(),
- // DETAIL_INFO: {
- // update: convertToSnakeCase(body.DETAIL_INFO),
- // },
- // },
- // })
- // return NextResponse.json(result)
- // } else {
- // // @ts-ignore
- // const survey = await prisma.SD_SURVEY_SALES_BASIC_INFO.update({
- // where: { ID: Number(id) },
- // data: {
- // DETAIL_INFO: {
- // create: convertToSnakeCase(body.DETAIL_INFO),
- // },
- // },
- // })
- // return NextResponse.json({ message: 'Survey detail created successfully' })
- // }
- // }
} catch (error) {
console.error('Error updating survey:', error)
return NextResponse.json({ error: 'Failed to update survey' }, { status: 500 })
diff --git a/src/app/api/survey-sales/route.ts b/src/app/api/survey-sales/route.ts
index 64c520f..96cfce4 100644
--- a/src/app/api/survey-sales/route.ts
+++ b/src/app/api/survey-sales/route.ts
@@ -1,6 +1,7 @@
import { NextResponse } from 'next/server'
import { prisma } from '@/libs/prisma'
import { convertToSnakeCase } from '@/utils/common-utils'
+import { equal } from 'assert'
/**
* 검색 파라미터
*/
@@ -110,13 +111,14 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
switch (params.role) {
case 'Admin': // 1차점
- // 같은 판매점에서 작성된 매물 + 2차점에서 제출받은 매물
where.OR = [
{
+ // 같은 판매점에서 작성한 제출/제출되지 않은 매물
AND: [{ STORE: { equals: params.store } }],
},
{
- AND: [{ STORE: { startsWith: params.store } }, { SUBMISSION_STATUS: { equals: true } }],
+ // MUSUBI (시공권한 X) 가 ORDER 에 제출한 매물
+ AND: [{ SUBMISSION_TARGET_ID: { equals: params.store } }, { SUBMISSION_STATUS: { equals: true } }],
},
]
break
@@ -124,6 +126,7 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
case 'Admin_Sub': // 2차점
where.OR = [
{
+ // MUSUBI (시공권한 X) 같은 판매점에서 작성한 제출/제출되지 않은 매물
AND: [
{ STORE: { equals: params.store } },
{
@@ -132,8 +135,9 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
],
},
{
+ // MUSUBI (시공권한 O) 가 MUSUBI 에 제출한 매물 + PARTNER 가 제출한 매물
AND: [
- { STORE: { equals: params.store } },
+ { SUBMISSION_TARGET_ID: { equals: params.store } },
{ CONSTRUCTION_POINT: { not: null } },
{ CONSTRUCTION_POINT: { not: '' } },
{ SUBMISSION_STATUS: { equals: true } },
@@ -142,8 +146,8 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
]
break
- case 'Builder': // 2차점 시공권한
- case 'Partner': // Partner
+ case 'Builder': // MUSUBI (시공권한 O)
+ case 'Partner': // PARTNER
// 같은 시공ID에서 작성된 매물
where.AND?.push({
CONSTRUCTION_POINT: { equals: params.builderNo },
@@ -151,7 +155,14 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
break
case 'T01':
- where.AND.push(filterTempData())
+ // where.AND.push(filterTempData())
+ where.AND?.push({
+ NOT: {
+ SRL_NO: {
+ startsWith: '一時保存',
+ },
+ },
+ })
break
case 'User':
// 모든 매물 조회 가능 (추가 조건 없음)
@@ -247,21 +258,45 @@ export async function PUT(request: Request) {
export async function POST(request: Request) {
try {
const body = await request.json()
- console.log('body:: ', body)
- const { detailInfo, ...basicInfo } = body
+ // 임시 저장 시 임시저장 + 000 으로 저장
+ // 기본 저장 시 판매점ID + yyMMdd + 000 으로 저장
+ const baseSrlNo =
+ body.survey.srlNo ??
+ body.storeId +
+ new Date().getFullYear().toString().slice(-2) +
+ (new Date().getMonth() + 1).toString().padStart(2, '0') +
+ new Date().getDate().toString().padStart(2, '0')
- // 기본 정보 생성
- //@ts-ignore
+ // @ts-ignore
+ const lastSurvey = await prisma.SD_SURVEY_SALES_BASIC_INFO.findFirst({
+ where: {
+ SRL_NO: {
+ startsWith: body.storeId,
+ },
+ },
+ orderBy: {
+ SRL_NO: 'desc',
+ },
+ })
+
+ // 마지막 번호 추출
+ const lastNumber = lastSurvey ? parseInt(lastSurvey.SRL_NO.slice(-3)) : 0
+
+ // 새로운 srlNo 생성
+ const newSrlNo = baseSrlNo + (lastNumber + 1).toString().padStart(3, '0')
+
+ const { detailInfo, ...basicInfo } = body.survey
+ // @ts-ignore
const result = await prisma.SD_SURVEY_SALES_BASIC_INFO.create({
data: {
...convertToSnakeCase(basicInfo),
+ SRL_NO: newSrlNo,
DETAIL_INFO: {
create: convertToSnakeCase(detailInfo),
},
},
})
- console.log('result:: ', result)
return NextResponse.json(result)
} catch (error) {
console.error(error)
diff --git a/src/components/survey-sale/detail/BasicForm.tsx b/src/components/survey-sale/detail/BasicForm.tsx
index 0942abb..b984101 100644
--- a/src/components/survey-sale/detail/BasicForm.tsx
+++ b/src/components/survey-sale/detail/BasicForm.tsx
@@ -25,7 +25,7 @@ export default function BasicForm(props: { basicInfo: SurveyBasicRequest; setBas
setBasicInfo({
...basicInfo,
representative: session.userNm ?? '',
- store: session.storeNm ?? null,
+ store: session.role === 'Partner' ? null : session.storeNm ?? null,
constructionPoint: session.builderNo ?? null,
})
}
diff --git a/src/components/survey-sale/detail/ButtonForm.tsx b/src/components/survey-sale/detail/ButtonForm.tsx
index 6eae13f..c179fb7 100644
--- a/src/components/survey-sale/detail/ButtonForm.tsx
+++ b/src/components/survey-sale/detail/ButtonForm.tsx
@@ -10,7 +10,6 @@ export default function ButtonForm(props: {
mode: Mode
setMode: (mode: Mode) => void
data: { basic: SurveyBasicRequest; roof: SurveyDetailRequest }
- isTemporarySave: boolean
}) {
// 라우터
const router = useRouter()
@@ -28,6 +27,9 @@ export default function ButtonForm(props: {
...props.data.basic,
detailInfo: props.data.roof,
})
+
+ // !!!!!!!!!!
+ const [tempTargetId, setTempTargetId] = useState('')
// --------------------------------------------------------------
// 권한
@@ -39,7 +41,26 @@ export default function ButtonForm(props: {
useEffect(() => {
if (session?.isLoggedIn) {
- setIsSubmiter(session.storeNm === props.data.basic.store && session.builderNo === props.data.basic.constructionPoint)
+ switch (session?.role) {
+ // T01 제출권한 없음
+ case 'T01':
+ setIsSubmiter(false)
+ break
+ // 1차 판매점(Order) + 2차 판매점(Musubi) => 같은 판매점 제출권한
+ case 'Admin':
+ case 'Admin_Sub':
+ setIsSubmiter(session.storeNm === props.data.basic.store && session.builderNo === props.data.basic.constructionPoint)
+ break
+ // 시공권한 User(Musubi) + Partner => 같은 시공ID 제출권한
+ case 'Builder':
+ case 'Partner':
+ setIsSubmiter(session.builderNo === props.data.basic.constructionPoint)
+ break
+ default:
+ setIsSubmiter(false)
+ break
+ }
+
setIsWriter(session.userNm === props.data.basic.representative)
}
setSaveData({
@@ -50,8 +71,8 @@ export default function ButtonForm(props: {
// ------------------------------------------------------------
// 저장/임시저장/수정
+ const id = Number(routeId) ? Number(routeId) : Number(idParam)
- const id = routeId ? Number(routeId) : Number(idParam)
const { deleteSurvey, submitSurvey, updateSurvey } = useServey(Number(id))
const { validateSurveyDetail, createSurvey } = useServey()
@@ -68,11 +89,15 @@ export default function ButtonForm(props: {
const tempSaveProcess = async () => {
if (idParam) {
- await updateSurvey(saveData)
- router.push(`/survey-sale/detail?id=${idParam}&isTemporary=true`)
+ await updateSurvey({ survey: saveData, isTemporary: true })
+ router.push(`/survey-sale/${idParam}`)
} else {
- const id = await createSurvey(saveData)
- router.push(`/survey-sale/detail?id=${id}&isTemporary=true`)
+ const updatedData = {
+ ...saveData,
+ srlNo: '一時保存',
+ }
+ const id = await createSurvey(updatedData)
+ router.push(`/survey-sale/${id}`)
}
alert('一時保存されました。')
}
@@ -92,11 +117,12 @@ export default function ButtonForm(props: {
...saveData,
submissionStatus: true,
submissionDate: new Date().toISOString(),
+ submissionTargetId: tempTargetId,
}
- await updateSurvey(updatedData)
+ await updateSurvey({ survey: updatedData, isTemporary: false, storeId: session.storeId ?? '' })
router.push(`/survey-sale/${idParam}`)
} else {
- await updateSurvey(saveData)
+ await updateSurvey({ survey: saveData, isTemporary: false, storeId: session.storeId ?? '' })
router.push(`/survey-sale/${idParam}`)
}
} else {
@@ -105,6 +131,7 @@ export default function ButtonForm(props: {
...saveData,
submissionStatus: true,
submissionDate: new Date().toISOString(),
+ submissionTargetId: tempTargetId,
}
const id = await createSurvey(updatedData)
submitProcess(id)
@@ -137,10 +164,14 @@ export default function ButtonForm(props: {
}
const handleSubmit = async () => {
- if (props.isTemporarySave) {
+ if (props.data.basic.srlNo?.startsWith('一時保存')) {
alert('一時保存されたデータは提出できません。')
return
}
+ if (tempTargetId.trim() === '') {
+ alert('提出対象店舗を入力してください。')
+ return
+ }
window.neoConfirm('提出しますか?', async () => {
if (Number(routeId)) {
submitProcess()
@@ -149,8 +180,9 @@ export default function ButtonForm(props: {
}
})
}
+
const submitProcess = async (saveId?: number) => {
- await submitSurvey(saveId)
+ await submitSurvey({ saveId: saveId, targetId: tempTargetId, storeId: session.storeId ?? '', srlNo: '一時保存' })
alert('提出されました。')
router.push('/survey-sale')
}
@@ -176,7 +208,7 @@ export default function ButtonForm(props: {