/* tkpurchase-partner-portal.js - Partner portal logic (2-step flow) */ let portalSchedules = []; let portalRequests = []; let portalCheckins = {}; let partnerCompanyId = null; let companyWorkersCache = null; async function loadMySchedules() { try { const r = await api('/schedules/my'); const data = r.data || {}; portalSchedules = data.schedules || []; portalRequests = data.requests || []; } catch(e) { console.warn('Load schedules error:', e); portalSchedules = []; portalRequests = []; } } async function loadMyCheckins() { try { const r = await api('/checkins/my'); const list = r.data || []; portalCheckins = {}; list.forEach(c => { if (c.schedule_id) portalCheckins[c.schedule_id] = c; }); } catch(e) { console.warn('Load checkins error:', e); portalCheckins = {}; } } async function loadCompanyWorkers() { if (companyWorkersCache) return companyWorkersCache; try { const r = await api('/partners/' + partnerCompanyId + '/workers'); companyWorkersCache = (r.data || []).filter(w => w.is_active !== 0); return companyWorkersCache; } catch(e) { console.warn('Load workers error:', e); companyWorkersCache = []; return []; } } async function renderScheduleCards() { await Promise.all([loadMySchedules(), loadMyCheckins()]); const container = document.getElementById('scheduleCards'); const requestCardsEl = document.getElementById('requestCards'); const workRequestFormEl = document.getElementById('workRequestForm'); if (!portalSchedules.length) { container.innerHTML = ''; // 신청 건 표시 if (portalRequests.length) { requestCardsEl.classList.remove('hidden'); requestCardsEl.innerHTML = portalRequests.map(r => { const isRejected = r.status === 'rejected'; const statusBg = isRejected ? 'bg-red-50 border-red-200' : 'bg-amber-50 border-amber-200'; const statusIcon = isRejected ? 'fa-times-circle text-red-400' : 'fa-clock text-amber-400'; const statusText = isRejected ? '반려됨' : '승인 대기 중'; const statusTextClass = isRejected ? 'text-red-600' : 'text-amber-600'; return `

${escapeHtml(r.workplace_name || '작업장 미지정')}

${statusText}
${escapeHtml(r.work_description || '')}
${formatDate(r.start_date)} 예상 ${r.expected_workers || 0}명
`; }).join(''); // 반려 건만 있으면 재신청 폼도 표시 const hasOnlyRejected = portalRequests.every(r => r.status === 'rejected'); if (hasOnlyRejected) { workRequestFormEl.classList.remove('hidden'); workRequestFormEl.querySelector('p').textContent = '반려된 신청 건이 있습니다. 필요시 재신청해주세요.'; } else { workRequestFormEl.classList.add('hidden'); } } else { requestCardsEl.classList.add('hidden'); workRequestFormEl.classList.remove('hidden'); workRequestFormEl.querySelector('p').textContent = '오늘 예정된 작업 일정이 없습니다. 작업이 필요하시면 아래에서 신청해주세요.'; } // 기본 날짜 설정 const today = new Date().toISOString().substring(0, 10); const reqDate = document.getElementById('reqStartDate'); if (reqDate && !reqDate.value) reqDate.value = today; return; } // 오늘 일정 있으면 기존 카드 렌더 requestCardsEl.classList.add('hidden'); workRequestFormEl.classList.add('hidden'); container.innerHTML = portalSchedules.map(s => { const checkin = portalCheckins[s.id]; const isCheckedIn = checkin && !checkin.check_out_time; const isCheckedOut = checkin && checkin.check_out_time; // 2-step indicators const step1Class = checkin ? 'text-emerald-600' : 'text-gray-400'; const step2Class = isCheckedOut ? 'text-emerald-600' : 'text-gray-400'; return `

${escapeHtml(s.workplace_name || '작업장 미지정')}

${formatDate(s.start_date) === formatDate(s.end_date) ? formatDate(s.start_date) : formatDate(s.start_date) + ' ~ ' + formatDate(s.end_date)}
${s.work_description ? `

${escapeHtml(s.work_description)}

` : ''}
예상 ${s.expected_workers || 0}명 ${s.notes ? `${escapeHtml(s.notes)}` : ''}
1. 작업 시작
2. 작업 종료
${!checkin ? `

작업 시작

` : `
체크인 완료 (${formatTime(checkin.check_in_time)}) · ${checkin.actual_worker_count || 0}명
`}
${isCheckedIn ? `
` : ''} ${isCheckedOut ? `
작업 종료 완료 (${formatTime(checkin.check_out_time)})
` : ''}
`; }).join(''); } async function showCheckoutForm(checkinId, scheduleId) { const formContainer = document.getElementById('checkoutForm_' + checkinId); const toggleBtn = document.getElementById('checkoutFormToggle_' + checkinId); if (!formContainer) return; // 작업자 목록 로드 const workers = await loadCompanyWorkers(); const datalistHtml = workers.map(w => `