/* tkpurchase-partner-portal.js - Partner portal logic */ let portalSchedules = []; let portalCheckins = {}; let partnerCompanyId = null; let companyWorkersCache = null; // 작업자 목록 캐시 let editingReportId = null; // 수정 모드일 때 보고 ID async function loadMySchedules() { try { const r = await api('/schedules/my'); portalSchedules = r.data || []; } catch(e) { console.warn('Load schedules error:', e); portalSchedules = []; } } 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 noMsg = document.getElementById('noScheduleMessage'); if (!portalSchedules.length) { container.innerHTML = ''; noMsg.classList.remove('hidden'); return; } noMsg.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; const reportCount = checkin ? (parseInt(checkin.work_report_count) || 0) : 0; // Step indicators const step1Class = checkin ? 'text-emerald-600' : 'text-gray-400'; const step2Class = isCheckedIn || isCheckedOut ? 'text-emerald-600' : 'text-gray-400'; const step3Class = isCheckedOut ? 'text-emerald-600' : 'text-gray-400'; return `
${escapeHtml(s.work_description)}
` : ''}업무현황을 먼저 저장한 후 작업을 종료하세요.
아직 등록된 업무현황이 없습니다.
'; return; } container.innerHTML = reports.map(r => { const workerCount = r.workers ? r.workers.length : 0; const totalHours = r.workers ? r.workers.reduce((sum, w) => sum + Number(w.hours_worked || 0), 0) : 0; const isConfirmed = !!r.confirmed_by; const isRejected = !!r.rejected_by; const statusBadge = isConfirmed ? ' 확인완료' : isRejected ? ' 반려' : '미확인'; const canEdit = !isConfirmed; return `