티스토리 뷰

python lecture/project

[python] 주문시스템

burningrizen 2020. 5. 9. 12:37

 

1. menus.txt 에 까페에서 파는 [메뉴이름 가격 수량] 을 기록한다.

더보기

iceame 5000 100

caffemoca 4000 50

 

2. 모든 메뉴의 수량이 0이 되면 프로그램을 종료한다.

 

3. 판매를 할 경우 영수증을 파일(receipt.txt)에 주문 내역을 저장한다.

 

4. 관리자 모드에서는 id.txt 파일에 있는 계정으로 로그인 할 수 있다.

더보기

admin 1234

admin1 12345

 

5. 관리자 모드에서는 id.txt 파일에 계정을 추가할수 있다.

 

6. 관리자 모드에서는 메뉴의 추가/수정/삭제 가능하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

import datetime
import os.path


def read_file(path):
    with open(path, 'r') as f:
        return list(map(lambda x: x.replace("\n", ""), f.readlines()))


def write_file(path, data: list, mode):
    with open(path, mode) as f:
        lines = "\n".join(data)
        f.writelines(lines)


def create_receipt(path, order, cost ):
    now = datetime.datetime.now()
    data = [f"Time:{now} Model:{order[0]} Amount:{order[1]} Cost:{cost}\n"]
    print(data[0][:-1])
    write_file(path, data, "a+")


def read_menus(path, show=True):
    lines = read_file(path)
    if show:
        [print(menu) for menu in lines]
    return [line.split(" ") for line in lines]


def write_menus(path, menus):
    menus = [" ".join(map(str, menu)) for menu in menus]
    write_file(path, menus, "w")


def find_menu(target, menus):
    for i, menu in enumerate(menus):
        if target == menu[0]:
            return True, i
    return False, False


def process_menu(order, menus, reciept_path):
    data = find_menu(order[0], menus)
    if data[0]:
        menu = menus[data[1]]
        if order[0] == menu[0]:
            if int(menu[2]) >= int(order[1]):
                menu[2] = int(menu[2]) - int(order[1])
                cost = int(order[1]) * int(menu[1])
                create_receipt(reciept_path, order, cost)
                print(f"{order[0]} {order[1]}개 {cost}원 주문되었습니다.\n")
            else:
                print("수량이 부족합니다.")
    else:
        print("해당 메뉴가 없습니다.")


def is_amount(menus):
    for menu in menus:
        if int(menu[2]):
            return True
    return False


def process_order(menus_path, receipt_path):
    menus = read_menus(menus_path)
    if is_amount(menus):
        order = input("any order?").split(" ")
        process_menu(order, menus, receipt_path)
        write_menus(menus_path, menus)
    else:
        print("모든 메뉴가 품절입니다.")


def login(id_path):
    accounts = read_file(id_path)
    print(accounts)
    for _ in range(3):
        account = input("아이디 비밀번호를 입력하세요\n")
        if account in accounts:
            print("로그인 되었습니다.")
            return True
    print("다음에 다시 시도하세요")
    return False


def add_id(cmd, id_path):
    if len(cmd) == 2:
        account = [" ".join(cmd)]
        accounts = read_file(id_path) + account
        write_file(id_path, accounts, "w")
        print(f"id:{cmd[0]} pw:{cmd[1]} 추가 되었습니다.")
    else:
        print("잘못된 명령어 입니다.")


def add_menu(cmd, menu_path):
    if len(cmd) == 3 and cmd[1].isdigit() and cmd[2].isdigit():
        menu, price, amount = cmd
        if os.path.isfile(menu_path):
            menus = read_file(menu_path) + [" ".join(cmd)]
        else:
            menus = [" ".join(cmd)]
        write_file(menu_path, menus, "w")
        print(f"menu:{menu} price:{price} amount:{amount} 가 추가되었습니다.")
    else:
        print("잘못된 명령어 입니다.")


def remove_menu(cmd, menu_path):
    if len(cmd) == 1:
        menu_name = cmd[0]
        menus = read_menus(menu_path, show=False)
        data = find_menu(menu_name, menus)
        if data[0]:
            new_menus = [menu for i, menu in enumerate(menus) if i != data[1]]
            write_menus(menu_path, new_menus)
            print(f"{menus[data[1]]} 메뉴 삭제 되었습니다.")
        else:
            print("없는 메뉴 입니다.")
    else:
        print("잘못된 명령어 입니다.")


def change_menu(cmd, menu_path):
    if len(cmd) == 4:
        print(cmd[:1])
        print(cmd[1:])
        remove_menu(cmd[:1], menu_path)
        add_menu(cmd[1:], menu_path)
    else:
        print("잘못된 명령어 입니다.")


def process_admin(id_path, menu_path):
    if login(id_path):
        cmds = "add_id id pw\n" \
               "add_menu menu price amount\n" \
               "change_menu menu new_menu new_price new_amount\n" \
               "remove_menu menu\n"
        cmd = input(cmds).split(" ")
        if cmd[0] == "add_id":
            add_id(cmd[1:], id_path)
        elif cmd[0] == "add_menu":
            add_menu(cmd[1:], menu_path )
        elif cmd[0] == "change_menu":
            change_menu(cmd[1:], menu_path)
        elif cmd[0] == "remove_menu":
            remove_menu(cmd[1:], menu_path)
        else:
            print("잘못된 명령어 입니다.")


def process_main(id_path, menu_path, receipt_path):
    cmds = """1. 주문하기\n2. 관리자모드\n"""
    cmd = input(cmds)
    if cmd == "1":
        process_order(menu_path, receipt_path)
    elif cmd == "2":
        process_admin(id_path, menu_path)
    else:
        print("잘못된 명령어 입니다.")


while True:
    process_main("id.txt", "menus.txt", "receipt.txt")



'python lecture > project' 카테고리의 다른 글

[python] # 연산 하기  (0) 2020.05.11
[python] 원소기호 맞추기  (0) 2020.05.09
[blockchain] 블록체인 예제  (0) 2020.05.07
[python] 해시의 무결성  (0) 2020.05.07
[edu] 연락처 (class, 연산자 오버로드)  (0) 2020.03.16
댓글