- 보고서: 원본 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>
65 lines
2.9 KiB
JavaScript
65 lines
2.9 KiB
JavaScript
/**
|
|
* STMATE 도구 창 공통 바인딩 · 내역 행 끼워 넣기 (app_modals.js) — api = window.STMATE_APP
|
|
* 내역 도구(wITNum · wBoqRate · wM_Rate · wExpnd)는 scr_ui_boq_dlg.js · 가격지 비교(wM_Boxa)·기준단가 수정(wM_Edt_Hal)은 scr_ui_dan.js
|
|
* 여기 남은 것 = 수량산출서 연결(wQtyList 옛 창) · 표준 카탈로그 특수산식 불러오기
|
|
*/
|
|
(function (global) {
|
|
"use strict";
|
|
|
|
function bindModalEvents(api) {
|
|
const { ctx, Calc, bindEach, closeModal, renderWorkspace } = api;
|
|
bindEach(".btn-apply-qty-expr", "onclick", (btn) => {
|
|
const id = btn.getAttribute("data-id");
|
|
const inp = document.querySelector(`.qty-expr-input[data-id="${id}"]`);
|
|
const val = inp ? Calc.evalFormula(inp.value, {}) : 0;
|
|
const item = ctx.state.boqItems.find((b) => b.id === id);
|
|
if (!item || !(val > 0) || !ctx.dbfData) return;
|
|
const B = global.STMATE_UI_BOQ;
|
|
const model = { rows: ctx.dbfData.boq_rows, items: ctx.state.boqItems, deleted: [] };
|
|
B.setCell(model, item._recno, "QTY1", Math.round(val * 100) / 100);
|
|
renderWorkspace();
|
|
});
|
|
bindEach(".btn-use-special-san", "onclick", (btn) => {
|
|
const spec = (ctx.catalogData.special_san || [])[parseInt(btn.getAttribute("data-idx"), 10)];
|
|
if (!spec || !ctx.uiState.selectedIlwiCode) return;
|
|
ctx.uiState.editedSmtMap[ctx.uiState.selectedIlwiCode] = (spec["산식행"] || []).join("\r\n");
|
|
ctx.uiState.activeScreen = "wM_Edit_iLWi";
|
|
closeModal();
|
|
renderWorkspace();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 내역 행 끼워 넣기 — 선택 행 앞(선택 없으면 끝) · 저장 원천(boq_rows)·계산 원천(boqItems) 함께
|
|
* 코드가 단가목록에 있으면 명칭·규격·단위를 단가목록 값으로
|
|
*/
|
|
function insertBoqRow(api, code, name, spec, unit, qty) {
|
|
const { ctx, renderWorkspace } = api;
|
|
const B = global.STMATE_UI_BOQ;
|
|
if (!ctx.dbfData || !ctx.dbfData.boq_rows) return alert("열린 내역서 없음");
|
|
ctx.dbfData.boq_deleted = ctx.dbfData.boq_deleted || [];
|
|
const model = {
|
|
rows: ctx.dbfData.boq_rows,
|
|
items: ctx.state.boqItems,
|
|
deleted: ctx.dbfData.boq_deleted,
|
|
};
|
|
const c = String(code || "").trim();
|
|
const cr = (ctx.dbfData.costn_rows || []).find((r) => String(r.CODE || "").trim() === c);
|
|
const row = B.makeRow(model, {
|
|
BDCODE1: c,
|
|
NAME1: cr ? cr.NAME || "" : name || "",
|
|
SIZE1: cr ? cr.SIZE || "" : spec || "",
|
|
UNIT1: cr ? cr.UNIT || "" : unit || "",
|
|
QTY1: String(Number(qty) || 0),
|
|
});
|
|
const ix = B.indexesOf(model.rows, ctx.uiState.boqSel || []);
|
|
const res = B.insertRows(model, ix.length ? ix[0] : model.rows.length, [row]);
|
|
if (!res.ok) alert(res.error);
|
|
ctx.uiState.boqSel = [row._recno];
|
|
renderWorkspace();
|
|
return row;
|
|
}
|
|
|
|
global.STMATE_APP_MODALS = { bindModalEvents, insertBoqRow };
|
|
})(window);
|