Skip to content

Instantly share code, notes, and snippets.

@thinkphp
Last active October 11, 2025 17:57
Show Gist options
  • Save thinkphp/5ea4908a3c5efa233b7a4fe1e1408b97 to your computer and use it in GitHub Desktop.
Save thinkphp/5ea4908a3c5efa233b7a4fe1e1408b97 to your computer and use it in GitHub Desktop.
project-simon.md

Tackle Hire Management System

A management system for renting fishing and camping equipment. The application allows customer registration, order management, and earnings report generation.


Table of Contents


General Description

The application allows a small fishing shop to:

  • Register customers and contact details
  • Manage equipment rental orders
  • Calculate costs with discounts
  • Apply late return fees
  • Generate earnings reports

Main Features

Input Validation - for every input field
Automatic Price Calculation - with 50% discount for additional nights
Late Fees - for returns after 2:00 PM
Detailed Reports - with totals and statistics
User-Friendly Interface - navigable menu


TASK 1 - Main Menu

Description

Task 1 implements the main menu of the application. The user can select between 3 main options: customer details, earnings report, or exit the application.

Files

  • 24987654_T1.py - Python code for Task 1

Main Functions

display_main_menu()

Displays the main menu nicely formatted.

def display_main_menu():
    """Displays the main menu with available options."""
    print("\n" + "="*50)
    print("    TACKLE HIRE MANAGEMENT SYSTEM")
    print("="*50)
    print("1. Customer and hire details")
    print("2. Earnings report")
    print("3. Exit")
    print("="*50)

get_menu_choice()

Requests and validates the user's choice. Accepts only values 1, 2, or 3.

def get_menu_choice():
    """Requests and validates choice from menu (1, 2, or 3)."""
    while True:
        choice = input("\nEnter your choice (1, 2, or 3): ").strip()
        if choice in ["1", "2", "3"]:
            return choice
        else:
            print("Invalid choice! Please enter 1, 2, or 3.")

main_menu()

The main loop that displays the menu and processes user selections.

def main_menu():
    """Main menu with infinite loop (until choosing 3 - Exit)."""
    while True:
        display_main_menu()
        choice = get_menu_choice()
        
        if choice == "1":
            print("\n>>> Customer and hire details selected")
        elif choice == "2":
            print("\n>>> Earnings report selected")
        elif choice == "3":
            print("\nThank you for using Tackle Hire System. Goodbye!")
            break

Input Validation

  • ✅ Accepts only "1", "2", "3"
  • ✅ Ignores spaces before and after (.strip())
  • ✅ Redisplays error message if input is invalid
  • ✅ Loop continues until a valid value is entered

Sample Output

==================================================
    TACKLE HIRE MANAGEMENT SYSTEM
==================================================
1. Customer and hire details
2. Earnings report
3. Exit
==================================================

Enter your choice (1, 2, or 3): 5
Invalid choice! Please enter 1, 2, or 3.

Enter your choice (1, 2, or 3): 1

>>> Customer and hire details selected

==================================================
    TACKLE HIRE MANAGEMENT SYSTEM
==================================================

Recommended Tests

  • Select option 1 - displays correct message
  • Select option 2 - displays correct message
  • Select option 3 - program stops
  • Enter 4 - displays error
  • Enter "a" - displays error
  • Enter "1 " (with spaces) - works (.strip())

🛒 TASK 2 - Equipment Hiring

Description

Task 2 implements the subroutine for registering a new equipment rental order. It allows collecting customer data, selecting equipment, and calculating the final cost.

Files

  • 24987654.py - Python code for Task 2 and Task 3

Available Equipment

Code Equipment Price/Night
1 Day chairs £15.00
2 Bed chairs £25.00
3 Bite Alarm (set of 3) £20.00
4 Bite Alarm (single) £5.00
5 Bait Boat £60.00
6 Camping tent £20.00
7 Sleeping bag £20.00
8 Rods (3lb TC) £10.00
9 Rods (Bait runners) £5.00
10 Reels (Bait runners) £10.00
11 Camping Gas stove £10.00

Main Functions

get_customer_details()

Collects and validates customer information.

def get_customer_details():
    """Requests customer details with validation."""
    # Returns dictionary with: customer_id, name, phone, house, postcode, card

Validations:

  • Name: not empty
  • Phone: minimum 7 characters
  • Postcode: not empty
  • Card: exactly 4 numeric digits

display_equipment_menu()

Displays the available equipment list with prices.

def display_equipment_menu():
    """Displays equipment list with prices."""
    # Iterates through EQUIPMENT_PRICES and displays nicely

select_equipment()

Allows selection and quantity of desired items.

def select_equipment():
    """
    Allows equipment selection.
    Returns list of dictionaries: [{"name": "...", "quantity": 2, "unit_price": 25.00}]
    """

Process:

  1. Display equipment menu
  2. Request item code
  3. Request quantity
  4. Add to list
  5. Repeat until "0" is entered

get_hire_details()

Collects rental details (nights and late return).

def get_hire_details():
    """Requests number of nights and whether return was late."""
    # Returns (nights, returned_late)

Validations:

  • Nights: between 1 and 7
  • Late return: y or n

calculate_hire_cost(equipment_list, nights, returned_late)

Main calculation - determines the total rental cost.

def calculate_hire_cost(equipment_list, nights, returned_late):
    """
    Calculates total cost with 50% discount for additional nights.
    Adds extra fee for late return.
    """

Formula:

TOTAL COST = First night cost + (Cost/night × 0.5 × additional nights)
LATE FEE = Cost/night × 0.5 (if return after 2:00 PM)

Calculation Example:

Equipment: 2 x Bed chairs (£25 each) + 1 x Camping tent (£20)
Nights: 2
Late return: YES

First night = (2 × £25) + £20 = £70
Additional night (50% discount) = £70 × 0.5 = £35
Total cost = £70 + £35 = £105
Late return fee = £35

hire_equipment()

Main subroutine that orchestrates the entire order processing.

def hire_equipment():
    """
    Processes a new order:
    1. Collects customer data
    2. Selects equipment
    3. Collects details
    4. Calculates cost
    5. Saves to customer_hires
    6. Displays confirmation
    """

Data Structure

Each record in customer_hires contains:

{
    "customer_id": 101,
    "customer_name": "John Smith",
    "phone": "01234567890",
    "house": "42",
    "postcode": "AB12 3CD",
    "card": "1234",
    "equipment": [
        {
            "name": "Bed chairs",
            "quantity": 2,
            "unit_price": 25.00
        },
        {
            "name": "Camping tent",
            "quantity": 1,
            "unit_price": 20.00
        }
    ],
    "nights": 2,
    "total_cost": 105.00,
    "extra_charge": 35.00,
    "returned_on_time": "n"
}

Sample Output

============================================================
NEW EQUIPMENT HIRE
============================================================

Customer ID: 101
Enter customer name: John Smith
Enter phone number: 01234567890
Enter house number: 42
Enter postcode: AB12 3CD
Enter credit/debit card (last 4 digits): 1234

============================================================
AVAILABLE EQUIPMENT FOR HIRE
============================================================
(Equipment prices shown are per night/item)
------------------------------------------------------------
 1. Day chairs                                    £  15.00
 2. Bed chairs                                    £  25.00
 ...
 6. Camping tent                                  £  20.00
------------------------------------------------------------

Select equipment code (or '0' to finish): 2
Enter quantity: 2
✓ Added 2 x Bed chairs

Select equipment code (or '0' to finish): 6
Enter quantity: 1
✓ Added 1 x Camping tent

Select equipment code (or '0' to finish): 0

Enter number of nights (1-7): 2
Was equipment returned after 2pm? (y/n): y

============================================================
HIRE CONFIRMATION
============================================================
Customer ID: 101
Customer Name: John Smith
Phone: 01234567890
Address: 42, AB12 3CD
Card: ****1234

Equipment hired:
  - Bed chairs: 2 x £25.00
  - Camping tent: 1 x £20.00

Number of nights: 2
Total cost: £105.00
Extra charge (late return): £35.00
Returned on time: n
============================================================

Recommended Tests

  • Phone validation - rejects < 7 characters
  • Card validation - accepts only 4 digits
  • Equipment selection - adds correctly to list
  • 1 night price calculation - no discount
  • 2 nights price calculation - applies 50% discount
  • Late fee calculation - applies only if late return
  • Total calculation - combination of all factors

📊 TASK 3 - Earnings Report

Description

Task 3 implements the subroutine for generating the earnings report. It displays a table with all orders, totals, and statistics.

Files

  • 24987654.py - Python code for Task 2 and Task 3

Main Functions

generate_earnings_report()

Displays the complete report with all orders and totals.

def generate_earnings_report():
    """
    Generates and displays earnings report with:
    - All orders
    - Total earnings
    - Total late fees
    - Grand total
    """

Report Logic

  1. Checks if orders exist - if not, displays message
  2. Displays table header
  3. Iterates through each order - displays in row
  4. Calculates totals:
    • Total earnings (sum of all total_cost)
    • Total late fees (sum of all extra_charge)
    • Grand total = earnings + fees

Sample Output

====================================================================================================
EARNINGS REPORT
====================================================================================================
Customer  Equipment                       Nights  Total Cost  On Time  Extra Charge
----------------------------------------------------------------------------------------------------
101       Bed chairs (2), Camping t...    2       £105.00     n        £35.00
102       Day chairs (1)                  1       £15.00      y        £0.00
103       Bait Boat (1), Sleeping ba...   3       £120.00     n        £30.00
----------------------------------------------------------------------------------------------------
TOTAL EARNINGS                                                          £240.00
TOTAL EXTRA CHARGES (Late Returns)                                      £65.00
GRAND TOTAL                                                             £305.00
====================================================================================================

Table Formatting

  • Customer: Customer ID (10 characters)
  • Equipment: Equipment name with quantities (35 characters, truncated with "...")
  • Nights: Number of nights (8 characters)
  • Total Cost: Total cost in pounds sterling (12 characters)
  • On Time: y/n for on-time return (10 characters)
  • Extra Charge: Extra fee in pounds sterling (12 characters)

Integration with Task 2

The report uses the same data stored in customer_hires from Task 2. It updates automatically once a new order is added.

Recommended Tests

  • No orders - displays appropriate message
  • One order - displays correctly
  • Multiple orders - calculates totals correctly
  • With late fees - displays correctly
  • Table formatting - columns aligned correctly

Execution

For Task 1 (menu only):

python3 24987654_T1.py

For Task 2 and 3 (complete program):

python3 24987654.py

Usage Examples

Example 1: Add new order

$ python3 24987654.py

==================================================
    TACKLE HIRE MANAGEMENT SYSTEM
==================================================
1. Customer and hire details
2. Earnings report
3. Exit
==================================================

Enter your choice (1, 2, or 3): 1

>>> Customer and hire details selected
[... order input process follows ...]

Example 2: View report

Enter your choice (1, 2, or 3): 2

>>> Earnings report selected
[... table with orders and totals displayed ...]

Example 3: Exit

Enter your choice (1, 2, or 3): 3

Thank you for using Tackle Hire System. Goodbye!

File Structure

tackle-hire-system/
│
├── 24987654_T1.py          # Task 1 - Main Menu
├── 24987654.py             # Task 2 and Task 3 - Complete Program
├── 24987654.docx           # Word document with flowcharts
└── README.md               # This file

Python Files Content

24987654_T1.py

  • display_main_menu() - Displays menu
  • get_menu_choice() - Validates choice
  • main_menu() - Main loop

24987654.py

  • Task 1: display_main_menu(), get_menu_choice(), main_menu()
  • Task 2: get_customer_details(), select_equipment(), get_hire_details(), calculate_hire_cost(), hire_equipment()
  • Task 3: generate_earnings_report()
  • Utility: display_equipment_menu()
  • Constants: EQUIPMENT_PRICES, customer_hires, next_customer_id

💡 Python Concepts Demonstrated

This application demonstrates:

Dictionaries - equipment and data storage
Lists - order storage
Functions - modularity and reusability
Loops - while and for loops
Conditionals - if/elif/else and validations
String formatting - f-strings and .format()
Data Operations - sum, iteration, calculations
Input Validation - try/except, if conditions
Docstrings - code documentation


🐛 Troubleshooting

Problem: "ModuleNotFoundError"

Solution: Make sure you didn't import external modules. Use only Python standard library.

Problem: Validation doesn't work

Solution: Check that you used .strip() to remove spaces and that the if condition is correct.

Problem: Prices don't calculate correctly

Solution: Check the formula in calculate_hire_cost(). Make sure that:

  • First night is regular price
  • Additional nights have 50% discount
  • Late fee applies only if nights > 1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment