/* 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 = Array.isArray(data) ? data : (data.schedules || []);
portalRequests = Array.isArray(data) ? [] : (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]) 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');
const today = toLocalDate(new Date());
if (!portalSchedules.length) {
container.innerHTML = '';
} else {
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 sStart = s.start_date ? s.start_date.substring(0, 10) : '';
const sEnd = s.end_date ? s.end_date.substring(0, 10) : '';
const isToday = sStart <= today && sEnd >= today;
// 2-step indicators
const step1Class = checkin ? 'text-emerald-600' : 'text-gray-400';
const step2Class = isCheckedOut ? 'text-emerald-600' : 'text-gray-400';
const dateBadge = isToday
? `오늘`
: `${formatDate(s.start_date) === formatDate(s.end_date) ? formatDate(s.start_date) : formatDate(s.start_date) + ' ~ ' + formatDate(s.end_date)}`;
return `
${s.project_name ? `
${escapeHtml(s.project_name)}${s.job_no ? ' · ' + escapeHtml(s.job_no) : ''}
` : ''}
${escapeHtml(s.workplace_name || '작업장 미지정')}
${dateBadge}
${!isToday ? `
${formatDate(s.start_date)}${formatDate(s.start_date) !== formatDate(s.end_date) ? ' ~ ' + formatDate(s.end_date) : ''}
` : ''}
${s.work_description ? `
${escapeHtml(s.work_description)}
` : ''}
예상 ${s.expected_workers || 0}명
${s.notes ? `${escapeHtml(s.notes)}` : ''}
${!checkin ? `
` : `
체크인 완료 (${formatTime(checkin.check_in_time)})
· ${checkin.actual_worker_count || 0}명
`}
${isCheckedIn ? `
` : ''}
${isCheckedOut ? `
작업 종료 완료 (${formatTime(checkin.check_out_time)})
` : ''}
`;
}).join('');
}
// 신청 건 표시 (항상)
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('');
} else {
requestCardsEl.classList.add('hidden');
}
// 작업 신청 폼 항상 표시
workRequestFormEl.classList.remove('hidden');
const hasOnlyRejected = portalRequests.length > 0 && portalRequests.every(r => r.status === 'rejected');
if (portalSchedules.length) {
workRequestFormEl.querySelector('p').textContent = '추가 작업이 필요하시면 신청해주세요.';
} else if (hasOnlyRejected) {
workRequestFormEl.querySelector('p').textContent = '반려된 신청 건이 있습니다. 필요시 재신청해주세요.';
} else {
workRequestFormEl.querySelector('p').textContent = '등록된 작업 일정이 없습니다. 작업이 필요하시면 아래에서 신청해주세요.';
}
// 기본 날짜 설정
const reqDate = document.getElementById('reqStartDate');
if (reqDate && !reqDate.value) reqDate.value = today;
}
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 => `