kdrug-inventory-system/dev_scripts/final_price_analysis.py
시골약사 ad9ac396e2 chore: 개발 파일 정리 및 구조화
- 개발/테스트 스크립트를 dev_scripts/ 폴더로 이동
- 스크린샷을 screenshots/ 폴더로 이동
- 백업 파일 보존 (.backup)
- 처방 관련 추가 스크립트 포함

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-18 04:44:48 +00:00

183 lines
6.8 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
최종 가격 차이 분석
"""
import sqlite3
def final_price_analysis():
conn = sqlite3.connect('database/kdrug.db')
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
print("=" * 80)
print("📊 재고 자산 차이 최종 분석")
print("=" * 80)
print()
# 1. 핵심 차이 확인
print("1. 핵심 금액 차이")
print("-" * 60)
# 입고 라인과 LOT 차이
cursor.execute("""
SELECT
h.herb_name,
prl.quantity_g as receipt_qty,
prl.unit_price_per_g as receipt_price,
prl.line_total as receipt_total,
il.quantity_received as lot_qty,
il.unit_price_per_g as lot_price,
il.quantity_received * il.unit_price_per_g as lot_total,
prl.line_total - (il.quantity_received * il.unit_price_per_g) as diff
FROM purchase_receipt_lines prl
JOIN inventory_lots il ON prl.line_id = il.receipt_line_id
JOIN herb_items h ON prl.herb_item_id = h.herb_item_id
WHERE ABS(prl.line_total - (il.quantity_received * il.unit_price_per_g)) > 1
ORDER BY ABS(prl.line_total - (il.quantity_received * il.unit_price_per_g)) DESC
""")
differences = cursor.fetchall()
if differences:
print(" 입고장과 LOT 생성 시 차이가 있는 항목:")
print()
total_diff = 0
for diff in differences:
print(f" 📌 {diff['herb_name']}")
print(f" 입고장: {diff['receipt_qty']:,.0f}g ×{diff['receipt_price']:.2f} = ₩{diff['receipt_total']:,.0f}")
print(f" LOT: {diff['lot_qty']:,.0f}g ×{diff['lot_price']:.2f} = ₩{diff['lot_total']:,.0f}")
print(f" 차이: ₩{diff['diff']:,.0f}")
print()
total_diff += diff['diff']
print(f" 총 차이: ₩{total_diff:,.0f}")
# 2. 재고 자산 흐름
print("\n2. 재고 자산 흐름 정리")
print("=" * 60)
# 각 단계별 금액
cursor.execute("SELECT SUM(line_total) as total FROM purchase_receipt_lines")
receipt_total = cursor.fetchone()['total'] or 0
cursor.execute("""
SELECT SUM(quantity_received * unit_price_per_g) as total
FROM inventory_lots
""")
lot_creation_total = cursor.fetchone()['total'] or 0
cursor.execute("""
SELECT SUM(cc.quantity_used * il.unit_price_per_g) as total
FROM compound_consumptions cc
JOIN inventory_lots il ON cc.lot_id = il.lot_id
""")
consumed_total = cursor.fetchone()['total'] or 0
cursor.execute("""
SELECT SUM(quantity_onhand * unit_price_per_g) as total
FROM inventory_lots
WHERE is_depleted = 0 AND quantity_onhand > 0
""")
current_inventory = cursor.fetchone()['total'] or 0
print(f" 1⃣ 입고장 총액: ₩{receipt_total:,.0f}")
print(f" 2⃣ LOT 생성 총액: ₩{lot_creation_total:,.0f}")
print(f" 차이 (1-2): ₩{receipt_total - lot_creation_total:,.0f}")
print()
print(f" 3⃣ 소비 총액: ₩{consumed_total:,.0f}")
print(f" 4⃣ 현재 재고 자산: ₩{current_inventory:,.0f}")
print()
print(f" 📊 계산식:")
print(f" LOT 생성 - 소비 = ₩{lot_creation_total:,.0f} - ₩{consumed_total:,.0f}")
print(f" = ₩{lot_creation_total - consumed_total:,.0f} (예상)")
print(f" 실제 재고 = ₩{current_inventory:,.0f}")
print(f" 차이 = ₩{current_inventory - (lot_creation_total - consumed_total):,.0f}")
# 3. 차이 원인 분석
print("\n3. 차이 원인 설명")
print("-" * 60)
# 휴먼일당귀 특별 케이스 확인
cursor.execute("""
SELECT
prl.quantity_g as receipt_qty,
il.quantity_received as lot_received,
il.quantity_onhand as lot_current
FROM purchase_receipt_lines prl
JOIN inventory_lots il ON prl.line_id = il.receipt_line_id
JOIN herb_items h ON prl.herb_item_id = h.herb_item_id
WHERE h.herb_name = '휴먼일당귀'
""")
ildan = cursor.fetchone()
if ildan:
print("\n 💡 휴먼일당귀 케이스:")
print(f" 입고장 수량: {ildan['receipt_qty']:,.0f}g")
print(f" LOT 생성 수량: {ildan['lot_received']:,.0f}g")
print(f" 현재 재고: {ildan['lot_current']:,.0f}g")
print(f" → 입고 시 5,000g 중 3,000g만 LOT 생성됨")
print(f" → 나머지 2,000g는 별도 처리되었을 가능성")
print("\n 📝 결론:")
print(" 1. 입고장 총액 (₩1,616,400) vs LOT 생성 총액 (₩1,607,400)")
print(" → ₩9,000 차이 (휴먼일당귀 수량 차이로 인함)")
print()
print(" 2. 예상 재고 (₩1,529,434) vs 실제 재고 (₩1,529,434)")
print(" → 정확히 일치")
print()
print(" 3. 입고 기준 예상 (₩1,538,434) vs 실제 재고 (₩1,529,434)")
print(" → ₩9,000 차이 (입고와 LOT 생성 차이와 동일)")
# 4. 추가 LOT 확인
print("\n4. 추가 LOT 존재 여부")
print("-" * 60)
cursor.execute("""
SELECT
h.herb_name,
COUNT(*) as lot_count,
SUM(il.quantity_received) as total_received,
SUM(il.quantity_onhand) as total_onhand
FROM inventory_lots il
JOIN herb_items h ON il.herb_item_id = h.herb_item_id
WHERE h.herb_name = '휴먼일당귀'
GROUP BY h.herb_item_id
""")
ildan_lots = cursor.fetchone()
if ildan_lots:
print(f" 휴먼일당귀 LOT 현황:")
print(f" LOT 개수: {ildan_lots['lot_count']}")
print(f" 총 입고량: {ildan_lots['total_received']:,.0f}g")
print(f" 현재 재고: {ildan_lots['total_onhand']:,.0f}g")
# 상세 LOT 정보
cursor.execute("""
SELECT
lot_id,
lot_number,
quantity_received,
quantity_onhand,
unit_price_per_g,
receipt_line_id
FROM inventory_lots il
JOIN herb_items h ON il.herb_item_id = h.herb_item_id
WHERE h.herb_name = '휴먼일당귀'
""")
lots = cursor.fetchall()
for lot in lots:
print(f"\n LOT {lot['lot_id']}:")
print(f" LOT 번호: {lot['lot_number']}")
print(f" 입고량: {lot['quantity_received']:,.0f}g")
print(f" 현재: {lot['quantity_onhand']:,.0f}g")
print(f" 단가: ₩{lot['unit_price_per_g']:.2f}")
print(f" 입고라인: {lot['receipt_line_id']}")
conn.close()
if __name__ == "__main__":
final_price_analysis()