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)",