### FILE: send_sms.py import serial import time # Replace with your actual COM port (e.g., COM3) PORT = 'COM3' BAUDRATE = 9600 def send_sms(phone, message): try: modem = serial.Serial(PORT, BAUDRATE, timeout=5) time.sleep(2) modem.write(b'AT\r') time.sleep(1) modem.write(b'AT+CMGF=1\r') # Text mode time.sleep(1) modem.write(f'AT+CMGS="{phone}"\r'.encode()) time.sleep(1) modem.write(f'{message}\x1A'.encode()) # End with Ctrl+Z time.sleep(3) modem.close() print("SMS Sent!") except Exception as e: print("Error sending SMS:", e) ### FILE: main.py import tkinter as tk from tkinter import messagebox import sqlite3 from send_sms import send_sms # Initialize database connection conn = sqlite3.connect('database.db') c = conn.cursor() c.execute(''' CREATE TABLE IF NOT EXISTS bookings ( seat TEXT PRIMARY KEY, name TEXT, cnic TEXT, father TEXT, address TEXT, phone TEXT ) ''') conn.commit() # Setup GUI window root = tk.Tk() root.title("Faisal Movers Bus Booking") root.geometry("1000x600") seat_buttons = {} rows = 10 seats_per_row = 5 # Function to handle booking def book_seat(seat): c.execute("SELECT * FROM bookings WHERE seat=?", (seat,)) if c.fetchone(): messagebox.showinfo("Already Booked", f"Seat {seat} is already booked.") return form = tk.Toplevel(root) form.title(f"Booking Seat {seat}") form.geometry("400x400") entries = {} labels = ["Name", "CNIC", "Father's Name", "Address", "Phone Number"] for i, label in enumerate(labels): tk.Label(form, text=label).grid(row=i, column=0, padx=10, pady=5) entry = tk.Entry(form) entry.grid(row=i, column=1, padx=10, pady=5) entries[label] = entry def submit_booking(): values = {k: v.get() for k, v in entries.items()} if not all(values.values()): messagebox.showerror("Missing", "Please fill all fields.") return if not values["Phone Number"].startswith("03") or len(values["Phone Number"]) != 11: messagebox.showerror("Invalid", "Invalid phone number.") return c.execute("INSERT INTO bookings VALUES (?, ?, ?, ?, ?, ?)", ( seat, values["Name"], values["CNIC"], values["Father's Name"], values["Address"], values["Phone Number"] )) conn.commit() seat_buttons[seat].config(bg="red", text=f"{seat}\n❌") messagebox.showinfo("Success", f"Seat {seat} booked!") sms_msg = ( f"Booking Confirmed!\n" f"Name: {values['Name']}\n" f"Seat: {seat}\n" f"CNIC: {values['CNIC']}\n" f"F.Name: {values['Father\'s Name']}" ) send_sms(values["Phone Number"], sms_msg) form.destroy() tk.Button(form, text="Book", command=submit_booking).grid(row=6, column=1, pady=20) # Seat layout def create_seat_layout(): for row in range(rows): for col in range(seats_per_row): seat_no = f"{row+1}{chr(65+col)}" btn = tk.Button(root, text=f"{seat_no}\n✅", width=10, height=3, command=lambda s=seat_no: book_seat(s), bg="green") x_col = col if col < 2 else col + 1 # Add aisle btn.grid(row=row, column=x_col, padx=5, pady=5) seat_buttons[seat_no] = btn c.execute("SELECT seat FROM bookings") for (seat,) in c.fetchall(): if seat in seat_buttons: seat_buttons[seat].config(bg="red", text=f"{seat}\n❌") create_seat_layout() root.mainloop()