From 8f882ff4cd2b795595c0888183dfa9b52a2d52cf Mon Sep 17 00:00:00 2001 From: king Date: Fri, 12 Jun 2026 11:32:30 +0900 Subject: [PATCH] =?UTF-8?q?feat(malaysia):=20=EC=8A=88=ED=8D=BC=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=9E=90=20=EC=9E=AC=EA=B3=A0=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 재고 현황 하단 '위험 구역' 카드(슈퍼관리자만 표시) - POST /malaysia/reset: stock_movement + daily_stocktake(+line) 전체 삭제 → 전체 창고 현재고/조사값 0. 마스터(창고/아이템) 보존. - 권한: is_super_admin 아니면 403 (버튼 숨김 + 서버 이중 검사) - 2단 확인(confirm + RESET 타이핑) - i18n 추가, malaysia.js 캐시 버전 bump Co-Authored-By: Claude Opus 4.8 --- app/modules/malaysia/db.py | 18 ++++++++++++++++ app/modules/malaysia/router.py | 18 ++++++++++++++++ .../malaysia/templates/malaysia/_i18n.html | 2 +- .../malaysia/templates/malaysia/index.html | 21 +++++++++++++++++++ app/static/malaysia.js | 2 ++ 5 files changed, 60 insertions(+), 1 deletion(-) diff --git a/app/modules/malaysia/db.py b/app/modules/malaysia/db.py index 4d7f3f1..7e8cb30 100644 --- a/app/modules/malaysia/db.py +++ b/app/modules/malaysia/db.py @@ -688,6 +688,24 @@ class MalaysiaStockStore: head = self.get_stocktake(stocktake_id=stocktake_id, with_lines=True) return {"stocktake": head, "adjustments": adjustments, "rows": rows} + # ════════════════════════════════════════════════════════════ + # 데이터 초기화 (슈퍼관리자 전용 — 라우터에서 권한 검사) + # ════════════════════════════════════════════════════════════ + def reset_all_data(self) -> dict[str, int]: + """전체 창고의 재고 수량 데이터 초기화. + + 삭제 대상: stock_movement(입고/출고/조정/조사반영) + + daily_stocktake/daily_stocktake_line(재고조사). + 보존 대상: warehouses, malaysia_items(마스터). + 한 트랜잭션으로 처리. 반환: 삭제 건수. + """ + with self._pool.connection() as conn: + with conn.transaction(): + mv = conn.execute("DELETE FROM stock_movement").rowcount or 0 + ln = conn.execute("DELETE FROM daily_stocktake_line").rowcount or 0 + hd = conn.execute("DELETE FROM daily_stocktake").rowcount or 0 + return {"movements": mv, "stocktake_lines": ln, "stocktakes": hd} + # ════════════════════════════════════════════════════════════ # 직렬화 # ════════════════════════════════════════════════════════════ diff --git a/app/modules/malaysia/router.py b/app/modules/malaysia/router.py index c8cba18..fd44540 100644 --- a/app/modules/malaysia/router.py +++ b/app/modules/malaysia/router.py @@ -174,6 +174,24 @@ async def index(request: Request) -> HTMLResponse: return render_template(request, "malaysia/index.html", ctx) +@router.post("/reset") +async def reset_data( + request: Request, user: dict[str, Any] = Depends(_require_user) +) -> RedirectResponse: + """전체 창고 재고 수량 데이터 초기화 — 슈퍼관리자 전용. + + stock_movement + daily_stocktake(+line) 전체 삭제(현재고/조사값 0). + 마스터(warehouses, malaysia_items)는 보존. + """ + if not user.get("is_super_admin"): + raise HTTPException(status_code=403, detail="재고 데이터 초기화는 슈퍼관리자만 가능합니다.") + st = _store(request) + if st is None: + raise HTTPException(status_code=503, detail="malaysia_stock_db 미설정") + st.reset_all_data() + return RedirectResponse(url="/malaysia/", status_code=303) + + # ════════════════════════════════════════════════════════════ # 입고 / 출고 등록 (그리드 일괄) # ════════════════════════════════════════════════════════════ diff --git a/app/modules/malaysia/templates/malaysia/_i18n.html b/app/modules/malaysia/templates/malaysia/_i18n.html index 701f4c9..8904b2a 100644 --- a/app/modules/malaysia/templates/malaysia/_i18n.html +++ b/app/modules/malaysia/templates/malaysia/_i18n.html @@ -2,4 +2,4 @@
- + diff --git a/app/modules/malaysia/templates/malaysia/index.html b/app/modules/malaysia/templates/malaysia/index.html index eb17565..78432a2 100644 --- a/app/modules/malaysia/templates/malaysia/index.html +++ b/app/modules/malaysia/templates/malaysia/index.html @@ -80,5 +80,26 @@ + + {% if is_super %} +
+

위험 구역 (슈퍼관리자)

+

+ 전체 창고의 입출고 이력·재고조사 데이터를 모두 삭제해 재고 수량을 0으로 초기화합니다. + 창고/아이템 마스터는 유지됩니다. 되돌릴 수 없습니다. +

+
+ +
+
+ + {% endif %} {% endblock %} diff --git a/app/static/malaysia.js b/app/static/malaysia.js index 53cbd23..edefcdf 100644 --- a/app/static/malaysia.js +++ b/app/static/malaysia.js @@ -32,6 +32,8 @@ "재고조사 입력 없음": "No stocktake input", "표시할 재고가 없습니다.": "No stock to display.", "콤보 재고 입력이 없습니다.": "No combo stock input.", + "위험 구역 (슈퍼관리자)": "Danger Zone (Super Admin)", + "재고 초기화": "Reset Stock", // 입출고 "등록 옵션": "Options", "이동 종류 (낱개)": "Type (single)",