from __future__ import annotations # ruff: noqa: F405 from pathlib import Path import pandas as pd import streamlit as st from jarca_ledger_mcp.adapters.streamlit import imports_gateway from jarca_ledger_mcp.adapters.streamlit import overview_gateway from dashboard.common import * # noqa: F403, F405 def page_imports(db_path: str) -> None: render_section_label("๐Ÿ“ˆ", "ํ† ์Šค์ฆ๊ถŒ ๊ฑฐ๋ž˜๋‚ด์—ญ PDF ๊ฐ€์ ธ์˜ค๊ธฐ") st.caption("ํ† ์Šค์ฆ๊ถŒ ๊ฑฐ๋ž˜๋‚ด์—ญ์„œ PDF๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด ํˆฌ์ž๊ณ„์ขŒ ๊ฑฐ๋ž˜๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋งค์ˆ˜/๋งค๋„/ํ™˜์ „/์ž…์ถœ๊ธˆ์€ `์ด์ฒด/ํˆฌ์ž์ด๋™`, ๋ฐฐ๋‹น/์ด์ž๋Š” ์‹ค์ œ ์ˆ˜์ž…์œผ๋กœ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.") uploaded = st.file_uploader("ํ† ์Šค์ฆ๊ถŒ PDF", type=["pdf"], key="toss_pdf") if uploaded is not None: upload_dir = Path.home() / ".local" / "share" / "jarca" / "uploads" upload_dir.mkdir(parents=True, exist_ok=True) upload_path = upload_dir / uploaded.name upload_path.write_bytes(uploaded.getbuffer()) c1, c2 = st.columns(2) if c1.button("ํ† ์Šค์ฆ๊ถŒ Preview"): res = imports_gateway.preview_toss_securities_pdf_import(str(upload_path), db_path=db_path) st.session_state["toss_preview"] = res if c2.button("ํ† ์Šค์ฆ๊ถŒ Import", type="primary"): res = imports_gateway.import_toss_securities_pdf(str(upload_path), db_path=db_path) clear_cache() st.session_state["toss_import_result"] = res st.rerun() if "toss_preview" in st.session_state: res = st.session_state["toss_preview"] if res.get("success"): st.success(f"Preview: {res.get('row_count', 0)}๊ฑด, ์ค‘๋ณต {res.get('duplicate_count', 0)}๊ฑด") st.json({"metadata": res.get("metadata"), "by_action": res.get("by_action"), "validation": res.get("validation")}) st.dataframe(pd.DataFrame(res.get("preview", [])), width="stretch", height=300) else: st.error(res) if "toss_import_result" in st.session_state: res = st.session_state["toss_import_result"] if res.get("success"): st.success(f"Import ์™„๋ฃŒ: {res.get('inserted_count', 0)}๊ฑด ์ถ”๊ฐ€, ์ค‘๋ณต skip {res.get('skipped_duplicate_count', 0)}๊ฑด") st.json(res) else: st.error(res) st.divider() render_section_label("๐Ÿฆ", "ํ† ์Šค๋ฑ…ํฌ ๊ฑฐ๋ž˜๋‚ด์—ญ PDF ๊ฐ€์ ธ์˜ค๊ธฐ") st.caption("ํ† ์Šค๋ฑ…ํฌ ๊ณ„์ขŒ ๊ฑฐ๋ž˜๋‚ด์—ญ PDF๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด ์ž…์ถœ๊ธˆ/์ด์ฒด/์นด๋“œ๊ฒฐ์ œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ํƒ€์ธ ์ด์ฒด/์ถœ๊ธˆ์€ `์ด์ฒด/ํ™•์ธํ•„์š”`๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.") toss_bank_uploaded = st.file_uploader("ํ† ์Šค๋ฑ…ํฌ PDF", type=["pdf"], key="tossbank_pdf") if toss_bank_uploaded is not None: upload_dir = Path.home() / ".local" / "share" / "jarca" / "uploads" upload_dir.mkdir(parents=True, exist_ok=True) upload_path = upload_dir / toss_bank_uploaded.name upload_path.write_bytes(toss_bank_uploaded.getbuffer()) c1, c2 = st.columns(2) if c1.button("ํ† ์Šค๋ฑ…ํฌ Preview"): res = imports_gateway.preview_toss_bank_pdf_import(str(upload_path), db_path=db_path) st.session_state["toss_bank_preview"] = res if c2.button("ํ† ์Šค๋ฑ…ํฌ Import", type="primary"): res = imports_gateway.import_toss_bank_pdf(str(upload_path), db_path=db_path) clear_cache() st.session_state["toss_bank_import_result"] = res st.rerun() if "toss_bank_preview" in st.session_state: res = st.session_state["toss_bank_preview"] if res.get("success"): st.success(f"Preview: {res.get('row_count', 0)}๊ฑด, ์ค‘๋ณต {res.get('duplicate_count', 0)}๊ฑด") st.json({"metadata": res.get("metadata"), "by_action": res.get("by_action"), "validation": res.get("validation")}) st.dataframe(pd.DataFrame(res.get("preview", [])), width="stretch", height=300) else: st.error(res) if "toss_bank_import_result" in st.session_state: res = st.session_state["toss_bank_import_result"] if res.get("success"): st.success(f"Import ์™„๋ฃŒ: {res.get('inserted_count', 0)}๊ฑด ์ถ”๊ฐ€, ์ค‘๋ณต skip {res.get('skipped_duplicate_count', 0)}๊ฑด") st.json(res) else: st.error(res) st.divider() render_section_label("๐Ÿงพ", "Import ์ด๋ ฅ") batches = overview_gateway.list_ledger_import_batches(limit=100, db_path=db_path).get("import_batches", []) st.dataframe(pd.DataFrame(batches), width="stretch", height=350) if batches: with st.form("rollback"): batch_id = st.selectbox("Rollback batch", [b["id"] for b in batches]) hard = st.checkbox("Hard delete", value=False) submitted = st.form_submit_button("Rollback ์‹คํ–‰", type="secondary") if submitted: res = imports_gateway.rollback_ledger_import_batch(batch_id, hard_delete=hard, db_path=db_path) clear_cache() st.warning(res) st.rerun()