feat(816-3): 체인톱 시간당 기계경비 GF000337 · 체인톱에 이어진 기계 줄 시간당 = 1 일 1 대당 ÷ 8
- 새 로직 파일 산림품셈 02장(차례 0) GF000337 — GF000076 체인톱 줄(2-1-1 휘발유 · 체인오일 · 잡품 · 2-2-1 손료) × 시간환산 · 수식 문서 빌더 변환(옛 엔진 = 새 계산기) - M02_Machine_Hourly 기계 줄만의 식 고름 = 기계 줄 값(가격 · 손료계수)을 읽는 기계경비식 - 별칭 값은 사용자 몫(마스터에 안 넣음) · 인치 따옴표 통째 별칭은 master_alias 그대로 깨지지 않음(시험 = 임시 별칭) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -68,15 +68,15 @@ def logic_of(code: str) -> dict | None:
|
|||||||
|
|
||||||
|
|
||||||
def _own(code: str) -> dict | None:
|
def _own(code: str) -> dict | None:
|
||||||
"""그 기계만의 시간당 경비 식(816-1 · 4륜구동 1톤 덤프트럭 = GF000145) — 「기계」 입력 없는
|
"""그 기계만의 시간당 경비 식(816-1 · 4륜구동 1톤 덤프트럭 = GF000145 · 816-3 체인톱 = GF000337) —
|
||||||
기계경비식이 그 원문번호 기계 줄 가격(`EQ….가격`)을 읽으면 그 식 · 없으면 None."""
|
「기계」 입력 없는 기계경비식이 그 원문번호 기계 줄 값(`EQ….가격` · `EQ….손료계수`)을 읽으면 그 식."""
|
||||||
rows = store.loaded()[1].index.get("EQ", {}).values()
|
rows = store.loaded()[1].index.get("EQ", {}).values()
|
||||||
prices = [f"{r.get('키')}.가격" for r in rows if code and str(r.get("원문번호")) == code]
|
keys = [f"{r.get('키')}." for r in rows if code and str(r.get("원문번호")) == code]
|
||||||
for data in store.loaded()[0].values():
|
for data in store.loaded()[0].values():
|
||||||
for row in data.get("줄") or [] if data.get("그룹") == "로직" else []:
|
for row in data.get("줄") or [] if data.get("그룹") == "로직" else []:
|
||||||
if (row.get("부품") or {}).get("갈래") != "기계경비식" or takes_machine(row):
|
if (row.get("부품") or {}).get("갈래") != "기계경비식" or takes_machine(row):
|
||||||
continue
|
continue
|
||||||
if any(p in str(row.get("중간")) for p in prices):
|
if any(k in str(row.get("중간")) + str(row.get("호표")) for k in keys):
|
||||||
return row
|
return row
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"다음": {"LB": 409, "EQ": 656, "RT": 20, "MN": 7000, "MT": 30719, "MO": 74, "MP": 364, "FX": 6, "CF": 159, "QF": 477, "GF": 337, "CC": 528, "GC": 1195, "QC": 2060, "GX": 5, "UA": 38},
|
"다음": {"LB": 409, "EQ": 656, "RT": 20, "MN": 7000, "MT": 30719, "MO": 74, "MP": 364, "FX": 6, "CF": 159, "QF": 477, "GF": 338, "CC": 528, "GC": 1195, "QC": 2060, "GX": 5, "UA": 38},
|
||||||
"폐기": {"MT000001": "자재품목 휘발유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000002": "자재품목 경유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000003": "자재품목 선박용경유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000004": "자재품목 중유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000005": "자재품목 등유 — 값이 비고 글뿐 · 유가 테이블로 감", "LB000399": "이름 「〃」 — 직종이 아니라 되풀이 기호 · 소요량 13-6-9 에서 윗줄 직종으로 바로잡음", "MN": "재료_나라장터자재 — old 로 옮김 · 로직은 자재품목·품셈재료로 갈아 끼움", "LB000372": "미확보 고급기능사 — 측량노임 항공사진고급기능사 옛이름으로 옮김", "LB000393": "미확보 리베팅공 — 건설노임 철골공 옛이름으로 옮김(2010 통합표 연번10)", "LB000405": "미확보 Belt Conveyor 설치공 — 품셈 13-10-1 주② 배분으로 다섯 직종에 나눔", "MT000006": "자재품목 전력 — 재료_유가전력 전력 줄로 감", "MT000007": "자재품목 전력 — 재료_유가전력 전력 줄로 감", "LB000368": "미확보 기술사 — 기술사(건설) 옛이름으로 옮김", "LB000369": "미확보 특급기술자 — 특급기술자(건설) 옛이름으로 옮김", "LB000370": "미확보 고급기술자 — 고급기술자(건설) 옛이름으로 옮김", "LB000361": "미확보 중급기술자 — 중급기술자(건설) 옛이름으로 옮김", "LB000364": "미확보 초급기술자 — 초급기술자(건설) 옛이름으로 옮김", "LB000365": "미확보 고급숙련기술자 — 고급숙련기술자(건설) 옛이름으로 옮김", "LB000366": "미확보 중급숙련기술자 — 중급숙련기술자(건설) 옛이름으로 옮김", "LB000367": "미확보 초급숙련기술자 — 초급숙련기술자(건설) 옛이름으로 옮김", "LB000389": "미확보 기계기사 — 초급기술자(기계·설비) 옛이름으로 옮김", "LB000388": "미확보 기계산업기사 — 초급숙련기술자(기계·설비) 옛이름으로 옮김", "MO000055": {"원문번호": "주택용저압:기본_200이하", "파일": "재료_유가전력.json"}, "MO000056": {"원문번호": "주택용저압:기본_201~400", "파일": "재료_유가전력.json"}, "MO000057": {"원문번호": "주택용저압:기본_400초과", "파일": "재료_유가전력.json"}, "MO000059": {"원문번호": "주택용저압:전력량_다음200", "파일": "재료_유가전력.json"}, "MO000060": {"원문번호": "주택용저압:전력량_400초과", "파일": "재료_유가전력.json"}, "MO000061": {"원문번호": "주택용저압:월간최저요금", "파일": "재료_유가전력.json"}, "MO000062": {"원문번호": "일반용갑I저압:기본", "파일": "재료_유가전력.json"}, "MO000063": {"원문번호": "일반용갑I저압:전력량_여름철", "파일": "재료_유가전력.json"}, "MO000064": {"원문번호": "일반용갑I저압:전력량_봄가을철", "파일": "재료_유가전력.json"}, "MO000065": {"원문번호": "일반용갑I저압:전력량_겨울철", "파일": "재료_유가전력.json"}, "MO000066": {"원문번호": "산업용갑I저압:기본", "파일": "재료_유가전력.json"}, "MO000067": {"원문번호": "산업용갑I저압:전력량_여름철", "파일": "재료_유가전력.json"}, "MO000068": {"원문번호": "산업용갑I저압:전력량_봄가을철", "파일": "재료_유가전력.json"}, "MO000069": {"원문번호": "산업용갑I저압:전력량_겨울철", "파일": "재료_유가전력.json"}, "MO000070": {"원문번호": "임시전력갑:기본요금적용", "파일": "재료_유가전력.json"}, "MO000071": {"원문번호": "임시전력갑:전력량요금적용", "파일": "재료_유가전력.json"}, "MO000072": {"원문번호": "임시전력갑:월간최저요금", "파일": "재료_유가전력.json"}, "GC001145": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)", "GC001148": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)", "GC001151": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)", "GC001156": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)", "GC001159": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)", "GC001166": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)"},
|
"폐기": {"MT000001": "자재품목 휘발유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000002": "자재품목 경유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000003": "자재품목 선박용경유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000004": "자재품목 중유 — 값이 비고 글뿐 · 유가 테이블로 감", "MT000005": "자재품목 등유 — 값이 비고 글뿐 · 유가 테이블로 감", "LB000399": "이름 「〃」 — 직종이 아니라 되풀이 기호 · 소요량 13-6-9 에서 윗줄 직종으로 바로잡음", "MN": "재료_나라장터자재 — old 로 옮김 · 로직은 자재품목·품셈재료로 갈아 끼움", "LB000372": "미확보 고급기능사 — 측량노임 항공사진고급기능사 옛이름으로 옮김", "LB000393": "미확보 리베팅공 — 건설노임 철골공 옛이름으로 옮김(2010 통합표 연번10)", "LB000405": "미확보 Belt Conveyor 설치공 — 품셈 13-10-1 주② 배분으로 다섯 직종에 나눔", "MT000006": "자재품목 전력 — 재료_유가전력 전력 줄로 감", "MT000007": "자재품목 전력 — 재료_유가전력 전력 줄로 감", "LB000368": "미확보 기술사 — 기술사(건설) 옛이름으로 옮김", "LB000369": "미확보 특급기술자 — 특급기술자(건설) 옛이름으로 옮김", "LB000370": "미확보 고급기술자 — 고급기술자(건설) 옛이름으로 옮김", "LB000361": "미확보 중급기술자 — 중급기술자(건설) 옛이름으로 옮김", "LB000364": "미확보 초급기술자 — 초급기술자(건설) 옛이름으로 옮김", "LB000365": "미확보 고급숙련기술자 — 고급숙련기술자(건설) 옛이름으로 옮김", "LB000366": "미확보 중급숙련기술자 — 중급숙련기술자(건설) 옛이름으로 옮김", "LB000367": "미확보 초급숙련기술자 — 초급숙련기술자(건설) 옛이름으로 옮김", "LB000389": "미확보 기계기사 — 초급기술자(기계·설비) 옛이름으로 옮김", "LB000388": "미확보 기계산업기사 — 초급숙련기술자(기계·설비) 옛이름으로 옮김", "MO000055": {"원문번호": "주택용저압:기본_200이하", "파일": "재료_유가전력.json"}, "MO000056": {"원문번호": "주택용저압:기본_201~400", "파일": "재료_유가전력.json"}, "MO000057": {"원문번호": "주택용저압:기본_400초과", "파일": "재료_유가전력.json"}, "MO000059": {"원문번호": "주택용저압:전력량_다음200", "파일": "재료_유가전력.json"}, "MO000060": {"원문번호": "주택용저압:전력량_400초과", "파일": "재료_유가전력.json"}, "MO000061": {"원문번호": "주택용저압:월간최저요금", "파일": "재료_유가전력.json"}, "MO000062": {"원문번호": "일반용갑I저압:기본", "파일": "재료_유가전력.json"}, "MO000063": {"원문번호": "일반용갑I저압:전력량_여름철", "파일": "재료_유가전력.json"}, "MO000064": {"원문번호": "일반용갑I저압:전력량_봄가을철", "파일": "재료_유가전력.json"}, "MO000065": {"원문번호": "일반용갑I저압:전력량_겨울철", "파일": "재료_유가전력.json"}, "MO000066": {"원문번호": "산업용갑I저압:기본", "파일": "재료_유가전력.json"}, "MO000067": {"원문번호": "산업용갑I저압:전력량_여름철", "파일": "재료_유가전력.json"}, "MO000068": {"원문번호": "산업용갑I저압:전력량_봄가을철", "파일": "재료_유가전력.json"}, "MO000069": {"원문번호": "산업용갑I저압:전력량_겨울철", "파일": "재료_유가전력.json"}, "MO000070": {"원문번호": "임시전력갑:기본요금적용", "파일": "재료_유가전력.json"}, "MO000071": {"원문번호": "임시전력갑:전력량요금적용", "파일": "재료_유가전력.json"}, "MO000072": {"원문번호": "임시전력갑:월간최저요금", "파일": "재료_유가전력.json"}, "GC001145": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)", "GC001148": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)", "GC001151": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)", "GC001156": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)", "GC001159": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)", "GC001166": "작업량당 기계경비 — 부르는 곳 0 · 필요하면 단가산출에 기계 하나 넣어 만듦(요구 734-4 · 735-4 · 813-2)"},
|
||||||
"키": {
|
"키": {
|
||||||
"CC000001": {"원문번호": "공통 1-3-1 콘크리트 및 포장용 재료", "파일": "계수_건설품셈_01장_적용기준.json"},
|
"CC000001": {"원문번호": "공통 1-3-1 콘크리트 및 포장용 재료", "파일": "계수_건설품셈_01장_적용기준.json"},
|
||||||
@@ -2871,6 +2871,7 @@
|
|||||||
"GF000334": {"원문번호": "8-3 원목 박피", "파일": "로직_산림품셈_08장_방제.json"},
|
"GF000334": {"원문번호": "8-3 원목 박피", "파일": "로직_산림품셈_08장_방제.json"},
|
||||||
"GF000335": {"원문번호": "10-1", "파일": "로직_산림품셈_10장_자재․장비_운반.json"},
|
"GF000335": {"원문번호": "10-1", "파일": "로직_산림품셈_10장_자재․장비_운반.json"},
|
||||||
"GF000336": {"원문번호": "10-2", "파일": "로직_산림품셈_10장_자재․장비_운반.json"},
|
"GF000336": {"원문번호": "10-2", "파일": "로직_산림품셈_10장_자재․장비_운반.json"},
|
||||||
|
"GF000337": {"원문번호": "2-2-1 체인톱 시간당 기계경비", "파일": "로직_산림품셈_02장_소요재료_및_기계손료.json"},
|
||||||
"GX000001": {"원문번호": "13-4-1 돌쌓기 메쌓기(인력)", "파일": "로직_자체.json"},
|
"GX000001": {"원문번호": "13-4-1 돌쌓기 메쌓기(인력)", "파일": "로직_자체.json"},
|
||||||
"GX000002": {"원문번호": "12-34-4 암거이음받침 채움재(T=20㎜)", "파일": "로직_자체.json"},
|
"GX000002": {"원문번호": "12-34-4 암거이음받침 채움재(T=20㎜)", "파일": "로직_자체.json"},
|
||||||
"GX000003": {"원문번호": "13-4-1 돌쌓기 메쌓기(인력) (2)", "파일": "로직_자체.json"},
|
"GX000003": {"원문번호": "13-4-1 돌쌓기 메쌓기(인력) (2)", "파일": "로직_자체.json"},
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
{
|
||||||
|
"그룹": "로직",
|
||||||
|
"원문": "산림품셈",
|
||||||
|
"차례": 0,
|
||||||
|
"판": "2026-01-01",
|
||||||
|
"줄": [
|
||||||
|
{
|
||||||
|
"키": "GF000337",
|
||||||
|
"원문번호": "2-2-1",
|
||||||
|
"구분": "산림품셈",
|
||||||
|
"상세구분": "02장 소요재료 및 기계손료",
|
||||||
|
"이름": "체인톱 시간당 기계경비",
|
||||||
|
"결과단위": "원/시간",
|
||||||
|
"출처": "산림품셈 2-1-1 · 2-2-1",
|
||||||
|
"부품": {
|
||||||
|
"갈래": "기계경비식"
|
||||||
|
},
|
||||||
|
"개정": [
|
||||||
|
2026
|
||||||
|
],
|
||||||
|
"소유": "공용",
|
||||||
|
"비고": "1일 1대당(2-1-1 주연료 · 체인오일 · 잡품 · 2-2-1 손료계수) × 시간환산(1일 8시간) · 체인톱 가격 = 재료 「동력체인톱」 · 체인오일 = 재료 「작동유」(GF000076 체인톱 줄과 같음) · 가져온 시간당 「엔진톱」 줄을 잇는 식",
|
||||||
|
"입력": [
|
||||||
|
{
|
||||||
|
"이름": "지역",
|
||||||
|
"고르기": [
|
||||||
|
"전국평균",
|
||||||
|
"전국",
|
||||||
|
"서울",
|
||||||
|
"경기",
|
||||||
|
"강원",
|
||||||
|
"충북",
|
||||||
|
"충남",
|
||||||
|
"전북",
|
||||||
|
"경북",
|
||||||
|
"경남",
|
||||||
|
"부산",
|
||||||
|
"제주",
|
||||||
|
"대구",
|
||||||
|
"인천",
|
||||||
|
"대전",
|
||||||
|
"울산",
|
||||||
|
"세종",
|
||||||
|
"전남광주"
|
||||||
|
],
|
||||||
|
"출처": "건설품셈 공통 8-1-7 5"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"중간": [
|
||||||
|
{
|
||||||
|
"이름": "시간환산",
|
||||||
|
"식": "찾기(CC000336, 구분='시간환산').분자 / 찾기(CC000336, 구분='시간환산').분모",
|
||||||
|
"출처": "건설품셈 공통 1-1-3 2(일일 작업시간 8시간)"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"호표": [
|
||||||
|
{
|
||||||
|
"종류": "재료",
|
||||||
|
"요소": "MO:휘발유:{지역}",
|
||||||
|
"이름": "휘발유(체인톱)",
|
||||||
|
"단위": "ℓ",
|
||||||
|
"수량": "찾기(QF000001, 기계명='체인톱', 재료명='보통휘발유(주연료)').주연료 * 시간환산",
|
||||||
|
"비목": "재료비",
|
||||||
|
"출처": "산림품셈 2-1-1 주③"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"종류": "재료",
|
||||||
|
"요소": {
|
||||||
|
"구분": "기계·설비",
|
||||||
|
"상세구분": "기계류",
|
||||||
|
"검색어": "작동유"
|
||||||
|
},
|
||||||
|
"이름": "체인오일",
|
||||||
|
"단위": "ℓ",
|
||||||
|
"수량": "찾기(QF000001, 기계명='체인톱', 재료명='체인오일(일반오일)').주연료 * 시간환산",
|
||||||
|
"비목": "재료비",
|
||||||
|
"출처": "산림품셈 2-1-1 주④"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"종류": "재료",
|
||||||
|
"요소": {
|
||||||
|
"구분": "기계·설비",
|
||||||
|
"상세구분": "기계류",
|
||||||
|
"검색어": "동력체인톱"
|
||||||
|
},
|
||||||
|
"이름": "체인톱 손료",
|
||||||
|
"단위": "대",
|
||||||
|
"수량": "EQ000620.손료계수 * 시간환산",
|
||||||
|
"비목": "경비",
|
||||||
|
"출처": "산림품셈 2-2-1"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"덧줄": [
|
||||||
|
{
|
||||||
|
"이름": "잡품",
|
||||||
|
"식": "줄.'휘발유(체인톱)' * 찾기(QF000001, 기계명='체인톱', 재료명='보통휘발유(주연료)').잡품 / 100",
|
||||||
|
"비목": "재료비",
|
||||||
|
"출처": "산림품셈 2-1-1 주⑤"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"끝수": null,
|
||||||
|
"변수표": {
|
||||||
|
"지역": {
|
||||||
|
"기호": "S",
|
||||||
|
"아래": "지역"
|
||||||
|
},
|
||||||
|
"시간환산": {
|
||||||
|
"기호": "Q",
|
||||||
|
"아래": "시간환산"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"그룹": "수식문서",
|
||||||
|
"로직파일": "로직_산림품셈_02장_소요재료_및_기계손료.json",
|
||||||
|
"줄": [
|
||||||
|
{
|
||||||
|
"꼴": "수식문서",
|
||||||
|
"판": 1,
|
||||||
|
"키": "GF000337",
|
||||||
|
"이름": "체인톱 시간당 기계경비",
|
||||||
|
"결과단위": "원/시간",
|
||||||
|
"출처": "산림품셈 2-1-1 · 2-2-1",
|
||||||
|
"부품": {
|
||||||
|
"갈래": "기계경비식"
|
||||||
|
},
|
||||||
|
"변수": [
|
||||||
|
{"열쇠": "지역", "기호": "S", "아래": "지역", "위": "", "이름": "지역", "단위": "", "출처": "건설품셈 공통 8-1-7 5", "연결": {"갈래": "선택", "목록": ["전국평균", "전국", "서울", "경기", "강원", "충북", "충남", "전북", "경북", "경남", "부산", "제주", "대구", "인천", "대전", "울산", "세종", "전남광주"], "값": "전국평균"}},
|
||||||
|
{"열쇠": "시간환산", "기호": "Q", "아래": "시간환산", "위": "", "이름": "시간환산", "단위": "", "출처": "건설품셈 공통 1-1-3 2(일일 작업시간 8시간)", "연결": {"갈래": "식"}},
|
||||||
|
{"열쇠": "Q_분자^표", "기호": "Q", "아래": "분자", "위": "표", "이름": "건설기계 조종원 노임 시간 환산 계수.분자", "단위": "", "연결": {"갈래": "표", "표": "CC000336", "조건": {"구분": "'시간환산'"}, "칸": "분자"}},
|
||||||
|
{"열쇠": "Q_분모^표", "기호": "Q", "아래": "분모", "위": "표", "이름": "건설기계 조종원 노임 시간 환산 계수.분모", "단위": "", "연결": {"갈래": "표", "표": "CC000336", "조건": {"구분": "'시간환산'"}, "칸": "분모"}},
|
||||||
|
{"열쇠": "Q_주연료^표", "기호": "Q", "아래": "주연료", "위": "표", "이름": "체인톱·예취기·아키아윈치·2드럼 케이블윈치·천공기 연료.주연료", "단위": "수(단위는 줄의 단위 칸 따름)", "연결": {"갈래": "표", "표": "QF000001", "조건": {"기계명": "'체인톱'", "재료명": "'보통휘발유(주연료)'"}, "칸": "주연료"}},
|
||||||
|
{"열쇠": "P_휘발유", "기호": "P", "아래": "휘발유", "위": "", "이름": "휘발유단가", "단위": "", "연결": {"갈래": "요소", "키": "MO:휘발유:{S_지역}"}},
|
||||||
|
{"열쇠": "Q_주연료2^표", "기호": "Q", "아래": "주연료2", "위": "표", "이름": "체인톱·예취기·아키아윈치·2드럼 케이블윈치·천공기 연료.주연료", "단위": "수(단위는 줄의 단위 칸 따름)", "연결": {"갈래": "표", "표": "QF000001", "조건": {"기계명": "'체인톱'", "재료명": "'체인오일(일반오일)'"}, "칸": "주연료"}},
|
||||||
|
{"열쇠": "P_체인오일", "기호": "P", "아래": "체인오일", "위": "", "이름": "체인오일단가", "단위": "", "연결": {"갈래": "요소", "재료": {"구분": "기계·설비", "상세구분": "기계류", "검색어": "작동유"}, "단위": "ℓ"}},
|
||||||
|
{"열쇠": "k_체인톱", "기호": "k", "아래": "체인톱", "위": "", "이름": "EQ000620.손료계수", "단위": "", "연결": {"갈래": "요소", "키": "EQ000620", "칸": "손료계수"}},
|
||||||
|
{"열쇠": "P_체인톱손료", "기호": "P", "아래": "체인톱손료", "위": "", "이름": "체인톱 손료단가", "단위": "", "연결": {"갈래": "요소", "재료": {"구분": "기계·설비", "상세구분": "기계류", "검색어": "동력체인톱"}, "단위": "대"}},
|
||||||
|
{"열쇠": "Q_잡^표", "기호": "Q", "아래": "잡", "위": "표", "이름": "체인톱·예취기·아키아윈치·2드럼 케이블윈치·천공기 연료.잡품", "단위": "%(주연료비의)", "연결": {"갈래": "표", "표": "QF000001", "조건": {"기계명": "'체인톱'", "재료명": "'보통휘발유(주연료)'"}, "칸": "잡품"}}
|
||||||
|
],
|
||||||
|
"식": [
|
||||||
|
{"기호": "Q_시간환산", "식": "Q_분자^표 ÷ Q_분모^표"}
|
||||||
|
],
|
||||||
|
"금액": [
|
||||||
|
{"이름": "휘발유(체인톱)", "단위": "ℓ", "비목": "재료비", "수량": "Q_주연료^표 × Q_시간환산", "단가": "P_휘발유", "출처": "산림품셈 2-1-1 주③", "기호": "C_휘발유"},
|
||||||
|
{"이름": "체인오일", "단위": "ℓ", "비목": "재료비", "수량": "Q_주연료2^표 × Q_시간환산", "단가": "P_체인오일", "출처": "산림품셈 2-1-1 주④"},
|
||||||
|
{"이름": "체인톱 손료", "단위": "대", "비목": "경비", "수량": "k_체인톱 × Q_시간환산", "단가": "P_체인톱손료", "출처": "산림품셈 2-2-1"},
|
||||||
|
{"이름": "잡품", "단위": "식", "비목": "재료비", "단가": "C_휘발유 × Q_잡^표 ÷ 100", "출처": "산림품셈 2-1-1 주⑤"}
|
||||||
|
],
|
||||||
|
"끝수": {
|
||||||
|
"줄": {"방법": "버림", "자리": 1},
|
||||||
|
"비목": {"방법": "버림", "자리": 0},
|
||||||
|
"끝전": "비목버림"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
"""816-3 지킴 — 가져온 「엔진톱」 = 우리 체인톱 EQ000620(요구 771 · 방향 장부 N2).
|
||||||
|
|
||||||
|
(a) 별칭 길 — 사용자가 EQ000620 「별칭」 칸에 「엔진톱 18", 엔진톱」 을 넣으면(시험 = 임시 별칭 · 마스터엔
|
||||||
|
안 넣음) 인치 따옴표가 깨지지 않고 「엔진톱 18"」 · 「엔진톱」(규격 빔) → EQ000620 · 다른 톱 · 다른 규격은 안 이음
|
||||||
|
(b) 시간당 = GF000337 「체인톱 시간당 기계경비」 = 산림품셈 1 일 1 대당(2-1-1 휘발유 · 체인오일 · 잡품 ·
|
||||||
|
2-2-1 손료) ÷ 8 — GF000076 체인톱 줄(1 일 1 대당) 단가 그대로 · 수량 × 시간환산
|
||||||
|
(c) 이음 한 길 — `M02_Machine_Hourly.hourly` · `M02_Doc_Import.hourly_link` = GF000337(기계 입력 없음)
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import importlib
|
||||||
|
import sys
|
||||||
|
from decimal import Decimal
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parents[2]
|
||||||
|
for p in (ROOT, ROOT / "resources/master_data/scripts"):
|
||||||
|
if str(p) not in sys.path:
|
||||||
|
sys.path.insert(0, str(p))
|
||||||
|
|
||||||
|
from M01_MasterData import M01_MasterData_Store as m01 # noqa: E402
|
||||||
|
from M02_MasterTemplete import M02_Doc_Import as di # noqa: E402
|
||||||
|
from M02_MasterTemplete import M02_Machine_Find as mf # noqa: E402
|
||||||
|
from M02_MasterTemplete import M02_Machine_Hourly as mh # noqa: E402
|
||||||
|
from test_815_1_import_link import aliases # noqa: E402 — M01 별칭 칸 임시
|
||||||
|
|
||||||
|
ml = importlib.import_module("master_doc_link")
|
||||||
|
mc = importlib.import_module("master_doc_calc")
|
||||||
|
SAW = "EQ000620"
|
||||||
|
|
||||||
|
|
||||||
|
def _calc(key: str) -> dict:
|
||||||
|
docs = ml.load_all()
|
||||||
|
return mc.calc(docs[key], ml.Links(m01.loaded()[1], docs))
|
||||||
|
|
||||||
|
|
||||||
|
def test_alias() -> None:
|
||||||
|
am = importlib.import_module("master_alias")
|
||||||
|
assert not m01.loaded()[1].get(SAW).get("별칭") # 별칭 값 = 사용자 몫
|
||||||
|
assert mf.find("엔진톱", '18"')["키"] is None
|
||||||
|
for text in ('엔진톱 18", 엔진톱', '"엔진톱 18"", 엔진톱'):
|
||||||
|
assert am.names(text) == ['엔진톱 18"', "엔진톱"], text
|
||||||
|
with aliases("EQ", {SAW: '엔진톱 18", 엔진톱'}):
|
||||||
|
for name, spec in (("엔진톱", '18"'), ("엔진톱", ""), ("엔진톱", '18 "')):
|
||||||
|
got = mf.find(name, spec)
|
||||||
|
assert (got["판정"], got["키"]) == (mf.ALIAS, SAW), (name, spec)
|
||||||
|
for name, spec in (("엔진톱", '24"'), ("체인톱", '18"')):
|
||||||
|
assert mf.find(name, spec)["키"] is None, (name, spec)
|
||||||
|
|
||||||
|
|
||||||
|
def test_hourly_is_day_over_8() -> None:
|
||||||
|
hour = _calc("GF000337")
|
||||||
|
day = {x["이름"]: x for x in _calc("GF000076")["줄"]} # 같은 체인톱 줄(1 일 1 대당 × 벌목부수)
|
||||||
|
lines = {x["이름"]: x for x in hour["줄"]}
|
||||||
|
assert set(lines) == {"휘발유(체인톱)", "체인오일", "체인톱 손료", "잡품"}
|
||||||
|
for name in ("휘발유(체인톱)", "체인오일", "체인톱 손료"):
|
||||||
|
assert lines[name]["단가"] == day[name]["단가"], name
|
||||||
|
assert lines["휘발유(체인톱)"]["수량"] == Decimal("5.6") / 8
|
||||||
|
assert lines["체인톱 손료"]["수량"] == Decimal("0.0084") / 8
|
||||||
|
assert hour["셈됨"] and hour["노무비"] == 0 and hour["계"] > 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_one_way() -> None:
|
||||||
|
got = mh.hourly(SAW)
|
||||||
|
doc = _calc("GF000337")
|
||||||
|
assert got["ok"] and got["로직"] == "GF000337"
|
||||||
|
assert [got[k] for k in ("재료비", "경비", "계")] == [float(doc[k]) for k in ("재료비", "경비", "계")] # fmt: skip
|
||||||
|
link = di.hourly_link(SAW, "재료비")
|
||||||
|
assert link["키"] == "GF000337" and "기계" not in link["입력"]
|
||||||
|
assert mh.hourly("EQ000621")["ok"] is False # 예취기 = 시간당 식 없음 그대로
|
||||||
Reference in New Issue
Block a user