feat(master_data): 노임 마스터화 — 원문 md 다섯 갈래 노임 · 준용대상 짝짓기·통합 · 미공표 산정 · ESTX 항목 비교
- 새 요소 파일(우리 md 에서만 · 판 2026-01-01): 엔지니어링노임 56 · 측량노임 20 · 건설사업관리노임 4 · SW노임 17 · 산림노임 2 — 빌더 build_인력_노임.py · 줄 수·값 md 기계 대조
- 준용대상 49 → 48: 측량중급기술자 옮김(로직 참조 8) · 원문 통합 목록 5 직종 통합 칸(목도 · 특수비계공 · 함석공 · 갱부 · 스레이트공) · 절단공 갈림 · 비슷한 이름 21 후보
- 건설노임 미공표 14 산정{값 · 근거 · 마지막공표} — 원문 회차 평균 그대로 이음 · 석조각공·드잡이공편수 다산소프트와 이음 계열 다름 비고 · 2026-09-01 적용분 확보됨 비고
- 엔진 차례 값 → 준용 → 통합 → 산정 · 호표 출처 · M01 준용 후보 7 노임 파일 · 통합·산정·후보 칸 읽기 전용
- ref/_비교_estx.md 10절: ESTX 378 줄 중 371 짝 · 짝 없는 직종 42 · 일괄 시험 계산 통과 1104 → 1115
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
@@ -232,7 +232,18 @@ def elements(group: str, q: str, limit: int) -> dict:
|
||||
_PICK = {
|
||||
"procure": "재료_나라장터자재.json",
|
||||
"price": "재료_시중물가.json",
|
||||
"job": ("인력_건설노임.json", "인력_제조노임.json"),
|
||||
"job": tuple(
|
||||
f"인력_{b}.json"
|
||||
for b in (
|
||||
"건설노임",
|
||||
"제조노임",
|
||||
"엔지니어링노임",
|
||||
"측량노임",
|
||||
"건설사업관리노임",
|
||||
"SW노임",
|
||||
"산림노임",
|
||||
)
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
@@ -251,7 +262,7 @@ def _lowest(value) -> object:
|
||||
|
||||
def pick(kind: str, q: str, limit: int) -> dict:
|
||||
"""고르기 창 — `procure` 나라장터자재(ref = 나라장터:<열쇠>) · `price` 시중물가(관급 조달 줄 포함 · ref = 열쇠)
|
||||
· `job` 값 있는 건설노임·제조노임 직종(ref = 인력:원문:열쇠) · 이름·규격 낱말이 모두 들어간 줄."""
|
||||
· `job` 값 있는 공표 노임 직종(건설·제조·엔지니어링·측량·건설사업관리·SW·산림)(ref = 인력:원문:열쇠) · 이름·규격 낱말이 모두 들어간 줄."""
|
||||
if kind not in _PICK:
|
||||
raise StoreError(404, f"없는 고르기 「{kind}」")
|
||||
words = [_squash(w) for w in q.split()]
|
||||
|
||||
@@ -81,7 +81,7 @@ export interface CalcLine {
|
||||
단가: number;
|
||||
금액: number;
|
||||
비목: Record<string, number>;
|
||||
/** 값 없는 요소를 다른 요소로 셈 — 「준용: <직종>」 */
|
||||
/** 값 없는 요소를 다른 값으로 셈 — 「준용: <직종>」 · 「통합: <직종>」 · 「산정: …」 */
|
||||
출처?: string;
|
||||
}
|
||||
export type CalcAnswer =
|
||||
|
||||
@@ -58,6 +58,10 @@ function hidden(file: string, col: string): boolean {
|
||||
return JOB.includes(file) && col === "준용";
|
||||
}
|
||||
|
||||
/** 빌더가 원문에서 채운 칸(통합 · 산정 · 후보) — 읽기 전용. */
|
||||
const fixed = (file: string, col: string): boolean =>
|
||||
JOB.includes(file) && ["통합", "산정", "후보"].includes(col.split(SEP)[0]);
|
||||
|
||||
const HEADS: Record<string, string[]> = {
|
||||
[MARKET]: ["조달 값", "조달 기준", "M01_ProcureCol"],
|
||||
[LINKED]: ["M01_PriceCol"],
|
||||
@@ -126,7 +130,7 @@ export function renderRows(host: HTMLElement, file: string, q: string): () => vo
|
||||
),
|
||||
);
|
||||
for (const c of cols) {
|
||||
const editable = !deleted && isScalar(orig[c]);
|
||||
const editable = !deleted && isScalar(orig[c]) && !fixed(file, c);
|
||||
tr.append(
|
||||
buildCell(show(now[c]), {
|
||||
changed: !same(now[c], orig[c]),
|
||||
|
||||
Reference in New Issue
Block a user