/* 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)}` : ''}
${!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 => `