kdrug-inventory-system/update_receipt_numbers.py
시골약사 11ca86ca41 fix: 입고장 번호 자동 생성 기능 추가
## 개선사항
- 입고장 번호 형식: PR-YYYYMMDD-XXXX
- 기존 데이터에 입고장 번호 부여 (update_receipt_numbers.py)
- Excel 업로드시 자동으로 입고장 번호 생성
- 재고 원장 참고번호 개선
  - 입고: 입고장 번호 (PR-20260211-0001)
  - 출고: 처방전 번호 또는 조제#ID

## 확인된 결과
- 오미자 입고: PR-20260211-0001
- 박주호 환자 출고: 조제#1 (처방전 번호 없음)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-15 11:25:58 +00:00

103 lines
3.4 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
기존 입고 데이터에 입고장 번호를 자동으로 부여하는 스크립트
형식: PR-YYYYMMDD-XXXX (PR: Purchase Receipt)
"""
import sqlite3
from datetime import datetime
def update_receipt_numbers():
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
try:
# 입고장 번호가 없는 레코드 조회
cursor.execute("""
SELECT receipt_id, receipt_date, supplier_id
FROM purchase_receipts
WHERE receipt_no IS NULL OR receipt_no = ''
ORDER BY receipt_date, receipt_id
""")
receipts = cursor.fetchall()
if not receipts:
print("모든 입고장에 이미 번호가 있습니다.")
return
print(f"입고장 번호를 부여할 레코드: {len(receipts)}")
# 날짜별 카운터 딕셔너리
date_counters = {}
for receipt in receipts:
receipt_id, receipt_date, supplier_id = receipt
# 날짜 형식 변환
if receipt_date:
# receipt_date가 문자열인 경우
if isinstance(receipt_date, str):
date_str = receipt_date.replace('-', '') # YYYYMMDD 형식
# receipt_date가 정수인 경우 (YYYYMMDD 형식으로 저장된 경우)
else:
date_str = str(receipt_date)
else:
date_str = datetime.now().strftime('%Y%m%d')
# 해당 날짜의 카운터 증가
if date_str not in date_counters:
# 해당 날짜의 기존 최대 번호 확인
cursor.execute("""
SELECT MAX(CAST(SUBSTR(receipt_no, -4) AS INTEGER))
FROM purchase_receipts
WHERE receipt_no LIKE ?
""", (f'PR-{date_str}-%',))
max_num = cursor.fetchone()[0]
date_counters[date_str] = (max_num or 0) + 1
else:
date_counters[date_str] += 1
# 입고장 번호 생성 (PR-YYYYMMDD-XXXX)
receipt_no = f"PR-{date_str}-{date_counters[date_str]:04d}"
# 업데이트
cursor.execute("""
UPDATE purchase_receipts
SET receipt_no = ?
WHERE receipt_id = ?
""", (receipt_no, receipt_id))
print(f" 입고장 ID {receipt_id}: {receipt_no} 부여 완료")
conn.commit()
print(f"\n{len(receipts)}개의 입고장 번호 부여 완료!")
# 결과 확인
cursor.execute("""
SELECT receipt_id, receipt_no, receipt_date,
(SELECT name FROM suppliers WHERE supplier_id = pr.supplier_id) as supplier_name
FROM purchase_receipts pr
ORDER BY receipt_date DESC, receipt_id DESC
LIMIT 10
""")
print("\n최근 입고장 목록:")
print("-" * 80)
print(f"{'ID':>6} | {'입고장 번호':<20} | {'입고일':<12} | {'공급처'}")
print("-" * 80)
for row in cursor.fetchall():
print(f"{row[0]:>6} | {row[1]:<20} | {row[2]:<12} | {row[3]}")
except Exception as e:
print(f"오류 발생: {e}")
conn.rollback()
finally:
conn.close()
if __name__ == "__main__":
update_receipt_numbers()