feat(531-3): D04 확정 화면 · B03 [예정노선에서 가져오기] · 예정노선 바뀜 띠

- D04 화면 — 연도 표(연장 · 시점 · 종점 · 누가 · 확정 · 지정 업체) · 업체 = 등록 회사 찾기 또는 이름 + 메일 · 캐시 d04-assignees · [저장] PUT · [확정] 연도 고름 → finalize(잠금판) · [내보내기] zip
- PUT plan/assignees 에 years — 업체를 다 뺀 연도도 맞춤
- B03 노선 칸 옆 단추 · 머리 띠(새 파일에서 끼움 · 기존 동작 그대로) — 연결 = existing 길 · 옛 결과 지울 때 확인 창

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-25 20:03:58 +09:00
co-authored by Claude Opus 5.5
parent d8c9c60beb
commit 80d363c3aa
9 changed files with 633 additions and 5 deletions
+21
View File
@@ -387,3 +387,24 @@ def test_summary_year_rows(plan_repo):
first["length_m"]
)
assert out["years"][1]["confirmed_at"] is None and len(out["assignees"]) == 2
def test_put_assignees_years_clears_empty_year(plan_repo, monkeypatch):
"""업체를 다 뺀 연도 — `years` 로 보내면 그 연도 행을 지움 · 안 보낸 연도는 그대로."""
applied = {}
async def apply(_pid, delete_ids, updates, inserts):
applied.update(delete=delete_ids, updates=updates, inserts=inserts)
monkeypatch.setattr(repo, "apply_assignee_changes", apply)
forest = {"role": "SYSTEM_ADMIN", "email": "a@b.c", "company_id": 1}
request = d04.AssigneesRequest(assignees=[], years=[2026])
asyncio.run(d04.put_plan_assignees(PLAN_ID, request, forest))
assert applied == {"delete": [7], "updates": [], "inserts": []}
with pytest.raises(HTTPException) as err:
asyncio.run(
d04.put_plan_assignees(
PLAN_ID, d04.AssigneesRequest(assignees=[], years=[2030]), forest
)
)
assert err.value.status_code == 400