feat: deliver schema 15 monthly settlement lifecycle
This commit is contained in:
@@ -44,65 +44,7 @@ def _render_asset_evidence(report: dict) -> None:
|
||||
def page_assets(db_path: str) -> None:
|
||||
st.caption("표시 기준: preview는 live_authority 추정값, close 이후 조회는 closed snapshot 값입니다. 실운영 전 synthetic/validation DB에서 먼저 검증하세요.")
|
||||
|
||||
render_section_label("✍️", "수기 자산/부채 등록")
|
||||
with st.form("manual_asset_create"):
|
||||
c1, c2, c3 = st.columns([1.3, 1, 1])
|
||||
name = c1.text_input("자산/부채명", placeholder="예: 전세보증금, 주택담보대출")
|
||||
amount = c2.number_input("평가금액(원)", min_value=0, value=0, step=10000)
|
||||
valuation_date = c3.date_input("평가 기준일")
|
||||
c4, c5 = st.columns([1, 2])
|
||||
bucket = c4.selectbox("유동성 버킷", LIQUIDITY_BUCKET_OPTIONS, format_func=lambda x: LIQUIDITY_BUCKET_LABELS.get(x, x))
|
||||
source_note = c5.text_input("출처 메모", placeholder="예: 월말 앱 잔액, 계약서, synthetic")
|
||||
memo = st.text_input("운영 메모", value="")
|
||||
submitted = st.form_submit_button("수기 자산 추가", type="primary")
|
||||
if submitted:
|
||||
res = assets_gateway.create_manual_asset(name, int(amount), valuation_date.isoformat(), bucket, source_note=source_note, memo=memo, db_path=db_path)
|
||||
if res.get("success"):
|
||||
clear_cache()
|
||||
st.success("수기 자산을 추가했습니다.")
|
||||
st.rerun()
|
||||
else:
|
||||
st.error(res.get("error", res))
|
||||
|
||||
assets_res = assets_gateway.list_manual_assets(active_only=False, db_path=db_path)
|
||||
assets = assets_res.get("manual_assets", []) if assets_res.get("success") else []
|
||||
render_section_label("📋", "수기 자산/부채 목록")
|
||||
if assets:
|
||||
df = pd.DataFrame(assets)
|
||||
df["bucket_label"] = df["liquidity_bucket"].map(LIQUIDITY_BUCKET_LABELS).fillna(df["liquidity_bucket"])
|
||||
df["valuation_display"] = df["valuation_amount"].map(format_krw)
|
||||
st.dataframe(df[["name", "active", "bucket_label", "valuation_display", "valuation_date", "id"]], width="stretch", height=220)
|
||||
with st.form("manual_asset_update"):
|
||||
asset_options = {f"{a['name']} ({a['id']})": a for a in assets}
|
||||
selected_label = st.selectbox("수정/비활성 대상", list(asset_options.keys()))
|
||||
selected = asset_options[selected_label]
|
||||
u1, u2, u3 = st.columns([1.3, 1, 1])
|
||||
new_name = u1.text_input("이름", value=selected.get("name", ""))
|
||||
new_amount = u2.number_input("평가금액(원)", min_value=0, value=int(selected.get("valuation_amount") or 0), step=10000, key="asset_update_amount")
|
||||
new_date = u3.text_input("평가 기준일", value=selected.get("valuation_date", ""))
|
||||
u4, u5 = st.columns([1, 2])
|
||||
current_bucket = selected.get("liquidity_bucket", "other") if selected.get("liquidity_bucket", "other") in LIQUIDITY_BUCKET_OPTIONS else "other"
|
||||
new_bucket = u4.selectbox("버킷", LIQUIDITY_BUCKET_OPTIONS, index=LIQUIDITY_BUCKET_OPTIONS.index(current_bucket), format_func=lambda x: LIQUIDITY_BUCKET_LABELS.get(x, x), key="asset_update_bucket")
|
||||
new_source = u5.text_input("출처 메모", value=selected.get("source_note", ""))
|
||||
new_memo = st.text_input("메모", value=selected.get("memo", ""), key="asset_update_memo")
|
||||
make_active = st.checkbox("활성", value=bool(selected.get("active", True)))
|
||||
col_update, col_deactivate = st.columns(2)
|
||||
do_update = col_update.form_submit_button("선택 항목 수정", type="primary")
|
||||
do_deactivate = col_deactivate.form_submit_button("선택 항목 비활성", type="secondary")
|
||||
if do_update:
|
||||
res = assets_gateway.update_manual_asset(selected["id"], name=new_name, valuation_amount=int(new_amount), valuation_date=new_date, liquidity_bucket=new_bucket, source_note=new_source, memo=new_memo, active=make_active, db_path=db_path)
|
||||
if res.get("success"):
|
||||
clear_cache(); st.success("수정했습니다."); st.rerun()
|
||||
else:
|
||||
st.error(res.get("error", res))
|
||||
if do_deactivate:
|
||||
res = assets_gateway.deactivate_manual_asset(selected["id"], db_path=db_path)
|
||||
if res.get("success"):
|
||||
clear_cache(); st.warning("비활성 처리했습니다."); st.rerun()
|
||||
else:
|
||||
st.error(res.get("error", res))
|
||||
else:
|
||||
st.info("등록된 수기 자산/부채가 없습니다.")
|
||||
st.info("수기 자산/부채 입력·조회·수정은 schema 16에서 지원하지 않습니다. 계정의 last_balance를 사용하세요.")
|
||||
|
||||
st.divider()
|
||||
render_section_label("🔒", "월말 스냅샷 Preview / Close")
|
||||
|
||||
Reference in New Issue
Block a user