Table of Contents
- Database Schema (setup_somee.sql)
- Database Helper (App_Code) (RestaurantDBHelper.vb)
- Navigation Control (Nav.ascx)
- Navigation Code-Behind (Nav.ascx.vb)
- Registration Form (registration.aspx)
- Registration Logic (registration.aspx.vb)
- Login Form (login.aspx)
- Login Logic (login.aspx.vb)
- Search UI (search.aspx)
- Search Logic (search.aspx.vb)
- Order Form (order.aspx)
- Order Logic (order.aspx.vb)
- Reservation Form (reservation.aspx)
- Reservation Logic (reservation.aspx.vb)
- Feedback Form (feedback.aspx)
- Feedback Logic (feedback.aspx.vb)
- Add Menu Item UI (add_item.aspx)
- Add Menu Item Logic (add_item.aspx.vb)
- Inventory UI (inventory.aspx)
- Inventory Logic (inventory.aspx.vb)
Database Schema
Lab_10/DB/setup_somee.sql
-- ============================================================
-- Half-Blood Restaurant - Somee DB Setup Script
-- Run this ONCE on PVFC_db at Somee to create all tables
-- ============================================================
-- Drop existing tables if they exist (safe cleanup)
IF OBJECT_ID('Feedback', 'U') IS NOT NULL DROP TABLE Feedback;
IF OBJECT_ID('Reservation', 'U') IS NOT NULL DROP TABLE Reservation;
IF OBJECT_ID('OrderItem', 'U') IS NOT NULL DROP TABLE OrderItem;
IF OBJECT_ID('OrderTable', 'U') IS NOT NULL DROP TABLE OrderTable;
IF OBJECT_ID('Store', 'U') IS NOT NULL DROP TABLE Store;
IF OBJECT_ID('MenuItem', 'U') IS NOT NULL DROP TABLE MenuItem;
IF OBJECT_ID('SupplierPhone', 'U') IS NOT NULL DROP TABLE SupplierPhone;
IF OBJECT_ID('Supplier', 'U') IS NOT NULL DROP TABLE Supplier;
IF OBJECT_ID('EmployeePhone', 'U') IS NOT NULL DROP TABLE EmployeePhone;
IF OBJECT_ID('Employee', 'U') IS NOT NULL DROP TABLE Employee;
IF OBJECT_ID('CustomerPhone', 'U') IS NOT NULL DROP TABLE CustomerPhone;
IF OBJECT_ID('Customer', 'U') IS NOT NULL DROP TABLE Customer;
IF OBJECT_ID('PaymentMethod', 'U') IS NOT NULL DROP TABLE PaymentMethod;
IF OBJECT_ID('EmployeeRole', 'U') IS NOT NULL DROP TABLE EmployeeRole;
GO
-- Lookup tables
CREATE TABLE PaymentMethod (
MethodID INT IDENTITY(1,1) PRIMARY KEY,
MethodName VARCHAR(50) NOT NULL
);
CREATE TABLE EmployeeRole (
RoleID INT IDENTITY(1,1) PRIMARY KEY,
RoleName VARCHAR(50) NOT NULL,
RoleDescription VARCHAR(255)
);
-- Main entities
CREATE TABLE Customer (
CustomerID INT IDENTITY(1,1) PRIMARY KEY,
Username VARCHAR(50) UNIQUE,
Password VARCHAR(50),
CustomerName VARCHAR(100) NOT NULL,
CustomerType VARCHAR(50),
Street VARCHAR(100),
City VARCHAR(50),
PostalCode VARCHAR(20)
);
CREATE TABLE CustomerPhone (
PhoneID INT IDENTITY(1,1) PRIMARY KEY,
CustomerID INT NOT NULL,
PhoneNumber VARCHAR(20) NOT NULL,
FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID) ON DELETE CASCADE
);
CREATE TABLE Employee (
EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
Username VARCHAR(50) UNIQUE,
Password VARCHAR(50),
EmployeeName VARCHAR(100) NOT NULL,
Pay DECIMAL(10,2) CHECK (Pay >= 0),
Gender VARCHAR(10),
Email VARCHAR(50) UNIQUE,
ManagerID INT NULL,
DateOfBirth DATE,
RoleID INT NOT NULL,
FOREIGN KEY (ManagerID) REFERENCES Employee(EmployeeID),
FOREIGN KEY (RoleID) REFERENCES EmployeeRole(RoleID)
);
CREATE TABLE EmployeePhone (
PhoneID INT IDENTITY(1,1) PRIMARY KEY,
EmployeeID INT NOT NULL,
PhoneNumber VARCHAR(20) NOT NULL,
FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID) ON DELETE CASCADE
);
CREATE TABLE Supplier (
SupplierID INT IDENTITY(1,1) PRIMARY KEY,
SupplierName VARCHAR(100) NOT NULL,
Street VARCHAR(100),
City VARCHAR(50),
PostalCode VARCHAR(20)
);
CREATE TABLE SupplierPhone (
PhoneID INT IDENTITY(1,1) PRIMARY KEY,
SupplierID INT NOT NULL,
PhoneNumber VARCHAR(20) NOT NULL,
FOREIGN KEY (SupplierID) REFERENCES Supplier(SupplierID) ON DELETE CASCADE
);
CREATE TABLE MenuItem (
ItemID INT IDENTITY(1,1) PRIMARY KEY,
ItemName VARCHAR(100) NOT NULL,
Price DECIMAL(10,2) CHECK (Price >= 0),
NumberOfItem INT,
Category VARCHAR(30)
);
CREATE TABLE Store (
StoreID INT IDENTITY(1,1) PRIMARY KEY,
SupplierID INT NOT NULL,
ItemID INT NOT NULL,
StoreName VARCHAR(100),
Location VARCHAR(100),
StockQuantity INT CHECK (StockQuantity >= 0),
FOREIGN KEY (SupplierID) REFERENCES Supplier(SupplierID),
FOREIGN KEY (ItemID) REFERENCES MenuItem(ItemID)
);
CREATE TABLE OrderTable (
OrderID INT IDENTITY(1,1) PRIMARY KEY,
CustomerID INT NOT NULL,
OrderDate DATE NOT NULL DEFAULT GETDATE(),
PaymentStatus VARCHAR(50) NULL,
TotalAmount DECIMAL(10,2) CHECK (TotalAmount >= 0),
MethodID INT NULL,
FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID),
FOREIGN KEY (MethodID) REFERENCES PaymentMethod(MethodID)
);
CREATE TABLE OrderItem (
OrderItemID INT IDENTITY(1,1) PRIMARY KEY,
OrderID INT NOT NULL,
ItemID INT NOT NULL,
Quantity INT CHECK (Quantity > 0),
UnitPrice DECIMAL(10,2) CHECK (UnitPrice >= 0),
Subtotal DECIMAL(10,2) CHECK (Subtotal >= 0),
FOREIGN KEY (OrderID) REFERENCES OrderTable(OrderID) ON DELETE CASCADE,
FOREIGN KEY (ItemID) REFERENCES MenuItem(ItemID)
);
CREATE TABLE Reservation (
ReservationID INT IDENTITY(1,1) PRIMARY KEY,
CustomerID INT NOT NULL,
OrderID INT NULL,
ReservationDate DATE NOT NULL,
NumberOfPeople INT CHECK (NumberOfPeople > 0),
ReservationFee DECIMAL(10,2) CHECK (ReservationFee >= 0),
FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID),
FOREIGN KEY (OrderID) REFERENCES OrderTable(OrderID)
);
CREATE TABLE Feedback (
FeedbackID INT IDENTITY(1,1) PRIMARY KEY,
CustomerID INT NOT NULL,
EmployeeID INT NULL,
ItemID INT NULL,
StaffRating INT CHECK (StaffRating BETWEEN 1 AND 5),
ItemRating INT CHECK (ItemRating BETWEEN 1 AND 5),
Comment VARCHAR(300),
FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID),
FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID),
FOREIGN KEY (ItemID) REFERENCES MenuItem(ItemID)
);
GO
-- ============================================================
-- Sample Data
-- ============================================================
INSERT INTO PaymentMethod (MethodName) VALUES ('Cash'), ('Card'), ('Online'), ('Wallet');
INSERT INTO EmployeeRole (RoleName, RoleDescription) VALUES
('Manager', 'Manages staff and operations'),
('Waiter', 'Serves customers'),
('Chef', 'Prepares food'),
('Cashier', 'Handles payments');
INSERT INTO Employee (Username, Password, EmployeeName, Pay, Gender, Email, ManagerID, DateOfBirth, RoleID) VALUES
('manager', 'owl123', 'Ali Manager', 80000, 'Male', 'ali.manager@rms.com', NULL, '1985-05-10', 1),
('waiter', 'broom123', 'Sara Waiter', 35000, 'Female', 'sara.waiter@rms.com', 1, '1998-03-15', 2),
('chef', 'pot123', 'Ahmed Chef', 50000, 'Male', 'ahmed.chef@rms.com', 1, '1990-02-12', 3),
('cashier', 'coin123', 'Zara Cashier', 40000, 'Female', 'zara.cashier@rms.com', 1, '1996-08-20', 4);
INSERT INTO Customer (Username, Password, CustomerName, CustomerType, Street, City, PostalCode) VALUES
('ahmad', 'cust123', 'Ahmad Khan', 'Regular', 'House 12, Street 5', 'Lahore', '54000'),
('usman', 'cust123', 'Usman Ali', 'Regular', 'Street 10', 'Lahore', '54001'),
('ayesha', 'cust123', 'Ayesha Noor', 'VIP', 'Block B', 'Karachi', '75500'),
('bilal', 'cust123', 'Bilal Ahmed', 'Regular', 'Street 22', 'Islamabad', '44000'),
('hina', 'cust123', 'Hina Khan', 'New', 'Sector F', 'Islamabad', '44010');
INSERT INTO CustomerPhone (CustomerID, PhoneNumber) VALUES
(1, '0300-1111111'), (2, '0311-2222222'),
(3, '0333-3333333'), (4, '0301-4444444'), (5, '0322-5555555');
INSERT INTO Supplier (SupplierName, Street, City, PostalCode) VALUES
('Fresh Foods Pvt Ltd', 'Industrial Area', 'Lahore', '54010'),
('Meat Masters', 'Warehouse Rd', 'Lahore', '54020'),
('Bakery Supplies', 'Food St', 'Islamabad', '44100');
INSERT INTO MenuItem (ItemName, Price, NumberOfItem, Category) VALUES
('Zinger Burger', 450, 100, 'Fast Food'),
('French Fries', 200, 200, 'Fast Food'),
('Chicken Pizza', 1200, 50, 'Fast Food'),
('Beef Burger', 550, 80, 'Fast Food'),
('Cold Drink', 120, 300, 'Beverage'),
('Pasta', 900, 40, 'Continental');
INSERT INTO Store (SupplierID, ItemID, StoreName, Location, StockQuantity) VALUES
(1, 1, 'Main Branch', 'DHA Phase 5', 100),
(1, 2, 'Main Branch', 'DHA Phase 5', 200),
(2, 3, 'Main Branch', 'DHA Phase 5', 50),
(2, 4, 'Main Branch', 'DHA Phase 5', 80),
(1, 5, 'Main Branch', 'DHA Phase 5', 300),
(3, 6, 'Main Branch', 'DHA Phase 5', 40);
INSERT INTO OrderTable (CustomerID, MethodID, OrderDate, TotalAmount) VALUES
(1, 1, '2025-01-10', 900),
(2, 2, '2025-01-11', 450),
(3, 1, '2025-01-12', 1200);
INSERT INTO OrderItem (OrderID, ItemID, Quantity, UnitPrice, Subtotal) VALUES
(1, 1, 2, 450, 900),
(2, 1, 1, 450, 450),
(3, 3, 1, 1200, 1200);
INSERT INTO Reservation (CustomerID, ReservationDate, NumberOfPeople) VALUES
(1, '2025-01-10', 4),
(2, '2025-01-11', 2),
(3, '2025-01-12', 5);
INSERT INTO Feedback (CustomerID, EmployeeID, ItemID, StaffRating, ItemRating, Comment) VALUES
(1, 2, 1, 5, 4, 'Great service and food'),
(2, 2, 2, 4, 5, 'Food was excellent'),
(3, 1, 3, 5, 4, 'Very polite staff');
-- Verify
SELECT * FROM Customer;
SELECT * FROM Employee;
SELECT * FROM MenuItem;
SELECT * FROM PaymentMethod;
SELECT * FROM OrderTable;
SELECT * FROM OrderItem;
SELECT * FROM Reservation;
SELECT * FROM Feedback;
Database Helper (App_Code)
App_Code/RestaurantDBHelper.vb
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Public Class RestaurantDBHelper
Private Shared ConnString As String = ConfigurationManager.ConnectionStrings("HalfBloodConn").ConnectionString
Public Shared Function GetDataTable(query As String) As DataTable
Dim dt As New DataTable()
Using conn As New SqlConnection(ConnString)
Using cmd As New SqlCommand(query, conn)
Dim adapter As New SqlDataAdapter(cmd)
adapter.Fill(dt)
End Using
End Using
Return dt
End Function
Public Shared Function ExecuteNonQuery(query As String, Optional sqlParams As SqlParameter() = Nothing) As Integer
Using conn As New SqlConnection(ConnString)
Using cmd As New SqlCommand(query, conn)
If sqlParams IsNot Nothing Then
cmd.Parameters.AddRange(sqlParams)
End If
conn.Open()
Return cmd.ExecuteNonQuery()
End Using
End Using
End Function
Public Shared Function ExecuteScalar(query As String, Optional sqlParams As SqlParameter() = Nothing) As Object
Using conn As New SqlConnection(ConnString)
Using cmd As New SqlCommand(query, conn)
If sqlParams IsNot Nothing Then
cmd.Parameters.AddRange(sqlParams)
End If
conn.Open()
Return cmd.ExecuteScalar()
End Using
End Using
End Function
Public Shared Function ExecuteStoredProcedure(procName As String, Optional sqlParams As SqlParameter() = Nothing) As Integer
Using conn As New SqlConnection(ConnString)
Using cmd As New SqlCommand(procName, conn)
cmd.CommandType = CommandType.StoredProcedure
If sqlParams IsNot Nothing Then
cmd.Parameters.AddRange(sqlParams)
End If
conn.Open()
Return cmd.ExecuteNonQuery()
End Using
End Using
End Function
End Class
Registration Form
Lab_10/registration.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="registration.aspx.vb" Inherits="registration" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta charset="utf-8" />
<title>Customer Registration | Restaurant Portal</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container">
<h2>Customer Registration</h2>
<uc:Nav ID="Nav1" runat="server" />
<asp:Label ID="lblInfo" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
<form id="form1" runat="server">
<asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
<div class="form-group">
<label>Username (Login ID)</label>
<asp:TextBox ID="txtUsername" runat="server"></asp:TextBox>
</div>
<div class="form-group">
<label>Password</label>
<asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox>
</div>
<div class="form-group">
<label>Full Name</label>
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
</div>
<div class="form-group">
<label>Customer Type</label>
<asp:DropDownList ID="ddlType" runat="server">
<asp:ListItem Value="Regular">Regular</asp:ListItem>
<asp:ListItem Value="VIP">VIP</asp:ListItem>
<asp:ListItem Value="New">New</asp:ListItem>
</asp:DropDownList>
</div>
<div class="form-group">
<label>Street</label>
<asp:TextBox ID="txtStreet" runat="server"></asp:TextBox>
</div>
<div class="form-group">
<label>City</label>
<asp:TextBox ID="txtCity" runat="server"></asp:TextBox>
</div>
<div class="form-group">
<label>Postal Code</label>
<asp:TextBox ID="txtPostalCode" runat="server"></asp:TextBox>
</div>
<asp:Button ID="btnRegister" runat="server" Text="Register" OnClick="btnRegister_Click" CssClass="btn" />
</form>
</div>
</body>
</html>
Registration Logic
Lab_10/registration.aspx.vb
Imports System.Data.SqlClient
Partial Class registration
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")
If Not IsPostBack Then
If role = "Manager" Then
lblInfo.Text = "Manager access: register a customer or update customer records."
ddlType.Enabled = True
Else
lblInfo.Text = "New customer registration: create your account below."
ddlType.SelectedValue = "New"
ddlType.Enabled = False
End If
End If
End Sub
Protected Sub btnRegister_Click(sender As Object, e As EventArgs)
Try
Dim regParams As SqlParameter() = {
New SqlParameter("@User", txtUsername.Text),
New SqlParameter("@Pass", txtPassword.Text),
New SqlParameter("@Name", txtName.Text),
New SqlParameter("@Type", ddlType.SelectedValue),
New SqlParameter("@Street", txtStreet.Text),
New SqlParameter("@City", txtCity.Text),
New SqlParameter("@PostalCode", txtPostalCode.Text)
}
RestaurantDBHelper.ExecuteNonQuery("INSERT INTO Customer (Username, Password, CustomerName, CustomerType, Street, City, PostalCode) VALUES (@User, @Pass, @Name, @Type, @Street, @City, @PostalCode)", regParams)
lblStatus.Text = "Customer registered successfully! You can now login."
lblStatus.CssClass = "status-msg success"
txtUsername.Text = ""
txtPassword.Text = ""
txtName.Text = ""
txtStreet.Text = ""
txtCity.Text = ""
txtPostalCode.Text = ""
Catch ex As Exception
lblStatus.Text = "Registration failed: " & ex.Message
lblStatus.CssClass = "status-msg error"
End Try
End Sub
End Class
Login Form
Lab_10/login.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="login.aspx.vb" Inherits="login" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta charset="utf-8" />
<title>Login | Restaurant Portal</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container" style="max-width:420px;">
<h2>Login</h2>
<p style="color:#333; margin-bottom:20px;">
<a href="dashboard.aspx" style="color:#2563eb;">← Back to Home</a>
</p>
<form id="form1" runat="server">
<asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
<div class="form-group">
<label>Username</label>
<asp:TextBox ID="txtUser" runat="server"></asp:TextBox>
</div>
<div class="form-group">
<label>Password</label>
<asp:TextBox ID="txtPass" runat="server" TextMode="Password"></asp:TextBox>
</div>
<asp:Button ID="btnLogin" runat="server" Text="Login" OnClick="btnLogin_Click" CssClass="btn" Width="100%" />
</form>
<div style="margin-top:24px; padding:14px; background:#f8fafc; border:1px solid #cbd5e1; border-radius:4px; font-size:0.85rem; color:#111;">
<strong style="color:#2563eb;">Demo Credentials</strong><br /><br />
<b>Customer</b><br />
Username: <code style="color:#2563eb;">ahmad</code> Password: <code style="color:#2563eb;">cust123</code><br /><br />
<b>Manager</b><br />
Username: <code style="color:#2563eb;">manager</code> Password: <code style="color:#2563eb;">owl123</code>
</div>
<div style="margin-top:18px; padding:14px; background:#ffffff; border:1px solid #cbd5e1; border-radius:4px; font-size:0.85rem; color:#111;">
<p style="margin:0 0 10px 0;">New here?</p>
<a href="registration.aspx" class="btn" style="display:inline-block; width:auto; padding:8px 14px;">Register Account</a>
</div>
</div>
</body>
</html>
Login Logic
Lab_10/login.aspx.vb
Imports System.Data.SqlClient
Partial Class login
Inherits System.Web.UI.Page
Protected Sub btnLogin_Click(sender As Object, e As EventArgs)
Dim user As String = txtUser.Text.Trim()
Dim pass As String = txtPass.Text.Trim()
' Check Employee Table first
Dim empQuery As String = "SELECT EmployeeID, EmployeeName, RoleName FROM Employee e JOIN EmployeeRole r ON e.RoleID = r.RoleID WHERE Username = @User AND Password = @Pass"
Dim empParams As SqlParameter() = {
New SqlParameter("@User", user),
New SqlParameter("@Pass", pass)
}
Dim dtEmp As System.Data.DataTable = RestaurantDBHelper.ExecuteReader(empQuery, empParams)
If dtEmp.Rows.Count > 0 Then
Session("Role") = dtEmp.Rows(0)("RoleName").ToString()
Session("Username") = dtEmp.Rows(0)("EmployeeName").ToString()
Session("UserID") = dtEmp.Rows(0)("EmployeeID").ToString()
Response.Redirect("dashboard.aspx")
Return
End If
' Check Customer Table
Dim custQuery As String = "SELECT CustomerID, CustomerName FROM Customer WHERE Username = @User AND Password = @Pass"
Dim custParams As SqlParameter() = {
New SqlParameter("@User", user),
New SqlParameter("@Pass", pass)
}
Dim dtCust As System.Data.DataTable = RestaurantDBHelper.ExecuteReader(custQuery, custParams)
If dtCust.Rows.Count > 0 Then
Session("Role") = "Customer"
Session("Username") = dtCust.Rows(0)("CustomerName").ToString()
Session("UserID") = dtCust.Rows(0)("CustomerID").ToString()
Response.Redirect("dashboard.aspx")
Return
End If
lblStatus.Text = "Invalid username or password."
lblStatus.CssClass = "status-msg error"
End Sub
End Class
Search UI
Lab_10/search.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="search.aspx.vb" Inherits="search" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta charset="utf-8" />
<title>Search | Restaurant Portal</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container">
<h2>Search</h2>
<uc:Nav ID="Nav1" runat="server" />
<form id="form1" runat="server">
<asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
<div class="form-group">
<label>Search Type</label>
<asp:DropDownList ID="ddlSearchType" runat="server" onchange="switchView(this.value)">
<asp:ListItem Value="Menu">Menu Items</asp:ListItem>
<asp:ListItem Value="Customer">Customers</asp:ListItem>
</asp:DropDownList>
</div>
<div class="form-group">
<label>Search by Name</label>
<div style="display:flex;gap:8px;">
<asp:TextBox ID="txtSearch" runat="server" placeholder="Leave blank to show all"></asp:TextBox>
<asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click" CssClass="btn" />
</div>
</div>
<asp:GridView ID="gvResults" runat="server" CssClass="gridview" AutoGenerateColumns="true"></asp:GridView>
<!-- Reference Data from DB -->
<div id="divMenuRef" style="margin-top:20px;">
<p style="color:#bbb; margin-bottom:6px;">Available menu items in database:</p>
<asp:Literal ID="litMenuRef" runat="server"></asp:Literal>
</div>
<div id="divCustRef" style="margin-top:20px; display:none;">
<p style="color:#bbb; margin-bottom:6px;">Registered customers in database:</p>
<asp:Literal ID="litCustRef" runat="server"></asp:Literal>
</div>
</form>
</div>
<script>
function switchView(val) {
document.getElementById('divMenuRef').style.display = (val === 'Menu') ? 'block' : 'none';
document.getElementById('divCustRef').style.display = (val === 'Customer') ? 'block' : 'none';
}
</script>
</body>
</html>
Search Logic
Lab_10/search.aspx.vb
Imports System.Data
Imports System.Data.SqlClient
Partial Class search
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadReferenceData()
End If
End Sub
Private Sub LoadReferenceData()
' Build menu items reference table from DB
Dim menuDt As DataTable = RestaurantDBHelper.GetDataTable("SELECT ItemName, Price, Category FROM MenuItem ORDER BY Category, ItemName")
Dim sb As New System.Text.StringBuilder()
sb.Append("<table class='ref-table'><tr><th>Item Name</th><th>Price (Rs.)</th><th>Category</th></tr>")
For Each row As DataRow In menuDt.Rows
sb.AppendFormat("<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>", row("ItemName"), row("Price"), row("Category"))
Next
sb.Append("</table>")
litMenuRef.Text = sb.ToString()
' Build customer reference table from DB
Dim custDt As DataTable = RestaurantDBHelper.GetDataTable("SELECT CustomerName, CustomerType, City FROM Customer ORDER BY CustomerName")
Dim sb2 As New System.Text.StringBuilder()
sb2.Append("<table class='ref-table'><tr><th>Customer Name</th><th>Type</th><th>City</th></tr>")
For Each row As DataRow In custDt.Rows
sb2.AppendFormat("<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>", row("CustomerName"), row("CustomerType"), row("City"))
Next
sb2.Append("</table>")
litCustRef.Text = sb2.ToString()
End Sub
Protected Sub btnSearch_Click(sender As Object, e As EventArgs)
Try
Dim query As String = ""
If ddlSearchType.SelectedValue = "Menu" Then
query = "SELECT ItemName AS Name, Price, Category FROM MenuItem WHERE ItemName LIKE '%' + @Query + '%'"
Else
query = "SELECT CustomerName AS Name, CustomerType, City FROM Customer WHERE CustomerName LIKE '%' + @Query + '%'"
End If
Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("HalfBloodConn").ConnectionString)
Using cmd As New SqlCommand(query, conn)
cmd.Parameters.AddWithValue("@Query", txtSearch.Text)
Dim adapter As New SqlDataAdapter(cmd)
Dim dt As New DataTable()
adapter.Fill(dt)
gvResults.DataSource = dt
gvResults.DataBind()
End Using
End Using
If gvResults.Rows.Count = 0 Then
lblStatus.Text = "No results found."
lblStatus.CssClass = "status-msg error"
Else
lblStatus.Text = gvResults.Rows.Count & " result(s) found."
lblStatus.CssClass = "status-msg success"
End If
LoadReferenceData()
Catch ex As Exception
lblStatus.Text = "Search failed: " & ex.Message
lblStatus.CssClass = "status-msg error"
End Try
End Sub
End Class
Order Form
Lab_10/order.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="order.aspx.vb" Inherits="order" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta charset="utf-8" />
<title>Place Order | Restaurant Portal</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container">
<h2>Place an Order</h2>
<uc:Nav ID="Nav1" runat="server" />
<form id="form1" runat="server">
<asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
<div class="form-group" id="divCustomer" runat="server">
<label>Customer</label>
<asp:DropDownList ID="ddlCustomer" runat="server"></asp:DropDownList>
</div>
<div class="form-group">
<label>Menu Item</label>
<asp:DropDownList ID="ddlItem" runat="server" onchange="calcTotal()"></asp:DropDownList>
</div>
<div class="form-group">
<label>Quantity</label>
<asp:TextBox ID="txtQuantity" runat="server" TextMode="Number" Text="1" onchange="calcTotal()" onkeyup="calcTotal()"></asp:TextBox>
</div>
<!-- Live total display -->
<div class="total-box" id="totalDisplay">
Total Amount: <strong id="totalAmt">Rs. 0.00</strong>
</div>
<div class="form-group">
<label>Payment Method</label>
<asp:DropDownList ID="ddlMethod" runat="server"></asp:DropDownList>
</div>
<asp:Button ID="btnPlaceOrder" runat="server" Text="Place Order" OnClick="btnPlaceOrder_Click" CssClass="btn" />
</form>
</div>
<script>
function calcTotal() {
var itemSel = document.getElementById('<%= ddlItem.ClientID %>');
var qtyBox = document.getElementById('<%= txtQuantity.ClientID %>');
var qty = parseInt(qtyBox.value) || 1;
var text = itemSel.options[itemSel.selectedIndex].text;
// text format: "ItemName - Rs.450"
var parts = text.split('Rs.');
if (parts.length > 1) {
var price = parseFloat(parts[1]) || 0;
var total = price * qty;
document.getElementById('totalAmt').innerText = 'Rs. ' + total.toFixed(2);
}
}
window.onload = calcTotal;
</script>
</body>
</html>
Order Logic
Lab_10/order.aspx.vb
Imports System.Data.SqlClient
Partial Class order
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
' Only Customer and Manager can place orders
Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")
If role = "" Then
Response.Redirect("login.aspx")
End If
If Not IsPostBack Then
If role = "Customer" Then
divCustomer.Visible = False
Else
ddlCustomer.DataSource = RestaurantDBHelper.GetDataTable("SELECT CustomerID, CustomerName FROM Customer")
ddlCustomer.DataTextField = "CustomerName"
ddlCustomer.DataValueField = "CustomerID"
ddlCustomer.DataBind()
End If
ddlItem.DataSource = RestaurantDBHelper.GetDataTable("SELECT ItemID, ItemName + ' - Rs.' + CAST(Price AS VARCHAR) AS Display FROM MenuItem")
ddlItem.DataTextField = "Display"
ddlItem.DataValueField = "ItemID"
ddlItem.DataBind()
ddlMethod.DataSource = RestaurantDBHelper.GetDataTable("SELECT MethodID, MethodName FROM PaymentMethod")
ddlMethod.DataTextField = "MethodName"
ddlMethod.DataValueField = "MethodID"
ddlMethod.DataBind()
End If
End Sub
Protected Sub btnPlaceOrder_Click(sender As Object, e As EventArgs)
Try
Dim customerID As Integer
If Session("Role") = "Customer" Then
customerID = CInt(Session("UserID"))
Else
customerID = CInt(ddlCustomer.SelectedValue)
End If
Dim itemID As Integer = CInt(ddlItem.SelectedValue)
Dim methodID As Integer = CInt(ddlMethod.SelectedValue)
Dim quantity As Integer
If Not Integer.TryParse(txtQuantity.Text, quantity) OrElse quantity <= 0 Then
Throw New Exception("Enter a valid quantity.")
End If
Dim priceObj As Object = RestaurantDBHelper.ExecuteScalar("SELECT Price FROM MenuItem WHERE ItemID = @ItemID", New SqlParameter() {New SqlParameter("@ItemID", itemID)})
If priceObj Is Nothing OrElse IsDBNull(priceObj) Then
Throw New Exception("Selected menu item was not found.")
End If
Dim price As Decimal = CDec(priceObj)
Dim subtotal As Decimal = price * quantity
Dim orderParams As SqlParameter() = {
New SqlParameter("@CID", customerID),
New SqlParameter("@MID", methodID),
New SqlParameter("@Total", subtotal)
}
RestaurantDBHelper.ExecuteNonQuery("INSERT INTO OrderTable (CustomerID, MethodID, OrderDate, TotalAmount) VALUES (@CID, @MID, GETDATE(), @Total)", orderParams)
Dim newOrderID As Integer = CInt(RestaurantDBHelper.ExecuteScalar("SELECT MAX(OrderID) FROM OrderTable WHERE CustomerID = @CID", New SqlParameter() {New SqlParameter("@CID", customerID)}))
Dim itemParams As SqlParameter() = {
New SqlParameter("@OID", newOrderID),
New SqlParameter("@IID", itemID),
New SqlParameter("@Qty", quantity),
New SqlParameter("@Price", price),
New SqlParameter("@Sub", subtotal)
}
RestaurantDBHelper.ExecuteNonQuery("INSERT INTO OrderItem (OrderID, ItemID, Quantity, UnitPrice, Subtotal) VALUES (@OID, @IID, @Qty, @Price, @Sub)", itemParams)
lblStatus.Text = "Order #" & newOrderID & " placed successfully!"
lblStatus.CssClass = "status-msg success"
Catch ex As Exception
lblStatus.Text = "Order failed: " & ex.Message
lblStatus.CssClass = "status-msg error"
End Try
End Sub
End Class
Reservation Form
Lab_10/reservation.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="reservation.aspx.vb" Inherits="reservation" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta charset="utf-8" />
<title>Reservations | Restaurant Portal</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container">
<h2>Reserve a Table</h2>
<uc:Nav ID="Nav1" runat="server" />
<form id="form1" runat="server">
<asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
<div class="form-group" id="divCustomer" runat="server">
<label>Customer</label>
<asp:DropDownList ID="ddlCustomer" runat="server"></asp:DropDownList>
</div>
<div class="form-group">
<label>Reservation Date</label>
<asp:TextBox ID="txtDate" runat="server" TextMode="Date"></asp:TextBox>
</div>
<div class="form-group">
<label>Number of People</label>
<asp:TextBox ID="txtPeople" runat="server" TextMode="Number" Text="1" onchange="calcFee()" onkeyup="calcFee()"></asp:TextBox>
</div>
<!-- Fee display -->
<div class="total-box">
Fee per person: Rs. 300 |
Reservation Fee: <strong id="feeDisplay">Rs. 300.00</strong>
</div>
<asp:Button ID="btnReserve" runat="server" Text="Reserve Table" OnClick="btnReserve_Click" CssClass="btn" />
</form>
</div>
<script>
function calcFee() {
var people = parseInt(document.getElementById('<%= txtPeople.ClientID %>').value) || 1;
var fee = people * 300;
document.getElementById('feeDisplay').innerText = 'Rs. ' + fee.toFixed(2);
}
window.onload = calcFee;
</script>
</body>
</html>
Reservation Logic
Lab_10/reservation.aspx.vb
Imports System.Data.SqlClient
Partial Class reservation
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")
If role = "" Then Response.Redirect("login.aspx")
If Not IsPostBack Then
If role = "Customer" Then
divCustomer.Visible = False
Else
ddlCustomer.DataSource = RestaurantDBHelper.GetDataTable("SELECT CustomerID, CustomerName FROM Customer")
ddlCustomer.DataTextField = "CustomerName"
ddlCustomer.DataValueField = "CustomerID"
ddlCustomer.DataBind()
End If
End If
End Sub
Protected Sub btnReserve_Click(sender As Object, e As EventArgs)
Try
Dim people As Integer
If Not Integer.TryParse(txtPeople.Text, people) OrElse people <= 0 Then
Throw New Exception("Enter a valid number of people.")
End If
Dim resDate As DateTime
If Not DateTime.TryParse(txtDate.Text, resDate) Then
Throw New Exception("Enter a valid reservation date.")
End If
Dim fee As Decimal = people * 300
Dim cid As String
If Session("Role") = "Customer" Then
cid = Session("UserID").ToString()
Else
cid = ddlCustomer.SelectedValue
End If
Dim resParams As SqlParameter() = {
New SqlParameter("@CID", cid),
New SqlParameter("@Date", resDate),
New SqlParameter("@People", people),
New SqlParameter("@Fee", fee)
}
RestaurantDBHelper.ExecuteNonQuery("INSERT INTO Reservation (CustomerID, ReservationDate, NumberOfPeople, ReservationFee) VALUES (@CID, @Date, @People, @Fee)", resParams)
lblStatus.Text = "Table reserved! Reservation fee: Rs. " & fee.ToString("0.00")
lblStatus.CssClass = "status-msg success"
Catch ex As Exception
lblStatus.Text = "Reservation failed: " & ex.Message
lblStatus.CssClass = "status-msg error"
End Try
End Sub
End Class
Feedback Form
Lab_10/feedback.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="feedback.aspx.vb" Inherits="feedback" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta charset="utf-8" />
<title>Feedback | Restaurant Portal</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container">
<h2>Customer Feedback</h2>
<uc:Nav ID="Nav1" runat="server" />
<form id="form1" runat="server">
<asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
<div class="form-group" id="divCustomer" runat="server" visible="false">
<label>Customer</label>
<asp:DropDownList ID="ddlCustomer" runat="server"></asp:DropDownList>
</div>
<div class="form-group">
<label>Staff Member Served</label>
<asp:DropDownList ID="ddlEmployee" runat="server"></asp:DropDownList>
</div>
<div class="form-group">
<label>Item Ordered</label>
<asp:DropDownList ID="ddlItem" runat="server"></asp:DropDownList>
</div>
<div class="form-group">
<label>Staff Rating (1-5)</label>
<asp:DropDownList ID="ddlStaffRating" runat="server">
<asp:ListItem Value="5">5 - Excellent</asp:ListItem>
<asp:ListItem Value="4">4 - Good</asp:ListItem>
<asp:ListItem Value="3">3 - Average</asp:ListItem>
<asp:ListItem Value="2">2 - Poor</asp:ListItem>
<asp:ListItem Value="1">1 - Terrible</asp:ListItem>
</asp:DropDownList>
</div>
<div class="form-group">
<label>Item Rating (1-5)</label>
<asp:DropDownList ID="ddlItemRating" runat="server">
<asp:ListItem Value="5">5 - Excellent</asp:ListItem>
<asp:ListItem Value="4">4 - Good</asp:ListItem>
<asp:ListItem Value="3">3 - Average</asp:ListItem>
<asp:ListItem Value="2">2 - Poor</asp:ListItem>
<asp:ListItem Value="1">1 - Terrible</asp:ListItem>
</asp:DropDownList>
</div>
<div class="form-group">
<label>Comments</label>
<asp:TextBox ID="txtComment" runat="server" TextMode="MultiLine" Rows="4"></asp:TextBox>
</div>
<asp:Button ID="btnSubmit" runat="server" Text="Submit Feedback" OnClick="btnSubmit_Click" CssClass="btn" />
</form>
</div>
</body>
</html>
Feedback Logic
Lab_10/feedback.aspx.vb
Imports System.Data.SqlClient
Partial Class feedback
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
' Only Customer can submit feedback
Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")
If role <> "Customer" Then
Response.Redirect("index.aspx")
End If
If Not IsPostBack Then
ddlEmployee.DataSource = RestaurantDBHelper.GetDataTable("SELECT EmployeeID, EmployeeName FROM Employee")
ddlEmployee.DataTextField = "EmployeeName"
ddlEmployee.DataValueField = "EmployeeID"
ddlEmployee.DataBind()
ddlItem.DataSource = RestaurantDBHelper.GetDataTable("SELECT ItemID, ItemName FROM MenuItem")
ddlItem.DataTextField = "ItemName"
ddlItem.DataValueField = "ItemID"
ddlItem.DataBind()
End If
End Sub
Protected Sub btnSubmit_Click(sender As Object, e As EventArgs)
Try
Dim customerID As Integer = CInt(Session("UserID"))
Dim feedParams As SqlParameter() = {
New SqlParameter("@CID", customerID),
New SqlParameter("@EID", ddlEmployee.SelectedValue),
New SqlParameter("@IID", ddlItem.SelectedValue),
New SqlParameter("@SRating", CInt(ddlStaffRating.SelectedValue)),
New SqlParameter("@IRating", CInt(ddlItemRating.SelectedValue)),
New SqlParameter("@Comment", txtComment.Text)
}
RestaurantDBHelper.ExecuteNonQuery("INSERT INTO Feedback (CustomerID, EmployeeID, ItemID, StaffRating, ItemRating, Comment) VALUES (@CID, @EID, @IID, @SRating, @IRating, @Comment)", feedParams)
lblStatus.Text = "Feedback submitted successfully. Thank you!"
lblStatus.CssClass = "status-msg success"
Catch ex As Exception
lblStatus.Text = "Submission failed: " & ex.Message
lblStatus.CssClass = "status-msg error"
End Try
End Sub
End Class
Add Menu Item UI
Lab_10/add_item.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="add_item.aspx.vb" Inherits="add_item" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta charset="utf-8" />
<title>Add Menu Item | Manager</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container">
<h2>Add Menu Item</h2>
<uc:Nav ID="Nav1" runat="server" />
<form id="form1" runat="server">
<asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
<div class="form-group">
<label>Item Name</label>
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
</div>
<div class="form-group">
<label>Price (Rs.)</label>
<asp:TextBox ID="txtPrice" runat="server" TextMode="Number" step="0.01"></asp:TextBox>
</div>
<div class="form-group">
<label>Category</label>
<asp:DropDownList ID="ddlCategory" runat="server">
<asp:ListItem>Main Course</asp:ListItem>
<asp:ListItem>Appetizer</asp:ListItem>
<asp:ListItem>Beverage</asp:ListItem>
<asp:ListItem>Dessert</asp:ListItem>
<asp:ListItem>Side</asp:ListItem>
</asp:DropDownList>
</div>
<asp:Button ID="btnAdd" runat="server" Text="Add Item" OnClick="btnAdd_Click" CssClass="btn" />
</form>
</div>
</body>
</html>
Add Menu Item Logic
Lab_10/add_item.aspx.vb
Imports System.Data.SqlClient
Partial Class add_item
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")
If role <> "Manager" Then
Response.Redirect("index.aspx")
End If
End Sub
Protected Sub btnAdd_Click(sender As Object, e As EventArgs)
Try
Dim price As Decimal
If Not Decimal.TryParse(txtPrice.Text, price) OrElse price < 0 Then
Throw New Exception("Please enter a valid price.")
End If
Dim itemName As String = txtName.Text.Trim()
If itemName = "" Then
Throw New Exception("Item name is required.")
End If
Dim params As SqlParameter() = {
New SqlParameter("@Name", itemName),
New SqlParameter("@Price", price),
New SqlParameter("@Category", ddlCategory.SelectedValue)
}
RestaurantDBHelper.ExecuteNonQuery("INSERT INTO MenuItem (ItemName, Price, Category) VALUES (@Name, @Price, @Category)", params)
lblStatus.Text = "Menu item added successfully!"
lblStatus.CssClass = "status-msg success"
txtName.Text = ""
txtPrice.Text = ""
ddlCategory.SelectedIndex = 0
Catch ex As Exception
lblStatus.Text = "Failed to add item: " & ex.Message
lblStatus.CssClass = "status-msg error"
End Try
End Sub
End Class
Inventory UI
Lab_10/inventory.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="inventory.aspx.vb" Inherits="inventory" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta charset="utf-8" />
<title>Inventory | Manager</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container">
<h2>Restaurant Inventory</h2>
<uc:Nav ID="Nav1" runat="server" />
<form id="form1" runat="server">
<asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
<asp:GridView ID="gvInventory" runat="server" CssClass="gridview" AutoGenerateColumns="False" EmptyDataText="No inventory records found.">
<Columns>
<asp:BoundField DataField="ItemName" HeaderText="Item Name" />
<asp:BoundField DataField="Category" HeaderText="Category" />
<asp:BoundField DataField="StockQuantity" HeaderText="Stock Quantity" />
<asp:BoundField DataField="StoreName" HeaderText="Store/Location" />
<asp:BoundField DataField="SupplierName" HeaderText="Supplier" />
</Columns>
</asp:GridView>
</form>
</div>
</body>
</html>
Inventory Logic
Lab_10/inventory.aspx.vb
Imports System.Data
Partial Class inventory
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")
If role <> "Manager" Then
Response.Redirect("index.aspx")
End If
If Not IsPostBack Then
LoadInventory()
End If
End Sub
Private Sub LoadInventory()
Try
Dim query As String = "SELECT m.ItemName, m.Category, s.StockQuantity, s.StoreName, sup.SupplierName " &
"FROM Store s " &
"JOIN MenuItem m ON s.ItemID = m.ItemID " &
"JOIN Supplier sup ON s.SupplierID = sup.SupplierID " &
"ORDER BY m.Category, m.ItemName"
Dim dt As DataTable = RestaurantDBHelper.GetDataTable(query)
gvInventory.DataSource = dt
gvInventory.DataBind()
If dt.Rows.Count = 0 Then
lblStatus.Text = "Inventory data is currently empty."
lblStatus.CssClass = "status-msg"
End If
Catch ex As Exception
lblStatus.Text = "Failed to load inventory: " & ex.Message
lblStatus.CssClass = "status-msg error"
End Try
End Sub
End Class