#!/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()