diff --git a/tools/est-test/PLAN.md b/tools/est-test/PLAN.md index 3d8dab1b9..41ec4b952 100644 --- a/tools/est-test/PLAN.md +++ b/tools/est-test/PLAN.md @@ -487,6 +487,8 @@ ative-standard.js에 표준시장단가 원천(SilJukDat)과 내역 행(EstMainD - 남음: 구성비·요율 전환(CalcBase), 약어 표시(SName), 제비율 기준 문서 보기(원본 한글 파일). - [x] 수량산출서 검색·전체보기(원본 TFRMMULLANG btnSerch·btnAllDisplay — 빈칸·|·괄호 무시 포함 검색) — 고르기 줄을 `native-quantity-sheets.js` 로 옮겨 700줄 제한 유지. - 검증완료: `test_est_quantity_sheets.py` 검색 시험 포함 수량 시험 22개 통과. ORCA 브라우저에서 「집수」 검색 → 항목에 집수정이 있는 「배수」만·선택 이동, 전체보기 → 3개 복귀, 샘플 복구. + - [x] 갑지·표지 양식(원본 TFRMGABGI·TFRMCOVER popupSaveFormat·popupLoadFormat·popupFormatTableS·popupSaveToDefault·popupInit·popupPrint) — 편집 창 위 단추: 양식목록(불러오기·지우기), 양식저장하기(이름), 기본양식으로 저장(처음 여는 갑지·표지에 채움), 초기화(문서 지우고 다시 열기), 인쇄(서식 8·9 미리보기로). 양식은 서버 보관함 종류 document 에 { docKind, fields }, 공사명은 넣지 않음. + - 검증완료: 문서·바인딩 시험 4개 통과. ORCA 브라우저에서 갑지 공사위치 「X위치」 양식 저장·기본양식 저장 → 초기화 뒤 다시 열면 「X위치」 채움, 양식목록에서 불러오기, 인쇄 → 미리보기 서식 8 에 갑지, 양식·인쇄 설정 지워 복구. - [x] 공사설명서·시방서 서식 편집(원본 TFRMESTEDITOR mnuFormatPar·mnuTableCreate·mnuFormatTable·popupBookMark·mnuFormatTableS·mnuSaveToDefault) — 서식 있는 편집 칸: 문단모양(정렬·들여쓰기·왼쪽 여백·줄간격), 표만들기(줄·칸), 표모양(테두리·칸 여백·너비), 책갈피(넣기·찾아가기), 양식목록(서버 양식 보관함 종류 document — 불러오기·지우기·현재 문서 저장), 기본양식으로 저장(빈 문서를 열면 채움). 본문은 `docs[kind].html`(허용 태그·속성만)과 글자 `text` 를 함께 두고 인쇄는 html 우선. 갑지에서 붙여넣기는 커서 자리에. 원본 WPT 서식 가져오기·ESTX 저장은 여전히 하지 않음. - 검증완료: 문서·바인딩 시험 4개 통과. ORCA 브라우저에서 설명서 첫 문단 가운데 정렬, 3×3 표·테두리 2px, 공사명 붙여넣기, 저장 뒤 인쇄 html 에 표·정렬 반영, 기본양식 저장 → 빈 문서 열 때 표 채움, 양식·문서 지워 복구. (DOM 이 필요해 pytest 단위 시험은 없음) - [x] 원가계산서 산출근거 약어로 표시(원본 popupSNameShow 0xd0e494 · 약어 생성 0xc97790) — 원가계산서(W) 메뉴 단추로 켜고 끔. 산출근거 식의 기호(영문 시작 또는 2자 이하, 범위 기호 뒤 제외)를 그 행 약어(SName, 없으면 빈칸 뺀 이름)로, 숫자×100 이 그 행 요율이면 요율 글자로, 「:」 는 「~」 로 바꿔 화면·인쇄에 보이고 그동안 산출근거 칸 잠금. 저장 값(VSusic)은 그대로. 기성 원가 화면의 같은 확인란과 같은 설정. diff --git a/tools/est-test/README.md b/tools/est-test/README.md index a6bf29b44..55a9f35d1 100644 --- a/tools/est-test/README.md +++ b/tools/est-test/README.md @@ -76,6 +76,8 @@ 편집(E) › `조달청 표준공사코드 적용`은 노임·자재·기계·일위 등의 코드를 조달청 코드로 바꿉니다. 왼쪽 목록은 원본 설치 폴더 `System\MainSys` 의 `PPS_STUFFC.dat`(노임·자재·장비) 또는 `PPS_HEAD.dat`(일위·단산·표준)를 골라 불러옵니다. 코드를 바꾼 뒤 `적용`을 누르면 그 코드를 쓰는 내역·일위·단산 줄도 함께 바뀝니다. `코드일괄변경`은 고른 .estx 파일(예: 원본 JodalCodeDB.estx)에서 품명·규격이 같은 코드를 찾아 EST 코드만 바꿉니다. +갑지·표지 편집 창 위의 `양식저장하기`·`양식목록`으로 발주처·결재란 같은 내용을 양식으로 두고 불러올 수 있습니다. `기본양식으로 저장`한 내용은 새 공사에서 갑지·표지를 처음 열 때 채워지고, `초기화`는 처음 상태로, `인쇄`는 미리보기로 갑니다. + 공사설명서·시방서 편집 창에서는 문단 정렬·들여쓰기·줄간격, 표 만들기와 표 테두리, 책갈피를 쓸 수 있습니다. `양식목록`으로 자주 쓰는 문서를 저장·불러오고, `기본양식으로 저장`한 문서는 빈 설명서·시방서를 열 때 자동으로 채워집니다. 원가계산서(W) › `산출근거 약어로 표시`를 누르면 산출근거가 「직.노 × 16.5%」처럼 비목 약어와 요율로 보이고(인쇄 포함), 다시 누르면 원래 식으로 돌아옵니다. 약어로 보이는 동안에는 산출근거를 고칠 수 없습니다. diff --git a/tools/est-test/index.html b/tools/est-test/index.html index ece14587d..9c39bf212 100644 --- a/tools/est-test/index.html +++ b/tools/est-test/index.html @@ -56,6 +56,7 @@ + diff --git a/tools/est-test/native-business-actions.js b/tools/est-test/native-business-actions.js index 0e187a513..1f660b9c5 100644 --- a/tools/est-test/native-business-actions.js +++ b/tools/est-test/native-business-actions.js @@ -627,7 +627,8 @@ const EstBusinessActions = (() => { (typeof EstProgressWonga !== "undefined" && EstProgressWonga.handle(name, state)) || (typeof EstCodeChangeView !== "undefined" && EstCodeChangeView.handle(name, state, node)) || (typeof EstSources !== "undefined" && EstSources.handle(name, state)) || - (typeof EstDocEditor !== "undefined" && EstDocEditor.handle(name, state, node)) + (typeof EstDocEditor !== "undefined" && EstDocEditor.handle(name, state, node)) || + (typeof EstDocForms !== "undefined" && EstDocForms.handle(name, state, node)) ) { EstApp.render(); } else if (name === "load-contract" || name === "load-bid") { diff --git a/tools/est-test/native-doc-forms.js b/tools/est-test/native-doc-forms.js new file mode 100644 index 000000000..feab958bd --- /dev/null +++ b/tools/est-test/native-doc-forms.js @@ -0,0 +1,134 @@ +// 원본 갑지(TFRMGABGI)·표지(TFRMCOVER) 팝업 — 양식저장하기·양식불러오기·양식목록(popupSaveFormat·popupLoadFormat·popupFormatTableS), +// 기본양식으로 저장(popupSaveToDefault: 새 공사에서 갑지·표지를 처음 열 때 채움), 갑지·표지 초기화(popupInit), 인쇄(popupPrint). +// 양식은 서버 양식 보관함 종류 document 에 { docKind, fields } 로 둔다(공사명은 양식에 넣지 않음 — 늘 현재 공사 이름). +const EstDocForms = (() => { + const DEFAULT = { gabgi: "기본양식-갑지", cover: "기본양식-표지" }; + const FIELDS = { + gabgi: ["Position", "CompanyName", "Date", "CompanyPos", "Explan", "Cost", "Gulga"], + cover: ["Name2", "Date", "CompanyName", "CompanyPos"], + }; + const post = (body) => ({ + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + const field = (name) => document.querySelector(`#dialog-content [name="doc-${name}"]`); + + function read(kind) { + return Object.fromEntries( + FIELDS[kind] + .filter((k) => field(k)) + .map((k) => { + const v = field(k).value; + return [ + k, + k === "Gulga" + ? v + .split(/\r?\n/) + .map((l) => l.trim()) + .filter(Boolean) + : k === "CompanyPos" + ? Number(v) + : v, + ]; + }), + ); + } + function write(kind, fields) { + for (const k of FIELDS[kind]) { + const node = field(k); + if (!node || fields[k] === undefined) continue; + node.value = Array.isArray(fields[k]) ? fields[k].join("\n") : fields[k]; + } + } + async function list(kind) { + return (await EstApp.api("/api/forms")).filter( + (f) => f.kind === "document" && f.data?.docKind === kind, + ); + } + function panel(html) { + let box = document.getElementById("doc-forms-panel"); + if (!box) { + box = document.createElement("div"); + box.id = "doc-forms-panel"; + box.className = "business-tools"; + document.querySelector("#dialog-content .form-fields")?.before(box); + } + box.innerHTML = html; + } + function tools(kind) { + return `