@@ -45,14 +45,50 @@ function validateManual(body: CreateManualScheduleBody) {
4545 }
4646}
4747
48+ /**
49+ * work_time("09:00-18:00")과 work_date("2026-02-10")를 파싱하여
50+ * user_work_log에 필요한 Date 객체를 생성
51+ */
52+ function parseScheduleToWorkLogData ( workDate ?: string , workTime ?: string ) {
53+ if ( ! workDate ) return null ;
54+
55+ // KST(+09:00) 오프셋을 명시하여 Prisma UTC 변환 시 날짜가 밀리지 않도록 처리
56+ const date = new Date ( workDate + 'T00:00:00+09:00' ) ;
57+
58+ let startTime : Date | null = null ;
59+ let endTime : Date | null = null ;
60+ let workMinutes : number | null = null ;
61+
62+ if ( workTime ) {
63+ const [ startStr , endStr ] = workTime . split ( '-' ) ;
64+ if ( startStr ) {
65+ const [ sh , sm ] = startStr . split ( ':' ) . map ( Number ) ;
66+ startTime = new Date ( workDate + `T${ String ( sh ) . padStart ( 2 , '0' ) } :${ String ( sm ) . padStart ( 2 , '0' ) } :00+09:00` ) ;
67+ }
68+ if ( endStr ) {
69+ const [ eh , em ] = endStr . split ( ':' ) . map ( Number ) ;
70+ endTime = new Date ( workDate + `T${ String ( eh ) . padStart ( 2 , '0' ) } :${ String ( em ) . padStart ( 2 , '0' ) } :00+09:00` ) ;
71+ // 야간 근무 (종료 시간이 시작 시간보다 이전)
72+ if ( endTime <= startTime ! ) {
73+ endTime . setDate ( endTime . getDate ( ) + 1 ) ;
74+ }
75+ }
76+ if ( startTime && endTime ) {
77+ workMinutes = Math . round ( ( endTime . getTime ( ) - startTime . getTime ( ) ) / 60000 ) ;
78+ }
79+ }
80+
81+ return { workDate : date , startTime, endTime, workMinutes } ;
82+ }
83+
4884// 유저 수동 입력 스케줄 생성
4985export async function createManual (
5086 userId : string ,
5187 body : CreateManualScheduleBody ,
5288) : Promise < string > {
5389 validateManual ( body ) ;
5490
55- const idBin = await scheduleRepo . create ( userId , {
91+ const scheduleInput = {
5692 workplace : body . workplace ,
5793 work_date : body . work_date ,
5894 work_time : body . work_time ,
@@ -61,7 +97,17 @@ export async function createManual(
6197 repeat_days : body . repeat_days ,
6298 hourly_wage : body . hourly_wage ,
6399 memo : body . memo ,
64- } ) ;
100+ } ;
101+
102+ // work_date가 있으면 work_log도 함께 생성 (홈 리스트 노출용)
103+ const workLogData = parseScheduleToWorkLogData ( body . work_date , body . work_time ) ;
104+
105+ let idBin : Uint8Array ;
106+ if ( workLogData ) {
107+ idBin = await scheduleRepo . createWithWorkLog ( userId , scheduleInput , workLogData ) ;
108+ } else {
109+ idBin = await scheduleRepo . create ( userId , scheduleInput ) ;
110+ }
65111
66112 return binToUuid ( idBin ) ;
67113}
0 commit comments