# Infrastructure Vendor/Model Support - Implementation Guide
**Date:** 2025-10-23
**Status:** Ready for Implementation
**Scope:** Add vendor/model tracking for servers, switches, and cameras
---
## Executive Summary
**Goal:** Extend the existing vendor/model system (currently used for PCs, Printers, and Machines) to also support infrastructure devices (Servers, Switches, Cameras).
**Decision:** **Vendor types ABANDONED** - Keeping the simple vendors table as-is. No boolean flag refactoring needed.
### What We're Building
| Feature | Status | Impact |
|---------|--------|--------|
| Add `modelid` to servers/switches/cameras | Script ready | Database schema |
| Create `vw_network_devices` view | Script ready | Unified infrastructure query |
| Create server CRUD pages | New development | 4 files |
| Create switch CRUD pages | New development | 4 files |
| Create camera CRUD pages | New development | 4 files |
| Update navigation | New development | Menu items |
| Update network map | Optional | Display vendor/model |
**Total New Files:** 12 ASP pages + nav updates
**Total Modified Files:** ~2-3 (navigation, possibly network_map.asp)
**Estimated Time:** 16-24 hours
---
## Part 1: Database Schema Changes
### Migration Script
**File:** `/home/camp/projects/windows/shopdb/sql/add_infrastructure_vendor_model_support.sql`
### What It Does
1. **Adds `modelid` column to infrastructure tables:**
```sql
servers.modelid → models.modelnumberid (FK)
switches.modelid → models.modelnumberid (FK)
cameras.modelid → models.modelnumberid (FK)
```
2. **Creates unified view for infrastructure:**
```sql
CREATE VIEW vw_network_devices AS
SELECT 'Server' AS device_type, serverid, modelid, modelnumber, vendor, ...
FROM servers LEFT JOIN models LEFT JOIN vendors
UNION ALL
SELECT 'Switch' AS device_type, switchid, modelid, modelnumber, vendor, ...
FROM switches LEFT JOIN models LEFT JOIN vendors
UNION ALL
SELECT 'Camera' AS device_type, cameraid, modelid, modelnumber, vendor, ...
FROM cameras LEFT JOIN models LEFT JOIN vendors
```
### Tables After Migration
**servers table:**
```
serverid INT(11) PK AUTO_INCREMENT
modelid INT(11) FK → models.modelnumberid ← NEW!
serialnumber VARCHAR(100)
ipaddress VARCHAR(15)
description VARCHAR(255)
maptop INT(11)
mapleft INT(11)
isactive BIT(1)
```
**switches table:**
```
switchid INT(11) PK AUTO_INCREMENT
modelid INT(11) FK → models.modelnumberid ← NEW!
serialnumber VARCHAR(100)
ipaddress VARCHAR(15)
description VARCHAR(255)
maptop INT(11)
mapleft INT(11)
isactive BIT(1)
```
**cameras table:**
```
cameraid INT(11) PK AUTO_INCREMENT
modelid INT(11) FK → models.modelnumberid ← NEW!
serialnumber VARCHAR(100)
ipaddress VARCHAR(15)
description VARCHAR(255)
maptop INT(11)
mapleft INT(11)
isactive BIT(1)
```
---
## Part 2: Required New Pages
### Server Management Pages (4 files)
#### 1. displayservers.asp - Server List View
**Purpose:** Display all servers in a searchable table
**Similar to:** displayprinters.asp, displaymachines.asp
**Key Features:**
- Sortable table with columns: ID, Model, Vendor, Serial, IP, Description, Status
- Search/filter functionality
- "Add New Server" button
- Click row → displayserver.asp (detail page)
**SQL Query:**
```sql
SELECT s.serverid, s.serialnumber, s.ipaddress, s.description, s.isactive,
m.modelnumber, v.vendor
FROM servers s
LEFT JOIN models m ON s.modelid = m.modelnumberid
LEFT JOIN vendors v ON m.vendorid = v.vendorid
WHERE s.isactive = 1
ORDER BY s.serverid DESC
```
#### 2. displayserver.asp - Server Detail with Inline Edit
**Purpose:** Show server details with inline edit form
**Similar to:** displayprinter.asp, displaymachine.asp
**Key Features:**
- Display mode: Show all server info with Edit button
- Edit mode: Inline form to update server
- Model/Vendor dropdown selection
- Save button → saveserver_direct.asp
- Delete/deactivate functionality
**SQL Query (Display):**
```sql
SELECT s.*, m.modelnumber, v.vendor, v.vendorid
FROM servers s
LEFT JOIN models m ON s.modelid = m.modelnumberid
LEFT JOIN vendors v ON m.vendorid = v.vendorid
WHERE s.serverid = ?
```
#### 3. addserver.asp - Add New Server Form
**Purpose:** Form to add a new server
**Similar to:** addprinter.asp, addmachine.asp
**Key Features:**
- Model dropdown (filtered from models table)
- Vendor dropdown (auto-filled based on model or separate selector)
- Serial number input (text)
- IP address input (validated)
- Description textarea
- Map coordinates (optional, maptop/mapleft)
- Submit → saveserver_direct.asp
**Model Dropdown Query:**
```sql
SELECT m.modelnumberid, m.modelnumber, v.vendor
FROM models m
INNER JOIN vendors v ON m.vendorid = v.vendorid
WHERE m.isactive = 1
ORDER BY v.vendor, m.modelnumber
```
**Or separate vendor/model selection:**
```sql
-- Step 1: Select vendor
SELECT vendorid, vendor FROM vendors WHERE isactive = 1 ORDER BY vendor
-- Step 2: Select model (filtered by vendorid)
SELECT modelnumberid, modelnumber FROM models
WHERE vendorid = ? AND isactive = 1 ORDER BY modelnumber
```
#### 4. saveserver_direct.asp - Server Save Endpoint
**Purpose:** Backend processor to insert/update server
**Similar to:** saveprinter_direct.asp, savemachine_direct.asp
**Key Features:**
- Validate all inputs using validation.asp functions
- INSERT for new server
- UPDATE for existing server
- Return JSON response or redirect
- Error handling
**Insert Query:**
```sql
INSERT INTO servers (modelid, serialnumber, ipaddress, description, maptop, mapleft, isactive)
VALUES (?, ?, ?, ?, ?, ?, 1)
```
**Update Query:**
```sql
UPDATE servers
SET modelid = ?, serialnumber = ?, ipaddress = ?, description = ?,
maptop = ?, mapleft = ?
WHERE serverid = ?
```
### Switch Management Pages (4 files)
Same structure as servers, just replace "server" with "switch":
- **displayswitches.asp** - Switch list
- **displayswitch.asp** - Switch detail with inline edit
- **addswitch.asp** - Add switch form
- **saveswitch_direct.asp** - Switch save endpoint
### Camera Management Pages (4 files)
Same structure, replace with "camera":
- **displaycameras.asp** - Camera list
- **displaycamera.asp** - Camera detail with inline edit
- **addcamera.asp** - Add camera form
- **savecamera_direct.asp** - Camera save endpoint
---
## Part 3: Navigation Updates
### Add Menu Items
**File to modify:** `includes/leftsidebar.asp` (or wherever main nav is)
**New menu section:**
```html
Servers
Switches
Cameras
```
Or add to existing "Network" or "Devices" section.
---
## Part 4: Optional Enhancements
### Update network_map.asp
If network_map.asp currently exists and displays network topology:
- Add server/switch/camera markers to the map
- Display vendor/model on hover/click
- Use vw_network_devices view for unified query
**Query for map:**
```sql
SELECT device_type, device_id, vendor, modelnumber,
ipaddress, description, maptop, mapleft
FROM vw_network_devices
WHERE isactive = 1 AND maptop IS NOT NULL AND mapleft IS NOT NULL
```
---
## Part 5: Code Templates
### Template 1: Infrastructure List Page (displayservers.asp)
```vbscript
<%
' Fetch all servers with model/vendor
Dim strSQL, rs
strSQL = "SELECT s.serverid, s.serialnumber, s.ipaddress, s.description, s.isactive, " & _
"m.modelnumber, v.vendor " & _
"FROM servers s " & _
"LEFT JOIN models m ON s.modelid = m.modelnumberid " & _
"LEFT JOIN vendors v ON m.vendorid = v.vendorid " & _
"WHERE s.isactive = 1 " & _
"ORDER BY s.serverid DESC"
Set rs = objConn.Execute(strSQL)
%>
| ID |
Vendor |
Model |
Serial Number |
IP Address |
Description |
Actions |
<% Do While Not rs.EOF %>
| <%=rs("serverid")%> |
<%=Server.HTMLEncode(rs("vendor") & "")%> |
<%=Server.HTMLEncode(rs("modelnumber") & "")%> |
<%=Server.HTMLEncode(rs("serialnumber") & "")%> |
<%=Server.HTMLEncode(rs("ipaddress") & "")%> |
<%=Server.HTMLEncode(rs("description") & "")%> |
">View |
<%
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
%>
```
### Template 2: Add Infrastructure Device Form (addserver.asp)
```vbscript
```
### Template 3: Save Infrastructure Device (saveserver_direct.asp)
```vbscript
<%
' Validate inputs
Dim modelid, serialnumber, ipaddress, description
modelid = GetSafeInteger("FORM", "modelid", 0, 1, 999999)
serialnumber = GetSafeString("FORM", "serialnumber", "", 0, 100, "^[A-Za-z0-9\-]+$")
ipaddress = GetSafeString("FORM", "ipaddress", "", 0, 15, "^[0-9\.]+$")
description = GetSafeString("FORM", "description", "", 0, 255, "")
' Validate required fields
If modelid = 0 Then
Response.Write("Error: Model is required")
Response.End
End If
' Insert server
Dim strSQL
strSQL = "INSERT INTO servers (modelid, serialnumber, ipaddress, description, isactive) " & _
"VALUES (?, ?, ?, ?, 1)"
Set rs = ExecuteParameterizedQuery(objConn, strSQL, Array(modelid, serialnumber, ipaddress, description))
Call CleanupResources()
' Redirect to list
Response.Redirect("displayservers.asp")
%>
```
---
## Part 6: Implementation Checklist
### Phase 1: Database Migration
- [ ] Review `add_infrastructure_vendor_model_support.sql`
- [ ] Backup database
- [ ] Run migration on test database
- [ ] Verify `modelid` columns added to servers/switches/cameras
- [ ] Verify foreign keys created
- [ ] Verify `vw_network_devices` view created
- [ ] Test view returns correct data
### Phase 2: Server Pages (Do This First)
- [ ] Create `displayservers.asp` (list view)
- [ ] Create `addserver.asp` (add form)
- [ ] Create `saveserver_direct.asp` (save endpoint)
- [ ] Create `displayserver.asp` (detail with inline edit)
- [ ] Test: Add new server
- [ ] Test: Edit existing server
- [ ] Test: View server list
### Phase 3: Switch Pages
- [ ] Create `displayswitches.asp` (list view)
- [ ] Create `addswitch.asp` (add form)
- [ ] Create `saveswitch_direct.asp` (save endpoint)
- [ ] Create `displayswitch.asp` (detail with inline edit)
- [ ] Test: Add/edit/view switches
### Phase 4: Camera Pages
- [ ] Create `displaycameras.asp` (list view)
- [ ] Create `addcamera.asp` (add form)
- [ ] Create `savecamera_direct.asp` (save endpoint)
- [ ] Create `displaycamera.asp` (detail with inline edit)
- [ ] Test: Add/edit/view cameras
### Phase 5: Navigation & Polish
- [ ] Add menu items to navigation
- [ ] Test all navigation links
- [ ] Update dashboard (optional - add infrastructure stats)
- [ ] Update search (optional - add infrastructure to search results)
### Phase 6: Optional Enhancements
- [ ] Update `network_map.asp` to show infrastructure devices
- [ ] Add infrastructure reports (count by vendor, etc.)
- [ ] Add bulk import for infrastructure (CSV upload)
### Phase 7: Documentation & Deployment
- [ ] Update user documentation
- [ ] Update technical documentation
- [ ] Test on production-like data
- [ ] Create deployment checklist
- [ ] Deploy to production
---
## Part 7: Testing Plan
### Unit Tests (Per Device Type)
- [ ] Can add device with valid model
- [ ] Can add device without model (modelid NULL)
- [ ] Can edit device and change model
- [ ] Can delete/deactivate device
- [ ] Form validation works (IP format, required fields)
- [ ] SQL injection prevention (parameterized queries)
### Integration Tests
- [ ] Device appears in list immediately after creation
- [ ] Device detail page shows vendor/model info correctly
- [ ] Model dropdown only shows active models
- [ ] Vendor name displays correctly (from model FK)
- [ ] Map coordinates save/display correctly
### Data Integrity Tests
- [ ] Foreign keys enforce referential integrity
- [ ] Deleting a model doesn't break device (ON DELETE SET NULL)
- [ ] View `vw_network_devices` returns all device types
- [ ] NULL model handling (device with no model assigned)
---
## Part 8: Rollback Plan
If issues arise:
1. Migration script is **non-destructive** - only adds columns, doesn't modify existing data
2. Can drop columns: `ALTER TABLE servers DROP COLUMN modelid`
3. Can drop view: `DROP VIEW vw_network_devices`
4. New ASP pages can be deleted without affecting existing functionality
5. Navigation changes can be reverted
**Risk Level:** LOW - This is pure additive functionality, no changes to existing code.
---
## Part 9: Time Estimates
| Task | Time | Notes |
|------|------|-------|
| Database migration | 30 min | Run script + verify |
| Server pages (4 files) | 4-6 hours | First set, establish pattern |
| Switch pages (4 files) | 2-3 hours | Copy/modify from servers |
| Camera pages (4 files) | 2-3 hours | Copy/modify from servers |
| Navigation updates | 30 min | Add menu items |
| Testing | 3-4 hours | Full testing cycle |
| Documentation | 1-2 hours | User guide updates |
| **Total** | **13-19 hours** | ~2-3 days of work |
---
## Part 10: Success Criteria
**Database:**
- All 3 tables have modelid column with FK to models
- vw_network_devices view returns data from all 3 tables
**Functionality:**
- Can add/edit/view/delete servers, switches, cameras
- Vendor/model information displays correctly
- Forms validate inputs properly
- No SQL errors
**User Experience:**
- Navigation easy to find
- Forms intuitive (like printer/machine forms)
- List views show relevant info at a glance
**Code Quality:**
- Follows existing coding standards (STANDARDS.md)
- Uses parameterized queries (no SQL injection)
- Proper error handling
- Consistent with printer/machine patterns
---
## Next Steps
1. **Get approval** on this simplified approach
2. **Run database migration** on test environment
3. **Start with server pages** - establish the pattern
4. **Copy/adapt for switches and cameras** - reuse code
5. **Test thoroughly**
6. **Document and deploy**
---
**Document Status:** Ready for Implementation
**Last Updated:** 2025-10-23
**Approved By:** _[Pending]_