Untitled
unknown
plain_text
2 years ago
26 kB
4
Indexable
from time import sleep from datetime import datetime # Print important one line message def print_message(message): length = len(message) if length <= 30: print("*" * 30) print(message) print("*" * 30) else: print("*" * len(message)) print(message) print("*" * len(message)) # User choose for menu def menu_choice(choice1, choice2, choice3 = "", choice4 = ""): print("-" * 30) print(f"1. {choice1}") print(f"2. {choice2}") if choice3 != "": print(f"3. {choice3}") choice = check_input_range(1, 3) elif choice4 != "": print(f"4. {choice4}") choice = check_input_range(1, 4) else: choice = check_input_range(1, 2) print("-" * 30) if choice == 1: return choice1 elif choice == 2: return choice2 elif choice == 3: return choice3 elif choice == 4: return choice4 # Limit user input range based on the menu def check_input_range(lower_limit, upper_limit): while True: try: print("-" * 30) input_choice = int(input(">>> ")) if input_choice < lower_limit or input_choice > upper_limit: raise ValueError except: print_message("Invalid Input! Please Try Again!") sleep(1) else: return input_choice # Limit customer's message to 300 characters def check_message_length(): max_characters = 300 while True: input_message = input("Message for Recipient (Max 300 Characters): ") if len(input_message) > max_characters: print_message("Your Message Should Not Be Longer Than 300 Characters! Please Try Again!") print_message("Your Original Message: " + input_message[:max_characters]) else: break # Determine the delivery charge based on the week def weekend_delivery_charge(input_date): # input_date = datetime.strptime(date_str, "%Y-%m-%d") week = input_date.strftime("%a") if week == "Sat" or week == "Sun": delivery_charge = 10 return delivery_charge else: delivery_charge = 0 return delivery_charge # Check the user input date def is_valid_date(): today_date_and_time = datetime.today() today_date = today_date_and_time.date() print_message(f"Today's Date: {today_date}") while True: input_date = input("Delivery Date (YYYY-MM-DD): ") try: input_date = datetime.strptime(input_date, '%Y-%m-%d').date() if input_date < today_date: print("Invalid Date! Please enter a date on or after today.") continue except ValueError: print_message("Invalid Date! Please Try Again!") sleep(1) else: if input_date > today_date: same_day_delivery = "No" same_day_delivery_charges = 0 weekend_delivery_charges = weekend_delivery_charge(input_date) return same_day_delivery, same_day_delivery_charges, input_date, weekend_delivery_charges elif input_date == today_date: confirmation = input("Same Day Delivery? (Additional Charge of $35 Applies) (Y/N): ") if confirmation.upper() == "Y": same_day_delivery = "Yes" same_day_delivery_charges = 35 weekend_delivery_charges = weekend_delivery_charge(input_date) return same_day_delivery, same_day_delivery_charges, input_date, weekend_delivery_charges else: continue # Let the user choose the shipping option def shipping_option(): print("Shipping Option: ") choice = menu_choice("Store Pick Up", "Delivery") if choice == "Store Pick Up": delivery_address = "-" same_day_delivery = "No" same_day_delivery_charges = 0 delivery_charges = 0 delivery_date = "-" return delivery_date, same_day_delivery, same_day_delivery_charges, delivery_charges, delivery_address elif choice == "Delivery": delivery_address = input("Delivery Address: ") same_day_delivery, same_day_delivery_charges, delivery_date, weekend_delivery_charges = is_valid_date() delivery_charges = 35 + weekend_delivery_charges return delivery_date, same_day_delivery, same_day_delivery_charges, delivery_charges, delivery_address # Print the item content from text file def print_context(mode, attribute_list): row_line = "-" * (30 * len(attribute_list)) for attribute in attribute_list: print(get_aligned_string(attribute, 30), end = "") if mode == "Header": print("\n" + row_line + "\n") elif mode == "Content": print("\n") # Ask and print the order details def get_customer_details(): customer_name = input("Customer's Name: ") recipient_name = input("Recipient's Name: ") message = check_message_length() return customer_name, recipient_name, message # Get item list for summary def get_item_details(item_line, mode): item_str_list = [] id = "-" name = "-" price = "-" if item_line != None: item_str_list = item_line.split(",") if item_str_list != []: id = item_str_list[0] name = item_str_list[1] price = int(item_str_list[-2]) else: new_item_list = ["Add-On:", "", "", 0] return new_item_list if mode == "Bloom": new_item_list = ["Item:"] elif mode == "Add-On": new_item_list = ["Add-On:"] new_item_list.append(id) new_item_list.append(name) new_item_list.append(price) return new_item_list # Get delivery list for summary def get_delivery_and_customer_details(detail, mode, same_day_confirmation = ""): if mode == "Date": details_list = ["Delivery Date:", detail] elif mode == "Same-Day": details_list = ["Same Day Delivery:", same_day_confirmation, "", int(detail)] elif mode == "Charges": details_list = ["Delivery Charges:", "", "", int(detail)] elif mode == "Customer Name": details_list = ["Customer's name:", detail] elif mode == "Recipient Name": details_list = ["Recipient's name:", detail] elif mode == "Message": details_list = ["Message for Recipient:", detail] elif mode == "Address": details_list = ["Delivery Address:", detail] return details_list def combine_details_list(mode, list1, list2, list3 = "", list4 = ""): details_list = [] if mode == "Item": details_list = [list1, list2] elif mode == "Delivery": details_list = [list1, list2, list3] elif mode == "Customer": details_list = [list1, list2, list3, list4] return details_list # Get all details list for order summary def summary_list(available_bloom_line = "", available_addon_line = ""): customer_name, recipient_name, message = get_customer_details() delivery_date, same_day_confirmation, same_day_delivery_charges, delivery_charges, delivery_address = shipping_option() # Get the item details bloom_list = get_item_details(available_bloom_line, "Bloom") addon_list = get_item_details(available_addon_line, "Add-On") item_details = combine_details_list("Item", bloom_list, addon_list) # Get the delivery details date_list = get_delivery_and_customer_details(delivery_date, "Date") same_day_list = get_delivery_and_customer_details(same_day_delivery_charges, "Same-Day", same_day_confirmation) charges_list = get_delivery_and_customer_details(delivery_charges, "Charges") delivery_details = combine_details_list("Delivery", date_list, same_day_list, charges_list) # Get the sum details total_calculate = bloom_list[3] + addon_list[3] + same_day_list[3] + charges_list[3] total_calculate_str = "$" + str(total_calculate) sum_details = [["Total", "", "", total_calculate]] # Get the customer details customer_name_list = get_delivery_and_customer_details(customer_name, "Customer Name") recipient_name_list = get_delivery_and_customer_details(recipient_name, "Recipient Name") message_list = get_delivery_and_customer_details(message, "Message") address_list = get_delivery_and_customer_details(delivery_address, "Address") customer_details = combine_details_list(customer_name_list, recipient_name_list, message_list, address_list) return item_details, delivery_details, sum_details, customer_details # Align center the string def get_centered_string(string, length): left_padding = (length - len(string)) // 2 right_padding = length - len(string) - left_padding centered_string = (" " * left_padding) + string + (" " * right_padding) return centered_string # Align the string def get_aligned_string(string, length): if len(string) >= length: return string else: right_padding = length - len(string) aligned_string = string + " " * right_padding return aligned_string # Show the order summary def show_summary(details, mode): if mode == "Item": print_message(get_centered_string("Order Summary", 30)) print_message(get_centered_string("Item Details", 30)) elif mode == "Delivery": print_message(get_centered_string("Delivery Details", 30)) elif mode == "Sum": print_message(get_centered_string("Total Price", 30)) elif mode == "Customer": print_message(get_centered_string("Customer Details", 30)) for detail in details: for attribute in detail: print(get_aligned_string(attribute, 20)) # User choose for inventory management def product_setting_choice(): print("-" * 30) print("1. View / Update Blooms") print("2. Add New Bloom") print("3. View / Update Add-ons") print("4. Add New Add-on") print("5. Back to Home Menu") choice = check_input_range(1, 5) if choice == 1: return "View / Update Blooms" elif choice == 2: return "Add New Bloom" elif choice == 3: return "View / Update Add-ons" elif choice == 4: return "Add New Add-on" elif choice == 5: return "Back to Home Menu" # Sort blooms by price def sort_by_price(): with open("blooms.txt") as file: next(file) recorded_list = file.readlines() loop_count = len(recorded_list) sorted_list = [] cheapest_bloom_line = "" cheapest_bloom_price = int(recorded_list[0].split(",")[-2]) for count in range(0, loop_count): for line in recorded_list: current_bloom_price = int(line.split(",")[-2]) if current_bloom_price <= cheapest_bloom_price: cheapest_bloom_price = current_bloom_price cheapest_bloom_line = line recorded_list.remove(cheapest_bloom_line) sorted_list.append(cheapest_bloom_line) if count != loop_count - 1: cheapest_bloom_price = int(recorded_list[0].split(",")[-2]) return sorted_list # View/Filter bloom/add-on def view_items(file_path, mode, category = ""): with open(file_path, "r") as file: first_line = True recorded_category = "" recorded_status = "" sorted_list = [] for line in file: attribute_list = line.strip().split(",") row_line = "-" * (30 * len(attribute_list)) if mode == "Filter": recorded_category = line.split(",")[2].strip() elif mode == "Sort": sorted_list = sort_by_price() elif mode == "Available": recorded_status = line.split(",")[-1].strip() if first_line: # Print Header print(row_line) print_context("Header", attribute_list) first_line = False else: # Print Content if (mode == "Filter" or mode == "Available") and (recorded_category == category or recorded_status == "Available"): print_context("Content", attribute_list) elif mode == "View": print_context("Content", attribute_list) # elif mode == "Sort": # print_context("Content", attribute_list) if mode == "Sort": for line in sorted_list: attribute_list = line.strip().split(",") print_context("Content", attribute_list) print(row_line) # Get a valid bloom/add-on id def get_valid_item_id(file_path, product, mode = ""): with open(file_path, "r") as file: while True: if mode == "Order": input_item_id = input(f"Enter The {product} ID for Add-On (or 0 to skip): ") if input_item_id == "0": return "Skip" else: input_item_id = input(f"Enter The {product} ID: ") for line in file: recorded_id = line.split(",")[0].strip() if input_item_id == recorded_id: return input_item_id file.seek(0) print_message("Please Enter A Valid ID!") # Update bloom/add-on def update_item(file_path, input_item_id, for_update, position): with open(file_path, "r+") as file: lines = file.readlines() for index, line in enumerate(lines): if input_item_id == line.split(",")[0].strip(): recorded = line.split(",")[position].strip() updated_line = line.replace(recorded, for_update) lines[index] = updated_line file.seek(0) for line in lines: file.write(line) file.truncate() print("Update Successfully!") # View and update bloom/add-on def view_and_update(file_path, product): while True: choice = menu_choice("View", "Update", "Back") if choice == "View": view_items(file_path, "View") elif choice == "Update": view_items(file_path, "View") input_item_id = get_valid_item_id(file_path, product) while True: choice = menu_choice("Price", "Status", "Back") if choice == "Price": update_item(file_path, input_item_id, input("Enter New Price: "), -2) elif choice == "Status": update_item(file_path, input_item_id, input("Enter New Status: "), -1) elif choice == "Back": break elif choice == "Back": break # User choose category def category_choice(mode): print("-" * 30) print("1. Romantic") print("2. Birthday") print("3. Grand Opening") print("4. Condolence") print("5. Anniversary") if mode == "Sales": print("6. Go Back") choice = check_input_range(1, 6) elif mode == "Inventory": choice = check_input_range(1, 5) if choice == 1: return "Romantic" elif choice == 2: return "Birthday" elif choice == 3: return "Grand Opening" elif choice == 4: return "Condolence" elif choice == 5: return "Anniversary" elif choice == 6: return "Go Back" # Get the valid price def get_valid_price(product): while True: try: input_price = int(input(f"Enter The {product} Price: ")) if input_price < 0: raise ValueError except: print("Invalid Input! Please Try Again!") else: return input_price # Get the bloom id prefix def get_bloom_id_prefix(bloom_category): if bloom_category == "Romantic": return "R" elif bloom_category == "Birthday": return "B" elif bloom_category == "Grand Opening": return "GO" elif bloom_category == "Condolence": return "C" elif bloom_category == "Anniversary": return "A" # Get the largest bloom id def get_largest_bloom_id(input_prefix): with open("blooms.txt", "r") as file: matched_bloom_id = [] recorded_bloom_prefix = "" next(file) for line in file: recorded_bloom_id = line.split(",")[0] if len(input_prefix) == 1: recorded_bloom_prefix = line.split(",")[0].strip()[0] elif len(input_prefix) == 2: recorded_bloom_prefix = line.split(",")[0].strip()[:2] if input_prefix == recorded_bloom_prefix: matched_bloom_id.append(recorded_bloom_id) largest_bloom_id = max(matched_bloom_id) return largest_bloom_id # Get the largest bloom id's numeric part def get_numeric_part(item_id): get_numeric_part = "" if len(item_id) == 4: # Bloom ID get_numeric_part = item_id[1:] elif len(item_id) == 5: # Bloom ID get_numeric_part = item_id[2:] elif len(item_id) == 11: # Order ID get_numeric_part = item_id[7:] return get_numeric_part def new_item_id(lastest_id, prefix, mode): new_item_id = "" numeric = int(get_numeric_part(lastest_id)) new_numeric = numeric + 1 if mode == "Bloom": new_item_id = prefix + "{:03d}".format(new_numeric) elif mode == "Order": new_item_id = prefix + "{:04d}".format(new_numeric) return new_item_id # Auto generate a new bloom id def generate_bloom_id(bloom_category): input_prefix = get_bloom_id_prefix(bloom_category) largest_bloom_id = get_largest_bloom_id(input_prefix) return new_item_id(largest_bloom_id, input_prefix, "Bloom") # Auto generate a new add-on id def generate_addon_id(): with open("addons.txt", "r") as file: count = 0 for line in file: count += 1 print(count) new_id = "ADD" + "{:03d}".format(count) print(new_id) return new_id def generate_order_id(): prefix = "BBO-23-" recorded_order_id = "" new_order_id = "" with open("order.txt", "r") as file: next(file) for line in file: recorded_order_id = line.split(",")[0].strip() if recorded_order_id == "": new_order_id = prefix + "0001" return new_order_id else: return new_item_id(recorded_order_id, prefix, "Order") # Create new line for new item def new_item_line(product, id, name, price, category = ""): if product == "Bloom": new_bloom_line = f"{id},{name},{category},{price},Available\n" return new_bloom_line elif product == "Add-On": new_addon_line = f"{id},{name},{price},Available\n" return new_addon_line # Write new line to file def append_to_file(file_path, new_line): with open(file_path, "a") as file: file.write(new_line) sleep(1) print_message("Update Successfully!") # Get the info and add new item to file def add_new_item(file_path, product): item_name = input(f"Enter the {product} name: ") item_price = get_valid_price(product) if product == "Bloom": bloom_category = category_choice("Inventory") bloom_id = generate_bloom_id(bloom_category) new_bloom = new_item_line(product, bloom_id, item_name, item_price, bloom_category) append_to_file(file_path, new_bloom) elif product == "Add-On": addon_id = generate_addon_id() new_addon = new_item_line(product, addon_id, item_name, item_price) append_to_file(file_path, new_addon) # Get the list of available bloom def get_available_item(file_path, product): available_item_line = [] while True: if product == "Bloom": input_item_id = get_valid_item_id("blooms.txt", "Bloom") elif product == "Add-On": input_item_id = get_valid_item_id("addons.txt", "Add-On", "Order") if input_item_id == "Skip": break with open(file_path, "r") as file: next(file) for line in file: recorded_item_id = line.split(",")[0].strip() status = line.split(",")[-1].strip() if input_item_id == recorded_item_id and status == "Available": available_item_line = line.strip() sleep(0.5) if product == "Bloom": print_message("Order Successfully!") elif product == "Add-On": print_message("Item Added Successfully!") return available_item_line elif input_item_id == recorded_item_id and status == "Unavailable": file.seek(0) sleep(0.5) print_message(f"Sorry, The {product} is Currently Unavailable!") break # Main Program for Inventory Management print_message("Beautiful Blooms Shop 🌺") while True: choice = menu_choice("Inventory Management", "Sales Management", "Exit") if choice == "Inventory Management": while True: choice = product_setting_choice() if choice == "View / Update Blooms": view_and_update("blooms.txt", "Bloom") elif choice == "Add New Bloom": add_new_item("blooms.txt", "Bloom") elif choice == "View / Update Add-ons": view_and_update("addons.txt", "Add-On") elif choice == "Add New Add-on": add_new_item("addons.txt", "Add-On") elif choice == "Back to Home Menu": break elif choice == "Sales Management": while True: choice = menu_choice("Create Order", "View / Update Order", "Back to Home Menu") if choice == "Create Order": view_items("blooms.txt", "View") while True: choice = menu_choice("Filter Bloom by Category", "Sort Bloom by Price", "Order Bloom", "Go Back") if choice == "Filter Bloom by Category": while True: choice = category_choice("Sales") if choice == "Romantic": view_items("blooms.txt", "Filter", "Romantic") elif choice == "Birthday": view_items("blooms.txt", "Filter", "Birthday") elif choice == "Grand Opening": view_items("blooms.txt", "Filter", "Grand Opening") elif choice == "Condolence": view_items("blooms.txt", "Filter", "Condolence") elif choice == "Anniversary": view_items("blooms.txt", "Filter", "Anniversary") elif choice == "Go Back": break choice = menu_choice("Order Bloom", "Back to Filter Category", "Back to Main Menu") if choice == "Order Bloom": None elif choice == "Back to Filter Category": continue elif choice == "Back to Main Menu": break elif choice == "Sort Bloom by Price": view_items("blooms.txt", "Sort") choice = menu_choice("Order Bloom", "Back to Main Menu") if choice == "Order Bloom": None elif choice == "Back to Main Menu": continue elif choice == "Order Bloom": view_items("blooms.txt", "View") available_bloom_line = get_available_item("blooms.txt", "Bloom") view_items("addons.txt", "Available") available_addon_line = get_available_item("addons.txt", "Add-On") summary_list(available_bloom_line, available_addon_line) while True: item_details, delivery_details, sum_details, customer_details = summary_list() order_summary = show_summary(item_details, "Item") order_summary = show_summary(delivery_details, "Delivery") order_summary = show_summary(sum_details, "Sum") order_summary = show_summary(customer_details, "Customer") choice = menu_choice("Confirm", "Edit Info", "Cancel") if choice == "Confirm": print_message("Not Done Yet!") elif choice == "Edit Info": continue elif choice == "Cancel": break break elif choice == "Go Back": break elif choice == "View / Update Order": None elif choice == "Back to Home Menu": break elif choice == "Exit": print_message("Bye!") break
Editor is loading...