Files

128 KiB
Raw Permalink Blame History

  • 산출근거 주석 지정/해제(popMainSetStr), 블럭 삭제(popMainBlockDel), 공사비역산 맞추기(popupTotal), 레벨 일괄 증감(mnuLevelUp/Down), 설계변경 초기화(mnuChangeInit), 원가계산서 초기화(popupInit), 기성 회차 입력 초기화(mnuFileAccomInit), 연차공사 배분 초기화(TFRMANUAL popInit) 및 물가변동 입력 초기화(TFRMESCALATION popInit) 구현

    • 자체 검증:
      1. 산출근거 주석 지정/해제 (popMainSetStr, 0xf08b1c) 및 음수 비목/Index 유형 보존:
        • REA TFRMCOST/TFRMESTBASE의 팝업 메뉴 popMainSetStr / mnuSetGuSuc ("주석으로 지정", Ctrl+J, 0xf08b1c) 스펙 근거 기반 구현.
        • 단가산출(CostMainDat) 화면의 산출근거 행에서 Index를 -1(주석)로 지정하거나 원래 유형으로 복원.
        • 음수 유형 및 비목 행(-2 재료비, -3 경비, -5 소계) 온전한 보존·복원:
          • 주석 지정 시 _origIndex: curIndex뿐만 아니라 _origSCheck: curSCheck를 명시적으로 보존하고 Index = -1, SCheck = -1로 전환.
          • 주석 해제 시 _origIndex(또는 스냅샷 Index_)와 _origSCheck(또는 SCheck_, OCheck)를 통해 원래 비목 유형(-2, -3, -5 등)과 Index로 100% 정밀 복원 후 임시 속성 제거.
          • 호표 제목 행(Index > 0) 또는 소계 구분선(Index === -20)은 주석으로 지정할 수 없도록 안전 가드 적용.
          • 다중 선택 시 제목 행이나 비산출근거 행이 포함되면 전체 변경을 중단하고 원자성(Atomic) 보장.
          • 저장 및 재열기 왕복 검증: JSON 직렬화/역직렬화 후에도 _origIndex, _origSCheck 및 원래 비목 정보가 보존되어 온전하게 복원됨을 검증.
        • native-text.js에서 Index === -1인 행은 소계(LinkIndex: 61) 계산 시 if (num(previous.Index) !== -1) 조건에 따라 자동으로 합산에서 제외되므로 산출식 수치 무결성 완벽 보장.
      2. 블럭 삭제 (popMainBlockDel, 0xf08adc) 및 실제 파일 참조 보호:
        • REA TFRMCOST/TFRMHEAD/TFRMMACH/TFRMEST 전역의 popMainBlockDel ("블럭삭제", Ctrl+Del, 0xf08adc) 스펙 근거 기반 구현.
        • EstBlockActions.deleteBlockRows(state): 선택된 범위/블럭의 행들을 일괄 삭제.
        • 호표 제목 행(Index > 0)이 포함된 경우 호표 전체 행을 일괄 삭제 범위로 확장.
        • 참조 보호 검증: 다른 항목(EstMainDat, HeadMainDat 등)에서 참조 중인 코드가 포함된 경우 숫자 및 문자열 형태의 LinkIndex(5, 6, 21, 101, 103, 104, 105)와 연결 코드를 정규화 대조하여 "다른 항목에서 사용 중입니다. 연결을 먼저 해제하세요."로 안전 차단.
        • 삭제 완료 후 선택 해제 및 블럭 시작/끝 상태 초기화.
      3. 원가계산서 공사비역산 자리수 맞추기 (TFRMWONGABASE popupTotal):
        • REA TFRMWONGABASE 팝업 popupTotal ("공사비역산 자리수 맞추기") 스펙 근거 기반 구현.
        • EstWonga.alignTotal(rows, targetCost, unitDigits, options, bases):
          • 원가계산서 총도급공사비(LinkIndex 55) 행을 지정 단단위(1,000원, 10,000원 등)로 절하 맞춤.
          • 단순 Cost 덮어쓰기가 아닌, 실제 calculate(TotalFix: true) 엔진을 호출하여 이윤 및 부가가치세 행을 수렴 조정하고 전체 원가 명세와 목표 금액(A+B+C+D === Total)을 일관되게 맞춤.
          • 실패 시 안전 롤백 및 기존 상태 보존: 복제본(structuredClone)을 통해 먼저 역산 계산을 수행하며, 순환 참조나 수렴 실패 시 원본 rows의 Cost를 임의 변경하지 않고 기존 상태를 100% 보존하며 에러 처리. 목표 금액 완전 도달 확인 후에만 원본 rows에 결과 동기화.
          • 조정된 계산 결과를 원본 rows에 정확히 반영하고 state.project.options.TotalFix = true 설정.
          • 저장 및 재열기 왕복 검증: JSON 직렬화/역직렬화 후 재계산하더라도 이윤, 부가세, 총도급공사비가 변형 없이 동일하게 유지됨을 검증.
        • UI 연동: 편집(E) 메뉴에 공사비역산 자리수 맞추기(data-action="align-wonga-total") 등록 및 EstActions.form 연동.
      4. 레벨 일괄 증감 (mnuLevelUp, mnuLevelDown, mnuCostLevelUp, mnuCostLevelDown):
        • REA TFRMESTMAIN/TFRMEST의 mnuLevelUp ("레벨 일괄증가", 0xd0e374), mnuLevelDown ("레벨 일괄감소") 스펙 근거 기반 구현.
        • 내역서(EstMainDat), 단가산출(CostMainDat), 일위대가(HeadMainDat), 기계경비(MachMainDat)에서 선택된 행들의 Level을 일괄 +1 또는 -1 조정(범위: 0~9 클램프).
        • 지원되지 않는 화면(자재, 노임 등)이나 미선택 시 안전 거부 처리.
        • UI 연동: 상단 LEVEL 메뉴에 레벨 일괄 증가 (+1)(data-action="level-batch-up"), 레벨 일괄 감소 (-1)(data-action="level-batch-down") 등록.
      5. 설계변경 초기화 (mnuChangeInit) 및 참조 무결성 보강:
        • REA TFRMESTMAIN의 메뉴 mnuChangeInit ("설계변경 초기화") 스펙 근거 기반 구현.
        • EstBlockActions.resetChangeAction(state):
          • 불완전 복원 원천 차단: baseline이 없거나 baseline.tables가 누락된 경우, 무차별적인 _ 복원을 엄격히 차단하고 "확정된 당초 내역(baseline)이 없습니다. 완전 복원이 불가능하여 초기화를 진행할 수 없습니다." 에러 발생.
          • 수량 연결 참조 무결성 및 Excel 고유 식별자 동일성 입증 검사:
            • 수량산출 연결(quantities, quantitySheets.items의 TargetKey/TargetCode): 당초 내역(baseline.tables.EstMainDat)에 없는 신규 행을 가리키는 연결 발견 시 즉시 초기화 차단.
            • Excel 수량 연결(excelQuantityLinks): 단순 인덱스 범위 검사가 아니라, 연결 대상의 안정된 고유 식별자(PkID)를 통해 당초 행 존재 여부를 대조. 행 중간 삽입·삭제·재정렬이나 중복 코드가 있더라도 Code, Name, Size, Unite, Level의 동일성(Identity)을 엄격히 검증하여 다른 항목을 가리키는 위험을 원천 차단.
          • 사용자 확인 대화상자(confirm)를 통해 오조작 방지.
          • 정밀 테이블 및 필드 스펙 격리: baseline 생성 스펙과 정확히 일치하는 7개 대상 테이블(EstMainDat, HeadMainDat, HeadTitleDat, CostMainDat, CostTitleDat, MachTitleDat, Wonga)만 복원하여, 수량 연결(quantities), 기성(progress), 연차(annual) 등 다른 업무 데이터와 연결 구조를 100% 온전하게 보존.
          • 다른 업무 원본 필드 보존: 전체 필드의 무차별 _ 삭제 대신, baseline 스펙에 정의된 18개 핵심 필드(Code, Name, Size, Unite, GN, TU, TC, 단위단가 4종, 비목단가 4종, LineData, VSusic, Cost)의 _ 속성만 선택적으로 정리. 경비성 복원 정보(_prevSCheck), 순공사비 복원 정보(_origLinkIndex, _origName), 주석 복원 정보(_origIndex, _origSCheck) 등 다른 업무 속성을 완벽하게 보존.
          • 신규 및 삭제 행 복원: 설계변경 도중 추가된 신규 행(NewItem: true)을 제거하고 삭제된 당초 행을 100% 원래 행 수 및 순서로 원상 복구.
          • baseline 객체를 안전하게 제거하고 프로젝트 작업 모드를 일반 내역서 모드로 환원.
          • 저장 및 재열기 왕복 및 Undo 검증: 당초 확정 후 변경된 내역을 JSON으로 저장하고 재열기한 상태에서도 resetChangeAction을 통해 당초 수량/단가/금액으로 정확히 복원되며, EstApp.change를 통한 Undo(실행 취소) 이력 보존 검증 완료.
        • UI 연동: 편집(E) 메뉴에 설계변경 초기화(data-action="reset-change") 등록 및 handle("reset-change") 연동.
      6. 원가계산서 항목 초기화 (TFRMWONGABASE popupInit):
        • REA TFRMWONGABASE 팝업 popupInit ("항목 초기화") 스펙 근거 기반 구현.
        • EstWonga.resetWonga(rows, options, bases) & EstBlockActions.resetWongaAction(state):
          • 공사비역산 고정액(TotalFix: true) 옵션을 false로 해제.
          • 당초 보존값(VSusic_, Cost_, CalcIndex_)이 있는 경우 원래 수식 및 단가로 안전 복원.
          • 일반 재계산 엔진(calculate)을 호출하여 당초 수식과 직접공사비 기준금액에 따라 원가계산서 전체 항목을 깨끗하게 재계산.
          • UI 연동: 편집(E) 메뉴에 원가계산서 초기화(data-action="reset-wonga") 등록 및 handle("reset-wonga") 연동.
      7. 기성 회차 입력 초기화 (mnuFileAccomInit):
        • REA TFRMESTMAIN의 메뉴 mnuFileAccomInit ("기성 회차 입력 초기화") 스펙 근거 기반 구현.
        • EstBlockActions.resetProgressInputsAction(state):
          • 선택된 기성 회차의 금회 기성 및 사정 입력 데이터(round.inputs)를 깨끗하게 리셋.
          • 확정된 회차(round.locked: true)는 입력을 초기화할 수 없도록 안전 차단 ("확정된 회차는 입력을 초기화할 수 없습니다. 확정을 먼저 해제하세요.").
          • 사용자 확인 대화상자(confirm)를 통해 실수로 인한 기성 입력 삭제 방지.
          • 실행 취소(Undo) 이력 보존 및 JSON 직렬화/역직렬화(저장 재열기) 왕복 보증.
        • UI 연동: 기성 화면 툴바에 회차 입력 초기화(data-action="reset-round-inputs") 버튼 등록 및 handle("reset-round-inputs") 연동.
      8. 연차공사 배분 초기화 (TFRMANUAL popInit - 웹 보조 기능 명시):
        • REA TFRMANUAL의 팝업 popInit 분석 근거 재확인: REA 원본의 popInit이 전체 차수 삭제인지 단일 차수 수식 리셋인지 동등성 근거가 불충분하므로, 이를 단정하지 않고 웹 보조 기능("연차 차수 배분 초기화 (웹보조)")으로 명확히 구분하여 표기.
        • EstBlockActions.resetAnnualAction(state):
          • 등록된 연차공사 차수와 배분 수식(project.annual = [])을 웹 보조 차원에서 초기화.
          • 내역서(EstMainDat) 및 원가계산서(Wonga)의 본선 원본 데이터를 100% 온전하게 보존.
          • 빈 상태에서 재호출 시 안전 거부 처리 및 사용자 확인 대화상자(confirm)에 웹보조 성격 안내.
          • 실행 취소(Undo) 지원 및 JSON 저장/재열기 왕복 검증 완료.
        • UI 연동: 연차공사 화면 상단 툴바에 연차 차수 초기화(웹보조)(data-action="reset-annual") 버튼 등록 및 handle("reset-annual") 연동.
      9. 물가변동 입력 초기화 (TFRMESCALATION popInit):
        • REA TFRMESCALATION의 팝업 popInit ("물가변동 입력 초기화") 스펙 근거 기반 구현.
        • EstBlockActions.resetEscalationAction(state):
          • 물가변동 화면(escalation)에서 적용제외 수량(excludeQuantities) 및 조정 옵션(options)을 깨끗하게 리셋.
          • 내역서 본선 행 및 기준 단가를 100% 온전하게 보존.
          • 물가변동 미설정 또는 빈 상태에서 재호출 시 안전 거부 처리 및 사용자 확인 대화상자(confirm) 지원.
          • 실행 취소(Undo) 이력 보존 및 JSON 직렬화/역직렬화(저장 재열기) 왕복 보증.
        • UI 연동: 물가변동 툴바에 물가변동 입력 초기화(data-action="reset-escalation") 버튼 연동 및 handle("reset-escalation") 등록.
      10. UI 연동 및 700줄 제한 엄수:
        • native-block-actions.js(636줄), native-wonga.js(268줄), native-extra.js(699줄)에 모듈화 배치하여 단일 소스코드 파일 700줄 제한 완벽 준수.
        • index.html(225줄) 편집(E) 및 LEVEL 메뉴 등록.
    • 관련 테스트:
      • pytest resources/tester/test_est_row_actions.py 14개 전수 통과:
        • test_reset_escalation_action: 물가변동 적용제외 수량 및 옵션 초기화, 본선 내역/단가 보존, JSON 저장 재열기 왕복, Undo(실행 취소) 지원, handle("reset-escalation") 연동 및 빈 상태 안전 거부 검증 완료.
        • test_reset_annual_action: 연차공사 2개 차수 배분(40%/60%) 계산 검증, JSON 저장 재열기 왕복, resetAnnualAction 실행 후 차수 초기화 및 본선 내역/원가 데이터 보존, 빈 상태 안전 거부, handle("reset-annual") 연동 및 Undo 지원 검증 완료.
        • test_reset_progress_inputs_action: 미확정 기성 회차의 입력 초기화, 확정된 회차의 초기화 시도 시 안전 차단, JSON 저장 재열기 왕복 후 초기화 검증, handle("reset-round-inputs") 연동 및 Undo 지원 검증 완료.
        • test_reset_change_action: baseline 부재 시 안전 차단, 신규 행 참조 수량 연결 시 안전 차단, Excel 수량 연결(excelQuantityLinks)의 안정된 식별자(PkID) 검증(행 중간 삽입·순서 재정렬·중복 코드 발생 시 신규 행 참조 차단 및 내용 변조 시 동일성 입증 실패 차단), 신규 행 추가 및 기존 행 변경 후 JSON 저장 재열기 왕복, 설계변경 초기화 시 신규 행 제거 및 원래 행/수량/단가 완전 복원, 타 업무 필드(_origLinkIndex, _prevSCheck) 및 수량 연결(quantities) 보존, Undo(실행 취소) 지원 검증 완료.
        • test_reset_wonga_action: 공사비역산 실행(1,250,000원 절하 및 TotalFix=true) 후 JSON 저장 재열기 왕복, 원가계산서 초기화(resetWongaAction) 실행 시 TotalFix 해제 및 당초 수식/금액(1,270,500원) 복원, handle("reset-wonga") 연동 검증 완료.
        • test_align_wonga_total_action: 원가계산서 10,000원 단단위 절하 맞춤, 실제 calculate(TotalFix: true) 호출을 통한 이윤·부가세 역산 조정, 명세 합산 일치(totalMatch), JSON 저장 재열기 후 일관성 유지, 순환 참조 등 계산 실패 시 기존 rows 상태 완전 보존 검증 완료.
        • test_toggle_cost_comment_and_block_delete: 산출근거 행 주석(-1) 지정 및 _origIndex, _origSCheck 보존, 비목 행(-2, -3, -5)의 원래 비목 복원, JSON 저장 재열기 왕복 검증, 호표 제목 및 구분선 지정 거부, 다중 선택 원자성 보장, 블럭 행 일괄 삭제 및 문자열/숫자 LinkIndex 참조 호표 삭제 차단 검증 완료.
        • test_level_batch_adjust_actions: 선택 행 레벨 일괄 +1/-1 증감, 0~9 상하한 클램프, 비지원 테이블 및 미선택 시 안전 거부 검증 완료.
        • test_block_actions_range_selection_and_clear: 블럭 시작/끝 지정, 범위 선택, 전체 선택, 블럭 해제 및 예외 검증 완료.
      • pytest resources/tester/test_est_row_actions.py resources/tester/test_est_estimate.py resources/tester/test_est_business.py: 36 passed in 21.60s.
  • 단가산출 산출근거 비목 지정/해제(popMainSetNC/GC/JC/TC/BimogFree) 구현 및 순공사비·경비성 안전 가드 보강

    • 자체 검증:
      1. 순공사비·경비성 토글 안전 가드 및 원자적 일괄 검증 보강:
        • 명시적 0/1/2 이력 보존 및 복원: toggleJcBimog에서 경비성(3) 전환 시 원래 SCheck(0:비목별, 1:재료, 2:노무)을 _prevSCheck에 명시적으로 보존. 해제 시 해당 이력 또는 원본 SCheck_가 존재하는 경우에만 정확한 이전 값으로 복원.
        • 이력 없는 경비성 3 임의 변환 차단: _prevSCheck 및 SCheck_가 없는 기존 3 행이나 원래 유형을 알 수 없는 행의 임의 0 변환을 안전하게 차단.
        • 다중 선택 원자성(Atomic) 보장: 복수 행 선택 토글 시 사전 검증 계획(plans)을 수립하여 한 행이라도 거부 대상이 포함되면 전체 변경을 중단하고 앞선 행도 변경되지 않도록 원자적 일괄 적용 보장.
        • JSON 저장 및 재열기 왕복 보증: JSON 직렬화/역직렬화 후에도 _prevSCheck 및 SCheck_가 보존되어 당초 SCheck(0/1/2)로 100% 온전하게 복원됨을 검증.
        • 원본부터 순공사비(54)인 행의 해제 시도나 대체 시도 역시 _origLinkIndex나 LinkIndex_ 등 원래 유효 유형이 확인되지 않으면 오류로 차단하고 기존 행 속성 보존.
      2. 단가산출 산출근거 비목 지정/해제 (popMainSetNC, popMainSetGC, popMainSetJC, popMainSetTC, popMainSetBimogFree):
        • REA TFRMCOST/TFRMESTBASE의 팝업 메뉴 비목 지정(0xf0c0f0, 0x10d815c) 스펙 근거 기반 구현.
        • 단가산출(CostMainDat) 화면에서 산출근거 행의 OCheck 및 SCheck를 노무비(-1), 재료비(-2), 경비(-3), 소계(-5)로 지정하거나 일반 산출식(0)으로 해제.
        • UI 연동: 편집(E) 메뉴에 산출근거 비목 지정/해제(data-action="set-cost-line-kind") 등록 및 EstActions.form 대화상자 지원.
      3. 700줄 제한 엄수:
        • native-business-actions.js: 643줄, native-extra.js: 696줄, index.html: 211줄, resources/tester/test_est_row_actions.py: 422줄.
    • 관련 테스트:
      • pytest resources/tester/test_est_row_actions.py 5개 전수 통과:
        • test_toggle_safety_guards_prevent_arbitrary_zero_conversion_without_history: 복원 정보 없는 원본 54 행 해제/대체 차단 및 원본 경비성(3) 임의 0 변환 차단 검증.
        • test_jc_bimog_multi_selection_atomic_and_json_roundtrip: 다중 선택 시 거부 행 발생 시 앞선 행 변경 롤백(원자성), SCheck=0 지정/해제 및 JSON 재열기 왕복 복원 검증.
        • test_set_cost_line_kind_action: 산출근거 행의 노무비(-1) 지정, 재료비(-2)의 일반 해제(0) 및 타 화면 안전 거부 검증.
      • pytest resources/tester/test_est_row_actions.py resources/tester/test_est_estimate.py resources/tester/test_est_business.py: 27 passed in 19.26s.
  • 데이터 사용위치 검색(popUsesSerch / TFRMUSESDATASERCH) 구현

    • 자체 검증:
      1. REA 스펙 근거:
        • REA TfrmUsesDataSerch (0x10d819c) 및 popUsesSerch(내역서, 일위대가, 단가산출, 기계경비 전역 팝업 메뉴) 기반 구현.
        • 임의의 품목 행(자재, 노임, 견적, 표준, 일위대가, 단가산출, 기계경비, 내역서)에서 데이터 사용위치 찾기 실행 지원.
      2. EstExtra.findDataUsages(project, target) 검색 엔진 구현:
        • 대상 항목의 Code(우선) 또는 정규화된 Name+Size를 기준으로 내역서(EstMainDat), 일위대가(HeadMainDat), 단가산출(CostMainDat), 기계경비(MachMainDat)의 참조 행을 전수 검색.
        • 대상 항목 자기 자신의 대표 행은 검색 결과에서 안전하게 제외.
        • 일위/단산/기계의 경우 상위 공종 코드(curGroup)를 함께 추적하여 위치 이동 시 정확한 묶음(state.group)으로 진입 지원.
      3. UI 연동 및 대화상자 이동 기능:
        • index.html 상단 툴바에 사용위치 버튼(data-action="uses-data-search") 및 편집 메뉴에 데이터 사용위치 찾기 추가.
        • EstExtra.showUsesSearchDialog(targetRow)를 통해 검색된 위치 목록(구분, 코드, 품명/산출근거, 규격, 단위, 수량, 금액) 표시.
        • 이동(goto-use-location) 클릭 시 대화상자를 닫고 대상 테이블(navigate), 대상 묶음 그룹(state.group), 페이지(state.page), 선택 행(state.selection)으로 즉시 포커스 이동.
      4. 700줄 제한 엄수:
        • native-extra.js: 554줄, native-business-actions.js: 685줄, native-views.js: 140줄, index.html: 210줄.
    • 관련 테스트:
      • pytest resources/tester/test_est_row_actions.py 통과 (test_uses_data_search_finds_usages_across_tables: 자재 M001의 일위/단산/내역 4건 검출 및 그룹 보존, 일위 U001의 내역 1건 검출, 이름 일치 항목 검출, 미사용 항목 0건 반환 검증 완료).
      • pytest resources/tester/test_est_row_actions.py resources/tester/test_est_estimate.py 6개 전수 통과 (0 실패).
  • 일위대가 공종 할증계산(TFRMHALJUNGBIUL) 및 자재단가 부가세계산(TFRMCONVERTTOGANGUB) 구현

    • 자체 검증:
      1. 일위대가 공종 할증계산 (TFRMHALJUNGBIUL):
        • REA TFRMHEAD의 DoHalJungClick (0xf5b7fc) 및 TFRMHALJUNGBIUL(명칭, 불러올비목, 적용율, 적용비목, 0xdb4b14) 근거 기반 구현.
        • native-haljung.js의 EstHalJung.apply(project, tableKey, groupCode, { name, size, rate, sourceKind, targetKind }):
          • 불러올비목(규격): 0=비목별, 1=재료비의, 2=노무비의, 3=경비의, 4=합계의 (OCheck).
          • 적용비목: 0=비목별, 1=재료비에, 2=노무비에, 3=경비에 (SCheck).
          • 비목 매핑 정확성 보장: sourceKind가 특정 비목(1=재료비, 2=노무비, 3=경비)이고 targetKind = 0(비목별)인 경우, 기본 경비(JC)로 왜곡되지 않고 해당 원천 비목(SCheck = sInfo.ocheck)으로 정확히 가산되도록 보정.
          • 묶음 내 소계(LinkIndex = 51, 68) 직전 위치에 LinkIndex = 58(비율) 행을 안전하게 자동 삽입하고 즉시 재계산 반영.
          • 0 또는 잘못된 할증율 및 존재하지 않는 공종/화면 요청 안전 거부.
        • UI 연동: native-views.js에서 일위대가 화면 활성화 시 할증계산 버튼(data-action="haljung-calc") 노출 및 대화상자 연동.
      2. 자재단가 부가세계산 (TFRMCONVERTTOGANGUB):
        • REA TFRMSTUFFC의 팝업 popChangeCost 및 TFRMCONVERTTOGANGUB(부가세포함/제외, 단단위계산, 0xf616f0) 근거 기반 구현.
        • native-vat.js의 EstVat.apply(project, indices, { calcMethod, diget, digetMethod }):
          • 계산방법: 0 = 부가세포함(×1.1), 1 = 부가세제외(÷1.1).
          • 단단위계산: 원단위 또는 지정 자리수(1=십원, 2=백원..) 이하에 대해 사사오입/절하/절상 단단위 처리.
          • 근거 불충분한 row.Kind 변경 기능 비활성화: REA 스펙상 StuffcDat에 Kind 필드가 소비되지 않으므로 혼선 방지를 위해 자재구분 변경 옵션 제거 및 안전 처리.
          • 선택 행 또는 전체 자재단가(Cost1~6, InputTC, TC) 일괄 변환 및 Undo 지원. ValueIndex별(최저/평균/최고/선택/직접) 단가 및 재계산 후 원본 단가 보존 검증 완료.
        • UI 연동: native-views.js에서 자재단가 화면(StuffcDat) 활성화 시 부가세계산 버튼(data-action="vat-calc") 노출 및 대화상자 연동.
      3. 700줄 제한 엄수:
        • native-haljung.js: 91줄, native-vat.js: 58줄, native-business-actions.js: 593줄, native-views.js: 140줄.
    • 관련 테스트:
      • pytest resources/tester/test_est_business.py 18개 통과 (test_haljung_calculation_apply_to_head_and_cost_groups, test_vat_calculation_exclude_include_and_unit_rounding_for_materials 검증 보강 통과).
      • 핵심 EST 테스트 45개 전수 통과 (0 실패).
  • 일위대가 공종 단위환산 계산(TFRMUNITECALC) 및 낙찰률 당초단가(100%) 복원(TFRMBIMOGBIUL/TFRMNACCHALAPPLY) 구현

    • 자체 검증:
      1. 일위대가 공종 단위환산 계산 (TFRMUNITECALC):
        • REA TFRMHEAD의 팝업/도구 버튼 popUniteCalc (단위환산 계산, 0xf59bd8) 및 TFRMUNITECALC(명칭, 규격, 수량, 단위) 근거 기반 구현.
        • native-business.js에 convertGroupUnit(project, groupCode, { name, size, factor, unit }) 함수 구현:
          • 선택한 일위대가 공종(묶음)의 제목 행(Index > 0)에 명칭(Name), 규격(Size), 단위(Unite) 적용.
          • 특수행 제외: 비율 행(LinkIndex=58, 62), 낙찰률 행(LinkIndex=52), 소계 행(LinkIndex=51, 68) 및 계산 안 함/고정금액 행(CalcIndex=1, 3)은 수량(GN) 배수 변경에서 안전하게 제외하여 백분율 왜곡 및 중복 팽창 방지.
          • 일반 비목 행의 수량(GN)에만 환산 계수(factor)를 부동소수점 곱으로 적용.
          • AutoCalc: false 등 프로젝트 옵션 보존 및 0 또는 유효하지 않은 계수 거부.
        • UI 연동: index.html 및 native-views.js에서 일위대가 화면(HeadMainDat) 활성화 시 단위환산 버튼(data-action="unit-calc") 자동 노출.
        • 대화상자(EstActions.form)를 통해 사용자 입력 접수 후 EstApp.change()로 트랜잭션 및 Undo 지원.
      2. 낙찰률 당초단가(100%) 복원 (TFRMBIMOGBIUL, TFRMNACCHALAPPLY):
        • REA btnUndo (Hint: "당초단가(100%)로 복원합니다.") 근거 구현.
        • native-business.js의 bid(project, rates):
          • 연속 낙찰률 적용 시에도 최초 단가와 최초 옵션을 잃지 않도록 row.PreBidRates가 이미 존재하면 덮어쓰지 않고 최초 단가 유지.
          • O${field}도 최초 단가(PreBidRates[field])를 기준으로 낙찰률을 계산하여 다회차 적용 시의 누적 왜곡 방지.
          • 원본 프로젝트의 SourceRefresh 설정값은 next.options._preBidSourceRefresh ??= project.options.SourceRefresh로 최초 1회만 보존.
        • restoreBid(project):
          • 원래의 SourceRefresh가 true이더라도 재계산 도중 원천 단가로 복원 단가가 다시 덮이지 않도록, SourceRefresh: false 상태로 복원 재계산 수행 후 마지막에 원래 사용자의 SourceRefresh 옵션 상태를 안전하게 복원.
          • PreBidRates 및 생성된 낙찰 단가를 복원하고, 원본 파일에 이미 존재하던 O* 필드(OTU/ONU/OGU/OJU/OSU)는 임의 삭제하지 않고 영구 보존.
          • 저장·재열기(JSON 왕복), 수동/자동 계산 모드, 원천 단가와 다른 초기 단가 상태에서도 최초 단가 100% 온전 복원 확인.
        • 설계변경 화면 도구 모음에 당초단가(100%) 복원(restore-bid) 버튼 연동.
      3. 700줄 제한 엄수:
        • native-business.js: 692줄, native-business-actions.js: 505줄, native-actions.js: 699줄, native-views.js: 136줄.
    • 관련 테스트:
      • pytest resources/tester/test_est_business.py 16개 통과 (test_unit_calc_group_conversion_preserves_percentages_subtotals_fixed_and_other_groups 포함).
      • pytest resources/tester/test_est_change_workflow.py 15개 통과 (test_bid_rates_consecutive_apply_source_refresh_and_roundtrip_restore 추가 통과).
      • 핵심 EST 테스트 43개 전수 통과 (0 실패).
  • 자료 오류 검색(issues) 및 불일치 데이터 확인: REA TFRMNAMESIZECHECK(명칭·규격·단위 불일치) 및 TFRMPERSENTCHECK(단위 백분율(%) 불일치 데이터 검색) 검출 구현

    • 자체 검증:
      1. REA TFRMNAMESIZECHECK(명칭 불일치 및 중복 데이타 확인) 근거 기반 검출 및 동기화 구현:
        • native-issues.js의 scan()에서 기존 품명(Name), 규격(Size) 비교에 더해 단위(Unite) 불일치(연결 단위 차이) 검출 로직 추가.
        • 원천 데이터(자재 StuffcDat, 노임 LaborcDat, 표준 SilJukDat, 견적 EstiMateDat, 일위 HeadMainDat, 단가 CostMainDat, 기계 MachMainDat)의 실제 명칭·규격·단위(sourceName, sourceSize, sourceUnite)를 이슈 항목에 보존.
        • UI 렌더링에 원천 실제 명칭 표시 및 원천명칭 반영/원천단위 반영 개별 버튼(data-issue-sync-row), 상단 도구 모음에 불일치 원천 명칭/규격 일괄 반영 버튼(data-issue-sync-all) 제공.
      2. REA TFRMPERSENTCHECK(단위 백분율(%) 불일치 데이터 검색) 근거 기반 검출 추가:
        • REA TFRMPERSENTCHECK ("위의 데이타는 백분율(%)로 계산되어야 할 항목들입니다(할증, 낙찰율, 제잡비, 조달수수료 등). 그러나 단위가 %가 아니기 때문에 백분율로 계산하지 않습니다. 확인하세요.") 근거 구현.
        • 일위대가(HeadMainDat), 내역서(EstMainDat), 기계경비(MachMainDat), 단가산출(CostMainDat)의 비목 상세 행 중 백분율 연산 특수행(LinkIndex = 52, 57, 58, 62, 67)인데 단위(Unite)가 % 또는 %가 아닌 항목을 검출(단위 백분율(%) 불일치).
      3. 불일치 필드별 안전 반영 및 단위 왜곡·규격 삭제 방지:
        • 단위(Unite)는 수량 및 단가 산식과 직결되므로 일괄 반영(sync-all) 대상에서 완전히 제외하고, 개별 행에서 명시적 승인(원천단위 반영) 시에만 처리하도록 분리.
        • 규격(Size)은 원천 규격이 비어 있지 않은 유효 문자열일 때만 반영하여, 빈 원천 규격으로 기존 내역 규격을 덮어써 지우는 현상 방지.
        • 품명(Name) 불일치는 품명만 원천 값으로 안전하게 동기화하고 기존 규격·단위를 보존.
        • 일괄 반영 범위는 전체 스캔 결과가 아니라 화면의 현재 필터 조건(tableFilter, typeFilter)에 해당하는 currentFiltered 항목만 대상으로 한정.
        • 반영 시 EstApp.change() 트랜잭션을 통해 실행 취소(Undo) 지원 및 데이터 무결성 보존.
      4. 700줄 제한 준수:
        • native-issues.js 372줄로 엄수.
    • 관련 테스트:
      • pytest resources/tester/test_est_issues.py 12개 통과 (test_data_issues_detect_percentage_unit_mismatch 추가).
      • 브라우저 Undo 복원 및 원천 단위/규격 안전 처리 검증 완료.
  • 인쇄 서식 옵션 검토 및 안전 조치: PrintApplyField(단가 0원 누락 위험 방지) 및 PrintSumBottom(공종/소계 중복 합산 및 단가 합산 왜곡 차단) 안전 처리

    • 자체 검증:
      1. 결함 분석 및 안전 조치:
        • PrintSumBottom: 표시되는 모든 행을 단순 누적할 경우 공종/소계와 상세 항목이 중복 합산되어 실제 공사금액의 2배 이상으로 뻥튀기되고, 단위가 다른 수량 및 단가(TU)를 합산하는 논리적 왜곡이 발생함.
        • PrintApplyField: REA의 적용 단가 필드 표시 의도를 '단가 0인 행 필터링'으로 오해하여 삭제할 경우, 공종 제목 및 정상적인 0원 항목·음수 정산 항목이 누락되는 중대 위험이 발생함.
        • REA 원문의 정확한 세부 집계/필터 알고리즘 근거가 불충분하므로, 서식 데이터의 왜곡 및 행 삭제를 즉시 차단하고 미지원 처리.
      2. 코드 정리 및 데이터 무결성 보존:
        • native-forms.js: PrintApplyField에 의한 행 삭제 필터 및 PrintSumBottom에 의한 단순 <tfoot> 합산 렌더링을 완전히 제거하고, 모든 공종(Level>0), 소계, 0원 항목, 음수 변경분 행이 원본 그대로 보존되도록 복원.
        • native-report.js: 불안정한 체크박스 UI 노출을 비활성화하고, 공람용 옵션 등 검증된 서식 기능만 안정적으로 제공.
        • 바이너리 레코드 오프셋(import-print.cjs / export-print.cjs)은 데이터 무결성을 위해 안전하게 0/1 값을 읽고 쓸 수 있도록 유지하되 잘못된 화면 처리를 차단.
      3. 700줄 제한 준수:
        • native-report.js 352줄, native-forms.js 445줄, export-print.cjs 67줄, import-print.cjs 75줄로 엄수.
    • 관련 테스트:
      • pytest resources/tester/test_est_documents.py 16개 통과 (test_print_apply_field_and_sum_bottom_preserve_all_rows_and_no_destructive_filtering 추가).
      • 전체 연계 회귀 시험 54개 전수 통과 (0 실패).
  • 공람용 서식(내역서 117, 내역서총괄표 118, 일위대가 115, 일위대가총괄표 116) 인쇄 옵션 및 공람방법(수량만/단가만/수량·단가) 렌더링 구현

    • 자체 검증:
      1. REA TFRMESTPRINTPRIVATE 및 DatPrintOption.opt의 PrintGongMethod 설정 연동:
        • 인쇄 미리보기(native-report.js) 서식 선택 시 공람용 서식(115, 116, 117, 118)에 대해 공람용 방법 셀렉트(PrintGongMethod: 0=수량만, 1=단가만, 2=수량·단가) 노출 및 설정 동기화.
      2. native-forms.js 열 정의 및 마스킹 로직 구현:
        • 공람용 내역서(117) 및 일위대가(115):
          • PrintGongMethod = 0(기본값, 수량만): 단가 및 금액 열(TU, TC, NC, GC, JC, SC / NU, GU, JU, SU, TC)을 숨기고 공통정보 및 수량(GN)만 인쇄.
          • PrintGongMethod = 1(단가만): 수량(GN)을 숨기고 단가 및 금액 열만 인쇄.
          • PrintGongMethod = 2(수량·단가): 수량과 단가/금액을 모두 인쇄.
        • 공람용 총괄표(116, 118): PrintGongMethod = 0 시 금액 비목을 제외하고 공통 레벨·공종 열만 안전하게 출력.
        • 일반 표준 서식(1, 2, 103, 106)은 변경 없이 기존 전체 열 출력 및 데이터 무결성 보존.
      3. 700줄 제한 준수:
        • native-report.js 342줄, native-forms.js 439줄로 엄수.
    • 관련 테스트:
      • pytest resources/tester/test_est_documents.py 15개 통과 (test_public_view_forms_print_gong_method_options 추가).
      • 전체 연계 회귀 시험 52개 전수 통과 (0 실패).
  • 계약심사(review) 화면 변경 행 필터링(전체/변경/사유작성/사유미작성) 및 심사 사유 일괄 적용 구현

    • 자체 검증:
      1. native-review.js 보기 필터(review-filter) 및 사유 일괄 적용(review-batch-reason) 신규 구현:
        • 계약심사 테이블 상단에 항목 필터 셀렉트(전체 항목, 변경 항목만, 사유 작성 항목, 사유 미작성 변경항목) 추가.
        • 대규모 내역서에서 수량/단가 변경이 발생한 항목이나 사유 작성이 누락된 변경 항목만 즉시 선별하여 검토할 수 있도록 개선.
        • 개별 행 선택 체크박스(reviewSelection) 및 일괄 사유 적용(data-review-batch-reason) 지원: 선택된 행들에 대해 공통 사유를 한 번에 입력·반영하며, 선택이 없는 경우 현재 화면에 표시된 필터링 대상 행 전부에 대해 일괄 반영.
        • 심사 입력 초기화(review-clear) 시 선택 세트도 함께 정리되도록 상태 무결성 보존.
        • 입력된 사유는 contractReview.edits[key].Reason으로 안전하게 저장되며, 실행 취소(Undo) 및 심사결과요약서(서식 171) 인쇄/엑셀 내보내기 연동 보존.
      2. 모델 및 계산 무결성 검증:
        • 기존 심사 수량/단가 계산기(EstReview.calculate)와 사본 열기(EstReview.copy) 로직은 변경 없이 100% 동일하게 유지.
      3. 700줄 제한 준수:
        • native-review.js 258줄로 700줄 이하 엄수.
    • 관련 테스트:
      • pytest resources/tester/test_est_review_workflow.py 8개 통과 (test_review_view_filtering_and_batch_reason_application 추가).
      • 전체 연계 회귀 시험 50개 전수 통과 (0 실패).
  • 자료 오류 검색(issues)의 원가계산서(Wonga) 산출식(VSusic) 참조 유효성 검사 및 실제 계산기(calculate) 의존성/값/오류 로직 단일화 구현

    • 자체 검증:
      1. native-wonga.js의 계산 엔진 로직 단일화(evaluateRows 공통화):
        • scan과 calculate가 별도의 파서/DFS/참조 로직을 갖지 않고, 동일한 evaluateRows 함수를 공유하여 전방 참조, 의존성 순서, 실제 재귀 계산, 범위(CalcIndex 2, 3 제외 행 필터링), 순환 참조 감지(active Set) 로직을 100% 동일하게 실행.
        • 저장된 Cost=0이어도 수식이 있는 선행 참조 행(예: B=A*2)의 실제 재귀 계산 결과를 평가에 사용하여, A=1/B와 같은 유효한 나눗셈이 오래된 0값으로 인해 0 나눗셈으로 오탐되는 결함 원천 해결.
        • 오류 발생 시(onError 콜백) scan은 해당 원인 행을 등록하고 기존 Cost로 대체하여 후속 행으로의 연쇄 전파를 방지.
      2. native-issues.js의 실제 프로젝트 기초금액(direct) 전달:
        • issues.scan(project) 호출 시 project.calculation.direct로부터 실제 NC, GC, JC, SC, TC, 노무비, 재료비, 경비, 실적, 직접공사비를 추출해 EstWonga.scan의 bases 인자로 전달하여 기초 비목 0 판정 및 오탐 방지.
      3. 700줄 제한 준수:
        • native-wonga.js 163줄, native-issues.js 274줄로 700줄 이하 엄수.
    • 관련 테스트:
      • pytest resources/tester/test_est_issues.py 9개 통과 (test_wonga_scan_parity_with_calculate_forward_refs_old_cost_bases_ranges_and_cycles 추가).
      • 전체 연계 회귀 시험 51개 전수 통과 (0 실패).
  • 자료 오류 검색(issues)의 단가산출(CostMainDat) 상세 행 연결 자료(자재·노임·기계 등) 부재 및 중복 검출 확장 구현

    • 자체 검증:
      1. native-issues.js의 scan() 테이블 검사 대상 확장:
        • 기존 검사 대상(EstMainDat, HeadMainDat, MachMainDat)에 CostMainDat를 추가하여, 단가산출 호표 상세 행에서 자재(LinkIndex: 5), 노임(LinkIndex: 6), 기계(LinkIndex: 105), 표준(LinkIndex: 21), 견적(LinkIndex: 101), 일위(LinkIndex: 103), 산근(LinkIndex: 104) 등 원천 자료를 참조하는 상세 행(Index === 0 && Code)에 대해 연결 자료 존재 여부(연결 자료 없음) 및 원천 코드 중복(연결 코드 중복)을 전수 검사하도록 개선.
        • 오류 항목 클릭 시 data-issue-table="CostMainDat"로 해당 호표(group) 및 상세 행으로 정확히 이동하고 선택 행을 하이라이트 표시하도록 연동 보존.
    • 관련 테스트:
      • pytest resources/tester/test_est_issues.py 5개 통과 (test_data_issues_detect_cost_main_dat_missing_and_duplicate_links 추가).
      • 전체 연계 회귀 시험 76개 전수 통과 (0 실패).
  • ESTX 내보내기 시 웹 전용 작업 데이터(예정공정표 schedule, 추가 서식 문서 documents) 누락 방지 및 기본 빈 상태 대조 차단 구현

    • 자체 검증:
      1. export-estx.cjs 및 import-estx.cjs 검토 및 수정:
        • import-estx.cjs에서 원본 ESTX 로드 시 기본 빈 공정표(schedule: [])를 명시적으로 초기화.
        • export-estx.cjs에서 원본 가져오기 기본 상태(schedule: [])와 대조하여, 유효 필드 유무와 무관하게 project.schedule?.length > 0 (빈 문자열·0값만 가진 행, 임의 필드 행 포함) 존재 시 공정 데이터 누락 방지를 위해 JSON 저장 안내와 함께 차단(웹 예정공정표는 ESTX에 저장할 수 없습니다. JSON 저장을 사용하세요.).
        • project.documents의 공백 문자열(" ") 역시 사용자가 입력한 내용으로 취급하여 text.length > 0 검사로 누락 없이 JSON 저장 안내와 함께 차단(웹 추가 서식 문서는 ESTX에 저장할 수 없습니다. JSON 저장을 사용하세요.).
        • 원본 ESTX에서 불러온 기본 빈 상태(빈 schedule [], 빈 documents {} 또는 미입력)에서는 정상적으로 ESTX 바이너리 패치가 통과되어 기존 기능 유지.
    • 관련 테스트:
      • pytest resources/tester/test_est_attachments.py 6개 통과 (일반 행, 빈 문자열/0값 행, 임의 필드 행, documents 공백 문자열 저장 차단 단위 검증).
      • pytest resources/tester/test_est_native_export.py 15개 통과 (test_estx_export_schedule_and_documents_safety_guards 실제 파일 기반 정상 패치 및 빈 행/0값/공백 문서 차단 실측 검증).
      • 전체 연계 회귀 시험 92개 통과 (0 실패).
  • 예정공정표(schedule) 공정 항목 상/하 순서 이동(schedule-move) 및 전체 비우기(schedule-clear) 조작 구현

    • 자체 검증:
      1. native-schedule.js에 공정 행 상/하 이동(moveRow) 및 전체 비우기(clearSchedule) 구현:
        • 연속된 공정 항목 배열(project.schedule)에 대해 인접 행과 위치를 맞교환하는 moveRow(project, index, direction) 지원.
        • 상단 경계(index === 0, direction === -1) 및 하단 경계(index === length - 1, direction === 1) 도달 시 비활성화(disabled) 및 배열 범위 침범 방지.
        • 공정표 상단 툴바에 공정 전체 비우기(data-action="schedule-clear") 버튼을 추가하고 확인 대화상자(confirm) 후 안전하게 초기화 지원(목록이 비어있으면 disabled).
        • 모든 조작은 EstApp.change(..., false)를 통해 수행되어 실행 취소(Undo)로 변경 전 공정 순서 및 데이터 완전 복원 가능.
      2. 모델 검증 및 계산 무결성:
        • 이동 후에도 EstSchedule.calculate(project)를 통해 left, width, weight, 가중평균 progress, 전체 시작일/종료일이 정상 재계산됨을 확인.
        • Excel 내보내기/불러오기(EstExchange) 및 JSON 작업본 저장 시 순서 유지 확인.
    • 관련 테스트:
      • pytest resources/tester/test_est_documents.py 14개 통과 (test_schedule_move_row_and_clear_operations 추가).
      • 전체 연계 회귀 시험 85개 전수 통과 (0 실패).
  • 동원인원·자재·장비 집계(resources) 화면 비목별(노임·자재·기계·표준·견적) 필터링 및 공종별 전개 조회 구현

    • 자체 검증:
      1. native-extra.js의 view === "resources" 렌더링 확장:
        • 전체 집계뿐만 아니라 비목 구분(노임 kind: 6, 자재 kind: 5, 기계 kind: 105, 표준 kind: 21, 견적 kind: 101, 전체 all) 필터 셀렉트(id="resource-kind-filter") 추가.
        • 내역 공종별 세부 소요 전개 체크박스(id="resource-by-work")를 추가하여, 체크 시 EstResources.calculate(project, true)를 호출해 공종코드(WorkCode) 및 공종명(WorkName) 열을 포함한 세부 전개 테이블 표시.
        • 필터링 결과 건수 표시((총 N건)) 및 오류 메시지 보존.
      2. native-business-actions.js 이벤트 연동:
        • resource-kind-filter change 시 state.resourceKind를 갱신하고 EstApp.render() 호출.
        • resource-by-work change 시 state.resourceByWork를 갱신하고 EstApp.render() 호출.
      3. 원천 서식(print-catalog.json) 및 EstForms.data 일치 확인:
        • 112(동원인원 공종별), 113(소요자재 공종별), 114(동원장비 공종별), 163(동원실적 공종별), 164(동원견적 공종별) 서식과 13(동원인원), 110(소요자재), 111(동원장비), 161(동원실적), 162(동원견적) 총괄 서식 간의 데이터 일관성 및 금액/수량 무결성 보존.
    • 관련 테스트:
      • pytest resources/tester/test_est_documents.py 13개 통과 (test_resource_view_filtering_and_by_work_expansion 추가 검증).
      • 전체 회귀 시험 69개 전수 통과 (0 실패).
  • 기계경비(MachMainDat ↔ MachTitleDat) 당초 계약 단가 비교·설계변경 조회 및 데이터 보호(적용 미지원) 구현

    • 자체 검증:
      1. native-machine.js 검토 및 수정:
        • REA f18804 기계경비 계산 엔진(EstMachine.calculate)과 MachTitleDat를 대조한 결과, 기계경비 호표 단가는 MachMainDat의 상세 산출 공식에 의해 결정되며, MachTitleDat의 TC_/NC_/GC_/JC_는 설계변경 비교를 위한 당초 계약값임.
        • 당초 계약값은 현재 기준단가의 근거가 아니므로, 현재 단가를 과거 계약값으로 덮어쓰는 파괴적인 개별/일괄 적용 UI를 비활성화(canApply: false, 적용 버튼 미노출).
        • 코드 호출 시에도 안전하게 예외를 발생(기계경비 호표는 MachMainDat 산출 결과이며 당초 계약값으로의 덮어쓰기 적용은 지원하지 않습니다.)시켜 사용자 데이터 오염 및 자동 재계산 충돌을 원천 차단.
        • 신규 항목(TC_ === null)에 대해 0으로 왜곡하지 않고 originalPrice: null, difference: null, status: "신규(당초없음)"으로 안전하게 분기 표시.
        • 화면 안내 문구에 기계 호표 단가는 MachMainDat 산출 공식에 의해 결정되며 당초값 덮어쓰기는 지원하지 않음을 명시.
      2. UI 및 서식 연동:
        • index.html, native-app.js, native-extra.js, native-report.js, native-model.js, native-forms.js 연동을 통해 사용 내역(machine-usage) 및 설계변경(machine-change)의 안전한 조회·인쇄 서식 지원.
    • 관련 테스트:
      • pytest resources/tester/test_est_basic_prices.py 5개 통과 (기계경비 당초/현재 비교, 신규 항목 TC_ null 안전 처리, 파괴적 apply 차단 및 데이터 불변 보존, Edge 브라우저 화면 조회 실측 검증).
      • 전체 연계 회귀 시험 56개 전수 통과 (0 실패).
  • 호표(일위대가·단가산출·기계경비) 상세 행 이동(move-estimate-up, move-estimate-down) 및 단가산출 다중 -20 구간·참조 수치 무결성 보존 구현

    • 자체 검증:
      1. native-business.js에 moveGroupDetailRows(rows, groupCode, selection, direction, table) 구현 및 산출근거 다중 구간/참조 수치 무결성 검증 보완:
        • 일위대가(HeadMainDat), 단가산출(CostMainDat), 기계경비(MachMainDat)의 호표 상세 행에 대해 연속 선택 행의 상/하 이동 지원.
        • 호표 제목 행(Index > 0) 이동 차단 및 제목 행 건너뛰기 방지.
        • 선택 행이 해당 호표 범위를 벗어나거나 인접 호표의 영역을 침범하지 않도록 상/하 경계 보호(경계 도달 시 이동 없이 원래 인덱스 보존).
        • 합계/소계/구간비율 행(LinkIndex 54, 55, 58, 59, 61, 62) 및 합계 수식표지(\x1a) 포함 행의 이동 및 건너뛸 수 없도록 안전 차단.
        • 다중 소계 구간 시작 표지(Index === -20)의 개별 보존 및 다중 선택 경계 보호: 이동에 참여한 국소 교환 위치 사이에서만 -20 표지를 정확히 교환하여, 호표 내 다른 소계 구간의 -20 표지(예: D0000000005의 다중 소계 구간)가 0으로 초기화되거나 왜곡되지 않고 완전히 유지되도록 수정. 선택 범위 내에 복수 -20이 포함되거나 범위 중간에 -20이 끼어 있어 단일 경계 스왑으로 보장할 수 없는 경우는 보수적으로 이동 차단.
        • 고유 식별자(rowKey) 매칭 및 앞줄 참조(\x0c) 수식/수치 불변 사전 검증(validateCostOrderIntegrity): PkID 유무와 관계없이 rowKey(row, index)를 통해 전수 매칭하여, PkID 누락 행에서도 정확한 전/후 대조 보장. 호표 최종 금액(rows[0].TC)뿐 아니라 각 소계(LinkIndex === 61)·비율(LinkIndex === 58) 행의 최종 금액, 그리고 앞줄 참조(\x0c)를 사용하는 모든 행의 LineData 수식 문자열이 완전히 동일하게 보존되는지 검증. 앞줄 참조(\x0c) 행이 포함된 복수 행 동시 이동은 안전한 구분을 위해 단일 행 이동으로 제한하고 차단.
        • 동일 결과값 선행 행 교환 시 뒤따르는 직전 결과 참조 대상 왜곡 방지 및 일반 행/변수 재정의 보수적 차단: 뒤따르는 행이 특정 선행 결과를 직전 참조(\x0c)하는 구간에서, 동일 비목과 동일 결과값을 가진 선행 후보 행들이 2개 이상 존재할 때 이들 간의 순서 교환은 참조 대상이 왜곡되므로 보수적으로 이동 차단(직전 결과를 참조하는 행이 뒤따라 참조 대상 구분이 불명확하므로 이동할 수 없습니다.). LinkIndex 58뿐 아니라 일반 행(LinkIndex !== 61)의 \x0c 앞줄 참조 역시 선행 후보 행이 2개 이상일 때의 순서 교환을 보수적으로 차단. 동일 변수명 중복 할당(변수 재정의) 구간에 포함된 행들의 교환 시 전역 변수 사전 순서 의존성 왜곡을 방지하기 위해 이동 차단(동일 변수(...)를 재정의하는 구간에서는 참조 대상 보존을 위해 이동할 수 없습니다.).
      2. native-business-actions.js 및 native-views.js 연동:
        • 툴바의 행 이동 버튼(move-estimate-up, move-estimate-down)이 내역서(EstMainDat)뿐 아니라 호표 화면(HeadMainDat, CostMainDat, MachMainDat)에서도 활성화되도록 노출.
        • 호표 화면 조작 시 moveGroupDetailRows를 호출하고 EstApp.change()를 통해 작업본 반영 및 실행 취소(Undo/Redo) 지원.
    • 관련 테스트:
      1. pytest resources/tester/test_est_change_workflow.py 13개 전수 통과:
        • 일위대가 상세 행 이동 및 Edge 실측 시험.
        • 단가산출(CostMainDat)의 실제 사례(D0000000004 인부소계 구간)에서 상세 행 이동 후 소계(14,373.6) 및 호표 총액(16,421) 완벽 보존 검증.
        • 다중 -20 구간을 가진 실제 사례(D0000000005)에서 상세 행 이동 후에도 -20 표지 2개 및 1차 소계(1,383.4), 2차 소계(1,407.8)가 모두 보존됨을 검증.
        • A/B 동일값 선행 행 교환 시 직전 결과 참조 대상 왜곡 재현 및 보수적 차단 검증.
        • LinkIndex 58 이외 일반 행의 \x0c 앞줄 참조 모호성 차단 검증.
        • 동일 변수(W) 재정의 구간 행 교환 보수적 차단 검증.
        • 소계 행(LinkIndex 61), 비율 행(LinkIndex 58), 변수 산식 행(D0000000000의 Q식), 소계 수치가 왜곡되는 구간 침범 이동, 범위 중간에 -20이 포함된 이동, 앞줄 참조 복수 행 이동의 안전 차단 검증.
        • Edge 브라우저에서 단가산출 상세 행 이동, 소계 보존 및 실행 취소(Undo) 원복 실측 검증.
      2. 원본 ESTX 무결성 보호 시험 14개 통과 (pytest resources/tester/test_est_native_export.py).
      3. 핵심 비즈니스 및 가격 회귀 시험 28개 통과 (test_est_basic_prices.py, test_est_standard.py, test_est_estimate.py, test_est_business.py).
      4. 주 수량 회귀 시험 12개 통과 (test_est_quantity_workflow.py).
  • 자재단가(StuffcDat) 및 노임단가(LaborcDat) 사용 내역 화면과 기초단가 개별/일괄 적용 구현

    • 자체 검증: ative-basic-prices.js를 신규 구현하여 자재단가(LinkIndex === 5) 및 노임단가(LinkIndex === 6)를 원천(StuffcDat, LaborcDat)과 비교하는 사용 내역(material-usage, labor-usage) 및 설계변경(material-change, labor-change) 화면 제공.
      1. 자재는 GU, 노임은 NU 비목으로 원천 기초단가 반영 및 SCheck > 0 재분류 비목 보존.
      2. 수동계산(AutoCalc = false) 시 원천 단가·비목은 변경하되 해당 행의 기존 금액(GC, NC, TC)을 강제 계산하지 않고 보존하며, AutoCalc=true 전환/재계산 시 수량(GN)을 반영해 전체 전파되도록 규칙 일치.
      3. 화면 네비게이션, 인쇄 서식, 모델 검증 등록 및 EstApp.change() 연동 Undo/Redo 지원.
    • 관련 테스트: pytest resources/tester/test_est_basic_prices.py 4개 통과(단위 시험 및 Edge 브라우저 자재/노임 단가 적용, Undo 원복 검증).
  • 견적단가 사용 내역 화면(estimate-usage) 및 기초단가(EstiMateDat) 개별/일괄 적용 구현

    • 자체 검증: ative-estimate.js를 신규 작성하여 견적단가 원천(EstiMateDat, LinkIndex === 101)과 내역 행 간 단가 비교(usage), 차이 검출, 개별 적용(pplyRowPrice), 일괄 적용(pplyAllPrices) 구현.
      1. 원천 비목 보존: 원천 비목 분할(InputGC, InputNC, InputJC) 유지 및 SCheck > 0 재분류 비목 보존.
      2. 수동계산(AutoCalc = false) 시 원천 단가·비목은 변경하되 해당 행의 기존 금액을 보존하고, AutoCalc=true 전환/재계산 시 수량(GN)을 반영해 갱신되도록 수동계산 규칙 일치.
      3. 화면 네비게이션, 인쇄 서식(estimate-usage, estimate-change), 모델 검증 등록 및 EstApp.change() 연동 Undo/Redo 지원.
    • 관련 테스트: pytest resources/tester/test_est_estimate.py 4개 통과(단위 시험 및 Edge 브라우저 개별/일괄 적용, Undo 원복 검증).
  • 표준시장단가 사용 내역 화면에서 개별 및 일괄 기초단가 내역 적용·실행 취소 구현

    • 자체 검증: ative-standard.js에 표준시장단가 원천(SilJukDat)과 내역 행(EstMainDat, LinkIndex === 21) 간 단가 차이가 있는 항목을 선별(canApply)하고, 개별 행 단위 적용(pplyRowPrice, data-standard-apply-row) 및 전체 차이 항목 일괄 적용(pplyAllPrices, data-standard-apply-all) 기능을 구현.
      1. 적용 시 원천 자료의 고유성 검증: 원천 코드가 없거나 중복된 경우 임의 적용을 차단하고 예외 메시지 출력.
      2. 원천 비목 보존 및 계산 규칙 일치:
        • 원천(SilJukDat)이 재료/노무/경비/실적 비목 분할(InputGC, InputNC, InputJC, InputSC)을 제공할 경우 이를 그대로 단가 비목(GU, NU, JU, SU)으로 반영.
        • 사용자가 설정한 비목 재분류(SCheck > 0: 재료/노무/경비 몰아주기)가 있을 경우 이를 임의로 해제하지 않고 해당 대상 비목으로 기초 단가 총액을 보존.
        • 수동계산(AutoCalc = false) 상태에서는 기존 내역 편집 및 est_estimate_classification_refreshes_only_selected_source_and_preserves_manual_mode 규칙과 일치하도록, 원천 단가 및 비목 분할은 반영하되 해당 행의 기존 금액(GC, NC, JC, SC, TC)을 강제 계산하지 않고 보존. 이후 AutoCalc=true로 전환하거나 재계산을 실행할 때 수량(GN)을 반영한 정식 금액으로 전파.
      3. 화면 상단 툴바에 적용 대상 건수(기초단가 일괄 적용 (N건))를 표시하고 대상이 없으면 비활성화(disabled).
      4. 작업본 반영은 EstApp.change()를 통해 이루어지므로 실행 취소(Undo)로 변경 전 단가 및 금액을 단계별로 완전 복원 가능.
    • 관련 테스트: pytest resources/tester/test_est_standard.py 5개 통과(수동계산 AutoCalc=false 보존 및 재계산 전환, 단위 시험 및 Edge 브라우저 개별/일괄 적용, Undo 원복, 비목 분할 보존, SCheck 보존 등), 연계 회귀 39개 통과.
  • 수량산출 항목 단위(Unite) 편집 및 Title 테이블 메모 필드 보존을 통한 ESTX 저장·재열기

    • 자체 검증: native-quantity.cjs 수량산출 화면에 단위(Unite) 편집 열 추가 및 export-quantity.cjs의 withoutLabels에 Unite 라벨 변경 차단 방지 반영. native-engine.js의 saveTitles()에서 CostTitleDat·HeadTitleDat·MachTitleDat의 식별자(PkID, Index, RecNo, Flag)뿐만 아니라 BLOB/메모 필드(DifineMemo, SpaceMemo, EscData)를 원본 Title 행 기준으로 보존(기존 Title에 없을 시 Main 값이 오염 생성되지 않도록 필터링).
    • 브라우저 검증: 임시 서버(127.0.0.1:5186)와 Edge에서 설치 main.estx를 열어 수량 항목 단위를 m2로 변경 후 ESTX 내보내기/다운로드, 브라우저 재열기 및 다른 수량 항목 보존·실행 취소 확인. (대용량 프로젝트 약 164MB에 따른 브라우저 임시 저장 용량 부족 경고 확인).
    • 관련 테스트: pytest resources/tester/test_est_quantity_workflow.py 12개 통과, 기존 test_est_native_export.py 14개는 수정 전 기반 통과 상태이며 이번 Title 보존 전용 시험(test_recalculation_and_native_export_keep_original_title_identities_when_sample_exists) 1개 통과(58.08s, 인덱스 .idx 동일성 및 단위 m2 보존).
    • 남은 제한: 원본 EST와의 실행 동등성은 미확인.
  • 수량산출서 항목 추가·삭제 및 내역 연결·JSON 저장/재열기 지원

    • 자체 검증: native-quantity.cjs의 수량산출 화면에 수량 항목 추가(data-quantity-add-item) 및 각 수량 항목 행에 삭제(data-quantity-delete-item) 버튼을 구현.
      1. 항목 추가 시 기존 항목 코드(r000000, r000001 ...)와 중복되지 않는 새 고유 코드 자동 생성(r######), 품명/규격/단위/수량 초기화 및 EstApp.change() 등록.
      2. 항목 삭제 시 안전성 보장: 산출 행의 산출근거(LineData) 결과 표지(\x12...\x12) 및 row.markers에서 참조 중인 항목은 산출 행 결과 표지 수와 마커 수 불일치로 인한 계산 오류를 방지하기 위해 임의 삭제를 차단하고 사전 안내 메시지 출력. 미참조 항목에 대해서만 확인(confirm)을 거쳐 안전하게 삭제.
      3. 품명·규격·단위 및 연결 내역 대상 지정(TargetKey / TargetCode) 후 JSON 작업본 저장 및 재열기 지원.
      4. ESTX 바이너리로 표현 불가능한 임의 행 구조 변경(신규 산출서/항목 증감)에 대해서는 기존 ESTX 저장 시의 불변 무결성 보호를 유지하고 JSON 보관 안내.
    • 관련 테스트: pytest resources/tester/test_est_quantity_workflow.py 12개 통과 (신규 항목 추가, 참조 중인 항목 삭제 차단 안내 및 미참조 항목 안전 삭제 단위 시험 반영).
  • 자료 오류 검색의 수량산출 항목 내역 대상 연결 검사, 해당 산출서 이동 및 검색 화면 내역 연결 지정

    • 자체 검증: native-issues.js의 scan() 함수를 실제 수량 적용(totals()) 규칙과 정확히 일치하도록 개편:
      1. TargetKey 우선 매칭(id:${row.PkID}): 두 행의 코드가 동일해도 TargetKey로 고유하게 연결된 경우 정상 판정하여 오탐 방지. 잘못된 키는 수량 대상 내역 없음으로 탐지.
      2. TargetKey가 없을 시 TargetCode ?? LinkCode 대체값으로 매칭하며, Level > 0인 공종/비고 행 제외 규칙 일치.
      3. 수량산출서(quantitySheets) 및 수식표 직접 작성(quantities) 항목 모두 검사하며 미연결/대상 부재 항목을 unlinked로 추출.
      4. 오류 검색 화면에서 수량산출 오류 항목에 대해 산출서 열기 버튼을 제공하여, 클릭 시 quantity 뷰 및 해당 quantitySheet 코드로 즉시 전환·선택되도록 구현.
      5. 자료 오류 검색 화면에서 미연결 또는 대상 부재인 수량 항목에 대해 바로 내역 행을 선택할 수 있는 드롭다운(data-issue-target-select)을 제공하여, 오류 검색 화면을 벗어나지 않고도 TargetKey(id:${row.PkID}) 및 TargetCode를 즉시 지정하고 EstApp.change()를 통해 JSON 작업본에 즉시 반영 및 실행 취소 가능하도록 구현.
      6. native-links.cjs의 existingTargets()에서 고유한 PkID가 존재할 때만 TargetKey(id:${row.PkID})로 안전하게 연결하고, PkID가 없는 동일 코드 행 간의 모호한 연결은 기존대로 미연결 유지 및 경고 처리 보존.
    • 관련 테스트: pytest resources/tester/test_est_native_export.py::test_existing_quantity_links_respect_native_mode_and_avoid_ambiguous_targets resources/tester/test_est_issues.py 5개 통과, test_est_quantity_workflow.py 12개 통과. Edge 브라우저 '산출서 열기' 클릭 시 수량산출서 전환 이동 및 오류 화면 내역 연결 드롭다운 선택 시 작업본(TargetKey) 즉시 연결 실측 확인.
  • 테일스케일 전용 독립 서버 감시 프로세스(watch-server.cjs) 및 대용량 IndexedDB 캐시 복원

    • 자체 검증: server.cjs의 외부 바인딩을 EST_TEST_HOST=100.65.141.15:5175로 한정(127.0.0.1 접속 시 ECONNREFUSED 차단 확인). Node 내장 --watch 기반 감시 프로세스(watch-server.cjs)를 구현해 data/ 및 로그를 제외한 .js·.cjs 소스 변경 시에만 자동 재기동되도록 구성(파일 touch 시 자동 재기동 및 헬스 200 확인). server.cjs를 require하는 테스트 실행 시 watcher hang 없음 확인(test_est_quantity_workflow.py 12개 2.69s 통과).
    • 대용량 임시 저장 보완: native-app.js에서 sessionStorage(약 5~10MB) 용량 초과 시 IndexedDB(est-independent-cache)로 자동 대체 저장·복원하도록 개선하여, 대용량(main.estx 약 157MB JSON) 작업 시 새로고침 유실 문제를 해결함. IndexedDB 트랜잭션 waitForTx(tx) 대기 및 순차 직렬화 큐(cacheQueue)를 적용해 연속 입력 시 덮어쓰기 레이스 컨디션을 방지하고, 탭별 고유 인스턴스 ID(sessionStorage의 est-tab-instance-id) 및 Chromium 탭 복제 시 window.name 리셋 감지를 적용해 복제 탭(Duplicate tab) 분리 격리 및 부모 작업본 초기 상속을 구현함. 실제 headless Edge 기반 Playwright 회귀(resources/tester/test_est_browser_cache.py)로 소형 데이터 격리, 대용량 main.estx(22MB 바이너리, 157MB JSON) 업로드 후 이름 수정→IndexedDB 저장→새로고침 복원(76개 전체 내역행 유지), 캐시 실패 안내 메시지 검증 및 탭 복제(Duplicate Tab) 상속·독립 격리 시험 통과(3 passed in 13.04s).
    • 백그라운드 상태 감시 및 자동 알림: tools/est-test/monitor.cjs를 통해 15초 주기로 orca.exe CLI(shell: false, timeout 4~5s)를 호출하여 CODEX 워크트리의 안티그래비티 작업 상태와 EST 5175 서버 헬스를 조회하고, 상태 변경 시에만 monitor.log에 기록(최대 512KB 순환). 안티그래비티 완료/대기 전이 시 Codex Orchestration Run(run_cdb1558b9280)으로 단발성 자동 알림(status/messageId=msg_2c7bca748f91)이 실제 전달됨을 확인(중복 폭주 방지 플래그 적용, 민감 환경변수 미기록, 재시작/자동지시 없음).

Codex · EST 독립 테스트 앱 (2026-11-04)

  • 수량산출 항목을 대용량 내역에 반영할 때 반복 검색을 줄이고 기존 연결·중복 오류 판정을 유지한다.

    • 자체 검증: 5,000개 항목과 내역 연결 및 중복 식별자 거부 확인. 수량 기능 시험 13개 통과.
  • 수량산출 화면에서 내역 선택 목록을 필요할 때 생성하여 대용량 화면의 과도한 옵션 생성을 줄인다.

    • 자체 검증: 수량 시험 14개 통과. 실제 앱의 Edge 화면에서 기존 연결 표시, 포커스 시 목록 생성 및 다른 내역 선택 반영을 확인했다. 1,000개 선택 항목은 최초 옵션 2,000개만 생성하고 선택 시 해당 목록을 연다.
  • 여러 수량산출서를 한꺼번에 반영할 때 내역 검색 자료를 공유하고 합계와 오류 처리를 유지한다.

    • 자체 검증: 여러 수량산출서 합산, 오류 시 변경 방지 등 수량 시험 14개 통과.
  • 기성 내역 화면을 페이지로 나누어 대용량 자료도 조작하고 전체 계산·출력을 유지한다.

    • 자체 검증: 기성 시험 12개 통과. 실제 Edge 화면에서 205행 중 100행씩 표시, 다음 쪽 101번 행 입력 및 전체 계산 결과 205행 유지를 확인했다.
  • 물가변동 내역 화면을 페이지로 나누고 행별 입력과 전체 계산을 유지한다.

    • 자체 검증: 물가·페이지 시험 9개 통과. 실제 Edge 화면에서 205행 중 다음 쪽 101번 행 입력과 전체 계산 결과 보존을 확인했다.
  • 설계변경 비교 화면을 페이지로 나누고 신규·삭제·변경 내역과 원가 비교를 유지한다.

    • 자체 검증: 설계변경·페이지 시험 18개 통과. 실제 Edge 화면에서 205행 비교와 다음 쪽 표시를 확인했다.
  • 새 작업을 열면 업무 화면의 페이지 위치를 첫 페이지로 초기화한다.

    • 자체 검증: 실제 Edge에서 새 작업을 연 뒤 기성·물가변동·설계변경 페이지가 모두 첫 페이지로 돌아가는 것을 확인했다.
  • 업무 화면에서 코드·품명 검색과 기성·물가변동의 규격·단위 검색을 지원하고 검색할 때 첫 페이지부터 표시한다.

    • 자체 검증: 업무별 검색과 원래 행 인덱스 유지, 검색어 변경 시 첫 페이지 및 전체 계산 유지 확인. 관련 시험 37개 통과, 실제 Edge 기성 화면에서 검색 및 입력 행 확인.
  • 물가변동에서 중복 코드 행의 순서가 바뀌어도 식별 가능한 행은 당초 단가와 정확히 연결한다.

    • 자체 검증: 중복 코드의 행을 뒤바꾸고 JSON 저장·재열기 후 당초 단가, 적용 수량 및 제외금액 확인. 물가·업무 시험 27개 통과. 품명·규격·단위까지 중복된 행은 기존 순서 대응을 유지한다.
  • 설계변경 비교에서도 중복 코드 행의 재정렬을 식별해 당초 행과 연결한다.

    • 자체 검증: 설계변경·물가변동 시험 24개 통과. 실제 Edge 앱에서 같은 코드의 행 순서 변경 후 각 당초 수량과 계약 단가를 확인했다. 품명·규격·단위가 모두 같은 경우는 기존 순서 대응을 유지한다.
  • 실행 중 새로 추가한 소스 파일도 감시하여 서버에 자동 반영하고 작업 데이터 저장에는 재시작하지 않는다.

    • 자체 검증: 별도 임시 서버에서 신규 파일 생성·수정에 따른 재시작과 데이터 하위 폴더 변경 무시 확인. 실제 테스트 서버에서 신규 소스 변경 시 프로세스 갱신 및 HTTP 200 확인.
  • 중복 코드 행의 추가·삭제가 있어도 구별 가능한 행을 당초 자료와 연결한다.

    • 자체 검증: 중복 코드의 일부 삭제와 신규 행 추가 후 당초 수량과 신규·삭제 분류를 확인했다. 설계변경·물가 시험 25개 통과. 식별 정보까지 같은 행은 기존 순서 기준이다.
  • 설계변경 원가 비교에서 중복 비목 코드의 순서 변경과 추가·삭제를 구별한다.

    • 자체 검증: 중복 코드 원가의 재정렬·신규·삭제에 따른 당초·변경 금액을 검증했다. 설계변경·물가 시험 26개 통과.
  • 당초 확정 시 기계경비 호표 구성을 보관하고 선택한 호표를 복원한다. 기존 당초 자료와 현재 기초단가 사용 방식은 보존한다.

    • 자체 검증: JSON 저장·재열기, 다른 호표와 당초 사본 보존, 구버전 당초 및 중복 코드 거부 확인. 실제 Edge 화면에서 호표 복원과 실행 취소, 자동계산 300→200 및 서버 재계산 결과 보존을 확인했고 기초단가·설계변경·행 조작 시험 39개 통과. 당초 단가 자체가 아니라 산식을 복원하며, 자동계산 시 현재 기초단가를 사용한다.
  • 기계경비 설계변경에서 당초 대비 신규·변경·삭제 항목을 표시한다.

    • 자체 검증: 기계경비 신규·변경·삭제 금액 및 상태 시험 포함 기초단가 시험 7개 통과. 실제 Edge에서 신규·삭제 행 표시와 삭제된 호표 열기 버튼 미표시 확인.
  • 삭제한 기계경비 호표를 당초 구성에서 되살리고 기존 호표의 식별자를 보존한다.

    • 자체 검증: 원래 순서와 식별자 보존, 충돌 거부, JSON 재열기 후 연결 내역 재계산 및 실제 Edge에서 삭제 복원·실행 취소 확인. 기계경비 관련 시험 5개 통과.
    • 추가 회귀: 기초단가·설계변경·물가변동·기성·수량·서버 감시 시험 65개 통과.
    • 구버전 당초 사본에 기계 호표가 없는 경우 현재 호표와 기존 당초 필드를 보존하며, 초기화 확인창에 사본에 없는 자료가 유지됨을 표시한다. 기계 당초·행 조작 시험 16개 통과.
    • 기계 호표 당초 사본에는 기존 _ 필드도 보관하며 설계변경 초기화 시 원래 값을 유지한다. 기계 당초·기초단가 시험 10개 통과.
  • 기성 회차 초기화가 선택한 회차만 변경하도록 보호하고 오류 시 입력 보존을 확인한다.

    • 자체 검증: 존재하지 않는 회차를 선택했을 때 첫 회차를 초기화하지 않고 오류를 표시하며 기존 입력이 보존되는 회귀 시험 통과 (test_reset_progress_inputs_action, 1 passed).
  • 설계변경 초기화 시 수량 연결 대상을 실제 수량 반영 규칙과 동일하게 검사한다.

    • 자체 검증: 유효하지 않은 TargetKey가 같은 코드로 잘못 대체되는 경우와 중복 코드 연결을 차단한다 (test_reset_change_action, 통과).
  • 확정된 전회 기성 결과가 없을 때 금회 누계를 잘못 확정하지 않도록 보호한다.

    • 자체 검증: 전회 결과가 없는 확정 회차 다음 계산에 오류를 표시하고 확정을 거부한다. 기성·행 조작 시험 24개 통과.
    • 추가 회귀: 설계변경·기성·물가변동·연차 관련 시험 79개 통과(기성·수량·행 조작 35개, 업무·설계변경·물가변동·연차 44개).
  • 전회 기성 원가 결과가 누락된 경우 전회 원가 누계가 0원으로 바뀌지 않도록 보호한다.

    • 자체 검증: 이전 회차의 원가 결과가 없을 때 계산 오류를 표시하고 확정을 거부한다. 기성 시험 11개 통과.
  • 원가 초기화 계산 실패 시 수식·금액·고정 옵션을 보존한다.

    • 자체 검증: 순환 원가 수식에서 초기화가 실패해도 작업본과 고정 옵션이 변하지 않으며 정상 초기화도 통과한다 (test_reset_wonga, 2 passed).
  • 자재 부가세 계산의 절상 선택이 단단위 미만 금액을 올바르게 올리는지 확인한다.

    • 자체 검증: 십원 미만 나머지가 작은 값과 정확한 십원 경계의 절상을 확인했다 (test_vat, 2 passed).
  • 일위대가 상세 비목 지정 변경을 해당 행에만 반영 → 자동·수동 계산, 원천 불일치·다른 호표 보존 시험.

    • 자체 검증: 관련 시험 33개 통과. Tailscale HTTP Edge에서 자동·수동 계산, 다른 호표 보존, 원천 단가 불일치 시 복원 차단 및 화면 오류 0 확인.
  • 원천 재조회가 꺼진 내역의 비목 지정 변경을 해당 행에만 반영 → 자동·수동 계산, 미연결·다른 행 보존 시험.

    • 자체 검증: 현재 단가를 유지한 비목 지정·일치하는 원천으로 복원, 다른 행·재조회 옵션 보존. 원천 누락·중복·단가 불일치는 복원 차단. Edge에서 자동·수동 계산 확인, 관련 시험 32개 통과.
  • 산출근거 문구 일괄 바꾸기 → 현재 호표·전체 범위, 표지 보존·재계산·실행 취소 확인.

    • 자체 검증: Tailscale HTTP Edge에서 현재 호표·전체 치환, 일치 없음 안내, 결과·단가 표지 보존과 실행 취소 확인. 산출근거 시험 24개 통과, 수식 변경 후 재계산 확인.
  • Excel 파일 읽는 동안 파일·셀 선택이 바뀌면 이전 요청 반영 차단 → 지연 응답 시험.

    • 자체 검증: 지연된 Tailscale HTTP 응답 동안 셀과 파일을 각각 변경하면 이전 요청 반영이 차단되고 다시 실행은 성공. 수량 시험 12개 통과.
  • 자체 검증: 수량·Excel·설계변경·기성·물가변동·연차·문서·오류 기능 회귀 69개 통과(openpyxl 경고 8건). 원본 동등성 대조는 실행하지 않음.

  • 계산 불일치 수량산출서의 계산값을 바꾸지 않는 문구 수정 저장 → 원본 수량·표지 보존과 수량 변경 차단 확인.

    • 자체 검증: main.estx N0000000083 문구를 수정해 저장·재열기한 뒤 원래 수량 286과 다른 행 보존. 산식 계산값·결과 표지 변경 차단, 기존 산식 저장 시험 통과.
  • 삭제된 Excel 연결 대상의 행 식별자 재사용 방지 → 새 행·붙여넣기·Excel 가져오기 오연결 차단.

    • 자체 검증: 삭제된 2번을 예약해 Edge 추가·붙여넣기가 3·4번을 사용. Excel 가져오기 오연결 차단·연결 제거 후 적용 확인. 관련 시험 35개 통과, openpyxl 경고 8건.
  • Excel 수량 연결을 전체 자료 Excel에 포함 → 재가져오기와 잘못된 내역 연결의 전체 적용 차단 확인.

    • 자체 검증: Tailscale HTTP Edge에서 실제 Excel 내보내기·재가져오기와 잘못된 내역 연결 전체 차단 확인. 수량·Excel 시험 25개 통과, openpyxl 경고 8건.
  • Excel 셀과 내역 행 연결을 JSON에 보관하고 다시 선택한 파일로 일괄 갱신 → 중복·누락·오류 시 전체 변경 차단.

    • 자체 검증: Tailscale HTTP Edge에서 2행 연결·JSON 재열기·일괄 갱신·실행 취소·연결 해제 확인. 한 셀 오류 시 두 행 모두 유지, ESTX 저장에서 연결 누락 차단. 수량·첨부·독립 서버 시험 25개 통과.
  • Excel 숫자 셀을 선택한 내역 행의 수량으로 반영 → 파일·시트·셀 오류 차단, 계산·저장·취소 확인.

    • 자체 검증: Tailscale HTTP Edge에서 실제 xlsx B2=6.25 반영·금액 625·취소·JSON 저장, 문자·미계산 수식·누락·범위 오류 차단 확인. 수량·Excel 시험 23개 통과, openpyxl 경고 7건. 자동 파일 감시는 없음.
  • Tailscale HTTP에서 수량산출서와 산출 행 생성 → 생성·JSON 저장·복원 확인.

    • 자체 검증: Tailscale HTTP Edge에서 산출서·행 생성, JSON 저장·재열기 확인. 수량·독립 서버 시험 19개 통과.
  • 기존 계산 불일치 수량산출서도 품명·규격만 바꿀 때 원본 수량 유지 → 실자료 재열기 확인.

    • 자체 검증: 설치 main.estx N0000000083의 저장 286·재계산 100.1 불일치 항목에서 품명만 변경한 뒤 원본 수량 286·문서·다른 문서 보존 확인. 저장·서식 시험 2개 통과.
  • 기존 수량산출 항목의 품명·규격을 ESTX에 저장 → 재열기·다른 항목 보존·연결 변경 차단 확인.

    • 자체 검증: 설치 main.estx 기존 항목의 품명·규격 저장·재열기, 다른 항목·문서 보존과 연결 변경 차단 확인. 저장·수량 관련 시험 22개 통과.
    • 추가 검증: 품명·규격과 산식을 함께 수정한 ESTX의 수량 104→116, 다른 문서·인덱스 보존 확인.
  • 인쇄 서식의 상·하·좌·우 여백 개별 설정과 ESTX 저장 → 기존 단일 여백 호환·실제 서식 재읽기 확인.

    • 자체 검증: 거창 ESTX 여백 13·14·15·16mm 미리보기·JSON 저장과 기존 단일 여백 호환을 Edge에서 확인. 설치 샘플 ESTX 저장·재읽기 포함 관련 시험 24개 통과.
  • 산출근거 계산 오류에서 해당 행으로 이동 → 실무 ESTX 오류와 중복 코드 안전 처리 확인.

    • 자체 검증: 거창 실무 ESTX의 D0000000194:18 계산 오류에서 원본 해당 행으로 Edge 이동 확인. 중복 코드·범위 오류 차단 포함 시험 12개 통과.
  • 다른 이름으로 저장할 때 작업 이름 입력 → 원본·복사본 구분과 저장 취소 확인.

    • 자체 검증: Tailscale HTTP Edge에서 빈 이름 차단, 별도 이름·ID의 사본 저장과 기존 파일 보존 확인.
  • Tailscale HTTP 접속의 새 항목·첨부·공정 생성 오류 수정 → 실제 원격 주소에서 생성과 저장 확인.

    • 자체 검증: Tailscale HTTP Edge의 비보안 컨텍스트에서 UUID·공정·첨부 생성·JSON 저장 확인. 관련 시험 31개 통과.
  • EST 백업 EBKX 파일 열기 → 실무 백업 읽기·JSON 저장·재열기 확인.

    • 자체 검증: 거창 실무 EBKX의 내역 106행을 Edge에서 열고 JSON 저장·재열기; 독립 서버 시험 9개 통과. 원본 EST에서의 백업 호환성은 미확인.
  • Tailscale 주소에서 독립 테스트 서버 접속 → 접속과 계산 요청 확인.

    • 자체 검증: Tailscale IP에서 Edge 화면과 계산 POST 200, 다른 출처 403 확인. 다른 PC에서의 접속은 미확인.
  • 표준시장단가 설계변경 내역·증감 화면·출력 구현 → 신규·삭제·연결 변경 시험.

    • 자체 검증: 표준 내역의 신규·삭제·연결 변경과 문서 기능 시험 21개 통과. Edge에서 증감·삭제 행·인쇄·내역 이동 확인.
  • 표준시장단가 사용 내역·기초 단가 비교 화면·출력 구현 → 연결·중복·누락·행 이동 시험.

    • 자체 검증: 연결 단가·중복·누락·문서 시험 12개 통과, Edge에서 화면·인쇄·해당 내역 이동 확인.
  • 추가 인쇄 서식의 본문 저장·미리보기·Excel 연결 보완 → 서식 문서 검증·재열기 시험.

    • 자체 검증: 문서·Excel 시험 24개 통과, Edge에서 본문 저장·재열기·인쇄·Excel 요약 확인.
  • 기성 회차 이름 변경·추가 시 중복 방지 → 공백·기존 이름 충돌 시험.

    • 자체 검증: 기성·업무 시험 22개 통과, Edge에서 공백 중복 이름 거부·새 이름 생성 확인.
  • 첨부파일 추가 전 256MB 저장 한도 확인 → 대형 파일 차단·기존 작업 보존 시험.

    • 자체 검증: UTF-8·base64 실제 저장 크기 일치·한도 계산 포함 4개 통과. Edge에서 초과 파일 읽기 전 차단·안내 확인.
  • 전체 수량 반영 시 중복·예약 산출서 코드 차단 → 중복 합산 방지 시험.

    • 자체 검증: 중복·빈·예약 코드 차단과 기존 수량 보존 포함 시험 19개 통과.
  • 선택 또는 전체 상세 내역 수량 초기화 → 비율·합계 보존·실행 취소 시험.

    • 자체 검증: 설계변경·이력 시험 9개 통과, Edge에서 선택·전체 초기화, 비율 보존과 취소 확인.
  • 전체 기성 회차 초기화 구현 → 내역·다른 업무 보존·취소 시험.

    • 자체 검증: 기성·이력 시험 9개 통과, Edge에서 초기화·다른 업무 보존·확정 회차 취소 복원 확인.
  • 로컬 첨부파일 추가·내려받기·삭제·JSON 보관 구현 → 파일 바이트·저장·취소 시험.

    • 자체 검증: 입력 검증·ESTX 누락 차단 시험 2개 통과, Edge에서 파일 추가·JSON 저장·재열기·바이트 내려받기·삭제 취소 확인. 업무 회귀 시험 82개 통과(openpyxl 경고 7건).
  • 선택 행 자릿수·사사오입·절사·올림식 일괄 설정 → 선택 범위·재계산·취소 시험.

    • 자체 검증: 업무·수량 시험 21개 통과, Edge에서 두 행 절사 2자리 설정·다른 행 유지·재계산·실행 취소 확인.
  • 일위·산근·기계 묶음 복사 시 기존 코드 충돌 방지 → 묶음·행 보존 시험.

    • 자체 검증: Edge에서 세 자료의 중복 코드 회피와 복사된 묶음 자식 행의 부모 연결 확인.
  • 모든 수량산출서·직접 수식표의 내역 수량 일괄 합산 반영 → 동일 대상 합산·오류 시 전체 차단 시험.

    • 자체 검증: 동일 내역 합산·오류 시 전체 차단 포함 수량·문서 시험 18개 통과, Edge에서 일괄 반영·취소 확인.
  • 2026-11-07: 사용자 지시로 EST 작업 계획과 검증 기록을 공유 PLAN.md에서 이 파일로 이관. 업무 회귀 시험 79개 통과, openpyxl 경고 7건. Git push는 보류.

  • 자료 오류 검색 화면과 해당 행 이동 구현 → 중복·누락 연결·품명·규격 차이 시험.

    • 자체 검증: 중복·누락·품명·규격 차이 시험 포함 19개 통과. Edge에서 오류 목록과 내역 행 이동 확인.
  • 계약심사 화면에서 주요심사내용 작성·저장·출력 연결 → 입력·재열기·인쇄 시험.

    • 자체 검증: 심사·문서 시험 17개 통과. Edge에서 작성·저장·재열기·인쇄 확인.
  • 계약심사 비목 누락 고정금액·중복 식별 처리 보완 → 잘못된 합계·다중 반영 차단 시험.

    • 자체 검증: 고정금액 비목 합계 오류·중복 식별 입력 차단을 포함해 시험 29개 통과, Edge 화면 확인.
  • 직접 작성 수량 수식표 항목 이동 구현 → 수식 참조·저장·실행 취소 시험.

    • 자체 검증: 수량·문서 시험 17개 통과. Edge에서 이동 뒤 참조 오류·서버 저장·재열기·실행 취소 확인.
  • 최근 확정 기성의 누계 수량을 예정공정표 진도로 반영 → 연결·범위·기존 일정 보존 시험.

    • 자체 검증: 최근 확정 회차·미연결·수량 0·범위 오류·일정 보존 포함 시험 18개 통과, Edge 진도 반영과 실행 취소 확인.
  • 인쇄 서식의 계산 결과를 Excel 표로 내보내기 구현 → 실제 Excel 열기·수치 확인.

    • 자체 검증: Edge에서 연차 내역 Excel 다운로드·한글 제목·금액 확인. 요약·오류·수치·입력 검증 포함 문서·Excel 시험 22개 통과(openpyxl 경고 7건).
  • 연차별 개별 내역·배분 금액 출력 구현 → 차수별 계산·수식 오류 시험.

    • 자체 검증: 차수별 배분·오류 표시 포함 문서·연차 시험 13개 통과, Edge 연차 내역 미리보기 확인. 업무 회귀 시험 74개 통과(openpyxl 경고 6건).
  • 물가변동의 중복 코드 내역을 당초와 개별 연결 → 계약·적용제외 계산 시험.

    • 자체 검증: 중복 내역의 개별 계약 단가·적용제외 포함 시험 24개 통과, Edge에서 계약 단가 80·50 표시 확인.
  • 기성 입력·일괄 적용의 중복 행 식별 차단 → 계산·확정·일괄 적용 시험.

    • 자체 검증: 중복 행 계산 및 확정 차단·다른 행 계산 포함 14개 통과, Edge 개별·일괄 입력 차단 확인.
  • 기성 누계수량의 물가변동 연결 보완 → 중복 식별 차단·신규 행 입력 보존 시험.

    • 자체 검증: 중복 식별 차단과 신규 행 입력 보존 포함 시험 13개 통과, Edge 기성 누계 불러오기 확인.
  • 행 복사·붙여넣기에서 다른 종류의 자료가 섞여 손상되지 않도록 제어 → 동일 자료 복사·오류 시험.

    • 자체 검증: Edge에서 다른 자료 종류의 붙여넣기를 차단하고 동일 자료 복사는 유지하는 것을 확인.
  • 내역 선택 행 위·아래 이동 구현 → 행 식별·소계 보호·취소 시험.

    • 자체 검증: 연속 행 이동·소계·식별자 차단 시험 21개 통과, Edge에서 이동·기성 입력 유지·실행 취소 확인.
  • 설계변경 중복 코드 내역의 당초 행 매칭 보완 → 증감·삭제 시험.

    • 자체 검증: 같은 코드의 다중 내역과 삭제 행의 당초 금액 분리를 포함한 시험 20개 통과.
  • 설계변경 원가 비목별 당초·변경·증감 화면과 출력 구현 → 삭제·신규·중복 구분 시험.

    • 자체 검증: 중복·신규·삭제 및 행별 당초 값 포함 시험 15개 통과, Edge 화면과 인쇄 미리보기 확인.
  • 물가변동 원가 비목별 계약·조정·제외 금액 인쇄 구현 → 계산 결과 시험.

    • 자체 검증: 기성·물가변동·문서 시험 21개 통과, Edge 미리보기에서 기성·물가변동 원가와 연차 출력 확인.
  • 기성 원가계산서 인쇄 구현 → 회차별 전회·금회·사정·누계 시험.

    • 자체 검증: 확정 및 다음 회차 금액 포함 시험 15개 통과.
  • 물가변동 전용 Excel 입력과 조사 도급액 입출력 구현 → 행 식별, 오류 차단, 계산 반영 시험.

    • 자체 검증: Excel 관련 시험 12개 통과, Edge에서 실제 파일 수정과 가져오기 확인.
  • 연차 배분 계산 결과와 수식을 출력하는 서식 구현 → 차수별 계산과 오류 표시 시험.

    • 자체 검증: 차수별 금액과 잘못된 수식 오류 표시 포함 시험 11개 통과.
  • 기성 회차와 물가변동 결과 인쇄 서식 구현 → 확정 회차 보존과 계산 결과 시험.

    • 자체 검증: 결과 출력 및 확정 회차 보존 시험 포함 18개 통과, Edge 미리보기에서 두 서식 확인.
  • 2026-11-07 사용자 지시: 동등성 대조와 Git push 보류, CAD 제외 기능 구현 우선.

    • 기능 회귀(2026-11-07): 수량·Excel·심사·설계변경·기성·물가변동·연차·공정·이력 관련 60개 통과(28.41초), openpyxl 날짜 API 경고 5건. 원본 동등성 대조는 실행하지 않음.
    • 수량산출서 신규 생성·이름 변경·산출 행/항목 추가·삭제 및 내역 반영 → 화면 조작과 JSON 저장/복원 시험.
      • 자체 검증(2026-11-07): 수량 화면에서 새 산출서 생성, 항목 추가·품명 변경, 2*3 계산과 내역 6 반영, 서버 JSON 저장·재열기. Edge 브라우저 오류 0, 이벤트 기능 시험 2개 통과. 설치 원본과의 동등성 대조는 사용자 지시에 따라 수행하지 않음. 신규 산출서/행 구조 변경의 원본 ESTX 쓰기는 미지원.
    • 수량산출 행의 순서 변경과 선택 위치 삽입 → 계산 참조 순서·결과 표지 연결 확인.
      • 자체 검증(2026-11-07): 이벤트 시험에서 항목 결과 3·9·13 보존, 선언 이전 참조 오류 확인. Edge에서 행 아래 삽입·위로 이동 및 JSON 저장 후 재열기, 항목 결과 3·9 유지·브라우저 오류 0.
    • 기존 수량 연결의 변경 및 해제 → 비운 연결이 원래 연결로 되살아나지 않는지 확인.
      • 자체 검증(2026-11-07): 기존 LinkCode가 있더라도 TargetCode를 빈 값으로 설정하면 해당 내역 수량을 변경하지 않음. 수량 기능 시험 3개 통과.
    • 수식표와 산출서의 내역 반영을 같은 연결 검사로 처리하고 재계산 메뉴에서 선택한 자료를 반영 → 대상 누락·중복·수식 오류 시 전체 변경 차단.
      • 자체 검증(2026-11-07): 수식표 참조 합계 8, 선택 산출서 9, 기존 MulCode 보존, 없는 대상의 전체 변경 차단. Edge 재계산 메뉴에서 선택 산출서 9·직접 작성 수식표 8 반영, 브라우저 오류 0. 수량·이력 관련 5개 통과. 다른 프로젝트를 열 때 이전 산출서 선택이 남지 않도록 초기화.
    • 예정공정표에 내역 일괄 추가와 금액 가중치 갱신 → 기존 일정·진도 보존 및 중복 방지 시험.
      • 자체 검증(2026-11-07): 같은 코드 2행과 코드 없는 1행을 행 식별자로 구분하고 재추가를 방지, 내역 순서 변경 뒤에도 금액을 연결. 일정·진도·이름 유지 및 연결 모호성 차단을 기능 시험. Edge에서 3행 추가·재추가 방지·금액 200/300/400 갱신 및 JSON 저장, 오류 0. 설치 내역의 코드 없는 39행도 공정 추가 가능함을 확인. 원본과의 동등성 대조 미실시.
    • 수식표 항목 삭제 후 새 항목 추가 시 중복되지 않는 산출코드 생성 → 삭제·재추가와 참조 계산 시험.
      • 자체 검증(2026-11-07): 남은 Q2가 삭제된 Q1을 참조할 때 새 항목을 Q3으로 생성해 참조가 새 항목에 잘못 연결되지 않음을 Edge에서 확인. 수량·공정 기능 시험 9개 통과.
    • 설계변경 비교에서 코드가 없는 내역도 품명과 수량·금액을 표시 → 당초·변경 차액과 화면 표시 시험.
      • 자체 검증(2026-11-07): 코드 없는 earthwork 내역의 당초 100·변경 200·증감 100이 화면에 표시되는지 Edge와 기능 시험으로 확인. 관련 기능 시험 13개 통과·브라우저 오류 0.
    • 수량산출서 인쇄에 직접 작성 수식표와 산출서의 실제 수식·계산값·연결을 표시 → 계산 오류와 출력 데이터 시험.
      • 자체 검증(2026-11-07): 수식표 2·참조 결과 6, 오류 수식의 계산 오류, 산출서 4+5 결과 9·연결 내역을 출력 데이터로 확인. Edge 인쇄 미리보기에서 두 종류의 산식과 결과 표시·브라우저 오류 0, 수량·설계변경·공정 기능 시험 14개 통과.
    • 수량산출과 직접 수식표에서 코드 없는 내역과 중복 코드의 개별 내역 행 연결 → 선택·계산·저장·재열기 시험.
      • 자체 검증(2026-11-07): 같은 코드의 두 내역 중 둘째 행과 코드 없는 내역에 각각 6·9를 반영하고 JSON 저장·재열기 및 인쇄에서 대상 확인. 직접 수식표의 코드 없는 행 선택·결과 5 반영·연결 해제, 내역 순서 변경 뒤 식별자 유지, 잘못된 식별자 차단. Edge 오류 0, 기능 시험 15개 통과.
    • 연차 차수 위·아래 이동과 중복·기존 참조를 피하는 신규 차수 이름 생성 → 참조 순서 오류·저장 복원 시험.
      • 자체 검증(2026-11-07): 기존 2차가 삭제된 1차를 참조하면 새 이름을 3차로 생성. Edge에서 2차를 1차 앞으로 이동했을 때 참조 오류 표시, 변경 순서 저장, 다시 원래 순서로 옮겨 오류 해소 확인. 연차·수량 기능 시험 10개 통과, 브라우저 오류 0.
    • 계약심사 화면: 사용자가 심사 수량·비목별 단가를 입력하고 기존 내역/심사액·차액을 비교, 심사 사본 열기와 JSON 저장 → 입력·원가 재계산·취소·저장/복원 시험. 자동 심사율·법적 기준은 정하지 않음.
      • 자체 검증(2026-11-07): 일반 단가 행과 고정금액 행을 수정해 원가 포함 기존 1,210→심사 198 계산, 기존 내역 보존·실행 취소·JSON 저장/재열기·독립 ID의 심사 사본 확인. 잘못된 입력·없는 행의 사본 생성 차단. Edge 오류 0, 관련 기능 시험 47개 통과(25.68초). 원본 계약심사 동작 대조는 수행하지 않음.
    • 계약심사 결과요약서에 기존액·심사액·차액과 내역별 비교 출력 → 출력 데이터·미리보기 확인.
      • 자체 검증(2026-11-07): 기존 200·심사 80·차액 -120 및 코드 없는 내역을 요약서 출력 데이터와 Edge 인쇄 미리보기에서 확인. 심사·문서 관련 8개 통과, 브라우저 오류 0.
    • 직접 작성 수식표·예정공정표 Excel 내보내기와 가져오기 → 참조 수식·내역 행 연결·일정·진도 유지 및 잘못된 입력 차단.
      • 자체 검증(2026-11-07): Edge에서 Excel 내려받기→openpyxl로 수식·진도 변경→가져오기 및 내역 식별자 보존. 중복 코드·소수자리·진도 오류 차단, Excel·수량·공정 관련 17개 통과. openpyxl 환경의 날짜 API 사용 중단 경고 2건, 실패 0.
    • 산출근거의 내부 표지 문자가 Excel 파일을 손상하지 않도록 인코딩·복원 → 원본 표지와 표지처럼 생긴 일반 문자 왕복 확인.
      • 자체 검증(2026-11-07): 제어 문자가 포함된 Excel 파일이 XML 파싱에 실패하던 상황을 재현한 뒤, 표지와 일반 문자열 _x0012_를 구분해 저장·openpyxl 편집·브라우저 재가져오기 왕복 확인. Edge 오류 0.
    • 수량산출서 문서·산출 행·항목의 Excel 내보내기와 편집 후 가져오기 → 표지·내역 연결 보존 및 계산 확인.
      • 자체 검증(2026-11-07): 세 Excel 시트 내보내기, 산출 행 2×3→2×4와 품명 수정 후 가져오기, 표지·내역 행 연결·Excel 미표시 속성 보존 및 내역 수량 8 반영을 Edge에서 확인. 누락 시트·잘못된 표지·중복 순서 차단과 빈 원래 필드 유지, 수량·Excel 기능 시험 14개 통과. Edge 오류 0; openpyxl 날짜 API 사용 중단 경고 3건, 실패 0.
      • 추가 보완: 기존 LinkCode만 있는 항목은 Excel에서 연결을 변경하지 않았을 때 새 연결 필드를 덧붙이지 않고 원래 구조를 유지.
    • 수량산출 행 편집 중 결과 표지가 삭제되거나 추가되면 이전 저장 수량이 잘못 적용되지 않도록 차단 → 화면·Excel 편집 후 계산 시험.
      • 자체 검증(2026-11-07): 결과 표지가 0개 또는 2개인데 연결 표지가 1개인 행의 계산 오류와 내역 반영 차단, 기존 수량 1 유지. Edge에서도 표지 삭제 후 반영 차단·오류 0, 수량·Excel 기능 시험 15개 통과.
    • 계약심사 항목별 검토 사유 입력·저장 및 요약서 출력 → 금액 재계산과 사유 보존 시험.
      • 자체 검증(2026-11-07): 심사 단가 변경과 한글 사유 입력 후 JSON 저장·재열기, 심사액 160과 요약서 사유 표시를 Edge에서 확인. 관련 기능 시험 8개 통과, 브라우저 오류 0.
    • 계약심사 입력·사유 Excel 내보내기와 수정 후 가져오기 → 내역 행 연결·재계산·입력 검증 시험.
      • 자체 검증(2026-11-07): Excel Review 시트에서 심사 단가 80→60과 사유를 변경해 가져온 뒤 심사액 120 및 화면 사유 표시 확인. 중복 식별자·잘못된 숫자·식별자 오류 차단, 심사·Excel 기능 시험 12개 통과. Edge 오류 0, openpyxl 날짜 API 경고 4건.
    • Excel 계약심사 입력이 존재하지 않거나 중복된 내역을 가리키면 가져오기 자체를 차단 → 다른 표 교체도 함께 취소되는지 확인.
      • 자체 검증(2026-11-07): 없는 내역 및 해당 행에서 사용할 수 없는 비목 입력 차단. Edge에서 잘못된 심사 행과 내역 수량 변경을 함께 가져왔을 때 두 변경 모두 적용되지 않음 확인. 심사·Excel 시험 14개 통과, 브라우저 오류 0.
    • 계약심사 개별 행의 입력·사유 초기화 → 다른 행 입력과 실행 취소 보존 시험.
      • 자체 검증(2026-11-07): 한 행만 초기화해 다른 행의 수치·사유 유지, 마지막 행까지 초기화 시 심사 작업 비우기. Edge 실행 취소로 초기화된 사유 복원, 심사 기능 시험 4개 통과, 브라우저 오류 0.
    • 계약심사 고정금액 행의 사유·수량만 변경해도 기존 금액이 유지되도록 처리 → 비목 금액 변경과 구분 시험.
      • 자체 검증: 수정 전 문제 재현, 수정 후 금액 유지와 비목 변경 재계산 확인. 관련 시험 16개 통과.
    • 연차 차수와 미확정 기성 회차·입력 Excel 편집 → 확정 회차의 계약·누계 보존 및 가져온 업무 계산 시험.
      • 자체 검증(2026-11-07): 확정 회차는 내보내기 대상에서 제외하고 기존 계약·누계를 그대로 유지. Edge에서 미확정 금회 수량 1→3, 연차 수식 50%→25%를 Excel로 변경해 가져온 뒤 기성 누계 500·연차 250 확인. 없는 행·확정 회차·중복 ID·잘못된 입력 차단, Excel·기성·연차 시험 22개 통과. Edge 오류 0, openpyxl 날짜 API 경고 5건.
    • 내역·일위대가 행의 경비성단가(ActionSetJCBimog) 및 순공사비 경계 행(popMainSetTotalSumLine) 화면 조작 메뉴와 토글 재계산 지원.
      • 자체 검증(2026-11-08): REA ActionSetJCBimog(0xf17c10/0x10dba14) 및 popMainSetTotalSumLine 근거를 기반으로 toggle-jc-bimog, toggle-sun-gongsa 조작 액션 구현.
        1. 경비성단가 보존 및 복원: SCheck=1(재료) 또는 2(노무) 상태에서 경비성단가 지정(SCheck=3) 후 해제 시 원래의 SCheck 값(_prevSCheck)으로 온전히 복원(기존 비목별 0으로의 왜곡 차단), 노무비(SCheck=2, NU=2000)가 SCheck=3 전환 후 해제 시 SCheck=2, NU=2000으로 복원됨을 검증.
        2. 순공사비 연결 행 보호: 원천 연결(자재/노임/일위/단가/기계 등 LinkIndex 5, 6, 21, 51, 52, 55, 57, 58, 61, 62, 67, 68, 101~105) 또는 코드·수량이 있는 상세 행의 순공사비 경계선 지정을 안전하게 차단("단가·수량 연결 행이나 기존 특수 공종 행은 순공사비 경계선으로 지정할 수 없습니다. 빈 제목/구분 행을 선택하세요.").
        3. 순공사비 속성 보존/복원: 기존 54 행이 있을 때 새 행을 순공사비로 지정하거나 해제 시 원래의 LinkIndex와 Name(_origLinkIndex, _origName)으로 정확히 복원됨을 검증.
        4. 안전성 거부 4건(비허용 화면 호출, 선택 없음, 복수 순공사비 지정, 원천 연결 상세행 지정 거부) 전수 확인. 신규 전용 시험 resources/tester/test_est_row_actions.py 통과.
    • 남은 웹 업무 기능을 이어서 구현하고 각 기능의 입력·계산·저장 흐름 확인.
  • ESTX 원본 옵션·공사명 및 기존 BLOB 확장 저장 구현 → 설치 샘플 재읽기와 인덱스·다른 자료 보존 확인. CAD 제외.

    • 자체 검증(2026-11-06): 설치 sample.estx에서 한글 공사명·자동계산·절사·자릿수 변경과 BLOB 12,000바이트 확장 저장 후 재읽기, 다른 속성·전체 인덱스·CAD 보존 확인. EST 전용 100개 통과(51.80초). 독립 파서 대조이며 원본 EST에서 파일을 열어보지는 못함.
  • WPTools 수량산출서의 기존 서식 구간 안 텍스트 편집 저장 → 실제 수량산출서 샘플 재읽기와 다른 문서 보존 확인.

    • 자체 검증(2026-11-06): main.estx의 75개 수량산출서 중 한 문서 편집·재읽기, 나머지 문서·인덱스·CAD 유지, 서식 구간을 가로지르는 편집 거부 확인. EST 전용 102개 통과(70.77초). 원본 EST 직접 실행 비교는 미실시.
  • 원본 결과와 기존 계산이 일치하는 수량산출서의 결과 표지·수량 목록 재계산 저장.

    • 자체 검증(2026-11-06): main.estx 수량산출서 폭 9→10 변경 시 표지 및 목록 수량 104→116으로 기록·재읽기, 다른 문서·인덱스·CAD 보존. EST 전용 102개 통과(70.78초). 계산 오류·기존 결과 불일치 문서는 저장을 거부하며 원본 EST 실행 검증은 미실시.
  • 서식 구간을 넘는 수량산출서 편집과 목록·연결 변경 지원; 계산 오류나 기존 결과 불일치 문서의 처리 확인.

    • 진행 및 미완료 범위(2026-11-08):
      1. 서식 편집 지원: 수량산출서 편집기에서 위첨자(^(2) 등) 및 복합 서식 태그 경계를 가로지르는 텍스트 수정(abc^(2)def -> abc^(3)xyz) 시 분할된 서식 런을 유지하며 인라인 패치 적용 확인 (test_quantity_document_edit_across_styles_and_superscript_preserves_structure 통과).
      2. 불일치 문서 처리: 원본 저장 수량과 산식 계산 결과가 다른 불일치 문서(예: N0000000083 원본 286 vs 산식 100.1)의 경우, 품명/규격/단위(Unite) 편집 시 기존 원본 수량(286)을 보존해 ESTX 패치를 허용하며, 산식을 수정해 결과가 변경되는 경우 "수량산출서 원본 결과와 재계산 값이 다릅니다. JSON으로 저장해 확인하세요"로 ESTX 덮어쓰기를 안전 차단함을 확인.
      3. 미완료 범위(제한 사항): 수량산출서 목록·연결(항목 추가/삭제, 수량산출서 신규/삭제, 행 구조 증감 등) 변경 시 ESTX 저장(MulMainDat, MulTitleDat, Editor, MulList)은 고정 인덱스 및 BLOB 구조 보존을 위해 현재 안전 차단되어 있으며, JSON 저장소(project.quantitySheets)에서만 지원됨. ESTX 목록·연결 구조 변경 저장은 미완료 상태임.
      4. 관련 회귀 시험 test_est_quantity_workflow.py 12개, test_est_business.py 18개, test_est_native_export.py 수량/위첨자 10개 전수 통과.
  • 수량산출 항목의 단위(Unite) 화면 입력 열과 ESTX 저장 → 재열기·다른 항목 보존·목록 바이너리 검증.

    • 자체 검증(2026-11-07): native-quantity 렌더러에 단위 입력 열 추가 및 change 핸들러에서 Unite 변경 허용. 설치 main.estx 기존 항목의 품명·규격과 함께 단위(Unite: 'm2')를 수정해 브라우저 이벤트·저장·재열기, 다른 항목·연결·수량 보존 및 실행취소 확인. 단위 변경 시 산식 계산 불변 확인(퍼센트 등 임의 자동변환 없음). test_est_quantity_workflow 12개 및 test_est_native_export 회귀 14개 통과. 원본 EST 실행 검증은 미실시.
  • 수량산출서의 연속 글자 서식에 걸친 텍스트 편집 저장 → 서식 태그 보존 및 재읽기 검증.

    • 자체 검증(2026-11-07): 서로 다른 세 글자 서식에 걸친 텍스트를 변경한 뒤 태그와 재읽기 결과를 대조. 변경 시작 위치의 서식으로 새 텍스트를 저장하며 위첨자·표지를 넘는 임의 편집은 계속 제한. 관련 시험 10개와 EST 전용 120개 통과(77.60초). 원본 EST 실행 비교는 미실시.
  • 설치 수량산출서의 실제 글자 서식 경계 편집을 회귀시험으로 보존 → 해당 문서와 태그 재읽기.

    • 자체 검증(2026-11-07): main.estx N0000000113의 27.22 <c nr=12/>= 경계를 직접 변경하고 모든 태그와 재읽기 행을 비교. 설치본이 없으면 시험은 건너뜀. 해당 시험 1개 통과(4.13초). 문서 편집기 자료의 재읽기 검증이며 산식 의미 변경과 원본 EST 실행 비교는 아님.
  • 수량산출서의 내역 수량 반영에서 실제 내역이 없는 코드와 중복 코드를 차단 → 제목만 존재·중복·정상 연결 시험.

    • 자체 검증(2026-11-07): 동일 코드의 상세 행 두 개가 모두 7로 바뀌던 오류를 재현하고 변경 없이 오류 표시하도록 수정. 제목만 존재하는 코드, 제목과 상세가 함께 있는 정상 코드, 여러 연결 중 하나가 없는 경우의 전체 반영 중단을 확인. 관련 시험 1개와 EST 전용 121개 통과(79.70초).
  • 한 수량산출서 행에서 글자 서식 경계와 다른 표지 구간을 동시에 편집 → 태그·표지 유지와 재읽기 확인.

    • 자체 검증(2026-11-07): 두 서식에 걸친 문구와 별도 결과 표지 숫자를 동시에 수정하는 실패를 재현한 뒤 태그 보존·재읽기 일치 확인. ESTX 내보내기 관련 11개 통과(27.74초); 전체 121개 시험 이후 저장 경로의 이 조합만 추가 수정.
  • 기성 회차에서 원가 기호가 없는 여러 항목의 전회 누적을 항목별로 유지 → 설치 샘플의 빈 기호 확인 및 복수 항목 회차 시험.

    • 자체 검증(2026-11-07): 설치 sample.estx에서 빈 기호 원가 행 확인. 합성 기성 2회차에서 앞 항목의 전회 200이 뒤 항목의 100으로 덮이던 실패를 재현한 뒤 200/100과 누계 500/250 확인. 기성 7개와 EST 전용 123개 통과(78.90초). 기호가 없으면 항목 이름과 동일 이름의 순서로 대응하므로 회차 사이에 같은 이름 항목을 재배열하면 원본 식별 근거가 부족함.
  • 연차 이름이 기준 참조 예약어와 겹쳐 차수를 잘못 참조하는 경우 차단 → 예약어와 정상 차수 시험.

    • 자체 검증(2026-11-07): 기준·계약·계약수량 이름이 차수 참조 대신 계약값으로 처리되던 상황을 재현하고 오류로 차단. 일반 차수 참조의 잔액 50 확인. 연차·업무 관련 16개 통과(14.08초). 기존에 예약어 이름을 사용한 웹 작업은 차수 이름과 참조를 바꿔야 함.
    • 추가 전체 회귀: EST 전용 125개 통과(81.45초). 원격 CODEX 브랜치는 서버의 CODEX.lock으로 push가 거부되어 로컬 커밋 보존 중.
    • 분석(2026-11-06): REA 0x11167e4는 MulCode를 0xa911d0으로 분해한 뒤 수량 문서·항목을 찾고 GN을 복사한다. 0xa911d0 기계어의 구분 문자열은 탭이다. 설치된 24개 ESTX의 내역 테이블에서는 MulCode가 채워진 사례가 없어 BLOB 인코딩·신규 할당의 원본 검증은 아직 부족하다.
  • 기존 ESTX 기본 수량 연결을 웹에서 표시 → REA의 탭 분리·대상 찾기 조건과 중복 연결 경고를 합성 데이터로 검증.

    • 자체 검증(2026-11-06): 탭 분리 ASCII/UTF-16·기본 모드·중복 내역/다른 모드 경고 합성 시험 통과, EST 전용 117개 통과(76.52초). 실제 연결된 ESTX 샘플과 신규 연결 쓰기는 여전히 미확인.
  • 기성 원가계산서의 명시적 0원 도급액 보존 → 직접공사비가 양수인 경우와 원가계산서가 없는 경우를 각각 시험.

  • 물가변동 계약·제외·조정액 계산에서도 명시적 0원 도급액과 원가계산서 없는 경우를 구분.

    • 자체 검증(2026-11-07): 수정 전 0원이 직접공사비로 대체되는 실패 재현, 수정 후 기성·물가변동에서 0원 보존 및 원가계산서 부재 시 직접공사비 대체 확인. 관련 11개와 EST 전용 119개 통과(76.85초). 원본 EST 실행 비교는 미실시.
  • 수량산출서 한 줄에서 서로 다른 표지 구간의 텍스트를 함께 수정하는 저장 지원 → 표지·서식 보존과 다중 편집 재읽기 검증.

    • 자체 검증(2026-11-06): 설치 main.estx에서 한 줄의 품명·수식을 함께 변경해 모든 WPTools 태그 유지, 전체 ESTX 재읽기와 수량 104→125 반영 확인. EST 전용 115개 통과(77.82초). 같은 구간 안 여러 서식을 가로지르는 편집과 목록·연결 변경은 미완료.
  • 변경 없는 JDL 재출력 시 원본 확장 자료 보존, 수정 시 원본 무조건 반환 방지 → 서버 재계산을 거친 왕복과 수정 구분 시험.

    • 자체 검증(2026-11-06): 임의 확장 파일이 포함된 JDL 원본 바이트 일치, 저장 ID 부여 후 보존, 이름 변경 후 새 이름으로 변환 및 경고 확인. EST 전용 103개 통과(71.14초). 원본 검사 DLL 인증은 미확인.
  • 인쇄 서식 선택 시 원본 서식에서 적용한 여백·행 수가 설정 입력란에도 표시되도록 수정.

    • 자체 검증(2026-11-06): Node DOM 모의에서 서식 선택 후 여백 20·행 수 21이 입력란에 반영되는지 확인. 원본 인쇄 배치 비교는 아님.
  • JDL 일위대가의 기본 상세 항목 불러오기 → 자원 연결·저장 금액 보존 및 특수 항목 경고 검증.

    • 자체 검증(2026-11-06): 합성 JDL에서 자재 연결·수량 2·금액 200 보존 및 특수 플래그 경고, 서버 계산 경로 통과. EST 전용 104개 통과(71.49초). 원본 JDL 실자료·실행 대조는 미실시.
  • JDL 기본 일위대가 구성 내보내기 및 불러오기 왕복 → 상세 자원·수량·금액 보존, 특수 구성은 기존 전개 경고 유지.

    • 자체 검증(2026-11-06): 합성 자재 일위의 상세 수량·금액 및 내역 참조 왕복, 특수 구성의 전개 경고 확인. EST 전용 105개 통과(72.38초). 원본 JDL 인증·실행 대조는 미실시.
  • 해양 자료 산식의 단위·도식·그리스 변수·중괄호 수식 해석 개선 → 실제 행 시험과 원본 저장값 대조.

    • 자체 검증(2026-11-06): 해양 오류 95→37건, 저장값 134,159/134,208 일치(기존 134,133); 수치 뒤 중괄호 주석을 산식으로 잘못 읽던 회귀 1건 수정. 측량 80,671/80,682·산림 15,049/15,055·가시설 13,978/13,979 및 오류 수 기존과 같음. EST 전용 110개 통과(73.49초). 누락 변수·모순 부호와 나머지 오류는 미해결.
  • 해양 자료의 복합 단위·괄호 설명 산식 추가 처리 → 실제 저장값과 다른 자료 회귀 비교.

    • 자체 검증(2026-11-06): 해양 오류 37→22건, 저장값 134,159/134,208 유지. 측량·산림·가시설 대조 결과 변화 없음. 수준면 주석·도식 병기 및 붙은 변수 확장은 저장값 36/69건 차이가 발생해 보류.
  • 근사값이 병기된 변수 선언을 계산 값과 설명으로 분리 → 실제 원본 대조에서 기존 값 유지 확인.

    • 자체 검증(2026-11-06): Q1=3.2hr ≒ 0.5일 선언 및 참조 시험, 해양 오류 22→21건·저장값 134,159/134,208 유지, 측량·산림·가시설 결과 유지. EST 전용 116개 통과(77.02초).
  • ESTX에 저장된 인쇄 서식 설정 읽기·미리보기 반영 → 설치 샘플의 서식 수·여백·행 수 및 원본 파일 보존 확인.

    • 자체 검증(2026-11-06): 설치 sample의 41개 서식과 프로젝트명·여백·행 수, 인쇄 설정이 포함된 10개 ESTX 읽기, DOM 모의에서 프로젝트 설정 우선 적용 확인. EST 전용 113개 통과(72.97초). 웹 인쇄 설정의 ESTX 쓰기·원본 출력 배치 비교는 미완료.
  • 웹에서 변경한 인쇄 서식의 여백과 페이지당 행 수를 ESTX 원본 옵션에 기록하고 다른 필드 보존 검증.

    • 자체 검증(2026-11-06): DOM 모의에서 사용자 여백 13·행 수 19 기록, 설치 sample에서 해당 서식 재읽기 및 나머지 서식·압축 내 파일 바이트 보존, 범위 밖 값 거부와 서버 계산 후 기록 유지 확인. EST 전용 114개 통과(73.42초). 원본 EST 실행 검증은 미실시.
  • 2026-11-06 후속 요청 — CAD 편집을 제외한 잔여 기능 구현. 기존 내역·계산·업무 기능을 유지하며 출력/변환과 원본 저장 경로를 확장한다.

    • REA와 설치 자료에서 인쇄 서식·XML/JDL·Excel·ESTX 저장 구조 확인 및 지원 범위 명시.
    • 전체 자료 Excel 입출력과 출력 서식/페이지 설정을 실제 파일·화면에서 검증.
    • DB의 XSD 1.0.5에 따른 XML 입출력·계층/원가/단가 변환, JDL 기본 표 입출력, 동일 구조 ESTX 수정 저장 구현·왕복 검증. 근거 미확인 형식을 완전 호환으로 가장하지 않음.
      • 구현: Excel 스칼라 표/자료형과 기존 바이너리 보존, 단가 수정 전파, 코드/수식/중복 검사. XML 작성정보·연결/길이 검사·금액 보존 및 자동계산 해제, UTF-8/CP949/UTF-16 입력. JDLCHK 필드 정의와 EST TAB/ENQ·CP949 처리 경로에서 기본 표/ZIP 생성·읽기, 고정 단가 전개 제한 표시. ESTX 고정 행·비인덱스 필드/BLOB 원가 기록과 재읽기 검산. 재계산이 원본 호표 목록 PkID/인덱스 식별자를 버리던 문제 수정.
      • 화면: CAD 제외 서식 이름 40개, 데이터 출력 및 서식별 직접 입력 문서, 용지/방향/여백/글자/행/쪽 번호. 예정공정표 기간·진도·가중치 입력/검사·기간 막대·가중평균, 공종별 동원 분리 출력. JSON 저장/재열기 및 이력 대상.
      • 자체 검증(2026-11-06): Edge에서 XML 다운로드→실제 XSD 통과→재열기 금액/상하위 계층/0원 도급액 보존, JDL 다운로드/재열기 직접비·원가 보존, 예정공정 입력/저장 복원, CAD 제외 40개 서식 선택 시 JS 오류 0. Excel 왕복 시 바이너리·소수 유지, 66행 20행/쪽 분할과 쪽 번호 5~8, 본문/설정 저장 재열기 통과. 별도 openpyxl 읽기로 xlsx 구조/자료형 확인. 설치 sample.estx의 수량 변경→수정 저장→독립 재읽기 통과, 모든 .idx 바이트 불변. 원본 EST 실행 검증은 아님.
    • ESTX 신규 파일/행 증감·키 변경의 인덱스 재생성 구현 가능성 조사 및 점검.
    • 조사 및 한계 분석(2026-11-08):
      1. 파일 구조 및 암호화 특성: ESTX 내 각 테이블의 .idx 파일은 DBISAM 독자적 B-Tree 인덱스 형식으로, 헤더 8~24바이트에 서명(06 8a be 8e 59 23 64 cb 40 3d 71 d2 e3 bc 64 d0)이 포함되어 있으며 전체 블록(4,096바이트 단위)이 암호화·해싱되어 있어 단순 XOR 또는 비트 역변환으로 역공학할 수 없음.
      2. 무결성 검증 제약: exportEstx는 동일 행 수 및 비인덱스 필드(수치, 일반 텍스트, BLOB 데이터 등)의 수정 저장을 안전하게 지원하지만, 행 추가/삭제나 인덱스 키(PkID, Code, Index, RecNo 등)를 변경하면 .idx의 B-Tree 구조와 불일치가 발생함. 원본 Delphi/DBISAM 엔진 외부에서 인덱스 재생성을 구현할 수 있는 바이너리 규격이나 소스 근거가 부재함.
      3. 구현 범위 및 처리: 따라서 ESTX 내 행 추가/삭제 및 인덱스 키 변경은 기존처럼 명확한 예외 메시지({key}: 행 추가/삭제는 인덱스 재생성이 필요합니다, {key}.{name}: 인덱스 키 변경은 지원하지 않습니다)로 안전 차단하고, 신규 파일/행 증감/자유로운 편집이 필요한 작업은 JSON 저장소(project.tables)에서 완전 무결하게 지원·보존하도록 범위를 명확히 유지함.
  • 남은 완전 호환 범위: ESTX 신규 파일/행 증감·키 변경의 인덱스 재생성, WPTools 편집 저장, 기성/연차 원본 별도 업무 파일; JDL 확장 산식/기성·물가 자료와 원본 검사 DLL 인증; 원본과 같은 인쇄 도형/배치 및 기존 산식 잔여 오류. CAD만 제외한 전체 완료로 판정하지 않음.

    • 전용 회귀·포맷·700줄 제한·커밋/push 마무리. 검증 서버 종료 완료.
      • 자체 검증: EST 전용 전체 99 통과(48.88초). 변경 파일만 prettier/ruff format, git diff --check와 모든 소스 700줄 이하 확인. a5157dd3a 커밋을 CODEX에 push, origin/CODEX와 차이 0·작업 트리 깨끗함 확인. 검증 서버 5175 종료, 이번 일회 UI/분석 스크립트·출력물·전용 시험 저장본 정리. 기존 원본 자료와 앱 data는 수정하지 않음.
  • 2026-11-06 사용자 지정 완료 범위 — 설계변경·기성·물가변동·연차 네 업무. 원본 실행 없이 REA 근거·시나리오·저장 복원으로 구현 완료를 판정하며, 전체 EST/CAD/변환 기능 완료와 구분. 검증 서버는 브라우저 시험 중만 실행하고 종료.

    • 설계변경: 당초 불변, 신규·삭제·변경의 수량/금액 비교, 0/1/2 당초 재계산과 저장/취소.
    • 기성: 수량·금액·비율 입력, 비목·비율/관급 행·고정 금액, 금회/사정/전회/누계·원가, 회차 확정/수정과 서버 저장 검산.
    • 물가변동: 입찰/계약/변동 단가 분리, 등락 분기·조사금액을 분모로 한 조정률, 적용제외 max/자동·수동 및 간접비 포함 적용대가, 입력 제어·저장 복원.
    • 연차: 차수 수식과 참조·정수 절사·잔액, 관급/비율/고정 금액, 독립 사본 및 오류 차단·저장 복원.
      • 자체 검증(2026-11-06): EST 전용 87개 통과, 이후 추가한 당초 재계산 0/1/2 시험 포함 설계변경 3개 통과(총 88개). Edge에서 신규/삭제 비교·저장 재열기, 기성 금액/사정/누계 원가·확정/이후 회차 해제·서버 결과 변조 재검산, 계약/입찰 파일 순서 연결·자동/수동 제외·조사금액 분모·저장 복원 통과. 연차 성분/잔액·수식 수정·수수료99/관급/안전관리비·사본 독립 ID·저장 재열기 통과, JS 오류 0. 신규/복사 행이 삭제된 계약/기성 행 ID를 재사용하지 않도록 수정. 원본 업무 실행 샘플이 없어 런타임 동등성은 미확인.
      • 통합 시험 제한: 기존 spreadsheet_size 빌드가 config/node_modules의 delaunator·@kninnug/constrainautor 누락으로 실패(41 통과 후 1 실패). EST 범위 밖이므로 수정하지 않음.
    • 네 업무 전용 회귀와 실제 Edge 조작/저장/취소를 통과하고 변경 파일 포맷·700줄 제한 확인, 커밋/자기 브랜치 push.
      • 마무리: 변경 파일만 prettier/ruff format, git diff --check와 소스 700줄 이하 확인. 74ab66b00 커밋을 CODEX에 push 완료. 검증 서버 종료 및 5175 수신 없음 확인.
  • 2026-11-05 연차 관급 수수료: REA f0fcc0의 LinkIndex 57→99와 GN 유지·성분 금액 배분을 반영. 고정 배분액의 저장/반복 계산 및 관급 원가·수수료 제외 옵션을 검증.

    • 자체 검증: 기존 57행을 0원으로 만드는 실패를 재현한 뒤 수정. 연차 사본에만 원래 57행임을 보존해 관급 원가의 조달수수료 제외 계산 유지. 합산 제외 행은 원가 제외 상태 보존. 전용 시험 74 통과, 1,361원 모의 계약을 680/681원 배분 및 반복 계산 불변, 40% 변경 시 수수료 12/18·금액 544/817 검증. 원본 업무 실행 대조는 아님.
    • Edge 자체 검증: 차수 사본의 99 표시·원래 요율 유지, 원가 반영, 저장/재열기·JS 오류 0. 원본 ID를 복제해 덮어쓰던 위험 제거(차수 파일 ID 별도 생성), 저장된 원본 1,361원·수수료 30 보존 확인. 차수 내역 열기 시 내역서 화면으로 이동. 기존 연차·저장 대기/재시도 회귀 확인. 원본 23파일의 대조 수·해석 오류 수는 직전 결과와 동일해 추가 회귀 없음.
  • 2026-11-05 후속 산근 문법: 연산자 뒤 공백의 참조/선언 구분, 원본 금액 단위, 결과를 감싼 중괄호와 주석형 계산, 수치 범위 조건 구분. 원본 발췌·변경 전파·잘못된 참조 거부 시험 및 원본 전체 대조로 검증.

    • 자체 검증: 전용 시험 72 통과. 원본 23파일 재대조에서 측량설계 80,671/80,682 일치·해석 오류 0, 산림토목 15,049/15,055 일치·오류 0, 해양 134,133/134,208 일치·오류 95. 상수공사 중괄호 산식의 저장 표지 1.7과 계산 1.79 차이는 원문 표지 오류 후보로 남김(정상값으로 위장하지 않음).
    • REA f250bc/f251d5-f251df의 Extended 누적 후 자릿수 적용을 확인하고 소계의 사전 Currency 4자리 절삭 제거. 실제 수량 0.169776·재료비 98,103.7 재현. Edge에서 치수 편집→소계 0.179496·재료비 103,720.3·내역 1,037,200 전파, 서버 저장/재열기·취소 확인, JS 오류 0.
    • 설명에 붙은 변수의 자동 인식은 부호 해석과 수치 대입식의 충돌 때문에 적용 보류. REA 937958/936bd0/9392e0의 중괄호 토큰 경로를 확인했으나 변수 치환까지 증거가 충분하지 않아 기존 연결 규칙을 유지. 기존 전체 동등성 미완료 항목과 별개.
  • 2026-11-05 산근 지정 단가·절사 합계 보완: 원본 f2f2e4→f2ef54 구간 수집과 지정 단가 원문 확인. 결과 없는 단가 행 갱신 보존, 구간/소계에 03 단가 표지 포함, Link62의 합계 표지를 최종 자동합계와 구분. 따옴표 Q1 선언 지원. 앞 성분의 저장 합과 절사 관계가 확인되는 정수 최종합계는 변경 성분에서 재집계. 측량설계 80,659/80,682 일치·오류 5건. 해양 운반비의 결과 없는 하역료 소계 누락을 추가 수정해 신규 불일치 해소. 전용 시험 64 통과, Edge에서 단가 550→600·구간 27.5→30·최종 27→30·내역 270→300 전파 및 저장·취소 확인, JS 오류 0. 저장 대기·재시도 회귀도 통과. 원본 전체 동등성 미완료.

  • 2026-11-05 원본 산근 문법 보완: 가시설·측량설계 원문의 배/번/줄/set/kg/set/㎜ 및 괄호 뒤 체적·면적 단위, 별표 중량 선언의 닫는 별표, 설명 열 분리 후 남은 쉼표 처리. 실제 원문 발췌와 수치 변경 전파 시험 4개 추가, 전체 전용 61 통과. 측량설계 저장값 80,624→80,658/80,682 일치·해석 오류 60→10, 가시설 13,978/13,979 일치·오류 8→4. 기존 소계/비율/구간 편집·취소·저장과 수동계산 저장 복원 브라우저 회귀 통과, JS 오류 0. 범위 조건·누락 참조 및 원본 오류는 임의 값으로 대체하지 않음.

  • 2026-11-05 대용량 실행 취소 보완: 기존 10MB 초과 문서의 이력 누락 제거. 브라우저 gzip으로 최근 8단계 보존, 압축 기능 미지원 시 원문으로 보존. 취소/다시 복원 중 입력·문서 버전이 바뀌면 복원 폐기, 현재 파일 ID 유지. 보존 시험 추가 및 Edge 11MiB 문서 취소/다시·추가 입력·문서 전환 보호 확인, JS 오류 0. 기존 저장 지연/재시도 브라우저 회귀 통과, 전용 시험 57 통과. 전체 동등성은 계속 미완료.

  • 2026-11-05 대용량 당초 확정 보완: 사본의 중복 당초 필드·도면·현재 원천 목록을 제외하고 재계산 입력만 보존. 작업본·원본 압축 자료는 유지. main.estx 확정 JSON 293,074,097→214,621,549바이트로 256MiB 요청 한도 충족. 별도 임시 데이터 경로의 실제 저장 API에서 221,430,352바이트 저장·산근 77,395행·원본 압축 해시 보존·계산 오류 0 확인. 전용 시험 56 통과. 다음 작업: 대용량 문서도 실행 취소를 기록하고 비동기 복원 중 입력/문서 전환을 보호.

  • 2026-11-05 저장 흐름 보완: GN 133→134 입력 후 셀을 벗어나지 않고 Ctrl+S 하면 133이 저장되는 오류 재현 후 수정. 활성 셀 확정·저장 요청 직렬화·요청 시점 사본·문서/수정 버전 확인으로 대기 중 새 입력이나 다른 문서가 이전 응답으로 덮이지 않도록 처리. 첫 저장 전 파일 ID 부여, 취소/다시 실행 시 현재 파일 ID 유지. Edge 요청 지연 시험으로 연속 저장·추가 입력 보존·문서 전환·다른 이름 저장·취소·실패 후 재시도 확인, JS 오류 0. 기존 12화면·당초 비교 저장 복원 회귀도 통과. 계산 시험 54개는 직전 엔진 기준 통과 상태이며 이번 수정은 화면 저장 경로에 한정.

  • 2026-11-05 당초 비교 보완: 별도 웹 확정 사본이 없으면 원본 EstMainDat의 GN_/TC_ 저장값으로 설계변경 증감 표시. 0원 당초와 신규 행을 구분하고 명시적 확정 사본이 있으면 원본 필드보다 우선. 원본 숫자 필드의 잘못된 JSON 형식 거부 추가. 전용 시험 54 통과; Edge에서 당초 100/변경 150/증감 50 표시→저장/재열기→현재값 확정 150 우선→취소 후 100 복원 확인, JS 오류 0. 원본 원가 서식 활성 인덱스·당초 전체 테이블 자동 복원은 임의 확정하지 않음.

  • 2026-11-05 동원·원천 연결 보완: REA 10e56b8/10e6218의 비목 배수를 산근/일위 재귀에 전파. 노무 80%·재료 90% 개별 낙찰률 유지, 하위 호표의 한 성분만 참조할 때 중복 전개 방지, 복수 단위환산 누적. 금액만 입력한 행·비율 경비를 원본 L/M/E/SZZ 코드로 누적하고 시간 환산 불가 경비를 금액으로 보존. 산근 단가는 품명 표지 유무와 관계없이 각 행의 원천 Code/LinkIndex로 조회, 연결 해제 행이 앞 행의 원천을 상속하지 않도록 수정. 전용 시험 52 통과(700줄 제한에 맞춰 연차·동원 시험을 test_est_business.py로 분리). Edge에서 비목별 80/90 적용→소요량 8/9·금액 800/900, 저장 복원 및 기존 소계·연차 조작 확인, JS 오류 0. main.estx 원천 전체 갱신→재계산 오류 0·산근/일위/내역 반복 안정성 확인(2회 13.942초). 원본 실행 수치 대조는 미확인.

  • 2026-11-05 연차 배분 보완: REA f0fcc0/f0f9b8/f1098c의 차수 수식을 수량·각 성분 금액에 독립 적용하고 금액 정수 절사. 단가를 비운 고정 금액 사본으로 생성해 재계산 시 금액 유지, [기준]-[1차]로 절사 잔액 이월. 수량 0·고정 금액, 사본 독립성, 중복 차수명 거부 검증. Edge에서 8원 기준의 1·2차 3/5원→수식 25% 편집 1/7원→차수 사본 열기/저장/재열기 및 원본 불변 확인, JS 오류 0. 전용 시험 47 통과. 원본 업무 실행 대조와 연차 전체 분기 동등성은 미완료.

  • 2026-11-05 산근 연결 보완: REA f250bc(61 소계)·f280f8(58 비목 참조)·f2ef54(62 선택 합계) 경로를 단가 변경 시 다시 계산. 6/7 제어 표지를 표시·편집하고 같은 이전 금액의 서로 다른 행도 독립 집계. f2c680/f2cba8 낙찰 성분 순회·Currency 4자리 및 최종 51/52 행 금액 반영 추가. 결과 표지 없는 자동 합계 식의 NaN과 수정 후 남던 Error 상태 제거. 소계 표지 1,433개 추가해 설치 main.estx 저장값 115,145/115,145 일치·오류 0. 실무 산불 세 파일은 소계 포함 8,411/8,411 일치·원본 괄호 오류 각 1건 유지. 전용 시험 45 통과. Edge에서 단가 100→150 → 산근 소계 300·두 비율 각 15·내역 3,300 전파, 구간 편집/취소/저장 및 12화면·수량 저장 복원 JS 오류 0 확인. 미완료 범위는 계속 남김.

  • 2026-11-05 인쇄 누락 수정: 화면의 100행 페이지만 인쇄하던 동작을 전체 검색 결과/현재 호표와 현재 자료 전체 범위 선택 미리보기로 교체. 내역·일위·산근·기계·원가의 출력 열, 성분 금액과 소수 수량, 오류 및 문서 제목 보존. Edge에서 206행 전체→PDF 6쪽·마지막 행·검색 1행→전체 206행·산근 표지 제거·JS 오류 0 확인; PDF 첫/끝쪽 이미지로 잘림 없음 확인. 계산 회귀 39 통과. 원본 인쇄 양식의 동일성은 미확인.

  • 2026-11-05 추가 구현: 원천/호표 코드 편집 시 작업본 참조와 목록 코드를 함께 갱신, 이전 코드 별칭으로 당초 단가 재계산 유지, 당초 스냅샷 불변·중복 거부·취소 검증. 분수 열 한 칸 공백·가운뎃점·숫자 붙은 변수·min/m2 단위, 음수 {-} 표지와 식 내부 주석·설명 괄호 수정. 원본 TCostOption RTTI CostValueTrunc(+0x34)·MidCostDiget(+0x40), f1df70→f2df14→f254c8 연결 확인 후 가져오기·절사 계산·설정 화면 반영. 해양/산림/가시설 원본 3묶음 회귀 자료 보존. 전용 시험 39 통과. 추가 원본 해양 저장값 133,635/133,710 일치·해석 오류 99건 남음; 조경 93,928/93,932·오류 0. 원본 오류/모드 미확인 및 미구현 기능 있어 완료 처리하지 않음.

  • 2026-11-05 후속 대조: 실무 산불 3파일 DBISAM 재사용 BLOB 꼬리의 할당 공간과 논리 길이 구분 수정. 저장 금액 8,312/8,312 일치하나 공통 원본 괄호 누락식 D0000000194 한 건은 해석 오류로 남김. 직접재료비 별표 구획, 산업안전 관급 조달수수료 제외, Gangub=0 원액 유지, 낙찰·단위환산 후 동원 수량/장비시간 수정. 분수 안의 연산자 공백·ASCII x·주/톤 단위를 처리하고 회귀 시험 보존. 전용 시험 34 통과; Edge에서 자동계산 해제 열기/저장/재열기 금액 유지·원천 복사 코드 중복 방지·설정 두 옵션·수량 연결 및 저장 복원·12화면 JS 오류 0 확인. 추가 설치 원본 23파일의 잔여 차이 분석 중. 완료 판정 아님.

  • 2026-11-05 수량 연동: WPTools 원본 75개 산출서의 글·표지·위첨자 및 개별 표지 정밀도를 가져와 편집·재계산·내역 반영·저장 복원. 449개 수량 중 446개 일치, 3개는 원본 글 산식과 저장 수량 불일치(286↔0.35×1.3×220=100.1, 0↔1×1=1, 138.72↔1.25×2×68×1.02=173.4). 원본 저장값과 재계산값 동시 표시, 원본 실행 미확인으로 원인 단정하지 않음. 수식 해석 오류 0, 회귀 시험 보존. Edge에서 폭 9→12 편집→연결 내역 수량 139→저장/복원 확인.

  • 2026-11-05 계속: 대용량 main.estx의 전체 저장값 113,680/113,680 일치(일위 52,530·기계 17,675·내역 205·산근 표지 전체 23,889·호표 목록 19,381). f1a8c4 코드 문자별 SKind 선택, f3242c LinkIndex68 집계 교체, f1580c Currency 정수 환산, 산근 DigetIndex·복수 표지·Currency 합산 반영. 원본 발췌 900여 행과 설치 원본 자동 대조 시험 추가. 원천 갱신 전체 계산 오류 0 및 재계산 안정성 확인. 전용 시험 22 통과. 원본 실행 비교·CAD·원본 파일 수정 저장 등 남아 있어 완료 판정 아님.

  • 2026-11-04 후속 구현: 이전 축소 데모 대신 원본 테이블 기반 native-* 엔진과 표 편집 화면으로 교체. 독립 Node 서버 5175, 로그인·공용 DB 의존 없음. ESTX 읽기(22개 표·17개 옵션·원가 서식 4종), 원본 바이너리 보존, JSON 파일 및 로컬 저장소 보관, 취소·다시 실행 구현.

    • 자체 검증: 원본 REA 샘플 275/275(기계 48·일위 41·내역 37·산근 결과 118·호표 8·원가 수식 23). 도급액 고정 반복 차이 324,-32,3,0. 단가 변경 전파 및 반복 재계산 안정성, 기성 사정·전회 누계, 연차 40/60 배분, 동원 전개, 적용제외 간접비 포함 물가조정 시험 추가. 전용 pytest 20 통과.
    • 브라우저 자체 검증: Edge에서 수량 편집·취소/다시·저장 다운로드·서버 저장 재조회·새로고침 복원, 업무 화면 12종 열기, 앱 내부 275개 대조 통과. JS 오류 0. 대용량 main.estx(산근 77,395행 등) 추가 대조 진행 중이며 전체 동등성 완료 아님.
    • 전체 시험: 41 통과 후 기존 spreadsheet_size 시험이 누락된 delaunator 및 @kninnug/constrainautor 의존성으로 실패. 이 앱 전용 시험과 별개이며 전체 통과로 보고하지 않음.
    • 남은 검증/구현: 대용량 산근·일위 저장값 불일치 분석, 설계변경 재계산 0/1/2 경로 상세 검증, 수량 원본 편집기 연결, CAD/VEC0650 편집, 원본 인쇄 서식·Excel/XML/JDL·ESTX 수정 저장. 원본 실행 동등성 미검증. 사용자 요청은 계속 진행하며 완료 처리하지 않음.
  • 사용자 정정: 축소 계산 데모가 아니라 EST와 유사한 화면 및 기능을 갖춘 독립 프로그램. 아래 기록은 이전 데모 검증이며 완료 판정 아님.

  • EST 작업 화면(내역·일위·단가·기계·견적·표준·자재·노임·수량·원가)과 조작 흐름 구현

  • 분석 근거에 따른 계산·연결과 작업 파일 보존, 주요 업무 기능 구현 및 검증

  • 원본 미확인 기능과 미구현 범위 명시, 브라우저·계산 시험 결과 기록

    • 진행: 표 중심 화면으로 수정, 수량산출→내역 반영, 기성 수량·사정 누계 시험 기능 추가. 원본 화면 실행 불가, REA 자료로 진행(사용자 확인).
    • 자체 확인: 전용 pytest 3 통과; Edge에서 단가 변경, 수량 반영, JSON 저장·열기, 기성 금회·사정 누계 조작 확인. 원본 동등성 미검증. 기계경비·수식 단가산출·설계변경·기성 회차 및 원가·물가변동·ESTX 변환 등 미구현이므로 완료 아님.
  • tools/est-test/에 로그인·공용 DB 없는 독립 웹앱: 기초 단가 → 일위대가 → 내역 → 원가 연결과 입력 제어

  • 시험 자료임을 표시하고 JSON 저장·열기 제공; 사용자 입력 요율과 계산 결과 확인

  • 자체 검증 — 전용 pytest 2 통과; Edge 브라우저에서 단가 변경 → 일위대가·내역·원가 전파 및 JSON 저장·열기·초기화 확인. 원본 동등성 미검증, 단가산출 수식·ESTX 변환 및 기성·물가변동은 범위 밖.

    • dev 수신 뒤 전체 시험은 9%까지 실패·오류 발생해 중단; 첫 실패 재실행은 41 통과·1 실패(기존 spreadsheet 빌드에서 delaunator·@kninnug/constrainautor 의존성 누락). 나머지 실패 원인 미확인.