자동화 카운팅 프로그램을 만들자

Longinus99·2024년 10월 15일

새벽 피방 알바를 최근에 시작했다.

새벽이라 재고관련으로 확인을 해야되는데 1회용 플라스틱 컵을 사용하는 메뉴들을 각각 다 계산기로 일일히 덧셈,뺄셈하는게 너무 귀찮다. 플라스틱 컵의 종류도 종류고 그외에 메뉴에 사용하는 종이그릇, 탄산음료 종이컵 모두 검수해야되기 때문에 상당히 골 아프다.

문제는 재고를 새고있는 와중에 음식주문이나 음료 주문이 들어오면 계산한거에서 그만큼 실시간으로 다시 뺴주는 무간지옥에 빠지는 경우가 종종 있기에 한번 몰려오면 그냥 처음부터 계산기로 계산은 때리는게 너무 귀찮다.

내가 할 줄하는건 코딩.. 알바하면서 확인해보니 피시방 관리 프로그램에서 현재 재고를 xls 파일로 저장이 가능한걸 찾았다.

각각의 컵들의 종류와 메뉴들만 알면 적당히 프로그램 돌리면 빠르게 재고를 카운팅하는게 가능하지 않겠는가.

물론 피시방 관리 프로그램 내에서 해거나 연동이 가능하면 좋겠지만 절대로 그렇게는 될거 같지 않기에 그냥 xls 다운받아서 실행만 하면 카운팅을 해주는 방식으로 하는걸 선택했다.

알고리즘은 쉽다

1. xls파일을 불러온다.
2. 컵 종류에 따른 메뉴들의 갯수를 더한다.

나의 귀차니즘과 나중을 위한 유지보수를 위해 2가지 기능을 추가했다.

xls 파일을 삭제하는 기능

메뉴 추가 기능

전자의 경우는 그냥 import os를 통해 한줄이면 끝난다.
후자의 경우는 귀찮은데 그냥 컵종류에 따른 메뉴를 메모장에 적어서 해당 메모장들을 불러 해당 메뉴의 재고 갯수를 카운팅 하는 방식으로 하는걸로 설정했다.

그리고 각종 오류처리를 그냥 gui에 표시하는 방식으로 떄려넣었다.

import sys
import os
import pandas as pd
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPushButton, QTextEdit, QMessageBox


class ExcelLoaderApp(QWidget):
    def __init__(self):
        super().__init__()
        self.file_path = None
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Stock')

        self.resize(800, 400)

    
        layout = QVBoxLayout()

    
        self.load_button = QPushButton('재고 불러오기', self)
        self.load_button.clicked.connect(self.load_excel_file)
        layout.addWidget(self.load_button)

        self.delete_button = QPushButton('파일 삭제하기', self)
        self.delete_button.clicked.connect(self.delete_excel_file)
        layout.addWidget(self.delete_button)

       
        self.result_text = QTextEdit(self)
        self.result_text.setReadOnly(True) 
        layout.addWidget(self.result_text)


        self.setLayout(layout)

    def load_excel_file(self):
        directory = './'
        folder_path = './상품'
        self.result_text.clear()

        for filename in os.listdir(directory):
            if filename.startswith("현재창고관리") and filename.endswith(".xls"):
                self.file_path = os.path.join(directory, filename)
                
            
                # self.result_text.append(f"불러오는 파일: {file_path}")
                
           
                df = pd.read_excel(self.file_path)

           
                # self.result_text.append(f"DataFrame 정보:\n{df.head()}")
                break
        

        try:
            new_df = df[['상품분류', '상품명','현재창고재고']]

            for filename in os.listdir(folder_path):
                if filename.endswith('.txt'):  
                    cupname = os.path.splitext(filename)[0]

                    product_names = [] 
                    with open(os.path.join(folder_path, filename), 'r', encoding='utf-8') as file:
                        # 각 파일의 상품명을 읽어서 리스트에 추가
                        for line in file:
                            product_names.append(line.strip())

                    total_stock = 0

                    for product in product_names:
                        stock_value = new_df.loc[new_df['상품명'] == product, '현재창고재고']
                        if not stock_value.empty:
                            if cupname == "1L컵":
                                total_stock += stock_value.values[0]
                            else:
                                total_stock += (stock_value.values[0] - 1000)
                        else:
                            self.result_text.append(f'{product}는 재고에 없습니다!')

           
                    self.result_text.append(f'{os.path.splitext(filename)[0]}: {total_stock}')
        except:
            self.result_text.clear()
            self.result_text.append("재고 파일이 없습니다!")

    def delete_excel_file(self):
            if self.file_path:
                reply = QMessageBox.question(self, '파일 삭제 확인', 
                                            f'{self.file_path} 파일을 삭제하시겠습니까?', 
                                            QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)

                if reply == QMessageBox.Yes:
                    try:
                        os.remove(self.file_path)
                        # self.result_text.append(f"{self.file_path} 파일이 삭제되었습니다.")
                        self.file_path = None  # 파일 경로를 None으로 초기화
                    except Exception as e:
                        self.result_text.clear()
                        self.result_text.append(f"파일 삭제 실패: {str(e)}")
                else:
                    self.result_text.clear()
                    self.result_text.append("파일 삭제가 취소되었습니다.")
            else:
                self.result_text.clear()
                self.result_text.append("재고 파일이 없습니다!")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ExcelLoaderApp()
    ex.show()
    sys.exit(app.exec_())

파이썬의 경우 PyQT5를 통해 간단한 GUI를 제공하기 때문에 이를 통해 구현을 했다.

또 exe 파일로 만들기 위해 python의 pyinstaller로 프로그램을 만들었다.

명령어를 통해 icon을 지정하고 하나의 파일로 할건지 여러개의 파일로 할건지 여러 버전이 가능한데 사장이 귀찮은 파일 많은거 싫어할거같고 또 괜히 막 해킹 당하는거 아니냐라는 여러가지 말이 많을거같아 좀 로딩이 걸려도 exe파일 하나로 하기로 했다.

뭐 로딩 한다해도 계산가로 때리는 것보다 훨배 빠르다.

pip install pyinstaller

pyinstaller -w -F --icon=box_685388.ico Stock.py

xls 불러오는 버튼이랑 삭제하는 버튼단순하데 2개 만들어서 만약없으면 사진처럼 없다고 그냥 알려주는 방식으로 했다.

그냥 해당 xls가 같은 폴더내에 있기만 하면 되기 때문에 불러오면 제대로 작동하는걸 확인 할 수 있었다.

삭제도 정상적으로 되는걸 확인했다.

실제로 해당 폴더 위치에 있던 xls가 사라졌다.

이제 알바하러갈때 써먹으러 가자

profile
인간입니다. 다만 컴공을 전공하고있는...

0개의 댓글