### 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()