fix(malaysia): 랙보기를 '최근 저장' 재고조사 기준으로

기존 랙보기는 latest_stocktake(조사 날짜 DESC) 기준이라, 방금 저장한
조사라도 날짜가 더 늦은 다른 조사가 있으면 안 보였다. 랙을 마지막으로
저장한 조사를 보여주도록 latest_rack_stocktake 추가 — daily_stocktake_rack
.created_at MAX 기준(replace_rack 이 매 저장마다 delete+insert 하므로
랙 저장 시각과 일치). 재고현황 index 의 날짜 기준 latest_stocktake 는 유지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 14:49:30 +09:00
parent b970542482
commit c91059b415
2 changed files with 21 additions and 1 deletions
+19
View File
@@ -397,6 +397,25 @@ class MalaysiaStockStore:
).fetchone() ).fetchone()
return self._serialize(row) if row else None return self._serialize(row) if row else None
def latest_rack_stocktake(self, *, warehouse_code: str) -> dict[str, Any] | None:
"""랙 입력을 가장 최근에 저장한(취소 제외) 재고조사 헤더. 없으면 None.
랙보기 전용. '최근'을 조사 날짜가 아니라 랙 저장 시각으로 판단한다.
replace_rack 은 매 저장마다 daily_stocktake_rack 을 delete+insert 하므로
그 created_at MAX 가 곧 마지막 랙 저장 시각이 된다. 랙 항목이 없는
조사는 보여줄 게 없으므로 자연히 제외된다.
"""
with self._pool.connection() as conn:
row = conn.execute(
"SELECT s.* FROM daily_stocktake s "
"JOIN daily_stocktake_rack r ON r.stocktake_id = s.id "
"WHERE s.warehouse_code = %s AND s.status <> 'cancelled' "
"GROUP BY s.id "
"ORDER BY MAX(r.created_at) DESC, s.id DESC LIMIT 1",
(warehouse_code,),
).fetchone()
return self._serialize(row) if row else None
def delete_stocktake(self, *, stocktake_id: int) -> None: def delete_stocktake(self, *, stocktake_id: int) -> None:
"""재고조사 완전 삭제(헤더+라인 CASCADE). 슈퍼관리자 전용 동작. """재고조사 완전 삭제(헤더+라인 CASCADE). 슈퍼관리자 전용 동작.
+2 -1
View File
@@ -187,7 +187,8 @@ async def rack_view(request: Request) -> HTMLResponse:
return guard return guard
st, user = guard st, user = guard
wh = _selected_wh(request, st) wh = _selected_wh(request, st)
latest = st.latest_stocktake(warehouse_code=wh) # 랙보기는 '랙을 가장 최근에 저장한' 조사 기준(조사 날짜 아님).
latest = st.latest_rack_stocktake(warehouse_code=wh)
rack_by_cell: dict[str, list[dict[str, Any]]] = {} rack_by_cell: dict[str, list[dict[str, Any]]] = {}
names = st.item_name_map() names = st.item_name_map()
if latest: if latest: