# -*- coding: utf-8 -*- """lawapi.json에서 정확명 매칭 행을 뽑아 시행일/개정일 맵 생성 + 수동 보정.""" import json from pathlib import Path import os as _os from pathlib import Path as _P # 이 스크립트는 original/_pipeline/ 에 위치. 코퍼스 루트 = 상위 폴더. ROOT_DIR = _P(__file__).resolve().parent.parent # ...\original DATA_DIR = _P(__file__).resolve().parent / "data" # 생성 데이터(JSON) # API 키: 커밋 금지 파일(law/.secrets.local.md) 또는 환경변수에서 읽는다. def _load_key(name): v = _os.environ.get(name) if v: return v.strip() sec = ROOT_DIR.parent / ".secrets.local.md" if sec.exists(): import re as _re for pat in (r"KCSC[\s\S]*?`([A-Za-z0-9]{20,})`", r"인증키[:\s]*`?([A-Za-z0-9]{30,})`?"): m = _re.search(pat, sec.read_text(encoding="utf-8")) if m: return m.group(1) return "" OUT = Path(str(DATA_DIR)) api = json.load(open(OUT / "lawapi.json", encoding="utf-8")) # 목록상 명칭 -> API 조회명 (다르면 매핑) Q = { "산림자원의 조성 및 관리에 관한 법률": "산림자원의 조성 및 관리에 관한 법률", "산림자원의 조성 및 관리에 관한 법률 시행령": "산림자원의 조성 및 관리에 관한 법률 시행령", "산림자원의 조성 및 관리에 관한 법률 시행규칙": "산림자원의 조성 및 관리에 관한 법률 시행규칙", "산림기술 진흥 및 관리에 관한 법률": "산림기술 진흥 및 관리에 관한 법률", "산림기술 진흥 및 관리에 관한 법률 시행령": "산림기술 진흥 및 관리에 관한 법률 시행령", "산림보호법": "산림보호법", "산지관리법": "산지관리법", "자연환경보전법": "자연환경보전법", "자연재해대책법": "자연재해대책법", "환경영향평가법": "환경영향평가법", "보조금 관리에 관한 법률": "보조금 관리에 관한 법률", "국가를 당사자로 하는 계약에 관한 법률": "국가를 당사자로 하는 계약에 관한 법률", "국가를 당사자로 하는 계약에 관한 법률 시행령": "국가를 당사자로 하는 계약에 관한 법률 시행령", "지방자치단체를 당사자로 하는 계약에 관한 법률": "지방자치단체를 당사자로 하는 계약에 관한 법률", "지방자치단체를 당사자로 하는 계약에 관한 법률 시행령": "지방자치단체를 당사자로 하는 계약에 관한 법률 시행령", "도로법": "도로법", "농어촌도로정비법": "농어촌도로 정비법", "국토의 계획 및 이용에 관한 법률": "국토의 계획 및 이용에 관한 법률", "도로명주소법": "도로명주소법", "도로명주소법 시행령": "도로명주소법 시행령", "측량ㆍ수로조사 및 지적에 관한 법률": "공간정보의 구축 및 관리 등에 관한 법률", "산업안전보건법": "산업안전보건법", "산업재해보상보험법": "산업재해보상보험법", "고용보험 및 산업재해보상보험의 보험료징수 등에 관한 법률": "고용보험 및 산업재해보상보험의 보험료징수 등에 관한 법률", "고용보험 및 산업재해보상보험의 보험료징수 등에 관한 법률 시행령": "고용보험 및 산업재해보상보험의 보험료징수 등에 관한 법률 시행령", "고용보험법 시행령": "고용보험법 시행령", "국민건강보험법": "국민건강보험법", "국민연금법": "국민연금법", "노인장기요양보험법": "노인장기요양보험법", "노인장기요양보험법 시행령": "노인장기요양보험법 시행령", "부가가치세법": "부가가치세법", "근로기준법": "근로기준법", "산업표준화법": "산업표준화법", "전자서명법": "전자서명법", "공동주택관리법": "공동주택관리법", "임도설치 및 관리 등에 관한 규정": "임도설치 및 관리 등에 관한 규정", "훈령ㆍ예규 등의 발령 및 관리에 관한 규정": "훈령·예규 등의 발령 및 관리에 관한 규정", "사업종류별 산재보험료율 고시": "사업종류별 산재보험료율", "건설업 산업안전보건관리비 계상 및 사용기준": "건설업 산업안전보건관리비 계상 및 사용기준", "(국토교통부) 사회보험의 보험료 적용기준": "사회보험의 보험료 적용기준", "엔지니어링사업대가의 기준": "엔지니어링사업대가의 기준", } # 조회명이 목록명과 다른 경우 실제 API 반환명 지정 EXACT = { "농어촌도로정비법": "농어촌도로 정비법", "측량ㆍ수로조사 및 지적에 관한 법률": "공간정보의 구축 및 관리 등에 관한 법률", "훈령ㆍ예규 등의 발령 및 관리에 관한 규정": "훈령ㆍ예규 등의 발령 및 관리에 관한 규정", "사업종류별 산재보험료율 고시": "2026년도 사업종류별 산재보험료율", "(국토교통부) 사회보험의 보험료 적용기준": "(국토교통부) 사회보험의 보험료 적용기준", } SRC_LAW = "국가법령정보센터" m = {} for name, q in Q.items(): rows = api.get(q, {}).get("rows", []) want = EXACT.get(name, name) hit = next((r for r in rows if r["명"] == want), None) or next( (r for r in rows if r["명"].startswith(want)), None ) if not hit: print("!! 미매칭", name, "|", [r["명"] for r in rows][:3]) continue m[name] = { "시행": hit["시행"], "개정": hit["공포"], "구분": hit["제개정"], "호수": hit["번호"], "종류": hit["종류"], "출처": SRC_LAW, "실명": hit["명"], } # ── 2·3차 조회 결과 및 별표·비수록 항목 수동 등록 ── MANUAL = { "국가균형발전특별법": ( "2026.07.01", "2026.03.05", "일부개정", "21447", "법률", SRC_LAW, "폐지·승계 → 「지방자치분권 및 균형성장에 관한 특별법」", ), "수치지도 작성 작업규칙": ( "2015.06.04", "2015.06.04", "일부개정", "00209", "국토교통부령", SRC_LAW, "", ), "재난구호 및 재난복구 비용 부담기준 등에 관한 규정": ( "2025.11.28", "2025.11.27", "일부개정", "35875", "대통령령", SRC_LAW, "「자연재난 구호 및 복구 비용…규정」으로 분리 (사회재난분 별도 35876)", ), "임도 품셈 적용기준 / 임도표준품셈": ( "2026.01.01", "2025.11.26", "전부개정", "2025-82", "고시", SRC_LAW, "현 「산림사업 표준품셈」(산림청 고시)", ), "건설공사 감독자 업무 지침": ( "2026.07.08", "2026.07.08", "일부개정", "2026-360", "고시", SRC_LAW, "현 「건설공사 사업관리방식 검토기준 및 업무수행지침」", ), "공사장의 비산분진 발생원 시설관리기준": ( "2026.07.15", "2026.07.15", "일부개정", "00049", "환경부령", SRC_LAW, "「대기환경보전법 시행규칙」 별표에 수록", ), "국가지점번호판 규격 등 고시": ( "2024.07.05", "2024.07.05", "제정", "2024-56", "고시", SRC_LAW, "「국가지점번호의 표기 및 국가지점번호판의 설치 확인에 관한 업무 위탁 고시」", ), "국가지점번호 부여기준 및 방법": ( "2012.12.18", "2012.12.12", "제정", "2012-55", "고시", SRC_LAW, "「국가지점번호 기준점 고시」", ), "입찰유의서(계약예규)": ( "2025.12.31", "2025.12.31", "일부개정", "", "계약예규", SRC_LAW, "「(계약예규) 공사입찰유의서」", ), "콘크리트 표준시방서": ( "2025.01.05", "2024.12.30", "일부개정", "2025-879", "고시", "국가건설기준센터", "KCS 14 20 00 (국토교통부 고시로도 수록)", ), "도로공사 표준시방서": ( "2023.01.12", "2023.01.06", "일부개정", "2023-907", "고시", "국가건설기준센터", "KCS 44 00 00", ), "토목공사 표준시방서": ( "2023.01.25", "2023.01.19", "일부개정", "2023-48", "고시", "국가건설기준센터", "현 KCS 10 00 00 공통공사 표준시방서로 재편", ), "건설공사 표준시방서": ( "2018.08.09", "2018.08.03", "제정", "2018-468", "고시", "국가건설기준센터", "건설기준 코드(KDS/KCS) 체계로 통합", ), "건설공사 비탈면 표준시방서": ( "", "", "", "", "", "국가건설기준센터", "KCS 11 70 00 비탈면 (법령정보센터 미수록)", ), "임도시설공사 표준시방서": ( "", "", "", "", "", "산림청", "법령정보센터·건설기준센터 모두 미수록", ), "산림관리기반시설의 설계 및 시설기준": ( "2026.02.01", "2026.02.01", "", "", "별표", SRC_LAW, "「산림자원법 시행규칙」 별표2에 수록", ), "산림관리기반시설의 범위 및 기준": ( "2026.02.01", "2026.02.01", "", "", "별표", SRC_LAW, "「산림자원법 시행규칙」 별표1에 수록", ), "산림관리기반시설의 타당성평가 항목별 기준 및 방법": ( "2026.02.01", "2026.02.01", "", "", "별표", SRC_LAW, "「산림자원법 시행규칙」 별표1의2에 수록", ), "지방산림청과 자연휴양림관리소와의 자연휴양림업무 처리지침": ( "", "", "", "", "지침", "산림청", "법령정보센터 미수록", ), "중기운용관리예규 / 차량관리예규": ("", "", "", "", "예규", "산림청", "법령정보센터 미수록"), "예산편성기준": ( "", "", "", "", "지침", "기획재정부", "「예산안 편성 및 기금운용계획안 작성지침」 — 법령정보센터 미수록, 기재부 연간 배포", ), "토목공사원가계산 제비율 적용기준": ( "", "", "", "", "기준", "조달청", "법령정보센터 미수록, 조달청 연간 발표", ), } for k, v in MANUAL.items(): m[k] = { "시행": v[0], "개정": v[1], "구분": v[2], "호수": v[3], "종류": v[4], "출처": v[5], "실명": "", "추가": v[6], } json.dump(m, open(OUT / "srcmap.json", "w", encoding="utf-8"), ensure_ascii=False, indent=1) print(f"매핑 {len(m)}건 생성")