%EC%9D%B8%EA%B1%B4%EB%B9%84 %EA%B3%84%EC%82%B0%EA%B8%B0
사장님 월 인건비 계산기 (주휴수당 포함) - 시뮬레이션

사장님 월 인건비 계산기 (주휴수당 포함)

직원별 소정근로계약(요일/시간)일자별 근무시간을 입력하면, 주차별 주휴 판정(정밀)과 월 인건비(사장님 비용)를 시뮬레이션합니다.

시나리오

저장/복제로 인력 운용안을 비교하세요

* 시나리오는 브라우저(로컬)에 저장됩니다. 다른 PC/브라우저에서는 JSON 내보내기/가져오기를 사용하세요.

직원 목록

직원을 클릭해 달력을 편집
    시뮬레이션 팁
    1) 먼저 직원별 “소정근로계약(요일/시간)”을 설정 → 2) “계약대로 달력 채우기”로 자동 입력 → 3) 결근/추가근무만 수정하면 됩니다.

    사업장/공제 설정

    정밀 계산보다 “월 비용 시뮬레이션”에 최적화
    기본: OFF (단순 총인건비 용도)

    직원 상세 / 달력 입력

    달력: 일자별 근무시간(시간) 입력
    왼쪽에서 직원을 추가/선택하세요.

    월 요약 (선택 직원 + 전체)

    사장님 관점: “총 인건비(주휴+사업주부담)” 중심
    총 인건비(전체, 추정)
    -
    -
    총 지급액(전체, 세전)
    -
    -
    주휴수당(전체)
    -
    -
    선택 직원 상세(임금명세서/임금대장 요약)
    임금명세서 기재사항(시행령 27조의2) 및 임금대장(시행령 27조) 필수 구조를 참고해 표시합니다.
    선택 직원 총 인건비(사장님 비용)
    -
    -
    지급총액(세전)
    -
    -
    실수령(간편공제 적용 시)
    -
    -

    임금 구성(예시)

    시급×근로시간 + 주휴 + 기타수당
    -

    공제/사업주부담(간편)

    옵션 ON일 때만 반영
    -
    주의: 본 도구는 “시뮬레이션” 목적의 참고용입니다. 실제 지급/공제/보험 적용 여부는 계약 형태, 사업장 요건, 근태/휴가 처리, 과세구분 등에 따라 달라질 수 있습니다.

    내보내기 / 가져오기(CSV)

    임금대장/명세서 자료 준비
    CSV 임포트 가이드/템플릿
    1) 직원 CSV (employees.csv)
    필수 컬럼: employee_id, name, hourly_wage
    선택 컬럼: start_date, end_date, job, extra_pay, mon,tue,wed,thu,fri,sat,sun
    - mon~sun은 “요일별 소정근로시간(시간)” 입니다. (월=mon ... 일=sun)

    2) 근무기록 CSV (timesheet.csv)
    필수 컬럼: employee_id, date, hours
    - date는 YYYY-MM-DD
    - hours는 시간(예: 5.5)

    * 임포트 시, employee_id가 기존에 없으면 자동으로 직원이 생성됩니다.

    근거/도움말

    모호한 부분은 “옵션/수동조정”으로 설계
    주휴/15시간 기준의 법적 근거
    - 근로기준법 제55조: 1주 평균 1회 이상의 유급휴일 보장
    - 근로기준법 시행령 제30조: 제55조 유급휴일은 “1주 동안의 소정근로일을 개근한 자”에게 부여
    - 근로기준법 제18조 제3항: 4주 평균(또는 4주 미만 기간 평균) 1주 소정근로시간 15시간 미만이면 제55조 적용 제외
    임금명세서/임금대장 항목(법정)
    - 임금명세서 기재사항: 근로기준법 시행령 제27조의2
    - 임금대장 기재사항: 근로기준법 시행령 제27조
    저장했습니다
    ${pages} `; openPrintWindow(html); }); el.printLedgerBtn.addEventListener("click", () => { const cal = buildCalendarGrid(state.month); const ym = state.month; const rows = state.employees.map(emp => { const m = computeMonthlyForEmployee(emp, cal); return ` ${emp.name} ${emp.id} ${emp.startDate || "-"} ${emp.job || "-"} ${fmtKRW(emp.hourlyWage)} ${m.workHoursInMonth.toFixed(2)}h ${m.holidayHoursInMonth.toFixed(2)}h ${fmtKRW(m.basePay)} ${fmtKRW(m.holidayPayInMonth)} ${fmtKRW(m.extraPay)} ${fmtKRW(m.grossPay)} ${fmtKRW(m.deductions.employeeTotal)} `; }).join(""); const html = ` ledger

    임금대장(참고용) - ${ym}

    * 근로기준법 시행령 제27조(임금대장 기재사항) 구조 참고용입니다.
    ${rows}
    성명 직원ID 고용연월일 업무 시급 근로시간수(월) 주휴시간(월) 기본급 주휴수당 기타수당 임금총액 공제금액(합계)
    `; openPrintWindow(html); }); // CSV templates / import el.downloadEmpTemplateBtn.addEventListener("click", () => { const rows = [ ["employee_id","name","hourly_wage","start_date","end_date","job","extra_pay","mon","tue","wed","thu","fri","sat","sun"], ["E001","김알바","10030","2025-12-01","","카운터","0","4","4","4","4","4","0","0"] ]; downloadText("employees_template.csv", toCSV(rows), "text/csv"); }); el.downloadTimeTemplateBtn.addEventListener("click", () => { const rows = [ ["employee_id","date","hours"], ["E001","2025-12-01","4"], ["E001","2025-12-02","4"] ]; downloadText("timesheet_template.csv", toCSV(rows), "text/csv"); }); el.importEmpCsv.addEventListener("change", async () => { const file = el.importEmpCsv.files?.[0]; if (!file) return; const text = await file.text(); const rows = parseCSV(text); if (rows.length < 2){ alert("CSV 데이터가 부족합니다."); el.importEmpCsv.value=""; return; } const header = rows[0].map(h => h.trim().toLowerCase()); const idx = (name) => header.indexOf(name); const req = ["employee_id","name","hourly_wage"]; for (const r of req){ if (idx(r) === -1){ alert("직원 CSV 필수 컬럼 누락: " + r); el.importEmpCsv.value=""; return; } } for (let i=1; i e.id === id); if (!emp){ emp = defaultEmployee(); emp.id = id; state.employees.push(emp); } emp.name = (r[idx("name")]||"").trim() || emp.name; emp.hourlyWage = Number((r[idx("hourly_wage")]||"").trim() || emp.hourlyWage); const sd = idx("start_date")>=0 ? (r[idx("start_date")]||"").trim() : ""; const ed = idx("end_date")>=0 ? (r[idx("end_date")]||"").trim() : ""; const job = idx("job")>=0 ? (r[idx("job")]||"").trim() : ""; const extra = idx("extra_pay")>=0 ? Number((r[idx("extra_pay")]||"").trim()||0) : 0; emp.startDate = sd; emp.endDate = ed; emp.job = job; emp.extraPay = extra; const mapDow = { mon:0,tue:1,wed:2,thu:3,fri:4,sat:5,sun:6 }; Object.entries(mapDow).forEach(([k,dow])=>{ const j = idx(k); if (j>=0){ emp.contractHoursByDow[dow] = Number((r[j]||"").trim() || 0); } }); } if (state.employees.length){ state.ui.selectedEmployeeId = state.employees[0].id; } renderAll(); autosave(); toast("직원 CSV 임포트 완료"); el.importEmpCsv.value=""; }); el.importTimeCsv.addEventListener("change", async () => { const file = el.importTimeCsv.files?.[0]; if (!file) return; const text = await file.text(); const rows = parseCSV(text); if (rows.length < 2){ alert("CSV 데이터가 부족합니다."); el.importTimeCsv.value=""; return; } const header = rows[0].map(h => h.trim().toLowerCase()); const idx = (name) => header.indexOf(name); const req = ["employee_id","date","hours"]; for (const r of req){ if (idx(r) === -1){ alert("근무기록 CSV 필수 컬럼 누락: " + r); el.importTimeCsv.value=""; return; } } for (let i=1; i e.id === id); if (!emp){ emp = defaultEmployee(); emp.id = id; emp.name = id; state.employees.push(emp); } emp.timesheet[date] = clamp(hours, 0, 24); } renderAll(); autosave(); toast("근무기록 CSV 임포트 완료"); el.importTimeCsv.value=""; }); /* ========================= Init ========================= */ loadStore(); setStateFromScenario(store.last); if (!state.month){ state.month = defaultScenario().month; } renderAll(); autosave();
    위로 스크롤