Files
Aislo/tools/stmate-test/scr_kanjub_axes.js
T
eomsangdonandClaude Opus 5.5 3d8fddfc34 feat(stmate-test): 보고서·제잡비·식언어·수량산출·화면 묶음 합침 · 재계산 후 저장 무변경
- 보고서: 원본 STMATE 엑셀과 셀 대조(목록표·자재단가대비·중기·일위대가·산근 목록·설계내역서·원가계산서) · 조달청 XML 공식 XSD 검증 · PM_Prt 화면
- 제잡비: 원본 계산 순서 4형식(T/S/TA/SA) · 실무 7건 저장 결과키 전수 1원 · 요율표 조회 · 선택지 계산 · 제잡비·제비율 화면
- 식언어·수량: 함수·조건식·금액변수·문법 검사·수량변수·QCODE · 산근·구성·중기공식 편집 화면 · 순환 알림
- 화면: 원본 메뉴 체계·단축키 · 설계내역서 편집(행 넣기·지우기·이동·레벨·보관함) · 초기값 · 단가목록표
- 저장: 초기값(Start8x.Ini) 바뀐 키 저장 · 노임 환산 직종 = 초기값 CONLD · 산근·구성 결과에 적용단가 칸 채우지 않음(원본 0)
- DBF 글 칸 앞 빈칸 보존 · 시험 도우미 표준입력 utf8(한글 조각 깨짐 원인)
- 실무 5건 재계산 후 저장 = 바뀐 칸 0 · 시험 332건 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-13 19:12:04 +09:00

387 lines
11 KiB
JavaScript

/* -*- coding: utf-8 -*- */
/**
* 제잡비 계산(wM_KanJub) 선택축·입력칸 표 (scr_kanjub_axes.js) — 화면 순번 ≠ 내부값인 축은 원본 그대로
* 근거: 지식DB STmate/old/30_원자료/settings_axis_map.txt(83축) · 20_분석 12 §10.1~10.3 · 25 §1(저장키)
*/
(function (global) {
"use strict";
const UNITS = [
"없음",
"10원",
"100원",
"1,000원",
"10,000원",
"100,000원",
"1,000,000원",
"10,000,000원",
"100,000,000원",
];
const unitOpts = (first) => UNITS.map((u, i) => [i, i ? `${u} 미만` : first]);
const idx = (labels) => labels.map((l, i) => [i, l]);
// 선택축 — [키, 이름, [[내부값, 화면 글]…]] · 화면 순서대로 · 내부값이 다른 축은 settings_axis_map 그대로
const COMMON = [
[
"JAB_TYPE",
"계산형식",
idx([
"일반 형식",
"토지개발공사 형식",
"인천상수도 형식",
"수자원공사 형식",
"지역난방공사 형식",
"고용개선지원(서울)",
]),
],
[
"I_KONG_TYPE",
"공사의 종류",
[
[0, "(1) 일반(토목)공사"],
[2, "(2) 조경공사"],
[4, "(3) 산업설비(토목)"],
[3, "(4) 건축공사"],
[1, "(5) 산업설비(건축)"],
[5, "(6) 국가유산수리"],
[8, "(7) 폐기물처리"],
[9, "(8) 소규모용역"],
],
],
[
"I_SET_BASE",
"적용기준",
[
[2, "일반(국가계약법)"],
[0, "일반(지방계약법)"],
[1, "행자부기준"],
],
],
[
"I_KONG_KIKAN",
"공사기간",
idx(["6개월이하", "7개월 ~ 12개월이하", "13개월 ~ 36개월이하", "36개월이상"]),
],
[
"I_KOBO_TYPE",
"고용보험료",
idx(["없음", "1 등급", "2 등급", "3 등급", "4 등급", "5 등급", "6 등급", "7 등급이하"]),
],
["I_TBUGUM", "퇴직공제부금비", idx(["토목공사", "준설공사", "건축공사", "기타"])],
[
"I_ANJUN_TYPE",
"안전관리비 공종",
[
[0, "건축공사"],
[1, "토목공사"],
[3, "중건설공사"],
[4, "특수건설공사"],
],
],
[
"I_HWAN",
"환경보전비",
idx([
"없음(전기·정보통신·소방·국가유산)",
"도로(교량·터널·활주로)",
"플랜트",
"지하철",
"철도",
"상하수도",
"항만(방지막 필요)",
"항만(방지막 불필요)",
"댐",
"택지개발",
"주택(재개발·재건축)",
"주택(신축)",
"주택 외 건축",
"조경",
"기타토목(하천 등)",
]),
],
[
"I_EQIP",
"건설기계대여금 지급보증",
[
[-1, "없음(국가유산수리)"],
[0, "일반공사(토목·산업설비·조경·건축)"],
[1, "준설·포장·토공·비계"],
[2, "상하수도·보링·수중"],
[3, "석공·시설물·철근콘크리트·가스"],
[4, "조경시설물·식재·궤도·도장·철강재"],
[5, "기계설비 및 그외"],
],
],
[
"I_KN_SA_TYPE",
"관급/사급 내용",
idx([
"관급자재대/1.1",
"관급자재대",
"사급자재대/1.1",
"사급자재대",
"관급/1.1+사급재",
"관급재+사급/1.1",
"(관급+사급)/1.1",
"관급재+사급재",
]),
],
[
"I_POS_SA",
"사급비 위치",
[
[3, "재료비에 포함"],
[1, "이윤 다음"],
[2, "도급공사비 직전"],
[0, "관급자재대 다음"],
],
],
["I_ILBAN", "일반관리비", idx(["(주)공사", "전문공사"])],
[
"I_KOSU_TYPE",
"계약형식",
[
[0, "일반계약"],
[1, "최저가·기술제안"],
],
],
["I_BID_TYPE", "낙찰방식", idx(["종합심사 외", "종합심사 대상", "턴키(대안)"])],
[
"I_BUGA",
"부가가치세",
idx([
"(0) 공급가액의 10%",
"(1) 재료비의 10%",
"(2) 없음",
"(3) 산림조합 형식",
"(4) 산림조합-면세품",
]),
],
[
"I_KUN_TYPE",
"건물 종류",
idx([
"청사(11층이하)",
"청사(12층이상)",
"학교",
"국가유산",
"관람집회시설",
"전시시설",
"기타",
]),
],
];
const OPTN = [
[
"I_ANJUNAUTO",
"산업안전보건관리비",
[
[0, "사용자 수동계산"],
[1, "제비율표자동계산"],
[2, "변경 — 당초액+증감율"],
],
],
[
"I_AN_DN_TYPE",
"1.2배 비교",
[
[0, "소수 버림 후 1.2배"],
[1, "소수 버림 전 1.2배"],
],
],
[
"I_ANPUM",
"안전·품질관리비",
[
[1, "산출경비로 포함"],
[0, "산출경비로 미포함"],
],
],
["I_DOG_JEOL", "도급액 절사", unitOpts("도급액 버림없음")],
[
"I_BF_CH_BO",
"보험료 변경 계산",
[
[0, "직접노무비 x 요율"],
[1, "당초액 + 직노증감x요율"],
[2, "당초액 + 증감액(비율)"],
],
],
[
"I_COST_BO",
"건강·연금 금액",
[
[0, "계산"],
[1, "직접입력 유지"],
[2, "직접입력 유지(퇴직공제 포함)"],
],
],
[
"I_KWN_COMB",
"관급 인쇄",
[
[0, "(0) 분리인쇄"],
[1, "(1) 통합인쇄"],
],
],
];
const UPDN = idx(["절상", "반올림", "절사"]);
const LAB = [
[0, "ㄴ.1)직노"],
[1, "당해 상시근로자노무비"],
];
// 형식 탭 패널(Pn01~05_x) — 같은 이름 축이 형식마다 한 벌(12번 §10.1-2)
const SCHEME_AXES = {
T: ["ANJ_K3", "ANJ_B", "KUN", "YUN", "IYUN", "JEOL", "DOGUP", "KWN", "TOT"],
S: ["ANJ_K2", "ANJ_B", "KUN", "YUN", "JEOL", "DOGUP", "KWN", "TOT"],
TA: [
"ANJ_K3",
"ANJ_B",
"KUN",
"YUN",
"LTYP",
"MXA",
"MXK",
"MTYP",
"IYUN",
"JEOL",
"DOGUP",
"KWN",
"TOT",
],
SA: [
"ANJ_K2",
"ANJ_B",
"KUN",
"YUN",
"LTYP",
"MXA",
"MXK",
"MTYP",
"JEOL",
"DOGUP",
"KWN",
"TOT",
],
};
const AXIS = {
ANJ_K3: [["I_ANJUN_K", "안전비 대상", idx(["없음", "관급/사급 내용", "사급자재대"])]],
ANJ_K2: [["I_ANJUN_K", "안전비 대상", idx(["없음", "관급/사급 내용"])]],
ANJ_B: [
[
"I_ANJUN_B",
"1.2배",
[
[0, "(적용 안 함)"],
[1, "의 1.2배"],
],
],
],
KUN: [["I_KUNBO", "건강보험 밑수", LAB]],
YUN: [["I_YUNBO", "연금보험 밑수", LAB]],
IYUN: [
[
"I_IYUN",
"이윤/수수료",
[
[0, "이윤"],
[1, "수수료"],
],
],
],
LTYP: [
[
"I_LTYP",
"노무비 산정",
[
[0, "노무비 = 직공비 x 조정계수"],
[1, "노무비 = 내역서 직접노무비"],
],
],
],
MXA: [
["I_MXA", "안전비 상한비", idx(["상한비 자동계산", "상한비 강제적용", "상한비 적용안함"])],
],
MXK: [
["I_MXK", "기타경비 상한비", idx(["상한비 자동계산", "상한비 강제적용", "상한비 적용안함"])],
],
MTYP: [
[
"I_MTYP",
"재료비 산정",
[
[1, "직접공사비 * 요율 방식"],
[0, "조정계수 입력방식"],
],
],
],
JEOL: [["I_JEOLSA", "공급가액 절사", unitOpts("총공사비에서 조정")]],
DOGUP: [
[
"I_DOGUP",
"도급 표기",
[
[0, "도급공사비"],
[1, "도급예정액"],
],
],
],
KWN: [
["I_KWN_JEOLSA", "관급(도급자설치) 자리", unitOpts("절상(절사) 없음")],
["I_KWN_UPDN", "관급(도급자설치) 처리", UPDN],
["I_KWN_K_JEOLSA", "관급(관급자설치) 자리", unitOpts("절상(절사) 없음")],
["I_KWN_K_UPDN", "관급(관급자설치) 처리", UPDN],
],
TOT: [["I_TOT_JEOL", "총액·이윤보정 절사", unitOpts("이윤보정액 입력")]],
};
const schemeKeys = (sch) => SCHEME_AXES[sch].flatMap((a) => AXIS[a].map((x) => x[0]));
// 직접입력 금액(C_·Y_·B_)
const INPUTS = [
["C_ANJUN_G", "안전비 기초액"],
["C_ANJUN1_G", "기초액(관급 제외)"],
["C_ANJUN2_G", "기초액(관급 포함)"],
["C_KWANGUP_D", "관급자재(도급자설치)"],
["C_KWANGUP_K", "관급자재(관급자설치)"],
["C_T_JODAL", "조달수수료"],
["C_SAGUP", "사급자재대"],
["C_SANGSI", "상시근로자 노무비"],
["C_T_ANJUN_N", "내역서 안전관리비"],
["C_ANJUN_B", "안전관리비 별도"],
["C_PUMJIL_B", "품질관리비 별도"],
["C_PSAMT_B", "미확정설계공종(PS)"],
["C_EXCEPT_B", "제비율 적용제외"],
["C_BUSAN", "부산물(안전 밑수)"],
["C_BUSAN_B", "작업설 감액"],
["C_NBUGAM", "비과세자재대"],
["C_T_K_MAT", "관리품목자재"],
["C_PURCHAS", "매입세"],
["C_T_PEGI", "폐기물수수료"],
["C_T_KOLJAE", "골재사용료"],
["C_BUGA_M", "면세품목"],
["C_KONGSU_A", "이행보증 기초금액"],
["C_KONGSU_MA", "이행보증 기준금액"],
["Y_KONGSU", "공기(년)"],
["C_IYUN_M", "이윤보정액"],
["C_EIS_HOLLAB", "고용개선 주휴노무비"],
["C_KONGSA_J", "공사보험 대상액"],
["B_KONGSA", "공사보험 대상액 고정(1)"],
["B_BUGA_UP", "부가세 +1원(1)"],
["B_KWANGUP_D", "관급 내역에서(1)"],
["B_T_JODAL", "조달수수료 내역에서(1)"],
];
// 요율 칸(옛 rates 코드) — 형식별로 보이는 것
const RATE_ROWS =
"KANNO SANBO KOBO KUNBO SLVBO YUNBO TBUGUM ANJUN ANJUN1 ANJUN2 KITA S_SUDO S_BOKRI S_SOMO S_TONGSIN S_SEGUM S_PEGI S_DOSEO S_JIGUP KONGSU HADOSU HWAN EQIP BUDM_SM BUDM_IC ILBAN IYUN ANJUNP KONGSA S_SIGONG S_SIGONG_1 DOSEOH EIS_HOLIR1 EIS_HOLIR2 EIS_SOCIR2 EIS_INCENT R_DM R_DL R_L R_DMDL R_DML R_MxA R_MxK".split(
" ",
);
global.STMATE_KANJUB_AXES = {
UNITS,
COMMON,
OPTN,
AXIS,
SCHEME_AXES,
INPUTS,
RATE_ROWS,
schemeKeys,
};
})(typeof window !== "undefined" ? window : globalThis);