Python - Kiosk_Final

๋‹‰๋„ค์ž„์œ ์ €ยท2023๋…„ 9์›” 1์ผ
0

Python - Vending_machine

๋ชฉ๋ก ๋ณด๊ธฐ
5/5
post-thumbnail

๐Ÿ“Œ ์˜์ˆ˜์ฆ ์ถ”๊ฐ€ , ์„ธ๊ธˆ ํ™˜์œจ ์ถ”๊ฐ€

๐Ÿ‘‰ ๊ธฐ๋Šฅ ๊ฐœ์„  ๋ฐ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ ์ถ”๊ฐ€



๐Ÿ’Ž ์ˆœ์„œ๋„


๐Ÿ“Œ Full Code

import csv

class Kiosk:
    def __init__(self, mac_list=None, admin_key=9712):
        if mac_list is None:  # ์ด๊ฑฐ ํ•˜๋ฉด ์•ˆ๋จ , ๋ฉ”๋‰ด๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์–ด์„œ ๋ณ€๊ฒฝ์ด ์•ˆ๋จ , ํ• ๊บผ๋ฉด ์‹คํ–‰ ๋ถ€๋ถ„์„ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ์„ ํ•˜๊ณ ๋‚˜์„œ ์ž‘์—…์„ ํ•ด์•ผํ•จ
            if mac_list is None:
                self.load_menu_from_csv('menu.csv')
            else:
                self.mac_list = mac_list
        self.balance = 0  # ์ž”๊ธˆ ๋ณ€์ˆ˜
        self.select_dict = {}  # ๋ฉ”๋‰ด๋ฅผ ๋‹ด์„ ๋ณ€์ˆ˜ { ๋ฉ”๋‰ด : ๊ฐฏ์ˆ˜ } ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.
        self.admin_key = admin_key  # ๊ด€๋ฆฌ์ž ํ‚ค ๋ฒˆํ˜ธ ์ €์žฅ ๋ณ€์ˆ˜
        self.revenue = 0  # ๋งค์ถœ ์ €์žฅ ๋ณ€์ˆ˜

    def load_menu_from_csv(self, csv_filename): # ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์ด๋Š” ๋ฉ”์„œ๋“œ , ๊ด€๋ฆฌ์ž๋Š” ์—ฌ๊ธฐ์„œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
        self.mac_list = []
        with open(csv_filename, newline="", encoding="utf-8") as csv_file:
            reader = csv.DictReader(csv_file)
            for row in reader:
                menu_item = {
                    "menu": row["menu"],
                    "price": int(row["price"]),
                    "quantity": int(row["quantity"])
                }
                self.mac_list.append(menu_item)

    def save_receipt(self):
        if not self.select_dict:
            print('')
            return

        total_price_with_tax = self.calculate_total_price_with_tax()

        with open('receipt.csv', 'a', newline='', encoding='utf-8') as csv_file:
            writer = csv.writer(csv_file)
            if csv_file.tell() == 0:
                writer.writerow(['์ฃผ๋ฌธ๋ฒˆํ˜ธ', '๋ฉ”๋‰ด', '์ˆ˜๋Ÿ‰', '์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ)'])

            for index, (menu, quantity) in enumerate(self.select_dict.items(), start=1):
                menu_index = self.find_menu_index(menu)
                price_per_item = self.mac_list[menu_index]['price']
                total_price_per_item = price_per_item * quantity
                row = [index, menu, quantity, total_price_per_item]
                writer.writerow(row)

            # ์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ) ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ CSV ํŒŒ์ผ์— ์ €์žฅ
            writer.writerow(['์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ) : ' f'{total_price_with_tax:.0f}์›'])

            print("--------์˜์ˆ˜์ฆ--------")
            for index, (menu, quantity) in enumerate(self.select_dict.items(), start=1):
                menu_index = self.find_menu_index(menu)
                price_per_item = self.mac_list[menu_index]['price']
                total_price_per_item = price_per_item * quantity
                print(f"{index}. {menu} {quantity}๊ฐœ : {total_price_per_item:}์›")

            print(f"์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ): {int(total_price_with_tax):}์›")
            print('์˜์ˆ˜์ฆ์ด ์ถœ๋ ฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.')

            self.reset_balance_and_cart()

    # ์ฃผ์š” ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    def run(self):
        while True:
            print('                ๋ฒ„๊ฑฐ์ง‘ ํ‚ค์˜ค์Šคํฌ')
            print()
            self.show_menu('ํ–„๋ฒ„๊ฑฐ ์ฝ”๋„ˆ', '๋ถˆ๊ณ ๊ธฐ ๋ฒ„๊ฑฐ', '๋”๋ธ” ๋”๋ธ” ๋ฒ„๊ฑฐ')
            self.show_menu('์ƒ๋Ÿฌ๋“œ ์ฝ”๋„ˆ', '์œ ์ฑ„ ์ƒ๋Ÿฌ๋“œ', '์–‘ํŒŒ ์ƒ๋Ÿฌ๋“œ')
            self.show_menu('์Œ๋ฃŒ ์ฝ”๋„ˆ', '์ฝœ๋ผ', '์‚ฌ์ด๋‹ค')
            print()
            continue_order = True  # ๊ฒฐ์ œ ๋ถ€๋ถ„์ด ์ฐธ์ด๋‹ค
            while continue_order:  # ๋ฐ˜๋ณต๋ฌธ ์‹œ์ž‘
                self.select_item()  # ๋ฉ”๋‰ด๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฉ”์„œ๋“œ ์‹œ์ž‘
                continue_order = self.payment_procedure()  # ๋ฉ”๋‰ด ๋ถ€๋ถ„์„ ์„ ํƒํ•˜๋ฉด ๊ฒฐ์ œ ๋ถ€๋ถ„์ด ์ฐธ์œผ๋กœ ์ธ์‹ , ๋ฉ”์„œ๋“œ ์„ ์–ธ
                if not continue_order:  # ๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด
                    self.save_receipt()  # ์˜์ˆ˜์ฆ ์ €์žฅ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

    def show_menu(self, title, start_item, end_item):  # ๋ฉ”๋‰ด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฉ”์„œ๋“œ
        print(f'                 {title}')  # ๋ฉ”๋‰ด ์ œ๋ชฉ
        flag = False  # ํ”Œ๋ž˜๊ทธ๋Š” false ๊ฐ’ ์„ ์–ธ
        for i, item in enumerate(self.mac_list):  # mac_list ์—์„œ ์ธ๋ฑ์Šค ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
            if item["menu"] == start_item:  # ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฉ”๋‰ด๋ฅผ ์ฐพ๊ณ  , ๊ทธ๊ฒƒ์ด ์ฒซ๋ฒˆ์งธ ์‹œ์ž‘ํ•˜๋Š” ์•„์ดํ…œ๊ณผ ๊ฐ™์„๊ฒฝ์šฐ
                flag = True  # ๋ฐ˜๋ณต๋ฌธ์€ ์ฐธ์ด๋˜๊ณ  ์‹คํ–‰๋œ๋‹ค.
            if flag:
                print(f'{i + 1}. {item["menu"]} : {item["price"]}์› ', end=' ')  # ๋ฐ˜๋ณต๋ฌธ์ด ์ฐธ๊ฐ’์ด๋ฉด , ์ด๋Ÿฐ๋ฐฉ์‹์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
            if item["menu"] == end_item:  # ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฉ”๋‰ด๋ฅผ ์ฐพ๊ณ  , ๊ทธ๊ฒƒ์ด ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ๊ณผ ๊ฐ™์„๊ฒฝ์šฐ
                flag = False  # ์ฐพ์•˜์œผ๋‹ˆ false ๊ฐ’ ์„ ์–ธ
                break  # ๋”์ด์ƒ ์ฐพ์„ ํ•„์š”์—†์œผ๋‹ˆ ์ข…๋ฃŒ
        print()

    def show_select_menu_items(self):  # ์„ ํƒ๋œ ์•„์ดํ…œ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฉ”์„œ๋“œ
        # ์ •๋ ฌ
        sorted_items = sorted(self.select_dict.items(), key=lambda item: self.find_menu_index(item[0]))
        # ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ‘œํ˜„์‹ : menu_idx = next((i for i, item in enumerate(self.mac_list) if item['menu'] == menu), None)
        for menu, quantity in sorted_items:
            menu_idx = self.find_menu_index(menu)
            for i, item in enumerate(self.mac_list):  # self.mac_list์—์„œ ํ•ด๋‹น ๋ฉ”๋‰ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.
                if item['menu'] == menu:  # mac_list ์— ์žˆ๋Š” 'menu' ์˜ ๊ฐ’์ด ์ผ์น˜ํ•  ๊ฒฝ์šฐ
                    menu_idx = i  # ์ธ๋ฑ์Šค ๊ฐ’ ์ฐพ๊ธฐ
                    break  # ์ผ์น˜ํ•˜๋Š” ๋ฉ”๋‰ด๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด ๋” ์ด์ƒ ์ฐพ์„ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ loop ์ข…๋ฃŒ

            if menu_idx is not None:  # ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•˜์œผ๋ฉด
                print(f'๋ฉ”๋‰ด ๋ฒˆํ˜ธ : {menu_idx + 1}๋ฒˆ , {menu} : {quantity} ๊ฐœ')  # ์ถœ๋ ฅ

    def update_balance_and_inventory(self, menu_index, qty):  # ๋ฉ”๋‰ด๋ฅผ ์ฐพ๊ณ  ๋”•์…”๋„ˆ๋ฆฌ์— ์„ ํƒ๋œ ๋ฉ”๋‰ด๋ฅผ ์ถ”๊ฐ€๋ฅผ ํ•˜๋Š” ๋ฉ”์„œ๋“œ
        # ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์€ , ๋ฉ”๋‰ด ์ธ๋ฑ์Šค ๊ฐ’๊ณผ , ๊ฐฏ์ˆ˜(์ˆ˜๋Ÿ‰)
        select_price = self.mac_list[menu_index - 1]['price']
        self.balance += select_price * qty  # ์ž”๊ธˆ ์ˆ˜๋Ÿ‰ ์—…๋ฐ์ดํŠธ (์ถ”๊ฐ€)
        self.revenue += select_price * qty  # ๋งค์ถœ์„ ์—…๋ฐ์ดํŠธ (์ถ”๊ฐ€)
        self.mac_list[menu_index - 1]['quantity'] -= qty  # ์„ ํƒ๋œ ์ˆ˜๋Ÿ‰๋งŒํผ ์›๋ž˜ mac_list ์—์„œ ๊ฐฏ์ˆ˜(์ˆ˜๋Ÿ‰) ์ œ๊ฑฐ
        if self.mac_list[menu_index - 1]['menu'] in self.select_dict:  # ๋งŒ์•ฝ mac_list ์˜ ๋ฉ”๋‰ด ์•ˆ์— ์„ ํƒ๋œ ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ
            self.select_dict[self.mac_list[menu_index - 1]['menu']] += qty  # ์„ ํƒ๋œ ๋”•์…”๋„ˆ๋ฆฌ์˜ ํ•ด๋‹น ๋ฉ”๋‰ด์— ๊ฐฏ์ˆ˜ (์ˆ˜๋Ÿ‰)์ด ์ถ”๊ฐ€
        else:  # ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด
            self.select_dict[self.mac_list[menu_index - 1]['menu']] = qty  # ์„ ํƒ๋œ ๋ฉ”๋‰ด์˜ ์ˆ˜๋Ÿ‰์€ ๋™์ผํ•˜๋‹ค.
        selected_item = self.mac_list[menu_index - 1]['menu']  # ํ•ด๋‹น ๋ฉ”๋‰ด์˜ ๋ณ€์ˆ˜ ์„ ์–ธ
        print(f'{selected_item} {qty}๊ฐœ๋ฅผ ์„ ํƒํ•˜์…จ์Šต๋‹ˆ๋‹ค.')  # ์„ ํƒ๋œ ๋ฉ”๋‰ด์™€ , ๊ฐฏ์ˆ˜ ์„ ์–ธ
        print()

    def select_item(self):  # ๋ฉ”๋‰ด๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฉ”์„œ๋“œ
        while True:
            try:
                select_menu = int(
                    input('๋ฉ”๋‰ด ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ ํ•ด์ฃผ์„ธ์š” , "0" ์„ ์ž…๋ ฅํ•˜์‹œ๋ฉด ๊ฒฐ์ œ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. "10" ์„ ์ž…๋ ฅํ•˜์‹œ๋ฉด ์„ ํƒํ•œ ๋ฉ”๋‰ด๋ฅผ ๋ณด์—ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. : '))  # ์ฐจ๊ฐํ•˜๋Š” ์ž…๋ ฅ ๋ณ€์ˆ˜ ์„ ์–ธ
                print()

                if select_menu == self.admin_key:  # ์ž…๋ ฅ ๋ณ€์ˆ˜์— 9712 ๋ฅผ ์ž…๋ ฅํ•˜์˜€์„ ๊ฒฝ์šฐ
                    self.admin_page()  # ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋กœ ์ž…์žฅ
                    continue

                if select_menu == 0:  # 0์„ ์ž…๋ ฅํ• ์‹œ ๊ฒฐ์ œ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•จ
                    if not self.select_dict:  # ๋งŒ์•ฝ ์„ ํƒ๋œ ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์—†์„๊ฒฝ์šฐ?
                        print('์„ ํƒํ•˜์‹  ๋ฉ”๋‰ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค, ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”')  # ์„ ํƒ๋œ ๋ฉ”๋‰ด๊ฐ€ ์—†๋‹ค๊ณ  ์ถœ๋ ฅ
                        continue  # ๋‹ค์‹œ๋Œ์•„๊ฐ€๊ธฐ
                    else:
                        break  # while ํƒˆ์ถœ, ๊ณ„์‚ฐ

                if select_menu == 10:  # 10์„ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ
                    if self.select_dict:  # ์„ ํƒ๋œ ๋”•์…”๋„ˆ๋ฆฌ์— ์žˆ๋Š” ๋ฉ”๋‰ด๋ฅผ ์ „๋ถ€ ๋ณด์—ฌ์คŒ
                        print(f'ํ˜„์žฌ ์„ ํƒํ•œ ๋ฌผํ’ˆ')
                        self.show_select_menu_items()  # ์„ ํƒ๋œ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜์—ฌ ๋ณด์—ฌ์คŒ

                        change_menu = int(input('์ˆ˜๋Ÿ‰์„ ๋ณ€๊ฒฝํ•  ๋ฉ”๋‰ด์˜ ๋ฒˆํ˜ธ๋ฅผ ์„ ํƒํ•˜์„ธ์š” , 0 ์„ ์ž…๋ ฅํ•˜์‹œ๋ฉด ์ด์ „ํ™”๋ฉด์œผ๋กœ ๋˜๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. : '))

                        if change_menu == 0:
                            print()
                            self.show_menu('ํ–„๋ฒ„๊ฑฐ ์ฝ”๋„ˆ', '๋ถˆ๊ณ ๊ธฐ ๋ฒ„๊ฑฐ', '๋”๋ธ” ๋”๋ธ” ๋ฒ„๊ฑฐ')
                            self.show_menu('์ƒ๋Ÿฌ๋“œ ์ฝ”๋„ˆ', '์œ ์ฑ„ ์ƒ๋Ÿฌ๋“œ', '์–‘ํŒŒ ์ƒ๋Ÿฌ๋“œ')
                            self.show_menu('์Œ๋ฃŒ ์ฝ”๋„ˆ', '์ฝœ๋ผ', '์‚ฌ์ด๋‹ค')
                            print()
                            continue

                        if change_menu <= 0 or change_menu > len(self.mac_list):
                            print('์˜ฌ๋ฐ”๋ฅธ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค')
                            continue

                        menu_name = self.mac_list[change_menu - 1]['menu']  # ๋ฉ”๋‰ด ์ด๋ฆ„ ํ™•์ธ

                        if menu_name not in self.select_dict:  # ์„ ํƒ๋œ ๋”•์…”๋„ˆ๋ฆฌ์— ํ•ด๋‹น ๋ฉ”๋‰ด๊ฐ€ ์—†๋‹ค๋ฉด
                            print('ํ•ด๋‹น ๋ฉ”๋‰ด๊ฐ€ ๊ตฌ๋งค์„ ํƒ์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์„ ํƒํ•ด์ฃผ์„ธ์š”')
                            continue

                        new_quantity = int(
                            input(f'๋ณ€๊ฒฝํ•  ์ˆ˜๋Ÿ‰์„ ์ž…๋ ฅํ•˜์„ธ์š” (ํ˜„์žฌ ์ˆ˜๋Ÿ‰: {self.select_dict[menu_name]}๊ฐœ): '))  # ์ƒˆ๋กœ์šด ์ˆ˜๋Ÿ‰ ์ž…๋ ฅ ๋ฐ›๊ธฐ

                        if new_quantity < 0:
                            print('์˜ฌ๋ฐ”๋ฅธ ์ˆ˜๋Ÿ‰์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.')
                            continue

                        # ์„ ํƒ๋œ ๋”•์…”๋„ˆ๋ฆฌ์— ํ•ด๋‹น ๋ฉ”๋‰ด์˜ ์ˆ˜๋Ÿ‰์„ ์ƒˆ๋กœ ์ž…๋ ฅํ•œ ์ˆ˜๋Ÿ‰์œผ๋กœ ๋ณ€๊ฒฝ
                        self.select_dict[menu_name] = new_quantity
                        print(f"{menu_name}์˜ ์ˆ˜๋Ÿ‰์ด {new_quantity}๊ฐœ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
                        continue

                    else:
                        print('ํ˜„์žฌ ์„ ํƒ๋œ ๋ฌผํ’ˆ์ด ์—†์Šต๋‹ˆ๋‹ค.')
                        continue  # ๋ฐ˜๋ณต๋ฌธ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

                if select_menu <= 0 or select_menu > len(self.mac_list):
                    print('์˜ฌ๋ฐ”๋ฅธ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค')
                    continue

                select_quantity = int(input('๋ช‡ ๊ฐœ๋ฅผ ๊ตฌ๋งคํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? 0์„ ์ž…๋ ฅํ•˜์‹œ๋ฉด ๊ตฌ๋งค๋ฅผ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. : '))  # ๋ช‡๊ฐœ๋ฅผ ๊ตฌ๋งคํ•˜๊ฒ ๋ƒ๋Š” ์ž…๋ ฅ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ

                if select_quantity == 0:  # 0์„ ์ž…๋ ฅํ•˜์˜€์„๊ฒฝ์šฐ
                    print('๊ตฌ๋งค๊ฐ€ ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.')  # ์„ ํƒ์„ ์ทจ์†Œํ•˜๊ณ  ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
                    continue

                if self.mac_list[select_menu - 1]['quantity'] < select_quantity:  # ๋ฆฌ์ŠคํŠธ์˜ ์ˆ˜๋Ÿ‰ ๊ฐฏ์ˆ˜๊ฐ€ ์„ ํƒ๋œ ์ˆ˜๋Ÿ‰๊ฐฏ์ˆ˜๋ณด๋‹ค ์ ์„๊ฒฝ์šฐ
                    print('ํ•ด๋‹น ๋ฉ”๋‰ด์˜ ์žฌ๊ณ ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฉ”๋‰ด๋กœ ๋‹ค์‹œ ์„ ํƒํ•ด์ฃผ์„ธ์š”.')  # ์žฌ๊ณ ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ถœ๋ ฅ
                    continue  # ๋ฐ˜๋ณต๋ฌธ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

                self.update_balance_and_inventory(select_menu,select_quantity)  # menu - menu_index, quantity - qty ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฝ์ž… , ์ž”๊ธˆ ์ˆ˜๋Ÿ‰๊ณผ ๋งค์ถœ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  , ์ˆ˜๋Ÿ‰์„ ์„ ํƒ๋œ ๋”•์…”๋„ˆ๋ฆฌ์— ๋„ฃ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธ

            except ValueError:  # ์ž˜๋ชป ์ž…๋ ฅํ•˜์˜€์„๋•Œ์˜ ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฌธ
                print('์ž…๋ ฅ์ด ์ž˜๋ชป๋˜์…จ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”')
                continue  # ๋ฐ˜๋ณต๋ฌธ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

    def reset_balance_and_cart(self):  # ๊ณ„์‚ฐ์„ ์ดˆ๊ธฐํ™” ์‹œํ‚ค๋Š” ๋ฉ”์„œ๋“œ
        self.balance = 0  # ๊ณ„์‚ฐ์ด ๋๋‚˜๊ณ  ๋ชจ๋“  ์ž”๊ธˆ์„ ์ดˆ๊ธฐํ™” ์‹œํ‚ค๋Š” ๋ณ€์ˆ˜
        self.select_dict = {}  # ์„ ํƒํ•œ ๋ฉ”๋‰ด ์ดˆ๊ธฐํ™” ์ถ”๊ฐ€ - ํ˜„์žฌ ์–˜๊ฐ€ ์›์ธ์ธ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ์ด ๋˜๋Š”๋ฐ...

    def find_menu_index(self, menu):
        for i, item in enumerate(self.mac_list):
            if item['menu'] == menu:
                return i
        return -1  # ๋ฉ”๋‰ด๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ -1 ๋ฐ˜ํ™˜

    def payment_procedure(self):  # ๊ฒฐ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ
        while True:  # ๋ฐ˜๋ณต๋ฌธ ์‹œ์ž‘
            payment = input(
                f'์ด ๊ตฌ๋งค ๋‚ด์—ญ์€ : {", ".join([f"{menu} {count}๊ฐœ" for menu, count in self.select_dict.items()])} ์ž…๋‹ˆ๋‹ค.\n'
                f'์ด ๊ฐ€๊ฒฉ์€ {self.balance}์› ์ž…๋‹ˆ๋‹ค. ๊ฒฐ์ œ ์ง„ํ–‰ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? '
                f'๊ฒฐ์ œํ•˜๋ ค๋ฉด "x" ์ž…๋ ฅ , ์ถ”๊ฐ€๋กœ ๊ฒฐ์ œํ•˜๋ ค๋ฉด "c"๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์‹ญ์‹œ์˜ค. : ')  # ์ž…๋ ฅ๋ณ€์ˆ˜ ์„ ์–ธ
            print()
            if payment == 'c':  # c๋ฅผ ์ž…๋ ฅํ•˜๋ฉด True ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋˜์–ด , ์ถ”๊ฐ€๋กœ ๊ฒฐ์ œ๋ฅผ ์ง„ํ–‰ํ• ์ˆ˜ ์žˆ๋„๋ก ํ•จ
                return True  # ๋ฐ˜๋ณต๋ฌธ์˜ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ
            elif payment == 'x':  # x๋ฅผ ์ž…๋ ฅํ•˜๋ฉด
                while True:  # ๋‹ค์‹œ ๋ฐ˜๋ณต๋ฌธ์„ ์‹œ์ž‘
                    try:
                        money = int(input('ํ˜„๊ธˆ์„ ๋„ฃ์–ด์ฃผ์„ธ์š” : '))  # ํ˜„๊ธˆ์„ ์ž…๋ ฅํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ
                        break  # ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ
                    except ValueError:  # ์ž˜๋ชป๋œ ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜์˜€์„๋•Œ์˜ ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฌธ
                        print('์ž˜๋ชป๋œ ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์ •์ˆ˜ ํ˜•ํƒœ๋กœ ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.')
                if money < self.balance:  # ํ˜„๊ธˆ๋ณ€์ˆ˜๊ฐ€ ์ž”๊ธˆ ๋ณ€์ˆ˜ ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด , self.balance : (select_price) * qty ๋ผ์„œ ์ž”๊ธˆ ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ์˜ ์ธ๋ฑ์Šค๊ฐ’ + ๊ฐ€๊ฒฉ๋ณ€์ˆ˜ * ์ˆ˜๋Ÿ‰์„ ๋”ํ•œ ๊ฐ’์ด๋‹ค.
                    print('ํ˜„๊ธˆ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค, ๋‹ค์‹œ ๋„ฃ์–ด์ฃผ์„ธ์š”')  # ํ˜„๊ธˆ์ด ๋ถ€์กฑํ•˜๋‹ค๋ฉด ์ถœ๋ ฅํ•˜๊ณ  ๋ฐ˜๋ณต๋ฌธ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
                    continue
                else:
                    change = money - self.balance  # ๊ฒฐ์ œ ์™„๋ฃŒ ๋Œ€๊ธˆ์€ ํ˜„๊ธˆ๋ณ€์ˆ˜ - ์ž”๊ธˆ ๋ณ€์ˆ˜
                    print(
                        f'๊ตฌ๋งค ๋‚ด์—ญ์€ : {", ".join([f"{menu} {count}๊ฐœ" for menu, count in self.select_dict.items()])} ์ž…๋‹ˆ๋‹ค. \n'
                        f'๊ฒฐ์ œ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž”๊ธˆ : {change} ์ž…๋‹ˆ๋‹ค. \n'
                        f'์ด์šฉํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.')  # "," join์œผ๋กœ ๋ฌถ๊ณ  , for๋ฌธ์œผ๋กœ ์„ ํƒ๋œ ๋”•์…”๋„ˆ๋ฆฌ์˜ ์•„์ดํ…œ (๋ฉ”๋‰ด, ์ˆ˜๋Ÿ‰)์„ ๋ณด์—ฌ์ค€๋‹ค.
                    print()
                    self.save_receipt()
                    # self.reset_balance_and_cart()  # ์ž”๊ธˆ , ๋ฉ”๋‰ด ์ดˆ๊ธฐํ™”
                    return False  # ๋ฆฌํ„ด๊ฐ’์„ false๋กœ ์ฃผ์–ด์„œ ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ
            else:
                print('์ž…๋ ฅ์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.')
                continue

    def calculate_total_price_with_tax(self):  # ์„ธ๊ธˆ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฉ”์„œ๋“œ
        total_price = sum(self.mac_list[self.find_menu_index(menu)]['price'] * quantity for menu, quantity in
                          self.select_dict.items())
        tax_rate = 0.1  # 10% ์„ธ๊ธˆ
        total_price_with_tax = total_price * (1 + tax_rate)
        return total_price_with_tax

    def admin_page(self):  # ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ์ ‘์†
        print('๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜์˜€์Šต๋‹ˆ๋‹ค.')
        while True:
            print('1. ์žฌ๊ณ  ํ™•์ธ')
            print('2. ์žฌ๊ณ  ์ถ”๊ฐ€')
            print('3. ๋งค์ถœ ํ™•์ธ')  # ๋งค์ถœ ํ™•์ธ ๋ฉ”๋‰ด ์ถ”๊ฐ€
            print('4. ๋‚˜๊ฐ€๊ธฐ')
            choice = int(input('์›ํ•˜๋Š” ๋ฉ”๋‰ด ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”: '))  # ์ž…๋ ฅ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ
            if choice == 1:
                self.check_inventory()  # ์žฌ๊ณ  ํ™•์ธ
            elif choice == 2:
                self.add_inventory()  # ์žฌ๊ณ  ์ถ”๊ฐ€
            elif choice == 3:
                self.check_revenue()  # ๋งค์ถœ ํ™•์ธ ๊ธฐ๋Šฅ ํ˜ธ์ถœ
            elif choice == 4:
                print()
                self.show_menu('ํ–„๋ฒ„๊ฑฐ ์ฝ”๋„ˆ', '๋ถˆ๊ณ ๊ธฐ ๋ฒ„๊ฑฐ', '๋”๋ธ” ๋”๋ธ” ๋ฒ„๊ฑฐ')
                self.show_menu('์ƒ๋Ÿฌ๋“œ ์ฝ”๋„ˆ', '์œ ์ฑ„ ์ƒ๋Ÿฌ๋“œ', '์–‘ํŒŒ ์ƒ๋Ÿฌ๋“œ')
                self.show_menu('์Œ๋ฃŒ ์ฝ”๋„ˆ', '์ฝœ๋ผ', '์‚ฌ์ด๋‹ค')
                print()
                break
            else:
                print('์˜ฌ๋ฐ”๋ฅธ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.')

    def check_inventory(self):  # ์žฌ๊ณ  ํ™•์ธ
        for i, item in enumerate(self.mac_list):  # ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š”๊ฐ’์„ ๊ฒจ์™€์„œ ๋ฉ”๋‰ด์™€ ํ•ด๋‹น ์žฌ๊ณ ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
            print(f"{i + 1}. {item['menu']} - ์žฌ๊ณ : {item['quantity']}๊ฐœ")
        print()

    def add_inventory(self):  # ์žฌ๊ณ  ์ถ”๊ฐ€ ํ•  ๋ถ€๋ถ„
        for i, item in enumerate(self.mac_list):
            print(f"{i + 1}. {item['menu']}")
        item_number = int(input('์žฌ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•  ๋ฉ”๋‰ด์˜ ๋ฒˆํ˜ธ๋ฅผ ์„ ํƒํ•˜์„ธ์š”: '))
        add_quantity = int(input('์ถ”๊ฐ€ํ•  ์žฌ๊ณ ์˜ ์–‘์„ ์ž…๋ ฅํ•˜์„ธ์š”: '))
        self.mac_list[item_number - 1]['quantity'] += add_quantity  # ํ•ด๋‹น ์žฌ๊ณ  ์ถ”๊ฐ€
        print(f"{self.mac_list[item_number - 1]['menu']}์˜ ์žฌ๊ณ ๊ฐ€ {add_quantity}๊ฐœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")  # ์ถ”๊ฐ€๋œ ๋‚ด์šฉ ํ‘œ์‹œ
    print()

    def check_revenue(self):
        print(f'ํ˜„์žฌ ๋งค์ถœ์€ {self.revenue}์› ์ž…๋‹ˆ๋‹ค.')

        receipt_data = []
        with open('receipt.csv', 'r', encoding='utf-8') as csv_file:
            reader = csv.reader(csv_file)
            next(reader)  # ํ—ค๋” ์Šคํ‚ต
            for row in reader:
                receipt_data.append(row)

        for order_number, menu, quantity, total_price in receipt_data:
            print(f'์ฃผ๋ฌธ๋ฒˆํ˜ธ: {order_number}, ๋ฉ”๋‰ด: {menu}, ์ˆ˜๋Ÿ‰: {quantity}, ์ด ๊ฐ€๊ฒฉ: {total_price}์›')

        print()

        if len(receipt_data) < len(self.select_dict):
            print('์•„๋ž˜ ๋ฉ”๋‰ด์˜ ๋งค์ถœ์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:')
            receipt_menu_names = [row[1] for row in receipt_data]
            for menu, quantity in self.select_dict.items():
                if menu not in receipt_menu_names:
                    print(f'{menu} - {quantity}๊ฐœ')

if __name__ == '__main__':  # ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘์ ์ผ๋•Œ๋งŒ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    kiosk = Kiosk()  # ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™”
    kiosk.run()  # run ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ผ
menu.csv


menu,price,quantity
๋ถˆ๊ณ ๊ธฐ ๋ฒ„๊ฑฐ,3000,100
์œ ๋กœํ”ผ์–ธ ๋ฒ„๊ฑฐ,4000,100
๋”๋ธ” ๋”๋ธ” ๋ฒ„๊ฑฐ,4500,100
์œ ์ฑ„ ์ƒ๋Ÿฌ๋“œ,2500,100
๊ฐ์ž ์ƒ๋Ÿฌ๋“œ,2000,100
์–‘ํŒŒ ์ƒ๋Ÿฌ๋“œ,2000,100
์ฝœ๋ผ,2000,200
์‰์ดํฌ,2500,200
์‚ฌ์ด๋‹ค,2000,200
receipt.csv


์ฃผ๋ฌธ๋ฒˆํ˜ธ,๋ฉ”๋‰ด,์ˆ˜๋Ÿ‰,์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ)

1,๋ถˆ๊ณ ๊ธฐ ๋ฒ„๊ฑฐ,10,30000
2,์œ ๋กœํ”ผ์–ธ ๋ฒ„๊ฑฐ,10,40000
3,์ฝœ๋ผ,10,20000
์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ) : 99000์›
1,๋ถˆ๊ณ ๊ธฐ ๋ฒ„๊ฑฐ,10,30000
2,์œ ๋กœํ”ผ์–ธ ๋ฒ„๊ฑฐ,10,40000
3,์ฝœ๋ผ,10,20000
์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ) : 99000์›
1,๋ถˆ๊ณ ๊ธฐ ๋ฒ„๊ฑฐ,10,30000
2,์œ ๋กœํ”ผ์–ธ ๋ฒ„๊ฑฐ,10,40000
3,๋”๋ธ” ๋”๋ธ” ๋ฒ„๊ฑฐ,10,45000
4,์‰์ดํฌ,10,25000
5,์‚ฌ์ด๋‹ค,10,20000
์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ) : 176000์›
1,๋ถˆ๊ณ ๊ธฐ ๋ฒ„๊ฑฐ,10,30000
2,์œ ๋กœํ”ผ์–ธ ๋ฒ„๊ฑฐ,10,40000
3,๋”๋ธ” ๋”๋ธ” ๋ฒ„๊ฑฐ,10,45000
4,์ฝœ๋ผ,100,200000
์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ) : 346500์›
1,๋ถˆ๊ณ ๊ธฐ ๋ฒ„๊ฑฐ,10,30000
2,์œ ๋กœํ”ผ์–ธ ๋ฒ„๊ฑฐ,10,40000
3,์ฝœ๋ผ,10,20000
์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ) : 99000์›
1,๋ถˆ๊ณ ๊ธฐ ๋ฒ„๊ฑฐ,10,30000
2,์œ ๋กœํ”ผ์–ธ ๋ฒ„๊ฑฐ,1,4000
3,๋”๋ธ” ๋”๋ธ” ๋ฒ„๊ฑฐ,2,9000
์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ) : 47300์›
1,๋ถˆ๊ณ ๊ธฐ ๋ฒ„๊ฑฐ,10,30000
์ด ๊ฐ€๊ฒฉ (์„ธ๊ธˆ ํฌํ•จ) : 33000์›
profile
์ด๊ฒƒ์ €๊ฒƒ ๋‹คํ•ด๋ณด๋Š” ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€