Consolidate documentation: archive 45+ historical docs
- Move completed migration docs to docs/archive/ - Move session summaries to docs/archive/sessions/ - Rename API_ASP_DOCUMENTATION.md to docs/API.md - Archive redundant Claude reference files - Update docs/README.md as simplified index - Reduce active docs from 45+ files to 8 essential files Remaining docs: - CLAUDE.md (AI context) - TODO.md (task tracking) - docs/README.md, API.md, QUICK_REFERENCE.md - docs/ASP_DEVELOPMENT_GUIDE.md, STANDARDS.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
433
docs/archive/ADD_EDIT_MACHINE_UPDATES.md
Normal file
433
docs/archive/ADD_EDIT_MACHINE_UPDATES.md
Normal file
@@ -0,0 +1,433 @@
|
||||
# Add/Edit Machine Form Updates - Summary
|
||||
|
||||
## Overview
|
||||
Updated machine add/edit forms to support all Phase 2 migration data including network communications, machine relationships, and compliance information.
|
||||
|
||||
---
|
||||
|
||||
## Files Modified
|
||||
|
||||
### 1. addmachine.asp
|
||||
**Location:** `/home/camp/projects/windows/shopdb/addmachine.asp`
|
||||
|
||||
#### New Form Sections Added:
|
||||
|
||||
**A. Network Communications Section**
|
||||
```html
|
||||
<h6>Network Communications (Optional)</h6>
|
||||
```
|
||||
Tab-based layout with support for up to 3 network interfaces:
|
||||
|
||||
**Interface 1 (Primary)**
|
||||
- **IP Address** - Text input with IPv4 validation pattern (field: ip1)
|
||||
- **MAC Address** - Text input with MAC address validation pattern (field: mac1)
|
||||
- Marked as primary interface (isprimary=1)
|
||||
|
||||
**Interface 2 (Optional)**
|
||||
- **IP Address** - Text input with IPv4 validation pattern (field: ip2)
|
||||
- **MAC Address** - Text input with MAC address validation pattern (field: mac2)
|
||||
- Secondary interface (isprimary=0)
|
||||
|
||||
**Interface 3 (Optional)**
|
||||
- **IP Address** - Text input with IPv4 validation pattern (field: ip3)
|
||||
- **MAC Address** - Text input with MAC address validation pattern (field: mac3)
|
||||
- Secondary interface (isprimary=0)
|
||||
|
||||
**B. Machine Relationships Section**
|
||||
```html
|
||||
<h6>Machine Relationships (Optional)</h6>
|
||||
```
|
||||
New Fields:
|
||||
- **Controlling PC** - Dropdown populated with all PCs from machines table (WHERE pctypeid IS NOT NULL)
|
||||
- **Dualpath / Redundant Machine** - Dropdown populated with all equipment (WHERE pctypeid IS NULL)
|
||||
|
||||
**C. Compliance & Security Section**
|
||||
```html
|
||||
<h6>Compliance & Security (Optional)</h6>
|
||||
```
|
||||
New Fields:
|
||||
- **Third Party Managed** - Dropdown (N/A, Yes, No)
|
||||
- **Third Party Vendor** - Dropdown populated from vendors table
|
||||
- **OT Asset System** - Text input for operational technology classification
|
||||
- **DoD Asset Device Type** - Text input for Department of Defense asset classification
|
||||
|
||||
---
|
||||
|
||||
### 2. savemachine_direct.asp
|
||||
**Location:** `/home/camp/projects/windows/shopdb/savemachine_direct.asp`
|
||||
|
||||
#### New Data Handling Added:
|
||||
|
||||
**A. Network Communications Save**
|
||||
- Retrieves form fields: `ip1`, `mac1`, `ip2`, `mac2`, `ip3`, `mac3`
|
||||
- Looks up `Network_Interface` communication type ID
|
||||
- Inserts up to 3 records into `communications` table
|
||||
- Sets `isprimary = 1` for Interface 1 only (Interfaces 2-3 have isprimary=0)
|
||||
- Only inserts if IP or MAC provided for each interface
|
||||
- Interface names: "Interface 1", "Interface 2", "Interface 3"
|
||||
|
||||
**B. Machine Relationships Save**
|
||||
- Retrieves form fields: `controllingpc`, `dualpathid`
|
||||
- Looks up relationship type IDs for 'Controls' and 'Dualpath'
|
||||
|
||||
**Controls Relationship:**
|
||||
- Creates one-way relationship: PC (machineid) → Equipment (related_machineid)
|
||||
- Relationship type: 'Controls'
|
||||
|
||||
**Dualpath Relationship:**
|
||||
- Creates **bidirectional** relationship
|
||||
- Direction 1: New Machine → Dualpath Machine
|
||||
- Direction 2: Dualpath Machine → New Machine
|
||||
- Both records use 'Dualpath' relationship type
|
||||
|
||||
**C. Compliance Data Save**
|
||||
- Retrieves form fields: `thirdpartymanaged`, `thirdpartyvendorid`, `otassetsystem`, `dodassettype`
|
||||
- Inserts record into `compliance` table
|
||||
- Maps third party managed to ENUM: 'Yes', 'No', or 'NA'
|
||||
- Stores third party vendor as foreign key to vendors table (third_party_vendorid)
|
||||
|
||||
---
|
||||
|
||||
### 3. displaymachines.asp
|
||||
**Location:** `/home/camp/projects/windows/shopdb/displaymachines.asp`
|
||||
|
||||
#### Query Filter Updated:
|
||||
|
||||
**Before:**
|
||||
```sql
|
||||
machines.isactive = 1 AND islocationonly=0
|
||||
```
|
||||
|
||||
**After:**
|
||||
```sql
|
||||
machines.isactive = 1 AND islocationonly=0 AND machines.pctypeid IS NULL
|
||||
```
|
||||
|
||||
**Purpose:** Exclude PCs from equipment list - PCs should only appear in displaypcs.asp
|
||||
|
||||
---
|
||||
|
||||
### 4. displaymachine.asp
|
||||
**Location:** `/home/camp/projects/windows/shopdb/displaymachine.asp`
|
||||
|
||||
#### Fixed Issues:
|
||||
- Changed INNER JOIN to LEFT JOIN for `machinetypes` and `functionalaccounts`
|
||||
- Allows machines with NULL machinetypeid to still display (fixes redirect to homepage)
|
||||
- Updated Settings tab to show IP/MAC from communications table instead of old PC tables
|
||||
- Shows controlling PC from relationships table
|
||||
|
||||
---
|
||||
|
||||
## Database Tables Used
|
||||
|
||||
### New Tables Created in Phase 2:
|
||||
|
||||
#### communications
|
||||
```sql
|
||||
CREATE TABLE communications (
|
||||
comid INT PRIMARY KEY AUTO_INCREMENT,
|
||||
machineid INT NOT NULL,
|
||||
comstypeid INT NOT NULL,
|
||||
address VARCHAR(50), -- IP address
|
||||
macaddress VARCHAR(50),
|
||||
interfacename VARCHAR(50),
|
||||
isprimary TINYINT(1) DEFAULT 0,
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
FOREIGN KEY (machineid) REFERENCES machines(machineid),
|
||||
FOREIGN KEY (comstypeid) REFERENCES comstypes(comstypeid)
|
||||
)
|
||||
```
|
||||
|
||||
#### machinerelationships
|
||||
```sql
|
||||
CREATE TABLE machinerelationships (
|
||||
relationshipid INT PRIMARY KEY AUTO_INCREMENT,
|
||||
machineid INT NOT NULL,
|
||||
related_machineid INT NOT NULL,
|
||||
relationshiptypeid INT NOT NULL,
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
FOREIGN KEY (machineid) REFERENCES machines(machineid),
|
||||
FOREIGN KEY (related_machineid) REFERENCES machines(machineid),
|
||||
FOREIGN KEY (relationshiptypeid) REFERENCES relationshiptypes(relationshiptypeid)
|
||||
)
|
||||
```
|
||||
|
||||
#### relationshiptypes
|
||||
```sql
|
||||
CREATE TABLE relationshiptypes (
|
||||
relationshiptypeid INT PRIMARY KEY AUTO_INCREMENT,
|
||||
relationshiptype VARCHAR(50) NOT NULL, -- 'Controls', 'Dualpath'
|
||||
isactive TINYINT(1) DEFAULT 1
|
||||
)
|
||||
```
|
||||
|
||||
#### compliance
|
||||
```sql
|
||||
CREATE TABLE compliance (
|
||||
complianceid INT PRIMARY KEY AUTO_INCREMENT,
|
||||
machineid INT NOT NULL,
|
||||
is_third_party_managed ENUM('Yes', 'No', 'NA'),
|
||||
third_party_manager VARCHAR(100),
|
||||
ot_asset_system VARCHAR(100),
|
||||
ot_asset_device_type VARCHAR(100),
|
||||
is_compliant TINYINT(1),
|
||||
FOREIGN KEY (machineid) REFERENCES machines(machineid)
|
||||
)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Form Validation
|
||||
|
||||
### Client-Side Validation (HTML5):
|
||||
|
||||
**IP Address:**
|
||||
```html
|
||||
pattern="^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$"
|
||||
```
|
||||
|
||||
**MAC Address:**
|
||||
```html
|
||||
pattern="^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$"
|
||||
```
|
||||
|
||||
### Server-Side Validation:
|
||||
|
||||
All inputs are:
|
||||
- Trimmed of whitespace
|
||||
- Checked for empty values before INSERT
|
||||
- Passed through parameterized queries (SQL injection protection)
|
||||
- Used with `IIf()` to convert empty strings to NULL
|
||||
|
||||
---
|
||||
|
||||
## Workflow Examples
|
||||
|
||||
### Adding a New CNC Machine with Full Data:
|
||||
|
||||
1. **Basic Info** (existing fields):
|
||||
- Machine Number: 4500
|
||||
- Model: Okuma LB 3000
|
||||
- Business Unit: Production
|
||||
- Alias: "Main Turning Center"
|
||||
|
||||
2. **Network** (new fields):
|
||||
- Interface 1 IP: 192.168.10.50
|
||||
- Interface 1 MAC: 00:1A:2B:3C:4D:5E
|
||||
- Interface 2 IP: 192.168.10.51
|
||||
- Interface 2 MAC: 00:1A:2B:3C:4D:5F
|
||||
- Interface 3: (left blank)
|
||||
|
||||
3. **Relationships** (new fields):
|
||||
- Controlling PC: PC-SHOP-045
|
||||
- Dualpath Machine: Machine 4501 (backup)
|
||||
|
||||
4. **Compliance** (new fields):
|
||||
- Third Party Managed: No
|
||||
- OT Asset System: Production Control
|
||||
- DoD Asset Type: CNC Lathe
|
||||
|
||||
**Result:**
|
||||
- Machine inserted into `machines` table
|
||||
- Two communication records inserted into `communications` table:
|
||||
- Interface 1: 192.168.10.50 (isprimary=1)
|
||||
- Interface 2: 192.168.10.51 (isprimary=0)
|
||||
- Controls relationship: PC-SHOP-045 → Machine 4500
|
||||
- Dualpath relationships: 4500 ↔ 4501 (bidirectional)
|
||||
- Compliance record inserted into `compliance` table
|
||||
- Redirects to displaymachine.asp?machineid=[newid]
|
||||
|
||||
---
|
||||
|
||||
## Security Features
|
||||
|
||||
### Parameterized Queries:
|
||||
All database operations use `ADODB.Command` with parameters:
|
||||
```asp
|
||||
Set cmd = Server.CreateObject("ADODB.Command")
|
||||
cmd.ActiveConnection = objConn
|
||||
cmd.CommandText = "INSERT INTO communications (...) VALUES (?, ?, ?, ?, ?)"
|
||||
cmd.Parameters.Append cmd.CreateParameter("@machineid", 3, 1, , machineid)
|
||||
...
|
||||
cmd.Execute
|
||||
```
|
||||
|
||||
### HTML Encoding:
|
||||
All user input displayed in dropdowns uses `Server.HTMLEncode()`:
|
||||
```asp
|
||||
Response.Write("<option value='" & id & "'>" & Server.HTMLEncode(displayText) & "</option>")
|
||||
```
|
||||
|
||||
### Input Validation:
|
||||
- Required fields checked server-side
|
||||
- Numeric fields validated with `IsNumeric()`
|
||||
- String length limits enforced
|
||||
- NULL handling with `IIf()`
|
||||
|
||||
---
|
||||
|
||||
## Error Handling
|
||||
|
||||
### Graceful Failures:
|
||||
```asp
|
||||
On Error Resume Next
|
||||
cmd.Execute
|
||||
Set cmd = Nothing
|
||||
On Error Goto 0
|
||||
```
|
||||
|
||||
All Phase 2 data inserts use error suppression to allow partial success:
|
||||
- Machine can be created even if communication insert fails
|
||||
- Relationship creation failures don't block machine creation
|
||||
- Compliance data is optional
|
||||
|
||||
### User Feedback:
|
||||
- Success: Redirects to displaymachine.asp with new machine
|
||||
- Failure: Shows error message with "Go back" link
|
||||
- Duplicate machine number: Prevented with validation check
|
||||
|
||||
---
|
||||
|
||||
## Testing Checklist
|
||||
|
||||
- [ ] Add machine with all new fields populated
|
||||
- [ ] Add machine with only required fields (Phase 2 fields empty)
|
||||
- [ ] Verify IP address validation (invalid format rejected)
|
||||
- [ ] Verify MAC address validation (invalid format rejected)
|
||||
- [ ] Verify controlling PC creates correct relationship
|
||||
- [ ] Verify dualpath creates bidirectional relationships
|
||||
- [ ] Verify compliance data saves correctly
|
||||
- [ ] Test with special characters in text fields
|
||||
- [ ] Verify displaymachines.asp no longer shows PCs
|
||||
- [ ] Verify machines with NULL machinetypeid still display
|
||||
- [ ] Test redirect after successful machine creation
|
||||
- [ ] Verify Settings tab shows data from communications table
|
||||
|
||||
---
|
||||
|
||||
## Known Limitations
|
||||
|
||||
1. **No Relationship Editing**
|
||||
- Cannot modify relationships after creation
|
||||
- Must edit relationships via database or future edit form
|
||||
- Future enhancement: Edit relationships on machine edit page
|
||||
|
||||
2. **No Communication Editing**
|
||||
- Cannot modify IP/MAC after creation
|
||||
- Must edit via database or future edit form
|
||||
- Future enhancement: Edit communications on machine edit page
|
||||
|
||||
3. **PC Filter Assumption**
|
||||
- Assumes all PCs have `pctypeid IS NOT NULL`
|
||||
- Legacy PCs may not have pctypeid set
|
||||
- Migration should ensure all PCs have pctypeid
|
||||
|
||||
---
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
### For editmacine.asp (Edit Page):
|
||||
|
||||
1. **Network Communications Management**
|
||||
- List all existing interfaces
|
||||
- Add new interfaces
|
||||
- Edit existing interfaces
|
||||
- Delete interfaces
|
||||
- Set primary interface
|
||||
|
||||
2. **Relationship Management**
|
||||
- View all relationships
|
||||
- Add new relationships
|
||||
- Remove relationships
|
||||
- Edit relationship types
|
||||
|
||||
3. **Compliance Management**
|
||||
- Edit all compliance fields
|
||||
- Add security scan records
|
||||
- View scan history
|
||||
- Update compliance status
|
||||
|
||||
4. **Bulk Operations**
|
||||
- Assign same PC to multiple machines
|
||||
- Create multiple dualpath links at once
|
||||
- Bulk update compliance data
|
||||
|
||||
---
|
||||
|
||||
## Migration Notes
|
||||
|
||||
### Data Already Imported:
|
||||
- 308 equipment with network communications
|
||||
- 144 PC control relationships
|
||||
- 62 dualpath relationships
|
||||
- 164 machines with compliance data
|
||||
- 68 security scans
|
||||
|
||||
### What This Form Adds:
|
||||
- Ability to create NEW machines with Phase 2 data
|
||||
- Ensures all new machines have proper network configuration
|
||||
- Establishes relationships at creation time
|
||||
- Records compliance data from day one
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Machine redirects to homepage:
|
||||
- Check if model has NULL machinetypeid
|
||||
- Run: `UPDATE models SET machinetypeid = X WHERE modelnumberid = Y`
|
||||
- Or use LEFT JOIN fix in displaymachine.asp
|
||||
|
||||
### IP address not showing:
|
||||
- Check if communication record was created
|
||||
- Verify `isprimary = 1` is set
|
||||
- Check Settings tab query for communications join
|
||||
|
||||
### Relationship not created:
|
||||
- Verify relationship types exist in database
|
||||
- Check for duplicate relationships (prevents re-insert)
|
||||
- Verify both machines have valid machineids
|
||||
|
||||
### PC still showing in equipment list:
|
||||
- Verify PC has `pctypeid IS NOT NULL`
|
||||
- Check displaymachines.asp WHERE clause includes PC filter
|
||||
- Clear browser cache
|
||||
|
||||
---
|
||||
|
||||
## Contact / Support
|
||||
|
||||
For questions about these changes:
|
||||
- See `/home/camp/projects/windows/shopdb/sql/migration_phase2/` for migration scripts
|
||||
- See `/home/camp/projects/windows/shopdb/DISPLAY_PAGES_UPDATE_SUMMARY.md` for display page changes
|
||||
- Review import logs in `/tmp/inventory_import_final.log`
|
||||
|
||||
---
|
||||
|
||||
## Change Log
|
||||
|
||||
**Date:** 2025-11-07
|
||||
|
||||
**Files Modified:**
|
||||
- /home/camp/projects/windows/shopdb/addmachine.asp
|
||||
- /home/camp/projects/windows/shopdb/savemachine_direct.asp
|
||||
- /home/camp/projects/windows/shopdb/displaymachines.asp
|
||||
- /home/camp/projects/windows/shopdb/displaymachine.asp
|
||||
|
||||
**Changes:**
|
||||
- Redesigned addmachine.asp with Bootstrap tabs (Basic Info, Network, Relationships, Compliance, Location)
|
||||
- Added support for up to 3 network interfaces on add machine form
|
||||
- Added machine relationship fields (controlling PC, dualpath)
|
||||
- Added compliance data fields with third-party vendor dropdown
|
||||
- Updated save handler to insert Phase 2 data (multiple interfaces, relationships, compliance)
|
||||
- Fixed displaymachines.asp to exclude PCs (pctypeid IS NULL filter)
|
||||
- Fixed displaymachine.asp LEFT JOIN for NULL machinetypes
|
||||
- Updated Settings tab to show communications data
|
||||
- Fixed NULL handling in controlling PC dropdown (Server.HTMLEncode type mismatch)
|
||||
- Changed third_party_manager from text field to third_party_vendorid foreign key
|
||||
|
||||
**Database Impact:**
|
||||
- New records created in: communications (up to 3 per machine), machinerelationships, compliance
|
||||
- Added third_party_vendorid column to compliance table
|
||||
- All changes backward compatible
|
||||
|
||||
455
docs/archive/BUG_FIXES_2025-11-14.md
Normal file
455
docs/archive/BUG_FIXES_2025-11-14.md
Normal file
@@ -0,0 +1,455 @@
|
||||
# Critical Bug Fixes - November 14, 2025
|
||||
|
||||
## Summary
|
||||
|
||||
Fixed multiple critical bugs in `api.asp` that prevented PowerShell data collection scripts from properly updating PC records and creating machine relationships. All issues stemmed from using VB6/VBA functions not available in Classic ASP VBScript.
|
||||
|
||||
---
|
||||
|
||||
## Bugs Fixed
|
||||
|
||||
### 1. **PC UPDATE Bug (InsertOrUpdatePC)**
|
||||
**Lines:** 451-495
|
||||
**Symptom:** PC records could be inserted but not updated
|
||||
**Error:** `"Variable is undefined"`
|
||||
**Root Cause:** Used `IIf()` function in UPDATE SQL statement
|
||||
**Impact:** HIGH - Prevented regular PC inventory updates
|
||||
|
||||
**Fix:** Replaced all `IIf()` calls with proper IF-THEN-ELSE statements:
|
||||
```vbscript
|
||||
' BEFORE (BROKEN):
|
||||
"modelnumberid = " & IIf(modelId > 0, CLng(modelId), "NULL") & ", " & _
|
||||
|
||||
' AFTER (FIXED):
|
||||
Dim sqlModelId
|
||||
If modelId > 0 Then
|
||||
sqlModelId = CLng(modelId)
|
||||
Else
|
||||
sqlModelId = "NULL"
|
||||
End If
|
||||
"modelnumberid = " & sqlModelId & ", " & _
|
||||
```
|
||||
|
||||
**Test Result:** Both INSERT and UPDATE now working correctly
|
||||
|
||||
---
|
||||
|
||||
### 2. **PC→Machine Relationship Bug (CreatePCMachineRelationship)**
|
||||
**Lines:** 849-984
|
||||
**Symptom:** PowerShell scripts couldn't create PC→Machine relationships
|
||||
**Errors:** Multiple issues found and fixed
|
||||
|
||||
#### Issue A: Parameter Order Reversed
|
||||
**Lines:** 916-918
|
||||
**Problem:** Relationship created backwards (Equipment→PC instead of PC→Equipment)
|
||||
```vbscript
|
||||
' BEFORE (WRONG):
|
||||
cmdInsert.Parameters.Append cmdInsert.CreateParameter("@equipmentid", 3, 1, , CLng(equipmentMachineid))
|
||||
cmdInsert.Parameters.Append cmdInsert.CreateParameter("@pcid", 3, 1, , CLng(pcMachineid))
|
||||
' Created: Equipment (machineid) → Controls → PC (related_machineid)
|
||||
|
||||
' AFTER (CORRECT):
|
||||
cmdInsert.Parameters.Append cmdInsert.CreateParameter("@pcid", 3, 1, , CLng(pcMachineid))
|
||||
cmdInsert.Parameters.Append cmdInsert.CreateParameter("@equipmentid", 3, 1, , CLng(equipmentMachineid))
|
||||
' Creates: PC (machineid) → Controls → Equipment (related_machineid)
|
||||
```
|
||||
|
||||
#### Issue B: Phase 1 Schema Query
|
||||
**Line:** 859
|
||||
**Problem:** Query used Phase 1 schema field `pctypeid IS NULL`
|
||||
```vbscript
|
||||
' BEFORE (Phase 1):
|
||||
"SELECT machineid FROM machines WHERE machinenumber = ? AND pctypeid IS NULL"
|
||||
|
||||
' AFTER (Phase 2):
|
||||
"SELECT machineid FROM machines WHERE machinenumber = '...' AND machinetypeid NOT IN (33,34,35)"
|
||||
```
|
||||
|
||||
#### Issue C: ExecuteParameterizedQuery Not Returning Data
|
||||
**Problem:** Parameterized query helper function wasn't returning `machineid` value
|
||||
**Fix:** Switched to direct SQL execution with proper string sanitization
|
||||
|
||||
**Test Result:** PC→Machine relationships now created correctly
|
||||
```
|
||||
PC 5459 (FINAL-TEST-PC) → Controls → Equipment 136 (machine 2021)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. **Network Interface Storage Bug (InsertNetworkInterfaces)**
|
||||
**Lines:** 695-698
|
||||
**Symptom:** Would fail when storing network interface data
|
||||
**Error:** `"Variable is undefined"`
|
||||
**Root Cause:** 4 `IIf()` calls for parameter values
|
||||
**Impact:** MEDIUM - Network/IP data collection would fail
|
||||
|
||||
**Fix:** Replaced IIf() with IF-THEN-ELSE:
|
||||
```vbscript
|
||||
' Prepare parameter values (VBScript doesn't have IIf)
|
||||
Dim paramAddress, paramMacAddress, paramSubnet, paramGateway
|
||||
If ipAddress <> "" Then paramAddress = ipAddress Else paramAddress = Null
|
||||
If macAddress <> "" Then paramMacAddress = macAddress Else paramMacAddress = Null
|
||||
If subnetMask <> "" Then paramSubnet = subnetMask Else paramSubnet = Null
|
||||
If gateway <> "" Then paramGateway = gateway Else paramGateway = Null
|
||||
```
|
||||
|
||||
**Status:** Already working (705 network interfaces stored), but now bug-proof
|
||||
|
||||
---
|
||||
|
||||
### 4. **Serial Port Config Bug (InsertCommConfigs)**
|
||||
**Lines:** 751-755
|
||||
**Symptom:** Would fail when storing serial port configurations
|
||||
**Error:** `"Variable is undefined"`
|
||||
**Root Cause:** 5 `IIf()` calls for parameter values
|
||||
**Impact:** LOW - Only affects shopfloor PCs with serial communication
|
||||
|
||||
**Fix:** Replaced 5 IIf() calls with proper IF-THEN-ELSE statements
|
||||
|
||||
---
|
||||
|
||||
### 5. **DNC Config Bug (InsertDNCConfig)**
|
||||
**Lines:** 830-848
|
||||
**Symptom:** Would fail when storing DNC configuration data
|
||||
**Error:** `"Variable is undefined"`
|
||||
**Root Cause:** **19 `IIf()` calls** - the largest concentration of bugs!
|
||||
**Impact:** HIGH - DNC config critical for shopfloor PCs
|
||||
|
||||
**Fix:** Replaced all 19 IIf() calls with proper variable preparation:
|
||||
```vbscript
|
||||
' Prepare parameter values (VBScript doesn't have IIf)
|
||||
Dim pSite, pCnc, pNcif, pMachineNum, pHostType, pFtpPri, pFtpSec, pFtpAcct
|
||||
Dim pDebug, pUploads, pScanner, pDripFeed, pAddSet, pDualPath, pPath1, pPath2, pGe32, pGe64, pGeNotes
|
||||
|
||||
If site <> "" Then pSite = site Else pSite = Null
|
||||
If cnc <> "" Then pCnc = cnc Else pCnc = Null
|
||||
[... 17 more similar statements ...]
|
||||
```
|
||||
|
||||
**Data Stored:**
|
||||
- DNC General config (Site, CNC, NCIF, MachineNo, HostType)
|
||||
- FTP settings (Primary, Secondary, Account)
|
||||
- DNC settings (Debug, Uploads, Scanner, DripFeed)
|
||||
- DualPath config (enabled, Path1Name, Path2Name)
|
||||
- GE Registry architecture (32-bit, 64-bit flags)
|
||||
|
||||
---
|
||||
|
||||
### 6. **Warranty Data Bug (UpdateWarrantyData)**
|
||||
**Lines:** 1012-1014, 1032-1034
|
||||
**Symptom:** Would fail when storing warranty information
|
||||
**Error:** `"Variable is undefined"`
|
||||
**Root Cause:** 6 `IIf()` calls (3 in UPDATE, 3 in INSERT)
|
||||
**Impact:** LOW - Warranty lookups disabled by default
|
||||
|
||||
**Fix:** Replaced IIf() calls in both UPDATE and INSERT paths
|
||||
|
||||
---
|
||||
|
||||
### 7. **Application Version Bug (GetOrCreateApplication)**
|
||||
**Line:** 1301
|
||||
**Symptom:** Would fail when storing application with version
|
||||
**Error:** `"Variable is undefined"`
|
||||
**Root Cause:** 1 `IIf()` call for version parameter
|
||||
**Impact:** LOW - Application tracking still works if version empty
|
||||
|
||||
**Fix:** Simple IF-THEN-ELSE replacement
|
||||
|
||||
---
|
||||
|
||||
## Total Bugs Fixed
|
||||
|
||||
| Function | IIf() Bugs | Status |
|
||||
|----------|-----------|--------|
|
||||
| InsertOrUpdatePC | 5 | Fixed |
|
||||
| InsertNetworkInterfaces | 4 | Fixed |
|
||||
| InsertCommConfigs | 5 | Fixed |
|
||||
| InsertDNCConfig | 19 | Fixed |
|
||||
| UpdateWarrantyData (UPDATE) | 3 | Fixed |
|
||||
| UpdateWarrantyData (INSERT) | 3 | Fixed |
|
||||
| GetOrCreateApplication | 1 | Fixed |
|
||||
| CreatePCMachineRelationship (logic) | N/A | Fixed |
|
||||
| **TOTAL** | **33 + 3 logic bugs** | ** ALL FIXED** |
|
||||
|
||||
---
|
||||
|
||||
## Data Collection Status
|
||||
|
||||
### **Working Correctly**
|
||||
|
||||
1. **PC Records**
|
||||
- INSERT new PCs: Working
|
||||
- UPDATE existing PCs: Working (FIXED)
|
||||
- Phase 2 schema (machinetypeid 33/34/35): Working
|
||||
|
||||
2. **PC→Machine Relationships**
|
||||
- Automatic creation from PowerShell: Working (FIXED)
|
||||
- Correct relationship direction: Working (FIXED)
|
||||
- Phase 2 schema compatibility: Working (FIXED)
|
||||
- Database: 705+ relationships active
|
||||
|
||||
3. **Network/IP Information**
|
||||
- Stored in `communications` table: Working
|
||||
- 705 network interfaces collected
|
||||
- Data: IP, MAC, subnet, gateway, DHCP status, interface name
|
||||
- Uses comstypeid=3 (Network_Interface): Correct
|
||||
|
||||
4. **Installed Applications**
|
||||
- Stored in `installedapps` table: Working
|
||||
- 331 application entries
|
||||
- Linked via machineid and appid: Correct
|
||||
|
||||
5. **DNC Configuration**
|
||||
- Stored in `pc_dnc_config` table: Working (FIXED)
|
||||
- DualPath detection: Working (FIXED)
|
||||
- GE Registry architecture tracking: Working (FIXED)
|
||||
- Path names (LEFT/RIGHT): Working (FIXED)
|
||||
|
||||
6. **Serial Port Configs**
|
||||
- Stored in `pc_comm_config` table: Working (FIXED)
|
||||
- Baud rate, data bits, parity, stop bits: Working
|
||||
|
||||
7. **Warranty Data**
|
||||
- Stored in `warranties` table: Working (FIXED)
|
||||
- End date, service level, status, days remaining: Working
|
||||
|
||||
---
|
||||
|
||||
## Testing Results
|
||||
|
||||
### Test 1: Basic PC INSERT
|
||||
```bash
|
||||
curl -X POST "http://192.168.122.151:8080/api.asp" \
|
||||
-d "action=updateCompleteAsset" \
|
||||
-d "hostname=FINAL-TEST-PC" \
|
||||
-d "serialNumber=FINAL-TEST-001" \
|
||||
-d "manufacturer=Dell" \
|
||||
-d "model=OptiPlex 7060" \
|
||||
-d "pcType=Shopfloor" \
|
||||
-d "machineNo=2021"
|
||||
```
|
||||
|
||||
**Result:** SUCCESS
|
||||
- PC created: machineid=5459
|
||||
- Relationship created: PC 5459 → Controls → Equipment 136
|
||||
|
||||
### Test 2: PC UPDATE
|
||||
```bash
|
||||
# Same hostname, different serial
|
||||
curl -X POST "..." -d "hostname=FINAL-TEST-PC" -d "serialNumber=UPDATED-SERIAL"
|
||||
```
|
||||
|
||||
**Result:** SUCCESS (Previously would FAIL with "Variable is undefined")
|
||||
|
||||
### Test 3: API Health Check
|
||||
```bash
|
||||
curl "http://192.168.122.151:8080/api.asp?action=getDashboardData"
|
||||
```
|
||||
|
||||
**Result:** SUCCESS
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "ShopDB API is online",
|
||||
"version": 1.0,
|
||||
"schema": "Phase 2"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PowerShell Scripts Status
|
||||
|
||||
### **Ready to Use**
|
||||
|
||||
**Update-PC-CompleteAsset.ps1**
|
||||
- Default API URL: `http://192.168.122.151:8080/api.asp`
|
||||
- Data collection: Hardware, OS, Network, DNC, Serial, Applications
|
||||
- API communication: All endpoints working
|
||||
- Phase 2 schema: Compatible
|
||||
|
||||
**Invoke-RemoteAssetCollection.ps1**
|
||||
- Remote execution via WinRM: Ready
|
||||
- Default URL: Still points to old PHP API
|
||||
- **Recommendation:** Update default or use `-DashboardURL` parameter
|
||||
|
||||
---
|
||||
|
||||
## What Changed
|
||||
|
||||
### Files Modified
|
||||
- `/home/camp/projects/windows/shopdb/api.asp` - 36 bugs fixed
|
||||
|
||||
### Lines Changed
|
||||
- **InsertOrUpdatePC:** Lines 451-495
|
||||
- **CreatePCMachineRelationship:** Lines 849-984
|
||||
- **InsertNetworkInterfaces:** Lines 693-708
|
||||
- **InsertCommConfigs:** Lines 749-763
|
||||
- **InsertDNCConfig:** Lines 829-872
|
||||
- **UpdateWarrantyData:** Lines 1011-1021, 1036-1046
|
||||
- **GetOrCreateApplication:** Lines 1296-1306
|
||||
|
||||
---
|
||||
|
||||
## Why This Happened
|
||||
|
||||
### VBScript vs VB6/VBA
|
||||
|
||||
Classic ASP uses **VBScript**, which is a **subset** of Visual Basic. VBScript does NOT include:
|
||||
- `IIf()` - Inline If function
|
||||
- Many other VB6/VBA convenience functions
|
||||
|
||||
**Common Mistake:**
|
||||
```vbscript
|
||||
' This works in VB6/VBA but NOT in VBScript:
|
||||
value = IIf(condition, trueValue, falseValue)
|
||||
|
||||
' VBScript sees "IIf" as a variable name, throws "Variable is undefined"
|
||||
```
|
||||
|
||||
**Correct VBScript:**
|
||||
```vbscript
|
||||
If condition Then
|
||||
value = trueValue
|
||||
Else
|
||||
value = falseValue
|
||||
End If
|
||||
```
|
||||
|
||||
### Why It Wasn't Caught Earlier
|
||||
- INSERT operations worked fine (used direct SQL with sanitization)
|
||||
- UPDATE operations were less frequently used during testing
|
||||
- Some functions (DNC, Serial, Warranty) rarely triggered in development
|
||||
- Errors were silent due to `On Error Resume Next`
|
||||
|
||||
---
|
||||
|
||||
## Best Practices Going Forward
|
||||
|
||||
### 1. **Never Use IIf() in Classic ASP**
|
||||
Always use explicit IF-THEN-ELSE statements
|
||||
|
||||
### 2. **Test Both Code Paths**
|
||||
- Test INSERT **and** UPDATE operations
|
||||
- Test all optional data paths (DNC, Network, Serial, Warranty)
|
||||
|
||||
### 3. **Avoid `On Error Resume Next` Without Logging**
|
||||
Current code has good logging - maintain it!
|
||||
|
||||
### 4. **Phase 2 Schema Reminders**
|
||||
```sql
|
||||
-- PCs identified by machinetypeid (NOT pctypeid)
|
||||
WHERE machinetypeid IN (33, 34, 35) -- PCs
|
||||
WHERE machinetypeid NOT IN (33, 34, 35) -- Equipment
|
||||
|
||||
-- Relationships in machinerelationships table
|
||||
PC (machineid) → Controls → Equipment (related_machineid)
|
||||
```
|
||||
|
||||
### 5. **Parameter Validation**
|
||||
Direct SQL is faster than parameterized queries in this case, but:
|
||||
- **Always sanitize:** `Replace(value, "'", "''")`
|
||||
- **Always log SQL:** Helps debugging
|
||||
- **Always check types:** Use `CLng()` for integers
|
||||
|
||||
---
|
||||
|
||||
## Migration Notes
|
||||
|
||||
### From Phase 1 to Phase 2
|
||||
|
||||
**Schema Changes:**
|
||||
- `pc` table → `machines` table (machinetypeid 33-35)
|
||||
- `pctypeid` field → removed
|
||||
- `machinetypeid` field → used for ALL machines
|
||||
- Relationships → `machinerelationships` table
|
||||
|
||||
**Machine Type IDs:**
|
||||
- 1-32: Equipment (CNC, Printer, Network Device, etc.)
|
||||
- 33: Standard PC
|
||||
- 34: Engineering PC
|
||||
- 35: Shopfloor PC
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
### 1. **Update PowerShell Default URL** (Optional)
|
||||
```powershell
|
||||
# Invoke-RemoteAssetCollection.ps1 line 97
|
||||
[string]$DashboardURL = "http://192.168.122.151:8080/api.asp"
|
||||
```
|
||||
|
||||
### 2. **Deploy to Production**
|
||||
- All critical bugs fixed
|
||||
- All data collection working
|
||||
- Phase 2 schema fully supported
|
||||
- Ready for shopfloor deployment
|
||||
|
||||
### 3. **Monitor Logs**
|
||||
Watch `/home/camp/projects/windows/shopdb/logs/api.log` for:
|
||||
- Successful PC updates
|
||||
- Relationship creation
|
||||
- Any unexpected errors
|
||||
|
||||
### 4. **Test on Real Shopfloor PCs**
|
||||
- DNC configuration detection
|
||||
- Network interface collection (192.168.*.* detection)
|
||||
- Serial port configuration
|
||||
- Machine number extraction
|
||||
|
||||
---
|
||||
|
||||
## Documentation Created
|
||||
|
||||
1. **POWERSHELL_API_FIX_2025-11-14.md** - IIf() bug fix and testing
|
||||
2. **DUALPATH_DETECTION_GUIDE.md** - How DualPath detection works
|
||||
3. **BUG_FIXES_2025-11-14.md** - This comprehensive summary (YOU ARE HERE)
|
||||
|
||||
---
|
||||
|
||||
## Support
|
||||
|
||||
### API Endpoints
|
||||
|
||||
**Main Endpoint:**
|
||||
```
|
||||
POST http://192.168.122.151:8080/api.asp
|
||||
```
|
||||
|
||||
**Actions:**
|
||||
- `updateCompleteAsset` - PC data collection ( FIXED)
|
||||
- `updatePrinterMapping` - Printer assignments ( Working)
|
||||
- `updateInstalledApps` - Application tracking ( Working)
|
||||
- `getDashboardData` - Health check ( Working)
|
||||
|
||||
### Test Script
|
||||
|
||||
Created comprehensive test script:
|
||||
```powershell
|
||||
/home/camp/projects/powershell/Test-API-Connection.ps1
|
||||
```
|
||||
|
||||
Runs all test scenarios:
|
||||
- API connectivity
|
||||
- INSERT operations
|
||||
- UPDATE operations
|
||||
- Network interface data
|
||||
- Shopfloor PC with machine number
|
||||
|
||||
---
|
||||
|
||||
**Status:** ALL BUGS FIXED AND TESTED
|
||||
**Date:** 2025-11-14
|
||||
**Tested By:** Claude Code (AI Assistant)
|
||||
**Production Ready:** YES
|
||||
|
||||
---
|
||||
|
||||
## Lessons Learned
|
||||
|
||||
1. **VBScript ≠ VB6** - Always check function compatibility
|
||||
2. **Test EVERYTHING** - Don't assume one code path = all paths
|
||||
3. **Logging Saves Time** - The detailed logging made debugging 10x faster
|
||||
4. **Small Helpers Break Things** - ExecuteParameterizedQuery had subtle bugs
|
||||
5. **Direct SQL Often Better** - Simpler, faster, easier to debug (when properly sanitized)
|
||||
76
docs/archive/CLAUDE_PROJECT_INSTRUCTIONS.md
Normal file
76
docs/archive/CLAUDE_PROJECT_INSTRUCTIONS.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# Claude.ai Project Instructions for ShopDB
|
||||
|
||||
Copy this into your Claude.ai project's "Instructions" field.
|
||||
|
||||
---
|
||||
|
||||
## Project Instructions (Copy Below This Line)
|
||||
|
||||
You are helping maintain ShopDB, a Classic ASP/VBScript web application for GE Aerospace shop floor infrastructure management.
|
||||
|
||||
### Technology Context
|
||||
- **Language:** Classic ASP with VBScript (NOT .NET)
|
||||
- **Database:** MySQL 5.6 (NOT SQL Server)
|
||||
- **Frontend:** Bootstrap 4.6, jQuery, DataTables
|
||||
|
||||
### Critical VBScript Rules
|
||||
1. **No IIf() function** - VBScript doesn't have it. Use If-Then-Else:
|
||||
```vbscript
|
||||
' WRONG: value = IIf(condition, "yes", "no")
|
||||
' RIGHT:
|
||||
If condition Then
|
||||
value = "yes"
|
||||
Else
|
||||
value = "no"
|
||||
End If
|
||||
```
|
||||
|
||||
2. **Always use parameterized queries** - Never concatenate user input:
|
||||
```vbscript
|
||||
cmd.CommandText = "SELECT * FROM machines WHERE machineid = ?"
|
||||
cmd.Parameters.Append cmd.CreateParameter("@id", 3, 1, , machineId)
|
||||
```
|
||||
|
||||
3. **Convert text fields to strings** with `& ""` to avoid Null errors:
|
||||
```vbscript
|
||||
hostname = rs("hostname") & ""
|
||||
```
|
||||
|
||||
4. **HTMLEncode all output** to prevent XSS:
|
||||
```vbscript
|
||||
Response.Write(Server.HTMLEncode(value))
|
||||
```
|
||||
|
||||
### Database Schema (Current)
|
||||
- `machines` table contains Equipment, PCs, and Network Devices
|
||||
- PCs identified by: `pctypeid IS NOT NULL` or `machinetypeid IN (33,34,35)`
|
||||
- Equipment identified by: `pctypeid IS NULL`
|
||||
- Network interfaces in `communications` table (use `address` not `ipaddress`)
|
||||
- Relationships in `machinerelationships` table
|
||||
- Printers stay in separate `printers` table
|
||||
|
||||
### File Naming Conventions
|
||||
- `display*.asp` - View/list pages (read-only)
|
||||
- `add*.asp` - Forms for adding new records
|
||||
- `edit*.asp` - Forms for editing existing records
|
||||
- `save*.asp` - Backend handlers for form submissions
|
||||
- `update*.asp` - Backend handlers for updates
|
||||
|
||||
### Common Patterns
|
||||
When asked to modify ASP code:
|
||||
1. Check for existing similar code patterns in the file
|
||||
2. Follow the existing error handling style
|
||||
3. Use the same SQL helper functions (ExecuteQuery, etc.)
|
||||
4. Maintain consistent indentation (tabs or spaces matching file)
|
||||
|
||||
### When Debugging
|
||||
- Check for Null handling issues first
|
||||
- Look for missing `& ""` on string fields
|
||||
- Verify column names match current schema
|
||||
- Check if using old `pc` table references (should use `machines`)
|
||||
|
||||
### Response Style
|
||||
- Be concise - this is a legacy codebase, not a greenfield project
|
||||
- Match existing code style when making changes
|
||||
- Don't add unnecessary comments or refactoring
|
||||
- Focus on the specific task requested
|
||||
198
docs/archive/CLAUDE_REFERENCE.md
Normal file
198
docs/archive/CLAUDE_REFERENCE.md
Normal file
@@ -0,0 +1,198 @@
|
||||
# ShopDB Quick Reference for Claude.ai
|
||||
|
||||
## Database Tables
|
||||
|
||||
### machines (unified - all devices)
|
||||
| Column | Type | Notes |
|
||||
|--------|------|-------|
|
||||
| machineid | INT | Primary key |
|
||||
| machinetypeid | INT | FK to machinetypes |
|
||||
| machinenumber | VARCHAR | Equipment number or hostname |
|
||||
| hostname | VARCHAR | PC hostname |
|
||||
| serialnumber | VARCHAR | Serial number |
|
||||
| alias | VARCHAR | Friendly name |
|
||||
| pctypeid | INT | NOT NULL = PC, NULL = equipment |
|
||||
| osid | INT | FK to operatingsystems (PCs) |
|
||||
| modelnumberid | INT | FK to models |
|
||||
| businessunitid | INT | FK to businessunits |
|
||||
| machinestatusid | INT | FK to machinestatus |
|
||||
| isactive | TINYINT | 1=active, 0=inactive |
|
||||
| lastupdated | DATETIME | Auto-updated |
|
||||
|
||||
### communications (network interfaces)
|
||||
| Column | Type | Notes |
|
||||
|--------|------|-------|
|
||||
| communicationid | INT | Primary key |
|
||||
| machineid | INT | FK to machines |
|
||||
| comstypeid | INT | FK to comstypes (1=IP, 2=Serial) |
|
||||
| address | VARCHAR | IP address or COM port |
|
||||
| macaddress | VARCHAR | MAC address |
|
||||
| port | INT | Port number |
|
||||
| isprimary | TINYINT | Primary interface flag |
|
||||
|
||||
### machinerelationships
|
||||
| Column | Type | Notes |
|
||||
|--------|------|-------|
|
||||
| relationshipid | INT | Primary key |
|
||||
| machineid | INT | Source machine (e.g., PC) |
|
||||
| related_machineid | INT | Target machine (e.g., Equipment) |
|
||||
| relationshiptypeid | INT | FK to relationshiptypes |
|
||||
|
||||
### printers (separate table)
|
||||
| Column | Type | Notes |
|
||||
|--------|------|-------|
|
||||
| printerid | INT | Primary key |
|
||||
| name | VARCHAR | Printer name |
|
||||
| address | VARCHAR | IP or hostname |
|
||||
| modelid | INT | FK to models |
|
||||
| isactive | TINYINT | Active flag |
|
||||
|
||||
## Machine Type IDs
|
||||
|
||||
### Equipment (1-15)
|
||||
- 1: LocationOnly
|
||||
- 2-14: Various equipment (Lathe, Mill, CMM, etc.)
|
||||
- 15: Printer (legacy)
|
||||
|
||||
### Network Devices (16-20)
|
||||
- 16: Access Point
|
||||
- 17: IDF
|
||||
- 18: Camera
|
||||
- 19: Switch
|
||||
- 20: Server
|
||||
|
||||
### PCs (33-35)
|
||||
- 33: Standard PC
|
||||
- 34: Engineering PC
|
||||
- 35: Shopfloor PC
|
||||
|
||||
## Common Queries
|
||||
|
||||
```sql
|
||||
-- All active PCs with details
|
||||
SELECT m.machineid, m.hostname, m.serialnumber,
|
||||
pt.pctype, mo.modelnumber, os.osname
|
||||
FROM machines m
|
||||
LEFT JOIN pctype pt ON m.pctypeid = pt.pctypeid
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN operatingsystems os ON m.osid = os.osid
|
||||
WHERE m.pctypeid IS NOT NULL AND m.isactive = 1;
|
||||
|
||||
-- PC's network interfaces
|
||||
SELECT m.hostname, c.address, c.macaddress
|
||||
FROM machines m
|
||||
JOIN communications c ON m.machineid = c.machineid
|
||||
WHERE m.pctypeid IS NOT NULL;
|
||||
|
||||
-- PC controlling equipment
|
||||
SELECT
|
||||
pc.hostname AS pc_name,
|
||||
eq.machinenumber AS equipment
|
||||
FROM machinerelationships mr
|
||||
JOIN machines pc ON mr.machineid = pc.machineid
|
||||
JOIN machines eq ON mr.related_machineid = eq.machineid
|
||||
JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
WHERE rt.relationshiptype = 'Controls';
|
||||
|
||||
-- Network devices
|
||||
SELECT m.machineid, m.machinenumber, mt.machinetype, c.address
|
||||
FROM machines m
|
||||
JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
LEFT JOIN communications c ON m.machineid = c.machineid AND c.isprimary = 1
|
||||
WHERE m.machinetypeid IN (16,17,18,19,20);
|
||||
```
|
||||
|
||||
## ASP Code Patterns
|
||||
|
||||
### Safe Database Query
|
||||
```vbscript
|
||||
Dim cmd, rs
|
||||
Set cmd = Server.CreateObject("ADODB.Command")
|
||||
cmd.ActiveConnection = objConn
|
||||
cmd.CommandText = "SELECT hostname, serialnumber FROM machines WHERE machineid = ?"
|
||||
cmd.Parameters.Append cmd.CreateParameter("@id", 3, 1, , Request("id"))
|
||||
Set rs = cmd.Execute()
|
||||
|
||||
If NOT rs.EOF Then
|
||||
Dim hostname, serial
|
||||
hostname = rs("hostname") & "" ' Convert to string
|
||||
serial = rs("serialnumber") & ""
|
||||
Response.Write("<p>" & Server.HTMLEncode(hostname) & "</p>")
|
||||
End If
|
||||
|
||||
rs.Close
|
||||
Set rs = Nothing
|
||||
Set cmd = Nothing
|
||||
```
|
||||
|
||||
### Form Handling
|
||||
```vbscript
|
||||
' Get and sanitize input
|
||||
Dim machineId, hostname
|
||||
machineId = Request.Form("machineid")
|
||||
hostname = Trim(Request.Form("hostname"))
|
||||
|
||||
' Validate
|
||||
If machineId = "" Or Not IsNumeric(machineId) Then
|
||||
Response.Write("Invalid machine ID")
|
||||
Response.End
|
||||
End If
|
||||
|
||||
' Update with parameterized query
|
||||
Dim cmdUpdate
|
||||
Set cmdUpdate = Server.CreateObject("ADODB.Command")
|
||||
cmdUpdate.ActiveConnection = objConn
|
||||
cmdUpdate.CommandText = "UPDATE machines SET hostname = ? WHERE machineid = ?"
|
||||
cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@host", 200, 1, 100, hostname)
|
||||
cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@id", 3, 1, , CLng(machineId))
|
||||
cmdUpdate.Execute
|
||||
```
|
||||
|
||||
### Error Handling
|
||||
```vbscript
|
||||
On Error Resume Next
|
||||
' risky operation
|
||||
If Err.Number <> 0 Then
|
||||
Response.Write("Error: " & Server.HTMLEncode(Err.Description))
|
||||
Err.Clear
|
||||
End If
|
||||
On Error GoTo 0
|
||||
```
|
||||
|
||||
## File Reference
|
||||
|
||||
### Main Pages
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| displaymachines.asp | List all machines |
|
||||
| displaymachine.asp | Single machine details |
|
||||
| displaypcs.asp | List all PCs |
|
||||
| displaypc.asp | Single PC details |
|
||||
| displayprinters.asp | List printers |
|
||||
| network_map.asp | Visual network map |
|
||||
| network_devices.asp | Network device list |
|
||||
| api.asp | REST API endpoint |
|
||||
|
||||
### Form Pages
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| addmachine.asp | Add new machine form |
|
||||
| editmachine.asp | Edit machine form |
|
||||
| savemachine.asp | Save machine handler |
|
||||
| addprinter.asp | Add printer form |
|
||||
| editprinter.asp | Edit printer form |
|
||||
|
||||
### Includes
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| includes/header.asp | Page header, nav |
|
||||
| includes/footer.asp | Page footer |
|
||||
| includes/sql.asp | Database connection |
|
||||
| includes/functions.asp | Helper functions |
|
||||
|
||||
## Environment
|
||||
|
||||
- **Dev Server:** 192.168.122.151:8080
|
||||
- **Database:** MySQL in Docker (dev-mysql container)
|
||||
- **Git:** Gitea at localhost:3000
|
||||
- **Project Path:** /home/camp/projects/windows/shopdb/
|
||||
357
docs/archive/COMPLETE_REFACTORING_SUMMARY.md
Normal file
357
docs/archive/COMPLETE_REFACTORING_SUMMARY.md
Normal file
@@ -0,0 +1,357 @@
|
||||
# Complete Database Refactoring - Executive Summary
|
||||
|
||||
**Date**: 2025-11-06
|
||||
**Status**: DESIGN PHASE - Ready for Review
|
||||
**Scope**: MASSIVE - Complete database restructuring
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides a high-level overview of the complete database refactoring project. This is a comprehensive modernization effort that will:
|
||||
|
||||
1. **Consolidate PCs into Machines** - Eliminate duplicate entity tracking
|
||||
2. **Create Generic Communications Infrastructure** - Flexible, extensible communication tracking
|
||||
3. **Implement Warranty Management System** - Professional warranty tracking for all assets
|
||||
|
||||
---
|
||||
|
||||
## Three Major Components
|
||||
|
||||
### Component 1: PC-to-Machines Consolidation
|
||||
**Document**: `PC_MACHINES_CONSOLIDATION_PLAN.md`
|
||||
|
||||
**What**: Merge the `pc` table (277 records) into `machines` table (266 records)
|
||||
|
||||
**Why**:
|
||||
- Eliminate duplicate entity tracking
|
||||
- Simplify data model
|
||||
- Unified asset management
|
||||
|
||||
**Impact**:
|
||||
- 543 total machines after consolidation
|
||||
- 10 ASP files need updates (direct queries)
|
||||
- 30 ASP files affected (use pc fields/views)
|
||||
- 19 database views need updates
|
||||
- 6 related tables need updates
|
||||
|
||||
### Component 2: Communications Infrastructure
|
||||
**Document**: `PC_MACHINES_CONSOLIDATION_PLAN.md` (Part 2)
|
||||
|
||||
**What**: Create generic communications system supporting multiple types
|
||||
|
||||
**New Tables**:
|
||||
- `comstypes` - Communication types (IP, Serial, Network, USB, etc.)
|
||||
- `communications` - Universal communication tracking
|
||||
|
||||
**Features**:
|
||||
- Supports IP addresses, serial ports, network interfaces
|
||||
- Extensible for future communication types
|
||||
- Links to machines via machineid
|
||||
- Replaces pc_comm_config and pc_network_interfaces
|
||||
|
||||
### Component 3: Warranty Management System
|
||||
**Document**: `WARRANTY_MANAGEMENT_DESIGN.md`
|
||||
|
||||
**What**: Professional warranty tracking system for all machines
|
||||
|
||||
**New Tables**:
|
||||
- `warrantytypes` - Types of coverage
|
||||
- `warranties` - Individual warranty records (links to existing vendors table)
|
||||
- `warrantyhistory` - Audit trail for changes
|
||||
|
||||
**Features**:
|
||||
- Multiple warranties per machine
|
||||
- Warranty renewal tracking
|
||||
- Automated expiration notifications
|
||||
- Cost tracking
|
||||
- Historical audit trail
|
||||
|
||||
---
|
||||
|
||||
## Database Changes Summary
|
||||
|
||||
### New Tables (5 total)
|
||||
|
||||
| Table | Records | Purpose |
|
||||
|-------|---------|---------|
|
||||
| comstypes | ~7 | Communication type definitions |
|
||||
| communications | ~500+ | Machine communication records |
|
||||
| warrantytypes | ~8 | Warranty coverage types |
|
||||
| warranties | ~277+ | Individual warranty records (uses existing vendors table) |
|
||||
| warrantyhistory | ~0 | Warranty change audit trail |
|
||||
|
||||
### Modified Tables (1)
|
||||
|
||||
| Table | Changes | New Columns |
|
||||
|-------|---------|-------------|
|
||||
| machines | Extended for PC data | +9 columns (hostname, serialnumber, osid, pctypeid, etc.) |
|
||||
|
||||
### Deprecated Tables (To be removed after migration)
|
||||
|
||||
| Table | Replacement | When to Remove |
|
||||
|-------|-------------|----------------|
|
||||
| pc | machines | After 30-day testing period |
|
||||
| pc_comm_config | communications | After data migration verified |
|
||||
| pc_network_interfaces | communications | After data migration verified |
|
||||
|
||||
### Views to Update (19)
|
||||
|
||||
All views currently using the `pc` table will be updated to use `machines` with compatibility maintained.
|
||||
|
||||
---
|
||||
|
||||
## Migration Execution Order
|
||||
|
||||
### Phase 1: Infrastructure Setup (Scripts 01-04)
|
||||
**Reversible**: Yes
|
||||
|
||||
1. Script 01: Create communications infrastructure
|
||||
2. Script 02: Extend machines table
|
||||
3. Script 03: Create PC machine types
|
||||
4. Script 04: Create warranty infrastructure
|
||||
|
||||
**Production Deployment**: Run during maintenance window
|
||||
**Estimated Time**: 15 minutes
|
||||
**Rollback**: Rollback scripts 01-04 available
|
||||
|
||||
### Phase 2: Data Migration (Scripts 05-08)
|
||||
**Reversible**: Yes (with backups)
|
||||
|
||||
5. Script 05: Migrate PC data to machines
|
||||
6. Script 06: Migrate communication data
|
||||
7. Script 07: Migrate warranty data
|
||||
8. Script 08: Update relationship tables
|
||||
|
||||
**Production Deployment**: Run during maintenance window
|
||||
**Estimated Time**: 30-45 minutes
|
||||
**Rollback**: Restore from backup
|
||||
|
||||
### Phase 3: Application Updates (Manual)
|
||||
**Reversible**: Yes (via version control)
|
||||
|
||||
9. Update 19 database views
|
||||
10. Create compatibility views
|
||||
11. Update 10 ASP files (direct queries)
|
||||
12. Update 30 ASP files (pc fields/views)
|
||||
13. Test all functionality
|
||||
|
||||
**Production Deployment**: Deploy with application
|
||||
**Estimated Time**: 2-3 weeks development + testing
|
||||
**Rollback**: Revert code deployment
|
||||
|
||||
### Phase 4: Cleanup (After 30 days)
|
||||
**Reversible**: No - PERMANENT
|
||||
|
||||
14. Drop pc table
|
||||
15. Drop pc_comm_config table
|
||||
16. Drop pc_network_interfaces table
|
||||
17. Drop compatibility views
|
||||
18. Remove deprecated columns
|
||||
|
||||
**Production Deployment**: Final cleanup
|
||||
**Estimated Time**: 15 minutes
|
||||
**Rollback**: None (irreversible)
|
||||
|
||||
---
|
||||
|
||||
## Complete SQL Script List
|
||||
|
||||
### Creation Scripts
|
||||
1. `sql/01_create_communications_infrastructure.sql`
|
||||
2. `sql/02_extend_machines_table.sql`
|
||||
3. `sql/03_create_pc_machine_types.sql`
|
||||
4. `sql/04_create_warranty_infrastructure.sql`
|
||||
|
||||
### Migration Scripts (TBD)
|
||||
5. `sql/05_migrate_pc_to_machines.sql`
|
||||
6. `sql/06_migrate_communications.sql`
|
||||
7. `sql/07_migrate_warranties.sql`
|
||||
8. `sql/08_update_relationships.sql`
|
||||
|
||||
### View Scripts (TBD)
|
||||
9. `sql/09_update_views.sql`
|
||||
10. `sql/10_create_compatibility_views.sql`
|
||||
|
||||
### Rollback Scripts
|
||||
- `sql/ROLLBACK_01_communications_infrastructure.sql`
|
||||
- `sql/ROLLBACK_02_machines_table_extensions.sql`
|
||||
- `sql/ROLLBACK_03_pc_machine_types.sql` (delete from machinetypes)
|
||||
- `sql/ROLLBACK_04_warranty_infrastructure.sql`
|
||||
|
||||
---
|
||||
|
||||
## Benefits of This Refactoring
|
||||
|
||||
### Before Refactoring
|
||||
|
||||
**Data Model**:
|
||||
- Machines and PCs tracked separately
|
||||
- Warranty data scattered across PC records
|
||||
- Communication data in PC-specific tables
|
||||
- Multiple machines types systems (machines.machinetypeid, pc.pctypeid)
|
||||
- Rigid communication tracking
|
||||
- No warranty history
|
||||
- Limited to one warranty per PC
|
||||
|
||||
**Code**:
|
||||
- Duplicate logic for machines vs PCs
|
||||
- Complex joins across pc/machines
|
||||
- PC-specific ASP files
|
||||
- Warranty tracking only for PCs
|
||||
|
||||
### After Refactoring
|
||||
|
||||
**Data Model**:
|
||||
- Unified machine tracking (all assets)
|
||||
- Professional warranty management
|
||||
- Generic communication infrastructure
|
||||
- Single machine type system
|
||||
- Extensible for new communication types
|
||||
- Complete warranty audit trail
|
||||
- Multiple warranties per machine
|
||||
|
||||
**Code**:
|
||||
- Single codebase for all machines
|
||||
- Simpler queries
|
||||
- Unified ASP files
|
||||
- Warranty tracking for ALL machines
|
||||
- Better reporting capabilities
|
||||
|
||||
---
|
||||
|
||||
## Risk Assessment
|
||||
|
||||
| Risk | Severity | Likelihood | Mitigation |
|
||||
|------|----------|------------|------------|
|
||||
| Data loss during migration | CRITICAL | Low | Full backups, dev testing, rollback scripts |
|
||||
| Extended downtime | HIGH | Medium | Parallel testing, staged deployment |
|
||||
| View compatibility issues | HIGH | Medium | Compatibility views, thorough testing |
|
||||
| Performance degradation | MEDIUM | Low | Indexes optimized, query testing |
|
||||
| Application bugs | MEDIUM | Medium | Comprehensive testing, UAT |
|
||||
| User confusion | LOW | Medium | Documentation, training |
|
||||
|
||||
---
|
||||
|
||||
## Timeline & Effort Estimate
|
||||
|
||||
| Phase | Duration | Resources |
|
||||
|-------|----------|-----------|
|
||||
| Design & Review | 1-2 days | COMPLETE |
|
||||
| SQL Script Development | 3-5 days | In Progress |
|
||||
| Dev Environment Testing | 3-5 days | Pending |
|
||||
| ASP File Updates | 5-7 days | Pending |
|
||||
| Integration Testing | 3-5 days | Pending |
|
||||
| User Acceptance Testing | 2-3 days | Pending |
|
||||
| Production Deployment | 1 day | Pending |
|
||||
| Monitoring Period | 30 days | Pending |
|
||||
| Final Cleanup | 1 day | Pending |
|
||||
| **TOTAL** | **20-35 days** | |
|
||||
|
||||
---
|
||||
|
||||
## Key Success Metrics
|
||||
|
||||
### Data Integrity
|
||||
- [ ] All 277 PCs migrated to machines
|
||||
- [ ] All communication records migrated
|
||||
- [ ] All warranty records migrated
|
||||
- [ ] All FK relationships intact
|
||||
- [ ] Zero data loss
|
||||
|
||||
### Functionality
|
||||
- [ ] All 19 views return correct data
|
||||
- [ ] All ASP files working correctly
|
||||
- [ ] Warranty tracking functional
|
||||
- [ ] Communication tracking functional
|
||||
- [ ] Reports generating correctly
|
||||
|
||||
### Performance
|
||||
- [ ] Query performance same or better
|
||||
- [ ] Page load times acceptable
|
||||
- [ ] Database size reduced (from consolidation)
|
||||
|
||||
---
|
||||
|
||||
## Production Deployment Checklist
|
||||
|
||||
### Pre-Deployment
|
||||
- [ ] All SQL scripts tested on dev
|
||||
- [ ] All ASP files tested
|
||||
- [ ] All views validated
|
||||
- [ ] Performance testing complete
|
||||
- [ ] UAT sign-off received
|
||||
- [ ] Rollback plan documented
|
||||
- [ ] Full database backup created
|
||||
- [ ] Maintenance window scheduled
|
||||
- [ ] Users notified
|
||||
|
||||
### Deployment Day
|
||||
- [ ] Verify backup completed
|
||||
- [ ] Run scripts 01-04 (infrastructure)
|
||||
- [ ] Verify tables created
|
||||
- [ ] Run scripts 05-08 (data migration)
|
||||
- [ ] Verify data migrated
|
||||
- [ ] Update views
|
||||
- [ ] Deploy ASP files
|
||||
- [ ] Smoke test functionality
|
||||
- [ ] Monitor for errors
|
||||
|
||||
### Post-Deployment
|
||||
- [ ] Verify all functionality
|
||||
- [ ] Monitor performance
|
||||
- [ ] Check error logs
|
||||
- [ ] User feedback collection
|
||||
- [ ] Document issues
|
||||
- [ ] Plan fixes if needed
|
||||
|
||||
### 30-Day Cleanup
|
||||
- [ ] Verify stability
|
||||
- [ ] Run cleanup scripts
|
||||
- [ ] Remove old tables
|
||||
- [ ] Update documentation
|
||||
- [ ] Close project
|
||||
|
||||
---
|
||||
|
||||
## Documentation Index
|
||||
|
||||
1. **PC_MACHINES_CONSOLIDATION_PLAN.md** - Complete PC consolidation design
|
||||
2. **WARRANTY_MANAGEMENT_DESIGN.md** - Warranty system design
|
||||
3. **COMPLETE_REFACTORING_SUMMARY.md** - This document (overview)
|
||||
|
||||
---
|
||||
|
||||
## Questions & Approvals
|
||||
|
||||
### Design Decisions Needed
|
||||
- [ ] Approve warranty system design
|
||||
- [ ] Approve communications infrastructure
|
||||
- [ ] Approve PC machine type mapping
|
||||
- [ ] Set maintenance window date
|
||||
|
||||
### Approvals Required
|
||||
- [ ] Database Administrator
|
||||
- [ ] Lead Developer
|
||||
- [ ] System Owner
|
||||
- [ ] Business Stakeholder
|
||||
|
||||
---
|
||||
|
||||
## Support & Contact
|
||||
|
||||
**For questions about this refactoring:**
|
||||
- Review design documents first
|
||||
- Check rollback procedures
|
||||
- Test on dev environment
|
||||
- Contact system administrator
|
||||
|
||||
---
|
||||
|
||||
**Status**: DESIGN PHASE COMPLETE
|
||||
**Next Step**: Create migration scripts (scripts 05-08)
|
||||
**Target Deployment**: TBD
|
||||
|
||||
---
|
||||
|
||||
*This is a living document and will be updated as the project progresses.*
|
||||
696
docs/archive/DATABASE_MIGRATION_FINAL_DESIGN.md
Normal file
696
docs/archive/DATABASE_MIGRATION_FINAL_DESIGN.md
Normal file
@@ -0,0 +1,696 @@
|
||||
# Database Migration - Final Design Specification
|
||||
|
||||
**Date Created**: 2025-11-06
|
||||
**Status**: DESIGN FINALIZED - Ready for SQL Script Creation
|
||||
**Version**: 2.0 - Simplified Design
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
This document outlines the finalized database migration plan that:
|
||||
1. Consolidates PCs into machines table (543 total machines)
|
||||
2. Creates generic communications infrastructure
|
||||
3. Adds compliance tracking from inventory.xlsx
|
||||
4. Implements simplified warranty management
|
||||
5. Adds liaison tracking in businessunits
|
||||
6. Implements machine relationships tracking (dualpath, controller associations)
|
||||
|
||||
**Key Design Principles:**
|
||||
- Simplicity over complexity
|
||||
- Generic/flexible structures (address field in communications)
|
||||
- Leverage existing tables (vendors for third-party management)
|
||||
- Minimal columns (remove unnecessary audit fields)
|
||||
|
||||
---
|
||||
|
||||
## NEW TABLES (7 Tables)
|
||||
|
||||
### 1. `comstypes` - Communication Types Lookup
|
||||
|
||||
Defines types of communication methods available.
|
||||
|
||||
```sql
|
||||
CREATE TABLE comstypes (
|
||||
comstypeid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
typename VARCHAR(50) NOT NULL UNIQUE,
|
||||
description VARCHAR(255),
|
||||
addresslabel VARCHAR(50), -- 'IP Address', 'COM Port', 'Interface Name'
|
||||
requiresport TINYINT(1) DEFAULT 0, -- Does this type use port field?
|
||||
settingsschema TEXT, -- JSON schema for validation (optional)
|
||||
displayorder INT(11) DEFAULT 0,
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
|
||||
KEY idx_isactive (isactive),
|
||||
KEY idx_displayorder (displayorder)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
```
|
||||
|
||||
**Initial Data:**
|
||||
```sql
|
||||
INSERT INTO comstypes (typename, description, addresslabel, requiresport, displayorder) VALUES
|
||||
('IP', 'IP-based communication', 'IP Address', 1, 1),
|
||||
('Serial', 'Serial port communication', 'COM Port', 0, 2),
|
||||
('Network Interface', 'Network adapter/interface', 'Interface Name', 0, 3),
|
||||
('USB', 'USB connection', 'USB Device ID', 0, 4),
|
||||
('Parallel', 'Parallel port', 'LPT Port', 0, 5),
|
||||
('VNC', 'VNC remote access', 'IP Address', 1, 6),
|
||||
('FTP', 'FTP connection', 'IP Address', 1, 7);
|
||||
```
|
||||
|
||||
**Columns: 8**
|
||||
|
||||
---
|
||||
|
||||
### 2. `communications` - Universal Communication Tracking
|
||||
|
||||
**KEY INNOVATION**: Generic `address` field replaces specific fields (ipaddress, portname, etc.)
|
||||
|
||||
```sql
|
||||
CREATE TABLE communications (
|
||||
comid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
machineid INT(11) NOT NULL,
|
||||
comstypeid INT(11) NOT NULL,
|
||||
|
||||
-- GENERIC FIELDS
|
||||
address VARCHAR(255), -- Universal: '192.168.1.1', 'COM1', 'eth0', 'USB-001'
|
||||
port INT(11), -- Port/socket number (for IP types)
|
||||
macaddress VARCHAR(17), -- MAC address (network types)
|
||||
description VARCHAR(255), -- Human-readable description
|
||||
|
||||
-- TYPE-SPECIFIC SETTINGS
|
||||
settings JSON, -- Flexible config (baud rate, subnet, dhcp, etc.)
|
||||
|
||||
-- STATUS
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
|
||||
KEY idx_machineid (machineid),
|
||||
KEY idx_comstypeid (comstypeid),
|
||||
KEY idx_address (address),
|
||||
KEY idx_isactive (isactive),
|
||||
|
||||
CONSTRAINT fk_communications_machineid FOREIGN KEY (machineid) REFERENCES machines(machineid),
|
||||
CONSTRAINT fk_communications_comstypeid FOREIGN KEY (comstypeid) REFERENCES comstypes(comstypeid)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
|
||||
| comstypeid | Type | address | port | settings |
|
||||
|------------|------|---------|------|----------|
|
||||
| 1 | IP | `192.168.1.100` | `8080` | `{"protocol":"tcp"}` |
|
||||
| 2 | Serial | `COM1` | NULL | `{"baud":9600,"databits":8,"parity":"None"}` |
|
||||
| 3 | Network Interface | `eth0` | NULL | `{"subnet":"255.255.255.0","gateway":"192.168.1.1","dhcp":true}` |
|
||||
|
||||
**Columns: 9**
|
||||
|
||||
**Replaces:**
|
||||
- `pc_comm_config`
|
||||
- `pc_network_interfaces`
|
||||
- `machines.ipaddress1`
|
||||
- `machines.ipaddress2`
|
||||
|
||||
---
|
||||
|
||||
### 3. `compliance` - Compliance & Security Tracking
|
||||
|
||||
Data sourced from inventory.xlsx spreadsheet.
|
||||
|
||||
```sql
|
||||
CREATE TABLE compliance (
|
||||
complianceid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
machineid INT(11) NOT NULL,
|
||||
|
||||
-- Network & Software
|
||||
ongenetwork TINYINT(1), -- On GE Network?
|
||||
gecoreload TINYINT(1), -- Has GE Coreload software?
|
||||
|
||||
-- Security Classification
|
||||
assetcriticality VARCHAR(10), -- 'Low', 'Medium', 'High'
|
||||
cuidataclassification VARCHAR(20), -- 'CUI', 'NON-CUI'
|
||||
dodassettype VARCHAR(100), -- 'Specialized Asset', etc.
|
||||
dodassetsubtype VARCHAR(50), -- 'IT', 'OT'
|
||||
otenvironment VARCHAR(100), -- 'Manufacturing/Production', 'Shipping/Receiving'
|
||||
|
||||
-- Management & Access
|
||||
managedbyvendorid INT(11), -- FK to vendors (third-party management)
|
||||
changerestricted TINYINT(1), -- Change restricted?
|
||||
jumpbox TINYINT(1), -- Is a jump box?
|
||||
mft VARCHAR(100), -- Managed File Transfer designation
|
||||
|
||||
-- Notes
|
||||
notes TEXT,
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
|
||||
KEY idx_machineid (machineid),
|
||||
KEY idx_managedbyvendorid (managedbyvendorid),
|
||||
KEY idx_assetcriticality (assetcriticality),
|
||||
KEY idx_cuidataclassification (cuidataclassification),
|
||||
|
||||
CONSTRAINT fk_compliance_machineid FOREIGN KEY (machineid) REFERENCES machines(machineid),
|
||||
CONSTRAINT fk_compliance_managedbyvendorid FOREIGN KEY (managedbyvendorid) REFERENCES vendors(vendorid)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
```
|
||||
|
||||
**Design Decision:** Use existing `vendors` table for third-party management instead of storing vendor names as strings.
|
||||
|
||||
**Columns: 15**
|
||||
|
||||
---
|
||||
|
||||
### 4. `compliancescans` - Scan History Log
|
||||
|
||||
Tracks antivirus/malware scan results over time.
|
||||
|
||||
```sql
|
||||
CREATE TABLE compliancescans (
|
||||
scanid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
machineid INT(11) NOT NULL,
|
||||
|
||||
scandate DATETIME,
|
||||
scanstatus VARCHAR(100), -- 'No Threats Found', 'Threats Found', 'CORELOADED'
|
||||
scandetails TEXT, -- Full scan results
|
||||
|
||||
KEY idx_machineid (machineid),
|
||||
KEY idx_scandate (scandate),
|
||||
|
||||
CONSTRAINT fk_compliancescans_machineid FOREIGN KEY (machineid) REFERENCES machines(machineid)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
```
|
||||
|
||||
**Columns: 5**
|
||||
|
||||
---
|
||||
|
||||
### 5. `warranties` - Warranty Management
|
||||
|
||||
**SIMPLIFIED DESIGN**: Just name and expiration date. No complex vendor/type tables.
|
||||
|
||||
```sql
|
||||
CREATE TABLE warranties (
|
||||
warrantyid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
machineid INT(11) NOT NULL,
|
||||
|
||||
warrantyname VARCHAR(100) NOT NULL, -- 'Dell ProSupport Plus', 'Standard 3-Year'
|
||||
enddate DATE NOT NULL, -- When warranty expires
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
|
||||
KEY idx_machineid (machineid),
|
||||
KEY idx_enddate (enddate),
|
||||
KEY idx_isactive (isactive),
|
||||
|
||||
CONSTRAINT fk_warranties_machineid FOREIGN KEY (machineid) REFERENCES machines(machineid)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
```
|
||||
|
||||
**Design Decision:** Keep it minimal. Multiple warranties per machine supported.
|
||||
|
||||
**Columns: 5**
|
||||
|
||||
---
|
||||
|
||||
### 6. `relationshiptypes` - Machine Relationship Types Lookup
|
||||
|
||||
Defines types of relationships between machines.
|
||||
|
||||
```sql
|
||||
CREATE TABLE relationshiptypes (
|
||||
relationshiptypeid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
relationshiptype VARCHAR(50) NOT NULL UNIQUE,
|
||||
description VARCHAR(255),
|
||||
isbidirectional TINYINT(1) DEFAULT 0, -- Is relationship symmetric?
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
|
||||
KEY idx_isactive (isactive)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
```
|
||||
|
||||
**Initial Data:**
|
||||
```sql
|
||||
INSERT INTO relationshiptypes (relationshiptype, description, isbidirectional) VALUES
|
||||
('Dualpath', 'Machines share same controller (bidirectional)', 1),
|
||||
('Controlled By', 'Machine is controlled by PC/controller (directional)', 0),
|
||||
('Controls', 'PC/controller controls machine (directional)', 0),
|
||||
('Master/Slave', 'Master-slave relationship', 0),
|
||||
('Linked', 'Generic link between machines', 1);
|
||||
```
|
||||
|
||||
**Columns: 5**
|
||||
|
||||
**Use Cases:**
|
||||
- Dualpath lathes (2001 & 2002 share same controller)
|
||||
- PC controlling multiple CNC machines
|
||||
- Future: Machine clusters, backup systems, etc.
|
||||
|
||||
---
|
||||
|
||||
### 7. `machinerelationships` - Machine-to-Machine Relationships
|
||||
|
||||
Tracks relationships between machines (PC-to-CNC, dualpath, etc.)
|
||||
|
||||
```sql
|
||||
CREATE TABLE machinerelationships (
|
||||
relationshipid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
relationshiptypeid INT(11) NOT NULL, -- FK to relationshiptypes
|
||||
machineid1 INT(11) NOT NULL, -- FK to machines (primary machine)
|
||||
machineid2 INT(11) NOT NULL, -- FK to machines (related machine)
|
||||
|
||||
notes TEXT,
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
|
||||
KEY idx_relationshiptypeid (relationshiptypeid),
|
||||
KEY idx_machineid1 (machineid1),
|
||||
KEY idx_machineid2 (machineid2),
|
||||
|
||||
CONSTRAINT fk_machinerel_machineid1 FOREIGN KEY (machineid1) REFERENCES machines(machineid),
|
||||
CONSTRAINT fk_machinerel_machineid2 FOREIGN KEY (machineid2) REFERENCES machines(machineid),
|
||||
CONSTRAINT fk_machinerel_typeid FOREIGN KEY (relationshiptypeid) REFERENCES relationshiptypes(relationshiptypeid)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
```
|
||||
|
||||
**Columns: 6**
|
||||
|
||||
**Example Data:**
|
||||
```sql
|
||||
-- Machines 2001 and 2002 are dualpath (linked together)
|
||||
INSERT INTO machinerelationships (relationshiptypeid, machineid1, machineid2) VALUES
|
||||
(1, 2001, 2002); -- Dualpath relationship
|
||||
|
||||
-- PC (machineid 500) controls machine 2001
|
||||
INSERT INTO machinerelationships (relationshiptypeid, machineid1, machineid2) VALUES
|
||||
(2, 2001, 500); -- 2001 controlled by PC 500
|
||||
|
||||
-- PC (machineid 500) controls machine 2002
|
||||
INSERT INTO machinerelationships (relationshiptypeid, machineid1, machineid2) VALUES
|
||||
(2, 2002, 500); -- 2002 controlled by PC 500
|
||||
```
|
||||
|
||||
**Key Feature:** Both machines and PCs are in the machines table, so relationships can link any machine to any other machine.
|
||||
|
||||
**Query Examples:**
|
||||
```sql
|
||||
-- Find dualpath partner of machine 2001
|
||||
SELECT m2.machinenumber
|
||||
FROM machinerelationships mr
|
||||
JOIN machines m2 ON (
|
||||
CASE WHEN mr.machineid1 = 2001 THEN mr.machineid2 ELSE mr.machineid1 END = m2.machineid
|
||||
)
|
||||
WHERE (mr.machineid1 = 2001 OR mr.machineid2 = 2001)
|
||||
AND mr.relationshiptypeid = 1; -- Dualpath
|
||||
|
||||
-- Find which PC controls machine 2001
|
||||
SELECT pc.hostname, pc.machinenumber
|
||||
FROM machinerelationships mr
|
||||
JOIN machines pc ON mr.machineid2 = pc.machineid
|
||||
WHERE mr.machineid1 = 2001
|
||||
AND mr.relationshiptypeid = 2; -- Controlled By
|
||||
|
||||
-- Find all machines controlled by PC 500
|
||||
SELECT m.machinenumber
|
||||
FROM machinerelationships mr
|
||||
JOIN machines m ON mr.machineid1 = m.machineid
|
||||
WHERE mr.machineid2 = 500
|
||||
AND mr.relationshiptypeid = 2; -- Controlled By
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## MODIFIED TABLES (2 Tables)
|
||||
|
||||
### 8. `machines` - Extended for PC Data
|
||||
|
||||
**NEW COLUMNS ADDED (11):**
|
||||
|
||||
```sql
|
||||
ALTER TABLE machines
|
||||
ADD COLUMN hostname VARCHAR(100) AFTER machinenumber,
|
||||
ADD COLUMN serialnumber VARCHAR(100) AFTER modelnumberid,
|
||||
ADD COLUMN loggedinuser VARCHAR(100) AFTER hostname,
|
||||
ADD COLUMN controllertypeid INT(11) AFTER modelnumberid,
|
||||
ADD COLUMN controllerosid INT(11) AFTER controllertypeid,
|
||||
ADD COLUMN osid INT(11) AFTER controllerosid,
|
||||
ADD COLUMN machinestatusid INT(11) AFTER osid,
|
||||
ADD COLUMN lastupdated DATETIME,
|
||||
ADD COLUMN dateadded DATETIME,
|
||||
|
||||
ADD KEY idx_hostname (hostname),
|
||||
ADD KEY idx_serialnumber (serialnumber),
|
||||
ADD KEY idx_controllertypeid (controllertypeid),
|
||||
ADD KEY idx_controllerosid (controllerosid),
|
||||
ADD KEY idx_osid (osid),
|
||||
ADD KEY idx_machinestatusid (machinestatusid),
|
||||
ADD KEY idx_lastupdated (lastupdated),
|
||||
|
||||
ADD CONSTRAINT fk_machines_controllertypeid FOREIGN KEY (controllertypeid) REFERENCES controllertypes(controllertypeid),
|
||||
ADD CONSTRAINT fk_machines_controllerosid FOREIGN KEY (controllerosid) REFERENCES operatingsystems(osid),
|
||||
ADD CONSTRAINT fk_machines_osid FOREIGN KEY (osid) REFERENCES operatingsystems(osid),
|
||||
ADD CONSTRAINT fk_machines_machinestatusid FOREIGN KEY (machinestatusid) REFERENCES machinestatus(machinestatusid);
|
||||
```
|
||||
|
||||
**FINAL MACHINES TABLE (21 columns):**
|
||||
|
||||
| # | Column | Type | Purpose |
|
||||
|---|--------|------|---------|
|
||||
| 1 | machineid | INT(11) PK | Primary key |
|
||||
| 2 | machinetypeid | INT(11) FK | Machine type (now includes PC types!) |
|
||||
| 3 | machinenumber | VARCHAR(50) | Machine number |
|
||||
| 4 | alias | VARCHAR(255) | Friendly name |
|
||||
| 5 | hostname | VARCHAR(100) | **NEW** - PC hostname |
|
||||
| 6 | serialnumber | VARCHAR(100) | **NEW** - Serial number |
|
||||
| 7 | loggedinuser | VARCHAR(100) | **NEW** - Logged in user |
|
||||
| 8 | modelnumberid | INT(11) FK | Model |
|
||||
| 9 | controllertypeid | INT(11) FK | **NEW** - Controller type (for CNC machines) |
|
||||
| 10 | controllerosid | INT(11) FK | **NEW** - Controller OS version (uses operatingsystems table) |
|
||||
| 11 | osid | INT(11) FK | **NEW** - Operating system (for PCs) |
|
||||
| 12 | machinestatusid | INT(11) FK | **NEW** - Machine status |
|
||||
| 13 | businessunitid | INT(11) FK | Business unit |
|
||||
| 14 | printerid | INT(11) FK | Associated printer |
|
||||
| 15 | mapleft | SMALLINT(6) | Map X position |
|
||||
| 16 | maptop | SMALLINT(6) | Map Y position |
|
||||
| 17 | isactive | INT(11) | Is active? |
|
||||
| 18 | islocationonly | BIT(1) | Location marker only? |
|
||||
| 19 | machinenotes | TEXT | Notes |
|
||||
| 20 | lastupdated | DATETIME | **NEW** - Last updated |
|
||||
| 21 | dateadded | DATETIME | **NEW** - Date added |
|
||||
|
||||
**REMOVED FIELDS (after migration):**
|
||||
- `pctypeid` - No longer needed (use machinetypeid)
|
||||
- `isvnc` - Tracked in communications table
|
||||
- `requires_manual_machine_config` - Not needed
|
||||
- `ipaddress1` - Migrated to communications
|
||||
- `ipaddress2` - Migrated to communications
|
||||
|
||||
---
|
||||
|
||||
### 9. `businessunits` - Add Liaison Fields
|
||||
|
||||
**NEW COLUMNS ADDED (2):**
|
||||
|
||||
```sql
|
||||
ALTER TABLE businessunits
|
||||
ADD COLUMN liaisonname VARCHAR(100) AFTER distributiongroupid,
|
||||
ADD COLUMN liaisonsso VARCHAR(50) AFTER liaisonname,
|
||||
ADD KEY idx_liaisonsso (liaisonsso);
|
||||
```
|
||||
|
||||
**FINAL BUSINESSUNITS TABLE:**
|
||||
|
||||
| # | Column | Purpose |
|
||||
|---|--------|---------|
|
||||
| 1 | businessunitid | Primary key |
|
||||
| 2 | businessunit | Business unit name |
|
||||
| 3 | distributiongroupid | Distribution group |
|
||||
| 4 | liaisonname | **NEW** - Liaison name (e.g., "Patrick Lipinski") |
|
||||
| 5 | liaisonsso | **NEW** - Liaison SSO/Employee ID |
|
||||
| 6 | isactive | Is active? |
|
||||
|
||||
**Design Decision:** Added directly to businessunits instead of creating separate liaisons table.
|
||||
|
||||
---
|
||||
|
||||
## RENAMED TABLES (1 Table)
|
||||
|
||||
### 10. `pcstatus` → `machinestatus`
|
||||
|
||||
Make naming consistent (applies to all machines, not just PCs).
|
||||
|
||||
```sql
|
||||
RENAME TABLE pcstatus TO machinestatus;
|
||||
|
||||
ALTER TABLE machinestatus
|
||||
CHANGE pcstatusid machinestatusid INT(11) AUTO_INCREMENT,
|
||||
CHANGE pcstatus machinestatus CHAR(50);
|
||||
```
|
||||
|
||||
**Final columns:**
|
||||
- machinestatusid (PK) - renamed from pcstatusid
|
||||
- machinestatus - renamed from pcstatus
|
||||
- isactive
|
||||
|
||||
---
|
||||
|
||||
## UPDATED LOOKUP TABLES
|
||||
|
||||
### 11. `machinetypes` - Add PC Types
|
||||
|
||||
Consolidate PC types into machine types (eliminates need for separate pctype system).
|
||||
|
||||
```sql
|
||||
INSERT INTO machinetypes (machinetype, machinedescription, isactive) VALUES
|
||||
('PC - Standard', 'Standard office/engineering workstation', 1),
|
||||
('PC - Shopfloor', 'Shopfloor machine control PC', 1),
|
||||
('PC - Engineer', 'Engineering workstation', 1),
|
||||
('PC - Server', 'Server', 1),
|
||||
('PC - Laptop', 'Laptop computer', 1);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## DEPRECATED TABLES (Drop after 30-day testing)
|
||||
|
||||
These tables will be migrated to new structure, then dropped:
|
||||
|
||||
1. **`pc`** (277 records) → Data migrated to `machines`
|
||||
2. **`pc_comm_config`** → Data migrated to `communications`
|
||||
3. **`pc_network_interfaces`** → Data migrated to `communications`
|
||||
4. **`pctype`** → Data migrated to `machinetypes` as entries
|
||||
|
||||
---
|
||||
|
||||
## MIGRATION DATA FLOW
|
||||
|
||||
### From `pc` table (277 records):
|
||||
|
||||
```
|
||||
pc.hostname → machines.hostname
|
||||
pc.serialnumber → machines.serialnumber
|
||||
pc.loggedinuser → machines.loggedinuser
|
||||
pc.machinenumber → machines.machinenumber
|
||||
pc.osid → machines.osid
|
||||
pc.pcstatusid → machines.machinestatusid
|
||||
pc.pctypeid → machines.machinetypeid (mapped to new PC types)
|
||||
pc.modelnumberid → machines.modelnumberid
|
||||
pc.isactive → machines.isactive
|
||||
pc.lastupdated → machines.lastupdated
|
||||
pc.dateadded → machines.dateadded
|
||||
|
||||
Warranty fields → warranties table:
|
||||
pc.warrantyenddate → warranties.enddate
|
||||
pc.warrantyservicelevel → warranties.warrantyname (or derived)
|
||||
```
|
||||
|
||||
### From `machines.ipaddress1` and `machines.ipaddress2`:
|
||||
|
||||
```sql
|
||||
-- For each machine with ipaddress1
|
||||
INSERT INTO communications (machineid, comstypeid, address, description, isactive)
|
||||
VALUES (machineid, 1, ipaddress1, 'Migrated from machines.ipaddress1', 1);
|
||||
|
||||
-- For each machine with ipaddress2
|
||||
INSERT INTO communications (machineid, comstypeid, address, description, isactive)
|
||||
VALUES (machineid, 1, ipaddress2, 'Migrated from machines.ipaddress2', 1);
|
||||
|
||||
-- Then drop the columns after 30-day verification
|
||||
ALTER TABLE machines DROP COLUMN ipaddress1, DROP COLUMN ipaddress2;
|
||||
```
|
||||
|
||||
### From `pc_network_interfaces`:
|
||||
|
||||
```sql
|
||||
INSERT INTO communications (machineid, comstypeid, address, macaddress, description, settings, isactive)
|
||||
SELECT
|
||||
pcid AS machineid,
|
||||
3 AS comstypeid, -- Network Interface type
|
||||
interfacename AS address,
|
||||
macaddress,
|
||||
'Migrated from pc_network_interfaces' AS description,
|
||||
JSON_OBJECT(
|
||||
'subnet', subnetmask,
|
||||
'gateway', defaultgateway,
|
||||
'dhcp', isdhcp,
|
||||
'machineNetwork', ismachinenetwork
|
||||
) AS settings,
|
||||
isactive
|
||||
FROM pc_network_interfaces;
|
||||
```
|
||||
|
||||
### From `pc_comm_config`:
|
||||
|
||||
```sql
|
||||
-- Serial communications
|
||||
INSERT INTO communications (machineid, comstypeid, address, settings, isactive)
|
||||
SELECT
|
||||
pcid AS machineid,
|
||||
2 AS comstypeid, -- Serial type
|
||||
portid AS address,
|
||||
JSON_OBJECT(
|
||||
'baud', baud,
|
||||
'databits', databits,
|
||||
'stopbits', stopbits,
|
||||
'parity', parity
|
||||
) AS settings,
|
||||
1 AS isactive
|
||||
FROM pc_comm_config
|
||||
WHERE configtype = 'Serial';
|
||||
|
||||
-- IP communications
|
||||
INSERT INTO communications (machineid, comstypeid, address, port, settings, isactive)
|
||||
SELECT
|
||||
pcid AS machineid,
|
||||
1 AS comstypeid, -- IP type
|
||||
ipaddress AS address,
|
||||
socketnumber AS port,
|
||||
additionalsettings AS settings,
|
||||
1 AS isactive
|
||||
FROM pc_comm_config
|
||||
WHERE configtype = 'IP';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## SUMMARY STATISTICS
|
||||
|
||||
**New Tables:** 7
|
||||
- comstypes
|
||||
- communications
|
||||
- compliance
|
||||
- compliancescans
|
||||
- warranties
|
||||
- relationshiptypes
|
||||
- machinerelationships
|
||||
|
||||
**Modified Tables:** 2
|
||||
- machines (+11 columns)
|
||||
- businessunits (+2 columns)
|
||||
|
||||
**Renamed Tables:** 1
|
||||
- pcstatus → machinestatus
|
||||
|
||||
**Deprecated Tables:** 4
|
||||
- pc
|
||||
- pc_comm_config
|
||||
- pc_network_interfaces
|
||||
- pctype
|
||||
|
||||
**Total New Columns:** 61 columns across all tables
|
||||
|
||||
**Estimated Records After Migration:**
|
||||
- machines: 543 (266 existing + 277 from PCs)
|
||||
- communications: ~650+ (266 from machines.ipaddress, 277+ from pc tables)
|
||||
- warranties: ~277+ (from PC warranty data)
|
||||
- compliance: TBD (from inventory.xlsx)
|
||||
- compliancescans: TBD (ongoing logging)
|
||||
- machinerelationships: ~50+ (dualpath pairs, PC-to-machine controllers)
|
||||
|
||||
---
|
||||
|
||||
## KEY DESIGN DECISIONS
|
||||
|
||||
### Generic `address` Field
|
||||
**Decision:** Use single `address` field in communications instead of separate ipaddress/portname/etc fields.
|
||||
**Benefit:** Flexible, extensible, no unused columns per row.
|
||||
|
||||
### Simplified Warranties
|
||||
**Decision:** Just warrantyname and enddate. No complex vendor/type/cost tracking.
|
||||
**Benefit:** Easy to use, easy to maintain, covers 90% of use cases.
|
||||
|
||||
### Liaison in BusinessUnits
|
||||
**Decision:** Add liaison fields directly to businessunits instead of separate table.
|
||||
**Benefit:** Simpler structure, one less JOIN, appropriate granularity.
|
||||
|
||||
### Unified Machine Types
|
||||
**Decision:** Add PC types as entries in machinetypes instead of separate pctype system.
|
||||
**Benefit:** Single source of truth, eliminates pctypeid column.
|
||||
|
||||
### Vendor FK for Third-Party Management
|
||||
**Decision:** Use vendorid FK in compliance.managedbyvendorid instead of text field.
|
||||
**Benefit:** Normalized, prevents typos, enables vendor-based queries.
|
||||
|
||||
### JSON Settings Field
|
||||
**Decision:** Use JSON for type-specific config in communications.
|
||||
**Benefit:** Flexible, no table bloat, easy to extend.
|
||||
|
||||
### Minimal Audit Fields
|
||||
**Decision:** Removed dateadded/lastupdated from warranties and communications.
|
||||
**Benefit:** Simpler, only track audit fields where truly needed.
|
||||
|
||||
### Machine Relationships Table
|
||||
**Decision:** Generic relationship table instead of specific PC-to-machine or dualpath-only tables.
|
||||
**Benefit:** Flexible, extensible, supports bidirectional and directional relationships, future-proof for clusters/backup systems.
|
||||
|
||||
---
|
||||
|
||||
## NEXT STEPS
|
||||
|
||||
### Phase 1: Infrastructure Setup (Scripts 01-08)
|
||||
**Status:** Ready to create SQL scripts
|
||||
|
||||
1. Script 01: Create communications infrastructure (comstypes, communications)
|
||||
2. Script 02: Extend machines table (+9 columns)
|
||||
3. Script 03: Create PC machine types in machinetypes
|
||||
4. Script 04: Create warranty infrastructure (warranties)
|
||||
5. Script 05: Create compliance infrastructure (compliance, compliancescans)
|
||||
6. Script 06: Extend businessunits table (+2 liaison fields)
|
||||
7. Script 07: Rename pcstatus to machinestatus
|
||||
8. Script 08: Create machine relationships infrastructure (relationshiptypes, machinerelationships)
|
||||
|
||||
**Estimated Time:** 25 minutes
|
||||
**Reversible:** Yes (rollback scripts provided)
|
||||
|
||||
### Phase 2: Data Migration (Scripts 09-12)
|
||||
**Status:** Design complete, scripts pending
|
||||
|
||||
1. Script 09: Migrate PC data to machines
|
||||
2. Script 10: Migrate communication data (ipaddress1/2, pc_network_interfaces, pc_comm_config)
|
||||
3. Script 11: Migrate warranty data
|
||||
4. Script 12: Populate machine relationships (dualpath, controller associations)
|
||||
|
||||
**Estimated Time:** 30-45 minutes
|
||||
**Reversible:** Yes (with backups)
|
||||
|
||||
### Phase 3: Application Updates
|
||||
**Status:** Pending
|
||||
|
||||
1. Update 19 database views
|
||||
2. Create compatibility views
|
||||
3. Update ASP files
|
||||
4. Test all functionality
|
||||
|
||||
**Estimated Time:** 2-3 weeks
|
||||
|
||||
### Phase 4: Cleanup (After 30 days)
|
||||
**Status:** Pending
|
||||
|
||||
1. Drop pc table
|
||||
2. Drop pc_comm_config, pc_network_interfaces
|
||||
3. Drop pctype table
|
||||
4. Drop compatibility views
|
||||
5. Drop machines.ipaddress1, machines.ipaddress2
|
||||
|
||||
---
|
||||
|
||||
## RISK MITIGATION
|
||||
|
||||
**Critical Success Factors:**
|
||||
- Full database backup before any changes
|
||||
- Test all scripts on dev environment first
|
||||
- Rollback scripts for Phase 1
|
||||
- 30-day verification period before dropping old tables
|
||||
- Compatibility views to support gradual application migration
|
||||
|
||||
**Rollback Strategy:**
|
||||
- Phase 1: Run rollback scripts (drop new tables, revert ALTER TABLEs)
|
||||
- Phase 2: Restore from backup
|
||||
- Phase 3: Revert code deployment
|
||||
- Phase 4: IRREVERSIBLE - ensure 30-day testing complete
|
||||
|
||||
---
|
||||
|
||||
**Document Status:** FINALIZED
|
||||
**Date Finalized:** 2025-11-06
|
||||
**Ready for:** Phase 1 SQL Script Creation
|
||||
**Dependencies:** None - self-contained design
|
||||
|
||||
---
|
||||
|
||||
*This document represents the final approved design. Any changes after this point should be documented as amendments with version numbers.*
|
||||
1153
docs/archive/DEEP_DIVE_REPORT.md
Normal file
1153
docs/archive/DEEP_DIVE_REPORT.md
Normal file
File diff suppressed because it is too large
Load Diff
469
docs/archive/DISPLAY_PAGES_UPDATE_SUMMARY.md
Normal file
469
docs/archive/DISPLAY_PAGES_UPDATE_SUMMARY.md
Normal file
@@ -0,0 +1,469 @@
|
||||
# Display Pages Update Summary
|
||||
|
||||
## Overview
|
||||
**COMPLETELY REWRITTEN** `displaymachine.asp` with professional card-based layout and enhanced `displaypc.asp` to show all Phase 2 migration data including:
|
||||
- Network communications (IP addresses, MAC addresses, interfaces)
|
||||
- Machine relationships (PC controls, dualpath relationships, controlled equipment)
|
||||
- Compliance and security data
|
||||
- Clean, professional Bootstrap card design
|
||||
- Prominent "Edit Machine" button
|
||||
|
||||
## Files Modified
|
||||
|
||||
### 1. displaymachine.asp
|
||||
**Location:** `/home/camp/projects/windows/shopdb/displaymachine.asp`
|
||||
|
||||
**Status:** **COMPLETELY REWRITTEN FROM SCRATCH** (968 lines)
|
||||
|
||||
**Date:** 2025-11-07
|
||||
|
||||
#### New Design Features:
|
||||
|
||||
**Page Layout:**
|
||||
- **Left Sidebar (col-md-4)**: Machine image card with photo display
|
||||
- **Right Content Area (col-md-8)**: Tabbed interface with 5 tabs
|
||||
- **Top Header**: "Back to Machines" button + gradient-styled "Edit Machine" button
|
||||
- **Professional Bootstrap card-based design** throughout
|
||||
- **Responsive layout** for all screen sizes
|
||||
|
||||
**Edit Machine Button:**
|
||||
- Located at top-right of page (next to "Back to Machines")
|
||||
- Styled with gradient background: `linear-gradient(45deg, #667eea 0%, #764ba2 100%)`
|
||||
- Links directly to `editmachine.asp?machineid=XXX`
|
||||
- Prominent placement for easy access
|
||||
|
||||
#### Tabs Structure:
|
||||
|
||||
**1. Settings Tab** (default active)
|
||||
- Basic machine information card
|
||||
- Configuration details
|
||||
- Location pin with hover popup
|
||||
- Model, vendor, business unit info
|
||||
- Machine notes
|
||||
|
||||
**2. Network Tab**
|
||||
- Professional table showing all network interfaces
|
||||
- Displays:
|
||||
- Interface Name
|
||||
- IP Address
|
||||
- MAC Address
|
||||
- Primary indicator (Yes/No badge)
|
||||
- Empty state message if no interfaces configured
|
||||
- Data source: `communications` table
|
||||
|
||||
**3. Relationships Tab**
|
||||
- Three organized sections:
|
||||
|
||||
**Section 1: Controls (PC that controls this equipment)**
|
||||
- Shows which PC controls this machine
|
||||
- Displays:
|
||||
- PC hostname (clickable link)
|
||||
- PC IP address
|
||||
- Relationship type badge
|
||||
- Data source: `machinerelationships` WHERE relationshiptype = 'Controls' AND related_machineid = this machine
|
||||
|
||||
**Section 2: Controlled By This PC**
|
||||
- Only shown if this is a PC (pctypeid IS NOT NULL)
|
||||
- Lists all equipment controlled by this PC
|
||||
- Displays:
|
||||
- Equipment number (clickable link)
|
||||
- Equipment type
|
||||
- Model
|
||||
- IP address
|
||||
- Data source: `machinerelationships` WHERE relationshiptype = 'Controls' AND machineid = this PC
|
||||
|
||||
**Section 3: Dualpath/Redundant Machines**
|
||||
- Shows machines with bidirectional dualpath links
|
||||
- Displays:
|
||||
- Machine number (clickable link)
|
||||
- Machine type
|
||||
- Model
|
||||
- Relationship badge
|
||||
- Data source: `machinerelationships` WHERE relationshiptype = 'Dualpath'
|
||||
|
||||
**4. Compliance Tab**
|
||||
- Compliance information card with badge styling
|
||||
- Displays:
|
||||
- Third Party Managed (Yes/No/N/A badge with colors)
|
||||
- Third Party Vendor (lookup from vendors table)
|
||||
- OT Asset System
|
||||
- DoD Asset Device Type
|
||||
- Security scans table (last 10 scans)
|
||||
- Empty state messages if no data
|
||||
- Data source: `compliance` table with vendor JOIN, `compliancescans` table
|
||||
|
||||
**5. Applications Tab**
|
||||
- Shows installed applications
|
||||
- Data source: `applications` table (existing functionality preserved)
|
||||
|
||||
---
|
||||
|
||||
### 2. displaypc.asp
|
||||
**Location:** `/home/camp/projects/windows/shopdb/displaypc.asp`
|
||||
|
||||
#### New Tabs Added:
|
||||
|
||||
**A. Controlled Equipment Tab (`#controlled`)**
|
||||
- Shows all equipment controlled by this PC
|
||||
- Displays:
|
||||
- Machine number (clickable link to displaymachine.asp)
|
||||
- Equipment type (Vertical Lathe, Mill Turn, etc.)
|
||||
- Vendor
|
||||
- Model
|
||||
- Location (alias or machine number)
|
||||
- Data source: `machinerelationships` table with relationship type 'Controls'
|
||||
- Shows helpful message if:
|
||||
- PC has no machine assigned
|
||||
- PC doesn't control any equipment
|
||||
|
||||
#### Tab Order:
|
||||
1. Settings (existing - default active)
|
||||
2. **Controlled Equipment** (new)
|
||||
3. Applications (existing)
|
||||
4. Edit (existing)
|
||||
|
||||
---
|
||||
|
||||
## Database Tables Used
|
||||
|
||||
### New Tables from Phase 2 Migration:
|
||||
|
||||
1. **communications**
|
||||
- Columns: comid, machineid, comstypeid, address, macaddress, interfacename, isprimary, isactive
|
||||
- Purpose: Store network communication details for machines
|
||||
|
||||
2. **comstypes**
|
||||
- Columns: comstypeid, typename
|
||||
- Purpose: Define types of communications (Network_Interface, etc.)
|
||||
|
||||
3. **machinerelationships**
|
||||
- Columns: relationshipid, machineid, related_machineid, relationshiptypeid, isactive
|
||||
- Purpose: Store relationships between machines
|
||||
|
||||
4. **relationshiptypes**
|
||||
- Columns: relationshiptypeid, relationshiptype
|
||||
- Values: 'Controls', 'Dualpath'
|
||||
- Purpose: Define types of machine relationships
|
||||
|
||||
5. **compliance**
|
||||
- Columns: complianceid, machineid, is_third_party_managed, third_party_manager, ot_asset_system, ot_asset_device_type, is_compliant
|
||||
- Purpose: Store compliance and asset management data
|
||||
|
||||
6. **compliancescans**
|
||||
- Columns: scanid, machineid, scan_name, scan_date, scan_result, scan_details
|
||||
- Purpose: Store security scan history
|
||||
|
||||
---
|
||||
|
||||
## Query Examples
|
||||
|
||||
### Communications Query (displaymachine.asp)
|
||||
```sql
|
||||
SELECT c.*, ct.typename
|
||||
FROM communications c
|
||||
JOIN comstypes ct ON c.comstypeid = ct.comstypeid
|
||||
WHERE c.machineid = ? AND c.isactive = 1
|
||||
ORDER BY c.isprimary DESC, c.comid ASC
|
||||
```
|
||||
|
||||
### PC Controls Equipment Query (displaymachine.asp)
|
||||
```sql
|
||||
SELECT m.machineid, m.machinenumber, m.hostname, c.address, rt.relationshiptype
|
||||
FROM machinerelationships mr
|
||||
JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
JOIN machines m ON mr.machineid = m.machineid
|
||||
LEFT JOIN communications c ON m.machineid = c.machineid AND c.isprimary = 1
|
||||
WHERE mr.related_machineid = ? AND rt.relationshiptype = 'Controls' AND mr.isactive = 1
|
||||
```
|
||||
|
||||
### Dualpath Relationships Query (displaymachine.asp)
|
||||
```sql
|
||||
SELECT m.machineid, m.machinenumber, mt.machinetype, mo.modelnumber, rt.relationshiptype
|
||||
FROM machinerelationships mr
|
||||
JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
JOIN machines m ON mr.related_machineid = m.machineid
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN machinetypes mt ON mo.machinetypeid = mt.machinetypeid
|
||||
WHERE mr.machineid = ? AND rt.relationshiptype = 'Dualpath' AND mr.isactive = 1
|
||||
```
|
||||
|
||||
### Controlled Equipment Query (displaypc.asp)
|
||||
```sql
|
||||
SELECT m.machineid, m.machinenumber, m.alias, mt.machinetype, v.vendor, mo.modelnumber
|
||||
FROM machinerelationships mr
|
||||
JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
JOIN machines m ON mr.related_machineid = m.machineid
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN vendors v ON mo.vendorid = v.vendorid
|
||||
LEFT JOIN machinetypes mt ON mo.machinetypeid = mt.machinetypeid
|
||||
WHERE mr.machineid = ? AND rt.relationshiptype = 'Controls' AND mr.isactive = 1
|
||||
```
|
||||
|
||||
### Compliance Data Query (displaymachine.asp)
|
||||
```sql
|
||||
SELECT * FROM compliance WHERE machineid = ?
|
||||
```
|
||||
|
||||
### Security Scans Query (displaymachine.asp)
|
||||
```sql
|
||||
SELECT * FROM compliancescans
|
||||
WHERE machineid = ?
|
||||
ORDER BY scan_date DESC
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## UI/UX Features
|
||||
|
||||
### Badge System:
|
||||
- **Success (Green)**: Active status, compliant, pass, primary interface
|
||||
- **Warning (Yellow/Orange)**: Third party managed, dualpath relationships, scan warnings
|
||||
- **Danger (Red)**: Non-compliant, failed scans
|
||||
- **Info (Blue)**: Active communications, scan info
|
||||
- **Primary (Blue)**: Controls relationship
|
||||
- **Secondary (Gray)**: N/A values, not assessed
|
||||
|
||||
### Responsive Design:
|
||||
- Tables are wrapped in `.table-responsive` divs
|
||||
- Mobile-friendly tab navigation
|
||||
- Text truncation for long values
|
||||
|
||||
### Navigation:
|
||||
- Clickable machine numbers link to displaymachine.asp
|
||||
- Clickable PC hostnames link to displaymachine.asp
|
||||
- All links use machineid parameter for consistent routing
|
||||
|
||||
---
|
||||
|
||||
## Security Notes
|
||||
|
||||
All queries use **parameterized queries** via `ExecuteParameterizedQuery()` function to prevent SQL injection:
|
||||
- User input sanitized
|
||||
- HTML encoded output using `Server.HTMLEncode()`
|
||||
- No direct string concatenation in SQL
|
||||
|
||||
---
|
||||
|
||||
## Data Import Status
|
||||
|
||||
As of the enhanced import run:
|
||||
- **308 equipment** have network communications
|
||||
- **144 PC control relationships** established
|
||||
- **164 machines** have compliance data
|
||||
- **68 security scans** recorded
|
||||
- **62 dualpath relationships** (imported in Phase 2)
|
||||
|
||||
---
|
||||
|
||||
## Next Steps / Future Enhancements
|
||||
|
||||
### Potential Additions:
|
||||
1. **Add/Edit functionality for:**
|
||||
- Network communications (add new interface, edit MAC/IP)
|
||||
- Machine relationships (assign PC to equipment, create dualpath links)
|
||||
- Compliance data (update third party status, asset types)
|
||||
- Security scans (manually add scan results)
|
||||
|
||||
2. **Enhanced filtering:**
|
||||
- Filter communications by type
|
||||
- Search within relationships
|
||||
- Filter scans by result type
|
||||
|
||||
3. **Bulk operations:**
|
||||
- Assign multiple machines to same PC
|
||||
- Update compliance data for equipment groups
|
||||
|
||||
4. **Reporting:**
|
||||
- Compliance summary report
|
||||
- Equipment without assigned PCs
|
||||
- Security scan coverage report
|
||||
|
||||
5. **Validation:**
|
||||
- Ensure PC assignments are unique (one PC per equipment)
|
||||
- Validate dualpath relationships are bidirectional
|
||||
- Check for orphaned communications
|
||||
|
||||
---
|
||||
|
||||
## Testing Checklist
|
||||
|
||||
- [ ] Verify Network tab shows all interfaces for equipment
|
||||
- [ ] Verify Relationships tab shows controlling PCs
|
||||
- [ ] Verify Relationships tab shows dualpath machines
|
||||
- [ ] Verify Compliance tab displays third party info
|
||||
- [ ] Verify Security scans display with correct badges
|
||||
- [ ] Verify Controlled Equipment tab on PCs shows equipment list
|
||||
- [ ] Verify all clickable links navigate correctly
|
||||
- [ ] Test with machines that have no data (empty states)
|
||||
- [ ] Test with PCs that control no equipment
|
||||
- [ ] Test with equipment that has multiple interfaces
|
||||
- [ ] Verify HTML encoding prevents XSS
|
||||
- [ ] Test across different themes (bg-theme1 through bg-theme16)
|
||||
|
||||
---
|
||||
|
||||
## Database Schema Reference
|
||||
|
||||
### machines table (existing + enhanced)
|
||||
- Now contains both PCs and equipment (post-Phase 2 migration)
|
||||
- PCs have pctypeid set, equipment has pctypeid = NULL
|
||||
- hostname field used for PC hostnames
|
||||
- machinenumber used as primary identifier
|
||||
|
||||
### Key Relationships:
|
||||
```
|
||||
machines (machineid)
|
||||
├─> communications (machineid) - one-to-many
|
||||
├─> machinerelationships (machineid) - one-to-many (source)
|
||||
├─> machinerelationships (related_machineid) - one-to-many (target)
|
||||
├─> compliance (machineid) - one-to-one
|
||||
└─> compliancescans (machineid) - one-to-many
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Implementation Details
|
||||
|
||||
### displaymachine.asp Rewrite Highlights:
|
||||
|
||||
**Code Quality:**
|
||||
- 968 lines (clean, organized code)
|
||||
- All queries use `ExecuteParameterizedQuery()` helper function
|
||||
- Consistent error handling throughout
|
||||
- Proper NULL handling for all fields
|
||||
- HTML encoding on all output
|
||||
|
||||
**Key Code Sections:**
|
||||
|
||||
1. **Main Query (loads machine data):**
|
||||
```asp
|
||||
strSQL = "SELECT m.*, mo.modelnumber, v.vendor, bu.businessunit, " & _
|
||||
"mt.machinetype, fa.functionalaccountname " & _
|
||||
"FROM machines m " & _
|
||||
"LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid " & _
|
||||
"LEFT JOIN vendors v ON mo.vendorid = v.vendorid " & _
|
||||
"LEFT JOIN businessunits bu ON m.businessunitid = bu.businessunitID " & _
|
||||
"LEFT JOIN machinetypes mt ON mo.machinetypeid = mt.machinetypeid " & _
|
||||
"LEFT JOIN functionalaccounts fa ON mo.functionalaccountid = fa.functionalaccountid " & _
|
||||
"WHERE m.machineid = ?"
|
||||
```
|
||||
|
||||
2. **Network Interfaces Query:**
|
||||
```asp
|
||||
strNetworkSQL = "SELECT * FROM communications WHERE machineid = ? AND isactive = 1 ORDER BY isprimary DESC, interfacename ASC"
|
||||
```
|
||||
|
||||
3. **Controlling PC Query:**
|
||||
```asp
|
||||
strControlSQL = "SELECT m.machineid, m.machinenumber, m.hostname, c.address, rt.relationshiptype " & _
|
||||
"FROM machinerelationships mr " & _
|
||||
"JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid " & _
|
||||
"JOIN machines m ON mr.machineid = m.machineid " & _
|
||||
"LEFT JOIN communications c ON m.machineid = c.machineid AND c.isprimary = 1 " & _
|
||||
"WHERE mr.related_machineid = ? AND rt.relationshiptype = 'Controls' AND mr.isactive = 1"
|
||||
```
|
||||
|
||||
4. **Compliance with Vendor Lookup:**
|
||||
```asp
|
||||
strComplianceSQL = "SELECT c.*, v.vendor AS third_party_vendor_name " & _
|
||||
"FROM compliance c " & _
|
||||
"LEFT JOIN vendors v ON c.third_party_vendorid = v.vendorid " & _
|
||||
"WHERE c.machineid = ?"
|
||||
```
|
||||
|
||||
**Security Features:**
|
||||
- Parameterized queries prevent SQL injection
|
||||
- Server.HTMLEncode() on all user-displayable data
|
||||
- Proper NULL handling prevents type errors
|
||||
- No direct variable interpolation in SQL
|
||||
- Session validation for user access
|
||||
|
||||
**UI/UX Enhancements:**
|
||||
- Gradient-styled Edit Machine button stands out
|
||||
- Badge color coding: Success (green), Warning (yellow), Danger (red), Secondary (gray)
|
||||
- Empty state messages for missing data
|
||||
- Clickable links for navigation between related machines
|
||||
- Hover effect on location pin in Settings tab
|
||||
- Responsive tables with `.table-responsive` wrapper
|
||||
|
||||
---
|
||||
|
||||
## Change Log
|
||||
|
||||
**Date:** 2025-11-07
|
||||
|
||||
**Major Changes:**
|
||||
1. **displaymachine.asp - COMPLETE REWRITE**
|
||||
- Rewrote entire file from scratch (968 lines)
|
||||
- New professional card-based layout
|
||||
- Left sidebar with machine image
|
||||
- Right side with 5 organized tabs
|
||||
- Prominent "Edit Machine" button at top
|
||||
- All queries converted to parameterized
|
||||
- Added comprehensive Phase 2 data display
|
||||
- Improved error handling and NULL safety
|
||||
|
||||
2. **displaypc.asp - Enhanced** (previously updated)
|
||||
- Added Controlled Equipment tab
|
||||
- Shows all machines controlled by this PC
|
||||
|
||||
**Modified Files:**
|
||||
- /home/camp/projects/windows/shopdb/displaymachine.asp (REWRITTEN)
|
||||
- /home/camp/projects/windows/shopdb/displaypc.asp (ENHANCED)
|
||||
|
||||
**Integration with Edit System:**
|
||||
- Edit Machine button links to `editmachine.asp?machineid=XXX`
|
||||
- Seamless workflow: View → Edit → Save → View
|
||||
- Consistent design between display and edit pages
|
||||
|
||||
**Database Impact:**
|
||||
- No schema changes required
|
||||
- Uses existing Phase 2 tables:
|
||||
- communications
|
||||
- machinerelationships
|
||||
- relationshiptypes
|
||||
- compliance
|
||||
- compliancescans
|
||||
|
||||
---
|
||||
|
||||
## Testing Status
|
||||
|
||||
**Tested Scenarios:**
|
||||
- Display machine with all Phase 2 data
|
||||
- Display machine with no network interfaces
|
||||
- Display machine with no relationships
|
||||
- Display machine with no compliance data
|
||||
- Display PC that controls equipment
|
||||
- Display equipment controlled by PC
|
||||
- Display dualpath relationships
|
||||
- Edit Machine button navigation
|
||||
- Clickable links to related machines
|
||||
- Location hover popup
|
||||
- Badge styling and colors
|
||||
- Responsive design on mobile
|
||||
|
||||
**Known Working:**
|
||||
- All parameterized queries execute correctly
|
||||
- NULL handling prevents type errors
|
||||
- HTML encoding prevents XSS
|
||||
- Empty states display properly
|
||||
- All tabs switch correctly
|
||||
- All links navigate properly
|
||||
|
||||
---
|
||||
|
||||
## Contact / Support
|
||||
|
||||
For questions about these changes:
|
||||
- See `/home/camp/projects/windows/shopdb/MACHINE_EDIT_FORM_IMPLEMENTATION.md` for edit form documentation
|
||||
- See `/home/camp/projects/windows/shopdb/ADD_EDIT_MACHINE_UPDATES.md` for add form documentation
|
||||
- See `/home/camp/projects/windows/shopdb/sql/migration_phase2/` for migration scripts
|
||||
- Review import logs in `/tmp/inventory_import_final.log`
|
||||
|
||||
---
|
||||
|
||||
**Implementation Status:** **COMPLETE**
|
||||
|
||||
All display pages have been updated to show Phase 2 migration data with professional, clean design.
|
||||
168
docs/archive/DOCS_CONSOLIDATION_PLAN.md
Normal file
168
docs/archive/DOCS_CONSOLIDATION_PLAN.md
Normal file
@@ -0,0 +1,168 @@
|
||||
# ShopDB Documentation Consolidation Plan
|
||||
|
||||
**Created:** 2025-12-11
|
||||
**Total Files:** 45 markdown files (25 in `/docs/`, 20 in root)
|
||||
**Total Lines:** ~19,400 lines
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
The documentation has grown organically during the Phase 1-3 migration work. Many files are now historical/completed and can be archived. The goal is to have **6-8 essential docs** that developers actually need.
|
||||
|
||||
---
|
||||
|
||||
## Proposed Structure
|
||||
|
||||
```
|
||||
shopdb/
|
||||
├── CLAUDE.md # KEEP - Claude Code instructions
|
||||
├── TODO.md # KEEP - Active task list
|
||||
│
|
||||
└── docs/
|
||||
├── README.md # REWRITE - Main index/getting started
|
||||
├── DEVELOPMENT.md # MERGE - Dev setup + patterns (from ASP_DEVELOPMENT_GUIDE + STANDARDS)
|
||||
├── DATABASE.md # NEW - Current schema + common queries
|
||||
├── API.md # RENAME - API documentation (from API_ASP_DOCUMENTATION)
|
||||
├── QUICK_REFERENCE.md # UPDATE - Cheat sheet
|
||||
│
|
||||
└── archive/ # NEW - Historical docs
|
||||
└── [completed work]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Action Plan
|
||||
|
||||
### 1. KEEP AS-IS (Root)
|
||||
|
||||
| File | Reason |
|
||||
|------|--------|
|
||||
| `CLAUDE.md` | Active - Claude Code instructions |
|
||||
| `TODO.md` | Active - Task tracking |
|
||||
|
||||
### 2. KEEP & UPDATE (docs/)
|
||||
|
||||
| File | Action |
|
||||
|------|--------|
|
||||
| `README.md` | Rewrite as simple getting-started guide |
|
||||
| `QUICK_REFERENCE.md` | Update with current info, trim fat |
|
||||
|
||||
### 3. MERGE INTO NEW FILES
|
||||
|
||||
#### → `docs/DEVELOPMENT.md` (merge these):
|
||||
| Source File | Lines | Take From |
|
||||
|-------------|-------|-----------|
|
||||
| `docs/ASP_DEVELOPMENT_GUIDE.md` | 586 | Dev setup, workflow, patterns |
|
||||
| `docs/STANDARDS.md` | 1232 | Coding standards (trim to essentials) |
|
||||
| `docs/NESTED_ENTITY_CREATION.md` | 218 | Complex form patterns |
|
||||
| `CLAUDE_PROJECT_INSTRUCTIONS.md` | 76 | VBScript rules |
|
||||
| `CLAUDE_REFERENCE.md` | 198 | Code patterns |
|
||||
|
||||
#### → `docs/DATABASE.md` (merge these):
|
||||
| Source File | Lines | Take From |
|
||||
|-------------|-------|-----------|
|
||||
| `docs/MIGRATION_STATUS_SUMMARY.md` | 166 | Current architecture |
|
||||
| `docs/MIGRATION_QUICK_REFERENCE.md` | 197 | Key queries |
|
||||
| `docs/INVENTORY_COLUMN_MAPPING.md` | 214 | Column reference |
|
||||
| `MACHINE_QUICK_REFERENCE.md` | 337 | Machine queries |
|
||||
|
||||
#### → `docs/API.md` (rename/move):
|
||||
| Source File | Lines | Action |
|
||||
|-------------|-------|--------|
|
||||
| `API_ASP_DOCUMENTATION.md` | 827 | Move to docs/API.md |
|
||||
|
||||
### 4. ARCHIVE (Historical - Completed Work)
|
||||
|
||||
Move to `docs/archive/`:
|
||||
|
||||
| File | Lines | Reason |
|
||||
|------|-------|--------|
|
||||
| `docs/DATABASE_MIGRATION_FINAL_DESIGN.md` | 696 | Phase 1 complete |
|
||||
| `docs/PC_MACHINES_CONSOLIDATION_PLAN.md` | 780 | Phase 2 complete |
|
||||
| `docs/PHASE3_NETWORK_DEVICES_MIGRATION_PLAN.md` | 489 | Phase 3 complete |
|
||||
| `docs/DEEP_DIVE_REPORT.md` | 1153 | Outdated - replace with DATABASE.md |
|
||||
| `docs/COMPLETE_REFACTORING_SUMMARY.md` | 357 | Completed work |
|
||||
| `docs/MACHINE_RELATIONSHIPS_EXAMPLES.md` | 342 | Merge into DATABASE.md |
|
||||
| `docs/INFRASTRUCTURE_*.md` (4 files) | ~1800 | Design docs - completed |
|
||||
| `docs/VENDOR_*.md` (2 files) | ~996 | Refactoring - completed |
|
||||
| `docs/PRINTER_MAP_MIGRATION_REPORT.md` | 593 | Completed |
|
||||
| `docs/WARRANTY_MANAGEMENT_DESIGN.md` | 516 | Design doc |
|
||||
| `docs/NETWORK_DEVICES_UNIFIED_DESIGN.md` | 740 | Design doc |
|
||||
|
||||
Move to `docs/archive/sessions/`:
|
||||
|
||||
| File | Lines | Reason |
|
||||
|------|-------|--------|
|
||||
| `SESSION_SUMMARY_2025-11-10.md` | 417 | Historical |
|
||||
| `SESSION_SUMMARY_2025-11-13.md` | 686 | Historical |
|
||||
| `PHASE2_*.md` (3 files) | ~1400 | Completed work |
|
||||
| `MACHINE_*.md` (4 files) | ~1700 | Completed work |
|
||||
| `DISPLAY_PAGES_UPDATE_SUMMARY.md` | 469 | Completed |
|
||||
| `ADD_EDIT_MACHINE_UPDATES.md` | 433 | Completed |
|
||||
| `BUG_FIXES_2025-11-14.md` | 455 | Historical |
|
||||
| `PRINTER_*.md` (2 files) | ~500 | Completed |
|
||||
| `SCHEMA_COMPARISON_REPORT_2025-11-20.md` | 291 | Historical |
|
||||
|
||||
### 5. DELETE (Redundant)
|
||||
|
||||
| File | Reason |
|
||||
|------|--------|
|
||||
| `CLAUDE_PROJECT_INSTRUCTIONS.md` | Merged into DEVELOPMENT.md |
|
||||
| `CLAUDE_REFERENCE.md` | Merged into DEVELOPMENT.md + DATABASE.md |
|
||||
|
||||
---
|
||||
|
||||
## Final Result
|
||||
|
||||
### Essential Docs (6 files):
|
||||
```
|
||||
docs/
|
||||
├── README.md (~100 lines) - Getting started, links
|
||||
├── DEVELOPMENT.md (~400 lines) - Setup, standards, patterns
|
||||
├── DATABASE.md (~300 lines) - Schema, queries, architecture
|
||||
├── API.md (~500 lines) - API endpoints
|
||||
├── QUICK_REFERENCE.md (~200 lines) - Cheat sheet
|
||||
└── archive/ - Historical docs (for reference)
|
||||
```
|
||||
|
||||
### Root Files (2 files):
|
||||
```
|
||||
shopdb/
|
||||
├── CLAUDE.md - Claude Code instructions
|
||||
└── TODO.md - Active tasks
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Style Rules for New Docs
|
||||
|
||||
- **No emojis** - Use text markers instead (e.g., `[OK]`, `[FAIL]`, `NOTE:`, `WARNING:`)
|
||||
- Plain markdown formatting only
|
||||
- Consistent heading hierarchy
|
||||
|
||||
---
|
||||
|
||||
## Execution Order
|
||||
|
||||
1. Create `docs/archive/` and `docs/archive/sessions/` directories
|
||||
2. Move historical files to archive
|
||||
3. Create new `docs/DATABASE.md` (consolidate schema info)
|
||||
4. Create new `docs/DEVELOPMENT.md` (consolidate dev guides)
|
||||
5. Move `API_ASP_DOCUMENTATION.md` → `docs/API.md`
|
||||
6. Rewrite `docs/README.md` as simple index
|
||||
7. Update `docs/QUICK_REFERENCE.md`
|
||||
8. Delete redundant files
|
||||
9. Update `CLAUDE.md` to reference new structure
|
||||
|
||||
---
|
||||
|
||||
## Space Savings
|
||||
|
||||
- **Before:** 45 files, ~19,400 lines
|
||||
- **After:** 8 active files, ~1,500 lines + archive
|
||||
- **Reduction:** ~90% in active documentation
|
||||
|
||||
---
|
||||
|
||||
**Ready to execute?**
|
||||
398
docs/archive/INFRASTRUCTURE_FINAL_ARCHITECTURE.md
Normal file
398
docs/archive/INFRASTRUCTURE_FINAL_ARCHITECTURE.md
Normal file
@@ -0,0 +1,398 @@
|
||||
# Infrastructure Architecture - Final Design
|
||||
|
||||
**Date:** 2025-10-23
|
||||
**Decision:** Use dedicated infrastructure tables with hierarchical relationships
|
||||
|
||||
---
|
||||
|
||||
## Existing Schema (Already in Database!)
|
||||
|
||||
### IDFs (Intermediate Distribution Frames)
|
||||
```sql
|
||||
idfs:
|
||||
- idfid INT(11) PK
|
||||
- idfname VARCHAR(100)
|
||||
- description VARCHAR(255)
|
||||
- maptop, mapleft INT(11) -- map coordinates
|
||||
- isactive BIT(1)
|
||||
```
|
||||
**No parent** - IDFs are top-level containers
|
||||
|
||||
### Cameras
|
||||
```sql
|
||||
cameras:
|
||||
- cameraid INT(11) PK
|
||||
- modelid INT(11) → models.modelnumberid → vendors
|
||||
- idfid INT(11) → idfs.idfid Already has parent!
|
||||
- serialnumber VARCHAR(100)
|
||||
- macaddress VARCHAR(17) Camera-specific
|
||||
- ipaddress VARCHAR(45)
|
||||
- description VARCHAR(255)
|
||||
- maptop, mapleft INT(11)
|
||||
- isactive BIT(1)
|
||||
```
|
||||
|
||||
### Switches
|
||||
```sql
|
||||
switches:
|
||||
- switchid INT(11) PK
|
||||
- modelid INT(11) → models.modelnumberid → vendors
|
||||
- serialnumber VARCHAR(100)
|
||||
- ipaddress VARCHAR(45)
|
||||
- description VARCHAR(255)
|
||||
- maptop, mapleft INT(11)
|
||||
- isactive BIT(1)
|
||||
```
|
||||
**Missing:** `idfid` (switches should belong to IDFs)
|
||||
|
||||
### Servers
|
||||
```sql
|
||||
servers:
|
||||
- serverid INT(11) PK
|
||||
- modelid INT(11) → models.modelnumberid → vendors
|
||||
- serialnumber VARCHAR(100)
|
||||
- ipaddress VARCHAR(45)
|
||||
- description VARCHAR(255)
|
||||
- maptop, mapleft INT(11)
|
||||
- isactive BIT(1)
|
||||
```
|
||||
**Optional:** `idfid` (servers might be in IDFs)
|
||||
|
||||
---
|
||||
|
||||
## Hierarchical Relationships
|
||||
|
||||
```
|
||||
IDFs (top level)
|
||||
├─ Switches (belong to IDF)
|
||||
│ └─ Cameras (might connect to switch)
|
||||
└─ Cameras (belong to IDF)
|
||||
└─ Servers (might be in IDF)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Migration Needed
|
||||
|
||||
### Step 1: Add idfid to switches (Required)
|
||||
```sql
|
||||
ALTER TABLE switches
|
||||
ADD COLUMN idfid INT(11) AFTER modelid,
|
||||
ADD INDEX idx_switches_idfid (idfid),
|
||||
ADD CONSTRAINT fk_switches_idf
|
||||
FOREIGN KEY (idfid) REFERENCES idfs(idfid) ON DELETE SET NULL;
|
||||
```
|
||||
|
||||
### Step 2: Add idfid to servers (Optional)
|
||||
```sql
|
||||
ALTER TABLE servers
|
||||
ADD COLUMN idfid INT(11) AFTER modelid,
|
||||
ADD INDEX idx_servers_idfid (idfid),
|
||||
ADD CONSTRAINT fk_servers_idf
|
||||
FOREIGN KEY (idfid) REFERENCES idfs(idfid) ON DELETE SET NULL;
|
||||
```
|
||||
|
||||
### Step 3: Ensure modelid exists (migration script handles this)
|
||||
Run `add_infrastructure_vendor_model_support.sql`
|
||||
|
||||
---
|
||||
|
||||
## Page Architecture
|
||||
|
||||
### Unified List Page + Type-Specific Detail Pages
|
||||
|
||||
**Why:** Different device types have different fields, so unified edit forms would be messy.
|
||||
|
||||
### Files (7 total):
|
||||
|
||||
```
|
||||
network_devices.asp → Unified list with tabs/filter
|
||||
network_device_detail_idf.asp?id=5 → IDF detail/edit
|
||||
network_device_detail_server.asp?id=3 → Server detail/edit
|
||||
network_device_detail_switch.asp?id=2 → Switch detail/edit
|
||||
network_device_detail_camera.asp?id=1 → Camera detail/edit
|
||||
add_network_device.asp?type=idf → Add form (type selector)
|
||||
save_network_device.asp → Universal save (routes by type)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Page 1: network_devices.asp (Unified List)
|
||||
|
||||
### Features
|
||||
- **Tabs:** All | IDFs | Servers | Switches | Cameras
|
||||
- **Single table** showing all infrastructure
|
||||
- **Click device** → routes to appropriate detail page based on type
|
||||
|
||||
### Routing Logic
|
||||
```vbscript
|
||||
Select Case rs("device_type")
|
||||
Case "IDF"
|
||||
detailUrl = "network_device_detail_idf.asp?id=" & rs("device_id")
|
||||
Case "Server"
|
||||
detailUrl = "network_device_detail_server.asp?id=" & rs("device_id")
|
||||
Case "Switch"
|
||||
detailUrl = "network_device_detail_switch.asp?id=" & rs("device_id")
|
||||
Case "Camera"
|
||||
detailUrl = "network_device_detail_camera.asp?id=" & rs("device_id")
|
||||
End Select
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Page 2: network_device_detail_idf.asp
|
||||
|
||||
### Unique Fields
|
||||
- **idfname** (no model/vendor - IDFs are just locations)
|
||||
- **description**
|
||||
- **Map coordinates**
|
||||
|
||||
### Form Fields
|
||||
```html
|
||||
<input type="text" name="idfname" required>
|
||||
<textarea name="description"></textarea>
|
||||
<input type="number" name="maptop" placeholder="Y coordinate">
|
||||
<input type="number" name="mapleft" placeholder="X coordinate">
|
||||
```
|
||||
|
||||
### No Parent Selection
|
||||
IDFs are top-level, no parent dropdown needed.
|
||||
|
||||
---
|
||||
|
||||
## Page 3: network_device_detail_server.asp
|
||||
|
||||
### Fields
|
||||
- **Model/Vendor dropdown** (modelid)
|
||||
- **Serial number**
|
||||
- **IP address**
|
||||
- **Description**
|
||||
- **IDF dropdown** (optional - which IDF is this server in?)
|
||||
- **Map coordinates**
|
||||
|
||||
### IDF Dropdown
|
||||
```vbscript
|
||||
<div class="form-group">
|
||||
<label>IDF Location (Optional)</label>
|
||||
<select name="idfid" class="form-control">
|
||||
<option value="">-- Not in an IDF --</option>
|
||||
<%
|
||||
strSQL = "SELECT idfid, idfname FROM idfs WHERE isactive = 1 ORDER BY idfname"
|
||||
Set rsIDFs = objConn.Execute(strSQL)
|
||||
Do While Not rsIDFs.EOF
|
||||
%>
|
||||
<option value="<%=rsIDFs("idfid")%>"
|
||||
<%If Not IsNull(rs("idfid")) And rs("idfid") = rsIDFs("idfid") Then Response.Write("selected")%>>
|
||||
<%=Server.HTMLEncode(rsIDFs("idfname"))%>
|
||||
</option>
|
||||
<%
|
||||
rsIDFs.MoveNext
|
||||
Loop
|
||||
%>
|
||||
</select>
|
||||
</div>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Page 4: network_device_detail_switch.asp
|
||||
|
||||
### Fields
|
||||
- **Model/Vendor dropdown** (modelid)
|
||||
- **Serial number**
|
||||
- **IP address**
|
||||
- **Description**
|
||||
- **IDF dropdown** (required - which IDF is this switch in?)
|
||||
- **Port count** (optional - could add this field)
|
||||
- **Map coordinates**
|
||||
|
||||
### IDF Dropdown (Required for switches)
|
||||
```vbscript
|
||||
<div class="form-group">
|
||||
<label>IDF Location <span class="text-danger">*</span></label>
|
||||
<select name="idfid" required class="form-control">
|
||||
<option value="">-- Select IDF --</option>
|
||||
<!-- IDF options... -->
|
||||
</select>
|
||||
<small class="form-text text-muted">
|
||||
Switches must be assigned to an IDF
|
||||
</small>
|
||||
</div>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Page 5: network_device_detail_camera.asp
|
||||
|
||||
### Fields
|
||||
- **Model/Vendor dropdown** (modelid)
|
||||
- **Serial number**
|
||||
- **MAC address** (cameras have this!)
|
||||
- **IP address**
|
||||
- **Description**
|
||||
- **IDF dropdown** (required - which IDF does this camera connect to?)
|
||||
- **Switch dropdown** (optional - which switch port?)
|
||||
- **Map coordinates**
|
||||
|
||||
### IDF Dropdown (Required)
|
||||
```vbscript
|
||||
<div class="form-group">
|
||||
<label>IDF Location <span class="text-danger">*</span></label>
|
||||
<select name="idfid" required class="form-control">
|
||||
<option value="">-- Select IDF --</option>
|
||||
<!-- IDF options... -->
|
||||
</select>
|
||||
</div>
|
||||
```
|
||||
|
||||
### MAC Address Field (Unique to cameras)
|
||||
```vbscript
|
||||
<div class="form-group">
|
||||
<label>MAC Address</label>
|
||||
<input type="text" name="macaddress" class="form-control"
|
||||
pattern="^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$"
|
||||
placeholder="00:11:22:33:44:55">
|
||||
</div>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Page 6: add_network_device.asp
|
||||
|
||||
### Step 1: Device Type Selector
|
||||
Show cards for IDF, Server, Switch, Camera
|
||||
|
||||
### Step 2: Type-Specific Form
|
||||
Route to appropriate form based on selected type:
|
||||
- `add_network_device.asp?type=idf` → IDF form (no model)
|
||||
- `add_network_device.asp?type=server` → Server form (model + optional IDF)
|
||||
- `add_network_device.asp?type=switch` → Switch form (model + required IDF)
|
||||
- `add_network_device.asp?type=camera` → Camera form (model + required IDF + MAC)
|
||||
|
||||
---
|
||||
|
||||
## Page 7: save_network_device.asp
|
||||
|
||||
### Universal Save Endpoint
|
||||
|
||||
```vbscript
|
||||
<%
|
||||
Dim deviceType
|
||||
deviceType = Request.Form("type")
|
||||
|
||||
' Route to appropriate table
|
||||
Select Case deviceType
|
||||
Case "idf"
|
||||
tableName = "idfs"
|
||||
' Save: idfname, description, maptop, mapleft
|
||||
' No modelid
|
||||
|
||||
Case "server"
|
||||
tableName = "servers"
|
||||
' Save: modelid, idfid (optional), serialnumber, ipaddress, description, maptop, mapleft
|
||||
|
||||
Case "switch"
|
||||
tableName = "switches"
|
||||
' Save: modelid, idfid (required), serialnumber, ipaddress, description, maptop, mapleft
|
||||
|
||||
Case "camera"
|
||||
tableName = "cameras"
|
||||
' Save: modelid, idfid (required), serialnumber, macaddress, ipaddress, description, maptop, mapleft
|
||||
End Select
|
||||
%>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Navigation Menu
|
||||
|
||||
```html
|
||||
<li class="nav-header">INFRASTRUCTURE</li>
|
||||
<li>
|
||||
<a href="network_devices.asp">
|
||||
<i class="zmdi zmdi-devices"></i> Network Devices
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="network_map.asp">
|
||||
<i class="zmdi zmdi-map"></i> Network Map
|
||||
</a>
|
||||
</li>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## network_map.asp Integration
|
||||
|
||||
### Current State
|
||||
Currently queries `machines` table filtering for infrastructure machine types.
|
||||
|
||||
### New Approach
|
||||
Query both machines AND infrastructure tables:
|
||||
|
||||
```vbscript
|
||||
<%
|
||||
' Get infrastructure devices
|
||||
strSQL = "SELECT 'IDF' as type, idfid as id, idfname as name, NULL as model, NULL as vendor, " & _
|
||||
"maptop, mapleft, 'IDF' as device_type " & _
|
||||
"FROM idfs WHERE isactive = 1 AND maptop IS NOT NULL " & _
|
||||
"UNION ALL " & _
|
||||
"SELECT 'Server' as type, serverid as id, description as name, m.modelnumber as model, v.vendor, " & _
|
||||
"s.maptop, s.mapleft, 'Server' as device_type " & _
|
||||
"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 AND s.maptop IS NOT NULL " & _
|
||||
"UNION ALL " & _
|
||||
"SELECT 'Switch' as type, switchid as id, description as name, m.modelnumber as model, v.vendor, " & _
|
||||
"sw.maptop, sw.mapleft, 'Switch' as device_type " & _
|
||||
"FROM switches sw " & _
|
||||
"LEFT JOIN models m ON sw.modelid = m.modelnumberid " & _
|
||||
"LEFT JOIN vendors v ON m.vendorid = v.vendorid " & _
|
||||
"WHERE sw.isactive = 1 AND sw.maptop IS NOT NULL " & _
|
||||
"UNION ALL " & _
|
||||
"SELECT 'Camera' as type, cameraid as id, description as name, m.modelnumber as model, v.vendor, " & _
|
||||
"c.maptop, c.mapleft, 'Camera' as device_type " & _
|
||||
"FROM cameras c " & _
|
||||
"LEFT JOIN models m ON c.modelid = m.modelnumberid " & _
|
||||
"LEFT JOIN vendors v ON m.vendorid = v.vendorid " & _
|
||||
"WHERE c.isactive = 1 AND c.maptop IS NOT NULL"
|
||||
|
||||
Set rs = objConn.Execute(strSQL)
|
||||
|
||||
' Output JSON for map markers
|
||||
Response.Write("const devices = [")
|
||||
Do While Not rs.EOF
|
||||
Response.Write("{")
|
||||
Response.Write("type: '" & rs("device_type") & "', ")
|
||||
Response.Write("id: " & rs("id") & ", ")
|
||||
Response.Write("name: '" & Replace(rs("name") & "", "'", "\'") & "', ")
|
||||
Response.Write("model: '" & Replace(rs("model") & "", "'", "\'") & "', ")
|
||||
Response.Write("vendor: '" & Replace(rs("vendor") & "", "'", "\'") & "', ")
|
||||
Response.Write("x: " & rs("mapleft") & ", ")
|
||||
Response.Write("y: " & rs("maptop"))
|
||||
Response.Write("},")
|
||||
rs.MoveNext
|
||||
Loop
|
||||
Response.Write("];")
|
||||
%>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary: Why This Approach?
|
||||
|
||||
**Hierarchical relationships** - Cameras/switches belong to IDFs
|
||||
**Type-specific fields** - MAC address for cameras, idfname for IDFs
|
||||
**Flexible** - Can add more fields per type later
|
||||
**Clean data model** - Proper normalization
|
||||
**Unified list view** - See all infrastructure in one place
|
||||
**Type-specific edit** - Appropriate fields per device type
|
||||
**Map integration** - All devices can be mapped
|
||||
|
||||
**Total Files:** 7 ASP files (1 list + 4 detail + 1 add + 1 save)
|
||||
|
||||
---
|
||||
|
||||
**Next Step:** Run enhanced migration script to add `idfid` to switches/servers, then create the 7 pages.
|
||||
|
||||
371
docs/archive/INFRASTRUCTURE_SIMPLIFIED_FINAL.md
Normal file
371
docs/archive/INFRASTRUCTURE_SIMPLIFIED_FINAL.md
Normal file
@@ -0,0 +1,371 @@
|
||||
# Infrastructure - Simplified Final Design
|
||||
|
||||
**Date:** 2025-10-23
|
||||
**Scope:** Only cameras track IDF relationships
|
||||
|
||||
---
|
||||
|
||||
## Simplified Schema
|
||||
|
||||
### IDFs (Intermediate Distribution Frames)
|
||||
```sql
|
||||
idfs:
|
||||
- idfid INT(11) PK
|
||||
- idfname VARCHAR(100)
|
||||
- description VARCHAR(255)
|
||||
- maptop, mapleft INT(11)
|
||||
- isactive BIT(1)
|
||||
```
|
||||
**Standalone** - Just a reference table for camera locations
|
||||
|
||||
### Cameras (Only device type with IDF relationship)
|
||||
```sql
|
||||
cameras:
|
||||
- cameraid INT(11) PK
|
||||
- modelid INT(11) → models → vendors
|
||||
- idfid INT(11) → idfs.idfid (already exists!)
|
||||
- serialnumber VARCHAR(100)
|
||||
- macaddress VARCHAR(17) (already exists!)
|
||||
- ipaddress VARCHAR(45)
|
||||
- description VARCHAR(255)
|
||||
- maptop, mapleft INT(11)
|
||||
- isactive BIT(1)
|
||||
```
|
||||
|
||||
### Switches (No IDF)
|
||||
```sql
|
||||
switches:
|
||||
- switchid INT(11) PK
|
||||
- modelid INT(11) → models → vendors
|
||||
- serialnumber VARCHAR(100)
|
||||
- ipaddress VARCHAR(45)
|
||||
- description VARCHAR(255)
|
||||
- maptop, mapleft INT(11)
|
||||
- isactive BIT(1)
|
||||
```
|
||||
|
||||
### Servers (No IDF)
|
||||
```sql
|
||||
servers:
|
||||
- serverid INT(11) PK
|
||||
- modelid INT(11) → models → vendors
|
||||
- serialnumber VARCHAR(100)
|
||||
- ipaddress VARCHAR(45)
|
||||
- description VARCHAR(255)
|
||||
- maptop, mapleft INT(11)
|
||||
- isactive BIT(1)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Migration Needed
|
||||
|
||||
**Just run:** `add_infrastructure_vendor_model_support.sql`
|
||||
|
||||
This adds `modelid` to servers/switches/cameras (if not already present).
|
||||
|
||||
**No additional migrations needed!** Cameras already have `idfid` and `macaddress`.
|
||||
|
||||
---
|
||||
|
||||
## Edit Pages - Which Are Unique?
|
||||
|
||||
| Device | Unique Fields | Needs Custom Page? |
|
||||
|--------|---------------|-------------------|
|
||||
| **IDF** | idfname (no model/vendor) | YES - different structure |
|
||||
| **Camera** | idfid dropdown, macaddress | YES - has IDF + MAC |
|
||||
| **Server** | Standard fields only | NO - same as switch |
|
||||
| **Switch** | Standard fields only | NO - same as server |
|
||||
|
||||
### Optimization: Combine Server/Switch Edit
|
||||
|
||||
Since servers and switches have **identical fields**, we can use:
|
||||
- **1 generic edit page** for servers + switches
|
||||
- **1 custom edit page** for cameras (has IDF + MAC)
|
||||
- **1 custom edit page** for IDFs (no model/vendor)
|
||||
|
||||
---
|
||||
|
||||
## Page Architecture (5 Files Total!)
|
||||
|
||||
```
|
||||
network_devices.asp → Unified list with tabs
|
||||
network_device_detail_idf.asp?id=5 → IDF detail/edit (no model)
|
||||
network_device_detail_generic.asp?type=server&id=3 → Server/Switch edit
|
||||
network_device_detail_camera.asp?id=1 → Camera edit (IDF + MAC)
|
||||
add_network_device.asp?type=server → Add form with type selector
|
||||
save_network_device.asp → Universal save
|
||||
```
|
||||
|
||||
**Wait, that's 6 files. Can we simplify more?**
|
||||
|
||||
Actually, let's use **4 files** by combining add into detail:
|
||||
|
||||
```
|
||||
network_devices.asp → List with tabs
|
||||
device_idf.asp?id=5 → IDF add/edit
|
||||
device_generic.asp?type=server&id=3 → Server/Switch add/edit
|
||||
device_camera.asp?id=1 → Camera add/edit (IDF + MAC)
|
||||
```
|
||||
|
||||
Each detail page handles both **add (id=0)** and **edit (id>0)**.
|
||||
|
||||
---
|
||||
|
||||
## File 1: network_devices.asp (List)
|
||||
|
||||
### Features
|
||||
- Tabs: All | IDFs | Servers | Switches | Cameras
|
||||
- Unified table showing all devices
|
||||
- Click device → route to appropriate detail page
|
||||
|
||||
### Routing
|
||||
```vbscript
|
||||
Select Case rs("device_type")
|
||||
Case "IDF"
|
||||
detailUrl = "device_idf.asp?id=" & rs("device_id")
|
||||
Case "Server"
|
||||
detailUrl = "device_generic.asp?type=server&id=" & rs("device_id")
|
||||
Case "Switch"
|
||||
detailUrl = "device_generic.asp?type=switch&id=" & rs("device_id")
|
||||
Case "Camera"
|
||||
detailUrl = "device_camera.asp?id=" & rs("device_id")
|
||||
End Select
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File 2: device_idf.asp (IDF Add/Edit)
|
||||
|
||||
### Fields
|
||||
- **idfname** (text input, required)
|
||||
- **description** (textarea)
|
||||
- **maptop, mapleft** (optional coordinates)
|
||||
|
||||
### No dropdowns
|
||||
IDFs are just locations with names. No model, no vendor, no parent.
|
||||
|
||||
### Save endpoint
|
||||
Posts to `save_network_device.asp` with `type=idf`
|
||||
|
||||
---
|
||||
|
||||
## File 3: device_generic.asp (Server/Switch Add/Edit)
|
||||
|
||||
### Type-aware
|
||||
Uses `?type=server` or `?type=switch` parameter
|
||||
|
||||
### Fields (Same for both!)
|
||||
- **Model dropdown** (modelid → shows vendor + model)
|
||||
- **Serial number** (text)
|
||||
- **IP address** (text, validated)
|
||||
- **Description** (textarea)
|
||||
- **maptop, mapleft** (optional coordinates)
|
||||
|
||||
### Dynamic labels
|
||||
```vbscript
|
||||
Dim deviceType, displayName
|
||||
deviceType = Request.QueryString("type")
|
||||
|
||||
If deviceType = "server" Then
|
||||
displayName = "Server"
|
||||
ElseIf deviceType = "switch" Then
|
||||
displayName = "Switch"
|
||||
Else
|
||||
Response.Redirect("network_devices.asp")
|
||||
End If
|
||||
%>
|
||||
|
||||
<h2><%If deviceId = 0 Then Response.Write("Add") Else Response.Write("Edit")%> <%=displayName%></h2>
|
||||
```
|
||||
|
||||
### Save endpoint
|
||||
Posts to `save_network_device.asp` with `type=server` or `type=switch`
|
||||
|
||||
---
|
||||
|
||||
## File 4: device_camera.asp (Camera Add/Edit)
|
||||
|
||||
### Fields (Camera-specific!)
|
||||
- **Model dropdown** (modelid → shows vendor + model)
|
||||
- **IDF dropdown** (idfid → required!)
|
||||
- **Serial number** (text)
|
||||
- **MAC address** (text, pattern validation)
|
||||
- **IP address** (text, validated)
|
||||
- **Description** (textarea)
|
||||
- **maptop, mapleft** (optional coordinates)
|
||||
|
||||
### IDF Dropdown
|
||||
```vbscript
|
||||
<div class="form-group">
|
||||
<label>IDF Location <span class="text-danger">*</span></label>
|
||||
<select name="idfid" required class="form-control">
|
||||
<option value="">-- Select IDF --</option>
|
||||
<%
|
||||
strSQL = "SELECT idfid, idfname FROM idfs WHERE isactive = 1 ORDER BY idfname"
|
||||
Set rsIDFs = objConn.Execute(strSQL)
|
||||
Do While Not rsIDFs.EOF
|
||||
%>
|
||||
<option value="<%=rsIDFs("idfid")%>"
|
||||
<%If Not IsNull(rs("idfid")) And rs("idfid") = rsIDFs("idfid") Then Response.Write("selected")%>>
|
||||
<%=Server.HTMLEncode(rsIDFs("idfname"))%>
|
||||
</option>
|
||||
<%
|
||||
rsIDFs.MoveNext
|
||||
Loop
|
||||
%>
|
||||
</select>
|
||||
<small class="form-text text-muted">
|
||||
Which IDF does this camera connect to?
|
||||
</small>
|
||||
</div>
|
||||
```
|
||||
|
||||
### MAC Address Field
|
||||
```vbscript
|
||||
<div class="form-group">
|
||||
<label>MAC Address</label>
|
||||
<input type="text" name="macaddress" class="form-control"
|
||||
pattern="^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$"
|
||||
placeholder="00:11:22:33:44:55">
|
||||
</div>
|
||||
```
|
||||
|
||||
### Save endpoint
|
||||
Posts to `save_network_device.asp` with `type=camera`
|
||||
|
||||
---
|
||||
|
||||
## File 5: save_network_device.asp (Universal Save)
|
||||
|
||||
### Routes by type parameter
|
||||
```vbscript
|
||||
<%
|
||||
Dim deviceType, deviceId
|
||||
deviceType = Request.Form("type")
|
||||
deviceId = GetSafeInteger("FORM", "id", 0, 0, 999999)
|
||||
|
||||
Select Case deviceType
|
||||
Case "idf"
|
||||
tableName = "idfs"
|
||||
idField = "idfid"
|
||||
' Fields: idfname, description, maptop, mapleft
|
||||
' No modelid!
|
||||
|
||||
Case "server"
|
||||
tableName = "servers"
|
||||
idField = "serverid"
|
||||
' Fields: modelid, serialnumber, ipaddress, description, maptop, mapleft
|
||||
' No idfid!
|
||||
|
||||
Case "switch"
|
||||
tableName = "switches"
|
||||
idField = "switchid"
|
||||
' Fields: modelid, serialnumber, ipaddress, description, maptop, mapleft
|
||||
' No idfid!
|
||||
|
||||
Case "camera"
|
||||
tableName = "cameras"
|
||||
idField = "cameraid"
|
||||
' Fields: modelid, idfid, serialnumber, macaddress, ipaddress, description, maptop, mapleft
|
||||
' Has idfid and macaddress!
|
||||
End Select
|
||||
|
||||
' Build INSERT or UPDATE query based on deviceId
|
||||
If deviceId = 0 Then
|
||||
' INSERT logic...
|
||||
Else
|
||||
' UPDATE logic...
|
||||
End If
|
||||
%>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Add Flow (From network_devices.asp)
|
||||
|
||||
### "Add Device" Button
|
||||
Shows modal or redirects to selection page:
|
||||
|
||||
```
|
||||
[Add IDF] → device_idf.asp?id=0
|
||||
[Add Server] → device_generic.asp?type=server&id=0
|
||||
[Add Switch] → device_generic.asp?type=switch&id=0
|
||||
[Add Camera] → device_camera.asp?id=0
|
||||
```
|
||||
|
||||
Or use the existing approach with type selector in add_network_device.asp.
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
### Field Comparison Table
|
||||
|
||||
| Field | IDF | Server | Switch | Camera |
|
||||
|-------|-----|--------|--------|--------|
|
||||
| idfname | | | | |
|
||||
| modelid | | | | |
|
||||
| idfid (parent) | | | | |
|
||||
| macaddress | | | | |
|
||||
| serialnumber | | | | |
|
||||
| ipaddress | | | | |
|
||||
| description | | | | |
|
||||
| maptop, mapleft | | | | |
|
||||
|
||||
### Pages Needed
|
||||
|
||||
| Page | Handles | Reason |
|
||||
|------|---------|--------|
|
||||
| network_devices.asp | List all | Unified view |
|
||||
| device_idf.asp | IDF add/edit | Different structure (no model) |
|
||||
| device_generic.asp | Server + Switch add/edit | Identical fields |
|
||||
| device_camera.asp | Camera add/edit | Unique fields (IDF + MAC) |
|
||||
| save_network_device.asp | All saves | Universal endpoint |
|
||||
|
||||
**Total: 5 files** (or 6 if you separate add from edit)
|
||||
|
||||
---
|
||||
|
||||
## Navigation
|
||||
|
||||
```html
|
||||
<li class="nav-header">INFRASTRUCTURE</li>
|
||||
<li>
|
||||
<a href="network_devices.asp">
|
||||
<i class="zmdi zmdi-devices"></i> Network Devices
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="network_map.asp">
|
||||
<i class="zmdi zmdi-map"></i> Network Map
|
||||
</a>
|
||||
</li>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Migration Script
|
||||
|
||||
**Just run:** `/home/camp/projects/windows/shopdb/sql/add_infrastructure_vendor_model_support.sql`
|
||||
|
||||
**What it does:**
|
||||
- Adds `modelid` to servers/switches/cameras (if not already present)
|
||||
- Creates foreign keys to models table
|
||||
- Creates `vw_network_devices` view
|
||||
|
||||
**What we DON'T need:**
|
||||
- Add `idfid` to switches (not tracking)
|
||||
- Add `idfid` to servers (not tracking)
|
||||
- Cameras already have `idfid` and `macaddress`
|
||||
|
||||
---
|
||||
|
||||
## Ready to Build!
|
||||
|
||||
**Total:** 5 ASP files
|
||||
**Estimated Time:** 8-12 hours
|
||||
**Complexity:** Medium (simpler than original plan!)
|
||||
|
||||
Next step: Run migration, then create the 5 files.
|
||||
|
||||
562
docs/archive/INFRASTRUCTURE_SUPPORT_IMPLEMENTATION.md
Normal file
562
docs/archive/INFRASTRUCTURE_SUPPORT_IMPLEMENTATION.md
Normal file
@@ -0,0 +1,562 @@
|
||||
# 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
|
||||
<!-- Infrastructure -->
|
||||
<li class="nav-header">INFRASTRUCTURE</li>
|
||||
<li><a href="displayservers.asp"><i class="zmdi zmdi-storage"></i> Servers</a></li>
|
||||
<li><a href="displayswitches.asp"><i class="zmdi zmdi-device-hub"></i> Switches</a></li>
|
||||
<li><a href="displaycameras.asp"><i class="zmdi zmdi-videocam"></i> Cameras</a></li>
|
||||
```
|
||||
|
||||
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
|
||||
<!--#include file="./includes/sql.asp"-->
|
||||
<!--#include file="./includes/header.asp"-->
|
||||
<!--#include file="./includes/leftsidebar.asp"-->
|
||||
<!--#include file="./includes/topbarheader.asp"-->
|
||||
|
||||
<%
|
||||
' 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)
|
||||
%>
|
||||
|
||||
<div class="content-wrapper">
|
||||
<h2>Servers <a href="addserver.asp" class="btn btn-primary">Add Server</a></h2>
|
||||
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Vendor</th>
|
||||
<th>Model</th>
|
||||
<th>Serial Number</th>
|
||||
<th>IP Address</th>
|
||||
<th>Description</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% Do While Not rs.EOF %>
|
||||
<tr>
|
||||
<td><%=rs("serverid")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("vendor") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("modelnumber") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("serialnumber") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("ipaddress") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("description") & "")%></td>
|
||||
<td><a href="displayserver.asp?serverid=<%=rs("serverid")%>">View</a></td>
|
||||
</tr>
|
||||
<%
|
||||
rs.MoveNext
|
||||
Loop
|
||||
rs.Close
|
||||
Set rs = Nothing
|
||||
%>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!--#include file="./includes/footer.asp"-->
|
||||
```
|
||||
|
||||
### Template 2: Add Infrastructure Device Form (addserver.asp)
|
||||
```vbscript
|
||||
<!--#include file="./includes/sql.asp"-->
|
||||
<!--#include file="./includes/header.asp"-->
|
||||
<!--#include file="./includes/leftsidebar.asp"-->
|
||||
<!--#include file="./includes/topbarheader.asp"-->
|
||||
|
||||
<div class="content-wrapper">
|
||||
<h2>Add Server</h2>
|
||||
|
||||
<form method="post" action="saveserver_direct.asp">
|
||||
<div class="form-group">
|
||||
<label>Model</label>
|
||||
<select name="modelid" required class="form-control">
|
||||
<option value="">-- Select Model --</option>
|
||||
<%
|
||||
Dim strSQL, rsModels
|
||||
strSQL = "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"
|
||||
Set rsModels = objConn.Execute(strSQL)
|
||||
Do While Not rsModels.EOF
|
||||
%>
|
||||
<option value="<%=rsModels("modelnumberid")%>">
|
||||
<%=Server.HTMLEncode(rsModels("vendor") & " - " & rsModels("modelnumber"))%>
|
||||
</option>
|
||||
<%
|
||||
rsModels.MoveNext
|
||||
Loop
|
||||
rsModels.Close
|
||||
Set rsModels = Nothing
|
||||
%>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Serial Number</label>
|
||||
<input type="text" name="serialnumber" class="form-control" maxlength="100">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>IP Address</label>
|
||||
<input type="text" name="ipaddress" class="form-control" maxlength="15"
|
||||
pattern="^[0-9\.]+$" placeholder="192.168.1.100">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Description</label>
|
||||
<textarea name="description" class="form-control" rows="3"></textarea>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-success">Save Server</button>
|
||||
<a href="displayservers.asp" class="btn btn-secondary">Cancel</a>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!--#include file="./includes/footer.asp"-->
|
||||
```
|
||||
|
||||
### Template 3: Save Infrastructure Device (saveserver_direct.asp)
|
||||
```vbscript
|
||||
<!--#include file="./includes/sql.asp"-->
|
||||
<!--#include file="./includes/error_handler.asp"-->
|
||||
<!--#include file="./includes/validation.asp"-->
|
||||
<!--#include file="./includes/db_helpers.asp"-->
|
||||
|
||||
<%
|
||||
' 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]_
|
||||
|
||||
214
docs/archive/INVENTORY_COLUMN_MAPPING.md
Normal file
214
docs/archive/INVENTORY_COLUMN_MAPPING.md
Normal file
@@ -0,0 +1,214 @@
|
||||
# Inventory.xlsx Column Mapping to Database
|
||||
|
||||
**Date:** 2025-11-06
|
||||
**Coverage:** 100% (35/35 columns)
|
||||
|
||||
---
|
||||
|
||||
## Complete Column Mapping
|
||||
|
||||
| # | Inventory Column | Database Location | Notes |
|
||||
|---|------------------|-------------------|-------|
|
||||
| 1 | Operational Status | `machines.machinestatusid` → `machinestatus.machinestatus` | |
|
||||
| 2 | OT Location Name | `machines.businessunitid` → `businessunits.businessunit` | |
|
||||
| 3 | OT Location Liasion or Site OT Asset Manager | `businessunits.liaisonname` | |
|
||||
| 4 | System Name | `machines.machinenumber` | |
|
||||
| 5 | Hostname | `machines.hostname` | For PCs |
|
||||
| 6 | OS Name | `machines.osid` → `operatingsystems.osname` (PCs) OR `machines.controllerosid` → `operatingsystems.osname` (CNCs) | Same table for both! |
|
||||
| 7 | Serial # | `machines.serialnumber` | |
|
||||
| 8 | Manufacturer | `machines.modelnumberid` → `models.vendorid` → `vendors.vendor` | |
|
||||
| 9 | Model | `machines.modelnumberid` → `models.modelnumber` | |
|
||||
| 10 | Ge Coreload | `compliance.gecoreload` | |
|
||||
| 11 | Device Description | `machines.alias` OR `machinetypes.machinetype` | |
|
||||
| 12 | Device Type | `machines.machinetypeid` → `machinetypes.machinetype` | |
|
||||
| 13 | IP Address | `communications.address` (WHERE `comstypeid=1`) | First IP record |
|
||||
| 14 | IP Address (interface 2) | `communications.address` | Second IP record |
|
||||
| 15 | IP Address (Interface 3) | `communications.address` | Third IP record |
|
||||
| 16 | MAC Address (interface1) | `communications.macaddress` | First MAC record |
|
||||
| 17 | MAC address (Interface 2) | `communications.macaddress` | Second MAC record |
|
||||
| 18 | MAC Address (Interface 3) | `communications.macaddress` | Third MAC record |
|
||||
| 19 | On GE Network | `compliance.ongenetwork` | |
|
||||
| 20 | Vlan | `communications.settings` JSON | `{"vlan": "100"}` |
|
||||
| 21 | Asset Criticality(L/M/H) | `compliance.assetcriticality` | |
|
||||
| 22 | CUI/CMMC Data Classification | `compliance.cuidataclassification` | |
|
||||
| 23 | DoD Asset Type | `compliance.dodassettype` | |
|
||||
| 24 | DoD Asset Sub-Type | `compliance.dodassetsubtype` | |
|
||||
| 25 | OT Environment | `compliance.otenvironment` | |
|
||||
| 26 | 3rd Party (Other) Managed (Y/N) | `compliance.managedbyvendorid` → `vendors.vendor` | FK to vendors table |
|
||||
| 27 | Change Restricted (Y/N) | `compliance.changerestricted` | |
|
||||
| 28 | Other Deployment Notes | `machines.machinenotes` | |
|
||||
| 29 | Jump_Box | `compliance.jumpbox` | |
|
||||
| 30 | MFT | `compliance.mft` | Managed File Transfer |
|
||||
| 31 | Scan_Date_Status | `compliancescans.scanstatus` (latest) | Most recent scan |
|
||||
| 32 | OT Asset Fields | `machinerelationships` table | "WJ 2023 WJ 2024" = dualpath relationship |
|
||||
| 33 | Controller_Type1 | `machines.controllertypeid` → `controllertypes.controllertype` | For CNC machines |
|
||||
| 34 | Controller_OS1 | `machines.controllerosid` → `operatingsystems.osname` | For CNC machines |
|
||||
| 35 | PC_Type1 | `machines.machinetypeid` → `machinetypes.machinetype` | For PCs |
|
||||
|
||||
---
|
||||
|
||||
## Special Mapping Notes
|
||||
|
||||
### OT Asset Fields (Column 32) - Machine Relationships
|
||||
|
||||
**Inventory Pattern:**
|
||||
```
|
||||
Row 1: Machine 2023 (192.168.*.*) | OT Asset Fields: "WJ 2023 WJ 2024"
|
||||
Row 2: PC / Attached PC (10.134.*.*) | OT Asset Fields: "WJ 2023 WJ 2024"
|
||||
Row 3: Machine 2024 (192.168.*.*) | OT Asset Fields: "WJ 2023 WJ 2024"
|
||||
Row 4: PC / Attached PC (10.134.*.*) | OT Asset Fields: "WJ 2023 WJ 2024"
|
||||
```
|
||||
|
||||
**Database Representation:**
|
||||
```sql
|
||||
-- Machines 2023 and 2024 are dualpath
|
||||
INSERT INTO machinerelationships (relationshiptypeid, machineid1, machineid2)
|
||||
VALUES (1, 2023, 2024);
|
||||
|
||||
-- PC controls machine 2023
|
||||
INSERT INTO machinerelationships (relationshiptypeid, machineid1, machineid2)
|
||||
VALUES (2, 2023, [pc_machineid]);
|
||||
|
||||
-- PC controls machine 2024
|
||||
INSERT INTO machinerelationships (relationshiptypeid, machineid1, machineid2)
|
||||
VALUES (2, 2024, [pc_machineid]);
|
||||
```
|
||||
|
||||
**Relationship Types:**
|
||||
- relationshiptypeid = 1: Dualpath (machines share controller)
|
||||
- relationshiptypeid = 2: Controlled By (machine controlled by PC)
|
||||
|
||||
---
|
||||
|
||||
### IP Address Pattern Recognition
|
||||
|
||||
**Machine IPs:** `192.168.*.*` → CNC machines
|
||||
**PC IPs:** `10.134.*.*` → Controlling PCs
|
||||
|
||||
**System Name Pattern:**
|
||||
- Machine: `2023`
|
||||
- PC: `2023 / Attached PC` or `IT-LAB-01`
|
||||
|
||||
---
|
||||
|
||||
## Export Query for inventory.xlsx Format
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
-- Columns 1-12: Basic Info
|
||||
ms.machinestatus AS 'Operational Status',
|
||||
bu.businessunit AS 'OT Location Name',
|
||||
bu.liaisonname AS 'OT Location Liasion or Site OT Asset Manager',
|
||||
m.machinenumber AS 'System Name',
|
||||
m.hostname AS 'Hostname',
|
||||
COALESCE(os_pc.osname, os_ctrl.osname) AS 'OS Name',
|
||||
m.serialnumber AS 'Serial #',
|
||||
v.vendor AS 'Manufacturer',
|
||||
mo.modelnumber AS 'Model',
|
||||
comp.gecoreload AS 'Ge Coreload',
|
||||
m.alias AS 'Device Description',
|
||||
mt.machinetype AS 'Device Type',
|
||||
|
||||
-- Columns 13-20: Network
|
||||
c_ip1.address AS 'IP Address',
|
||||
c_ip2.address AS 'IP Address (interface 2)',
|
||||
c_ip3.address AS 'IP Address (Interface 3)',
|
||||
c_mac1.macaddress AS 'MAC Address (interface1)',
|
||||
c_mac2.macaddress AS 'MAC Address (interface 2)',
|
||||
c_mac3.macaddress AS 'MAC Address (Interface 3)',
|
||||
comp.ongenetwork AS 'On GE Network',
|
||||
c_ip1.settings->>'$.vlan' AS 'Vlan',
|
||||
|
||||
-- Columns 21-32: Compliance
|
||||
comp.assetcriticality AS 'Asset Criticality(L/M/H)',
|
||||
comp.cuidataclassification AS 'CUI/CMMC Data Classification',
|
||||
comp.dodassettype AS 'DoD Asset Type',
|
||||
comp.dodassetsubtype AS 'DoD Asset Sub-Type',
|
||||
comp.otenvironment AS 'OT Environment',
|
||||
mv.vendor AS '3rd Party (Other) Managed (Y/N)',
|
||||
comp.changerestricted AS 'Change Restricted (Y/N)',
|
||||
m.machinenotes AS 'Other Deployment Notes',
|
||||
comp.jumpbox AS 'Jump_Box',
|
||||
comp.mft AS 'MFT',
|
||||
(SELECT scanstatus FROM compliancescans cs
|
||||
WHERE cs.machineid = m.machineid
|
||||
ORDER BY scandate DESC LIMIT 1) AS 'Scan_Date_Status',
|
||||
|
||||
-- Column 32: OT Asset Fields (relationships)
|
||||
GROUP_CONCAT(DISTINCT
|
||||
CONCAT(mt_rel.machinetype, ' ', m_rel.machinenumber)
|
||||
SEPARATOR ' '
|
||||
) AS 'OT Asset Fields',
|
||||
|
||||
-- Columns 33-35: Controller/Type
|
||||
ct.controllertype AS 'Controller_Type1',
|
||||
os_ctrl.osname AS 'Controller_OS1',
|
||||
mt.machinetype AS 'PC_Type1'
|
||||
|
||||
FROM machines m
|
||||
LEFT JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
LEFT JOIN machinestatus ms ON m.machinestatusid = ms.machinestatusid
|
||||
LEFT JOIN businessunits bu ON m.businessunitid = bu.businessunitid
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN vendors v ON mo.vendorid = v.vendorid
|
||||
LEFT JOIN operatingsystems os_pc ON m.osid = os_pc.osid
|
||||
LEFT JOIN controllertypes ct ON m.controllertypeid = ct.controllertypeid
|
||||
LEFT JOIN operatingsystems os_ctrl ON m.controllerosid = os_ctrl.osid
|
||||
|
||||
-- Compliance
|
||||
LEFT JOIN compliance comp ON m.machineid = comp.machineid
|
||||
LEFT JOIN vendors mv ON comp.managedbyvendorid = mv.vendorid
|
||||
|
||||
-- Communications (IP addresses)
|
||||
LEFT JOIN (SELECT * FROM communications WHERE comstypeid IN (1,3) ORDER BY comid) c_ip1
|
||||
ON m.machineid = c_ip1.machineid AND c_ip1.rn = 1
|
||||
LEFT JOIN (SELECT * FROM communications WHERE comstypeid IN (1,3) ORDER BY comid) c_ip2
|
||||
ON m.machineid = c_ip2.machineid AND c_ip2.rn = 2
|
||||
LEFT JOIN (SELECT * FROM communications WHERE comstypeid IN (1,3) ORDER BY comid) c_ip3
|
||||
ON m.machineid = c_ip3.machineid AND c_ip3.rn = 3
|
||||
|
||||
-- MAC addresses
|
||||
LEFT JOIN (SELECT * FROM communications WHERE macaddress IS NOT NULL ORDER BY comid) c_mac1
|
||||
ON m.machineid = c_mac1.machineid AND c_mac1.rn = 1
|
||||
LEFT JOIN (SELECT * FROM communications WHERE macaddress IS NOT NULL ORDER BY comid) c_mac2
|
||||
ON m.machineid = c_mac2.machineid AND c_mac2.rn = 2
|
||||
LEFT JOIN (SELECT * FROM communications WHERE macaddress IS NOT NULL ORDER BY comid) c_mac3
|
||||
ON m.machineid = c_mac3.machineid AND c_mac3.rn = 3
|
||||
|
||||
-- Relationships (for OT Asset Fields)
|
||||
LEFT JOIN machinerelationships mr ON (
|
||||
mr.machineid1 = m.machineid OR mr.machineid2 = m.machineid
|
||||
)
|
||||
LEFT JOIN machines m_rel ON (
|
||||
CASE
|
||||
WHEN mr.machineid1 = m.machineid THEN mr.machineid2
|
||||
ELSE mr.machineid1
|
||||
END = m_rel.machineid
|
||||
)
|
||||
LEFT JOIN machinetypes mt_rel ON m_rel.machinetypeid = mt_rel.machinetypeid
|
||||
|
||||
WHERE m.isactive = 1
|
||||
GROUP BY m.machineid;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Coverage Summary
|
||||
|
||||
**100% Coverage** - All 35 inventory columns mapped to database
|
||||
|
||||
**Storage Distribution:**
|
||||
- `machines` table: 11 columns
|
||||
- `compliance` table: 9 columns
|
||||
- `communications` table: 8 columns (includes VLAN in JSON)
|
||||
- `businessunits` table: 2 columns
|
||||
- `machinerelationships` table: 1 column (OT Asset Fields)
|
||||
- `compliancescans` table: 1 column
|
||||
- Various lookup tables: 3 columns
|
||||
|
||||
**Design Benefits:**
|
||||
- Normalized structure (no redundancy)
|
||||
- Flexible relationships (dualpath, controller associations)
|
||||
- Extensible (easy to add new fields/types)
|
||||
- Complete audit trail
|
||||
- Single source of truth
|
||||
458
docs/archive/MACHINE_EDIT_FORM_IMPLEMENTATION.md
Normal file
458
docs/archive/MACHINE_EDIT_FORM_IMPLEMENTATION.md
Normal file
@@ -0,0 +1,458 @@
|
||||
# Machine Edit Form Implementation Summary
|
||||
|
||||
## Overview
|
||||
Implemented a professional tabbed edit form for machines based on the addmachine.asp layout, allowing users to edit all Phase 2 migration data including network communications, machine relationships, and compliance information.
|
||||
|
||||
---
|
||||
|
||||
## Files Created/Modified
|
||||
|
||||
### 1. editmachine.asp (NEW)
|
||||
**Location:** `/home/camp/projects/windows/shopdb/editmachine.asp`
|
||||
|
||||
**Purpose:** Professional tabbed form for editing existing machines
|
||||
|
||||
**Features:**
|
||||
- **5-tab layout** matching addmachine.asp (Basic Info, Network, Relationships, Compliance, Location)
|
||||
- **Pre-filled form fields** with existing machine data
|
||||
- **Same UI/UX** as addmachine.asp for consistency
|
||||
- **Nested entity creation** capability (add new models, vendors, etc. while editing)
|
||||
- **Read-only machine number** (cannot be changed)
|
||||
- **Interactive map picker** for location updates
|
||||
- **Responsive Bootstrap design** with theme support
|
||||
|
||||
**Data Loaded:**
|
||||
- Machine details from `machines` table with JOINs
|
||||
- Up to 3 network interfaces from `communications` table
|
||||
- Controlling PC from `machinerelationships` table
|
||||
- Dualpath machine from `machinerelationships` table
|
||||
- Compliance data from `compliance` table
|
||||
- Location coordinates
|
||||
|
||||
**Security:**
|
||||
- Parameterized queries throughout
|
||||
- machineid validation
|
||||
- Redirects to displaymachines.asp if machine not found
|
||||
- HTML encoding on all output
|
||||
|
||||
---
|
||||
|
||||
### 2. savemachineedit.asp (NEW)
|
||||
**Location:** `/home/camp/projects/windows/shopdb/savemachineedit.asp`
|
||||
|
||||
**Purpose:** Backend handler for processing machine edit form submissions
|
||||
|
||||
**Operations Performed:**
|
||||
|
||||
1. **Validates Inputs**
|
||||
- machineid (required from hidden field)
|
||||
- All form fields (same validation as savemachine_direct.asp)
|
||||
- Checks machine exists before updating
|
||||
|
||||
2. **Handles Nested Entity Creation**
|
||||
- New business units
|
||||
- New models (with vendors, machine types, functional accounts)
|
||||
- New third-party vendors
|
||||
|
||||
3. **Updates Machine Table**
|
||||
- Updates: modelid, businessunitid, alias, machinenotes, mapleft, maptop
|
||||
- Does NOT update machinenumber (readonly)
|
||||
- Uses parameterized UPDATE query
|
||||
|
||||
4. **Updates Network Communications**
|
||||
- Deletes old communications: `DELETE FROM communications WHERE machineid = ?`
|
||||
- Inserts new communications for ip1/mac1, ip2/mac2, ip3/mac3
|
||||
- Sets isprimary=1 for Interface 1
|
||||
|
||||
5. **Updates Machine Relationships**
|
||||
- Deletes old relationships: `DELETE FROM machinerelationships WHERE (machineid = ? OR related_machineid = ?)`
|
||||
- Inserts new controlling PC relationship (one-way)
|
||||
- Inserts new dualpath relationships (bidirectional)
|
||||
|
||||
6. **Updates Compliance Data**
|
||||
- Checks if compliance record exists
|
||||
- If exists: UPDATE compliance SET ...
|
||||
- If not exists: INSERT INTO compliance ...
|
||||
- Handles third-party vendor creation
|
||||
|
||||
7. **Redirects**
|
||||
- Success: `displaymachine.asp?machineid=XXX`
|
||||
- Error: Shows error message with "Go back" link
|
||||
|
||||
**Security:**
|
||||
- All queries use parameterized commands
|
||||
- Input validation on all fields
|
||||
- Error handling with proper user feedback
|
||||
|
||||
---
|
||||
|
||||
### 3. displaymachine.asp (MODIFIED)
|
||||
**Location:** `/home/camp/projects/windows/shopdb/displaymachine.asp`
|
||||
|
||||
**Changes:**
|
||||
- **Line 156**: Changed "Edit" tab to link to new `editmachine.asp` page
|
||||
- Now a styled button with gradient background
|
||||
- Direct link instead of tab
|
||||
- Icon changed to `zmdi-edit`
|
||||
- **Lines 604-913**: Commented out old inline edit form
|
||||
- Preserved for reference but not active
|
||||
- Users now redirected to dedicated edit page
|
||||
|
||||
**Before:**
|
||||
```asp
|
||||
<li class="nav-item">
|
||||
<a href="javascript:void();" data-target="#edit" data-toggle="pill" class="nav-link">
|
||||
<i class="icon-note"></i> <span class="hidden-xs">Edit</span>
|
||||
</a>
|
||||
</li>
|
||||
```
|
||||
|
||||
**After:**
|
||||
```asp
|
||||
<li class="nav-item">
|
||||
<a href="./editmachine.asp?machineid=<%=Server.HTMLEncode(machineid)%>"
|
||||
class="nav-link"
|
||||
style="background: linear-gradient(45deg, #667eea 0%, #764ba2 100%); color: white;">
|
||||
<i class="zmdi zmdi-edit"></i> <span class="hidden-xs">Edit Machine</span>
|
||||
</a>
|
||||
</li>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. addmachine.asp (PREVIOUSLY UPDATED)
|
||||
**Location:** `/home/camp/projects/windows/shopdb/addmachine.asp`
|
||||
|
||||
**Recent Updates:**
|
||||
- Fixed "New" button functionality for all dropdowns
|
||||
- Added third-party vendor creation in Compliance tab
|
||||
- Fixed map location picker to match printer implementation
|
||||
- Now serves as the template for editmachine.asp
|
||||
|
||||
---
|
||||
|
||||
## Database Tables Updated
|
||||
|
||||
### machines
|
||||
- **Updated fields**: modelid, businessunitid, alias, machinenotes, mapleft, maptop
|
||||
- **NOT updated**: machinenumber (readonly), machineid (primary key)
|
||||
|
||||
### communications
|
||||
- **DELETE then INSERT** approach for network interfaces
|
||||
- Fields: machineid, comstypeid, address, macaddress, interfacename, isprimary, isactive
|
||||
|
||||
### machinerelationships
|
||||
- **DELETE then INSERT** approach for relationships
|
||||
- Fields: machineid, related_machineid, relationshiptypeid, isactive
|
||||
- Relationship types: 'Controls', 'Dualpath'
|
||||
|
||||
### compliance
|
||||
- **UPDATE if exists, INSERT if not** approach
|
||||
- Fields: machineid, is_third_party_managed, third_party_vendorid, ot_asset_system, ot_asset_device_type
|
||||
|
||||
---
|
||||
|
||||
## User Workflow
|
||||
|
||||
### Editing a Machine:
|
||||
|
||||
1. **Navigate to machine**: Go to `displaymachine.asp?machineid=XXX`
|
||||
2. **Click "Edit Machine"**: Styled button in top navigation tabs
|
||||
3. **Redirected to**: `editmachine.asp?machineid=XXX`
|
||||
4. **Edit form loads** with all existing data pre-filled across 5 tabs:
|
||||
- **Basic Info**: Machine number (readonly), model, business unit, alias, notes
|
||||
- **Network**: Up to 3 network interfaces (IP/MAC addresses)
|
||||
- **Relationships**: Controlling PC, dualpath/redundant machine
|
||||
- **Compliance**: Third-party management, vendor, OT asset, DoD type
|
||||
- **Location**: Map coordinates with visual picker
|
||||
5. **Make changes** in any tab
|
||||
6. **Add new entities** if needed (models, vendors, etc.)
|
||||
7. **Click "Update Equipment"**
|
||||
8. **Form submits** to `savemachineedit.asp`
|
||||
9. **Data validated and saved**
|
||||
10. **Redirected back** to `displaymachine.asp?machineid=XXX`
|
||||
|
||||
---
|
||||
|
||||
## Key Features
|
||||
|
||||
### 1. Consistency
|
||||
- Edit form matches add form layout exactly
|
||||
- Same tab structure, styling, and behavior
|
||||
- Users familiar with adding machines can easily edit
|
||||
|
||||
### 2. Comprehensive Editing
|
||||
- **All Phase 2 data editable**:
|
||||
- Multiple network interfaces
|
||||
- Machine relationships (PC control, dualpath)
|
||||
- Compliance and security data
|
||||
- **Legacy data still accessible**:
|
||||
- Basic machine info
|
||||
- Business unit
|
||||
- Model/vendor
|
||||
- Location
|
||||
|
||||
### 3. Nested Entity Creation
|
||||
- Can create new models while editing machine
|
||||
- Can create new vendors while editing machine
|
||||
- Can create new business units while editing machine
|
||||
- Can create new third-party vendors while editing machine
|
||||
- All using same inline expandable sections as add form
|
||||
|
||||
### 4. Network Interface Management
|
||||
- Edit up to 3 network interfaces
|
||||
- Clear labeling (Primary, Optional)
|
||||
- IP and MAC address validation
|
||||
- Delete by leaving fields blank
|
||||
|
||||
### 5. Relationship Management
|
||||
- Update controlling PC
|
||||
- Update dualpath/redundant machine
|
||||
- Old relationships automatically removed
|
||||
- New relationships created
|
||||
|
||||
### 6. Map Location Picker
|
||||
- Interactive Leaflet map
|
||||
- Theme-aware (light/dark maps)
|
||||
- Draggable markers
|
||||
- Shows existing location if set
|
||||
- Visual coordinate selection
|
||||
|
||||
---
|
||||
|
||||
## Security Features
|
||||
|
||||
### Input Validation
|
||||
- All numeric fields validated with `IsNumeric()`
|
||||
- String length limits enforced (50-255 chars depending on field)
|
||||
- Required fields checked before processing
|
||||
- machineid validated and verified to exist
|
||||
|
||||
### SQL Injection Prevention
|
||||
- **100% parameterized queries** throughout both files
|
||||
- No string concatenation in SQL
|
||||
- Uses `ADODB.Command` with typed parameters
|
||||
- Example:
|
||||
```asp
|
||||
Set cmd = Server.CreateObject("ADODB.Command")
|
||||
cmd.ActiveConnection = objConn
|
||||
cmd.CommandText = "UPDATE machines SET modelid = ? WHERE machineid = ?"
|
||||
cmd.Parameters.Append cmd.CreateParameter("@modelid", 3, 1, , CLng(modelid))
|
||||
cmd.Parameters.Append cmd.CreateParameter("@machineid", 3, 1, , CLng(machineid))
|
||||
cmd.Execute
|
||||
```
|
||||
|
||||
### Output Encoding
|
||||
- All user data passed through `Server.HTMLEncode()`
|
||||
- Prevents XSS attacks
|
||||
- Applied to all displayed values
|
||||
|
||||
### Error Handling
|
||||
- Graceful error messages
|
||||
- "Go back" links on errors
|
||||
- No sensitive data exposed in errors
|
||||
- Database connection always closed
|
||||
|
||||
---
|
||||
|
||||
## Testing Checklist
|
||||
|
||||
- [ ] Edit machine basic info (model, business unit, alias, notes)
|
||||
- [ ] Edit network interfaces (add, update, remove)
|
||||
- [ ] Update controlling PC relationship
|
||||
- [ ] Update dualpath relationship
|
||||
- [ ] Edit compliance data
|
||||
- [ ] Update third-party vendor
|
||||
- [ ] Update location using map picker
|
||||
- [ ] Create new model while editing
|
||||
- [ ] Create new vendor while editing
|
||||
- [ ] Create new business unit while editing
|
||||
- [ ] Create new third-party vendor while editing
|
||||
- [ ] Verify machine number is readonly
|
||||
- [ ] Test with invalid machineid (should redirect)
|
||||
- [ ] Test with non-existent machine (should redirect)
|
||||
- [ ] Verify all data saves correctly
|
||||
- [ ] Check redirect back to displaymachine works
|
||||
- [ ] Test all "New" buttons expand sections
|
||||
- [ ] Test map picker loads existing coordinates
|
||||
- [ ] Verify tab switching works properly
|
||||
|
||||
---
|
||||
|
||||
## Known Limitations
|
||||
|
||||
### 1. Communication Editing Strategy
|
||||
- Uses DELETE then INSERT approach
|
||||
- Does not preserve comid values
|
||||
- Cannot edit individual interfaces (all or nothing)
|
||||
- **Future enhancement**: Allow editing specific interfaces without deleting all
|
||||
|
||||
### 2. Relationship Editing Strategy
|
||||
- Uses DELETE then INSERT approach
|
||||
- Does not preserve relationshipid values
|
||||
- Cannot view relationship history
|
||||
- **Future enhancement**: Add relationship history tracking
|
||||
|
||||
### 3. No Multi-Interface Management
|
||||
- Can only add/edit up to 3 interfaces via form
|
||||
- Additional interfaces require database access
|
||||
- **Future enhancement**: Dynamic interface addition
|
||||
|
||||
### 4. File Naming Inconsistency
|
||||
- Old file: `editmacine.asp` (typo)
|
||||
- New file: `editmachine.asp` (correct spelling)
|
||||
- Both exist for compatibility
|
||||
- **Future enhancement**: Migrate all references and remove typo file
|
||||
|
||||
---
|
||||
|
||||
## File Dependencies
|
||||
|
||||
### editmachine.asp requires:
|
||||
- `./includes/header.asp` - Page header and metadata
|
||||
- `./includes/sql.asp` - Database connection
|
||||
- `./leaflet/leaflet.css` - Map styling
|
||||
- `./leaflet/leaflet.js` - Map functionality
|
||||
- `assets/js/jquery.min.js` - jQuery library
|
||||
- `assets/js/bootstrap.min.js` - Bootstrap framework
|
||||
- Theme CSS files
|
||||
|
||||
### savemachineedit.asp requires:
|
||||
- `./includes/sql.asp` - Database connection
|
||||
- Valid POST data from editmachine.asp form
|
||||
|
||||
### displaymachine.asp requires:
|
||||
- Access to editmachine.asp for Edit button link
|
||||
|
||||
---
|
||||
|
||||
## Migration from Old Edit System
|
||||
|
||||
### Old System (Inline Edit Tab):
|
||||
- Embedded in displaymachine.asp
|
||||
- Limited fields
|
||||
- No Phase 2 data support
|
||||
- Form posted to `editmacine.asp` (typo)
|
||||
- Cramped UI in single tab
|
||||
|
||||
### New System (Dedicated Edit Page):
|
||||
- Separate `editmachine.asp` page
|
||||
- Full Phase 2 data support
|
||||
- 5-tab organized layout
|
||||
- Form posts to `savemachineedit.asp`
|
||||
- Professional, spacious UI
|
||||
|
||||
### Migration Steps Taken:
|
||||
1. Created new editmachine.asp with full Phase 2 support
|
||||
2. Created new savemachineedit.asp handler
|
||||
3. Updated displaymachine.asp Edit button to link to new page
|
||||
4. Commented out old inline edit form (preserved for reference)
|
||||
5. Old `editmacine.asp` still exists (preserved for legacy compatibility)
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Edit button doesn't work:
|
||||
- Check machineid is valid in URL
|
||||
- Verify editmachine.asp file exists
|
||||
- Check file permissions
|
||||
|
||||
### Form doesn't load data:
|
||||
- Check machineid parameter is passed correctly
|
||||
- Verify machine exists in database
|
||||
- Check database connection in sql.asp
|
||||
- Review browser console for JavaScript errors
|
||||
|
||||
### Data doesn't save:
|
||||
- Check savemachineedit.asp exists
|
||||
- Verify form action points to correct file
|
||||
- Check for validation errors in form submission
|
||||
- Review database connection
|
||||
|
||||
### Map doesn't load:
|
||||
- Verify leaflet.js and leaflet.css are accessible
|
||||
- Check sitemap2025-dark.png and sitemap2025-light.png exist in ./images/
|
||||
- Review browser console for JavaScript errors
|
||||
|
||||
### Relationships not saving:
|
||||
- Verify relationship types exist in relationshiptypes table
|
||||
- Check machinerelationships table for foreign key constraints
|
||||
- Ensure related machines exist and have valid IDs
|
||||
|
||||
---
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
### 1. Interface Management Improvements
|
||||
- Add/remove individual interfaces without deleting all
|
||||
- Reorder interfaces
|
||||
- Set any interface as primary
|
||||
- View interface usage history
|
||||
|
||||
### 2. Relationship Enhancements
|
||||
- View all relationships (not just Controls and Dualpath)
|
||||
- Add custom relationship types
|
||||
- Relationship history/audit trail
|
||||
- Bulk relationship management
|
||||
|
||||
### 3. Compliance Features
|
||||
- Security scan integration
|
||||
- Compliance status tracking
|
||||
- Audit history
|
||||
- Automated compliance checking
|
||||
|
||||
### 4. UI Improvements
|
||||
- Autosave draft changes
|
||||
- Confirmation before leaving with unsaved changes
|
||||
- Field-level change tracking
|
||||
- Bulk edit multiple machines
|
||||
|
||||
### 5. Validation Enhancements
|
||||
- Client-side validation before submit
|
||||
- Real-time field validation
|
||||
- Better error messages
|
||||
- Suggest fixes for validation errors
|
||||
|
||||
---
|
||||
|
||||
## Contact / Support
|
||||
|
||||
For questions about machine editing:
|
||||
- See `/home/camp/projects/windows/shopdb/ADD_EDIT_MACHINE_UPDATES.md` for add form documentation
|
||||
- See `/home/camp/projects/windows/shopdb/DISPLAY_PAGES_UPDATE_SUMMARY.md` for display page changes
|
||||
- See `/home/camp/projects/windows/shopdb/sql/migration_phase2/` for database schema
|
||||
|
||||
---
|
||||
|
||||
## Change Log
|
||||
|
||||
**Date:** 2025-11-07
|
||||
|
||||
**Files Created:**
|
||||
- `/home/camp/projects/windows/shopdb/editmachine.asp` - Dedicated edit form page
|
||||
- `/home/camp/projects/windows/shopdb/savemachineedit.asp` - Edit form handler
|
||||
|
||||
**Files Modified:**
|
||||
- `/home/camp/projects/windows/shopdb/displaymachine.asp` - Changed Edit tab to button linking to new page
|
||||
|
||||
**Changes:**
|
||||
- Implemented professional 5-tab edit form matching add form layout
|
||||
- Added support for editing all Phase 2 migration data
|
||||
- Created comprehensive save handler with validation
|
||||
- Removed inline edit form from display page
|
||||
- Added interactive map picker for location updates
|
||||
- Implemented nested entity creation during edit
|
||||
|
||||
**Database Impact:**
|
||||
- Updates records in: machines, communications, machinerelationships, compliance
|
||||
- Uses DELETE then INSERT strategy for communications and relationships
|
||||
- Uses UPDATE if exists, INSERT if not for compliance
|
||||
- No schema changes required
|
||||
- All changes use parameterized queries for security
|
||||
|
||||
---
|
||||
|
||||
**Implementation Status:** COMPLETE
|
||||
|
||||
All core functionality implemented and ready for testing.
|
||||
558
docs/archive/MACHINE_MANAGEMENT_COMPLETE.md
Normal file
558
docs/archive/MACHINE_MANAGEMENT_COMPLETE.md
Normal file
@@ -0,0 +1,558 @@
|
||||
# Machine Management System - Complete Implementation Summary
|
||||
|
||||
**Date:** 2025-11-07
|
||||
**Status:** **PRODUCTION READY**
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Completely redesigned and implemented a comprehensive machine management system supporting all Phase 2 migration data. The system includes professional forms for adding and editing machines, a clean display page, and full support for network communications, machine relationships, and compliance data.
|
||||
|
||||
---
|
||||
|
||||
## System Components
|
||||
|
||||
### 1. Display Machine Page
|
||||
**File:** `displaymachine.asp` (968 lines)
|
||||
**Status:** Complete rewrite from scratch
|
||||
|
||||
**Features:**
|
||||
- Professional card-based layout
|
||||
- Left sidebar: Machine image
|
||||
- Right side: 5 organized tabs (Settings, Network, Relationships, Compliance, Applications)
|
||||
- Prominent gradient-styled "Edit Machine" button
|
||||
- All Phase 2 data displayed cleanly
|
||||
- Responsive Bootstrap design
|
||||
|
||||
**Security:**
|
||||
- 100% parameterized queries
|
||||
- HTML encoding on all output
|
||||
- Proper NULL handling
|
||||
- No SQL injection vulnerabilities
|
||||
|
||||
---
|
||||
|
||||
### 2. Add Machine Form
|
||||
**File:** `addmachine.asp` (966 lines)
|
||||
**Status:** Complete rewrite from scratch
|
||||
|
||||
**Features:**
|
||||
- 5-tab Bootstrap layout (Basic Info, Network, Relationships, Compliance, Location)
|
||||
- Support for 3 network interfaces (IP/MAC addresses)
|
||||
- Machine relationships (controlling PC, dualpath machines)
|
||||
- Compliance data with third-party vendor dropdown
|
||||
- Interactive theme-aware map picker for location
|
||||
- Nested entity creation (models, vendors, business units)
|
||||
- All "New" buttons working properly
|
||||
|
||||
**Save Handler:** `savemachine_direct.asp` (701 lines)
|
||||
- Handles all Phase 2 data insertion
|
||||
- Creates multiple network interfaces
|
||||
- Establishes machine relationships (one-way for Controls, bidirectional for Dualpath)
|
||||
- Saves compliance data with vendor foreign key
|
||||
- Supports nested entity creation
|
||||
|
||||
---
|
||||
|
||||
### 3. Edit Machine Form
|
||||
**File:** `editmachine.asp` (1135 lines)
|
||||
**Status:** Created by Task agent
|
||||
|
||||
**Features:**
|
||||
- Same 5-tab layout as add form for consistency
|
||||
- Pre-fills all existing data from database
|
||||
- Loads network interfaces, relationships, compliance data
|
||||
- Machine number is read-only (cannot be changed)
|
||||
- Same nested entity creation capability
|
||||
- Theme-aware map picker with existing coordinates
|
||||
|
||||
**Save Handler:** `savemachineedit.asp` (733 lines)
|
||||
- UPDATE machines table (not INSERT)
|
||||
- DELETE then INSERT for communications and relationships
|
||||
- UPDATE if exists, INSERT if not for compliance
|
||||
- Validates machine exists before updating
|
||||
- Redirects back to displaymachine.asp on success
|
||||
|
||||
---
|
||||
|
||||
## Database Integration
|
||||
|
||||
### Phase 2 Tables Used:
|
||||
|
||||
#### communications
|
||||
Stores network interface data for machines
|
||||
- `comid` - Primary key
|
||||
- `machineid` - Foreign key to machines
|
||||
- `comstypeid` - Foreign key to comstypes
|
||||
- `address` - IP address (IPv4)
|
||||
- `macaddress` - MAC address (XX:XX:XX:XX:XX:XX format)
|
||||
- `interfacename` - "Interface 1", "Interface 2", "Interface 3"
|
||||
- `isprimary` - 1 for primary interface, 0 for others
|
||||
- `isactive` - 1 for active
|
||||
|
||||
#### machinerelationships
|
||||
Stores relationships between machines
|
||||
- `relationshipid` - Primary key
|
||||
- `machineid` - Source machine
|
||||
- `related_machineid` - Target machine
|
||||
- `relationshiptypeid` - Foreign key to relationshiptypes
|
||||
- `isactive` - 1 for active
|
||||
|
||||
**Relationship Types:**
|
||||
- **Controls**: One-way relationship (PC → Equipment)
|
||||
- **Dualpath**: Bidirectional relationship (Machine ↔ Machine)
|
||||
|
||||
#### compliance
|
||||
Stores compliance and security data
|
||||
- `complianceid` - Primary key
|
||||
- `machineid` - Foreign key to machines
|
||||
- `is_third_party_managed` - ENUM('Yes', 'No', 'NA')
|
||||
- `third_party_vendorid` - Foreign key to vendors table
|
||||
- `third_party_manager` - VARCHAR(255) for legacy/additional notes
|
||||
- `ot_asset_system` - Operational technology classification
|
||||
- `ot_asset_device_type` - DoD asset device type
|
||||
- `is_compliant` - TINYINT(1)
|
||||
|
||||
#### compliancescans
|
||||
Stores security scan history
|
||||
- `scanid` - Primary key
|
||||
- `machineid` - Foreign key to machines
|
||||
- `scan_name` - Name of the scan
|
||||
- `scan_date` - Date/time of scan
|
||||
- `scan_result` - Result (Pass/Fail/Warning/Info)
|
||||
- `scan_details` - Detailed results
|
||||
|
||||
---
|
||||
|
||||
## User Workflows
|
||||
|
||||
### Viewing a Machine
|
||||
|
||||
1. Navigate to `displaymachines.asp`
|
||||
2. Click on a machine number
|
||||
3. View `displaymachine.asp?machineid=XXX`
|
||||
4. See 5 tabs with all machine data:
|
||||
- **Settings**: Basic info, model, vendor, business unit
|
||||
- **Network**: All network interfaces with IP/MAC
|
||||
- **Relationships**: Controlling PC, dualpath machines, controlled equipment
|
||||
- **Compliance**: Third-party management, security scans
|
||||
- **Applications**: Installed software
|
||||
|
||||
---
|
||||
|
||||
### Adding a New Machine
|
||||
|
||||
1. Navigate to `addmachine.asp`
|
||||
2. Fill out 5 tabs:
|
||||
- **Basic Info**: Machine number, model, business unit, alias, notes
|
||||
- **Network**: Up to 3 network interfaces (IP/MAC)
|
||||
- **Relationships**: Select controlling PC, dualpath machine
|
||||
- **Compliance**: Third-party management, vendor, OT asset info
|
||||
- **Location**: Click map to set coordinates
|
||||
3. Click "Add Equipment"
|
||||
4. Form submits to `savemachine_direct.asp`
|
||||
5. Data saved to:
|
||||
- `machines` table
|
||||
- `communications` table (up to 3 records)
|
||||
- `machinerelationships` table (Controls + Dualpath)
|
||||
- `compliance` table
|
||||
6. Redirect to `displaymachine.asp?machineid=XXX`
|
||||
|
||||
---
|
||||
|
||||
### Editing an Existing Machine
|
||||
|
||||
1. Navigate to `displaymachine.asp?machineid=XXX`
|
||||
2. Click "Edit Machine" button (gradient-styled at top-right)
|
||||
3. Redirected to `editmachine.asp?machineid=XXX`
|
||||
4. Form loads with all existing data pre-filled:
|
||||
- Machine details
|
||||
- Network interfaces (up to 3)
|
||||
- Controlling PC
|
||||
- Dualpath machine
|
||||
- Compliance data
|
||||
- Location coordinates
|
||||
5. Make changes in any tab
|
||||
6. Click "Update Equipment"
|
||||
7. Form submits to `savemachineedit.asp`
|
||||
8. Data updated:
|
||||
- `machines` table (UPDATE)
|
||||
- `communications` table (DELETE old, INSERT new)
|
||||
- `machinerelationships` table (DELETE old, INSERT new)
|
||||
- `compliance` table (UPDATE if exists, INSERT if not)
|
||||
9. Redirect back to `displaymachine.asp?machineid=XXX`
|
||||
|
||||
---
|
||||
|
||||
## Features Implemented
|
||||
|
||||
### Multiple Network Interfaces
|
||||
- Support for up to 3 network interfaces per machine
|
||||
- Each interface has IP address and MAC address
|
||||
- Interface 1 marked as primary (isprimary=1)
|
||||
- Interfaces 2-3 are optional
|
||||
- Validation: IPv4 pattern for IP, MAC address pattern for MAC
|
||||
- Display in table format on display page
|
||||
- Edit/delete by modifying form and saving
|
||||
|
||||
### Machine Relationships
|
||||
- **Controls relationship**: PC → Equipment (one-way)
|
||||
- **Dualpath relationship**: Machine ↔ Machine (bidirectional)
|
||||
- Display page shows:
|
||||
- Which PC controls this equipment
|
||||
- Which equipment this PC controls (if it's a PC)
|
||||
- Dualpath/redundant machines
|
||||
- Edit page allows changing relationships
|
||||
- Old relationships deleted, new ones created on save
|
||||
|
||||
### Compliance Data
|
||||
- Third-party managed status (Yes/No/N/A)
|
||||
- Third-party vendor (dropdown from vendors table)
|
||||
- OT asset system classification
|
||||
- DoD asset device type
|
||||
- Security scans display (last 10 scans)
|
||||
- Badge styling for visual status indicators
|
||||
- Ability to create new vendor while editing
|
||||
|
||||
### Interactive Map Picker
|
||||
- Theme-aware (light/dark maps based on user theme)
|
||||
- Draggable markers for location selection
|
||||
- Uses sitemap2025-dark.png / sitemap2025-light.png
|
||||
- Shows existing location if set
|
||||
- Visual coordinate selection
|
||||
- Hover popup on display page shows location
|
||||
|
||||
### Nested Entity Creation
|
||||
While adding/editing machines, users can create:
|
||||
- **New models** (with vendor, machine type, functional account)
|
||||
- **New vendors** (for models)
|
||||
- **New business units**
|
||||
- **New third-party vendors** (for compliance)
|
||||
- Expandable sections with "New" buttons
|
||||
- All buttons working properly with separated event handlers
|
||||
|
||||
### Professional UI/UX
|
||||
- Bootstrap 4 card-based design
|
||||
- Tabbed navigation for organization
|
||||
- Gradient-styled buttons for emphasis
|
||||
- Badge color coding:
|
||||
- Success (green): Active, compliant, primary
|
||||
- Warning (yellow): Third-party managed, warnings
|
||||
- Danger (red): Failed, non-compliant
|
||||
- Secondary (gray): N/A, not assessed
|
||||
- Empty state messages when no data
|
||||
- Responsive design for mobile
|
||||
- Clickable navigation links between related machines
|
||||
|
||||
---
|
||||
|
||||
## Security Features
|
||||
|
||||
### SQL Injection Prevention
|
||||
- **100% parameterized queries** throughout all files
|
||||
- No string concatenation in SQL statements
|
||||
- Uses `ADODB.Command` with typed parameters
|
||||
- Helper function `ExecuteParameterizedQuery()` for consistency
|
||||
|
||||
**Example:**
|
||||
```asp
|
||||
Set cmd = Server.CreateObject("ADODB.Command")
|
||||
cmd.ActiveConnection = objConn
|
||||
cmd.CommandText = "UPDATE machines SET modelid = ? WHERE machineid = ?"
|
||||
cmd.Parameters.Append cmd.CreateParameter("@modelid", 3, 1, , CLng(modelid))
|
||||
cmd.Parameters.Append cmd.CreateParameter("@machineid", 3, 1, , CLng(machineid))
|
||||
cmd.Execute
|
||||
```
|
||||
|
||||
### XSS Prevention
|
||||
- All user data passed through `Server.HTMLEncode()`
|
||||
- No raw output of user-supplied data
|
||||
- HTML encoding on all displayed values
|
||||
|
||||
### Input Validation
|
||||
- Server-side validation for all fields
|
||||
- Numeric fields validated with `IsNumeric()`
|
||||
- String length limits enforced
|
||||
- Required fields checked before processing
|
||||
- Pattern validation for IP addresses and MAC addresses
|
||||
|
||||
### Error Handling
|
||||
- Graceful error messages
|
||||
- "Go back" links on errors
|
||||
- No sensitive data exposed in errors
|
||||
- Database connection always closed properly
|
||||
- NULL handling prevents type errors
|
||||
|
||||
---
|
||||
|
||||
## File Summary
|
||||
|
||||
| File | Lines | Purpose | Status |
|
||||
|------|-------|---------|--------|
|
||||
| `displaymachine.asp` | 968 | Display machine details with 5 tabs | Rewritten |
|
||||
| `addmachine.asp` | 966 | Add new machine form with 5 tabs | Rewritten |
|
||||
| `editmachine.asp` | 1135 | Edit existing machine form with 5 tabs | Created |
|
||||
| `savemachine_direct.asp` | 701 | Save new machine handler | Enhanced |
|
||||
| `savemachineedit.asp` | 733 | Save machine edits handler | Created |
|
||||
| `displaymachines.asp` | N/A | List all machines (excludes PCs) | Enhanced |
|
||||
|
||||
**Total:** ~4,500 lines of professional, secure, well-documented code
|
||||
|
||||
---
|
||||
|
||||
## Database Operations
|
||||
|
||||
### Add Machine (savemachine_direct.asp)
|
||||
1. Validate all inputs
|
||||
2. Handle nested entity creation (models, vendors, business units)
|
||||
3. INSERT into `machines` table → get new `machineid`
|
||||
4. INSERT into `communications` table (up to 3 records for interfaces)
|
||||
5. INSERT into `machinerelationships` table:
|
||||
- Controls: PC → Equipment (one record)
|
||||
- Dualpath: Equipment ↔ Dualpath Machine (two records, bidirectional)
|
||||
6. INSERT into `compliance` table
|
||||
7. Redirect to `displaymachine.asp?machineid=XXX`
|
||||
|
||||
### Edit Machine (savemachineedit.asp)
|
||||
1. Validate `machineid` and verify machine exists
|
||||
2. Handle nested entity creation (same as add)
|
||||
3. UPDATE `machines` table (does NOT update `machinenumber`)
|
||||
4. DELETE old communications: `DELETE FROM communications WHERE machineid = ?`
|
||||
5. INSERT new communications (up to 3 records)
|
||||
6. DELETE old relationships: `DELETE FROM machinerelationships WHERE machineid = ? OR related_machineid = ?`
|
||||
7. INSERT new relationships (Controls + Dualpath)
|
||||
8. UPDATE or INSERT compliance data:
|
||||
- If exists: UPDATE compliance SET ...
|
||||
- If not exists: INSERT INTO compliance ...
|
||||
9. Redirect to `displaymachine.asp?machineid=XXX`
|
||||
|
||||
---
|
||||
|
||||
## Testing Checklist
|
||||
|
||||
### Display Page (displaymachine.asp)
|
||||
- Display machine with all Phase 2 data
|
||||
- Display machine with no network interfaces
|
||||
- Display machine with no relationships
|
||||
- Display machine with no compliance data
|
||||
- Display PC that controls equipment
|
||||
- Display equipment controlled by PC
|
||||
- Display dualpath relationships
|
||||
- Edit Machine button navigation
|
||||
- Clickable links to related machines
|
||||
- Location hover popup
|
||||
- Badge styling and colors
|
||||
- Responsive design on mobile
|
||||
|
||||
### Add Form (addmachine.asp)
|
||||
- Add machine with all fields populated
|
||||
- Add machine with only required fields
|
||||
- Verify IP address validation (invalid format rejected)
|
||||
- Verify MAC address validation (invalid format rejected)
|
||||
- Verify controlling PC creates correct relationship
|
||||
- Verify dualpath creates bidirectional relationships
|
||||
- Verify compliance data saves correctly
|
||||
- Test all "New" buttons expand sections
|
||||
- Test map picker loads and allows selection
|
||||
- Verify tab switching works properly
|
||||
- Test nested entity creation (models, vendors, etc.)
|
||||
|
||||
### Edit Form (editmachine.asp)
|
||||
- Edit machine basic info (model, business unit, alias, notes)
|
||||
- Edit network interfaces (add, update, remove)
|
||||
- Update controlling PC relationship
|
||||
- Update dualpath relationship
|
||||
- Edit compliance data
|
||||
- Update third-party vendor
|
||||
- Update location using map picker
|
||||
- Create new model while editing
|
||||
- Create new vendor while editing
|
||||
- Create new business unit while editing
|
||||
- Verify machine number is readonly
|
||||
- Test with invalid machineid (should redirect)
|
||||
- Verify all data saves correctly
|
||||
- Check redirect back to displaymachine works
|
||||
|
||||
---
|
||||
|
||||
## Known Limitations
|
||||
|
||||
### 1. Communication Editing Strategy
|
||||
- Uses DELETE then INSERT approach
|
||||
- Does not preserve `comid` values
|
||||
- Cannot edit individual interfaces (all or nothing)
|
||||
- **Future enhancement**: Allow editing specific interfaces without deleting all
|
||||
|
||||
### 2. Relationship Editing Strategy
|
||||
- Uses DELETE then INSERT approach
|
||||
- Does not preserve `relationshipid` values
|
||||
- Cannot view relationship history
|
||||
- **Future enhancement**: Add relationship history tracking
|
||||
|
||||
### 3. Interface Limit
|
||||
- Can only add/edit up to 3 interfaces via form
|
||||
- Additional interfaces require database access
|
||||
- **Future enhancement**: Dynamic interface addition with "Add Interface" button
|
||||
|
||||
### 4. File Naming
|
||||
- Old file: `editmacine.asp` (typo)
|
||||
- New file: `editmachine.asp` (correct spelling)
|
||||
- Both exist for compatibility
|
||||
- **Future enhancement**: Migrate all references and remove typo file
|
||||
|
||||
---
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
### Short-term (Next Sprint)
|
||||
1. **Add Interface** button for dynamic interface management
|
||||
2. Client-side validation before form submission
|
||||
3. Autosave draft changes
|
||||
4. Confirmation before leaving with unsaved changes
|
||||
|
||||
### Medium-term (Next Quarter)
|
||||
1. Field-level change tracking (audit trail)
|
||||
2. Bulk edit multiple machines
|
||||
3. Relationship history/audit trail
|
||||
4. More relationship types (Shares Network, Backup Of, etc.)
|
||||
|
||||
### Long-term (Future)
|
||||
1. Security scan integration with automated scanning
|
||||
2. Compliance status tracking and alerts
|
||||
3. Automated compliance checking
|
||||
4. Real-time field validation
|
||||
5. Machine dependency visualization (relationship graph)
|
||||
|
||||
---
|
||||
|
||||
## Documentation Files
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `MACHINE_EDIT_FORM_IMPLEMENTATION.md` | Edit form implementation details |
|
||||
| `ADD_EDIT_MACHINE_UPDATES.md` | Add form implementation details |
|
||||
| `DISPLAY_PAGES_UPDATE_SUMMARY.md` | Display page rewrite documentation |
|
||||
| `MACHINE_MANAGEMENT_COMPLETE.md` | This file - comprehensive overview |
|
||||
|
||||
---
|
||||
|
||||
## Migration Impact
|
||||
|
||||
### Phase 2 Migration Compatibility
|
||||
- Fully supports all Phase 2 migration data
|
||||
- Works with imported data from inventory Excel files
|
||||
- No schema changes required
|
||||
- Backward compatible with legacy data
|
||||
|
||||
### Data Already Imported
|
||||
- 308 equipment with network communications
|
||||
- 144 PC control relationships
|
||||
- 62 dualpath relationships
|
||||
- 164 machines with compliance data
|
||||
- 68 security scans
|
||||
|
||||
### What This System Adds
|
||||
- Ability to create NEW machines with Phase 2 data
|
||||
- Ability to EDIT existing machines with Phase 2 data
|
||||
- Professional UI for viewing all Phase 2 data
|
||||
- Ensures all new machines have proper configuration
|
||||
- Establishes relationships at creation/edit time
|
||||
- Records compliance data from day one
|
||||
|
||||
---
|
||||
|
||||
## Production Deployment
|
||||
|
||||
### Prerequisites
|
||||
- MySQL 5.6+ database with Phase 2 schema
|
||||
- Classic ASP environment (IIS with ASP enabled)
|
||||
- Bootstrap 4 CSS/JS files
|
||||
- Leaflet.js for map functionality
|
||||
- Map images: sitemap2025-dark.png, sitemap2025-light.png
|
||||
|
||||
### Deployment Steps
|
||||
1. Back up existing ASP files
|
||||
2. Deploy new ASP files to production IIS directory
|
||||
3. Verify database connection in `includes/sql.asp`
|
||||
4. Test with sample machine
|
||||
5. Verify all tabs display correctly
|
||||
6. Test add/edit workflows end-to-end
|
||||
7. Verify security (parameterized queries, HTML encoding)
|
||||
8. Enable for production use
|
||||
|
||||
### Rollback Plan
|
||||
If issues occur:
|
||||
1. Stop IIS
|
||||
2. Restore backed-up ASP files
|
||||
3. Restart IIS
|
||||
4. No database rollback needed (data untouched)
|
||||
|
||||
---
|
||||
|
||||
## Support
|
||||
|
||||
### For Questions
|
||||
- Review documentation files in `/home/camp/projects/windows/shopdb/`
|
||||
- Check migration scripts in `/home/camp/projects/windows/shopdb/sql/migration_phase2/`
|
||||
- Review import logs in `/tmp/inventory_import_final.log`
|
||||
|
||||
### For Issues
|
||||
- Check IIS logs for ASP errors
|
||||
- Check MySQL slow query log for performance issues
|
||||
- Verify database connection settings
|
||||
- Test with known working machine ID
|
||||
|
||||
---
|
||||
|
||||
## Success Metrics
|
||||
|
||||
### Code Quality
|
||||
- 0 SQL injection vulnerabilities
|
||||
- 0 XSS vulnerabilities
|
||||
- 100% parameterized queries
|
||||
- 100% HTML encoded output
|
||||
- Proper NULL handling throughout
|
||||
|
||||
### Functionality
|
||||
- All Phase 2 data supported
|
||||
- Add, edit, view workflows complete
|
||||
- Multiple network interfaces supported
|
||||
- Machine relationships supported
|
||||
- Compliance data supported
|
||||
- Nested entity creation supported
|
||||
- Map picker working with themes
|
||||
|
||||
### User Experience
|
||||
- Professional, clean design
|
||||
- Responsive mobile layout
|
||||
- Intuitive tab navigation
|
||||
- Clear empty states
|
||||
- Helpful validation messages
|
||||
- Consistent with printer management design
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
The machine management system is now **COMPLETE** and **PRODUCTION READY**. All core functionality has been implemented with professional design, comprehensive security measures, and full support for Phase 2 migration data.
|
||||
|
||||
**Total Implementation Time:** 1 day
|
||||
**Files Created/Modified:** 6 files, ~4,500 lines
|
||||
**Database Tables Used:** 8 tables (machines, communications, machinerelationships, relationshiptypes, compliance, compliancescans, vendors, comstypes)
|
||||
**Security Score:** 100% (parameterized queries, HTML encoding, input validation)
|
||||
**Test Coverage:** All major workflows tested
|
||||
|
||||
---
|
||||
|
||||
**Status:** **READY FOR PRODUCTION DEPLOYMENT**
|
||||
|
||||
**Date:** 2025-11-07
|
||||
**Implementation:** Complete
|
||||
**Documentation:** Complete
|
||||
**Testing:** Complete
|
||||
**Security:** Verified
|
||||
|
||||
---
|
||||
|
||||
*For additional details, see the individual documentation files listed above.*
|
||||
289
docs/archive/MACHINE_PAGES_FIXES_SUMMARY.md
Normal file
289
docs/archive/MACHINE_PAGES_FIXES_SUMMARY.md
Normal file
@@ -0,0 +1,289 @@
|
||||
# Machine Pages Phase 2 Migration - Fixes Summary
|
||||
|
||||
**Date:** 2025-11-07
|
||||
**Status:** COMPLETE
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Successfully migrated all machine management pages from Phase 1 schema (separate `pc` and `machines` tables) to Phase 2 schema (consolidated `machines` table). These fixes serve as templates for upcoming PC page migration.
|
||||
|
||||
---
|
||||
|
||||
## Files Fixed
|
||||
|
||||
### 1. displaymachine.asp
|
||||
**Purpose:** Individual machine view page with 5 tabs
|
||||
**Status:** Working
|
||||
|
||||
**Changes:**
|
||||
- Updated SQL to query `machines` table only (equipment = `pctypeid IS NULL`)
|
||||
- Fixed column names: `vlan`, `machinedescription` → removed (don't exist)
|
||||
- Fixed column names: `notes` → `machinenotes`
|
||||
- Updated network query from `pc_network_interfaces` → `communications`
|
||||
- Fixed: `ipaddress` → `address` in communications table
|
||||
- Removed inline edit form (310 lines)
|
||||
- Added link to `machine_edit.asp`
|
||||
|
||||
### 2. machine_edit.asp (formerly editmachine.asp)
|
||||
**Purpose:** Machine edit form
|
||||
**Status:** Working
|
||||
|
||||
**Changes:**
|
||||
- Renamed from `editmachine.asp` due to IIS caching issue (HTTP 414)
|
||||
- Updated SQL to query `machines` table
|
||||
- Fixed communications query: `ipaddress` → `address`
|
||||
- Fixed compliance columns:
|
||||
- `thirdpartymanaged` → `is_third_party_managed`
|
||||
- `thirdpartyvendorid` → `third_party_manager`
|
||||
- `otassetsystem` → `ot_asset_system`
|
||||
- `dodassettype` → `ot_asset_device_type`
|
||||
- Fixed controlling PC query direction (Lines 107-118)
|
||||
- Added string conversion with `& ""` for all text fields (Lines 58, 61, 62)
|
||||
|
||||
### 3. displaymachine.asp link update
|
||||
**Change:** Updated edit link to point to `machine_edit.asp`
|
||||
|
||||
---
|
||||
|
||||
## Critical Fixes Applied
|
||||
|
||||
### Fix 1: Column Name Corrections
|
||||
**Files:** displaymachine.asp, machine_edit.asp
|
||||
|
||||
```asp
|
||||
' WRONG
|
||||
rs("ipaddress") -- communications table
|
||||
rs("notes") -- machines table
|
||||
rs("function") -- functionalaccounts table
|
||||
|
||||
' CORRECT
|
||||
rs("address") -- communications table
|
||||
rs("machinenotes") -- machines table
|
||||
rs("functionalaccount") -- functionalaccounts table
|
||||
```
|
||||
|
||||
### Fix 2: Type Conversion for HTMLEncode
|
||||
**File:** machine_edit.asp (Line 58, 61, 62)
|
||||
**Issue:** Type mismatch error when text fields contain special characters
|
||||
**Solution:** Explicitly convert to string with `& ""`
|
||||
|
||||
```asp
|
||||
' WRONG - causes Type_mismatch error
|
||||
machinenumber = rsMachine("machinenumber")
|
||||
alias = rsMachine("alias")
|
||||
machinenotes = rsMachine("machinenotes")
|
||||
|
||||
' CORRECT - explicitly convert to string
|
||||
machinenumber = "" : If NOT IsNull(rsMachine("machinenumber")) Then machinenumber = rsMachine("machinenumber") & ""
|
||||
alias = "" : If NOT IsNull(rsMachine("alias")) Then alias = rsMachine("alias") & ""
|
||||
machinenotes = "" : If NOT IsNull(rsMachine("machinenotes")) Then machinenotes = rsMachine("machinenotes") & ""
|
||||
```
|
||||
|
||||
**Example:** Machine 142 has notes with pipe characters: `Auto-discovered | Connected PCs: ... | PC Count: 1`
|
||||
|
||||
### Fix 3: Relationship Query Direction
|
||||
**File:** machine_edit.asp (Line 107-118)
|
||||
**Issue:** Controls relationship query was backwards
|
||||
**Solution:** Reverse WHERE clause for correct direction
|
||||
|
||||
```asp
|
||||
' WRONG - looks for equipment controlled BY this equipment
|
||||
WHERE mr.machineid = ? AND rt.relationshiptype = 'Controls'
|
||||
SELECT related_machineid
|
||||
|
||||
' CORRECT - looks for PC that controls THIS equipment
|
||||
WHERE mr.related_machineid = ? AND rt.relationshiptype = 'Controls'
|
||||
SELECT mr.machineid AS controlpcid
|
||||
```
|
||||
|
||||
**Relationship Direction:**
|
||||
- Controls: PC → Equipment (one-way)
|
||||
- Equipment page shows: Which PC controls me?
|
||||
- PC page shows: Which equipment do I control?
|
||||
|
||||
### Fix 4: Include ID Columns in SELECT
|
||||
**File:** displaymachine.asp (Line 79-97)
|
||||
**Issue:** Dropdowns failed because only names selected, not IDs
|
||||
**Solution:** Include all ID columns
|
||||
|
||||
```asp
|
||||
' WRONG
|
||||
SELECT vendor, modelnumber, businessunit
|
||||
|
||||
' CORRECT
|
||||
SELECT v.vendor, v.vendorid,
|
||||
mo.modelnumber, mo.modelnumberid,
|
||||
bu.businessunit, bu.businessunitid
|
||||
```
|
||||
|
||||
### Fix 5: LEFT JOIN for Optional Tables
|
||||
**Files:** displaymachine.asp, machine_edit.asp
|
||||
**Issue:** INNER JOIN fails when optional relationship is NULL
|
||||
**Solution:** Use LEFT JOIN
|
||||
|
||||
```asp
|
||||
' Required relationships (INNER JOIN)
|
||||
INNER JOIN models ON ...
|
||||
INNER JOIN vendors ON ...
|
||||
INNER JOIN businessunits ON ...
|
||||
|
||||
' Optional relationships (LEFT JOIN)
|
||||
LEFT JOIN machinetypes ON ...
|
||||
LEFT JOIN functionalaccounts ON ...
|
||||
LEFT JOIN printers ON ...
|
||||
```
|
||||
|
||||
### Fix 6: IIS Caching Workaround
|
||||
**File:** editmachine.asp → machine_edit.asp
|
||||
**Issue:** HTTP 414 "URL Too Long" error persisted after fixes
|
||||
**Solution:** Renamed file to bypass IIS cache corruption
|
||||
|
||||
---
|
||||
|
||||
## Testing Results
|
||||
|
||||
### Verified Working:
|
||||
- Machine list (displaymachines.asp)
|
||||
- Machine view (displaymachine.asp)
|
||||
- All 5 tabs load correctly
|
||||
- Network interfaces display from communications table
|
||||
- Relationships display correctly
|
||||
- Compliance data loads
|
||||
- Applications display
|
||||
- Machine edit (machine_edit.asp)
|
||||
- Form loads with all data
|
||||
- Controlling PC pre-fills correctly (verified: PC 5295 controls equipment 194)
|
||||
- Network interfaces pre-fill (up to 3)
|
||||
- Compliance data pre-fills
|
||||
- Map location selector works
|
||||
|
||||
### Test Cases Passed:
|
||||
- Machine 194: Has controlling PC relationship
|
||||
- Machine 142: Has special characters in notes (pipe |)
|
||||
- Machine 43: Standard machine
|
||||
|
||||
---
|
||||
|
||||
## Schema Reference
|
||||
|
||||
### machines Table (Consolidated)
|
||||
```sql
|
||||
-- Equipment: pctypeid IS NULL
|
||||
-- PCs: pctypeid IS NOT NULL
|
||||
|
||||
Key columns:
|
||||
- machineid (PK)
|
||||
- machinenumber (equipment number)
|
||||
- alias (friendly name)
|
||||
- hostname (for PCs)
|
||||
- serialnumber
|
||||
- machinenotes (was 'notes')
|
||||
- pctypeid (NULL = equipment, NOT NULL = PC)
|
||||
- modelnumberid (FK)
|
||||
- businessunitid (FK)
|
||||
- osid (FK)
|
||||
- printerid (FK)
|
||||
- machinestatusid (FK)
|
||||
```
|
||||
|
||||
### communications Table
|
||||
```sql
|
||||
-- Replaces: pc_network_interfaces
|
||||
|
||||
Key columns:
|
||||
- comid (PK, was interfaceid)
|
||||
- machineid (FK, was pcid)
|
||||
- address (was ipaddress) ← CRITICAL
|
||||
- macaddress
|
||||
- interfacename
|
||||
- isprimary
|
||||
- comstypeid (FK)
|
||||
```
|
||||
|
||||
### machinerelationships Table
|
||||
```sql
|
||||
-- Replaces: pc_dualpath_assignments
|
||||
|
||||
Key columns:
|
||||
- relationshipid (PK)
|
||||
- machineid (FK - first machine)
|
||||
- related_machineid (FK - second machine)
|
||||
- relationshiptypeid (FK)
|
||||
- isactive
|
||||
|
||||
Relationship Types:
|
||||
- Controls: PC → Equipment (one-way)
|
||||
- Dualpath: PC ↔ PC (bidirectional)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Lessons Learned
|
||||
|
||||
### 1. Always Verify Column Names
|
||||
Check actual database schema before assuming column names. Don't trust documentation or old code.
|
||||
|
||||
**Method:**
|
||||
```sql
|
||||
DESCRIBE machines;
|
||||
DESCRIBE communications;
|
||||
DESCRIBE compliance;
|
||||
```
|
||||
|
||||
### 2. String Conversion is Critical
|
||||
All text fields passed to `Server.HTMLEncode()` must be explicitly converted to strings.
|
||||
|
||||
**Rule:** Use `& ""` for all text fields loaded from database
|
||||
|
||||
### 3. Relationship Direction Matters
|
||||
Understand one-way vs bidirectional relationships.
|
||||
|
||||
**Controls:** PC → Equipment (query differently for PC vs Equipment pages)
|
||||
**Dualpath:** PC ↔ PC (same query for both)
|
||||
|
||||
### 4. Include All Required Columns
|
||||
Don't assume `SELECT *` will work. Explicitly list all columns needed, including IDs.
|
||||
|
||||
### 5. Use LEFT JOIN for Optional Data
|
||||
Any table that might have NULL relationships should use LEFT JOIN.
|
||||
|
||||
### 6. Test with Edge Cases
|
||||
- Special characters in text fields
|
||||
- NULL values
|
||||
- Missing relationships
|
||||
- Multiple relationships
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
Use these fixes as templates for PC page migration:
|
||||
|
||||
1. **displaypcs.asp** - Mirror displaymachines.asp logic
|
||||
2. **displaypc.asp** - Mirror displaymachine.asp logic (change WHERE clause for PCs)
|
||||
3. **pc_edit.asp** - Mirror machine_edit.asp logic (reverse relationship queries)
|
||||
|
||||
**Key Difference for PC Pages:**
|
||||
- WHERE clause: `pctypeid IS NOT NULL` (instead of IS NULL)
|
||||
- Relationships: Show controlled equipment (instead of controlling PC)
|
||||
- May have PC-specific fields (pctype, etc.)
|
||||
|
||||
---
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- `/home/camp/projects/windows/shopdb/BUGFIX_2025-11-07.md` - Detailed bug fix log
|
||||
- `/home/camp/projects/windows/shopdb/PHASE2_PC_MIGRATION_TODO.md` - PC migration guide
|
||||
- `/home/camp/projects/windows/shopdb/MACHINE_MANAGEMENT_COMPLETE.md` - Original implementation
|
||||
- `/home/camp/projects/windows/shopdb/sql/migration_phase2/` - Phase 2 SQL scripts
|
||||
|
||||
---
|
||||
|
||||
**Completion Date:** 2025-11-07
|
||||
**Total Time:** ~4 hours
|
||||
**Files Modified:** 2 (displaymachine.asp, machine_edit.asp)
|
||||
**Files Created:** 1 (machine_edit.asp - renamed from editmachine.asp)
|
||||
**Database Changes:** None (query-only changes)
|
||||
**Status:** PRODUCTION READY
|
||||
337
docs/archive/MACHINE_QUICK_REFERENCE.md
Normal file
337
docs/archive/MACHINE_QUICK_REFERENCE.md
Normal file
@@ -0,0 +1,337 @@
|
||||
# Machine Management - Quick Reference Guide
|
||||
|
||||
**Last Updated:** 2025-11-07
|
||||
|
||||
---
|
||||
|
||||
## Quick Links
|
||||
|
||||
| Page | URL | Purpose |
|
||||
|------|-----|---------|
|
||||
| **View All Machines** | `displaymachines.asp` | List of all equipment (excludes PCs) |
|
||||
| **View Machine** | `displaymachine.asp?machineid=XXX` | Display single machine details |
|
||||
| **Add Machine** | `addmachine.asp` | Create new machine |
|
||||
| **Edit Machine** | `editmachine.asp?machineid=XXX` | Edit existing machine |
|
||||
|
||||
---
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
/home/camp/projects/windows/shopdb/
|
||||
├── displaymachines.asp # List all machines (equipment only, no PCs)
|
||||
├── displaymachine.asp # Display single machine (5 tabs)
|
||||
├── addmachine.asp # Add new machine form (5 tabs)
|
||||
├── editmachine.asp # Edit machine form (5 tabs)
|
||||
├── savemachine_direct.asp # Save new machine handler
|
||||
├── savemachineedit.asp # Save machine edits handler
|
||||
└── docs/
|
||||
├── MACHINE_MANAGEMENT_COMPLETE.md # Comprehensive overview
|
||||
├── MACHINE_EDIT_FORM_IMPLEMENTATION.md # Edit form details
|
||||
├── ADD_EDIT_MACHINE_UPDATES.md # Add form details
|
||||
└── DISPLAY_PAGES_UPDATE_SUMMARY.md # Display page details
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Database Tables
|
||||
|
||||
### machines
|
||||
Primary table for all equipment and PCs
|
||||
- `machineid` - Primary key
|
||||
- `machinenumber` - Equipment number (unique, required)
|
||||
- `modelnumberid` - Foreign key to models
|
||||
- `businessunitid` - Foreign key to businessunits
|
||||
- `pctypeid` - NULL for equipment, NOT NULL for PCs
|
||||
- `alias` - Friendly name
|
||||
- `machinenotes` - Notes
|
||||
- `mapleft`, `maptop` - Location coordinates
|
||||
|
||||
### communications
|
||||
Network interface data (up to 3 per machine)
|
||||
- `comid` - Primary key
|
||||
- `machineid` - Foreign key to machines
|
||||
- `address` - IP address
|
||||
- `macaddress` - MAC address
|
||||
- `interfacename` - "Interface 1", "Interface 2", "Interface 3"
|
||||
- `isprimary` - 1 for primary, 0 for secondary
|
||||
|
||||
### machinerelationships
|
||||
Relationships between machines
|
||||
- `relationshipid` - Primary key
|
||||
- `machineid` - Source machine
|
||||
- `related_machineid` - Target machine
|
||||
- `relationshiptypeid` - Foreign key to relationshiptypes
|
||||
|
||||
**Relationship Types:**
|
||||
- **Controls** (one-way): PC → Equipment
|
||||
- **Dualpath** (bidirectional): Machine ↔ Machine
|
||||
|
||||
### compliance
|
||||
Compliance and security data
|
||||
- `complianceid` - Primary key
|
||||
- `machineid` - Foreign key to machines
|
||||
- `is_third_party_managed` - ENUM('Yes', 'No', 'NA')
|
||||
- `third_party_vendorid` - Foreign key to vendors
|
||||
- `ot_asset_system` - OT classification
|
||||
- `ot_asset_device_type` - DoD classification
|
||||
|
||||
---
|
||||
|
||||
## Common Queries
|
||||
|
||||
### Get Machine with All Data
|
||||
```sql
|
||||
SELECT m.*, mo.modelnumber, v.vendor, bu.businessunit, mt.machinetype
|
||||
FROM machines m
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN vendors v ON mo.vendorid = v.vendorid
|
||||
LEFT JOIN businessunits bu ON m.businessunitid = bu.businessunitID
|
||||
LEFT JOIN machinetypes mt ON mo.machinetypeid = mt.machinetypeid
|
||||
WHERE m.machineid = ?
|
||||
```
|
||||
|
||||
### Get Network Interfaces
|
||||
```sql
|
||||
SELECT * FROM communications
|
||||
WHERE machineid = ? AND isactive = 1
|
||||
ORDER BY isprimary DESC, interfacename ASC
|
||||
```
|
||||
|
||||
### Get Controlling PC
|
||||
```sql
|
||||
SELECT m.machineid, m.hostname, c.address
|
||||
FROM machinerelationships mr
|
||||
JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
JOIN machines m ON mr.machineid = m.machineid
|
||||
LEFT JOIN communications c ON m.machineid = c.machineid AND c.isprimary = 1
|
||||
WHERE mr.related_machineid = ? AND rt.relationshiptype = 'Controls'
|
||||
```
|
||||
|
||||
### Get Dualpath Machines
|
||||
```sql
|
||||
SELECT m.machineid, m.machinenumber, mt.machinetype, mo.modelnumber
|
||||
FROM machinerelationships mr
|
||||
JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
JOIN machines m ON mr.related_machineid = m.machineid
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN machinetypes mt ON mo.machinetypeid = mt.machinetypeid
|
||||
WHERE mr.machineid = ? AND rt.relationshiptype = 'Dualpath'
|
||||
```
|
||||
|
||||
### Get Compliance Data
|
||||
```sql
|
||||
SELECT c.*, v.vendor AS third_party_vendor_name
|
||||
FROM compliance c
|
||||
LEFT JOIN vendors v ON c.third_party_vendorid = v.vendorid
|
||||
WHERE c.machineid = ?
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Form Field Reference
|
||||
|
||||
### Basic Info Tab
|
||||
- `machinenumber` - Equipment number (required, unique, readonly on edit)
|
||||
- `modelid` - Model dropdown (required)
|
||||
- `businessunitid` - Business unit dropdown (required)
|
||||
- `alias` - Friendly name (optional)
|
||||
- `machinenotes` - Notes (optional)
|
||||
|
||||
### Network Tab
|
||||
- `ip1`, `mac1` - Primary interface (Interface 1)
|
||||
- `ip2`, `mac2` - Optional interface (Interface 2)
|
||||
- `ip3`, `mac3` - Optional interface (Interface 3)
|
||||
|
||||
### Relationships Tab
|
||||
- `controllingpc` - PC dropdown (WHERE pctypeid IS NOT NULL)
|
||||
- `dualpathid` - Machine dropdown (WHERE pctypeid IS NULL)
|
||||
|
||||
### Compliance Tab
|
||||
- `thirdpartymanaged` - Dropdown (N/A, Yes, No)
|
||||
- `thirdpartyvendorid` - Vendor dropdown
|
||||
- `otassetsystem` - Text input (100 chars)
|
||||
- `dodassettype` - Text input (100 chars)
|
||||
|
||||
### Location Tab
|
||||
- `mapleft` - X coordinate (from map picker)
|
||||
- `maptop` - Y coordinate (from map picker)
|
||||
|
||||
---
|
||||
|
||||
## Code Patterns
|
||||
|
||||
### Parameterized Query Example
|
||||
```asp
|
||||
Dim strSQL, rsResult
|
||||
strSQL = "SELECT * FROM machines WHERE machineid = ?"
|
||||
Set rsResult = ExecuteParameterizedQuery(objConn, strSQL, Array(machineid))
|
||||
If Not rsResult.EOF Then
|
||||
' Process results
|
||||
End If
|
||||
rsResult.Close
|
||||
Set rsResult = Nothing
|
||||
```
|
||||
|
||||
### HTML Encoding Pattern
|
||||
```asp
|
||||
Response.Write("<td>" & Server.HTMLEncode(rsData("fieldname") & "") & "</td>")
|
||||
```
|
||||
|
||||
### NULL Handling Pattern
|
||||
```asp
|
||||
' Force to string to prevent NULL errors
|
||||
Dim displayValue
|
||||
displayValue = rsData("fieldname") & "" ' Converts NULL to empty string
|
||||
|
||||
' Use IIf for database inserts
|
||||
cmd.Parameters.Append cmd.CreateParameter("@param", 200, 1, 50, IIf(value <> "", value, Null))
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Common Tasks
|
||||
|
||||
### Adding a New Machine
|
||||
1. Navigate to `addmachine.asp`
|
||||
2. Fill Basic Info tab (machine number, model, business unit)
|
||||
3. Fill Network tab (at least one IP/MAC)
|
||||
4. Select relationships (optional)
|
||||
5. Fill compliance data (optional)
|
||||
6. Click map to set location (optional)
|
||||
7. Click "Add Equipment"
|
||||
|
||||
### Editing a Machine
|
||||
1. Navigate to `displaymachine.asp?machineid=XXX`
|
||||
2. Click "Edit Machine" button
|
||||
3. Update any tab
|
||||
4. Click "Update Equipment"
|
||||
|
||||
### Viewing Machine Relationships
|
||||
1. Navigate to `displaymachine.asp?machineid=XXX`
|
||||
2. Click "Relationships" tab
|
||||
3. See three sections:
|
||||
- Controls (PC that controls this)
|
||||
- Controlled By This PC (if it's a PC)
|
||||
- Dualpath (redundant machines)
|
||||
|
||||
### Viewing Network Interfaces
|
||||
1. Navigate to `displaymachine.asp?machineid=XXX`
|
||||
2. Click "Network" tab
|
||||
3. See all interfaces in table format
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Machine redirects to homepage
|
||||
**Cause:** NULL machinetypeid in model
|
||||
**Fix:** Use LEFT JOIN instead of INNER JOIN for machinetypes
|
||||
|
||||
### Edit button doesn't work
|
||||
**Cause:** Invalid machineid or file doesn't exist
|
||||
**Fix:** Check URL parameter, verify editmachine.asp exists
|
||||
|
||||
### Data doesn't save
|
||||
**Cause:** Validation error or database connection issue
|
||||
**Fix:** Check error message, review logs in `/home/camp/projects/windows/logs/`
|
||||
|
||||
### Map doesn't load
|
||||
**Cause:** Missing Leaflet.js or map images
|
||||
**Fix:** Verify leaflet.js, sitemap2025-dark.png, sitemap2025-light.png exist
|
||||
|
||||
### "New" button doesn't work
|
||||
**Cause:** JavaScript event handler issue
|
||||
**Fix:** Check browser console for errors, verify jQuery loaded
|
||||
|
||||
### Relationships not saving
|
||||
**Cause:** Relationship types don't exist or invalid machine IDs
|
||||
**Fix:** Verify relationshiptypes table has 'Controls' and 'Dualpath'
|
||||
|
||||
---
|
||||
|
||||
## Security Checklist
|
||||
|
||||
- All queries use parameterized commands
|
||||
- All output uses Server.HTMLEncode()
|
||||
- All numeric inputs validated with IsNumeric()
|
||||
- All string inputs have length limits
|
||||
- NULL values handled properly
|
||||
- No direct variable interpolation in SQL
|
||||
- Error messages don't expose sensitive data
|
||||
- Database connections always closed
|
||||
|
||||
---
|
||||
|
||||
## Testing Checklist
|
||||
|
||||
**Display Page:**
|
||||
- [ ] View machine with full data
|
||||
- [ ] View machine with no network interfaces
|
||||
- [ ] View machine with no relationships
|
||||
- [ ] Click "Edit Machine" button
|
||||
- [ ] Click related machine links
|
||||
|
||||
**Add Form:**
|
||||
- [ ] Add machine with all fields
|
||||
- [ ] Add machine with only required fields
|
||||
- [ ] Test IP/MAC validation
|
||||
- [ ] Create new model
|
||||
- [ ] Create new vendor
|
||||
- [ ] Use map picker
|
||||
|
||||
**Edit Form:**
|
||||
- [ ] Edit basic info
|
||||
- [ ] Add/remove network interfaces
|
||||
- [ ] Change controlling PC
|
||||
- [ ] Change dualpath machine
|
||||
- [ ] Update compliance data
|
||||
- [ ] Move location on map
|
||||
|
||||
---
|
||||
|
||||
## Quick Command Reference
|
||||
|
||||
### View Logs
|
||||
```bash
|
||||
tail -f /home/camp/projects/windows/logs/*.log
|
||||
```
|
||||
|
||||
### Check Database
|
||||
```bash
|
||||
mysql -u root -p shopdb -e "SELECT COUNT(*) FROM machines WHERE pctypeid IS NULL"
|
||||
mysql -u root -p shopdb -e "SELECT COUNT(*) FROM communications"
|
||||
mysql -u root -p shopdb -e "SELECT COUNT(*) FROM machinerelationships"
|
||||
```
|
||||
|
||||
### Find Machine by Number
|
||||
```sql
|
||||
SELECT machineid FROM machines WHERE machinenumber = '4500'
|
||||
```
|
||||
|
||||
### List All Relationships
|
||||
```sql
|
||||
SELECT m1.machinenumber AS source, m2.machinenumber AS target, rt.relationshiptype
|
||||
FROM machinerelationships mr
|
||||
JOIN machines m1 ON mr.machineid = m1.machineid
|
||||
JOIN machines m2 ON mr.related_machineid = m2.machineid
|
||||
JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
WHERE mr.isactive = 1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Support Resources
|
||||
|
||||
- **Full Documentation:** `MACHINE_MANAGEMENT_COMPLETE.md`
|
||||
- **Edit Form Details:** `MACHINE_EDIT_FORM_IMPLEMENTATION.md`
|
||||
- **Add Form Details:** `ADD_EDIT_MACHINE_UPDATES.md`
|
||||
- **Display Page Details:** `DISPLAY_PAGES_UPDATE_SUMMARY.md`
|
||||
- **Migration Scripts:** `/home/camp/projects/windows/shopdb/sql/migration_phase2/`
|
||||
- **Import Logs:** `/tmp/inventory_import_final.log`
|
||||
|
||||
---
|
||||
|
||||
**Last Updated:** 2025-11-07
|
||||
**Version:** 1.0
|
||||
**Status:** Production Ready
|
||||
342
docs/archive/MACHINE_RELATIONSHIPS_EXAMPLES.md
Normal file
342
docs/archive/MACHINE_RELATIONSHIPS_EXAMPLES.md
Normal file
@@ -0,0 +1,342 @@
|
||||
# Machine Relationships - Usage Examples
|
||||
|
||||
**Date:** 2025-11-06
|
||||
**Purpose:** Show real-world examples of how machine relationships work
|
||||
|
||||
---
|
||||
|
||||
## Example Scenario: Dualpath Lathes with Shared Controller
|
||||
|
||||
**Setup:**
|
||||
- Machine 2001 (CNC Lathe)
|
||||
- Machine 2002 (CNC Lathe)
|
||||
- PC 500 (Shopfloor PC, hostname: PC-CNC-01)
|
||||
|
||||
**Relationships:**
|
||||
1. 2001 and 2002 share the same controller (dualpath)
|
||||
2. Both machines communicate directly with PC 500
|
||||
|
||||
---
|
||||
|
||||
## Data Setup
|
||||
|
||||
### Step 1: Insert Relationship Types (one-time setup)
|
||||
```sql
|
||||
INSERT INTO relationshiptypes (relationshiptype, description, isbidirectional) VALUES
|
||||
('Dualpath', 'Machines share same controller', 1),
|
||||
('Controlled By', 'Machine controlled by PC/controller', 0),
|
||||
('Controls', 'PC/controller controls machine', 0);
|
||||
```
|
||||
|
||||
### Step 2: Link the dualpath machines
|
||||
```sql
|
||||
-- 2001 and 2002 are dualpath
|
||||
INSERT INTO machinerelationships (relationshiptypeid, machineid1, machineid2, notes) VALUES
|
||||
(1, 2001, 2002, 'Dualpath lathe pair - share controller');
|
||||
```
|
||||
|
||||
### Step 3: Link machines to controlling PC
|
||||
```sql
|
||||
-- 2001 is controlled by PC 500
|
||||
INSERT INTO machinerelationships (relationshiptypeid, machineid1, machineid2, notes) VALUES
|
||||
(2, 2001, 500, 'Primary CNC controller');
|
||||
|
||||
-- 2002 is controlled by PC 500
|
||||
INSERT INTO machinerelationships (relationshiptypeid, machineid1, machineid2, notes) VALUES
|
||||
(2, 2002, 500, 'Primary CNC controller');
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Common Queries
|
||||
|
||||
### Q1: Is machine 2001 dualpath? With what machine?
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
m.machinenumber AS this_machine,
|
||||
CASE
|
||||
WHEN m2.machineid IS NOT NULL THEN 'Yes'
|
||||
ELSE 'No'
|
||||
END AS is_dualpath,
|
||||
m2.machinenumber AS dualpath_partner,
|
||||
rt.relationshiptype
|
||||
FROM machines m
|
||||
LEFT JOIN machinerelationships mr ON (
|
||||
(mr.machineid1 = m.machineid OR mr.machineid2 = m.machineid)
|
||||
AND mr.relationshiptypeid = 1
|
||||
)
|
||||
LEFT JOIN machines m2 ON (
|
||||
CASE
|
||||
WHEN mr.machineid1 = m.machineid THEN mr.machineid2
|
||||
ELSE mr.machineid1
|
||||
END = m2.machineid
|
||||
)
|
||||
LEFT JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
WHERE m.machineid = 2001;
|
||||
```
|
||||
|
||||
**Result:**
|
||||
```
|
||||
this_machine | is_dualpath | dualpath_partner | relationshiptype
|
||||
2001 | Yes | 2002 | Dualpath
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Q2: Which PC controls machine 2001?
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
m.machinenumber AS cnc_machine,
|
||||
pc.machineid AS controller_id,
|
||||
pc.machinenumber AS controller_location,
|
||||
pc.hostname AS controller_hostname,
|
||||
rt.relationshiptype
|
||||
FROM machines m
|
||||
JOIN machinerelationships mr ON mr.machineid1 = m.machineid
|
||||
JOIN machines pc ON mr.machineid2 = pc.machineid
|
||||
JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
WHERE m.machineid = 2001
|
||||
AND mr.relationshiptypeid = 2;
|
||||
```
|
||||
|
||||
**Result:**
|
||||
```
|
||||
cnc_machine | controller_id | controller_location | controller_hostname | relationshiptype
|
||||
2001 | 500 | IT-LAB-01 | PC-CNC-01 | Controlled By
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Q3: What machines does PC 500 control?
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
pc.hostname AS controller,
|
||||
m.machinenumber AS controlled_machine,
|
||||
mt.machinetype,
|
||||
mr.notes
|
||||
FROM machines pc
|
||||
JOIN machinerelationships mr ON mr.machineid2 = pc.machineid
|
||||
JOIN machines m ON mr.machineid1 = m.machineid
|
||||
JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
WHERE pc.machineid = 500
|
||||
AND mr.relationshiptypeid = 2
|
||||
ORDER BY m.machinenumber;
|
||||
```
|
||||
|
||||
**Result:**
|
||||
```
|
||||
controller | controlled_machine | machinetype | notes
|
||||
PC-CNC-01 | 2001 | CNC - Lathe | Primary CNC controller
|
||||
PC-CNC-01 | 2002 | CNC - Lathe | Primary CNC controller
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Q4: Complete picture - Machine + Dualpath + Controller + IP
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
m.machinenumber AS machine,
|
||||
mt.machinetype,
|
||||
|
||||
-- Dualpath info
|
||||
m_dual.machinenumber AS dualpath_partner,
|
||||
|
||||
-- Controller info
|
||||
pc.hostname AS controller,
|
||||
pc.machinenumber AS controller_location,
|
||||
|
||||
-- Controller's IP
|
||||
c.address AS controller_ip
|
||||
|
||||
FROM machines m
|
||||
JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
|
||||
-- Find dualpath partner
|
||||
LEFT JOIN machinerelationships mr_dual ON (
|
||||
(mr_dual.machineid1 = m.machineid OR mr_dual.machineid2 = m.machineid)
|
||||
AND mr_dual.relationshiptypeid = 1
|
||||
)
|
||||
LEFT JOIN machines m_dual ON (
|
||||
CASE
|
||||
WHEN mr_dual.machineid1 = m.machineid THEN mr_dual.machineid2
|
||||
ELSE mr_dual.machineid1
|
||||
END = m_dual.machineid
|
||||
)
|
||||
|
||||
-- Find controller
|
||||
LEFT JOIN machinerelationships mr_ctrl ON (
|
||||
mr_ctrl.machineid1 = m.machineid
|
||||
AND mr_ctrl.relationshiptypeid = 2
|
||||
)
|
||||
LEFT JOIN machines pc ON mr_ctrl.machineid2 = pc.machineid
|
||||
|
||||
-- Get controller's IP address
|
||||
LEFT JOIN communications c ON (
|
||||
pc.machineid = c.machineid
|
||||
AND c.comstypeid = 1 -- IP type
|
||||
)
|
||||
|
||||
WHERE m.machineid IN (2001, 2002);
|
||||
```
|
||||
|
||||
**Result:**
|
||||
```
|
||||
machine | machinetype | dualpath_partner | controller | controller_location | controller_ip
|
||||
2001 | CNC - Lathe | 2002 | PC-CNC-01 | IT-LAB-01 | 192.168.1.50
|
||||
2002 | CNC - Lathe | 2001 | PC-CNC-01 | IT-LAB-01 | 192.168.1.50
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Recommended View: vw_machine_relationships
|
||||
|
||||
Create a view for easy access:
|
||||
|
||||
```sql
|
||||
CREATE VIEW vw_machine_relationships AS
|
||||
SELECT
|
||||
m.machineid,
|
||||
m.machinenumber,
|
||||
m.alias,
|
||||
mt.machinetype,
|
||||
|
||||
-- Dualpath info
|
||||
CASE WHEN m_dual.machineid IS NOT NULL THEN 1 ELSE 0 END AS is_dualpath,
|
||||
m_dual.machineid AS dualpath_partner_id,
|
||||
m_dual.machinenumber AS dualpath_partner,
|
||||
|
||||
-- Controller info
|
||||
pc.machineid AS controller_id,
|
||||
pc.hostname AS controller_hostname,
|
||||
pc.machinenumber AS controller_location,
|
||||
|
||||
-- Controller IP
|
||||
c.address AS controller_ip,
|
||||
|
||||
-- Relationship counts
|
||||
(SELECT COUNT(*)
|
||||
FROM machinerelationships mr
|
||||
WHERE mr.machineid1 = m.machineid OR mr.machineid2 = m.machineid
|
||||
) AS total_relationships
|
||||
|
||||
FROM machines m
|
||||
JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
|
||||
-- Dualpath partner
|
||||
LEFT JOIN machinerelationships mr_dual ON (
|
||||
(mr_dual.machineid1 = m.machineid OR mr_dual.machineid2 = m.machineid)
|
||||
AND mr_dual.relationshiptypeid = 1
|
||||
AND mr_dual.isactive = 1
|
||||
)
|
||||
LEFT JOIN machines m_dual ON (
|
||||
CASE
|
||||
WHEN mr_dual.machineid1 = m.machineid THEN mr_dual.machineid2
|
||||
ELSE mr_dual.machineid1
|
||||
END = m_dual.machineid
|
||||
)
|
||||
|
||||
-- Controller PC
|
||||
LEFT JOIN machinerelationships mr_ctrl ON (
|
||||
mr_ctrl.machineid1 = m.machineid
|
||||
AND mr_ctrl.relationshiptypeid = 2
|
||||
AND mr_ctrl.isactive = 1
|
||||
)
|
||||
LEFT JOIN machines pc ON mr_ctrl.machineid2 = pc.machineid
|
||||
|
||||
-- Controller IP
|
||||
LEFT JOIN communications c ON (
|
||||
pc.machineid = c.machineid
|
||||
AND c.comstypeid = 1
|
||||
)
|
||||
|
||||
WHERE m.isactive = 1;
|
||||
```
|
||||
|
||||
### Using the View:
|
||||
|
||||
```sql
|
||||
-- Simple query for machine 2001
|
||||
SELECT * FROM vw_machine_relationships WHERE machineid = 2001;
|
||||
|
||||
-- Show all dualpath machines
|
||||
SELECT * FROM vw_machine_relationships WHERE is_dualpath = 1;
|
||||
|
||||
-- Show all machines controlled by PC 500
|
||||
SELECT * FROM vw_machine_relationships WHERE controller_id = 500;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ASP Code Examples
|
||||
|
||||
### Check if machine is dualpath:
|
||||
```vbscript
|
||||
strSQL = "SELECT * FROM vw_machine_relationships WHERE machineid = ?"
|
||||
Set rs = ExecuteParameterizedQuery(objConn, strSQL, Array(CLng(machineId)))
|
||||
|
||||
If Not rs.EOF Then
|
||||
isDualpath = rs("is_dualpath")
|
||||
|
||||
If isDualpath = 1 Then
|
||||
Response.Write("Dualpath with: " & rs("dualpath_partner"))
|
||||
End If
|
||||
|
||||
If Not IsNull(rs("controller_hostname")) Then
|
||||
Response.Write("Controller: " & rs("controller_hostname"))
|
||||
Response.Write(" (IP: " & rs("controller_ip") & ")")
|
||||
End If
|
||||
End If
|
||||
```
|
||||
|
||||
### Display machine card with relationships:
|
||||
```vbscript
|
||||
<div class="machine-card">
|
||||
<h3>Machine <%= rs("machinenumber") %></h3>
|
||||
<p>Type: <%= rs("machinetype") %></p>
|
||||
|
||||
<% If rs("is_dualpath") = 1 Then %>
|
||||
<div class="dualpath-badge">
|
||||
<strong>Dualpath:</strong> Linked with <%= rs("dualpath_partner") %>
|
||||
</div>
|
||||
<% End If %>
|
||||
|
||||
<% If Not IsNull(rs("controller_hostname")) Then %>
|
||||
<div class="controller-info">
|
||||
<strong>Controller:</strong> <%= rs("controller_hostname") %><br>
|
||||
<strong>Location:</strong> <%= rs("controller_location") %><br>
|
||||
<strong>IP:</strong> <%= rs("controller_ip") %>
|
||||
</div>
|
||||
<% End If %>
|
||||
</div>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Benefits of This Design
|
||||
|
||||
**Flexible** - Any machine can relate to any other machine
|
||||
**Bidirectional** - Dualpath works both ways automatically
|
||||
**Directional** - "Controlled By" has clear direction
|
||||
**Extensible** - Easy to add new relationship types
|
||||
**Query-friendly** - Simple JOINs to get related machines
|
||||
**Unified** - PCs are machines too, so PC-to-machine relationships use same table
|
||||
**Future-proof** - Supports clusters, backups, master-slave, etc.
|
||||
|
||||
---
|
||||
|
||||
## Future Relationship Types (Examples)
|
||||
|
||||
```sql
|
||||
INSERT INTO relationshiptypes (relationshiptype, description, isbidirectional) VALUES
|
||||
('Backup', 'Backup/redundant machine', 1),
|
||||
('Cluster Member', 'Member of machine cluster', 1),
|
||||
('Feeds Into', 'Output feeds into next machine', 0),
|
||||
('Mirror', 'Mirrored configuration', 1),
|
||||
('Hot Standby', 'Hot standby/failover machine', 0);
|
||||
```
|
||||
|
||||
These would all work with the same `machinerelationships` table!
|
||||
197
docs/archive/MIGRATION_QUICK_REFERENCE.md
Normal file
197
docs/archive/MIGRATION_QUICK_REFERENCE.md
Normal file
@@ -0,0 +1,197 @@
|
||||
# Database Migration - Quick Reference
|
||||
|
||||
**Date:** 2025-11-06
|
||||
**Status:** Design Finalized
|
||||
|
||||
---
|
||||
|
||||
## What We're Doing
|
||||
|
||||
Consolidating PCs into machines table + adding communications, compliance, and warranty tracking.
|
||||
|
||||
---
|
||||
|
||||
## New Tables (7)
|
||||
|
||||
1. **comstypes** (8 cols) - Communication type lookup (IP, Serial, Network, etc.)
|
||||
2. **communications** (9 cols) - Universal comm tracking with generic `address` field
|
||||
3. **compliance** (14 cols) - Security/compliance data from inventory.xlsx
|
||||
4. **compliancescans** (5 cols) - AV/malware scan log
|
||||
5. **warranties** (5 cols) - Simple warranty tracking (name + expiration)
|
||||
6. **relationshiptypes** (5 cols) - Machine relationship types (Dualpath, Controlled By, etc.)
|
||||
7. **machinerelationships** (6 cols) - Machine-to-machine relationships tracking
|
||||
|
||||
---
|
||||
|
||||
## Modified Tables (2)
|
||||
|
||||
1. **machines** - Add 9 PC-related columns (hostname, serialnumber, osid, etc.)
|
||||
2. **businessunits** - Add 2 liaison fields (liaisonname, liaisonsso)
|
||||
|
||||
---
|
||||
|
||||
## Renamed Tables (1)
|
||||
|
||||
1. **pcstatus → machinestatus** - Consistent naming
|
||||
|
||||
---
|
||||
|
||||
## Deprecated Tables (4)
|
||||
|
||||
Drop after 30-day testing:
|
||||
1. pc
|
||||
2. pc_comm_config
|
||||
3. pc_network_interfaces
|
||||
4. pctype
|
||||
|
||||
---
|
||||
|
||||
## Key Design Decisions
|
||||
|
||||
**Generic `address` field** - One field for IP/COM/USB/etc (determined by comstypeid)
|
||||
**Simplified warranties** - Just name + expiration date
|
||||
**Liaison in businessunits** - No separate liaisons table
|
||||
**Unified machine types** - PC types added to machinetypes
|
||||
**Vendor FK** - compliance.managedbyvendorid → vendors table
|
||||
**Minimal audit** - Removed unnecessary dateadded/lastupdated fields
|
||||
**Machine relationships** - Generic table for dualpath, PC-to-machine control, future clusters
|
||||
|
||||
---
|
||||
|
||||
## Migration Volumes
|
||||
|
||||
| Source | Destination | Records |
|
||||
|--------|-------------|---------|
|
||||
| pc table | machines | 277 |
|
||||
| machines.ipaddress1/2 | communications | ~266 |
|
||||
| pc_network_interfaces | communications | ~277+ |
|
||||
| pc_comm_config | communications | ~100+ |
|
||||
| pc warranties | warranties | ~277+ |
|
||||
| **Total** | | **~650+ comms** |
|
||||
|
||||
---
|
||||
|
||||
## Phase 1 Scripts (Ready to Create)
|
||||
|
||||
1. Create communications infrastructure
|
||||
2. Extend machines table
|
||||
3. Create PC machine types
|
||||
4. Create warranty infrastructure
|
||||
5. Create compliance infrastructure
|
||||
6. Extend businessunits table
|
||||
7. Rename pcstatus table
|
||||
8. Create machine relationships infrastructure
|
||||
|
||||
**Time:** ~25 minutes
|
||||
**Reversible:** Yes
|
||||
|
||||
---
|
||||
|
||||
## machines Table Final Structure (21 columns)
|
||||
|
||||
1. machineid (PK)
|
||||
2. machinetypeid (now includes PC types!)
|
||||
3. machinenumber
|
||||
4. alias
|
||||
5. hostname (NEW - for PCs)
|
||||
6. serialnumber (NEW)
|
||||
7. loggedinuser (NEW - for PCs)
|
||||
8. modelnumberid
|
||||
9. controllertypeid (NEW - for CNC machines)
|
||||
10. controllerosid (NEW - controller OS, uses operatingsystems table)
|
||||
11. osid (NEW - for PCs, uses operatingsystems table)
|
||||
12. machinestatusid (NEW - renamed from pcstatusid)
|
||||
13. businessunitid
|
||||
14. printerid
|
||||
15. mapleft
|
||||
16. maptop
|
||||
17. isactive
|
||||
18. islocationonly
|
||||
19. machinenotes
|
||||
20. lastupdated (NEW)
|
||||
21. dateadded (NEW)
|
||||
|
||||
**Key Design:** Both PC OS and Controller OS use the same `operatingsystems` table!
|
||||
|
||||
**Removed:** pctypeid, isvnc, requires_manual_machine_config, ipaddress1, ipaddress2
|
||||
|
||||
---
|
||||
|
||||
## communications Table Structure (9 columns)
|
||||
|
||||
1. comid (PK)
|
||||
2. machineid (FK)
|
||||
3. comstypeid (FK)
|
||||
4. **address** (VARCHAR - universal: IP, COM1, eth0, etc.)
|
||||
5. port (for IP types)
|
||||
6. macaddress (for network types)
|
||||
7. description
|
||||
8. settings (JSON - type-specific config)
|
||||
9. isactive
|
||||
|
||||
---
|
||||
|
||||
## compliance Table Structure (15 columns)
|
||||
|
||||
1. complianceid (PK)
|
||||
2. machineid (FK)
|
||||
3. ongenetwork
|
||||
4. gecoreload
|
||||
5. assetcriticality
|
||||
6. cuidataclassification
|
||||
7. dodassettype
|
||||
8. dodassetsubtype
|
||||
9. otenvironment
|
||||
10. managedbyvendorid (FK to vendors)
|
||||
11. changerestricted
|
||||
12. jumpbox
|
||||
13. mft (Managed File Transfer)
|
||||
14. notes
|
||||
15. isactive
|
||||
|
||||
---
|
||||
|
||||
## warranties Table Structure (5 columns)
|
||||
|
||||
1. warrantyid (PK)
|
||||
2. machineid (FK)
|
||||
3. warrantyname
|
||||
4. enddate
|
||||
5. isactive
|
||||
|
||||
---
|
||||
|
||||
## relationshiptypes Table Structure (5 columns)
|
||||
|
||||
1. relationshiptypeid (PK)
|
||||
2. relationshiptype ('Dualpath', 'Controlled By', 'Controls', etc.)
|
||||
3. description
|
||||
4. isbidirectional (1 for symmetric, 0 for directional)
|
||||
5. isactive
|
||||
|
||||
---
|
||||
|
||||
## machinerelationships Table Structure (6 columns)
|
||||
|
||||
1. relationshipid (PK)
|
||||
2. relationshiptypeid (FK)
|
||||
3. machineid1 (FK to machines)
|
||||
4. machineid2 (FK to machines)
|
||||
5. notes
|
||||
6. isactive
|
||||
|
||||
**Key Feature:** Both machines and PCs are in machines table, so any machine can relate to any other machine.
|
||||
|
||||
**Example:**
|
||||
- Machines 2001 & 2002 are dualpath (relationshiptypeid=1)
|
||||
- Both controlled by PC 500 (relationshiptypeid=2)
|
||||
|
||||
---
|
||||
|
||||
## Next Step
|
||||
|
||||
**Create Phase 1 SQL Scripts** (8 scripts + 8 rollback scripts)
|
||||
|
||||
---
|
||||
|
||||
See **DATABASE_MIGRATION_FINAL_DESIGN.md** for complete specification.
|
||||
166
docs/archive/MIGRATION_STATUS_SUMMARY.md
Normal file
166
docs/archive/MIGRATION_STATUS_SUMMARY.md
Normal file
@@ -0,0 +1,166 @@
|
||||
# Database Migration - Status Summary
|
||||
|
||||
**Last Updated:** 2025-11-25
|
||||
**Current Phase:** Phase 2 COMPLETE, Phase 3 PLANNED
|
||||
|
||||
---
|
||||
|
||||
## Migration Status
|
||||
|
||||
| Phase | Status | Description | Completed |
|
||||
|-------|--------|-------------|-----------|
|
||||
| **Phase 1** | COMPLETE | Schema changes (tables, columns, indexes) | Nov 6, 2025 |
|
||||
| **Phase 2** | COMPLETE | PC migration to machines table | Nov 10, 2025 |
|
||||
| **Phase 3** | COMPLETE | Network devices - legacy tables dropped | Nov 25, 2025 |
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Schema Changes (COMPLETE)
|
||||
|
||||
**Completed:** November 6, 2025
|
||||
|
||||
### New Tables Created (7)
|
||||
1. `comstypes` - Communication types (IP, Serial, etc.)
|
||||
2. `communications` - Unified network interfaces
|
||||
3. `warranties` - Warranty tracking
|
||||
4. `compliance` - Compliance tracking
|
||||
5. `compliancescans` - Scan history
|
||||
6. `relationshiptypes` - Relationship type definitions
|
||||
7. `machinerelationships` - Machine-to-machine relationships
|
||||
|
||||
### Tables Modified (2)
|
||||
1. `machines` - Added 11 columns (hostname, serialnumber, osid, pctypeid, etc.)
|
||||
2. `businessunits` - Added liaison fields
|
||||
|
||||
### Tables Renamed
|
||||
- `pcstatus` → `machinestatus`
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: PC Migration (COMPLETE)
|
||||
|
||||
**Completed:** November 10, 2025
|
||||
|
||||
### Data Migrated
|
||||
- **277 PCs** migrated from `pc` table → `machines` table
|
||||
- **705+ network interfaces** → `communications` table
|
||||
- **Dualpath relationships** → `machinerelationships` table
|
||||
- **PC→Equipment relationships** → `machinerelationships` table
|
||||
|
||||
### Schema Changes
|
||||
- PCs identified by `pctypeid IS NOT NULL` in machines table
|
||||
- Network interfaces use `communications.address` field
|
||||
- Relationships use `machinerelationships` table
|
||||
|
||||
### Pages Updated
|
||||
- displaypcs.asp, displaypc.asp, editpc.asp
|
||||
- displaymachines.asp, displaymachine.asp
|
||||
- network_map.asp, network_devices.asp
|
||||
- All save/update device pages
|
||||
|
||||
### API Fixes
|
||||
- Fixed 36+ IIf() bugs in api.asp
|
||||
- Fixed PC→Machine relationship creation
|
||||
- PowerShell data collection fully working
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Network Devices (COMPLETE)
|
||||
|
||||
**Completed:** November 25, 2025
|
||||
|
||||
### What Happened
|
||||
- Legacy tables were essentially empty (only 3 servers had data)
|
||||
- Network devices were already being added directly to `machines` table
|
||||
- Dropped all legacy network device tables
|
||||
|
||||
### Tables Dropped
|
||||
- `servers` (3 records - not migrated, stale data)
|
||||
- `switches` (empty)
|
||||
- `cameras` (empty)
|
||||
- `accesspoints` (empty)
|
||||
- `idfs` (empty)
|
||||
|
||||
### Current Network Device Types in machines Table
|
||||
| machinetypeid | Type |
|
||||
|---------------|------|
|
||||
| 16 | Access Point |
|
||||
| 17 | IDF |
|
||||
| 18 | Camera |
|
||||
| 19 | Switch |
|
||||
| 20 | Server |
|
||||
|
||||
### Printers
|
||||
- Stay in separate `printers` table (by design - unique fields, workflows)
|
||||
|
||||
---
|
||||
|
||||
## Current Architecture
|
||||
|
||||
```
|
||||
machines table (unified)
|
||||
├── Equipment (machinetypeid 1-24, pctypeid IS NULL)
|
||||
├── PCs (machinetypeid 25-29, pctypeid IS NOT NULL)
|
||||
└── [Future] Network Devices (machinetypeid 30-36)
|
||||
|
||||
printers table (separate)
|
||||
|
||||
communications table (all network interfaces)
|
||||
|
||||
machinerelationships table (all relationships)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Key Queries
|
||||
|
||||
```sql
|
||||
-- All PCs
|
||||
SELECT * FROM machines WHERE pctypeid IS NOT NULL;
|
||||
|
||||
-- All Equipment (non-PC)
|
||||
SELECT * FROM machines WHERE pctypeid IS NULL;
|
||||
|
||||
-- PCs with network info
|
||||
SELECT m.hostname, m.serialnumber, c.address
|
||||
FROM machines m
|
||||
LEFT JOIN communications c ON m.machineid = c.machineid
|
||||
WHERE m.pctypeid IS NOT NULL;
|
||||
|
||||
-- PC → Equipment relationships
|
||||
SELECT
|
||||
pc.hostname AS pc_name,
|
||||
eq.machinenumber AS equipment_name
|
||||
FROM machinerelationships mr
|
||||
JOIN machines pc ON mr.machineid = pc.machineid
|
||||
JOIN machines eq ON mr.related_machineid = eq.machineid
|
||||
JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
WHERE rt.relationshiptype = 'Controls';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Deprecated Tables (Phase 2)
|
||||
|
||||
These tables are deprecated but kept for rollback safety:
|
||||
|
||||
- `pc` → Use `machines WHERE pctypeid IS NOT NULL`
|
||||
- `pc_network_interfaces` → Use `communications`
|
||||
- `pc_comm_config` → Use `communications`
|
||||
- `pc_dualpath_assignments` → Use `machinerelationships`
|
||||
- `pcstatus` → Use `machinestatus`
|
||||
|
||||
**Recommendation:** Drop after 30 days of stable operation
|
||||
|
||||
---
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [DATABASE_MIGRATION_FINAL_DESIGN.md](DATABASE_MIGRATION_FINAL_DESIGN.md) - Phase 1 spec
|
||||
- [PC_MACHINES_CONSOLIDATION_PLAN.md](PC_MACHINES_CONSOLIDATION_PLAN.md) - Phase 2 plan
|
||||
- [PHASE3_NETWORK_DEVICES_MIGRATION_PLAN.md](PHASE3_NETWORK_DEVICES_MIGRATION_PLAN.md) - Phase 3 plan
|
||||
- [MIGRATION_QUICK_REFERENCE.md](MIGRATION_QUICK_REFERENCE.md) - Quick lookup
|
||||
|
||||
---
|
||||
|
||||
**Last Updated:** 2025-11-25
|
||||
218
docs/archive/NESTED_ENTITY_CREATION.md
Normal file
218
docs/archive/NESTED_ENTITY_CREATION.md
Normal file
@@ -0,0 +1,218 @@
|
||||
# Nested Entity Creation Feature
|
||||
|
||||
## Overview
|
||||
The application now supports creating new related entities (vendors, models, machine types, functional accounts, business units) directly from the main entity forms without leaving the page.
|
||||
|
||||
## Implementation Date
|
||||
October 13, 2025
|
||||
|
||||
## Files Modified/Created
|
||||
|
||||
### Device/PC Management
|
||||
|
||||
#### `/home/camp/projects/windows/shopdb/editdevice.asp`
|
||||
- **Purpose**: Edit existing device/PC records
|
||||
- **Added Features**:
|
||||
- "+ New" button for Model dropdown with nested vendor creation
|
||||
- Bootstrap 4 input-group structure with visual form sections
|
||||
- jQuery handlers for showing/hiding nested forms
|
||||
- Removed PC Type creation (pctype is a simple lookup table)
|
||||
|
||||
#### `/home/camp/projects/windows/shopdb/updatedevice_direct.asp`
|
||||
- **Purpose**: Process device/PC updates with nested entity creation
|
||||
- **Added Features**:
|
||||
- Validation allowing "new" as valid value for model
|
||||
- New model creation with vendor association
|
||||
- New vendor creation with `ispc=1` flag
|
||||
- Proper EOF checks and CLng() conversions to prevent Type_mismatch errors
|
||||
- **Bug Fixes**:
|
||||
- Fixed Type_mismatch error at line 31 (added EOF check before accessing recordset)
|
||||
- Fixed Type_mismatch error at line 67 (restructured validation to avoid CLng on empty strings)
|
||||
|
||||
#### `/home/camp/projects/windows/shopdb/displaypc.asp`
|
||||
- **Purpose**: Display PC details with embedded edit form
|
||||
- **Added Features**:
|
||||
- "+ New" buttons for Vendor and Model dropdowns
|
||||
- Nested form sections for creating new vendors and models
|
||||
- jQuery handlers with slideDown/slideUp animations
|
||||
- Auto-sync: when vendor is selected, automatically populates model's vendor dropdown
|
||||
- Changed form action from `editmacine.asp` to `updatepc_direct.asp`
|
||||
- Changed button type from "button" to "submit" to enable form submission
|
||||
- Added hidden pcid field for form processing
|
||||
- **Corrected Filters**:
|
||||
- Changed vendor filter from `ismachine=1` to `ispc=1`
|
||||
- Changed model filter from `ismachine=1` to `ispc=1`
|
||||
|
||||
#### `/home/camp/projects/windows/shopdb/updatepc_direct.asp` (NEW)
|
||||
- **Purpose**: Process PC updates from displaypc.asp with nested entity creation
|
||||
- **Features**:
|
||||
- Handles PC updates with vendor and model modifications
|
||||
- New vendor creation with `ispc=1` flag
|
||||
- New model creation with vendor association
|
||||
- Proper validation and error handling
|
||||
- Redirects back to displaypc.asp after successful update
|
||||
|
||||
### Machine Management
|
||||
|
||||
#### `/home/camp/projects/windows/shopdb/addmachine.asp`
|
||||
- **Added Features**:
|
||||
- "+ New" buttons for Model, Vendor, Machine Type, Functional Account, and Business Unit dropdowns
|
||||
- PC association dropdown with scanner support
|
||||
- Barcode scanner input for PC serial number with auto-selection
|
||||
- Visual feedback (green border) when scanner matches a PC
|
||||
|
||||
#### `/home/camp/projects/windows/shopdb/savemachine_direct.asp`
|
||||
- **Added Features**:
|
||||
- Validation allowing "new" as valid value for all entity dropdowns
|
||||
- Nested entity creation: Model → Vendor, Machine Type → Functional Account
|
||||
- PC linkage: updates PC's `machinenumber` field when associated
|
||||
- Proper SQL injection protection with Replace() for single quotes
|
||||
|
||||
#### `/home/camp/projects/windows/shopdb/displaymachine.asp`
|
||||
- **Bug Fixes**:
|
||||
- Removed problematic includes (validation.asp, error_handler.asp, db_helpers.asp)
|
||||
- Replaced ExecuteParameterizedQuery() with objConn.Execute()
|
||||
- Added NULL checks to all Server.HTMLEncode() calls to prevent Type_mismatch errors
|
||||
- Fixed HTTP 500 errors preventing page load
|
||||
|
||||
#### `/home/camp/projects/windows/shopdb/editmacine.asp`
|
||||
- **Added Features**:
|
||||
- Similar nested entity creation as addmachine.asp
|
||||
- Allows updating machines with new vendors, models, types, etc.
|
||||
|
||||
## Key Technical Patterns
|
||||
|
||||
### Frontend (Bootstrap 4 + jQuery)
|
||||
|
||||
```html
|
||||
<!-- Dropdown with "+ New" button -->
|
||||
<div class="input-group">
|
||||
<select class="form-control" id="modelid" name="modelid">
|
||||
<option value="new">+ Add New Model</option>
|
||||
<!-- Existing options -->
|
||||
</select>
|
||||
<div class="input-group-append">
|
||||
<button type="button" class="btn btn-info" id="addModelBtn">
|
||||
<i class="zmdi zmdi-plus"></i> New
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Hidden nested form section -->
|
||||
<div id="newModelSection" style="display:none; ...">
|
||||
<h6>New Model Details</h6>
|
||||
<input type="text" name="newmodelnumber" />
|
||||
<!-- Nested vendor dropdown -->
|
||||
</div>
|
||||
```
|
||||
|
||||
### jQuery Handlers
|
||||
|
||||
```javascript
|
||||
// Dropdown change handler
|
||||
$('#modelid').on('change', function() {
|
||||
if ($(this).val() === 'new') {
|
||||
$('#newModelSection').slideDown();
|
||||
} else {
|
||||
$('#newModelSection').slideUp();
|
||||
}
|
||||
});
|
||||
|
||||
// "+ New" button click handler
|
||||
$('#addModelBtn').on('click', function() {
|
||||
$('#modelid').val('new').trigger('change');
|
||||
});
|
||||
```
|
||||
|
||||
### Backend (VBScript/ASP)
|
||||
|
||||
```vbscript
|
||||
' Validate - allow "new" as valid value
|
||||
If modelid <> "" And modelid <> "new" Then
|
||||
If Not IsNumeric(modelid) Or CLng(modelid) < 1 Then
|
||||
Response.Redirect("error page")
|
||||
End If
|
||||
End If
|
||||
|
||||
' Handle new entity creation
|
||||
If modelid = "new" Then
|
||||
' Validate required fields
|
||||
If Len(newmodelnumber) = 0 Then
|
||||
Response.Redirect("error page")
|
||||
End If
|
||||
|
||||
' Escape single quotes
|
||||
Dim escapedModelNumber
|
||||
escapedModelNumber = Replace(newmodelnumber, "'", "''")
|
||||
|
||||
' Insert new entity
|
||||
Dim sqlNewModel
|
||||
sqlNewModel = "INSERT INTO models (modelnumber, vendorid, isactive) VALUES ('" & escapedModelNumber & "', " & vendorid & ", 1)"
|
||||
|
||||
On Error Resume Next
|
||||
objConn.Execute sqlNewModel
|
||||
|
||||
If Err.Number <> 0 Then
|
||||
Response.Redirect("error page with message")
|
||||
End If
|
||||
|
||||
' Get newly created ID
|
||||
Dim rsNewModel
|
||||
Set rsNewModel = objConn.Execute("SELECT LAST_INSERT_ID() AS newid")
|
||||
modelid = CLng(rsNewModel("newid"))
|
||||
rsNewModel.Close
|
||||
Set rsNewModel = Nothing
|
||||
On Error Goto 0
|
||||
End If
|
||||
```
|
||||
|
||||
## Database Flags
|
||||
|
||||
### Vendor Table Flags
|
||||
- `ispc = 1`: Vendor supplies PC/computer equipment
|
||||
- `isprinter = 1`: Vendor supplies printer equipment
|
||||
- `ismachine = 1`: Vendor supplies machine/industrial equipment
|
||||
|
||||
### Entity Relationships
|
||||
- **Machines**: Model → Vendor (with `ismachine=1`)
|
||||
- **PCs**: Model → Vendor (with `ispc=1`)
|
||||
- **Printers**: Model → Vendor (with `isprinter=1`)
|
||||
- **Machine Types**: References Functional Account
|
||||
- **PC Types**: Simple lookup table (no functional account relationship)
|
||||
|
||||
## Known Limitations
|
||||
|
||||
1. **PC Type Creation**: Disabled because `pctype` table doesn't have `functionalaccountid` column
|
||||
2. **Form Validation**: Client-side validation is minimal; relies mostly on server-side validation
|
||||
3. **Error Messages**: Generic error redirects; could be improved with more specific error messages
|
||||
|
||||
## Bug Fixes Applied
|
||||
|
||||
### Type_mismatch Errors
|
||||
1. **updatedevice_direct.asp line 31**: Added `If Not rsCheck.EOF Then` before accessing recordset
|
||||
2. **updatedevice_direct.asp line 67**: Split validation into nested If statements to avoid CLng() on empty strings
|
||||
3. **displaymachine.asp line 77**: Added `If Not IsNull()` checks before all `Server.HTMLEncode()` calls
|
||||
|
||||
### Form Submission Issues
|
||||
1. **displaypc.asp**: Changed form action from `editmacine.asp` to `updatepc_direct.asp`
|
||||
2. **displaypc.asp**: Changed button type from "button" to "submit"
|
||||
3. **displaypc.asp**: Added hidden `pcid` field for proper form processing
|
||||
|
||||
## Testing Recommendations
|
||||
|
||||
1. Test creating new vendors from device edit form
|
||||
2. Test creating new models with new vendors (nested creation)
|
||||
3. Test scanner functionality in machine creation form
|
||||
4. Test validation with empty fields
|
||||
5. Test SQL injection protection with single quotes in entity names
|
||||
6. Test updating existing entities without creating new ones
|
||||
7. Test error handling when database constraints are violated
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
1. Add client-side validation for better UX
|
||||
2. Add AJAX submission to avoid page reloads
|
||||
3. Add confirmation dialogs before creating new entities
|
||||
4. Add ability to edit newly created entities inline
|
||||
5. Add autocomplete for entity names to prevent duplicates
|
||||
6. Add bulk import functionality for vendors/models
|
||||
740
docs/archive/NETWORK_DEVICES_UNIFIED_DESIGN.md
Normal file
740
docs/archive/NETWORK_DEVICES_UNIFIED_DESIGN.md
Normal file
@@ -0,0 +1,740 @@
|
||||
# Network Devices - Unified Page Design
|
||||
|
||||
**Date:** 2025-10-23
|
||||
**Approach:** Single "Network Devices" page showing all infrastructure with filtering
|
||||
**Files Required:** 4 files total
|
||||
|
||||
---
|
||||
|
||||
## Concept: One Page to Rule Them All
|
||||
|
||||
Instead of separate pages per device type, create a unified **Network Devices** page that shows:
|
||||
- Servers
|
||||
- Switches
|
||||
- 📹 Cameras
|
||||
- Access Points (if you add them later)
|
||||
- IDFs (Intermediate Distribution Frames)
|
||||
|
||||
**User Experience:**
|
||||
- Click "Network Devices" → See ALL devices in one table
|
||||
- Filter by type using tabs/dropdown
|
||||
- Click any device → Detail page (works for all types)
|
||||
- "Add Device" button → Select type, then add
|
||||
|
||||
---
|
||||
|
||||
## Page Architecture
|
||||
|
||||
### Main Pages (4 files)
|
||||
|
||||
```
|
||||
network_devices.asp → List all devices with type filter
|
||||
network_device_detail.asp?type=server&id=5 → View/edit any device
|
||||
add_network_device.asp?type=server → Add new device (any type)
|
||||
save_network_device.asp → Universal save endpoint
|
||||
```
|
||||
|
||||
### Navigation
|
||||
```
|
||||
Main Menu:
|
||||
└─ Network Devices (single menu item)
|
||||
└─ Opens network_devices.asp with tabs for filtering
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File 1: network_devices.asp (Main List View)
|
||||
|
||||
### Features
|
||||
- **Tabs/Filter:** All | Servers | Switches | Cameras | Access Points | IDFs
|
||||
- **Unified Table:** Shows all device types in one view
|
||||
- **Device Type Badge:** Visual indicator (Server, Switch, Camera, etc.)
|
||||
- **Search:** Filter by vendor, model, IP, serial number
|
||||
- **Actions:** View/Edit/Delete per device
|
||||
|
||||
### UI Mockup
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Network Devices [+ Add Device] │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ [ All ] [ Servers ] [ Switches ] [ Cameras ] [ More ▼ ] │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ Type | Vendor | Model | Serial | IP │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ [Server] | Dell | PowerEdge | ABC123 | 10.0.1.5 │
|
||||
│ [Switch] | Cisco | Catalyst 2960| XYZ789 | 10.0.1.1 │
|
||||
│ [Camera] | Hikvision | DS-2CD2142FWD| CAM001 | 10.0.2.10 │
|
||||
│ [Server] | HP | ProLiant | SRV456 | 10.0.1.6 │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Code Structure
|
||||
```vbscript
|
||||
<%
|
||||
' Get filter parameter (default = all)
|
||||
Dim filterType
|
||||
filterType = Request.QueryString("filter")
|
||||
If filterType = "" Then filterType = "all"
|
||||
|
||||
' Build query using vw_network_devices view
|
||||
Dim strSQL
|
||||
If filterType = "all" Then
|
||||
strSQL = "SELECT * FROM vw_network_devices WHERE isactive = 1 ORDER BY device_type, device_id DESC"
|
||||
Else
|
||||
' Filter by specific type (server, switch, camera)
|
||||
strSQL = "SELECT * FROM vw_network_devices WHERE device_type = '" & filterType & "' AND isactive = 1 ORDER BY device_id DESC"
|
||||
End If
|
||||
|
||||
Set rs = objConn.Execute(strSQL)
|
||||
%>
|
||||
|
||||
<!-- Tabs -->
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link <%If filterType="all" Then Response.Write("active")%>"
|
||||
href="network_devices.asp?filter=all">All Devices</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link <%If filterType="Server" Then Response.Write("active")%>"
|
||||
href="network_devices.asp?filter=Server">Servers</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link <%If filterType="Switch" Then Response.Write("active")%>"
|
||||
href="network_devices.asp?filter=Switch">Switches</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link <%If filterType="Camera" Then Response.Write("active")%>"
|
||||
href="network_devices.asp?filter=Camera">Cameras</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- Table -->
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Type</th>
|
||||
<th>Vendor</th>
|
||||
<th>Model</th>
|
||||
<th>Serial Number</th>
|
||||
<th>IP Address</th>
|
||||
<th>Description</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% Do While Not rs.EOF %>
|
||||
<tr>
|
||||
<td>
|
||||
<%
|
||||
' Device type badge with icon
|
||||
Dim badgeClass, iconClass
|
||||
Select Case rs("device_type")
|
||||
Case "Server"
|
||||
badgeClass = "badge-primary"
|
||||
iconClass = "zmdi-storage"
|
||||
Case "Switch"
|
||||
badgeClass = "badge-success"
|
||||
iconClass = "zmdi-device-hub"
|
||||
Case "Camera"
|
||||
badgeClass = "badge-info"
|
||||
iconClass = "zmdi-videocam"
|
||||
End Select
|
||||
%>
|
||||
<span class="badge <%=badgeClass%>">
|
||||
<i class="zmdi <%=iconClass%>"></i> <%=rs("device_type")%>
|
||||
</span>
|
||||
</td>
|
||||
<td><%=Server.HTMLEncode(rs("vendor") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("modelnumber") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("serialnumber") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("ipaddress") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("description") & "")%></td>
|
||||
<td>
|
||||
<a href="network_device_detail.asp?type=<%=LCase(rs("device_type"))%>&id=<%=rs("device_id")%>">
|
||||
<i class="zmdi zmdi-edit"></i> View
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<%
|
||||
rs.MoveNext
|
||||
Loop
|
||||
%>
|
||||
</tbody>
|
||||
</table>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File 2: network_device_detail.asp (Detail/Edit View)
|
||||
|
||||
### Features
|
||||
- Shows device details with vendor/model
|
||||
- Inline edit form (click Edit button)
|
||||
- Works for ANY device type
|
||||
- Map coordinates (if provided)
|
||||
- Link back to network_devices.asp
|
||||
|
||||
### Code Structure
|
||||
```vbscript
|
||||
<%
|
||||
' Get type and ID from URL
|
||||
Dim deviceType, deviceId
|
||||
deviceType = Request.QueryString("type") ' server, switch, camera
|
||||
deviceId = Request.QueryString("id")
|
||||
|
||||
' Validate type
|
||||
If deviceType <> "server" AND deviceType <> "switch" AND deviceType <> "camera" Then
|
||||
Response.Redirect("network_devices.asp")
|
||||
Response.End
|
||||
End If
|
||||
|
||||
' Map type to table/field names
|
||||
Dim tableName, idField, displayName
|
||||
Select Case deviceType
|
||||
Case "server"
|
||||
tableName = "servers"
|
||||
idField = "serverid"
|
||||
displayName = "Server"
|
||||
Case "switch"
|
||||
tableName = "switches"
|
||||
idField = "switchid"
|
||||
displayName = "Switch"
|
||||
Case "camera"
|
||||
tableName = "cameras"
|
||||
idField = "cameraid"
|
||||
displayName = "Camera"
|
||||
End Select
|
||||
|
||||
' Fetch device with model/vendor
|
||||
strSQL = "SELECT d.*, m.modelnumber, m.modelnumberid, v.vendor, v.vendorid " & _
|
||||
"FROM " & tableName & " d " & _
|
||||
"LEFT JOIN models m ON d.modelid = m.modelnumberid " & _
|
||||
"LEFT JOIN vendors v ON m.vendorid = v.vendorid " & _
|
||||
"WHERE d." & idField & " = " & deviceId
|
||||
|
||||
Set rs = objConn.Execute(strSQL)
|
||||
|
||||
If rs.EOF Then
|
||||
Response.Write("Device not found")
|
||||
Response.End
|
||||
End If
|
||||
%>
|
||||
|
||||
<div class="content-wrapper">
|
||||
<a href="network_devices.asp" class="btn btn-secondary">
|
||||
<i class="zmdi zmdi-arrow-left"></i> Back to Network Devices
|
||||
</a>
|
||||
|
||||
<h2><%=displayName%> #<%=deviceId%></h2>
|
||||
|
||||
<!-- Display Mode -->
|
||||
<div id="displayMode">
|
||||
<table class="table table-bordered">
|
||||
<tr>
|
||||
<th>Vendor</th>
|
||||
<td><%=Server.HTMLEncode(rs("vendor") & "N/A")%></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Model</th>
|
||||
<td><%=Server.HTMLEncode(rs("modelnumber") & "N/A")%></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Serial Number</th>
|
||||
<td><%=Server.HTMLEncode(rs("serialnumber") & "")%></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>IP Address</th>
|
||||
<td><%=Server.HTMLEncode(rs("ipaddress") & "")%></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Description</th>
|
||||
<td><%=Server.HTMLEncode(rs("description") & "")%></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Map Position</th>
|
||||
<td>
|
||||
<% If Not IsNull(rs("maptop")) And Not IsNull(rs("mapleft")) Then %>
|
||||
Top: <%=rs("maptop")%>, Left: <%=rs("mapleft")%>
|
||||
<a href="network_map.asp?highlight=<%=deviceType%>_<%=deviceId%>" target="_blank">
|
||||
<i class="zmdi zmdi-map"></i> View on Map
|
||||
</a>
|
||||
<% Else %>
|
||||
Not mapped
|
||||
<% End If %>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<button class="btn btn-primary" onclick="showEditMode()">
|
||||
<i class="zmdi zmdi-edit"></i> Edit <%=displayName%>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Edit Mode (hidden by default) -->
|
||||
<div id="editMode" style="display:none;">
|
||||
<form method="post" action="save_network_device.asp">
|
||||
<input type="hidden" name="type" value="<%=deviceType%>">
|
||||
<input type="hidden" name="id" value="<%=deviceId%>">
|
||||
|
||||
<div class="form-group">
|
||||
<label>Model</label>
|
||||
<select name="modelid" class="form-control">
|
||||
<option value="">-- No Model --</option>
|
||||
<%
|
||||
Dim strSQL2, rsModels
|
||||
strSQL2 = "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"
|
||||
Set rsModels = objConn.Execute(strSQL2)
|
||||
Do While Not rsModels.EOF
|
||||
Dim selected
|
||||
If Not IsNull(rs("modelnumberid")) Then
|
||||
If rsModels("modelnumberid") = rs("modelnumberid") Then
|
||||
selected = "selected"
|
||||
Else
|
||||
selected = ""
|
||||
End If
|
||||
End If
|
||||
%>
|
||||
<option value="<%=rsModels("modelnumberid")%>" <%=selected%>>
|
||||
<%=Server.HTMLEncode(rsModels("vendor") & " - " & rsModels("modelnumber"))%>
|
||||
</option>
|
||||
<%
|
||||
rsModels.MoveNext
|
||||
Loop
|
||||
rsModels.Close
|
||||
Set rsModels = Nothing
|
||||
%>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Serial Number</label>
|
||||
<input type="text" name="serialnumber" class="form-control"
|
||||
value="<%=Server.HTMLEncode(rs("serialnumber") & "")%>" maxlength="100">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>IP Address</label>
|
||||
<input type="text" name="ipaddress" class="form-control"
|
||||
value="<%=Server.HTMLEncode(rs("ipaddress") & "")%>"
|
||||
maxlength="15" pattern="^[0-9\.]+$">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Description</label>
|
||||
<textarea name="description" class="form-control" rows="3"><%=Server.HTMLEncode(rs("description") & "")%></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Map Position (Optional)</label>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<input type="number" name="maptop" class="form-control"
|
||||
placeholder="Top (Y)" value="<%=rs("maptop") & ""%>">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<input type="number" name="mapleft" class="form-control"
|
||||
placeholder="Left (X)" value="<%=rs("mapleft") & ""%>">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-success">
|
||||
<i class="zmdi zmdi-save"></i> Save Changes
|
||||
</button>
|
||||
<button type="button" class="btn btn-secondary" onclick="showDisplayMode()">
|
||||
Cancel
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function showEditMode() {
|
||||
document.getElementById('displayMode').style.display = 'none';
|
||||
document.getElementById('editMode').style.display = 'block';
|
||||
}
|
||||
function showDisplayMode() {
|
||||
document.getElementById('displayMode').style.display = 'block';
|
||||
document.getElementById('editMode').style.display = 'none';
|
||||
}
|
||||
</script>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File 3: add_network_device.asp (Add Form)
|
||||
|
||||
### Features
|
||||
- **First:** Select device type (Server, Switch, Camera, etc.)
|
||||
- **Then:** Show form with fields
|
||||
- Model/vendor dropdown
|
||||
- All standard fields
|
||||
- Optional map coordinates
|
||||
|
||||
### Code Structure
|
||||
```vbscript
|
||||
<%
|
||||
' Get device type (from URL or form)
|
||||
Dim deviceType
|
||||
deviceType = Request.QueryString("type")
|
||||
|
||||
' If no type selected, show type selector
|
||||
If deviceType = "" OR (deviceType <> "server" AND deviceType <> "switch" AND deviceType <> "camera") Then
|
||||
%>
|
||||
<div class="content-wrapper">
|
||||
<h2>Add Network Device</h2>
|
||||
<p>Select the type of device you want to add:</p>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<div class="card text-center">
|
||||
<div class="card-body">
|
||||
<i class="zmdi zmdi-storage" style="font-size:48px;"></i>
|
||||
<h5>Server</h5>
|
||||
<a href="add_network_device.asp?type=server" class="btn btn-primary">
|
||||
Add Server
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="card text-center">
|
||||
<div class="card-body">
|
||||
<i class="zmdi zmdi-device-hub" style="font-size:48px;"></i>
|
||||
<h5>Switch</h5>
|
||||
<a href="add_network_device.asp?type=switch" class="btn btn-success">
|
||||
Add Switch
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="card text-center">
|
||||
<div class="card-body">
|
||||
<i class="zmdi zmdi-videocam" style="font-size:48px;"></i>
|
||||
<h5>Camera</h5>
|
||||
<a href="add_network_device.asp?type=camera" class="btn btn-info">
|
||||
Add Camera
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<a href="network_devices.asp" class="btn btn-secondary">Cancel</a>
|
||||
</div>
|
||||
<%
|
||||
Response.End
|
||||
End If
|
||||
|
||||
' Type is selected, show form
|
||||
Dim displayName
|
||||
Select Case deviceType
|
||||
Case "server": displayName = "Server"
|
||||
Case "switch": displayName = "Switch"
|
||||
Case "camera": displayName = "Camera"
|
||||
End Select
|
||||
%>
|
||||
|
||||
<div class="content-wrapper">
|
||||
<h2>Add <%=displayName%></h2>
|
||||
|
||||
<form method="post" action="save_network_device.asp">
|
||||
<input type="hidden" name="type" value="<%=deviceType%>">
|
||||
|
||||
<div class="form-group">
|
||||
<label>Model <span class="text-danger">*</span></label>
|
||||
<select name="modelid" required class="form-control">
|
||||
<option value="">-- Select Model --</option>
|
||||
<%
|
||||
strSQL = "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"
|
||||
Set rsModels = objConn.Execute(strSQL)
|
||||
Do While Not rsModels.EOF
|
||||
%>
|
||||
<option value="<%=rsModels("modelnumberid")%>">
|
||||
<%=Server.HTMLEncode(rsModels("vendor") & " - " & rsModels("modelnumber"))%>
|
||||
</option>
|
||||
<%
|
||||
rsModels.MoveNext
|
||||
Loop
|
||||
rsModels.Close
|
||||
Set rsModels = Nothing
|
||||
%>
|
||||
</select>
|
||||
<small class="form-text text-muted">
|
||||
Don't see your model? <a href="addmodel.asp" target="_blank">Add a new model first</a>
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Serial Number</label>
|
||||
<input type="text" name="serialnumber" class="form-control" maxlength="100">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>IP Address</label>
|
||||
<input type="text" name="ipaddress" class="form-control"
|
||||
maxlength="15" pattern="^[0-9\.]+$" placeholder="192.168.1.100">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Description</label>
|
||||
<textarea name="description" class="form-control" rows="3"
|
||||
placeholder="Location, purpose, notes..."></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Map Position (Optional)</label>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<input type="number" name="maptop" class="form-control"
|
||||
placeholder="Top (Y coordinate)">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<input type="number" name="mapleft" class="form-control"
|
||||
placeholder="Left (X coordinate)">
|
||||
</div>
|
||||
</div>
|
||||
<small class="form-text text-muted">
|
||||
Used for network map visualization. Leave blank if unknown.
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-success">
|
||||
<i class="zmdi zmdi-save"></i> Add <%=displayName%>
|
||||
</button>
|
||||
<a href="network_devices.asp" class="btn btn-secondary">Cancel</a>
|
||||
</form>
|
||||
</div>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File 4: save_network_device.asp (Universal Save)
|
||||
|
||||
### Features
|
||||
- Handles INSERT and UPDATE for all device types
|
||||
- Validates all inputs
|
||||
- Redirects back to appropriate page
|
||||
|
||||
### Code Structure
|
||||
```vbscript
|
||||
<!--#include file="./includes/sql.asp"-->
|
||||
<!--#include file="./includes/error_handler.asp"-->
|
||||
<!--#include file="./includes/validation.asp"-->
|
||||
<!--#include file="./includes/db_helpers.asp"-->
|
||||
|
||||
<%
|
||||
' Get device type
|
||||
Dim deviceType
|
||||
deviceType = Request.Form("type")
|
||||
|
||||
' Validate type
|
||||
If deviceType <> "server" AND deviceType <> "switch" AND deviceType <> "camera" Then
|
||||
Response.Write("Error: Invalid device type")
|
||||
Response.End
|
||||
End If
|
||||
|
||||
' Map to table/field names
|
||||
Dim tableName, idField
|
||||
Select Case deviceType
|
||||
Case "server"
|
||||
tableName = "servers"
|
||||
idField = "serverid"
|
||||
Case "switch"
|
||||
tableName = "switches"
|
||||
idField = "switchid"
|
||||
Case "camera"
|
||||
tableName = "cameras"
|
||||
idField = "cameraid"
|
||||
End Select
|
||||
|
||||
' Get and validate form data
|
||||
Dim deviceId, modelid, serialnumber, ipaddress, description, maptop, mapleft
|
||||
|
||||
deviceId = GetSafeInteger("FORM", "id", 0, 0, 999999)
|
||||
modelid = GetSafeInteger("FORM", "modelid", 0, 0, 999999)
|
||||
serialnumber = GetSafeString("FORM", "serialnumber", "", 0, 100, "^[A-Za-z0-9\-\s]*$")
|
||||
ipaddress = GetSafeString("FORM", "ipaddress", "", 0, 15, "^[0-9\.]*$")
|
||||
description = GetSafeString("FORM", "description", "", 0, 255, "")
|
||||
maptop = GetSafeInteger("FORM", "maptop", 0, 0, 999999)
|
||||
mapleft = GetSafeInteger("FORM", "mapleft", 0, 0, 999999)
|
||||
|
||||
' Convert 0 to NULL for optional fields
|
||||
If modelid = 0 Then modelid = Null
|
||||
If maptop = 0 Then maptop = Null
|
||||
If mapleft = 0 Then mapleft = Null
|
||||
|
||||
' Validate required fields
|
||||
If IsNull(modelid) Then
|
||||
Response.Write("Error: Model is required")
|
||||
Response.End
|
||||
End If
|
||||
|
||||
' Build query
|
||||
Dim strSQL
|
||||
|
||||
If deviceId = 0 Then
|
||||
' INSERT - New device
|
||||
strSQL = "INSERT INTO " & tableName & " " & _
|
||||
"(modelid, serialnumber, ipaddress, description, maptop, mapleft, isactive) " & _
|
||||
"VALUES (?, ?, ?, ?, ?, ?, 1)"
|
||||
|
||||
Set rs = ExecuteParameterizedQuery(objConn, strSQL, _
|
||||
Array(modelid, serialnumber, ipaddress, description, maptop, mapleft))
|
||||
|
||||
' Get new ID for redirect
|
||||
deviceId = objConn.Execute("SELECT LAST_INSERT_ID() as newid")(0)
|
||||
Else
|
||||
' UPDATE - Existing device
|
||||
strSQL = "UPDATE " & tableName & " " & _
|
||||
"SET modelid = ?, serialnumber = ?, ipaddress = ?, description = ?, " & _
|
||||
" maptop = ?, mapleft = ? " & _
|
||||
"WHERE " & idField & " = ?"
|
||||
|
||||
Set rs = ExecuteParameterizedQuery(objConn, strSQL, _
|
||||
Array(modelid, serialnumber, ipaddress, description, maptop, mapleft, deviceId))
|
||||
End If
|
||||
|
||||
Call CleanupResources()
|
||||
|
||||
' Redirect to detail page
|
||||
Response.Redirect("network_device_detail.asp?type=" & deviceType & "&id=" & deviceId)
|
||||
%>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Navigation Update
|
||||
|
||||
### leftsidebar.asp
|
||||
```html
|
||||
<!-- Network Section -->
|
||||
<li class="nav-header">NETWORK</li>
|
||||
<li>
|
||||
<a href="network_devices.asp">
|
||||
<i class="zmdi zmdi-devices"></i> Network Devices
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="network_map.asp">
|
||||
<i class="zmdi zmdi-map"></i> Network Map
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="displaysubnets.asp">
|
||||
<i class="zmdi zmdi-network"></i> Subnets
|
||||
</a>
|
||||
</li>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Database View: vw_network_devices
|
||||
|
||||
The migration script already creates this! It unifies all infrastructure:
|
||||
|
||||
```sql
|
||||
CREATE VIEW vw_network_devices AS
|
||||
SELECT
|
||||
'Server' AS device_type,
|
||||
serverid AS device_id,
|
||||
modelid, modelnumber, vendor,
|
||||
serialnumber, ipaddress, description,
|
||||
maptop, mapleft, isactive
|
||||
FROM servers
|
||||
LEFT JOIN models ON servers.modelid = models.modelnumberid
|
||||
LEFT JOIN vendors ON models.vendorid = vendors.vendorid
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'Switch' AS device_type,
|
||||
switchid AS device_id,
|
||||
modelid, modelnumber, vendor,
|
||||
serialnumber, ipaddress, description,
|
||||
maptop, mapleft, isactive
|
||||
FROM switches
|
||||
LEFT JOIN models ON switches.modelid = models.modelnumberid
|
||||
LEFT JOIN vendors ON models.vendorid = vendors.vendorid
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'Camera' AS device_type,
|
||||
cameraid AS device_id,
|
||||
modelid, modelnumber, vendor,
|
||||
serialnumber, ipaddress, description,
|
||||
maptop, mapleft, isactive
|
||||
FROM cameras
|
||||
LEFT JOIN models ON cameras.modelid = models.modelnumberid
|
||||
LEFT JOIN vendors ON models.vendorid = vendors.vendorid
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Future: Adding More Device Types
|
||||
|
||||
To add **Access Points** or **IDFs** later:
|
||||
|
||||
1. **Database:**
|
||||
```sql
|
||||
CREATE TABLE accesspoints (
|
||||
accesspointid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
modelid INT(11),
|
||||
serialnumber VARCHAR(100),
|
||||
ipaddress VARCHAR(15),
|
||||
description VARCHAR(255),
|
||||
maptop INT(11),
|
||||
mapleft INT(11),
|
||||
isactive BIT(1) DEFAULT b'1',
|
||||
FOREIGN KEY (modelid) REFERENCES models(modelnumberid)
|
||||
);
|
||||
|
||||
-- Add to view
|
||||
ALTER VIEW vw_network_devices AS
|
||||
-- ... existing unions ...
|
||||
UNION ALL
|
||||
SELECT 'Access Point' AS device_type, accesspointid AS device_id, ...
|
||||
FROM accesspoints ...
|
||||
```
|
||||
|
||||
2. **Code:** Just add new case to Select statements!
|
||||
```vbscript
|
||||
Case "accesspoint"
|
||||
tableName = "accesspoints"
|
||||
idField = "accesspointid"
|
||||
displayName = "Access Point"
|
||||
```
|
||||
|
||||
3. **UI:** Add new tab to network_devices.asp
|
||||
|
||||
**That's it!** The unified design makes it trivial to extend.
|
||||
|
||||
---
|
||||
|
||||
## Summary: Why This Is Better
|
||||
|
||||
**Single source of truth** - One page for all infrastructure
|
||||
**Easy filtering** - Tabs to view by type or see all
|
||||
**Consistent UX** - Same interface for all device types
|
||||
**Uses existing view** - `vw_network_devices` already unifies them
|
||||
**Only 4 files** - vs 12 separate files
|
||||
**Easy to extend** - Add new device types without file duplication
|
||||
**Matches mental model** - "Network Devices" is how users think
|
||||
**Search/filter across all** - Find any device in one place
|
||||
|
||||
---
|
||||
|
||||
**Ready to build?** This is the cleanest approach!
|
||||
|
||||
780
docs/archive/PC_MACHINES_CONSOLIDATION_PLAN.md
Normal file
780
docs/archive/PC_MACHINES_CONSOLIDATION_PLAN.md
Normal file
@@ -0,0 +1,780 @@
|
||||
# PC to Machines Consolidation - Complete Design Document
|
||||
|
||||
**Date Created**: 2025-11-06
|
||||
**Status**: DESIGN PHASE
|
||||
**Complexity**: **CRITICAL - MASSIVE REFACTORING**
|
||||
**Production Deployment**: All SQL changes must be tracked
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
This document outlines the plan to consolidate the `pc` table (277 records) into the `machines` table (266 records) and implement a generic communications infrastructure.
|
||||
|
||||
**Goals:**
|
||||
1. Eliminate the `pc` table by migrating all data into `machines`
|
||||
2. Create a generic `communications` system supporting multiple communication types (IP, Serial, etc.)
|
||||
3. Maintain all existing functionality through views and code updates
|
||||
4. Enable future extensibility for new communication types
|
||||
|
||||
**Impact:**
|
||||
- **Tables to modify**: 12+
|
||||
- **Views to update**: 19
|
||||
- **ASP files**: TBD (likely 50+)
|
||||
- **Data records**: 543 machines total (266 current + 277 PCs)
|
||||
|
||||
---
|
||||
|
||||
## Part 1: Current State Analysis
|
||||
|
||||
### 1.1 PC Table Structure (277 records)
|
||||
|
||||
```sql
|
||||
CREATE TABLE pc (
|
||||
pcid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
hostname VARCHAR(100),
|
||||
serialnumber VARCHAR(100),
|
||||
loggedinuser VARCHAR(100),
|
||||
pctypeid INT(11), -- FK to pctype
|
||||
machinenumber VARCHAR(50), -- Links to machines.machinenumber
|
||||
lastupdated DATETIME,
|
||||
dateadded DATETIME,
|
||||
warrantyenddate DATE,
|
||||
warrantystatus VARCHAR(50),
|
||||
warrantydaysremaining INT(11),
|
||||
warrantyservicelevel VARCHAR(100),
|
||||
warrantylastchecked DATETIME,
|
||||
modelnumberid INT(11), -- FK to models
|
||||
isactive TINYINT(1),
|
||||
requires_manual_machine_config TINYINT(1),
|
||||
osid INT(11), -- FK to operatingsystems
|
||||
pcstatusid INT(11) -- FK to pcstatus
|
||||
);
|
||||
```
|
||||
|
||||
### 1.2 Machines Table Structure (266 records)
|
||||
|
||||
```sql
|
||||
CREATE TABLE machines (
|
||||
machineid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
machinetypeid INT(11) NOT NULL DEFAULT 1, -- FK to machinetypes
|
||||
machinenumber TINYTEXT,
|
||||
printerid INT(11),
|
||||
alias TINYTEXT,
|
||||
businessunitid INT(11),
|
||||
modelnumberid INT(11), -- FK to models
|
||||
isactive INT(11),
|
||||
ipaddress1 CHAR(50), -- Will be deprecated
|
||||
ipaddress2 CHAR(50), -- Will be deprecated
|
||||
machinenotes TEXT,
|
||||
mapleft SMALLINT(6),
|
||||
maptop SMALLINT(6),
|
||||
isvnc BIT(1),
|
||||
islocationonly BIT(1)
|
||||
);
|
||||
```
|
||||
|
||||
### 1.3 Existing Communication Tables
|
||||
|
||||
#### pc_comm_config (Serial/IP Configuration)
|
||||
```sql
|
||||
CREATE TABLE pc_comm_config (
|
||||
configid INT(11) PRIMARY KEY,
|
||||
pcid INT(11) NOT NULL, -- FK to pc
|
||||
configtype VARCHAR(50), -- 'Serial', 'IP', etc.
|
||||
portid VARCHAR(20), -- COM port
|
||||
baud INT(11),
|
||||
databits INT(11),
|
||||
stopbits VARCHAR(5),
|
||||
parity VARCHAR(10),
|
||||
crlf VARCHAR(5),
|
||||
ipaddress VARCHAR(45),
|
||||
socketnumber INT(11),
|
||||
additionalsettings TEXT,
|
||||
lastupdated DATETIME
|
||||
);
|
||||
```
|
||||
|
||||
#### pc_network_interfaces (Network Cards)
|
||||
```sql
|
||||
CREATE TABLE pc_network_interfaces (
|
||||
interfaceid INT(11) PRIMARY KEY,
|
||||
pcid INT(11) NOT NULL, -- FK to pc
|
||||
interfacename VARCHAR(255),
|
||||
ipaddress VARCHAR(45),
|
||||
subnetmask VARCHAR(45),
|
||||
defaultgateway VARCHAR(45),
|
||||
macaddress VARCHAR(17),
|
||||
isdhcp TINYINT(1),
|
||||
isactive TINYINT(1),
|
||||
ismachinenetwork TINYINT(1),
|
||||
lastupdated DATETIME
|
||||
);
|
||||
```
|
||||
|
||||
#### pc_dnc_config (DNC Configuration)
|
||||
```sql
|
||||
CREATE TABLE pc_dnc_config (
|
||||
dncid INT(11) PRIMARY KEY,
|
||||
pcid INT(11) NOT NULL UNIQUE, -- FK to pc
|
||||
site VARCHAR(100),
|
||||
cnc VARCHAR(100),
|
||||
ncif VARCHAR(50),
|
||||
machinenumber VARCHAR(50),
|
||||
hosttype VARCHAR(50),
|
||||
ftphostprimary VARCHAR(100),
|
||||
ftphostsecondary VARCHAR(100),
|
||||
ftpaccount VARCHAR(100),
|
||||
debug VARCHAR(10),
|
||||
uploads VARCHAR(10),
|
||||
scanner VARCHAR(10),
|
||||
dripfeed VARCHAR(10),
|
||||
additionalsettings TEXT,
|
||||
lastupdated DATETIME,
|
||||
dualpath_enabled TINYINT(1),
|
||||
path1_name VARCHAR(255),
|
||||
path2_name VARCHAR(255),
|
||||
ge_registry_32bit TINYINT(1),
|
||||
ge_registry_64bit TINYINT(1),
|
||||
ge_registry_notes TEXT
|
||||
);
|
||||
```
|
||||
|
||||
### 1.4 Dependencies
|
||||
|
||||
#### Tables Referencing PC:
|
||||
1. **machine_overrides** - Manual machine number overrides for PCs
|
||||
2. **machine_pc_relationships** - Many-to-many relationships
|
||||
3. **pc_comm_config** - Serial/IP communication settings
|
||||
4. **pc_dnc_config** - DNC configuration
|
||||
5. **pc_dualpath_assignments** - Secondary machine assignments
|
||||
6. **pc_network_interfaces** - Network interface details
|
||||
|
||||
#### Views Using PC (19 views):
|
||||
1. vw_active_pcs
|
||||
2. vw_dnc_config
|
||||
3. vw_dualpath_management
|
||||
4. vw_engineer_pcs
|
||||
5. vw_ge_machines
|
||||
6. vw_machine_assignment_status
|
||||
7. vw_machine_assignments
|
||||
8. vw_machine_type_stats
|
||||
9. vw_multi_pc_machines
|
||||
10. vw_pc_network_summary
|
||||
11. vw_pc_resolved_machines
|
||||
12. vw_pc_summary
|
||||
13. vw_pcs_by_hardware
|
||||
14. vw_recent_updates
|
||||
15. vw_shopfloor_applications_summary
|
||||
16. vw_shopfloor_comm_config
|
||||
17. vw_shopfloor_pcs
|
||||
18. vw_standard_pcs
|
||||
19. vw_vendor_summary
|
||||
20. vw_warranties_expiring
|
||||
|
||||
---
|
||||
|
||||
## Part 2: New Design - Communications Infrastructure
|
||||
|
||||
### 2.1 New Table: comstypes (Communication Types)
|
||||
|
||||
```sql
|
||||
CREATE TABLE comstypes (
|
||||
comstypeid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
typename VARCHAR(50) NOT NULL UNIQUE, -- 'IP', 'Serial', 'USB', 'Parallel', 'Network', etc.
|
||||
description VARCHAR(255),
|
||||
requires_port TINYINT(1) DEFAULT 0, -- Does this type need a port? (Serial, Parallel)
|
||||
requires_ipaddress TINYINT(1) DEFAULT 0, -- Does this type need an IP? (IP, Network)
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
displayorder INT(11) DEFAULT 0,
|
||||
dateadded DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
**Initial Data:**
|
||||
```sql
|
||||
INSERT INTO comstypes (typename, description, requires_port, requires_ipaddress, displayorder) VALUES
|
||||
('IP', 'TCP/IP Network Communication', 0, 1, 1),
|
||||
('Serial', 'Serial Port Communication (RS-232)', 1, 0, 2),
|
||||
('Network_Interface', 'Network Interface Card', 0, 1, 3),
|
||||
('USB', 'USB Connection', 1, 0, 4),
|
||||
('Parallel', 'Parallel Port Connection', 1, 0, 5),
|
||||
('VNC', 'Virtual Network Computing', 0, 1, 6),
|
||||
('FTP', 'File Transfer Protocol', 0, 1, 7);
|
||||
```
|
||||
|
||||
### 2.2 New Table: communications
|
||||
|
||||
```sql
|
||||
CREATE TABLE communications (
|
||||
comid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
machineid INT(11) NOT NULL, -- FK to machines.machineid
|
||||
comstypeid INT(11) NOT NULL, -- FK to comstypes.comstypeid
|
||||
|
||||
-- Generic fields applicable to multiple types
|
||||
ipaddress VARCHAR(45), -- For IP-based communications
|
||||
port INT(11), -- Port number (for IP) or COM port number
|
||||
portname VARCHAR(20), -- COM1, COM2, LPT1, etc.
|
||||
macaddress VARCHAR(17), -- MAC address for network interfaces
|
||||
|
||||
-- Network-specific fields
|
||||
subnetmask VARCHAR(45),
|
||||
defaultgateway VARCHAR(45),
|
||||
dnsserver VARCHAR(45),
|
||||
isdhcp TINYINT(1) DEFAULT 0,
|
||||
|
||||
-- Serial-specific fields
|
||||
baud INT(11), -- 9600, 115200, etc.
|
||||
databits INT(11), -- 7, 8
|
||||
stopbits VARCHAR(5), -- '1', '1.5', '2'
|
||||
parity VARCHAR(10), -- 'None', 'Even', 'Odd', 'Mark', 'Space'
|
||||
flowcontrol VARCHAR(20), -- 'None', 'Hardware', 'Software'
|
||||
|
||||
-- Protocol-specific fields
|
||||
protocol VARCHAR(50), -- 'TCP', 'UDP', 'FTP', 'HTTP', etc.
|
||||
username VARCHAR(100), -- For authenticated protocols
|
||||
password VARCHAR(255), -- Encrypted password
|
||||
|
||||
-- General metadata
|
||||
interfacename VARCHAR(255), -- Network adapter name
|
||||
description VARCHAR(255),
|
||||
isprimary TINYINT(1) DEFAULT 0, -- Is this the primary communication method?
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
ismachinenetwork TINYINT(1) DEFAULT 0, -- Is this for machine network (vs office network)?
|
||||
|
||||
-- Additional settings as JSON/TEXT
|
||||
additionalsettings TEXT, -- JSON for future extensibility
|
||||
|
||||
-- Audit fields
|
||||
lastupdated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
dateadded DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
-- Indexes
|
||||
KEY idx_machineid (machineid),
|
||||
KEY idx_comstypeid (comstypeid),
|
||||
KEY idx_ipaddress (ipaddress),
|
||||
KEY idx_isactive (isactive),
|
||||
KEY idx_isprimary (isprimary),
|
||||
|
||||
-- Foreign Keys
|
||||
CONSTRAINT fk_communications_machineid FOREIGN KEY (machineid) REFERENCES machines(machineid),
|
||||
CONSTRAINT fk_communications_comstypeid FOREIGN KEY (comstypeid) REFERENCES comstypes(comstypeid)
|
||||
);
|
||||
```
|
||||
|
||||
### 2.3 Modified Machines Table
|
||||
|
||||
Add new fields to support PC data and communications:
|
||||
|
||||
**NOTE**: Warranty fields are NOT added to machines table. See WARRANTY_MANAGEMENT_DESIGN.md for the separate warranty infrastructure.
|
||||
|
||||
```sql
|
||||
ALTER TABLE machines
|
||||
-- PC-specific fields
|
||||
ADD COLUMN hostname VARCHAR(100) AFTER machinenumber,
|
||||
ADD COLUMN serialnumber VARCHAR(100) AFTER modelnumberid,
|
||||
ADD COLUMN loggedinuser VARCHAR(100) AFTER hostname,
|
||||
ADD COLUMN osid INT(11) AFTER modelnumberid,
|
||||
ADD COLUMN pcstatusid INT(11) AFTER osid,
|
||||
ADD COLUMN pctypeid INT(11) AFTER machinetypeid,
|
||||
|
||||
-- Configuration flags
|
||||
ADD COLUMN requires_manual_machine_config TINYINT(1) DEFAULT 0,
|
||||
|
||||
-- Audit fields
|
||||
ADD COLUMN lastupdated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
ADD COLUMN dateadded DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
-- Foreign keys
|
||||
ADD CONSTRAINT fk_machines_osid FOREIGN KEY (osid) REFERENCES operatingsystems(osid),
|
||||
ADD CONSTRAINT fk_machines_pcstatusid FOREIGN KEY (pcstatusid) REFERENCES pcstatus(pcstatusid),
|
||||
ADD CONSTRAINT fk_machines_pctypeid FOREIGN KEY (pctypeid) REFERENCES pctype(pctypeid);
|
||||
|
||||
-- Indexes
|
||||
CREATE INDEX idx_machines_hostname ON machines(hostname);
|
||||
CREATE INDEX idx_machines_serialnumber ON machines(serialnumber);
|
||||
CREATE INDEX idx_machines_pctypeid ON machines(pctypeid);
|
||||
CREATE INDEX idx_machines_osid ON machines(osid);
|
||||
CREATE INDEX idx_machines_lastupdated ON machines(lastupdated);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 3: Migration Strategy
|
||||
|
||||
### 3.1 Migration Phases
|
||||
|
||||
**Phase 1: Schema Preparation** (REVERSIBLE)
|
||||
1. Create `comstypes` table
|
||||
2. Create `communications` table
|
||||
3. Add new columns to `machines` table
|
||||
4. Create backup tables
|
||||
|
||||
**Phase 2: Data Migration** (REVERSIBLE with backup)
|
||||
1. Migrate PC records to machines table
|
||||
2. Migrate PC communication data to communications table
|
||||
3. Migrate network interface data to communications table
|
||||
4. Migrate DNC configuration to communications or new DNC table
|
||||
5. Update relationship tables
|
||||
|
||||
**Phase 3: Reference Updates** (REQUIRES TESTING)
|
||||
1. Create compatibility views (pc → machines)
|
||||
2. Update dependent tables
|
||||
3. Update 19 existing views
|
||||
|
||||
**Phase 4: Application Updates** (REQUIRES EXTENSIVE TESTING)
|
||||
1. Update ASP files
|
||||
2. Update stored procedures (if any)
|
||||
3. Test all functionality
|
||||
|
||||
**Phase 5: Cleanup** (IRREVERSIBLE - DO AFTER 30 DAYS)
|
||||
1. Drop old `pc` table
|
||||
2. Drop compatibility views
|
||||
3. Remove deprecated ipaddress1/ipaddress2 from machines
|
||||
|
||||
### 3.2 Machine Type for PCs
|
||||
|
||||
We need to add machine types for PCs:
|
||||
|
||||
```sql
|
||||
INSERT INTO machinetypes (machinetype, machinedescription, functionalaccountid, isactive)
|
||||
VALUES
|
||||
('PC - Standard', 'Standard office/engineering workstation', (SELECT functionalaccountid FROM functionalaccounts WHERE functionalaccount = 'IT' LIMIT 1), 1),
|
||||
('PC - Shopfloor', 'Shopfloor machine control PC', (SELECT functionalaccountid FROM functionalaccounts WHERE functionalaccount = 'MFG' LIMIT 1), 1),
|
||||
('PC - Engineer', 'Engineering workstation', (SELECT functionalaccountid FROM functionalaccounts WHERE functionalaccount = 'ENG' LIMIT 1), 1);
|
||||
```
|
||||
|
||||
### 3.3 Data Mapping: PC → Machines
|
||||
|
||||
| PC Field | Machines Field | Notes |
|
||||
|----------|---------------|-------|
|
||||
| pcid | machineid | New auto-increment ID |
|
||||
| hostname | hostname | NEW COLUMN |
|
||||
| serialnumber | serialnumber | NEW COLUMN |
|
||||
| loggedinuser | loggedinuser | NEW COLUMN |
|
||||
| pctypeid | pctypeid | NEW COLUMN, FK preserved |
|
||||
| machinenumber | machinenumber | Existing field |
|
||||
| lastupdated | lastupdated | NEW COLUMN |
|
||||
| dateadded | dateadded | NEW COLUMN |
|
||||
| modelnumberid | modelnumberid | Existing field |
|
||||
| isactive | isactive | Existing field |
|
||||
| requires_manual_machine_config | requires_manual_machine_config | NEW COLUMN |
|
||||
| osid | osid | NEW COLUMN, FK preserved |
|
||||
| pcstatusid | pcstatusid | NEW COLUMN, FK preserved |
|
||||
| N/A | machinetypeid | Map from pctypeid to new machine types |
|
||||
| N/A | alias | Set to hostname for PCs |
|
||||
| N/A | businessunitid | Default to 1 or derive from location |
|
||||
|
||||
**Warranty Fields**: Migrated to `warranties` table (see WARRANTY_MANAGEMENT_DESIGN.md)
|
||||
- warrantyenddate → warranties.enddate
|
||||
- warrantystatus → warranties.status
|
||||
- warrantyservicelevel → warranties.servicelevel
|
||||
- warrantylastchecked → warranties.lastcheckeddate
|
||||
|
||||
### 3.4 Data Mapping: pc_network_interfaces → communications
|
||||
|
||||
| Old Field | New Field | New comstypeid |
|
||||
|-----------|-----------|----------------|
|
||||
| interfaceid | comid | Auto-increment |
|
||||
| pcid | machineid | Lookup from migrated PCs |
|
||||
| N/A | comstypeid | 3 (Network_Interface) |
|
||||
| ipaddress | ipaddress | Direct copy |
|
||||
| subnetmask | subnetmask | Direct copy |
|
||||
| defaultgateway | defaultgateway | Direct copy |
|
||||
| macaddress | macaddress | Direct copy |
|
||||
| interfacename | interfacename | Direct copy |
|
||||
| isdhcp | isdhcp | Direct copy |
|
||||
| isactive | isactive | Direct copy |
|
||||
| ismachinenetwork | ismachinenetwork | Direct copy |
|
||||
|
||||
### 3.5 Data Mapping: pc_comm_config → communications
|
||||
|
||||
| Old Field | New Field | New comstypeid |
|
||||
|-----------|-----------|----------------|
|
||||
| configid | comid | Auto-increment |
|
||||
| pcid | machineid | Lookup from migrated PCs |
|
||||
| configtype | comstypeid | Map 'Serial'→2, 'IP'→1, etc. |
|
||||
| portid | portname | Direct copy (COM1, etc.) |
|
||||
| baud | baud | Direct copy |
|
||||
| databits | databits | Direct copy |
|
||||
| stopbits | stopbits | Direct copy |
|
||||
| parity | parity | Direct copy |
|
||||
| ipaddress | ipaddress | Direct copy |
|
||||
| socketnumber | port | Direct copy |
|
||||
| additionalsettings | additionalsettings | Direct copy |
|
||||
|
||||
---
|
||||
|
||||
## Part 4: SQL Migration Scripts
|
||||
|
||||
### 4.1 Script 01: Schema Creation
|
||||
|
||||
File: `sql/01_create_communications_infrastructure.sql`
|
||||
|
||||
```sql
|
||||
-- =====================================================
|
||||
-- SCRIPT 01: Create Communications Infrastructure
|
||||
-- =====================================================
|
||||
-- Date: 2025-11-06
|
||||
-- Purpose: Create comstypes and communications tables
|
||||
-- Status: REVERSIBLE (has rollback script)
|
||||
-- =====================================================
|
||||
|
||||
USE shopdb;
|
||||
SET SQL_SAFE_UPDATES = 0;
|
||||
|
||||
-- Create comstypes table
|
||||
CREATE TABLE IF NOT EXISTS comstypes (
|
||||
comstypeid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
typename VARCHAR(50) NOT NULL UNIQUE,
|
||||
description VARCHAR(255),
|
||||
requires_port TINYINT(1) DEFAULT 0,
|
||||
requires_ipaddress TINYINT(1) DEFAULT 0,
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
displayorder INT(11) DEFAULT 0,
|
||||
dateadded DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
KEY idx_isactive (isactive),
|
||||
KEY idx_displayorder (displayorder)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- Insert communication types
|
||||
INSERT INTO comstypes (typename, description, requires_port, requires_ipaddress, displayorder) VALUES
|
||||
('IP', 'TCP/IP Network Communication', 0, 1, 1),
|
||||
('Serial', 'Serial Port Communication (RS-232)', 1, 0, 2),
|
||||
('Network_Interface', 'Network Interface Card', 0, 1, 3),
|
||||
('USB', 'USB Connection', 1, 0, 4),
|
||||
('Parallel', 'Parallel Port Connection', 1, 0, 5),
|
||||
('VNC', 'Virtual Network Computing', 0, 1, 6),
|
||||
('FTP', 'File Transfer Protocol', 0, 1, 7);
|
||||
|
||||
-- Create communications table
|
||||
CREATE TABLE IF NOT EXISTS communications (
|
||||
comid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
machineid INT(11) NOT NULL,
|
||||
comstypeid INT(11) NOT NULL,
|
||||
|
||||
-- Generic fields
|
||||
ipaddress VARCHAR(45),
|
||||
port INT(11),
|
||||
portname VARCHAR(20),
|
||||
macaddress VARCHAR(17),
|
||||
|
||||
-- Network-specific
|
||||
subnetmask VARCHAR(45),
|
||||
defaultgateway VARCHAR(45),
|
||||
dnsserver VARCHAR(45),
|
||||
isdhcp TINYINT(1) DEFAULT 0,
|
||||
|
||||
-- Serial-specific
|
||||
baud INT(11),
|
||||
databits INT(11),
|
||||
stopbits VARCHAR(5),
|
||||
parity VARCHAR(10),
|
||||
flowcontrol VARCHAR(20),
|
||||
|
||||
-- Protocol-specific
|
||||
protocol VARCHAR(50),
|
||||
username VARCHAR(100),
|
||||
password VARCHAR(255),
|
||||
|
||||
-- General metadata
|
||||
interfacename VARCHAR(255),
|
||||
description VARCHAR(255),
|
||||
isprimary TINYINT(1) DEFAULT 0,
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
ismachinenetwork TINYINT(1) DEFAULT 0,
|
||||
|
||||
-- Additional settings
|
||||
additionalsettings TEXT,
|
||||
|
||||
-- Audit fields
|
||||
lastupdated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
dateadded DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
-- Indexes
|
||||
KEY idx_machineid (machineid),
|
||||
KEY idx_comstypeid (comstypeid),
|
||||
KEY idx_ipaddress (ipaddress),
|
||||
KEY idx_isactive (isactive),
|
||||
KEY idx_isprimary (isprimary),
|
||||
|
||||
-- Foreign Keys
|
||||
CONSTRAINT fk_communications_machineid FOREIGN KEY (machineid) REFERENCES machines(machineid),
|
||||
CONSTRAINT fk_communications_comstypeid FOREIGN KEY (comstypeid) REFERENCES comstypes(comstypeid)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- Verification
|
||||
SELECT 'comstypes table created' AS status, COUNT(*) AS type_count FROM comstypes;
|
||||
SELECT 'communications table created' AS status;
|
||||
|
||||
SET SQL_SAFE_UPDATES = 1;
|
||||
```
|
||||
|
||||
### 4.2 Script 02: Extend Machines Table
|
||||
|
||||
File: `sql/02_extend_machines_table.sql`
|
||||
|
||||
**NOTE**: Warranty fields removed - see script 04 for warranty infrastructure
|
||||
|
||||
```sql
|
||||
-- =====================================================
|
||||
-- SCRIPT 02: Extend Machines Table for PC Data
|
||||
-- =====================================================
|
||||
-- Date: 2025-11-06
|
||||
-- Purpose: Add PC-related columns to machines table
|
||||
-- Status: REVERSIBLE (has rollback script)
|
||||
-- NOTE: Warranty data goes to separate warranties table (script 04)
|
||||
-- =====================================================
|
||||
|
||||
USE shopdb;
|
||||
SET SQL_SAFE_UPDATES = 0;
|
||||
|
||||
-- Add PC-specific fields
|
||||
ALTER TABLE machines
|
||||
ADD COLUMN IF NOT EXISTS hostname VARCHAR(100) AFTER machinenumber,
|
||||
ADD COLUMN IF NOT EXISTS serialnumber VARCHAR(100) AFTER modelnumberid,
|
||||
ADD COLUMN IF NOT EXISTS loggedinuser VARCHAR(100) AFTER hostname,
|
||||
ADD COLUMN IF NOT EXISTS osid INT(11) AFTER modelnumberid,
|
||||
ADD COLUMN IF NOT EXISTS pcstatusid INT(11) AFTER osid,
|
||||
ADD COLUMN IF NOT EXISTS pctypeid INT(11) AFTER machinetypeid;
|
||||
|
||||
-- Add configuration flags
|
||||
ALTER TABLE machines
|
||||
ADD COLUMN IF NOT EXISTS requires_manual_machine_config TINYINT(1) DEFAULT 0 AFTER islocationonly;
|
||||
|
||||
-- Add audit fields
|
||||
ALTER TABLE machines
|
||||
ADD COLUMN IF NOT EXISTS lastupdated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER requires_manual_machine_config,
|
||||
ADD COLUMN IF NOT EXISTS dateadded DATETIME DEFAULT CURRENT_TIMESTAMP AFTER lastupdated;
|
||||
|
||||
-- Add foreign keys
|
||||
ALTER TABLE machines
|
||||
ADD CONSTRAINT fk_machines_osid FOREIGN KEY (osid) REFERENCES operatingsystems(osid);
|
||||
|
||||
ALTER TABLE machines
|
||||
ADD CONSTRAINT fk_machines_pcstatusid FOREIGN KEY (pcstatusid) REFERENCES pcstatus(pcstatusid);
|
||||
|
||||
ALTER TABLE machines
|
||||
ADD CONSTRAINT fk_machines_pctypeid FOREIGN KEY (pctypeid) REFERENCES pctype(pctypeid);
|
||||
|
||||
-- Create indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_machines_hostname ON machines(hostname);
|
||||
CREATE INDEX IF NOT EXISTS idx_machines_serialnumber ON machines(serialnumber);
|
||||
CREATE INDEX IF NOT EXISTS idx_machines_pctypeid ON machines(pctypeid);
|
||||
CREATE INDEX IF NOT EXISTS idx_machines_osid ON machines(osid);
|
||||
CREATE INDEX IF NOT EXISTS idx_machines_lastupdated ON machines(lastupdated);
|
||||
|
||||
-- Verification
|
||||
DESCRIBE machines;
|
||||
|
||||
SET SQL_SAFE_UPDATES = 1;
|
||||
```
|
||||
|
||||
### 4.3 Script 03: Create PC Machine Types
|
||||
|
||||
File: `sql/03_create_pc_machine_types.sql`
|
||||
|
||||
```sql
|
||||
-- =====================================================
|
||||
-- SCRIPT 03: Create Machine Types for PCs
|
||||
-- =====================================================
|
||||
-- Date: 2025-11-06
|
||||
-- Purpose: Add PC-related machine types
|
||||
-- Status: REVERSIBLE
|
||||
-- =====================================================
|
||||
|
||||
USE shopdb;
|
||||
SET SQL_SAFE_UPDATES = 0;
|
||||
|
||||
-- Get or create functional accounts
|
||||
INSERT IGNORE INTO functionalaccounts (functionalaccount, description, isactive)
|
||||
VALUES
|
||||
('IT', 'Information Technology', 1),
|
||||
('MFG', 'Manufacturing', 1),
|
||||
('ENG', 'Engineering', 1);
|
||||
|
||||
-- Create PC machine types
|
||||
INSERT INTO machinetypes (machinetype, machinedescription, functionalaccountid, isactive)
|
||||
SELECT 'PC - Standard', 'Standard office/engineering workstation', functionalaccountid, 1
|
||||
FROM functionalaccounts WHERE functionalaccount = 'IT' LIMIT 1
|
||||
WHERE NOT EXISTS (SELECT 1 FROM machinetypes WHERE machinetype = 'PC - Standard');
|
||||
|
||||
INSERT INTO machinetypes (machinetype, machinedescription, functionalaccountid, isactive)
|
||||
SELECT 'PC - Shopfloor', 'Shopfloor machine control PC', functionalaccountid, 1
|
||||
FROM functionalaccounts WHERE functionalaccount = 'MFG' LIMIT 1
|
||||
WHERE NOT EXISTS (SELECT 1 FROM machinetypes WHERE machinetype = 'PC - Shopfloor');
|
||||
|
||||
INSERT INTO machinetypes (machinetype, machinedescription, functionalaccountid, isactive)
|
||||
SELECT 'PC - Engineer', 'Engineering workstation', functionalaccountid, 1
|
||||
FROM functionalaccounts WHERE functionalaccount = 'ENG' LIMIT 1
|
||||
WHERE NOT EXISTS (SELECT 1 FROM machinetypes WHERE machinetype = 'PC - Engineer');
|
||||
|
||||
-- Verification
|
||||
SELECT * FROM machinetypes WHERE machinetype LIKE 'PC -%';
|
||||
|
||||
SET SQL_SAFE_UPDATES = 1;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 5: Rollback Scripts
|
||||
|
||||
### 5.1 Rollback Script 01
|
||||
|
||||
File: `sql/ROLLBACK_01_communications_infrastructure.sql`
|
||||
|
||||
```sql
|
||||
-- =====================================================
|
||||
-- ROLLBACK 01: Remove Communications Infrastructure
|
||||
-- =====================================================
|
||||
|
||||
USE shopdb;
|
||||
SET SQL_SAFE_UPDATES = 0;
|
||||
|
||||
-- Drop tables in correct order (FK constraints)
|
||||
DROP TABLE IF EXISTS communications;
|
||||
DROP TABLE IF EXISTS comstypes;
|
||||
|
||||
SELECT 'Communications infrastructure removed' AS status;
|
||||
|
||||
SET SQL_SAFE_UPDATES = 1;
|
||||
```
|
||||
|
||||
### 5.2 Rollback Script 02
|
||||
|
||||
File: `sql/ROLLBACK_02_machines_table_extensions.sql`
|
||||
|
||||
```sql
|
||||
-- =====================================================
|
||||
-- ROLLBACK 02: Remove Machines Table Extensions
|
||||
-- =====================================================
|
||||
|
||||
USE shopdb;
|
||||
SET SQL_SAFE_UPDATES = 0;
|
||||
|
||||
-- Drop foreign keys first
|
||||
ALTER TABLE machines DROP FOREIGN KEY IF EXISTS fk_machines_osid;
|
||||
ALTER TABLE machines DROP FOREIGN KEY IF EXISTS fk_machines_pcstatusid;
|
||||
ALTER TABLE machines DROP FOREIGN KEY IF EXISTS fk_machines_pctypeid;
|
||||
|
||||
-- Drop indexes
|
||||
DROP INDEX IF EXISTS idx_machines_hostname ON machines;
|
||||
DROP INDEX IF EXISTS idx_machines_serialnumber ON machines;
|
||||
DROP INDEX IF EXISTS idx_machines_pctypeid ON machines;
|
||||
DROP INDEX IF EXISTS idx_machines_osid ON machines;
|
||||
DROP INDEX IF EXISTS idx_machines_lastupdated ON machines;
|
||||
|
||||
-- Remove columns (MySQL 5.6 doesn't support IF EXISTS for columns)
|
||||
ALTER TABLE machines
|
||||
DROP COLUMN hostname,
|
||||
DROP COLUMN serialnumber,
|
||||
DROP COLUMN loggedinuser,
|
||||
DROP COLUMN osid,
|
||||
DROP COLUMN pcstatusid,
|
||||
DROP COLUMN pctypeid,
|
||||
DROP COLUMN requires_manual_machine_config,
|
||||
DROP COLUMN lastupdated,
|
||||
DROP COLUMN dateadded;
|
||||
|
||||
SELECT 'Machines table extensions removed' AS status;
|
||||
|
||||
SET SQL_SAFE_UPDATES = 1;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 6: Next Steps & Considerations
|
||||
|
||||
### 6.1 Critical Decisions Needed
|
||||
|
||||
1. **DNC Configuration**:
|
||||
- Keep pc_dnc_config as-is but reference machines instead of pc?
|
||||
- Or migrate to communications table with comstypeid='DNC'?
|
||||
- **Recommendation**: Keep separate, too complex for generic table
|
||||
|
||||
2. **Machine Overrides**:
|
||||
- Keep machine_overrides table?
|
||||
- **Recommendation**: Yes, but update FK to machines
|
||||
|
||||
3. **Warranty Management**:
|
||||
- Extend to all machines or keep PC-specific?
|
||||
- **Recommendation**: Available for all machines
|
||||
|
||||
4. **Machine Numbers**:
|
||||
- PCs currently link to machines via machinenumber (string match)
|
||||
- After migration, use direct machineid FK
|
||||
- **Recommendation**: Add explicit FK relationships
|
||||
|
||||
### 6.2 Testing Requirements
|
||||
|
||||
1. **Data Integrity**:
|
||||
- Verify all 277 PCs migrated
|
||||
- Verify all communication records migrated
|
||||
- Verify all FK relationships intact
|
||||
|
||||
2. **View Testing**:
|
||||
- Test all 19 views return same data
|
||||
- Performance testing for complex views
|
||||
|
||||
3. **Application Testing**:
|
||||
- Test every ASP file that touches pc table
|
||||
- Test all CRUD operations
|
||||
- Test warranty tracking
|
||||
- Test DNC configuration
|
||||
|
||||
### 6.3 Production Deployment Checklist
|
||||
|
||||
- [ ] Create full database backup
|
||||
- [ ] Test migration on dev environment
|
||||
- [ ] Create compatibility views for old queries
|
||||
- [ ] Update all ASP files
|
||||
- [ ] Schedule maintenance window (4-6 hours recommended)
|
||||
- [ ] Prepare rollback procedure
|
||||
- [ ] Document all changes
|
||||
- [ ] Train users on any UI changes
|
||||
|
||||
---
|
||||
|
||||
## Part 7: Estimated Timeline
|
||||
|
||||
| Phase | Duration | Dependencies |
|
||||
|-------|----------|--------------|
|
||||
| Schema Design | 1 day | None |
|
||||
| Create Migration Scripts | 2-3 days | Schema approval |
|
||||
| Data Migration Testing | 2-3 days | Scripts complete |
|
||||
| View Updates | 1-2 days | Data migration tested |
|
||||
| ASP File Analysis | 2-3 days | View updates tested |
|
||||
| ASP File Updates | 5-7 days | File analysis complete |
|
||||
| Integration Testing | 3-5 days | All updates complete |
|
||||
| User Acceptance Testing | 2-3 days | Integration testing passed |
|
||||
| Production Deployment | 1 day | UAT passed |
|
||||
| **Total** | **20-30 days** | |
|
||||
|
||||
---
|
||||
|
||||
## Appendix A: Risk Assessment
|
||||
|
||||
| Risk | Severity | Mitigation |
|
||||
|------|----------|------------|
|
||||
| Data loss during migration | CRITICAL | Full backups, test on dev first, rollback scripts |
|
||||
| Application downtime | HIGH | Deploy during maintenance window, parallel cutover |
|
||||
| Performance degradation | MEDIUM | Index optimization, query testing |
|
||||
| View compatibility issues | HIGH | Create compatibility views, thorough testing |
|
||||
| User training needed | LOW | Minimal UI changes expected |
|
||||
|
||||
---
|
||||
|
||||
## Appendix B: File Impact Analysis
|
||||
|
||||
*To be completed after code review*
|
||||
|
||||
Files to analyze:
|
||||
- All files with "pc" in filename
|
||||
- All files referencing pc table
|
||||
- All files using pc views
|
||||
|
||||
---
|
||||
|
||||
**Document Status**: DRAFT
|
||||
**Next Review Date**: TBD
|
||||
**Approval Required From**: System Administrator, Lead Developer
|
||||
721
docs/archive/PHASE2_DEV_MIGRATION_NOTES.md
Normal file
721
docs/archive/PHASE2_DEV_MIGRATION_NOTES.md
Normal file
@@ -0,0 +1,721 @@
|
||||
# Phase 2 PC Migration - DEV Server Actual Execution Notes
|
||||
|
||||
**Environment:** Development Server (IIS Express on Windows 11 VM + MySQL 5.6 in Docker)
|
||||
**Date Executed:** November 13, 2025
|
||||
**Status:** COMPLETE
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Phase 2 PC Migration was successfully completed on the DEV server. This document records the **actual steps taken**, including manual interventions required beyond the original migration scripts.
|
||||
|
||||
**Key Results:**
|
||||
- 224 PCs migrated from `pc` table → `machines` table
|
||||
- 705 network interfaces migrated to `communications` table
|
||||
- 221 PC-to-machine ID mappings created
|
||||
- 11 ASP page files updated to use Phase 2 schema
|
||||
- All PC functionality verified working
|
||||
|
||||
---
|
||||
|
||||
## Pre-Migration State
|
||||
|
||||
### Database Schema Issues Found
|
||||
|
||||
The dev database was in an incomplete state:
|
||||
- `communications` table existed but was **EMPTY** (0 records)
|
||||
- `machines` table **MISSING** critical PC-related columns:
|
||||
- `pctypeid` column did not exist
|
||||
- `loggedinuser` column did not exist
|
||||
- `machinestatusid` column did not exist
|
||||
- `lastupdated` column did not exist
|
||||
- 276 PCs still in old `pc` table
|
||||
- Phase 1 scripts had been partially run but not completed
|
||||
|
||||
### ASP Page Status
|
||||
|
||||
Many PC pages had already been updated to expect Phase 2 schema:
|
||||
- `displaypcs.asp` - Already querying `machines WHERE pctypeid IS NOT NULL`
|
||||
- `displaypc.asp` - Already using Phase 2 schema
|
||||
- `editpc.asp` - Already using Phase 2 schema
|
||||
- But database didn't match the code expectations!
|
||||
|
||||
---
|
||||
|
||||
## Migration Steps Actually Performed
|
||||
|
||||
### Step 1: Add Missing Columns to machines Table
|
||||
|
||||
**Issue:** Phase 2 migration script expected these columns to exist, but they didn't.
|
||||
|
||||
**Manual SQL executed:**
|
||||
|
||||
```sql
|
||||
-- Add pctypeid column (critical for identifying PCs vs equipment)
|
||||
ALTER TABLE machines
|
||||
ADD COLUMN pctypeid INT(11) AFTER machinetypeid;
|
||||
|
||||
-- Add loggedinuser column
|
||||
ALTER TABLE machines
|
||||
ADD COLUMN loggedinuser VARCHAR(100) AFTER hostname;
|
||||
|
||||
-- Add machinestatusid column
|
||||
ALTER TABLE machines
|
||||
ADD COLUMN machinestatusid INT(11) AFTER osid;
|
||||
|
||||
-- Add lastupdated column (replaces dateadded)
|
||||
ALTER TABLE machines
|
||||
ADD COLUMN lastupdated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
|
||||
```
|
||||
|
||||
**Note:** User explicitly requested NOT to add `dateadded` column, only `lastupdated`.
|
||||
|
||||
**Verification:**
|
||||
```sql
|
||||
DESCRIBE machines;
|
||||
-- Confirmed all 4 columns added successfully
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: Run Phase 1 Infrastructure Scripts
|
||||
|
||||
Since Phase 1 was incomplete, ran these scripts:
|
||||
|
||||
```bash
|
||||
cd /home/camp/projects/windows/shopdb/sql/migration_phase1/
|
||||
|
||||
# Create communications infrastructure
|
||||
mysql -h 192.168.122.1 -u root -p shopdb < 01_create_communications_infrastructure.sql
|
||||
|
||||
# Create PC machine types (28-32)
|
||||
mysql -h 192.168.122.1 -u root -p shopdb < 03_create_pc_machine_types.sql
|
||||
```
|
||||
|
||||
**Results:**
|
||||
- `comstypes` table: 8 communication types created
|
||||
- `communications` table: Structure created (still empty)
|
||||
- PC machine types 28-32 created in `machinetypes` table
|
||||
|
||||
---
|
||||
|
||||
### Step 3: Run Phase 2 PC Migration Script
|
||||
|
||||
```bash
|
||||
cd /home/camp/projects/windows/shopdb/sql/migration_phase2/
|
||||
|
||||
mysql -h 192.168.122.1 -u root -p shopdb < 01_migrate_pcs_to_machines.sql
|
||||
```
|
||||
|
||||
**Error Encountered:**
|
||||
```
|
||||
Unknown column 'pctypeid' in 'where clause'
|
||||
Unknown column 'lastupdated' in 'field list'
|
||||
```
|
||||
|
||||
**Resolution:** Already fixed in Step 1 (added missing columns). Re-ran script successfully.
|
||||
|
||||
**Results:**
|
||||
- 224 PCs migrated from `pc` → `machines`
|
||||
- All PCs now have `pctypeid IS NOT NULL`
|
||||
- `pc_to_machine_id_mapping` table created (but was EMPTY!)
|
||||
|
||||
---
|
||||
|
||||
### Step 4: Fix Empty Mapping Table
|
||||
|
||||
**Issue:** Script created `pc_to_machine_id_mapping` table but it had 0 records!
|
||||
|
||||
**Root Cause:** Migration script Step 7 tried to insert mappings but failed silently due to duplicate hostnames.
|
||||
|
||||
**Manual Fix:**
|
||||
|
||||
```sql
|
||||
-- Populate mapping table (handles duplicates with MIN)
|
||||
INSERT INTO pc_to_machine_id_mapping (pcid, old_hostname, new_machineid, new_machinenumber)
|
||||
SELECT p.pcid,
|
||||
p.hostname,
|
||||
MIN(m.machineid) AS new_machineid,
|
||||
MIN(m.machinenumber) AS new_machinenumber
|
||||
FROM pc p
|
||||
JOIN machines m ON m.hostname = p.hostname
|
||||
WHERE p.isactive = 1 AND m.pctypeid IS NOT NULL
|
||||
GROUP BY p.pcid, p.hostname;
|
||||
```
|
||||
|
||||
**Results:**
|
||||
- 221 mappings created (out of 224 PCs)
|
||||
- 3 PCs couldn't be mapped (duplicate hostname issue: pcid 59 & 164 both had "G5G9S624ESF")
|
||||
- Used `MIN(machineid)` to select first match for duplicates
|
||||
|
||||
**Verification:**
|
||||
```sql
|
||||
SELECT COUNT(*) FROM pc_to_machine_id_mapping;
|
||||
-- Result: 221 rows
|
||||
|
||||
SELECT COUNT(*) FROM machines WHERE pctypeid IS NOT NULL;
|
||||
-- Result: 224 rows
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 5: Migrate Network Interfaces
|
||||
|
||||
```bash
|
||||
mysql -h 192.168.122.1 -u root -p shopdb < 02_migrate_network_interfaces_to_communications.sql
|
||||
```
|
||||
|
||||
**Results:**
|
||||
- 705 network interfaces migrated to `communications` table
|
||||
- Used `pc_to_machine_id_mapping` to link old pcid to new machineid
|
||||
- `comstypeid` set to 1 (Network_Interface type)
|
||||
|
||||
**Verification:**
|
||||
```sql
|
||||
SELECT COUNT(*) FROM communications WHERE comstypeid = 1;
|
||||
-- Result: 705 rows
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 5.5: Migrate PC-to-Machine Relationships
|
||||
|
||||
**Issue:** The `machinerelationships` table was empty. Phase 2 script 05 (dualpath) wasn't sufficient.
|
||||
|
||||
**Discovery:** The old `pc` table has a `machinenumber` column that stores which equipment each PC controls!
|
||||
|
||||
**Manual SQL executed:**
|
||||
|
||||
```sql
|
||||
-- Create Controls relationships from old pc.machinenumber
|
||||
INSERT INTO machinerelationships (machineid, related_machineid, relationshiptypeid, isactive)
|
||||
SELECT DISTINCT
|
||||
equipment.machineid AS equipment_machineid,
|
||||
pc_migrated.machineid AS pc_machineid,
|
||||
3 AS relationshiptypeid, -- 'Controls' relationship
|
||||
1 AS isactive
|
||||
FROM pc old_pc
|
||||
JOIN machines equipment ON equipment.machinenumber = old_pc.machinenumber
|
||||
JOIN machines pc_migrated ON pc_migrated.hostname = old_pc.hostname
|
||||
WHERE old_pc.isactive = 1
|
||||
AND old_pc.machinenumber IS NOT NULL
|
||||
AND old_pc.machinenumber != ''
|
||||
AND equipment.pctypeid IS NULL -- Equipment only
|
||||
AND pc_migrated.pctypeid IS NOT NULL -- PCs only
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM machinerelationships mr
|
||||
WHERE mr.machineid = equipment.machineid
|
||||
AND mr.related_machineid = pc_migrated.machineid
|
||||
AND mr.relationshiptypeid = 3
|
||||
);
|
||||
```
|
||||
|
||||
**Results:**
|
||||
- 142 PC-to-equipment "Controls" relationships created
|
||||
- Plus 6 from hostname matching = **148 total relationships**
|
||||
|
||||
**Verification:**
|
||||
```sql
|
||||
SELECT COUNT(*) FROM machinerelationships;
|
||||
-- Result: 148 rows
|
||||
|
||||
-- Example: Machine 130 controlled by PC 390
|
||||
SELECT
|
||||
equipment.machinenumber AS equipment,
|
||||
pc.hostname AS controlling_pc
|
||||
FROM machinerelationships mr
|
||||
JOIN machines equipment ON mr.machineid = equipment.machineid
|
||||
JOIN machines pc ON mr.related_machineid = pc.machineid
|
||||
WHERE equipment.machineid = 130;
|
||||
-- Result: 2001 | GB07T5X3ESF
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 5.6: Migrate Dualpath Relationships
|
||||
|
||||
**Date:** November 13, 2025
|
||||
|
||||
**Issue:** The `machinerelationships` table had 0 dualpath relationships, but `pc_dualpath_assignments` table contained 33 dualpath assignments.
|
||||
|
||||
**Script Used:**
|
||||
```bash
|
||||
mysql -u570005354 -p shopdb < sql/migration_phase2/05_migrate_dualpath_assignments.sql
|
||||
```
|
||||
|
||||
**What the script does:**
|
||||
- Reads `pc_dualpath_assignments` table (33 dualpath pairs)
|
||||
- Creates bidirectional relationships in `machinerelationships`:
|
||||
- primary_machine → secondary_machine (relationshiptypeid = 1)
|
||||
- secondary_machine → primary_machine (relationshiptypeid = 1)
|
||||
- Uses `pc_to_machine_id_mapping` to link old pcid to new machineid
|
||||
|
||||
**Results:**
|
||||
- 31 dualpath relationships created (direction 1)
|
||||
- 31 dualpath relationships created (direction 2)
|
||||
- **Total: 62 dualpath relationships** (31 pairs)
|
||||
|
||||
**Verification:**
|
||||
```sql
|
||||
SELECT rt.relationshiptype, COUNT(*) as count
|
||||
FROM machinerelationships mr
|
||||
JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
WHERE mr.isactive = 1
|
||||
GROUP BY rt.relationshiptype;
|
||||
-- Result: Controls: 148, Dualpath: 62
|
||||
|
||||
-- Example dualpath pair: Machines 2003 and 2004
|
||||
SELECT m1.machinenumber, m2.machinenumber, rt.relationshiptype
|
||||
FROM machinerelationships mr
|
||||
JOIN machines m1 ON mr.machineid = m1.machineid
|
||||
JOIN machines m2 ON mr.related_machineid = m2.machineid
|
||||
JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid
|
||||
WHERE m1.machinenumber IN ('2003', '2004') AND rt.relationshiptype = 'Dualpath';
|
||||
-- Result shows bidirectional: 2003→2004 and 2004→2003
|
||||
```
|
||||
|
||||
**Note:** Backup created in `pc_dualpath_assignments_backup_phase2` table.
|
||||
|
||||
---
|
||||
|
||||
### Step 6: Update ASP Pages
|
||||
|
||||
**Files Still Using Old `pc` Table:**
|
||||
|
||||
Found 7 files that still referenced the old `pc` table and needed updating:
|
||||
|
||||
#### 6.1 Warranty Checking Files (3 files)
|
||||
|
||||
**Files Updated:**
|
||||
- `check_all_warranties.asp`
|
||||
- `check_all_warranties_clean.asp`
|
||||
- `check_warranties_v2.asp`
|
||||
|
||||
**Changes Made:**
|
||||
```asp
|
||||
' OLD: Query pc table
|
||||
SELECT pcid, hostname, serialnumber FROM pc WHERE isactive = 1
|
||||
|
||||
' NEW: Query machines table with pctypeid filter
|
||||
SELECT machineid, hostname, serialnumber FROM machines
|
||||
WHERE pctypeid IS NOT NULL AND isactive = 1
|
||||
|
||||
' OLD: Update warranty in pc table
|
||||
UPDATE pc SET warrantyenddate = ?, warrantyservicelevel = ? WHERE pcid = ?
|
||||
|
||||
' NEW: Insert into warranties table
|
||||
INSERT INTO warranties (machineid, enddate, servicelevel, lastcheckeddate)
|
||||
VALUES (?, ?, ?, NOW())
|
||||
ON DUPLICATE KEY UPDATE enddate = VALUES(enddate), servicelevel = VALUES(servicelevel)
|
||||
```
|
||||
|
||||
#### 6.2 Device Management Files (4 files)
|
||||
|
||||
**Files Updated:**
|
||||
- `editdevice.asp`
|
||||
- `savedevice.asp`
|
||||
- `savedevice_direct.asp`
|
||||
- `updatepc_direct.asp`
|
||||
|
||||
**Changes Made:**
|
||||
```asp
|
||||
' OLD: Check if device exists in pc table
|
||||
SELECT COUNT(*) FROM pc WHERE pcid = ?
|
||||
|
||||
' NEW: Check if device exists in machines table
|
||||
SELECT COUNT(*) FROM machines WHERE machineid = ? AND pctypeid IS NOT NULL
|
||||
|
||||
' OLD: Insert into pc table
|
||||
INSERT INTO pc (serialnumber, ...) VALUES (?, ...)
|
||||
|
||||
' NEW: Insert into machines table with pctypeid
|
||||
INSERT INTO machines (serialnumber, pctypeid, machinetypeid, ...)
|
||||
VALUES (?, 1, 28, ...)
|
||||
|
||||
' OLD: Update pc table
|
||||
UPDATE pc SET ... WHERE pcid = ?
|
||||
|
||||
' NEW: Update machines table
|
||||
UPDATE machines SET ... WHERE machineid = ? AND pctypeid IS NOT NULL
|
||||
```
|
||||
|
||||
**Key Pattern:** All queries now filter with `pctypeid IS NOT NULL` to distinguish PCs from equipment.
|
||||
|
||||
---
|
||||
|
||||
### Step 7: Fix Additional Pages
|
||||
|
||||
**Files with Other Issues Found:**
|
||||
|
||||
#### 7.1 displaypcs.asp
|
||||
**Issue:** Referenced non-existent `dateadded` column
|
||||
**Fix:** Changed to `lastupdated`
|
||||
```asp
|
||||
' OLD: SELECT machines.dateadded
|
||||
' NEW: SELECT machines.lastupdated
|
||||
```
|
||||
|
||||
#### 7.2 displaypc.asp
|
||||
**Issue:** Referenced non-existent `dateadded` column
|
||||
**Fix:** Removed from SELECT query entirely (not displayed)
|
||||
|
||||
#### 7.3 displaymachine.asp
|
||||
**Issue:** Referenced non-existent `dateadded` column
|
||||
**Fix:** Removed from SELECT query
|
||||
```asp
|
||||
' OLD: "machines.lastupdated, machines.dateadded, " & _
|
||||
' NEW: "machines.lastupdated, " & _
|
||||
```
|
||||
|
||||
#### 7.4 displaysubnet.asp
|
||||
**Issue:** Queried old `pc_network_interfaces` table
|
||||
**Fix:** Changed to query `communications` table
|
||||
```asp
|
||||
' OLD: SELECT pcid FROM pc_network_interfaces WHERE ipaddress = ?
|
||||
' NEW: SELECT c.machineid FROM communications c
|
||||
' JOIN machines m ON c.machineid = m.machineid
|
||||
' WHERE c.address = ? AND m.pctypeid IS NOT NULL
|
||||
```
|
||||
|
||||
#### 7.5 network_map.asp
|
||||
**Issue:** Expected Phase 3 network devices (not yet migrated)
|
||||
**Fix:** Removed broken UNION query for network devices, kept only printers
|
||||
```asp
|
||||
' Removed: UNION query for network devices from machines table
|
||||
' Kept: SELECT from printers table (37 printers)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Files Modified Summary
|
||||
|
||||
### Total Files Updated: 11
|
||||
|
||||
| File | Type | Changes |
|
||||
|------|------|---------|
|
||||
| check_all_warranties.asp | Utility | machines table, warranties table |
|
||||
| check_all_warranties_clean.asp | Utility | machines table, warranties table |
|
||||
| check_warranties_v2.asp | Utility | machines table, warranties table |
|
||||
| editdevice.asp | Form | machines table queries |
|
||||
| savedevice.asp | Processor | machines table INSERT |
|
||||
| savedevice_direct.asp | Processor | machines table INSERT |
|
||||
| updatepc_direct.asp | Processor | machines table UPDATE |
|
||||
| displaypcs.asp | Display | dateadded → lastupdated |
|
||||
| displaypc.asp | Display | dateadded removed |
|
||||
| displaymachine.asp | Display | dateadded removed |
|
||||
| displaysubnet.asp | Utility | communications table |
|
||||
| network_map.asp | Display | Phase 3 query removed |
|
||||
|
||||
---
|
||||
|
||||
## Manual Database Changes Summary
|
||||
|
||||
### Tables Created
|
||||
- `pc_to_machine_id_mapping` (221 records)
|
||||
|
||||
### Tables Populated
|
||||
- `machines` (+224 PC records)
|
||||
- `communications` (+705 network interface records)
|
||||
- `comstypes` (8 communication types)
|
||||
- `machinetypes` (+5 PC types: 28-32)
|
||||
|
||||
### Columns Added to machines Table
|
||||
```sql
|
||||
ALTER TABLE machines ADD COLUMN pctypeid INT(11);
|
||||
ALTER TABLE machines ADD COLUMN loggedinuser VARCHAR(100);
|
||||
ALTER TABLE machines ADD COLUMN machinestatusid INT(11);
|
||||
ALTER TABLE machines ADD COLUMN lastupdated DATETIME;
|
||||
```
|
||||
|
||||
### Columns NOT Added (User Decision)
|
||||
- `dateadded` - User requested NOT to add this column
|
||||
|
||||
---
|
||||
|
||||
## Verification Results
|
||||
|
||||
### Database Verification
|
||||
|
||||
```sql
|
||||
-- PCs in machines table
|
||||
SELECT COUNT(*) FROM machines WHERE pctypeid IS NOT NULL;
|
||||
-- Result: 224 PCs
|
||||
|
||||
-- Network interfaces in communications
|
||||
SELECT COUNT(*) FROM communications WHERE comstypeid = 1;
|
||||
-- Result: 705 interfaces
|
||||
|
||||
-- PC-to-machine mappings
|
||||
SELECT COUNT(*) FROM pc_to_machine_id_mapping;
|
||||
-- Result: 221 mappings
|
||||
|
||||
-- Old pc table (should still have records - not deleted)
|
||||
SELECT COUNT(*) FROM pc WHERE isactive = 1;
|
||||
-- Result: 276 PCs (preserved as backup)
|
||||
```
|
||||
|
||||
### Page Verification (from logs)
|
||||
|
||||
All pages tested and working:
|
||||
- displaypcs.asp - HTTP 200 (18:52:35)
|
||||
- displaypc.asp - HTTP 200 (18:52:42)
|
||||
- displaymachines.asp - HTTP 200 (18:32:48)
|
||||
- displaymachine.asp - HTTP 200 (after dateadded fix)
|
||||
- network_map.asp - HTTP 200 (17:57:57)
|
||||
|
||||
---
|
||||
|
||||
## Issues Encountered and Resolutions
|
||||
|
||||
### Issue 1: Missing pctypeid Column
|
||||
**Error:** `Unknown column 'machines.pctypeid' in 'where clause'`
|
||||
**Resolution:** Added column manually with `ALTER TABLE`
|
||||
**Root Cause:** Phase 1 script 02_extend_machines_table.sql not run on dev
|
||||
|
||||
### Issue 2: Missing dateadded Column References
|
||||
**Error:** `Unknown column 'machines.dateadded' in 'field list'`
|
||||
**Resolution:** Changed all references to `lastupdated` or removed
|
||||
**Root Cause:** User decided not to add dateadded column, only lastupdated
|
||||
|
||||
### Issue 3: Empty Mapping Table
|
||||
**Error:** Network interface migration found 0 mappings
|
||||
**Resolution:** Manually populated pc_to_machine_id_mapping table
|
||||
**Root Cause:** Duplicate hostnames prevented automatic mapping
|
||||
|
||||
### Issue 4: Duplicate Hostnames
|
||||
**Error:** pcid 59 and 164 both had hostname "G5G9S624ESF"
|
||||
**Resolution:** Used MIN(machineid) to select first match
|
||||
**Impact:** 3 PCs unmapped (224 migrated but only 221 mapped)
|
||||
|
||||
---
|
||||
|
||||
## Production Migration Recommendations
|
||||
|
||||
### Before Running on Production:
|
||||
|
||||
1. **Update Phase 1 Script 02:**
|
||||
- Ensure `02_extend_machines_table.sql` adds these columns:
|
||||
- pctypeid
|
||||
- loggedinuser
|
||||
- machinestatusid
|
||||
- lastupdated (NOT dateadded)
|
||||
|
||||
2. **Update Phase 2 Script 01:**
|
||||
- Add validation check for duplicate hostnames
|
||||
- Add error handling for mapping table population
|
||||
- Consider adding UNIQUE constraint on hostname (if business rules allow)
|
||||
|
||||
3. **Pre-Migration Validation:**
|
||||
```sql
|
||||
-- Check for duplicate hostnames
|
||||
SELECT hostname, COUNT(*)
|
||||
FROM pc
|
||||
WHERE isactive = 1
|
||||
GROUP BY hostname
|
||||
HAVING COUNT(*) > 1;
|
||||
|
||||
-- Should return 0 rows, or document exceptions
|
||||
```
|
||||
|
||||
4. **Update All 11 ASP Files** on production:
|
||||
- Use the updated versions from dev
|
||||
- Test each file after deployment
|
||||
- Monitor logs for errors
|
||||
|
||||
5. **Plan for Rollback:**
|
||||
- Keep `pc` and `pc_network_interfaces` tables for 30 days
|
||||
- Take full database backup before migration
|
||||
- Document rollback procedure
|
||||
|
||||
---
|
||||
|
||||
## Scripts That Need Updates for Production
|
||||
|
||||
### /sql/migration_phase1/02_extend_machines_table.sql
|
||||
|
||||
**Add these columns:**
|
||||
```sql
|
||||
-- Add PC-specific columns
|
||||
ALTER TABLE machines ADD COLUMN pctypeid INT(11) AFTER machinetypeid;
|
||||
ALTER TABLE machines ADD COLUMN loggedinuser VARCHAR(100) AFTER hostname;
|
||||
ALTER TABLE machines ADD COLUMN machinestatusid INT(11) AFTER osid;
|
||||
ALTER TABLE machines ADD COLUMN lastupdated DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
ON UPDATE CURRENT_TIMESTAMP;
|
||||
|
||||
-- Add indexes for performance
|
||||
ALTER TABLE machines ADD INDEX idx_pctypeid (pctypeid);
|
||||
ALTER TABLE machines ADD INDEX idx_machinestatusid (machinestatusid);
|
||||
```
|
||||
|
||||
### NEW: /sql/migration_phase2/05b_migrate_pc_controls_relationships.sql
|
||||
|
||||
**Create this new script to migrate PC-to-equipment relationships:**
|
||||
|
||||
```sql
|
||||
-- =====================================================
|
||||
-- SCRIPT 05b: Migrate PC Controls Relationships
|
||||
-- =====================================================
|
||||
-- Purpose: Create Controls relationships from pc.machinenumber
|
||||
-- =====================================================
|
||||
|
||||
USE shopdb;
|
||||
|
||||
-- Create Controls relationships
|
||||
INSERT INTO machinerelationships (machineid, related_machineid, relationshiptypeid, isactive)
|
||||
SELECT DISTINCT
|
||||
equipment.machineid AS equipment_machineid,
|
||||
pc_migrated.machineid AS pc_machineid,
|
||||
3 AS relationshiptypeid, -- 'Controls' relationship
|
||||
1 AS isactive
|
||||
FROM pc old_pc
|
||||
JOIN machines equipment ON equipment.machinenumber = old_pc.machinenumber
|
||||
JOIN machines pc_migrated ON pc_migrated.hostname = old_pc.hostname
|
||||
WHERE old_pc.isactive = 1
|
||||
AND old_pc.machinenumber IS NOT NULL
|
||||
AND old_pc.machinenumber != ''
|
||||
AND equipment.pctypeid IS NULL -- Equipment only
|
||||
AND pc_migrated.pctypeid IS NOT NULL -- PCs only
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM machinerelationships mr
|
||||
WHERE mr.machineid = equipment.machineid
|
||||
AND mr.related_machineid = pc_migrated.machineid
|
||||
AND mr.relationshiptypeid = 3
|
||||
);
|
||||
|
||||
-- Verification
|
||||
SELECT CONCAT('Created ', ROW_COUNT(), ' Controls relationships') AS result;
|
||||
|
||||
SELECT COUNT(*) AS total_relationships FROM machinerelationships;
|
||||
```
|
||||
|
||||
**This script should be run AFTER 01_migrate_pcs_to_machines.sql**
|
||||
|
||||
### /sql/migration_phase2/01_migrate_pcs_to_machines.sql
|
||||
|
||||
**Fix Step 7 - Mapping Table Population:**
|
||||
```sql
|
||||
-- Enhanced mapping with duplicate handling
|
||||
INSERT INTO pc_to_machine_id_mapping (pcid, old_hostname, new_machineid, new_machinenumber)
|
||||
SELECT p.pcid,
|
||||
p.hostname,
|
||||
MIN(m.machineid) AS new_machineid, -- Handle duplicates
|
||||
MIN(m.machinenumber) AS new_machinenumber
|
||||
FROM pc p
|
||||
JOIN machines m ON m.hostname = p.hostname
|
||||
WHERE p.isactive = 1
|
||||
AND m.pctypeid IS NOT NULL
|
||||
GROUP BY p.pcid, p.hostname;
|
||||
|
||||
-- Validate mapping
|
||||
SELECT
|
||||
(SELECT COUNT(*) FROM pc WHERE isactive = 1) AS pcs_to_migrate,
|
||||
(SELECT COUNT(*) FROM pc_to_machine_id_mapping) AS pcs_mapped,
|
||||
(SELECT COUNT(*) FROM pc WHERE isactive = 1) -
|
||||
(SELECT COUNT(*) FROM pc_to_machine_id_mapping) AS unmapped_count;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Timeline - Actual
|
||||
|
||||
| Phase | Estimated | Actual | Notes |
|
||||
|-------|-----------|--------|-------|
|
||||
| Pre-migration analysis | 1 hour | 1.5 hours | Found schema discrepancies |
|
||||
| Add missing columns | 5 min | 15 min | Manual ALTER TABLE statements |
|
||||
| Run Phase 1 scripts | 5 min | 10 min | Partial re-run required |
|
||||
| Run Phase 2 script 01 | 10 min | 20 min | Mapping table fix required |
|
||||
| Run Phase 2 script 02 | 5 min | 5 min | Successful |
|
||||
| Update ASP pages | 2 hours | 3 hours | Found 7 additional files |
|
||||
| Testing and fixes | 1 hour | 1.5 hours | Fixed dateadded issues |
|
||||
| **Total** | **4-5 hours** | **~7 hours** | Manual interventions added time |
|
||||
|
||||
---
|
||||
|
||||
## Success Criteria - All Met
|
||||
|
||||
- All 224 PCs migrated to machines table
|
||||
- All 705 network interfaces in communications table
|
||||
- PC list page displays correctly
|
||||
- Individual PC pages load without errors
|
||||
- Network interfaces show properly (IP and MAC addresses)
|
||||
- No "Item cannot be found" errors
|
||||
- All functionality matches machine pages
|
||||
- Security maintained (parameterized queries)
|
||||
- No data loss
|
||||
- Old tables preserved as backup
|
||||
|
||||
---
|
||||
|
||||
## Step 8: Cleanup Migration Tables
|
||||
|
||||
**Date:** November 13, 2025
|
||||
|
||||
**Purpose:** Remove unused backup and mapping tables to clean up database after successful migration.
|
||||
|
||||
**Script Used:**
|
||||
```bash
|
||||
mysql -u570005354 -p shopdb < sql/migration_phase2/07_cleanup_migration_tables.sql
|
||||
```
|
||||
|
||||
**Tables Dropped:**
|
||||
|
||||
1. **Backup Tables** (created during migration for rollback):
|
||||
- `pc_backup_phase2` (276 rows, 0.08 MB)
|
||||
- `pc_network_interfaces_backup_phase2` (705 rows, 0.08 MB)
|
||||
- `pc_comm_config_backup_phase2` (502 rows, 0.34 MB)
|
||||
- `pc_dualpath_assignments_backup_phase2` (33 rows, 0.02 MB)
|
||||
- `pc_model_backup` (206 rows, 0.02 MB)
|
||||
|
||||
2. **Helper/Mapping Tables** (no longer needed):
|
||||
- `pc_to_machine_id_mapping` (221 rows, 0.03 MB) - Used during migration to track old pcid → new machineid
|
||||
- `machine_pc_relationships` (0 rows, 0.06 MB) - Never used, replaced by `machinerelationships`
|
||||
|
||||
**Total Space Freed:** ~0.63 MB
|
||||
|
||||
**Verification:**
|
||||
```sql
|
||||
-- Confirmed essential tables still exist
|
||||
SELECT COUNT(*) FROM machines; -- 483 records (224 PCs + 259 equipment)
|
||||
SELECT COUNT(*) FROM communications; -- 705 records
|
||||
SELECT COUNT(*) FROM machinerelationships; -- 210 records (148 Controls + 62 Dualpath)
|
||||
```
|
||||
|
||||
**Tables Retained** (may still have historical value):
|
||||
- `pc` - Original PC table (kept for historical queries if needed)
|
||||
- `pc_network_interfaces` - Old network config
|
||||
- `pc_comm_config` - Old communication config
|
||||
- `pc_dualpath_assignments` - Old dualpath data
|
||||
- `pc_dnc_config` - DNC configuration (still in use)
|
||||
- `pctype` - PC type reference table (still in use)
|
||||
|
||||
**Note:** The old `pc` and related tables can be dropped in a future cleanup once we confirm no historical queries need them.
|
||||
|
||||
---
|
||||
|
||||
## Next Steps for Production
|
||||
|
||||
1. **Update migration scripts** based on lessons learned
|
||||
2. **Test updated scripts** on dev backup database
|
||||
3. **Create production deployment plan** with maintenance window
|
||||
4. **Prepare rollback procedure** with tested commands
|
||||
5. **Schedule production migration** (estimated 1-2 hours downtime)
|
||||
6. **Deploy updated ASP pages** immediately after migration
|
||||
7. **Monitor logs** for 24-48 hours post-migration
|
||||
8. **Document any production-specific issues**
|
||||
|
||||
---
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- `/home/camp/projects/windows/shopdb/PHASE2_PC_MIGRATION_COMPLETE.md` - Completion summary
|
||||
- `/home/camp/projects/windows/shopdb/sql/migration_phase1/README.md` - Phase 1 scripts
|
||||
- `/home/camp/projects/windows/shopdb/sql/migration_phase2/README.md` - Phase 2 scripts
|
||||
- `/home/camp/projects/ENVIRONMENT_DOCUMENTATION.md` - Dev environment setup
|
||||
|
||||
---
|
||||
|
||||
**Created:** 2025-11-13
|
||||
**Author:** Claude Code + Human
|
||||
**Status:** DEV MIGRATION COMPLETE
|
||||
**Production Status:** PENDING - Scripts need updates based on dev lessons learned
|
||||
444
docs/archive/PHASE2_PC_MIGRATION_COMPLETE.md
Normal file
444
docs/archive/PHASE2_PC_MIGRATION_COMPLETE.md
Normal file
@@ -0,0 +1,444 @@
|
||||
# Phase 2 PC Migration - COMPLETE
|
||||
|
||||
**Status:** **COMPLETED**
|
||||
**Completion Date:** November 10, 2025
|
||||
**Environment:** Development Server
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
All PC-related pages have been successfully migrated from the old `pc` and `pc_network_interfaces` tables to the Phase 2 consolidated schema using `machines` and `communications` tables.
|
||||
|
||||
---
|
||||
|
||||
## Migrated Files
|
||||
|
||||
### 1. displaypcs.asp - PC List Page
|
||||
**Status:** COMPLETE
|
||||
**Last Updated:** 2025-11-10 14:40
|
||||
**Location:** `/home/camp/projects/windows/shopdb/displaypcs.asp`
|
||||
|
||||
**Changes Applied:**
|
||||
- Uses `FROM machines` with `pctypeid IS NOT NULL` filter
|
||||
- Joins to `communications` table for network info
|
||||
- Uses proper column name `address` (not `ipaddress`)
|
||||
- Includes all required columns (vendorid, modelnumberid, etc.)
|
||||
- LEFT JOIN for optional relationships
|
||||
- Parameterized queries for security
|
||||
- Shows PC types, vendors, models, business units
|
||||
|
||||
**Key Query:**
|
||||
```sql
|
||||
FROM machines m
|
||||
LEFT JOIN models ON m.modelnumberid = models.modelnumberid
|
||||
LEFT JOIN vendors ON models.vendorid = vendors.vendorid
|
||||
LEFT JOIN pctype ON m.pctypeid = pctype.pctypeid
|
||||
LEFT JOIN communications c ON m.machineid = c.machineid AND c.isprimary = 1
|
||||
WHERE m.pctypeid IS NOT NULL
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. displaypc.asp - Individual PC View
|
||||
**Status:** COMPLETE
|
||||
**Last Updated:** November 10, 2025
|
||||
**Location:** `/home/camp/projects/windows/shopdb/displaypc.asp`
|
||||
|
||||
**Changes Applied:**
|
||||
- Main query uses `FROM machines WHERE pctypeid IS NOT NULL`
|
||||
- Network interfaces from `communications` table
|
||||
- Accepts `?pcid=X` parameter (mapped to machineid)
|
||||
- All text fields converted to strings with `& ""`
|
||||
- Uses `address` column (not `ipaddress`)
|
||||
- Relationships use `machinerelationships` table
|
||||
- Profile card with PC information
|
||||
- Tabbed interface (Settings, Network, etc.)
|
||||
|
||||
**Main Query:**
|
||||
```sql
|
||||
SELECT m.*,
|
||||
mo.modelnumber, mo.vendorid AS modelvendorid, mo.machinetypeid, mo.image AS modelimage,
|
||||
v.vendor,
|
||||
bu.businessunit,
|
||||
mt.machinetype
|
||||
FROM machines m
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN vendors v ON mo.vendorid = v.vendorid
|
||||
LEFT JOIN businessunits bu ON m.businessunitid = bu.businessunitid
|
||||
LEFT JOIN machinetypes mt ON mo.machinetypeid = mt.machinetypeid
|
||||
WHERE m.machineid = ? AND m.pctypeid IS NOT NULL
|
||||
```
|
||||
|
||||
**Network Query:**
|
||||
```sql
|
||||
SELECT address, macaddress
|
||||
FROM communications
|
||||
WHERE machineid = ? AND isactive = 1
|
||||
ORDER BY isprimary DESC
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. editpc.asp - PC Edit Form
|
||||
**Status:** COMPLETE
|
||||
**Last Updated:** November 10, 2025
|
||||
**Location:** `/home/camp/projects/windows/shopdb/editpc.asp`
|
||||
|
||||
**Changes Applied:**
|
||||
- Loads data from `machines WHERE pctypeid IS NOT NULL`
|
||||
- Network interfaces from `communications` table
|
||||
- All text fields converted to strings with `& ""`
|
||||
- Uses `address` and `macaddress` columns correctly
|
||||
- Parameterized queries throughout
|
||||
- Proper NULL handling
|
||||
- Edit form with all PC-specific fields
|
||||
- Dualpath and controlled equipment relationships
|
||||
|
||||
**Load Query:**
|
||||
```sql
|
||||
SELECT m.*,
|
||||
mo.modelnumber, mo.vendorid AS modelvendorid, mo.machinetypeid, mo.image AS modelimage,
|
||||
v.vendor,
|
||||
bu.businessunit,
|
||||
mt.machinetype
|
||||
FROM machines m
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN vendors v ON mo.vendorid = v.vendorid
|
||||
LEFT JOIN businessunits bu ON m.businessunitid = bu.businessunitid
|
||||
LEFT JOIN machinetypes mt ON mo.machinetypeid = mt.machinetypeid
|
||||
WHERE m.machineid = ? AND m.pctypeid IS NOT NULL
|
||||
```
|
||||
|
||||
**Communications Query:**
|
||||
```sql
|
||||
SELECT address, macaddress
|
||||
FROM communications
|
||||
WHERE machineid = ? AND isactive = 1
|
||||
ORDER BY isprimary DESC
|
||||
```
|
||||
|
||||
**Controlled Equipment Query:**
|
||||
```sql
|
||||
SELECT machineid, machinenumber, alias
|
||||
FROM machines
|
||||
WHERE pctypeid IS NULL AND isactive = 1
|
||||
ORDER BY machinenumber ASC
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Schema Verification
|
||||
|
||||
### Old Schema (Phase 1) - DEPRECATED
|
||||
```
|
||||
pc
|
||||
├── pcid
|
||||
├── hostname
|
||||
├── notes <- renamed to machinenotes
|
||||
└── ...
|
||||
|
||||
pc_network_interfaces
|
||||
├── interfaceid
|
||||
├── pcid
|
||||
├── ipaddress <- renamed to address
|
||||
├── macaddress
|
||||
└── ...
|
||||
|
||||
pc_dualpath_assignments
|
||||
├── assignmentid
|
||||
├── pcid
|
||||
├── dualpath_pcid
|
||||
└── ...
|
||||
```
|
||||
|
||||
### New Schema (Phase 2) - ACTIVE
|
||||
```
|
||||
machines
|
||||
├── machineid
|
||||
├── hostname
|
||||
├── machinenotes <- was 'notes'
|
||||
├── pctypeid <- IS NOT NULL identifies PCs
|
||||
└── ...
|
||||
|
||||
communications
|
||||
├── comid
|
||||
├── machineid
|
||||
├── address <- was 'ipaddress'
|
||||
├── macaddress
|
||||
└── ...
|
||||
|
||||
machinerelationships
|
||||
├── relationshipid
|
||||
├── machineid
|
||||
├── related_machineid
|
||||
├── relationshiptypeid
|
||||
└── ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Column Mapping Reference
|
||||
|
||||
### PC Table → Machines Table
|
||||
| Old Column | New Column | Notes |
|
||||
|------------|-----------|-------|
|
||||
| `pcid` | `machineid` | Primary key |
|
||||
| `hostname` | `hostname` | Same |
|
||||
| `notes` | `machinenotes` | **RENAMED** |
|
||||
| `pctypeid` | `pctypeid` | **Must be NOT NULL for PCs** |
|
||||
| `serialnumber` | `serialnumber` | Same |
|
||||
| `alias` | `alias` | Same |
|
||||
| `modelnumberid` | `modelnumberid` | Same |
|
||||
| `businessunitid` | `businessunitid` | Same |
|
||||
|
||||
### Network Interfaces Table → Communications Table
|
||||
| Old Column | New Column | Notes |
|
||||
|------------|-----------|-------|
|
||||
| `interfaceid` | `comid` | Primary key renamed |
|
||||
| `pcid` | `machineid` | Foreign key renamed |
|
||||
| `ipaddress` | `address` | **RENAMED** |
|
||||
| `macaddress` | `macaddress` | Same |
|
||||
| `isprimary` | `isprimary` | Same |
|
||||
|
||||
---
|
||||
|
||||
## Critical Fixes Applied
|
||||
|
||||
### 1. Column Name Corrections
|
||||
- `ipaddress` → `address` in communications table
|
||||
- `notes` → `machinenotes` in machines table
|
||||
- `pcid` → `machineid` throughout
|
||||
|
||||
### 2. Type Conversion for HTMLEncode
|
||||
**Problem:** Type mismatch errors with Server.HTMLEncode()
|
||||
**Solution:** All text fields converted to strings with `& ""`
|
||||
|
||||
```asp
|
||||
' CORRECT implementation in all files
|
||||
hostname = "" : If NOT IsNull(rsMachine("hostname")) Then hostname = rsMachine("hostname") & ""
|
||||
alias = "" : If NOT IsNull(rsMachine("alias")) Then alias = rsMachine("alias") & ""
|
||||
machinenotes = "" : If NOT IsNull(rsMachine("machinenotes")) Then machinenotes = rsMachine("machinenotes") & ""
|
||||
```
|
||||
|
||||
### 3. Relationship Direction
|
||||
**Controls Relationship (PC → Equipment):**
|
||||
```sql
|
||||
-- For PC page - find controlled equipment
|
||||
WHERE mr.machineid = ? AND rt.relationshiptype = 'Controls'
|
||||
SELECT mr.related_machineid -- Returns equipment controlled by this PC
|
||||
```
|
||||
|
||||
**Dualpath Relationship (PC ↔ PC):**
|
||||
```sql
|
||||
-- Bidirectional
|
||||
WHERE mr.machineid = ? AND rt.relationshiptype = 'Dualpath'
|
||||
SELECT mr.related_machineid
|
||||
```
|
||||
|
||||
### 4. Proper JOIN Types
|
||||
- LEFT JOIN for optional relationships (pctypes, models, etc.)
|
||||
- INNER JOIN for required relationships
|
||||
- Proper NULL handling throughout
|
||||
|
||||
---
|
||||
|
||||
## Testing Results
|
||||
|
||||
### All Tests Passed
|
||||
|
||||
#### displaypcs.asp
|
||||
- Page loads without errors (HTTP 200)
|
||||
- PC list displays correctly
|
||||
- All columns populated (hostname, alias, IP, MAC, type, vendor, model)
|
||||
- Filter dropdowns work (PC type, status, recent)
|
||||
- Links to displaypc.asp work correctly
|
||||
|
||||
#### displaypc.asp
|
||||
- Page loads with `?pcid=X` parameter
|
||||
- All PC data displays correctly
|
||||
- Network interfaces show properly (IP and MAC addresses)
|
||||
- No "Item cannot be found" errors
|
||||
- Tabs functional (if present)
|
||||
- Special characters handled correctly (no HTMLEncode errors)
|
||||
- Relationships display correctly
|
||||
|
||||
#### editpc.asp
|
||||
- Page loads with existing PC data
|
||||
- Edit form pre-filled correctly
|
||||
- Network interfaces editable (up to 3)
|
||||
- Controlled equipment dropdown works
|
||||
- Form submission successful
|
||||
- Data saves correctly
|
||||
- No validation errors
|
||||
|
||||
#### Integration Testing
|
||||
- displaypcs.asp → displaypc.asp navigation works
|
||||
- displaypc.asp → editpc.asp navigation works
|
||||
- editpc.asp saves and redirects correctly
|
||||
- All parameterized queries working
|
||||
- No SQL injection vulnerabilities
|
||||
- Proper error handling
|
||||
|
||||
---
|
||||
|
||||
## Migration Pattern Success
|
||||
|
||||
This migration followed the same proven pattern as the Machine pages migration (completed Nov 7, 2025):
|
||||
|
||||
1. Update SQL queries to use `machines` table
|
||||
2. Add `WHERE pctypeid IS NOT NULL` filter
|
||||
3. Update column references (`notes` → `machinenotes`, `ipaddress` → `address`)
|
||||
4. Convert text fields to strings with `& ""`
|
||||
5. Use `communications` table for network info
|
||||
6. Use `machinerelationships` for PC relationships
|
||||
7. Implement parameterized queries
|
||||
8. Test thoroughly with real data
|
||||
|
||||
---
|
||||
|
||||
## Benefits Achieved
|
||||
|
||||
### 1. Data Consolidation
|
||||
- Single source of truth for all infrastructure (machines table)
|
||||
- Unified network information (communications table)
|
||||
- Unified relationships (machinerelationships table)
|
||||
|
||||
### 2. Code Consistency
|
||||
- PC pages now match machine pages architecture
|
||||
- Consistent security patterns (parameterized queries)
|
||||
- Consistent error handling
|
||||
- Consistent UI/UX
|
||||
|
||||
### 3. Query Flexibility
|
||||
```sql
|
||||
-- All PCs
|
||||
SELECT * FROM machines WHERE pctypeid IS NOT NULL;
|
||||
|
||||
-- All Equipment
|
||||
SELECT * FROM machines WHERE pctypeid IS NULL;
|
||||
|
||||
-- All infrastructure (PCs + Equipment)
|
||||
SELECT * FROM machines;
|
||||
|
||||
-- Cross-entity queries now possible
|
||||
SELECT m1.hostname AS pc_name, m2.machinenumber AS equipment_name
|
||||
FROM machinerelationships mr
|
||||
JOIN machines m1 ON mr.machineid = m1.machineid
|
||||
JOIN machines m2 ON mr.related_machineid = m2.machineid
|
||||
WHERE m1.pctypeid IS NOT NULL; -- PC controls equipment
|
||||
```
|
||||
|
||||
### 4. Maintenance Simplification
|
||||
- Less code duplication
|
||||
- Easier to add features (apply to one table instead of multiple)
|
||||
- Consistent backup/restore procedures
|
||||
- Better performance (fewer tables to join)
|
||||
|
||||
---
|
||||
|
||||
## Files That Can Be Archived
|
||||
|
||||
The following old files are **NO LONGER NEEDED** but kept for reference:
|
||||
|
||||
### Backup Files (Can be deleted after 30 days):
|
||||
- `displaypc.asp.backup-20251027`
|
||||
- `displaypc.asp.phase1_backup`
|
||||
- `displaypcs.asp.phase1_backup`
|
||||
- `pc_edit.asp.broken`
|
||||
|
||||
### Migration Reference:
|
||||
- `PHASE2_PC_MIGRATION_TODO.md` - Reference document (marked complete by this file)
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
### Phase 2 Complete - What's Next?
|
||||
|
||||
#### Phase 1: Equipment Migration (COMPLETE)
|
||||
- Machines table created
|
||||
- Equipment pages working
|
||||
|
||||
#### Phase 2: PC Migration (COMPLETE - This Document)
|
||||
- PCs consolidated into machines table
|
||||
- All PC pages updated
|
||||
- Network interfaces in communications table
|
||||
- Relationships working
|
||||
|
||||
#### Phase 3: Network Devices Migration (PLANNED)
|
||||
See: `/home/camp/projects/windows/shopdb/docs/PHASE3_NETWORK_DEVICES_MIGRATION_PLAN.md`
|
||||
|
||||
**Devices to Migrate:**
|
||||
- Servers → machinetypeid 30
|
||||
- Switches → machinetypeid 31
|
||||
- Cameras → machinetypeid 32
|
||||
- Access Points → machinetypeid 33
|
||||
- IDFs → machinetypeid 34
|
||||
- Routers → machinetypeid 35
|
||||
- Firewalls → machinetypeid 36
|
||||
|
||||
**Timeline:** 10-15 hours estimated
|
||||
|
||||
---
|
||||
|
||||
## Success Criteria - ALL MET
|
||||
|
||||
- All three PC pages load without errors
|
||||
- PC list displays correctly
|
||||
- Individual PC view shows all data
|
||||
- PC edit form loads and saves correctly
|
||||
- Network interfaces display correctly
|
||||
- Dualpath relationships display correctly
|
||||
- Controlling equipment relationships work
|
||||
- No references to `pc` or `pc_network_interfaces` tables remain in active code
|
||||
- All functionality matches machine pages
|
||||
- Security maintained (parameterized queries)
|
||||
- Performance acceptable
|
||||
- No data loss
|
||||
|
||||
---
|
||||
|
||||
## Timeline - Actual
|
||||
|
||||
- **Planning:** 2 hours (Nov 7, 2025)
|
||||
- **Implementation:** 3-4 hours (Nov 10, 2025)
|
||||
- **Testing:** 1 hour (Nov 10, 2025)
|
||||
- **Total:** ~6-7 hours
|
||||
|
||||
**Original Estimate:** 4-6 hours
|
||||
**Actual:** 6-7 hours
|
||||
**Variance:** On target
|
||||
|
||||
---
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- `/home/camp/projects/windows/shopdb/MACHINE_MANAGEMENT_COMPLETE.md` - Machine pages (Phase 1)
|
||||
- `/home/camp/projects/windows/shopdb/BUGFIX_2025-11-07.md` - Machine migration fixes
|
||||
- `/home/camp/projects/windows/shopdb/docs/PHASE3_NETWORK_DEVICES_MIGRATION_PLAN.md` - Next phase
|
||||
- `/home/camp/projects/windows/shopdb/SESSION_SUMMARY_2025-11-10.md` - Session notes
|
||||
|
||||
---
|
||||
|
||||
## Key Contributors
|
||||
|
||||
- Development: Claude Code + Human
|
||||
- Testing: Dev environment (shopdb on IIS Express)
|
||||
- Planning: PHASE2_PC_MIGRATION_TODO.md (Nov 7, 2025)
|
||||
- Execution: Nov 10, 2025
|
||||
- Documentation: This file (Nov 13, 2025)
|
||||
|
||||
---
|
||||
|
||||
**Status:** **MIGRATION COMPLETE AND VERIFIED**
|
||||
|
||||
**Ready for Production:** YES (after thorough testing)
|
||||
|
||||
**Rollback Plan:** Keep old `pc` and `pc_network_interfaces` tables for 30 days as backup
|
||||
|
||||
---
|
||||
|
||||
**Created:** 2025-11-13
|
||||
**Environment:** Development Server
|
||||
**Production Deployment:** Pending approval
|
||||
230
docs/archive/PHASE2_TESTING_SUMMARY.md
Normal file
230
docs/archive/PHASE2_TESTING_SUMMARY.md
Normal file
@@ -0,0 +1,230 @@
|
||||
# Phase 2 PC Migration - Testing Summary
|
||||
|
||||
**Date:** 2025-11-13
|
||||
**Environment:** DEV Server (http://192.168.122.151:8080/)
|
||||
**Tested By:** Claude Code (automated testing agents)
|
||||
**Total Pages Tested:** 15 out of 123 ASP files
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
**Major Issues Fixed:**
|
||||
- editdevice.asp - Undefined variable bug
|
||||
- updatedevice.asp - Phase 2 schema migration complete
|
||||
- updatedevice_direct.asp - Phase 2 schema migration complete
|
||||
- displaymachine.asp - Multiple relationship query bugs fixed
|
||||
- displaypc.asp - Dualpath section removed, queries optimized
|
||||
- network_map.asp - Now shows all network device types
|
||||
|
||||
**Remaining Issues:**
|
||||
- displaysubnet.asp - Runtime error (subscript out of range)
|
||||
- 3 warranty pages in v2 directory need Phase 2 updates
|
||||
- v2 directory has ODBC configuration issues
|
||||
|
||||
---
|
||||
|
||||
## Critical Bugs Fixed
|
||||
|
||||
### 1. editdevice.asp (Line 95)
|
||||
**Issue:** Undefined variable `pcid`
|
||||
**Fix:** Changed to `machineid`
|
||||
**Status:** Fixed
|
||||
|
||||
### 2. updatedevice.asp
|
||||
**Issue:** Used old `pc` table instead of `machines` table
|
||||
**Changes Made:**
|
||||
- Line 64: `UPDATE pc` → `UPDATE machines`
|
||||
- Line 11: `pcstatusid` → `machinestatusid`
|
||||
- Line 31: `RecordExists("pc", "pcid")` → `RecordExists("machines", "machineid")`
|
||||
- Line 118: `WHERE pcid = ?` → `WHERE machineid = ? AND pctypeid IS NOT NULL`
|
||||
**Status:** Fixed
|
||||
|
||||
### 3. updatedevice_direct.asp
|
||||
**Issue:** Used old `pc` table instead of `machines` table
|
||||
**Changes Made:**
|
||||
- Line 176: `UPDATE pc SET pcstatusid` → `UPDATE machines SET machinestatusid`
|
||||
- Line 176: `WHERE pcid = ?` → `WHERE machineid = ? AND pctypeid IS NOT NULL`
|
||||
- Line 12: `pcstatusid` → `machinestatusid`
|
||||
- Line 181: Parameter renamed from `@pcstatusid` to `@machinestatusid`
|
||||
- Line 212: Parameter renamed from `@pcid` to `@machineid`
|
||||
**Status:** Fixed
|
||||
|
||||
### 4. displaymachine.asp
|
||||
**Issue:** Duplicate PCs shown, wrong relationship directions
|
||||
**Fixes Applied:**
|
||||
- Dualpath query: Added NOT EXISTS clause to prevent duplicates
|
||||
- Controlled By PC query: Used GROUP_CONCAT to combine multiple IPs
|
||||
- All relationship queries: Fixed JOIN directions for correct data
|
||||
**Status:** Fixed
|
||||
|
||||
### 5. displaypc.asp
|
||||
**Issue:** Dualpath section redundant
|
||||
**Fix:** Removed entire dualpath section, now shown in "Machines Controlled" with badge
|
||||
**Status:** Fixed
|
||||
|
||||
### 6. network_map.asp
|
||||
**Issue:** Only showing printers, not other network device types
|
||||
**Fix:** Expanded SQL query to UNION ALL device types (servers, switches, cameras, access points, IDFs)
|
||||
**Changes Made:**
|
||||
- Line 240-248: Added servers query
|
||||
- Line 252-260: Added switches query
|
||||
- Line 264-272: Added cameras query
|
||||
- Line 276-284: Added access points query (fixed column name from accesspointid to apid)
|
||||
- Line 288-296: Added IDFs query
|
||||
- Line 420-430: Updated detail URL routing for all device types
|
||||
**Status:** Fixed
|
||||
**Note:** Currently only 37 printers are visible on map because other device types don't have mapleft/maptop coordinates set yet
|
||||
|
||||
---
|
||||
|
||||
## Test Results by Category
|
||||
|
||||
### PASSED - Display Pages (Read-Only)
|
||||
|
||||
| Page | Test Date | Status | Notes |
|
||||
|------|-----------|--------|-------|
|
||||
| displaypcs.asp | 2025-11-13 | 200 OK | Lists 224 PCs from machines table |
|
||||
| displaypc.asp | 2025-11-13 | 200 OK | Shows PC details, relationships working |
|
||||
| displaymachines.asp | 2025-11-13 | 200 OK | Lists equipment (pctypeid IS NULL) |
|
||||
| displaymachine.asp | 2025-11-13 | 200 OK | Shows equipment with PC relationships |
|
||||
| default.asp | 2025-11-13 | 200 OK | Homepage loads correctly |
|
||||
| network_map.asp | 2025-11-13 | 200 OK | Now shows all device types (printers, servers, switches, cameras, access points, IDFs) |
|
||||
| network_devices.asp | 2025-11-13 | 200 OK | Uses vw_network_devices view |
|
||||
|
||||
### PASSED - Add/Save Pages
|
||||
|
||||
| Page | Test Date | Status | Notes |
|
||||
|------|-----------|--------|-------|
|
||||
| adddevice.asp | 2025-11-13 | PASS | Form only, no DB dependencies |
|
||||
| savedevice.asp | 2025-11-13 | PASS | Inserts into machines table correctly |
|
||||
| savedevice_direct.asp | 2025-11-13 | PASS | Uses Phase 2 schema, parameterized queries |
|
||||
|
||||
### PASSED - Edit/Update Pages (After Fixes)
|
||||
|
||||
| Page | Test Date | Status | Notes |
|
||||
|------|-----------|--------|-------|
|
||||
| editdevice.asp | 2025-11-13 | PASS | Fixed undefined variable bug |
|
||||
| updatedevice.asp | 2025-11-13 | PASS | Migrated to machines table |
|
||||
| updatedevice_direct.asp | 2025-11-13 | PASS | Migrated to machines table |
|
||||
|
||||
### PASSED - Warranty Pages (Root Directory)
|
||||
|
||||
| Page | Test Date | Status | Notes |
|
||||
|------|-----------|--------|-------|
|
||||
| check_all_warranties.asp | 2025-11-13 | PASS | Uses machines + warranties tables |
|
||||
| check_all_warranties_clean.asp | 2025-11-13 | PASS | Uses machines + warranties tables |
|
||||
|
||||
### FAILED - Pages Needing Fixes
|
||||
|
||||
| Page | Issue | Priority | Notes |
|
||||
|------|-------|----------|-------|
|
||||
| displaysubnet.asp | Runtime error (subscript out of range) | Medium | Phase 2 tables used correctly, logic bug |
|
||||
| v2/check_warranties_v2.asp | Uses old pc table | Low | v2 directory |
|
||||
| v2/check_all_warranties.asp | Uses old pc table | Low | v2 directory |
|
||||
| v2/check_all_warranties_clean.asp | Uses old pc table | Low | v2 directory |
|
||||
| All v2/*.asp pages | ODBC configuration missing | Low | v2 directory |
|
||||
|
||||
---
|
||||
|
||||
## Error Log Analysis
|
||||
|
||||
### Errors Found in IIS Logs (/home/camp/projects/windows/logs/shopdb/ex251113.log)
|
||||
|
||||
**Timeline of Migration:**
|
||||
- 17:10:22 - Before migration: "Table 'shopdb.communications' doesn't exist"
|
||||
- 17:36:44 - After migration: Pages working with Phase 2 schema
|
||||
- **Migration window: 17:10-17:36** (26 minutes)
|
||||
|
||||
**Fixed Errors:**
|
||||
- 18:13:08 - displaymachines.asp: Unknown column 'machines.pctypeid' → Fixed
|
||||
- 18:32:57 - displaymachine.asp: Unknown column 'machines.dateadded' → Fixed
|
||||
- 19:16-19:38 - displaymachine.asp: Compliance column errors → Fixed
|
||||
- 20:39:29 - displaypc.asp: Item not found (relationshiptype) → Fixed
|
||||
|
||||
**Remaining Errors:**
|
||||
- 23:00:10 - displaysubnet.asp: Subscript out of range (error code 44)
|
||||
- 23:00:32 - v2/*.asp: ODBC configuration missing
|
||||
|
||||
---
|
||||
|
||||
## Phase 2 Compliance Status
|
||||
|
||||
### Tables Migrated:
|
||||
- `pc` → `machines WHERE pctypeid IS NOT NULL`
|
||||
- `pc.pcid` → `machines.machineid`
|
||||
- `pc.pcstatusid` → `machines.machinestatusid`
|
||||
- `pc_network_interfaces` → `communications`
|
||||
- `pc_dualpath_assignments` → `machinerelationships`
|
||||
|
||||
### Files Updated for Phase 2:
|
||||
1. displaypcs.asp
|
||||
2. displaypc.asp
|
||||
3. editdevice.asp
|
||||
4. savedevice.asp
|
||||
5. savedevice_direct.asp
|
||||
6. updatedevice.asp
|
||||
7. updatedevice_direct.asp
|
||||
8. displaymachine.asp
|
||||
9. displaymachines.asp
|
||||
10. check_all_warranties.asp
|
||||
11. check_all_warranties_clean.asp
|
||||
12. displaysubnet.asp (tables correct, logic bug)
|
||||
13. network_map.asp
|
||||
14. network_devices.asp
|
||||
|
||||
### Files NOT Updated (v2 directory):
|
||||
1. v2/check_warranties_v2.asp
|
||||
2. v2/check_all_warranties.asp
|
||||
3. v2/check_all_warranties_clean.asp
|
||||
4. v2/displaysubnet.asp
|
||||
|
||||
---
|
||||
|
||||
## Recommendations
|
||||
|
||||
### Immediate Actions:
|
||||
1. COMPLETED: Fix editdevice.asp undefined variable
|
||||
2. COMPLETED: Migrate updatedevice.asp to Phase 2 schema
|
||||
3. COMPLETED: Migrate updatedevice_direct.asp to Phase 2 schema
|
||||
4. TODO: Fix displaysubnet.asp subscript out of range error
|
||||
5. TODO: Update or deprecate v2 directory
|
||||
|
||||
### Future Cleanup:
|
||||
1. Drop old `pc`, `pc_network_interfaces`, `pc_comm_config`, `pc_dualpath_assignments` tables after confirming no dependencies
|
||||
2. Decide on v2 directory - update or remove
|
||||
3. Continue testing remaining 108 ASP pages
|
||||
4. Test POST operations (create/update) with real data
|
||||
|
||||
---
|
||||
|
||||
## Security Assessment
|
||||
|
||||
**All tested pages use parameterized queries**
|
||||
- No SQL injection vulnerabilities found
|
||||
- Proper input validation on all save/update pages
|
||||
- HTML encoding used for output
|
||||
|
||||
---
|
||||
|
||||
## Performance Notes
|
||||
|
||||
- displaymachine.asp: Uses GROUP_CONCAT for multiple IPs (efficient)
|
||||
- Relationship queries: Use proper JOINs and indexes
|
||||
- No N+1 query issues observed
|
||||
|
||||
---
|
||||
|
||||
## Next Steps for Production
|
||||
|
||||
1. **Run full test suite** on production backup database
|
||||
2. **Test all create/edit/delete operations** manually
|
||||
3. **Monitor IIS logs** for 48 hours after deployment
|
||||
4. **Create rollback plan** with tested SQL scripts
|
||||
5. **Schedule maintenance window** for production migration
|
||||
|
||||
---
|
||||
|
||||
**Status:** Core PC functionality Phase 2 compliant
|
||||
**Production Ready:** After fixing displaysubnet.asp and testing remaining pages
|
||||
**Risk Level:** Low - All critical paths tested and working
|
||||
489
docs/archive/PHASE3_NETWORK_DEVICES_MIGRATION_PLAN.md
Normal file
489
docs/archive/PHASE3_NETWORK_DEVICES_MIGRATION_PLAN.md
Normal file
@@ -0,0 +1,489 @@
|
||||
# Phase 3: Network Devices Migration to machines Table
|
||||
|
||||
**Date:** 2025-11-10
|
||||
**Status:** PLANNING
|
||||
**Follows:** Phase 2 (PC Migration - Completed)
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Consolidate all network infrastructure devices (servers, switches, cameras, access points, IDFs) into the unified `machines` table. This completes the infrastructure unification started in Phase 2 with PCs, creating a single source of truth for all physical assets except printers.
|
||||
|
||||
---
|
||||
|
||||
## Scope
|
||||
|
||||
### Migrate INTO machines Table:
|
||||
- **Servers** → machinetypeid 30
|
||||
- **Switches** → machinetypeid 31
|
||||
- **Cameras** → machinetypeid 32
|
||||
- **Access Points** → machinetypeid 33
|
||||
- **IDFs** → machinetypeid 34
|
||||
- **Routers** → machinetypeid 35 (if exists)
|
||||
- **Firewalls** → machinetypeid 36 (if exists)
|
||||
|
||||
### Keep SEPARATE:
|
||||
- **Printers** → Stay in `printers` table (unique fields, workflows, APIs)
|
||||
|
||||
---
|
||||
|
||||
## Why This Migration?
|
||||
|
||||
### Current Problems:
|
||||
1. **Data Fragmentation:** Network devices scattered across 5+ tables
|
||||
2. **Code Duplication:** Separate pages for each device type
|
||||
3. **Relationship Limitations:** Can't relate servers to switches to cameras
|
||||
4. **Query Complexity:** UNION queries to find all devices on a network
|
||||
5. **Inconsistent UI/UX:** Different interfaces for similar devices
|
||||
|
||||
### After Migration:
|
||||
1. **Single Source of Truth:** All infrastructure in `machines` table
|
||||
2. **Unified Relationships:** Camera → Switch → IDF using `machinerelationships`
|
||||
3. **Unified Communications:** All IPs in `communications` table
|
||||
4. **Consistent UI:** One set of pages for all devices
|
||||
5. **Powerful Queries:** Cross-device reports and topology mapping
|
||||
6. **Better Compliance:** All devices tracked in one place
|
||||
|
||||
---
|
||||
|
||||
## Architecture
|
||||
|
||||
### Current Structure:
|
||||
```
|
||||
machines table
|
||||
├── Equipment (machinetypeid 1-24, pctypeid IS NULL)
|
||||
└── PCs (machinetypeid 25-29, pctypeid IS NOT NULL)
|
||||
|
||||
servers table (separate)
|
||||
switches table (separate)
|
||||
cameras table (separate)
|
||||
accesspoints table (separate)
|
||||
idfs table (separate)
|
||||
|
||||
printers table (stays separate)
|
||||
```
|
||||
|
||||
### Target Structure:
|
||||
```
|
||||
machines table
|
||||
├── Equipment (machinetypeid 1-24, pctypeid IS NULL)
|
||||
├── PCs (machinetypeid 25-29, pctypeid IS NOT NULL)
|
||||
└── Network Devices (machinetypeid 30-36, pctypeid IS NULL) ← NEW
|
||||
|
||||
printers table (stays separate - by design)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## New Machine Types (30-36)
|
||||
|
||||
```sql
|
||||
INSERT INTO machinetypes (machinetypeid, machinetype, category, description, displayorder) VALUES
|
||||
(30, 'Server', 'Network', 'Physical or virtual server', 30),
|
||||
(31, 'Switch', 'Network', 'Network switch', 31),
|
||||
(32, 'Camera', 'Network', 'IP camera or security camera', 32),
|
||||
(33, 'Access Point', 'Network', 'Wireless access point', 33),
|
||||
(34, 'IDF', 'Network', 'Intermediate Distribution Frame', 34),
|
||||
(35, 'Router', 'Network', 'Network router', 35),
|
||||
(36, 'Firewall', 'Network', 'Network firewall', 36);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Filtering Strategy
|
||||
|
||||
```sql
|
||||
-- All PCs
|
||||
SELECT * FROM machines WHERE pctypeid IS NOT NULL;
|
||||
|
||||
-- All Equipment (CNC machines, mills, lathes, etc.)
|
||||
SELECT * FROM machines WHERE pctypeid IS NULL AND machinetypeid BETWEEN 1 AND 24;
|
||||
|
||||
-- All Network Devices
|
||||
SELECT * FROM machines WHERE pctypeid IS NULL AND machinetypeid BETWEEN 30 AND 36;
|
||||
|
||||
-- Specific device types
|
||||
SELECT * FROM machines WHERE machinetypeid = 30; -- Servers
|
||||
SELECT * FROM machines WHERE machinetypeid = 31; -- Switches
|
||||
SELECT * FROM machines WHERE machinetypeid = 32; -- Cameras
|
||||
|
||||
-- All non-printer infrastructure
|
||||
SELECT * FROM machines; -- Everything except printers
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Data Migration Mapping
|
||||
|
||||
### Servers Table → Machines
|
||||
```
|
||||
servers.serverid → machines.machineid (new)
|
||||
servers.modelid → machines.modelnumberid
|
||||
servers.serialnumber → machines.serialnumber
|
||||
servers.description → machines.alias
|
||||
servers.maptop → machines.maptop
|
||||
servers.mapleft → machines.mapleft
|
||||
servers.isactive → machines.isactive
|
||||
servers.ipaddress → communications.address (comstypeid=1)
|
||||
30 (constant) → machines.machinetypeid
|
||||
NULL → machines.pctypeid
|
||||
'SERVER-{serverid}' → machines.machinenumber (generated)
|
||||
```
|
||||
|
||||
### Switches Table → Machines
|
||||
```
|
||||
switches.switchid → machines.machineid (new)
|
||||
switches.modelid → machines.modelnumberid
|
||||
switches.serialnumber → machines.serialnumber
|
||||
switches.description → machines.alias
|
||||
switches.maptop → machines.maptop
|
||||
switches.mapleft → machines.mapleft
|
||||
switches.isactive → machines.isactive
|
||||
switches.ipaddress → communications.address (comstypeid=1)
|
||||
31 (constant) → machines.machinetypeid
|
||||
NULL → machines.pctypeid
|
||||
'SWITCH-{switchid}' → machines.machinenumber (generated)
|
||||
```
|
||||
|
||||
### Cameras Table → Machines
|
||||
```
|
||||
cameras.cameraid → machines.machineid (new)
|
||||
cameras.modelid → machines.modelnumberid
|
||||
cameras.serialnumber → machines.serialnumber
|
||||
cameras.description → machines.alias
|
||||
cameras.maptop → machines.maptop
|
||||
cameras.mapleft → machines.mapleft
|
||||
cameras.isactive → machines.isactive
|
||||
cameras.ipaddress → communications.address (comstypeid=1)
|
||||
32 (constant) → machines.machinetypeid
|
||||
NULL → machines.pctypeid
|
||||
'CAMERA-{cameraid}' → machines.machinenumber (generated)
|
||||
```
|
||||
|
||||
### Access Points Table → Machines (if exists)
|
||||
```
|
||||
accesspoints.accesspointid → machines.machineid (new)
|
||||
accesspoints.modelid → machines.modelnumberid
|
||||
accesspoints.serialnumber → machines.serialnumber
|
||||
accesspoints.description → machines.alias
|
||||
accesspoints.maptop → machines.maptop
|
||||
accesspoints.mapleft → machines.mapleft
|
||||
accesspoints.isactive → machines.isactive
|
||||
accesspoints.ipaddress → communications.address (comstypeid=1)
|
||||
33 (constant) → machines.machinetypeid
|
||||
NULL → machines.pctypeid
|
||||
'AP-{accesspointid}' → machines.machinenumber (generated)
|
||||
```
|
||||
|
||||
### IDFs Table → Machines (if exists)
|
||||
```
|
||||
idfs.idfid → machines.machineid (new)
|
||||
idfs.name → machines.machinenumber
|
||||
idfs.description → machines.alias
|
||||
idfs.maptop → machines.maptop
|
||||
idfs.mapleft → machines.mapleft
|
||||
idfs.isactive → machines.isactive
|
||||
34 (constant) → machines.machinetypeid
|
||||
NULL → machines.pctypeid
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## New Relationship Types
|
||||
|
||||
```sql
|
||||
INSERT INTO relationshiptypes (relationshiptype, description, isbidirectional) VALUES
|
||||
-- Existing relationships
|
||||
('Dualpath', 'Machines sharing the same controller', 1),
|
||||
('Controlled By', 'Machine controlled by PC', 0),
|
||||
('Controls', 'PC controls this machine', 0),
|
||||
|
||||
-- New network relationships
|
||||
('Connected To', 'Device physically connected to infrastructure', 0),
|
||||
('Powered By', 'Device powered by this power source', 0),
|
||||
('Mounted In', 'Device mounted in rack/cabinet', 0),
|
||||
('Feeds Video To', 'Camera feeds video to this server/NVR', 0),
|
||||
('Provides Network', 'Infrastructure provides network to device', 0);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Migration Scripts Structure
|
||||
|
||||
```
|
||||
/home/camp/projects/windows/shopdb/sql/migration_phase3/
|
||||
├── 01_create_network_machinetypes.sql
|
||||
├── 02_migrate_servers_to_machines.sql
|
||||
├── 03_migrate_switches_to_machines.sql
|
||||
├── 04_migrate_cameras_to_machines.sql
|
||||
├── 05_migrate_accesspoints_to_machines.sql
|
||||
├── 06_migrate_idfs_to_machines.sql
|
||||
├── 07_migrate_network_communications.sql
|
||||
├── 08_create_network_relationships.sql
|
||||
├── 09_update_views_for_network_devices.sql
|
||||
├── 10_update_vendor_flags.sql
|
||||
├── VERIFY_PHASE3_MIGRATION.sql
|
||||
├── RUN_ALL_PHASE3_SCRIPTS.sql
|
||||
└── ROLLBACK_PHASE3.sql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Migration Order
|
||||
|
||||
### Pre-Migration:
|
||||
1. **Backup database**
|
||||
2. **Verify Phase 2 is stable**
|
||||
3. **Document current table structures**
|
||||
4. **Count records in each table**
|
||||
|
||||
### Migration Steps:
|
||||
1. **Create new machinetypes** (30-36)
|
||||
2. **Migrate servers** → machines + communications
|
||||
3. **Migrate switches** → machines + communications
|
||||
4. **Migrate cameras** → machines + communications
|
||||
5. **Migrate access points** → machines + communications (if exists)
|
||||
6. **Migrate IDFs** → machines (if exists)
|
||||
7. **Create network relationships** (camera → switch → IDF)
|
||||
8. **Update vendor flags** (isserver, isswitch, etc.)
|
||||
9. **Update views** (create vw_network_devices if needed)
|
||||
10. **Verify data integrity**
|
||||
|
||||
### Post-Migration:
|
||||
1. **Run verification queries**
|
||||
2. **Test UI pages**
|
||||
3. **Update code references**
|
||||
4. **Keep old tables temporarily** (for rollback safety)
|
||||
5. **Monitor for issues**
|
||||
6. **Drop old tables after 30 days** (if stable)
|
||||
|
||||
---
|
||||
|
||||
## Code Updates Required
|
||||
|
||||
### Pages to Update:
|
||||
1. **displaymachines.asp** - Add filter tabs for network devices
|
||||
2. **displaymachine.asp** - Already supports all types via machinetypeid
|
||||
3. **machine_edit.asp** - Already supports all types
|
||||
4. **adddevice.asp** - Update to include network device types
|
||||
|
||||
### Pages to Deprecate:
|
||||
1. **displayservers.asp** → Redirect to displaymachines.asp?type=server
|
||||
2. **displayswitches.asp** → Redirect to displaymachines.asp?type=switch
|
||||
3. **displaycameras.asp** → Redirect to displaymachines.asp?type=camera
|
||||
4. **network_devices.asp** → Redirect to displaymachines.asp?category=network
|
||||
|
||||
### Views to Update:
|
||||
```sql
|
||||
-- Update or create
|
||||
CREATE OR REPLACE VIEW vw_all_infrastructure AS
|
||||
SELECT
|
||||
m.machineid,
|
||||
m.machinenumber,
|
||||
m.alias,
|
||||
mt.machinetype,
|
||||
mt.category,
|
||||
mo.modelnumber,
|
||||
v.vendor,
|
||||
c.address AS ipaddress,
|
||||
CASE
|
||||
WHEN m.pctypeid IS NOT NULL THEN 'PC'
|
||||
WHEN mt.category = 'Network' THEN 'Network Device'
|
||||
ELSE 'Equipment'
|
||||
END AS device_category
|
||||
FROM machines m
|
||||
LEFT JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN vendors v ON mo.vendorid = v.vendorid
|
||||
LEFT JOIN communications c ON m.machineid = c.machineid AND c.isprimary = 1
|
||||
WHERE m.isactive = 1;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verification Queries
|
||||
|
||||
### Record Counts
|
||||
```sql
|
||||
-- Before migration
|
||||
SELECT 'servers' AS table_name, COUNT(*) AS count FROM servers
|
||||
UNION ALL
|
||||
SELECT 'switches', COUNT(*) FROM switches
|
||||
UNION ALL
|
||||
SELECT 'cameras', COUNT(*) FROM cameras
|
||||
UNION ALL
|
||||
SELECT 'accesspoints', COUNT(*) FROM accesspoints
|
||||
UNION ALL
|
||||
SELECT 'idfs', COUNT(*) FROM idfs;
|
||||
|
||||
-- After migration
|
||||
SELECT
|
||||
mt.machinetype,
|
||||
COUNT(*) AS count
|
||||
FROM machines m
|
||||
JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
WHERE mt.machinetypeid BETWEEN 30 AND 36
|
||||
GROUP BY mt.machinetype;
|
||||
```
|
||||
|
||||
### Data Integrity
|
||||
```sql
|
||||
-- Verify all network devices have machine types
|
||||
SELECT COUNT(*) FROM machines
|
||||
WHERE machinetypeid BETWEEN 30 AND 36
|
||||
AND machinetypeid IS NULL;
|
||||
-- Should be 0
|
||||
|
||||
-- Verify all network devices have pctypeid = NULL
|
||||
SELECT COUNT(*) FROM machines
|
||||
WHERE machinetypeid BETWEEN 30 AND 36
|
||||
AND pctypeid IS NOT NULL;
|
||||
-- Should be 0
|
||||
|
||||
-- Verify IP addresses migrated
|
||||
SELECT
|
||||
mt.machinetype,
|
||||
COUNT(DISTINCT m.machineid) AS total_devices,
|
||||
COUNT(DISTINCT c.machineid) AS devices_with_ip
|
||||
FROM machines m
|
||||
JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
LEFT JOIN communications c ON m.machineid = c.machineid AND c.comstypeid = 1
|
||||
WHERE mt.machinetypeid BETWEEN 30 AND 36
|
||||
GROUP BY mt.machinetype;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Rollback Plan
|
||||
|
||||
### If Issues Found:
|
||||
1. **Stop immediately**
|
||||
2. **Run ROLLBACK_PHASE3.sql**
|
||||
3. **Verify old tables intact**
|
||||
4. **Restore from backup if needed**
|
||||
5. **Review errors**
|
||||
6. **Fix and retry**
|
||||
|
||||
### Rollback Script (High-Level):
|
||||
```sql
|
||||
-- Delete migrated network devices from machines
|
||||
DELETE FROM machines WHERE machinetypeid BETWEEN 30 AND 36;
|
||||
|
||||
-- Delete migrated communications
|
||||
DELETE FROM communications WHERE machineid NOT IN (SELECT machineid FROM machines);
|
||||
|
||||
-- Delete new relationship types
|
||||
DELETE FROM relationshiptypes WHERE relationshiptypeid > 5;
|
||||
|
||||
-- Delete new machinetypes
|
||||
DELETE FROM machinetypes WHERE machinetypeid BETWEEN 30 AND 36;
|
||||
|
||||
-- Verify old tables still have data
|
||||
SELECT COUNT(*) FROM servers;
|
||||
SELECT COUNT(*) FROM switches;
|
||||
SELECT COUNT(*) FROM cameras;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Success Criteria
|
||||
|
||||
### Migration Successful If:
|
||||
1. All records migrated (counts match)
|
||||
2. All IP addresses migrated to communications
|
||||
3. All relationships preserved
|
||||
4. No NULL values in required fields
|
||||
5. UI pages display correctly
|
||||
6. Queries perform well
|
||||
7. No data loss
|
||||
8. Rollback tested and works
|
||||
|
||||
---
|
||||
|
||||
## Timeline Estimate
|
||||
|
||||
- **Planning & Script Creation:** 2-3 hours
|
||||
- **Testing on Dev/Backup:** 1-2 hours
|
||||
- **Production Migration:** 30-45 minutes
|
||||
- **Verification:** 1 hour
|
||||
- **Code Updates:** 3-4 hours
|
||||
- **Testing & Bug Fixes:** 2-3 hours
|
||||
|
||||
**Total:** ~10-15 hours of work
|
||||
|
||||
---
|
||||
|
||||
## Risk Assessment
|
||||
|
||||
### Low Risk:
|
||||
- Pattern proven with Phase 2 PC migration
|
||||
- Can be rolled back easily
|
||||
- Old tables kept temporarily
|
||||
- Comprehensive verification
|
||||
|
||||
### Medium Risk:
|
||||
- Multiple tables being migrated
|
||||
- Code references to update
|
||||
- Testing required for all device types
|
||||
|
||||
### Mitigation:
|
||||
- **Test on backup database first**
|
||||
- **Migrate one device type at a time**
|
||||
- **Verify after each migration**
|
||||
- **Keep old tables for 30 days**
|
||||
- **Update code incrementally**
|
||||
|
||||
---
|
||||
|
||||
## Benefits After Completion
|
||||
|
||||
### Immediate:
|
||||
1. Single query for all infrastructure
|
||||
2. Unified relationship management
|
||||
3. Camera → IDF relationships work
|
||||
4. Consistent UI across all devices
|
||||
5. Better network topology visibility
|
||||
|
||||
### Long-Term:
|
||||
1. Easier to add new device types
|
||||
2. Less code duplication
|
||||
3. Better reporting capabilities
|
||||
4. Simplified maintenance
|
||||
5. CMDB-style asset management
|
||||
6. Better compliance tracking
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. **Create migration SQL scripts**
|
||||
2. **Create verification scripts**
|
||||
3. **Create rollback scripts**
|
||||
4. **Test on backup database**
|
||||
5. **Review and approve plan**
|
||||
6. **Schedule migration window**
|
||||
7. **Execute migration**
|
||||
8. **Update code**
|
||||
9. **Monitor and verify**
|
||||
|
||||
---
|
||||
|
||||
**Status:** Ready for script creation
|
||||
**Approval Required:** Yes
|
||||
**Backup Required:** Yes
|
||||
**Estimated Duration:** 30-45 minutes (migration only)
|
||||
|
||||
---
|
||||
|
||||
## Questions to Answer Before Migration
|
||||
|
||||
1. Do accesspoints and idfs tables exist?
|
||||
2. Are there any custom fields in device tables we need to preserve?
|
||||
3. Are there any foreign key constraints to old tables?
|
||||
4. What's the maintenance window schedule?
|
||||
5. Should we create camera → IDF relationships during migration or manually after?
|
||||
|
||||
---
|
||||
|
||||
**Ready to proceed with script creation!**
|
||||
283
docs/archive/PRINTER_INSTALLER_FIX_2025-11-20.md
Normal file
283
docs/archive/PRINTER_INSTALLER_FIX_2025-11-20.md
Normal file
@@ -0,0 +1,283 @@
|
||||
# Printer Installer Batch File Fix
|
||||
|
||||
**Date:** 2025-11-20
|
||||
**Issue:** Batch file download from displayprinters/displayprinter pages fails with PowerShell command errors
|
||||
**Status:** FIXED
|
||||
|
||||
---
|
||||
|
||||
## Problem Description
|
||||
|
||||
When downloading the printer installer batch file (e.g., `Install_CSF08-LaserJet-4001.bat`) from the displayprinters or displayprinter pages, the batch file would error out with messages like:
|
||||
|
||||
```
|
||||
'Write-Host' is not recognized as an internal or external command,
|
||||
operable program or batch file.
|
||||
'$printerName' is not recognized as an internal or external command,
|
||||
operable program or batch file.
|
||||
```
|
||||
|
||||
### Root Cause
|
||||
|
||||
The ASP code was generating a PowerShell command split across multiple lines in the batch file:
|
||||
|
||||
```batch
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -Command "
|
||||
Write-Host 'Installing printer with universal driver...' -ForegroundColor Cyan;
|
||||
|
||||
$printerName = 'CSF08-LaserJet-4001';
|
||||
$address = 'Printer-10-80-92-58.printer.geaerospace.net';
|
||||
...
|
||||
"
|
||||
```
|
||||
|
||||
The CMD batch file interpreter doesn't support multi-line PowerShell commands in this format. It would try to execute the PowerShell code as batch commands, resulting in errors.
|
||||
|
||||
---
|
||||
|
||||
## Solution
|
||||
|
||||
The PowerShell command is now built as a **single line** with semicolons separating statements:
|
||||
|
||||
```batch
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -Command "Write-Host 'Installing printer with universal driver...' -ForegroundColor Cyan; $printerName = 'CSF08-LaserJet-4001'; $address = 'Printer-10-80-92-58.printer.geaerospace.net'; $driverName = 'HP Universal Printing PCL 6'; $portName = 'IP_' + $address; $driver = Get-PrinterDriver -Name $driverName -ErrorAction SilentlyContinue; if (-not $driver) { Write-Host 'ERROR: Universal driver not found!' -ForegroundColor Red; Write-Host 'Please install ' $driverName ' from Windows Update or driver package' -ForegroundColor Yellow; exit 1; }; $port = Get-PrinterPort -Name $portName -ErrorAction SilentlyContinue; if (-not $port) { Write-Host 'Creating printer port...' -ForegroundColor Yellow; Add-PrinterPort -Name $portName -PrinterHostAddress $address -ErrorAction Stop; Write-Host 'Port created successfully' -ForegroundColor Green; } else { Write-Host 'Port already exists' -ForegroundColor Green; }; $existingPrinter = Get-Printer -Name $printerName -ErrorAction SilentlyContinue; if (-not $existingPrinter) { Write-Host 'Adding printer...' -ForegroundColor Yellow; Add-Printer -Name $printerName -DriverName $driverName -PortName $portName -ErrorAction Stop; Write-Host 'Printer installed successfully!' -ForegroundColor Green; } else { Write-Host 'Printer already exists' -ForegroundColor Green; }"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Files Modified
|
||||
|
||||
### 1. `/home/camp/projects/windows/shopdb/install_printer.asp`
|
||||
**Lines:** 180-223
|
||||
**Changes:**
|
||||
- Added `Dim psCommand` variable declaration
|
||||
- Built PowerShell command as a single concatenated string
|
||||
- All PowerShell statements joined with semicolons
|
||||
- Single `Response.Write()` call to output the complete command
|
||||
|
||||
### 2. `/home/camp/projects/windows/shopdb/v2/install_printer.asp`
|
||||
**Lines:** 180-223
|
||||
**Changes:**
|
||||
- Same fix applied to v2 version
|
||||
|
||||
---
|
||||
|
||||
## Code Changes Summary
|
||||
|
||||
**Before (Lines 181-224):**
|
||||
```vbscript
|
||||
' Generate PowerShell script to install printer
|
||||
Response.Write("powershell -NoProfile -ExecutionPolicy Bypass -Command """ & vbCrLf)
|
||||
Response.Write(" Write-Host 'Installing printer with universal driver...' -ForegroundColor Cyan;" & vbCrLf)
|
||||
Response.Write(" " & vbCrLf)
|
||||
Response.Write(" $printerName = '" & Replace(printer("name"), "'", "''") & "';" & vbCrLf)
|
||||
' ... 40+ more lines of multi-line output ...
|
||||
```
|
||||
|
||||
**After (Lines 180-223):**
|
||||
```vbscript
|
||||
' Build PowerShell command as single line
|
||||
Dim psCommand
|
||||
psCommand = "Write-Host 'Installing printer with universal driver...' -ForegroundColor Cyan; "
|
||||
psCommand = psCommand & "$printerName = '" & Replace(printer("name"), "'", "''") & "'; "
|
||||
psCommand = psCommand & "$address = '" & Replace(printer("address"), "'", "''") & "'; "
|
||||
' ... build complete command as single string ...
|
||||
|
||||
' Write PowerShell command as single line
|
||||
Response.Write("powershell -NoProfile -ExecutionPolicy Bypass -Command """ & psCommand & """" & vbCrLf)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Testing Instructions
|
||||
|
||||
### Test 1: Download from displayprinters.asp
|
||||
1. Navigate to `http://192.168.122.151:8080/displayprinters.asp`
|
||||
2. Find any HP printer (e.g., CSF08-LaserJet-4001)
|
||||
3. Click the download installer button
|
||||
4. Save the `.bat` file to Downloads
|
||||
5. Open CMD and run the batch file
|
||||
6. **Expected:** PowerShell commands execute successfully, printer installs
|
||||
|
||||
### Test 2: Download from displayprinter.asp
|
||||
1. Navigate to `http://192.168.122.151:8080/displayprinter.asp?printerid=X`
|
||||
2. Click the download installer button
|
||||
3. Save the `.bat` file to Downloads
|
||||
4. Open CMD and run the batch file
|
||||
5. **Expected:** PowerShell commands execute successfully, printer installs
|
||||
|
||||
### Test 3: Verify Universal Driver Detection
|
||||
**For HP Printers:**
|
||||
- Should use "HP Universal Printing PCL 6"
|
||||
- Checks if driver exists before proceeding
|
||||
- Errors with clear message if driver not installed
|
||||
|
||||
**For Xerox Printers:**
|
||||
- Should use "Xerox Global Print Driver PCL6"
|
||||
|
||||
**For Generic/Unknown:**
|
||||
- Should use "Generic / Text Only"
|
||||
|
||||
---
|
||||
|
||||
## Expected Output
|
||||
|
||||
### Successful Installation
|
||||
```
|
||||
========================================
|
||||
GE Aerospace Printer Installer
|
||||
========================================
|
||||
|
||||
Installing 1 printer(s)...
|
||||
|
||||
----------------------------------------
|
||||
Installing: CSF08-LaserJet-4001
|
||||
CSF Name: CSF08
|
||||
Model: LaserJet Pro 4001n
|
||||
Address: Printer-10-80-92-58.printer.geaerospace.net
|
||||
----------------------------------------
|
||||
|
||||
Using universal driver: HP Universal Printing PCL 6
|
||||
|
||||
Installing printer with universal driver...
|
||||
Port already exists
|
||||
Printer already exists
|
||||
|
||||
========================================
|
||||
Installation Complete!
|
||||
========================================
|
||||
|
||||
Press any key to continue . . .
|
||||
```
|
||||
|
||||
### Driver Not Found
|
||||
```
|
||||
ERROR: Universal driver not found!
|
||||
Please install HP Universal Printing PCL 6 from Windows Update or driver package
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Related Issues
|
||||
|
||||
### Issue Type
|
||||
- Bug Fix
|
||||
- Batch File Generation
|
||||
- PowerShell Integration
|
||||
|
||||
### Affected Functionality
|
||||
- Printer installer downloads (universal driver method)
|
||||
- Printers without custom `installpath` in database
|
||||
|
||||
### Not Affected
|
||||
- Printers with custom `installpath` (uses different code path)
|
||||
- Manual printer installation
|
||||
- Printer display/search functionality
|
||||
|
||||
---
|
||||
|
||||
## Technical Details
|
||||
|
||||
### Why Single-Line PowerShell?
|
||||
|
||||
When using `powershell.exe -Command "..."`, the command must be:
|
||||
1. A single line, OR
|
||||
2. Use proper batch line continuation with `^`, OR
|
||||
3. Use `-File` with a .ps1 script
|
||||
|
||||
The original code attempted multi-line without proper continuation, causing the batch interpreter to misinterpret PowerShell code as batch commands.
|
||||
|
||||
### Alternative Solutions Considered
|
||||
|
||||
**Option 1:** Use caret (^) for line continuation
|
||||
```batch
|
||||
powershell -Command "Write-Host 'Test'; ^
|
||||
$var = 'value'; ^
|
||||
Do-Something"
|
||||
```
|
||||
**Rejected:** More complex escaping, harder to maintain
|
||||
|
||||
**Option 2:** Generate temporary .ps1 file
|
||||
```batch
|
||||
echo $printerName = 'Test' > %TEMP%\install.ps1
|
||||
echo Add-Printer ... >> %TEMP%\install.ps1
|
||||
powershell -File %TEMP%\install.ps1
|
||||
```
|
||||
**Rejected:** More file I/O, cleanup required, potential security issues
|
||||
|
||||
**Option 3:** Single-line command (CHOSEN)
|
||||
```batch
|
||||
powershell -Command "Write-Host 'Test'; $var = 'value'; Do-Something"
|
||||
```
|
||||
**Selected:** Simplest, most reliable, no temp files needed
|
||||
|
||||
---
|
||||
|
||||
## Validation
|
||||
|
||||
### Code Review Checklist
|
||||
- Both install_printer.asp files updated (main and v2)
|
||||
- PowerShell command built as single string
|
||||
- All statements joined with semicolons
|
||||
- Single quotes properly escaped with Replace()
|
||||
- Error handling preserved
|
||||
- Driver detection logic maintained
|
||||
- Port creation logic maintained
|
||||
- Printer installation logic maintained
|
||||
|
||||
### Testing Checklist
|
||||
- Test HP printer download and install
|
||||
- Test Xerox printer download and install
|
||||
- Test printer without universal driver
|
||||
- Test printer already installed scenario
|
||||
- Test port already exists scenario
|
||||
- Verify error messages display correctly
|
||||
- Verify batch file self-deletes after execution
|
||||
|
||||
---
|
||||
|
||||
## Deployment
|
||||
|
||||
### Deployment Status
|
||||
- Code changes complete
|
||||
- Both files (main and v2) updated
|
||||
- Testing pending
|
||||
- Production deployment pending
|
||||
|
||||
### Rollback Plan
|
||||
If issues arise, revert to previous version:
|
||||
```bash
|
||||
git checkout HEAD~1 install_printer.asp
|
||||
git checkout HEAD~1 v2/install_printer.asp
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Additional Notes
|
||||
|
||||
### Printers with Custom Installers
|
||||
Printers with a value in the `installpath` database field use a **different code path** and are NOT affected by this bug. They download and execute a custom .exe installer.
|
||||
|
||||
### Universal Driver Availability
|
||||
The universal drivers must be installed on the target PC:
|
||||
- **HP Universal Printing PCL 6** - Available via Windows Update
|
||||
- **Xerox Global Print Driver PCL6** - Requires vendor download
|
||||
|
||||
If the driver is not installed, the script will error with clear instructions.
|
||||
|
||||
---
|
||||
|
||||
**Author:** Claude Code
|
||||
**Reviewed By:** Pending
|
||||
**Status:** Ready for Testing
|
||||
**Production Ready:** After successful testing
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference
|
||||
|
||||
**Bug:** Multi-line PowerShell commands in batch file
|
||||
**Fix:** Build PowerShell command as single line with semicolons
|
||||
**Impact:** Universal driver printer installations
|
||||
**Files:** install_printer.asp (both main and v2)
|
||||
**Testing:** Download .bat file from printer pages and execute
|
||||
593
docs/archive/PRINTER_MAP_MIGRATION_REPORT.md
Normal file
593
docs/archive/PRINTER_MAP_MIGRATION_REPORT.md
Normal file
@@ -0,0 +1,593 @@
|
||||
# Printer Mapping Migration Report
|
||||
|
||||
**Date:** 2025-10-22
|
||||
**Author:** Development Team
|
||||
**Status:** Analysis Complete - Ready for Implementation
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
The `printers` table now has `maptop` and `mapleft` columns added for direct printer location mapping on the shop floor map. This migration report outlines the necessary code changes to transition from machine-based printer positioning to direct printer positioning.
|
||||
|
||||
### Database Changes Completed
|
||||
- Added `maptop INT(11)` column to `printers` table
|
||||
- Added `mapleft INT(11)` column to `printers` table
|
||||
- Both columns are nullable (default NULL)
|
||||
- Positioned after `machineid` column
|
||||
|
||||
---
|
||||
|
||||
## Current Implementation Analysis
|
||||
|
||||
### 1. **printermap.asp** - Main Map View
|
||||
|
||||
**Current Behavior:**
|
||||
- Queries printers joined with machines to get map coordinates
|
||||
- Uses `machines.maptop` and `machines.mapleft` for printer positioning
|
||||
- Shows printer at machine location
|
||||
- Requires `printers.machineid != 1` (excludes unassigned printers)
|
||||
|
||||
**SQL Query (Lines 186-189):**
|
||||
```sql
|
||||
SELECT machines.mapleft, machines.maptop, machines.machinenumber,
|
||||
printers.printerid, printers.printercsfname, printers.printerwindowsname,
|
||||
models.modelnumber, models.image, printers.ipaddress, printers.fqdn,
|
||||
machines.machinenotes, machines.alias
|
||||
FROM machines, printers, models
|
||||
WHERE printers.modelid = models.modelnumberid
|
||||
AND printers.machineid != 1
|
||||
AND printers.machineid = machines.machineid
|
||||
AND printers.isactive = 1
|
||||
```
|
||||
|
||||
**Location Display (Lines 202-207):**
|
||||
```vbscript
|
||||
' Uses alias if available, otherwise machinenumber
|
||||
if NOT IsNull(rs("alias")) AND rs("alias") <> "" THEN
|
||||
location = rs("alias")
|
||||
else
|
||||
location = rs("machinenumber")
|
||||
end if
|
||||
```
|
||||
|
||||
**Issues:**
|
||||
- Printers without machine assignment (`machineid=1`) are excluded from map
|
||||
- Multiple printers at same machine appear stacked on same coordinate
|
||||
- Cannot position printer independently of machine
|
||||
|
||||
---
|
||||
|
||||
### 2. **addprinter.asp** - Add New Printer Form
|
||||
|
||||
**Current Behavior:**
|
||||
- Form includes machine dropdown (required field)
|
||||
- Uses machineid to determine printer location
|
||||
- No map coordinate input fields
|
||||
|
||||
**Location Field (Lines 174-197):**
|
||||
```vbscript
|
||||
<div class="form-group">
|
||||
<label for="machineid">Location (Machine) <span class="text-danger">*</span></label>
|
||||
<select class="form-control" id="machineid" name="machineid" required>
|
||||
<option value="">-- Select Location --</option>
|
||||
<!-- Lists all machines -->
|
||||
</select>
|
||||
<small class="form-text text-muted">Which machine/location is this printer at?</small>
|
||||
</div>
|
||||
```
|
||||
|
||||
**Issues:**
|
||||
- No way to set `maptop`/`mapleft` during printer creation
|
||||
- Printer position tied to machine selection
|
||||
- Cannot add printer without machine assignment
|
||||
|
||||
---
|
||||
|
||||
### 3. **saveprinter_direct.asp** - Save New Printer
|
||||
|
||||
**Current Behavior:**
|
||||
- Inserts printer with machineid
|
||||
- Does not handle maptop/mapleft
|
||||
|
||||
**INSERT Statement (Line 191-192):**
|
||||
```vbscript
|
||||
strSQL = "INSERT INTO printers (modelid, serialnumber, ipaddress, fqdn,
|
||||
printercsfname, printerwindowsname, machineid, isactive) " & _
|
||||
"VALUES (...)"
|
||||
```
|
||||
|
||||
**Issues:**
|
||||
- Does not insert `maptop`/`mapleft` values
|
||||
- New printers won't have coordinates
|
||||
|
||||
---
|
||||
|
||||
### 4. **editprinter.asp** - Edit Printer Form
|
||||
|
||||
**Current Behavior:**
|
||||
- Similar to addprinter.asp
|
||||
- Shows machine dropdown
|
||||
- No map coordinate fields
|
||||
|
||||
**Issues:**
|
||||
- Cannot edit printer coordinates
|
||||
- No map picker interface
|
||||
|
||||
---
|
||||
|
||||
### 5. **saveprinter.asp** - Update Printer
|
||||
|
||||
**Current Behavior:**
|
||||
- Updates printer fields including machineid
|
||||
- Does not update maptop/mapleft
|
||||
|
||||
**UPDATE Statement (Lines 168-176):**
|
||||
```vbscript
|
||||
strSQL = "UPDATE printers SET " & _
|
||||
"modelid = " & modelid & ", " & _
|
||||
"serialnumber = '" & serialnumber & "', " & _
|
||||
"ipaddress = '" & ipaddress & "', " & _
|
||||
"fqdn = '" & fqdn & "', " & _
|
||||
"printercsfname = '" & printercsfname & "', " & _
|
||||
"printerwindowsname = '" & printerwindowsname & "', " & _
|
||||
"machineid = " & machineid & " " & _
|
||||
"WHERE printerid = " & printerid
|
||||
```
|
||||
|
||||
**Issues:**
|
||||
- Does not update `maptop`/`mapleft`
|
||||
|
||||
---
|
||||
|
||||
### 6. **displayprinter.asp** - View Printer Details
|
||||
|
||||
**Current Behavior:**
|
||||
- Shows printer details
|
||||
- Displays location as machine number/alias
|
||||
- Has clickable location link
|
||||
|
||||
**Location Display (Lines 87-91):**
|
||||
```vbscript
|
||||
<p class="mb-2">
|
||||
<span class="location-link" data-machineid="<%Response.Write(machineid)%>"
|
||||
style="cursor:pointer; color:#007bff;">
|
||||
<i class="zmdi zmdi-pin" style="margin-right:4px;"></i>
|
||||
<%Response.Write(rs("machinenumber"))%>
|
||||
</span>
|
||||
</p>
|
||||
```
|
||||
|
||||
**Issues:**
|
||||
- Still references machine location
|
||||
- No display of printer's actual map coordinates
|
||||
|
||||
---
|
||||
|
||||
## Required Code Changes
|
||||
|
||||
### Priority 1: Core Map Functionality
|
||||
|
||||
#### 1. **printermap.asp** - Update Query to Use Printer Coordinates
|
||||
|
||||
**Change SQL Query (Lines 186-189):**
|
||||
|
||||
```vbscript
|
||||
<%
|
||||
' OLD (commented out):
|
||||
' strSQL = "SELECT machines.mapleft, machines.maptop, machines.machinenumber, ... FROM machines, printers ..."
|
||||
|
||||
' NEW - Use printer coordinates, fallback to machine if not set
|
||||
strSQL = "SELECT " &_
|
||||
"COALESCE(printers.mapleft, machines.mapleft) AS mapleft, " &_
|
||||
"COALESCE(printers.maptop, machines.maptop) AS maptop, " &_
|
||||
"machines.machinenumber, machines.alias, " &_
|
||||
"printers.printerid, printers.printercsfname, printers.printerwindowsname, " &_
|
||||
"models.modelnumber, models.image, printers.ipaddress, printers.fqdn, " &_
|
||||
"printers.maptop AS printer_maptop, printers.mapleft AS printer_mapleft " &_
|
||||
"FROM printers " &_
|
||||
"INNER JOIN models ON printers.modelid = models.modelnumberid " &_
|
||||
"LEFT JOIN machines ON printers.machineid = machines.machineid " &_
|
||||
"WHERE printers.isactive = 1 " &_
|
||||
" AND (printers.maptop IS NOT NULL OR machines.maptop IS NOT NULL)"
|
||||
|
||||
set rs = objconn.Execute(strSQL)
|
||||
while not rs.eof
|
||||
mapleft = rs("mapleft")
|
||||
maptop = rs("maptop")
|
||||
maptop = 2550 - maptop ' Coordinate transformation
|
||||
' ... rest of code
|
||||
%>
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- Uses printer coordinates if available
|
||||
- Falls back to machine coordinates if printer coordinates not set
|
||||
- Includes printers without machine assignment (if they have coordinates)
|
||||
- Backward compatible during migration
|
||||
|
||||
---
|
||||
|
||||
#### 2. **addprinter.asp** & **editprinter.asp** - Add Map Picker
|
||||
|
||||
**Add New Form Fields (after line 197 in addprinter.asp):**
|
||||
|
||||
```html
|
||||
<div class="form-group">
|
||||
<label>Map Position</label>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<label for="maptop">Map Top</label>
|
||||
<input type="number" class="form-control" id="maptop" name="maptop"
|
||||
placeholder="Y coordinate (0-2550)" min="0" max="2550">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label for="mapleft">Map Left</label>
|
||||
<input type="number" class="form-control" id="mapleft" name="mapleft"
|
||||
placeholder="X coordinate (0-3300)" min="0" max="3300">
|
||||
</div>
|
||||
</div>
|
||||
<small class="form-text text-muted">
|
||||
Leave blank to use machine location.
|
||||
<a href="./printermap.asp" target="_blank" style="color:#007bff;">
|
||||
<i class="zmdi zmdi-map"></i> Open map in new tab
|
||||
</a> to find coordinates.
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<!-- Optional: Add map picker button -->
|
||||
<div class="form-group">
|
||||
<button type="button" class="btn btn-sm btn-info" id="openMapPicker">
|
||||
<i class="zmdi zmdi-map"></i> Pick Location on Map
|
||||
</button>
|
||||
</div>
|
||||
```
|
||||
|
||||
**Add JavaScript for Map Picker Modal (before closing `</body>`):**
|
||||
|
||||
```javascript
|
||||
<script>
|
||||
// Map picker functionality
|
||||
$('#openMapPicker').on('click', function() {
|
||||
// Option 1: Simple - open map in new window
|
||||
window.open('./printermap.asp', 'mapPicker', 'width=1200,height=800');
|
||||
|
||||
// Option 2: Advanced - inline modal with Leaflet (future enhancement)
|
||||
// Show modal with embedded map, allow clicking to select coordinates
|
||||
});
|
||||
|
||||
// If machine is selected, optionally pre-fill coordinates from machine
|
||||
$('#machineid').on('change', function() {
|
||||
var machineid = $(this).val();
|
||||
if (machineid && machineid != '1') {
|
||||
// AJAX call to get machine coordinates
|
||||
$.get('./api_machine_coordinates.asp?machineid=' + machineid, function(data) {
|
||||
if (data.maptop && data.mapleft) {
|
||||
// Optionally suggest coordinates
|
||||
if (confirm('Use machine location coordinates?\nTop: ' + data.maptop + ', Left: ' + data.mapleft)) {
|
||||
$('#maptop').val(data.maptop);
|
||||
$('#mapleft').val(data.mapleft);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### 3. **saveprinter_direct.asp** - Handle Map Coordinates on Insert
|
||||
|
||||
**Add Input Collection (after line 18):**
|
||||
|
||||
```vbscript
|
||||
Dim maptop, mapleft
|
||||
maptop = Trim(Request.Form("maptop"))
|
||||
mapleft = Trim(Request.Form("mapleft"))
|
||||
|
||||
' Validate coordinates if provided
|
||||
If maptop <> "" And Not IsNumeric(maptop) Then
|
||||
Response.Write("<div class='alert alert-danger'>Error: Invalid map top coordinate.</div>")
|
||||
Response.Write("<a href='addprinter.asp'>Go back</a>")
|
||||
objConn.Close
|
||||
Response.End
|
||||
End If
|
||||
|
||||
If mapleft <> "" And Not IsNumeric(mapleft) Then
|
||||
Response.Write("<div class='alert alert-danger'>Error: Invalid map left coordinate.</div>")
|
||||
Response.Write("<a href='addprinter.asp'>Go back</a>")
|
||||
objConn.Close
|
||||
Response.End
|
||||
End If
|
||||
|
||||
' Convert to integers or NULL
|
||||
Dim maptopSQL, mapleftSQL
|
||||
If maptop <> "" And IsNumeric(maptop) Then
|
||||
maptopSQL = CLng(maptop)
|
||||
Else
|
||||
maptopSQL = "NULL"
|
||||
End If
|
||||
|
||||
If mapleft <> "" And IsNumeric(mapleft) Then
|
||||
mapleftSQL = CLng(mapleft)
|
||||
Else
|
||||
mapleftSQL = "NULL"
|
||||
End If
|
||||
```
|
||||
|
||||
**Update INSERT Statement (line 191):**
|
||||
|
||||
```vbscript
|
||||
strSQL = "INSERT INTO printers (modelid, serialnumber, ipaddress, fqdn, " &_
|
||||
"printercsfname, printerwindowsname, machineid, maptop, mapleft, isactive) " &_
|
||||
"VALUES (" & modelid & ", '" & serialnumber & "', '" & ipaddress & "', " &_
|
||||
"'" & fqdn & "', '" & printercsfname & "', '" & printerwindowsname & "', " &_
|
||||
machineid & ", " & maptopSQL & ", " & mapleftSQL & ", 1)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### 4. **saveprinter.asp** - Handle Map Coordinates on Update
|
||||
|
||||
**Add Same Input Collection Code as saveprinter_direct.asp**
|
||||
|
||||
**Update UPDATE Statement (line 168):**
|
||||
|
||||
```vbscript
|
||||
strSQL = "UPDATE printers SET " &_
|
||||
"modelid = " & modelid & ", " &_
|
||||
"serialnumber = '" & serialnumber & "', " &_
|
||||
"ipaddress = '" & ipaddress & "', " &_
|
||||
"fqdn = '" & fqdn & "', " &_
|
||||
"printercsfname = '" & printercsfname & "', " &_
|
||||
"printerwindowsname = '" & printerwindowsname & "', " &_
|
||||
"machineid = " & machineid & ", " &_
|
||||
"maptop = " & maptopSQL & ", " &_
|
||||
"mapleft = " & mapleftSQL & " " &_
|
||||
"WHERE printerid = " & printerid
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Priority 2: Enhanced Features
|
||||
|
||||
#### 5. **displayprinter.asp** - Show Map Coordinates
|
||||
|
||||
**Add to Settings Tab (after line 81):**
|
||||
|
||||
```html
|
||||
<p class="mb-2"><strong>Map Position:</strong></p>
|
||||
```
|
||||
|
||||
**Add to Values Column (after line 93):**
|
||||
|
||||
```vbscript
|
||||
<p class="mb-2">
|
||||
<%
|
||||
If NOT IsNull(rs("maptop")) AND NOT IsNull(rs("mapleft")) Then
|
||||
Response.Write("Top: " & rs("maptop") & ", Left: " & rs("mapleft"))
|
||||
Response.Write(" <a href='./printermap.asp' target='_blank' style='color:#007bff;' title='View on Map'>")
|
||||
Response.Write("<i class='zmdi zmdi-map'></i></a>")
|
||||
ElseIf NOT IsNull(rs("machines.maptop")) Then
|
||||
Response.Write("Using machine location")
|
||||
Else
|
||||
Response.Write("<span style='color:#999;'>Not set</span>")
|
||||
End If
|
||||
%>
|
||||
</p>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### 6. Create Helper API: **api_machine_coordinates.asp**
|
||||
|
||||
**New File:**
|
||||
|
||||
```vbscript
|
||||
<%@ Language="VBScript" %>
|
||||
<%
|
||||
Response.ContentType = "application/json"
|
||||
Response.Charset = "UTF-8"
|
||||
|
||||
<!--#include file="./includes/sql.asp"-->
|
||||
|
||||
Dim machineid
|
||||
machineid = Request.QueryString("machineid")
|
||||
|
||||
If NOT IsNumeric(machineid) Then
|
||||
Response.Write("{""error"":""Invalid machine ID""}")
|
||||
objConn.Close
|
||||
Response.End
|
||||
End If
|
||||
|
||||
Dim strSQL, rs
|
||||
strSQL = "SELECT maptop, mapleft FROM machines WHERE machineid = " & CLng(machineid)
|
||||
Set rs = objConn.Execute(strSQL)
|
||||
|
||||
If NOT rs.EOF Then
|
||||
Response.Write("{")
|
||||
Response.Write("""maptop"":" & rs("maptop") & ",")
|
||||
Response.Write("""mapleft"":" & rs("mapleft"))
|
||||
Response.Write("}")
|
||||
Else
|
||||
Response.Write("{""error"":""Machine not found""}")
|
||||
End If
|
||||
|
||||
rs.Close
|
||||
Set rs = Nothing
|
||||
objConn.Close
|
||||
%>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Priority 3: Data Migration
|
||||
|
||||
#### 7. Create Migration Script for Existing Printers
|
||||
|
||||
**New File: sql/migrate_printer_coordinates.sql**
|
||||
|
||||
```sql
|
||||
-- ============================================================================
|
||||
-- Migrate Printer Coordinates from Machine Locations
|
||||
-- ============================================================================
|
||||
-- This copies machine coordinates to printers that don't have their own coordinates
|
||||
-- Run this ONCE after adding maptop/mapleft columns to printers
|
||||
|
||||
-- Update printers to inherit machine coordinates where not already set
|
||||
UPDATE printers p
|
||||
INNER JOIN machines m ON p.machineid = m.machineid
|
||||
SET
|
||||
p.maptop = m.maptop,
|
||||
p.mapleft = m.mapleft
|
||||
WHERE
|
||||
p.maptop IS NULL
|
||||
AND p.mapleft IS NULL
|
||||
AND m.maptop IS NOT NULL
|
||||
AND m.mapleft IS NOT NULL
|
||||
AND p.isactive = 1;
|
||||
|
||||
-- Report: Show printers with coordinates
|
||||
SELECT
|
||||
'Printers with own coordinates' AS status,
|
||||
COUNT(*) AS count
|
||||
FROM printers
|
||||
WHERE maptop IS NOT NULL AND mapleft IS NOT NULL AND isactive = 1
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT
|
||||
'Printers without coordinates' AS status,
|
||||
COUNT(*) AS count
|
||||
FROM printers
|
||||
WHERE (maptop IS NULL OR mapleft IS NULL) AND isactive = 1;
|
||||
|
||||
-- List printers still missing coordinates
|
||||
SELECT
|
||||
p.printerid,
|
||||
p.printerwindowsname,
|
||||
p.ipaddress,
|
||||
m.machinenumber,
|
||||
p.machineid
|
||||
FROM printers p
|
||||
LEFT JOIN machines m ON p.machineid = m.machineid
|
||||
WHERE (p.maptop IS NULL OR p.mapleft IS NULL)
|
||||
AND p.isactive = 1
|
||||
ORDER BY p.printerid;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
### Phase 1: Core Changes (Day 1)
|
||||
1. Add maptop/mapleft to printers table (COMPLETE)
|
||||
2. Update printermap.asp query
|
||||
3. Update saveprinter_direct.asp INSERT
|
||||
4. Update saveprinter.asp UPDATE
|
||||
5. Run data migration SQL script
|
||||
|
||||
### Phase 2: Form Updates (Day 2)
|
||||
1. Add coordinate fields to addprinter.asp
|
||||
2. Add coordinate fields to editprinter.asp
|
||||
3. Test printer creation with coordinates
|
||||
4. Test printer editing with coordinates
|
||||
|
||||
### Phase 3: Enhanced Features (Day 3)
|
||||
1. Add map picker button functionality
|
||||
2. Create api_machine_coordinates.asp
|
||||
3. Update displayprinter.asp to show coordinates
|
||||
4. Test full workflow
|
||||
|
||||
### Phase 4: Testing & Documentation (Day 4)
|
||||
1. Test with various printer scenarios
|
||||
2. Update user documentation
|
||||
3. Train users on new feature
|
||||
4. Monitor for issues
|
||||
|
||||
---
|
||||
|
||||
## Testing Checklist
|
||||
|
||||
### Backward Compatibility
|
||||
- Existing printers without coordinates still appear on map (using machine location)
|
||||
- Machine dropdown still functions
|
||||
- Printers assigned to machineid=1 can now have coordinates
|
||||
|
||||
### New Functionality
|
||||
- Can add printer with custom coordinates
|
||||
- Can edit printer coordinates
|
||||
- Can leave coordinates blank (uses machine location)
|
||||
- Multiple printers at same machine can have different positions
|
||||
- Printers without machine assignment can appear on map
|
||||
|
||||
### Edge Cases
|
||||
- Printer with machineid=1 and no coordinates (should not appear on map)
|
||||
- Printer with coordinates but machineid=1 (should appear on map)
|
||||
- Invalid coordinate values (should be rejected)
|
||||
- Null/empty coordinate values (should use machine location)
|
||||
|
||||
---
|
||||
|
||||
## Benefits of This Approach
|
||||
|
||||
1. **Backward Compatible**: Existing printers continue to work using machine locations
|
||||
2. **Flexible**: Printers can be positioned independently of machines
|
||||
3. **Gradual Migration**: Can update printer positions over time
|
||||
4. **No Data Loss**: Machine associations are preserved
|
||||
5. **Better Accuracy**: Printers can show actual physical location
|
||||
|
||||
---
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
### Interactive Map Picker
|
||||
Create a modal with embedded Leaflet map where users can:
|
||||
- Click to select printer location
|
||||
- See existing printers and machines
|
||||
- Drag printer icon to new position
|
||||
- Visual grid/snap-to-grid option
|
||||
|
||||
### Bulk Update Tool
|
||||
Create admin page to:
|
||||
- List all printers with/without coordinates
|
||||
- Bulk copy coordinates from machines
|
||||
- Bulk adjust coordinates (offset all by X/Y)
|
||||
- Import coordinates from CSV
|
||||
|
||||
### Map Filtering
|
||||
Add printermap.asp filters for:
|
||||
- Show only printers with custom coordinates
|
||||
- Show only printers using machine locations
|
||||
- Highlight printers without any location
|
||||
- Filter by printer model/vendor
|
||||
|
||||
---
|
||||
|
||||
## Questions for Stakeholders
|
||||
|
||||
1. Should we automatically copy machine coordinates to all existing printers? (Recommended: YES)
|
||||
2. Should machineid still be required? (Recommended: Make optional, but keep for reference)
|
||||
3. Do we need coordinate validation beyond 0-2550/0-3300 ranges?
|
||||
4. Should we add a "sync with machine" button to copy machine coords to printer?
|
||||
5. Priority level for interactive map picker vs manual coordinate entry?
|
||||
|
||||
---
|
||||
|
||||
## Files to Modify Summary
|
||||
|
||||
| File | Priority | Changes Required |
|
||||
|------|----------|------------------|
|
||||
| printermap.asp | P1 | Update SQL query to use printer coordinates |
|
||||
| saveprinter_direct.asp | P1 | Add maptop/mapleft to INSERT |
|
||||
| saveprinter.asp | P1 | Add maptop/mapleft to UPDATE |
|
||||
| addprinter.asp | P2 | Add coordinate input fields |
|
||||
| editprinter.asp | P2 | Add coordinate input fields |
|
||||
| displayprinter.asp | P2 | Show coordinates in settings |
|
||||
| api_machine_coordinates.asp | P3 | New file - coordinate lookup API |
|
||||
| sql/migrate_printer_coordinates.sql | P1 | New file - data migration |
|
||||
|
||||
---
|
||||
|
||||
**End of Report**
|
||||
213
docs/archive/PRINTER_PAGES_MODERNIZATION_2025-11-10.md
Normal file
213
docs/archive/PRINTER_PAGES_MODERNIZATION_2025-11-10.md
Normal file
@@ -0,0 +1,213 @@
|
||||
# Printer Pages Modernization Summary
|
||||
|
||||
**Date:** 2025-11-10
|
||||
**Status:** COMPLETED
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Modernized printer management pages to match the look and feel of machine/PC pages with Bootstrap theme, improved error handling, and consistent UI/UX.
|
||||
|
||||
---
|
||||
|
||||
## Pages Reviewed
|
||||
|
||||
### 1. **displayprinters.asp** - Printer List Page
|
||||
**Status:** Already Modern
|
||||
- Already using Bootstrap theme
|
||||
- Modern card layout
|
||||
- Responsive table
|
||||
- "Add Printer" button with icon
|
||||
- Location and attachment icons
|
||||
|
||||
### 2. **displayprinter.asp** - Individual Printer View
|
||||
**Status:** Already Modern
|
||||
- Bootstrap theme with modern includes
|
||||
- Tabbed interface:
|
||||
- Settings tab (view mode)
|
||||
- Edit tab (inline edit form)
|
||||
- Profile card with printer image
|
||||
- Nested entity creation (vendor, model)
|
||||
- Clean, modern layout
|
||||
|
||||
### 3. **editprinter.asp** - Backend Processor
|
||||
**Status:** Modernized (This Session)
|
||||
**Changes Made:**
|
||||
- Replaced old HTML/CSS with Bootstrap theme
|
||||
- Updated DOCTYPE to HTML5
|
||||
- Added modern includes (header.asp, sql.asp)
|
||||
- Improved error handling (redirects instead of inline HTML errors)
|
||||
- Added fallback page with Bootstrap styling
|
||||
- Kept all security features (parameterized queries, validation)
|
||||
|
||||
---
|
||||
|
||||
## Changes Made to editprinter.asp
|
||||
|
||||
### Before (Old Style):
|
||||
```asp
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="./style.css" type="text/css">
|
||||
```
|
||||
|
||||
### After (Modern):
|
||||
```asp
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!--#include file="./includes/header.asp"-->
|
||||
<!--#include file="./includes/sql.asp"-->
|
||||
</head>
|
||||
```
|
||||
|
||||
### Error Handling Improvements:
|
||||
|
||||
**Before:**
|
||||
```asp
|
||||
Response.Write("<div class='alert alert-danger'>Error: Invalid printer ID.</div>")
|
||||
Response.Write("<a href='displayprinters.asp'>Go back</a>")
|
||||
```
|
||||
|
||||
**After:**
|
||||
```asp
|
||||
Response.Redirect("displayprinters.asp?error=INVALID_PRINTER_ID")
|
||||
```
|
||||
|
||||
All errors now redirect with error codes:
|
||||
- `INVALID_PRINTER_ID`
|
||||
- `INVALID_MODEL_ID`
|
||||
- `INVALID_MACHINE_ID`
|
||||
- `FIELD_LENGTH_EXCEEDED`
|
||||
- `MODEL_REQUIRED`
|
||||
- `VENDOR_REQUIRED`
|
||||
- `MODEL_FIELD_LENGTH_EXCEEDED`
|
||||
- `VENDOR_NAME_REQUIRED`
|
||||
- `VENDOR_NAME_TOO_LONG`
|
||||
- `VENDOR_CREATE_FAILED`
|
||||
- `MODEL_CREATE_FAILED`
|
||||
- `UPDATE_FAILED`
|
||||
|
||||
### Success Handling:
|
||||
- Redirects to `displayprinter.asp?printerid=X&success=1`
|
||||
- Falls back to Bootstrap-styled redirect page if meta refresh fails
|
||||
|
||||
---
|
||||
|
||||
## Security Features Preserved
|
||||
|
||||
**All security features maintained:**
|
||||
1. Parameterized queries throughout
|
||||
2. Input validation (numeric checks, length checks)
|
||||
3. HTML encoding for all output
|
||||
4. SQL injection prevention
|
||||
5. XSS prevention
|
||||
6. Nested entity creation (vendor → model → printer)
|
||||
|
||||
---
|
||||
|
||||
## UI/UX Consistency
|
||||
|
||||
### Common Elements Across All Pages:
|
||||
- Bootstrap 4 theme
|
||||
- Modern includes (header.asp, sql.asp)
|
||||
- Responsive design
|
||||
- Consistent icons (zmdi font)
|
||||
- Tabbed interfaces where appropriate
|
||||
- Card-based layouts
|
||||
- Loading spinner (pageloader-overlay)
|
||||
- Left sidebar navigation
|
||||
- Top bar header
|
||||
|
||||
---
|
||||
|
||||
## Testing Results
|
||||
|
||||
### displayprinters.asp
|
||||
- HTTP 200 - Loads successfully
|
||||
- Bootstrap theme applied
|
||||
- Table renders correctly
|
||||
- Icons display properly
|
||||
|
||||
### displayprinter.asp
|
||||
- HTTP 200 - Loads successfully
|
||||
- Bootstrap theme applied
|
||||
- Tabs functional (Settings, Edit)
|
||||
- Edit form accessible
|
||||
|
||||
### editprinter.asp
|
||||
- Modernized with Bootstrap theme
|
||||
- Error handling via redirects
|
||||
- Parameterized queries functional
|
||||
- Nested entity creation working
|
||||
|
||||
---
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
/home/camp/projects/windows/shopdb/
|
||||
├── displayprinters.asp (List page - Already modern)
|
||||
├── displayprinter.asp (View page - Already modern)
|
||||
├── editprinter.asp (Backend processor - MODERNIZED)
|
||||
├── saveprinter.asp (Alternate save endpoint)
|
||||
├── addprinter.asp (Add new printer page)
|
||||
└── includes/
|
||||
├── header.asp (Bootstrap theme includes)
|
||||
├── sql.asp (Database connection)
|
||||
├── leftsidebar.asp (Navigation)
|
||||
└── topbarheader.asp (Top navigation)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Related Work (This Session)
|
||||
|
||||
In addition to printer page modernization, this session also included:
|
||||
|
||||
1. **Machine Relationship Fixes:**
|
||||
- Fixed bidirectional relationship display in `displaymachine.asp`
|
||||
- Added "Machines Controlled by This Machine" section
|
||||
- Fixed machine type display (using `machines.machinetypeid` instead of `models.machinetypeid`)
|
||||
- Fixed controlling PC IP address display (filter by comstypeid for IP-based communications)
|
||||
|
||||
2. **Files Modified:**
|
||||
- `displaymachine.asp` - Relationships and machine type fixes
|
||||
- `editprinter.asp` - Complete modernization
|
||||
|
||||
---
|
||||
|
||||
## Next Steps (Optional)
|
||||
|
||||
If further modernization is desired:
|
||||
|
||||
1. **Network Devices Unified Page:**
|
||||
- Create single `network_devices.asp` for servers, switches, cameras
|
||||
- Use existing `vw_network_devices` view
|
||||
- Implement tabs for filtering by device type
|
||||
|
||||
2. **Add Printer Page:**
|
||||
- Review `addprinter.asp` for modern styling
|
||||
- Ensure consistency with machine/PC add pages
|
||||
|
||||
3. **Printer API Pages:**
|
||||
- Review `api_printers.asp` for any needed updates
|
||||
- Check `printer_installer_map.asp` for modernization
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
**All printer pages now use modern Bootstrap theme**
|
||||
**Consistent UI/UX with machine/PC pages**
|
||||
**All security features preserved**
|
||||
**Error handling improved**
|
||||
**Testing completed successfully**
|
||||
|
||||
The printer management interface now matches the quality and consistency of the recently migrated machine/PC pages.
|
||||
|
||||
---
|
||||
|
||||
**Completed by:** Claude Code
|
||||
**Date:** 2025-11-10
|
||||
291
docs/archive/SCHEMA_COMPARISON_REPORT_2025-11-20.md
Normal file
291
docs/archive/SCHEMA_COMPARISON_REPORT_2025-11-20.md
Normal file
@@ -0,0 +1,291 @@
|
||||
# Database Schema Comparison Report
|
||||
|
||||
**Date:** 2025-11-20
|
||||
**Comparison:** database-backup-11-20-25-eod-with-drop.sql vs Current Dev Database
|
||||
**Dev Backup Created:** /home/camp/projects/windows/shopdb/sql/dev-backup-20251120-105614.sql
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
The backup file contains **Phase 1 schema** (pre-migration) with 63 tables, while the current dev database contains **Phase 2 schema** (post-migration) with 30 tables.
|
||||
|
||||
**Key Findings:**
|
||||
- **4 tables have schema changes** (businessunits, controllertypes, machine_overrides, machines)
|
||||
- **8 new Phase 2 tables** exist in dev but not in backup
|
||||
- **41 legacy tables** exist in backup but not in dev (deprecated/views)
|
||||
|
||||
---
|
||||
|
||||
## Tables Requiring DROP and Recreate
|
||||
|
||||
### 1. Tables with Schema Changes (4 tables)
|
||||
|
||||
These tables exist in both files but have different column structures. They should be **dropped and recreated** from the backup file if you want to revert to the backup schema.
|
||||
|
||||
#### `machines` (CRITICAL - Most Changes)
|
||||
|
||||
**Columns Removed in Dev (exist in backup):**
|
||||
- `ipaddress1` - Removed (now in communications table)
|
||||
- `ipaddress2` - Removed (now in communications table)
|
||||
|
||||
**Columns Added in Dev (not in backup):**
|
||||
- `hostname` - For PC hostnames
|
||||
- `serialnumber` - Equipment serial numbers
|
||||
- `loggedinuser` - Current logged-in user (PCs)
|
||||
- `pctypeid` - Identifies PCs (NULL = equipment, NOT NULL = PC)
|
||||
- `osid` - Foreign key to operatingsystems (PC OS)
|
||||
- `controllertypeid` - Foreign key to controllertypes
|
||||
- `controllerosid` - Controller OS (for CNCs)
|
||||
- `controllermodelid` - Controller model reference
|
||||
- `machinestatusid` - Replaces pcstatusid
|
||||
- `lastupdated` - Auto-updated timestamp
|
||||
- `requires_manual_machine_config` - Configuration flag
|
||||
|
||||
**Impact:** This is the core table for Phase 2 migration. Reverting will break all PC and network device functionality.
|
||||
|
||||
---
|
||||
|
||||
#### `businessunits`
|
||||
|
||||
**Columns Added in Dev (not in backup):**
|
||||
- `liaisonname` - Liaison contact name
|
||||
- `liaisonsso` - Liaison SSO
|
||||
- `facility_id` - Facility identifier
|
||||
- `dt_lead` - DT Lead name
|
||||
- `dt_lead_sso` - DT Lead SSO
|
||||
|
||||
**Impact:** Minor. These are additional metadata fields that don't affect core functionality.
|
||||
|
||||
---
|
||||
|
||||
#### `controllertypes`
|
||||
|
||||
**Columns Added in Dev (not in backup):**
|
||||
- `vendorid` - Foreign key to vendors
|
||||
- `controllermodel` - Controller model name
|
||||
- `controller_os` - Controller OS name
|
||||
- `controllernotes` - Additional notes
|
||||
|
||||
**Impact:** Minor. Enhanced metadata for CNC controllers.
|
||||
|
||||
---
|
||||
|
||||
#### `machine_overrides`
|
||||
|
||||
**Issue:** Same columns but definition differences (likely data types or constraints changed)
|
||||
|
||||
**Impact:** Unknown without detailed field-by-field comparison.
|
||||
|
||||
---
|
||||
|
||||
## New Tables in Dev (Phase 2 Migration)
|
||||
|
||||
These 8 tables exist in the current dev database but NOT in the backup file. They are **Phase 2 migration tables** and should be **preserved**.
|
||||
|
||||
### Phase 2 Tables (DO NOT DROP)
|
||||
|
||||
1. **`communications`** - Unified network interface storage (replaces pc_network_interfaces, printer IPs)
|
||||
2. **`comstypes`** - Communication types (IP, Serial, USB, etc.)
|
||||
3. **`compliance`** - Compliance tracking data
|
||||
4. **`compliancescans`** - Compliance scan history
|
||||
5. **`machinerelationships`** - Machine-to-machine relationships (dualpath, controls)
|
||||
6. **`relationshiptypes`** - Relationship type definitions
|
||||
7. **`machinestatus`** - Replaces pcstatus with broader scope
|
||||
8. **`warranties`** - Warranty tracking
|
||||
|
||||
**These tables are critical for Phase 2 functionality and should NOT be dropped.**
|
||||
|
||||
---
|
||||
|
||||
## Legacy Tables in Backup (Not in Dev)
|
||||
|
||||
These 41 tables exist in the backup file but NOT in the current dev database. Most are **deprecated** or **views**.
|
||||
|
||||
### Deprecated PC Tables (Replaced by machines + communications)
|
||||
|
||||
- `pc` - **DEPRECATED** → Replaced by machines WHERE pctypeid IS NOT NULL
|
||||
- `pc_network_interfaces` - **DEPRECATED** → Replaced by communications
|
||||
- `pc_comm_config` - **DEPRECATED** → Replaced by communications
|
||||
- `pc_dnc_config` - **DEPRECATED** → Integrated into machine relationships
|
||||
- `pc_dualpath_assignments` - **DEPRECATED** → Replaced by machinerelationships
|
||||
- `pctype` - **DEPRECATED** → Now stored in machines.pctypeid
|
||||
- `pcstatus` - **DEPRECATED** → Replaced by machinestatus
|
||||
|
||||
### Deprecated Network Device Tables (Replaced by machines)
|
||||
|
||||
- `accesspoints` - **DEPRECATED** → Replaced by machines WHERE machinetypeid = 16
|
||||
- `cameras` - **DEPRECATED** → Replaced by machines WHERE machinetypeid = 18
|
||||
- `switches` - **DEPRECATED** → Replaced by machines WHERE machinetypeid = 19
|
||||
- `servers` - **DEPRECATED** → Replaced by machines WHERE machinetypeid = 20
|
||||
- `idfs` - **DEPRECATED** → Replaced by machines WHERE machinetypeid = 17
|
||||
|
||||
### Legacy Relationship Table
|
||||
|
||||
- `machine_pc_relationships` - **DEPRECATED** → Replaced by machinerelationships
|
||||
|
||||
### Backup Table
|
||||
|
||||
- `pc_model_backup` - Backup table (can be dropped)
|
||||
|
||||
### Views (33 views)
|
||||
|
||||
All views with `vw_` prefix are query views, not base tables:
|
||||
|
||||
- `vw_active_pcs`
|
||||
- `vw_dnc_config`
|
||||
- `vw_dualpath_management`
|
||||
- `vw_engineer_pcs`
|
||||
- `vw_ge_machines`
|
||||
- `vw_idf_inventory`
|
||||
- `vw_infrastructure_summary`
|
||||
- `vw_machine_assignments`
|
||||
- `vw_machine_assignment_status`
|
||||
- `vw_machinetype_comparison`
|
||||
- `vw_machine_type_stats`
|
||||
- `vw_multi_pc_machines`
|
||||
- `vw_network_devices`
|
||||
- `vw_pc_network_summary`
|
||||
- `vw_pc_resolved_machines`
|
||||
- `vw_pcs_by_hardware`
|
||||
- `vw_pc_summary`
|
||||
- `vw_pctype_config`
|
||||
- `vw_recent_updates`
|
||||
- `vw_shopfloor_applications_summary`
|
||||
- `vw_shopfloor_comm_config`
|
||||
- `vw_shopfloor_pcs`
|
||||
- `vw_standard_pcs`
|
||||
- `vw_unmapped_machines`
|
||||
- `vw_vendor_summary`
|
||||
- `vw_warranties_expiring`
|
||||
- `vw_warranty_status`
|
||||
|
||||
**Note:** Views need to be recreated to match Phase 2 schema.
|
||||
|
||||
---
|
||||
|
||||
## Recommendation: What to Drop and Recreate
|
||||
|
||||
### CRITICAL WARNING
|
||||
|
||||
**DO NOT apply the backup file schema if you want to keep Phase 2 functionality!**
|
||||
|
||||
The backup file represents the **OLD Phase 1 schema** before the major PC migration work completed on Nov 17, 2025. Applying it would:
|
||||
|
||||
1. Lose all Phase 2 migration work (20+ days of development)
|
||||
2. Break all PC pages (displaypcs.asp, displaypc.asp, editpc.asp, etc.)
|
||||
3. Break network device display (network_map.asp, network_devices.asp)
|
||||
4. Lose unified communications table
|
||||
5. Lose machine relationships functionality
|
||||
6. Lose compliance tracking
|
||||
7. Lose warranty management
|
||||
|
||||
### If You Must Revert to Backup Schema
|
||||
|
||||
**Tables to DROP and recreate from backup:**
|
||||
|
||||
1. `machines` - DROP and recreate (loses Phase 2 columns)
|
||||
2. `businessunits` - DROP and recreate (loses liaison/facility fields)
|
||||
3. `controllertypes` - DROP and recreate (loses enhanced metadata)
|
||||
4. `machine_overrides` - DROP and recreate (definition changes)
|
||||
|
||||
**Tables to DROP from dev (Phase 2 tables):**
|
||||
|
||||
5. `communications` - DROP (then recreate from backup if needed)
|
||||
6. `comstypes` - DROP
|
||||
7. `compliance` - DROP
|
||||
8. `compliancescans` - DROP
|
||||
9. `machinerelationships` - DROP
|
||||
10. `relationshiptypes` - DROP
|
||||
11. `machinestatus` - DROP (will recreate `pcstatus` from backup)
|
||||
12. `warranties` - DROP
|
||||
|
||||
**Tables to ADD from backup (legacy tables):**
|
||||
|
||||
13. ➕ `pc` - CREATE from backup
|
||||
14. ➕ `pc_network_interfaces` - CREATE from backup
|
||||
15. ➕ `pc_comm_config` - CREATE from backup
|
||||
16. ➕ `pc_dnc_config` - CREATE from backup
|
||||
17. ➕ `pc_dualpath_assignments` - CREATE from backup
|
||||
18. ➕ `pctype` - CREATE from backup
|
||||
19. ➕ `pcstatus` - CREATE from backup
|
||||
20. ➕ `accesspoints` - CREATE from backup (if needed)
|
||||
21. ➕ `cameras` - CREATE from backup (if needed)
|
||||
22. ➕ `switches` - CREATE from backup (if needed)
|
||||
23. ➕ `servers` - CREATE from backup (if needed)
|
||||
24. ➕ `idfs` - CREATE from backup (if needed)
|
||||
25. ➕ `machine_pc_relationships` - CREATE from backup
|
||||
|
||||
**Views to recreate (33 views):** All `vw_*` views need to be dropped and recreated from backup.
|
||||
|
||||
---
|
||||
|
||||
## Recommended Action Plan
|
||||
|
||||
### Option 1: Keep Phase 2 Schema (RECOMMENDED)
|
||||
|
||||
**DO NOTHING.** Your current dev database is the latest Phase 2 schema with all improvements.
|
||||
|
||||
The backup file is outdated and should not be applied unless you need to revert Phase 2 changes.
|
||||
|
||||
### Option 2: Sync Backup File to Match Dev
|
||||
|
||||
If the backup file is supposed to be the "source of truth", then UPDATE the backup file to include Phase 2 schema:
|
||||
|
||||
1. Export current dev schema: `mysqldump shopdb > new-phase2-backup.sql`
|
||||
2. Replace old backup file with Phase 2 schema
|
||||
3. Use Phase 2 schema for future deployments
|
||||
|
||||
### Option 3: Revert to Backup Schema (NOT RECOMMENDED)
|
||||
|
||||
If you absolutely must revert to Phase 1 schema:
|
||||
|
||||
1. Backup current dev database (already done: dev-backup-20251120-105614.sql)
|
||||
2. Drop Phase 2 tables: communications, compliance, machinerelationships, etc.
|
||||
3. Restore machines, businessunits, controllertypes to backup versions
|
||||
4. Restore all legacy tables (pc, pc_network_interfaces, etc.)
|
||||
5. Recreate all views
|
||||
6. **Accept that all Phase 2 functionality will be lost**
|
||||
|
||||
---
|
||||
|
||||
## Table Count Summary
|
||||
|
||||
| Category | Backup File | Dev Database | Difference |
|
||||
|----------|-------------|--------------|------------|
|
||||
| **Total Tables** | 63 | 30 | -33 |
|
||||
| **Base Tables** | 36 | 30 | -6 |
|
||||
| **Views** | 27 | 0 | -27 |
|
||||
| **Schema Changes** | - | 4 | - |
|
||||
| **New in Dev** | - | 8 | +8 |
|
||||
| **Missing in Dev** | 41 | - | - |
|
||||
|
||||
---
|
||||
|
||||
## Files Generated
|
||||
|
||||
1. **Current Dev Backup:** `/home/camp/projects/windows/shopdb/sql/dev-backup-20251120-105614.sql` (464 KB)
|
||||
2. **This Report:** `/home/camp/projects/windows/shopdb/SCHEMA_COMPARISON_REPORT_2025-11-20.md`
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
**The backup file (database-backup-11-20-25-eod-with-drop.sql) is from BEFORE Phase 2 migration.**
|
||||
|
||||
Your current dev database has the **Phase 2 schema** with significant improvements:
|
||||
- Unified machines table for all infrastructure
|
||||
- Consolidated communications table
|
||||
- Machine relationships tracking
|
||||
- Compliance management
|
||||
- Warranty tracking
|
||||
|
||||
**Recommendation:** Do NOT apply the backup file schema. Keep your current Phase 2 dev schema.
|
||||
|
||||
If production needs updating, use your current dev schema as the source, not the backup file.
|
||||
|
||||
---
|
||||
|
||||
**Generated:** 2025-11-20 10:56
|
||||
**Analyst:** Claude Code
|
||||
**Status:** Analysis Complete
|
||||
450
docs/archive/UNIFIED_INFRASTRUCTURE_DESIGN.md
Normal file
450
docs/archive/UNIFIED_INFRASTRUCTURE_DESIGN.md
Normal file
@@ -0,0 +1,450 @@
|
||||
# Unified Infrastructure Pages - Design Document
|
||||
|
||||
**Approach:** Single set of pages that dynamically handles servers, switches, and cameras
|
||||
**Files Required:** 4 files (vs 12 separate files)
|
||||
|
||||
---
|
||||
|
||||
## Architecture
|
||||
|
||||
### URL Structure
|
||||
```
|
||||
displayinfrastructure.asp?type=server → List all servers
|
||||
displayinfrastructure.asp?type=switch → List all switches
|
||||
displayinfrastructure.asp?type=camera → List all cameras
|
||||
|
||||
displayinfrastructure_detail.asp?type=server&id=5 → Server #5 detail/edit
|
||||
displayinfrastructure_detail.asp?type=switch&id=12 → Switch #12 detail/edit
|
||||
displayinfrastructure_detail.asp?type=camera&id=3 → Camera #3 detail/edit
|
||||
|
||||
addinfrastructure.asp?type=server → Add new server form
|
||||
addinfrastructure.asp?type=switch → Add new switch form
|
||||
addinfrastructure.asp?type=camera → Add new camera form
|
||||
|
||||
saveinfrastructure_direct.asp → Universal save endpoint
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File 1: displayinfrastructure.asp (List View)
|
||||
|
||||
### Logic Flow
|
||||
```vbscript
|
||||
<%
|
||||
' Get device type from URL
|
||||
Dim deviceType
|
||||
deviceType = Request.QueryString("type")
|
||||
|
||||
' Validate type
|
||||
If deviceType <> "server" AND deviceType <> "switch" AND deviceType <> "camera" Then
|
||||
deviceType = "server" ' Default
|
||||
End If
|
||||
|
||||
' Set display variables based on type
|
||||
Dim tableName, idField, pageTitle, iconClass, addUrl
|
||||
Select Case deviceType
|
||||
Case "server"
|
||||
tableName = "servers"
|
||||
idField = "serverid"
|
||||
pageTitle = "Servers"
|
||||
iconClass = "zmdi-storage"
|
||||
addUrl = "addinfrastructure.asp?type=server"
|
||||
Case "switch"
|
||||
tableName = "switches"
|
||||
idField = "switchid"
|
||||
pageTitle = "Switches"
|
||||
iconClass = "zmdi-device-hub"
|
||||
addUrl = "addinfrastructure.asp?type=switch"
|
||||
Case "camera"
|
||||
tableName = "cameras"
|
||||
idField = "cameraid"
|
||||
pageTitle = "Cameras"
|
||||
iconClass = "zmdi-videocam"
|
||||
addUrl = "addinfrastructure.asp?type=camera"
|
||||
End Select
|
||||
|
||||
' Build query
|
||||
Dim strSQL
|
||||
strSQL = "SELECT d.*, m.modelnumber, v.vendor " & _
|
||||
"FROM " & tableName & " d " & _
|
||||
"LEFT JOIN models m ON d.modelid = m.modelnumberid " & _
|
||||
"LEFT JOIN vendors v ON m.vendorid = v.vendorid " & _
|
||||
"WHERE d.isactive = 1 " & _
|
||||
"ORDER BY d." & idField & " DESC"
|
||||
|
||||
Set rs = objConn.Execute(strSQL)
|
||||
%>
|
||||
|
||||
<h5 class="card-title">
|
||||
<i class="zmdi <%=iconClass%>"></i> <%=pageTitle%>
|
||||
</h5>
|
||||
<a href="<%=addUrl%>" class="btn btn-primary">
|
||||
<i class="zmdi zmdi-plus-circle"></i> Add <%=pageTitle%>
|
||||
</a>
|
||||
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Vendor</th>
|
||||
<th>Model</th>
|
||||
<th>Serial</th>
|
||||
<th>IP Address</th>
|
||||
<th>Description</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% Do While Not rs.EOF %>
|
||||
<tr>
|
||||
<td><%=rs(idField)%></td>
|
||||
<td><%=Server.HTMLEncode(rs("vendor") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("modelnumber") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("serialnumber") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("ipaddress") & "")%></td>
|
||||
<td><%=Server.HTMLEncode(rs("description") & "")%></td>
|
||||
<td>
|
||||
<a href="displayinfrastructure_detail.asp?type=<%=deviceType%>&id=<%=rs(idField)%>">
|
||||
View
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<%
|
||||
rs.MoveNext
|
||||
Loop
|
||||
%>
|
||||
</tbody>
|
||||
</table>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File 2: displayinfrastructure_detail.asp (Detail/Edit View)
|
||||
|
||||
### Logic Flow
|
||||
```vbscript
|
||||
<%
|
||||
' Get device type and ID
|
||||
Dim deviceType, deviceId
|
||||
deviceType = Request.QueryString("type")
|
||||
deviceId = Request.QueryString("id")
|
||||
|
||||
' Validate
|
||||
If deviceType <> "server" AND deviceType <> "switch" AND deviceType <> "camera" Then
|
||||
Response.Redirect("displayinfrastructure.asp?type=server")
|
||||
End If
|
||||
|
||||
' Set variables based on type
|
||||
Dim tableName, idField, pageTitle, listUrl
|
||||
Select Case deviceType
|
||||
Case "server"
|
||||
tableName = "servers"
|
||||
idField = "serverid"
|
||||
pageTitle = "Server"
|
||||
listUrl = "displayinfrastructure.asp?type=server"
|
||||
Case "switch"
|
||||
tableName = "switches"
|
||||
idField = "switchid"
|
||||
pageTitle = "Switch"
|
||||
listUrl = "displayinfrastructure.asp?type=switch"
|
||||
Case "camera"
|
||||
tableName = "cameras"
|
||||
idField = "cameraid"
|
||||
pageTitle = "Camera"
|
||||
listUrl = "displayinfrastructure.asp?type=camera"
|
||||
End Select
|
||||
|
||||
' Fetch device
|
||||
strSQL = "SELECT d.*, m.modelnumber, v.vendor, v.vendorid " & _
|
||||
"FROM " & tableName & " d " & _
|
||||
"LEFT JOIN models m ON d.modelid = m.modelnumberid " & _
|
||||
"LEFT JOIN vendors v ON m.vendorid = v.vendorid " & _
|
||||
"WHERE d." & idField & " = " & deviceId
|
||||
|
||||
Set rs = objConn.Execute(strSQL)
|
||||
|
||||
If rs.EOF Then
|
||||
Response.Write("Device not found")
|
||||
Response.End
|
||||
End If
|
||||
%>
|
||||
|
||||
<!-- Display Mode -->
|
||||
<div id="displayMode">
|
||||
<h3><%=pageTitle%> #<%=rs(idField)%></h3>
|
||||
<p><strong>Vendor:</strong> <%=Server.HTMLEncode(rs("vendor") & "")%></p>
|
||||
<p><strong>Model:</strong> <%=Server.HTMLEncode(rs("modelnumber") & "")%></p>
|
||||
<p><strong>Serial:</strong> <%=Server.HTMLEncode(rs("serialnumber") & "")%></p>
|
||||
<p><strong>IP:</strong> <%=Server.HTMLEncode(rs("ipaddress") & "")%></p>
|
||||
<p><strong>Description:</strong> <%=Server.HTMLEncode(rs("description") & "")%></p>
|
||||
|
||||
<button onclick="showEditMode()">Edit</button>
|
||||
<a href="<%=listUrl%>">Back to List</a>
|
||||
</div>
|
||||
|
||||
<!-- Edit Mode -->
|
||||
<div id="editMode" style="display:none;">
|
||||
<h3>Edit <%=pageTitle%></h3>
|
||||
<form method="post" action="saveinfrastructure_direct.asp">
|
||||
<input type="hidden" name="type" value="<%=deviceType%>">
|
||||
<input type="hidden" name="id" value="<%=rs(idField)%>">
|
||||
|
||||
<!-- Model dropdown -->
|
||||
<select name="modelid">
|
||||
<!-- Populate models... -->
|
||||
</select>
|
||||
|
||||
<input type="text" name="serialnumber" value="<%=Server.HTMLEncode(rs("serialnumber") & "")%>">
|
||||
<input type="text" name="ipaddress" value="<%=Server.HTMLEncode(rs("ipaddress") & "")%>">
|
||||
<textarea name="description"><%=Server.HTMLEncode(rs("description") & "")%></textarea>
|
||||
|
||||
<button type="submit">Save</button>
|
||||
<button type="button" onclick="showDisplayMode()">Cancel</button>
|
||||
</form>
|
||||
</div>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File 3: addinfrastructure.asp (Add Form)
|
||||
|
||||
### Logic Flow
|
||||
```vbscript
|
||||
<%
|
||||
' Get device type
|
||||
Dim deviceType
|
||||
deviceType = Request.QueryString("type")
|
||||
|
||||
' Validate
|
||||
If deviceType <> "server" AND deviceType <> "switch" AND deviceType <> "camera" Then
|
||||
deviceType = "server"
|
||||
End If
|
||||
|
||||
' Set variables
|
||||
Dim pageTitle, listUrl
|
||||
Select Case deviceType
|
||||
Case "server"
|
||||
pageTitle = "Server"
|
||||
listUrl = "displayinfrastructure.asp?type=server"
|
||||
Case "switch"
|
||||
pageTitle = "Switch"
|
||||
listUrl = "displayinfrastructure.asp?type=switch"
|
||||
Case "camera"
|
||||
pageTitle = "Camera"
|
||||
listUrl = "displayinfrastructure.asp?type=camera"
|
||||
End Select
|
||||
%>
|
||||
|
||||
<h2>Add <%=pageTitle%></h2>
|
||||
|
||||
<form method="post" action="saveinfrastructure_direct.asp">
|
||||
<input type="hidden" name="type" value="<%=deviceType%>">
|
||||
|
||||
<div class="form-group">
|
||||
<label>Model</label>
|
||||
<select name="modelid" required class="form-control">
|
||||
<option value="">-- Select Model --</option>
|
||||
<%
|
||||
strSQL = "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"
|
||||
Set rsModels = objConn.Execute(strSQL)
|
||||
Do While Not rsModels.EOF
|
||||
%>
|
||||
<option value="<%=rsModels("modelnumberid")%>">
|
||||
<%=Server.HTMLEncode(rsModels("vendor") & " - " & rsModels("modelnumber"))%>
|
||||
</option>
|
||||
<%
|
||||
rsModels.MoveNext
|
||||
Loop
|
||||
%>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Serial Number</label>
|
||||
<input type="text" name="serialnumber" class="form-control" maxlength="100">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>IP Address</label>
|
||||
<input type="text" name="ipaddress" class="form-control" maxlength="15">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Description</label>
|
||||
<textarea name="description" class="form-control" rows="3"></textarea>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-success">Save <%=pageTitle%></button>
|
||||
<a href="<%=listUrl%>" class="btn btn-secondary">Cancel</a>
|
||||
</form>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File 4: saveinfrastructure_direct.asp (Universal Save)
|
||||
|
||||
### Logic Flow
|
||||
```vbscript
|
||||
<!--#include file="./includes/sql.asp"-->
|
||||
<!--#include file="./includes/error_handler.asp"-->
|
||||
<!--#include file="./includes/validation.asp"-->
|
||||
<!--#include file="./includes/db_helpers.asp"-->
|
||||
|
||||
<%
|
||||
' Get device type
|
||||
Dim deviceType
|
||||
deviceType = Request.Form("type")
|
||||
|
||||
' Validate type
|
||||
If deviceType <> "server" AND deviceType <> "switch" AND deviceType <> "camera" Then
|
||||
Response.Write("Error: Invalid device type")
|
||||
Response.End
|
||||
End If
|
||||
|
||||
' Set table name and ID field based on type
|
||||
Dim tableName, idField, listUrl
|
||||
Select Case deviceType
|
||||
Case "server"
|
||||
tableName = "servers"
|
||||
idField = "serverid"
|
||||
listUrl = "displayinfrastructure.asp?type=server"
|
||||
Case "switch"
|
||||
tableName = "switches"
|
||||
idField = "switchid"
|
||||
listUrl = "displayinfrastructure.asp?type=switch"
|
||||
Case "camera"
|
||||
tableName = "cameras"
|
||||
idField = "cameraid"
|
||||
listUrl = "displayinfrastructure.asp?type=camera"
|
||||
End Select
|
||||
|
||||
' Get form data
|
||||
Dim deviceId, modelid, serialnumber, ipaddress, description
|
||||
deviceId = GetSafeInteger("FORM", "id", 0, 0, 999999)
|
||||
modelid = GetSafeInteger("FORM", "modelid", 0, 0, 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, "")
|
||||
|
||||
' Determine INSERT or UPDATE
|
||||
Dim strSQL
|
||||
|
||||
If deviceId = 0 Then
|
||||
' INSERT - New device
|
||||
strSQL = "INSERT INTO " & tableName & " (modelid, serialnumber, ipaddress, description, isactive) " & _
|
||||
"VALUES (?, ?, ?, ?, 1)"
|
||||
Set rs = ExecuteParameterizedQuery(objConn, strSQL, Array(modelid, serialnumber, ipaddress, description))
|
||||
Else
|
||||
' UPDATE - Existing device
|
||||
strSQL = "UPDATE " & tableName & " " & _
|
||||
"SET modelid = ?, serialnumber = ?, ipaddress = ?, description = ? " & _
|
||||
"WHERE " & idField & " = ?"
|
||||
Set rs = ExecuteParameterizedQuery(objConn, strSQL, Array(modelid, serialnumber, ipaddress, description, deviceId))
|
||||
End If
|
||||
|
||||
Call CleanupResources()
|
||||
|
||||
' Redirect back to list
|
||||
Response.Redirect(listUrl)
|
||||
%>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Navigation Menu
|
||||
|
||||
### leftsidebar.asp Update
|
||||
```html
|
||||
<!-- Infrastructure Section -->
|
||||
<li class="nav-header">INFRASTRUCTURE</li>
|
||||
<li>
|
||||
<a href="displayinfrastructure.asp?type=server">
|
||||
<i class="zmdi zmdi-storage"></i> Servers
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="displayinfrastructure.asp?type=switch">
|
||||
<i class="zmdi zmdi-device-hub"></i> Switches
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="displayinfrastructure.asp?type=camera">
|
||||
<i class="zmdi zmdi-videocam"></i> Cameras
|
||||
</a>
|
||||
</li>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Pros vs Cons
|
||||
|
||||
### Unified Approach (Option 2) - RECOMMENDED
|
||||
|
||||
**Pros:**
|
||||
- Only 4 files to create (vs 12)
|
||||
- DRY - no code duplication
|
||||
- Easy to maintain - fix once, works for all
|
||||
- Easy to extend - add "UPS" or "Firewall" by just adding cases
|
||||
- Consistent UI across all infrastructure
|
||||
- Matches database design (vw_network_devices already unifies them)
|
||||
|
||||
**Cons:**
|
||||
- Slightly more complex logic (Select Case statements)
|
||||
- URLs less intuitive (type parameter required)
|
||||
- Harder to customize one type differently later
|
||||
|
||||
### Separate Pages Approach (Option 1)
|
||||
|
||||
**Pros:**
|
||||
- URLs cleaner (displayservers.asp vs displayinfrastructure.asp?type=server)
|
||||
- Simpler per-file logic (no branching)
|
||||
- Easy to customize one type differently
|
||||
- More explicit/clear what page does
|
||||
|
||||
**Cons:**
|
||||
- 12 files instead of 4 (3x code duplication)
|
||||
- Bug fixes need to be applied 3 times
|
||||
- UI inconsistencies more likely
|
||||
- Adding new type = 4 more files
|
||||
|
||||
---
|
||||
|
||||
## Hybrid Approach (Best of Both?)
|
||||
|
||||
**Could also do:**
|
||||
- Use unified pages for LIST/ADD/SAVE (shared logic)
|
||||
- Use separate pages for DETAIL if they differ significantly
|
||||
|
||||
Example:
|
||||
```
|
||||
displayinfrastructure.asp?type=server (unified list)
|
||||
addinfrastructure.asp?type=server (unified add form)
|
||||
saveinfrastructure_direct.asp (unified save)
|
||||
|
||||
displayserver.asp?id=5 (separate detail - if servers need special fields)
|
||||
displayswitch.asp?id=12 (separate detail - if switches different)
|
||||
displaycamera.asp?id=3 (separate detail - if cameras different)
|
||||
```
|
||||
|
||||
But for infrastructure devices with identical schemas, I'd stick with **fully unified**.
|
||||
|
||||
---
|
||||
|
||||
## My Recommendation
|
||||
|
||||
**Go with Option 2 (Unified Pages) because:**
|
||||
|
||||
1. Servers, switches, and cameras have **identical schemas** (modelid, serialnumber, ipaddress, description, maptop, mapleft, isactive)
|
||||
2. They have **identical CRUD operations** (add, edit, view, delete)
|
||||
3. The database already unifies them (`vw_network_devices`)
|
||||
4. Much faster to implement (4 files vs 12)
|
||||
5. Easier to maintain long-term
|
||||
|
||||
---
|
||||
|
||||
**Ready to implement?** I can create the 4 unified infrastructure files now.
|
||||
|
||||
515
docs/archive/VENDOR_INFRASTRUCTURE_CODE_AUDIT.md
Normal file
515
docs/archive/VENDOR_INFRASTRUCTURE_CODE_AUDIT.md
Normal file
@@ -0,0 +1,515 @@
|
||||
# Vendor Type & Infrastructure Support - Complete Code Audit
|
||||
|
||||
**Date:** 2025-10-23
|
||||
**Status:** Audit Complete
|
||||
**Purpose:** Identify all code changes required for vendor type refactoring and infrastructure vendor/model support
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
This audit identifies **all files requiring changes** for two related database migrations:
|
||||
1. **Infrastructure Support**: Add vendor/model tracking for servers, switches, cameras
|
||||
2. **Vendor Type Refactoring**: Normalize 6 boolean flags into proper one-to-many relationship
|
||||
|
||||
### Files Requiring Changes
|
||||
|
||||
| Category | File Count | Priority |
|
||||
|----------|------------|----------|
|
||||
| **Core Data Cache** | 1 file | CRITICAL (affects all dropdowns) |
|
||||
| **Vendor Queries** | 30 files | HIGH |
|
||||
| **Infrastructure Pages** | 0 files | NEW DEVELOPMENT REQUIRED |
|
||||
| **Network/Map Pages** | 3 files | MEDIUM (may need infrastructure support) |
|
||||
|
||||
**Total Files to Modify:** 31 existing files
|
||||
**New Files to Create:** ~9-12 files (infrastructure CRUD pages)
|
||||
|
||||
---
|
||||
|
||||
## Part 1: Vendor Type Boolean Flag Usage (30 Files)
|
||||
|
||||
### Critical Priority: Data Cache (Affects All Dropdowns)
|
||||
|
||||
#### includes/data_cache.asp
|
||||
**Impact:** This file provides cached vendor dropdowns used throughout the application.
|
||||
|
||||
**Current Implementation:**
|
||||
- **Line 30:** `sql = "SELECT vendorid, vendor FROM vendors WHERE isprinter=1 AND isactive=1 ORDER BY vendor ASC"`
|
||||
- **Line 91:** `sql = "... WHERE models.vendorid = vendors.vendorid AND vendors.isprinter=1 AND models.isactive=1 ..."`
|
||||
|
||||
**Functions to Update:**
|
||||
1. `GetPrinterVendors()` - Line 30
|
||||
2. `GetPrinterModels()` - Line 91
|
||||
3. **TODO:** Add new functions for infrastructure devices:
|
||||
- `GetServerVendors()`
|
||||
- `GetSwitchVendors()`
|
||||
- `GetCameraVendors()`
|
||||
- `GetServerModels()`
|
||||
- `GetSwitchModels()`
|
||||
- `GetCameraModels()`
|
||||
|
||||
**Change Strategy:**
|
||||
```vbscript
|
||||
' OLD:
|
||||
sql = "SELECT vendorid, vendor FROM vendors WHERE isprinter=1 AND isactive=1 ORDER BY vendor ASC"
|
||||
|
||||
' NEW (Option 1 - Using vendortypeid directly):
|
||||
sql = "SELECT vendorid, vendor FROM vendors WHERE vendortypeid=2 AND isactive=1 ORDER BY vendor ASC"
|
||||
|
||||
' NEW (Option 2 - Using view for backward compatibility):
|
||||
sql = "SELECT vendorid, vendor FROM vw_vendors_with_types WHERE isprinter=1 AND isactive=1 ORDER BY vendor ASC"
|
||||
|
||||
' NEW (Option 3 - Using JOIN with vendortypes):
|
||||
sql = "SELECT v.vendorid, v.vendor FROM vendors v " & _
|
||||
"INNER JOIN vendortypes vt ON v.vendortypeid = vt.vendortypeid " & _
|
||||
"WHERE vt.vendortype='Printer' AND v.isactive=1 ORDER BY v.vendor ASC"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### High Priority: Direct Vendor Queries
|
||||
|
||||
#### Printer Management (7 files)
|
||||
|
||||
**1. addprinter.asp**
|
||||
- **Line 90:** Vendor dropdown query - `WHERE isprinter = 1`
|
||||
- **Change:** Use vendortypeid=2 or vw_vendors_with_types
|
||||
- **Impact:** Add printer form vendor selection
|
||||
|
||||
**2. displayprinter.asp**
|
||||
- **Line 291:** Edit form vendor dropdown - `WHERE isprinter = 1`
|
||||
- **Uses:** RenderVendorOptions (from data_cache.asp)
|
||||
- **Change:** Update query + ensure RenderVendorOptions updated first
|
||||
- **Impact:** Edit printer inline form
|
||||
|
||||
**3. editprinter.asp**
|
||||
- **Contains:** vendor flag usage (grep found it)
|
||||
- **Action Required:** Full file review needed
|
||||
- **Impact:** Standalone printer edit page
|
||||
|
||||
**4. saveprinter_direct.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review for vendor validation/creation logic
|
||||
- **Impact:** Printer save endpoint
|
||||
|
||||
**5-7. Additional Printer Files**
|
||||
- Review required for complete audit
|
||||
|
||||
#### Machine Management (4 files)
|
||||
|
||||
**1. addmachine.asp**
|
||||
- **Line 98:** `strSQL = "SELECT * FROM vendors WHERE ismachine = 1 AND isactive = 1 ORDER BY vendor ASC"`
|
||||
- **Change:** Use vendortypeid=4 (Machine)
|
||||
- **Impact:** Add machine form vendor dropdown
|
||||
|
||||
**2. displaymachine.asp**
|
||||
- **Line 236:** `strSQL2 = "SELECT vendorid, vendor FROM vendors WHERE ismachine = 1 AND isactive = 1 ORDER BY vendor ASC"`
|
||||
- **Change:** Use vendortypeid=4
|
||||
- **Impact:** Edit machine inline form vendor dropdown
|
||||
|
||||
**3. editmacine.asp** (note: typo in filename)
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Full file review
|
||||
- **Impact:** Standalone machine edit page
|
||||
|
||||
**4. savemachine_direct.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review for vendor validation logic
|
||||
- **Impact:** Machine save endpoint
|
||||
|
||||
#### PC/Device Management (4 files)
|
||||
|
||||
**1. displaypc.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review - may display vendor info
|
||||
- **Impact:** PC detail page
|
||||
|
||||
**2. editdevice.asp**
|
||||
- **Line 199:** `sqlVendor = "SELECT vendorid, vendor FROM vendors WHERE ispc = 1 ORDER BY vendor"`
|
||||
- **Change:** Use vendortypeid=3 (PC)
|
||||
- **Impact:** Device edit form vendor dropdown
|
||||
|
||||
**3. updatedevice_direct.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review for vendor update logic
|
||||
- **Impact:** Device update endpoint
|
||||
|
||||
**4. updatepc_direct.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review for vendor update logic
|
||||
- **Impact:** PC update endpoint
|
||||
|
||||
#### Model/Vendor Management (6 files)
|
||||
|
||||
**1. addmodel.asp**
|
||||
- **Line 57:** `strSQL = "SELECT * FROM vendors WHERE isactive = 1 ORDER BY vendor ASC"`
|
||||
- **Note:** No type filter! Shows ALL vendors
|
||||
- **Change:** May need type filter dropdown or keep as-is
|
||||
- **Impact:** Add model form - vendor selection
|
||||
|
||||
**2. savemodel.asp**
|
||||
- **Line 71:** Vendor duplicate check query
|
||||
- **Action Required:** Review vendor creation logic
|
||||
- **Impact:** Model save with inline vendor creation
|
||||
|
||||
**3. savemodel_direct.asp**
|
||||
- **Line 85:** Vendor duplicate check
|
||||
- **Action Required:** Review vendor creation logic
|
||||
- **Impact:** Direct model save endpoint
|
||||
|
||||
**4. addvendor.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** CRITICAL - Form likely has checkboxes for all 6 types
|
||||
- **Change:** Replace checkboxes with single dropdown (vendortypeid)
|
||||
- **Impact:** Add vendor form UI changes required
|
||||
|
||||
**5. savevendor.asp**
|
||||
- **Line 44:** Vendor duplicate check
|
||||
- **Action Required:** Review - likely saves vendor type flags
|
||||
- **Change:** Update to save vendortypeid instead
|
||||
- **Impact:** Vendor save logic changes
|
||||
|
||||
**6. savevendor_direct.asp**
|
||||
- **Line 40:** Vendor duplicate check
|
||||
- **Action Required:** Review vendor save logic with type flags
|
||||
- **Change:** Update to save vendortypeid
|
||||
- **Impact:** Direct vendor save endpoint
|
||||
|
||||
#### Application Management (9 files)
|
||||
|
||||
**1. addapplication.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review - may be for related vendors
|
||||
- **Impact:** TBD
|
||||
|
||||
**2. displayapplication.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review
|
||||
- **Impact:** TBD
|
||||
|
||||
**3. editapplication.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review
|
||||
- **Impact:** TBD
|
||||
|
||||
**4. editapplication_v2.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review
|
||||
- **Impact:** TBD
|
||||
|
||||
**5. editapplication_direct.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review
|
||||
- **Impact:** TBD
|
||||
|
||||
**6. editapp_standalone.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review
|
||||
- **Impact:** TBD
|
||||
|
||||
**7. saveapplication.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review
|
||||
- **Impact:** TBD
|
||||
|
||||
**8. saveapplication_direct.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review
|
||||
- **Impact:** TBD
|
||||
|
||||
**9. quickadd_application.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review
|
||||
- **Impact:** TBD
|
||||
|
||||
#### Knowledge Base (2 files)
|
||||
|
||||
**1. addlink_direct.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review - likely minimal
|
||||
- **Impact:** TBD
|
||||
|
||||
**2. updatelink_direct.asp**
|
||||
- **Contains:** vendor flag usage
|
||||
- **Action Required:** Review - likely minimal
|
||||
- **Impact:** TBD
|
||||
|
||||
---
|
||||
|
||||
## Part 2: Infrastructure Device Management (NEW DEVELOPMENT REQUIRED)
|
||||
|
||||
### Current State: NO DEDICATED PAGES EXIST
|
||||
|
||||
The database has tables for:
|
||||
- `servers` (with serverid, serialnumber, ipaddress, description, maptop, mapleft, isactive)
|
||||
- `switches` (with switchid, serialnumber, ipaddress, description, maptop, mapleft, isactive)
|
||||
- `cameras` (with cameraid, serialnumber, ipaddress, description, maptop, mapleft, isactive)
|
||||
|
||||
**But there are NO ASP pages to manage them!**
|
||||
|
||||
### Required New Pages
|
||||
|
||||
#### Server Management (4 files needed)
|
||||
1. **displayservers.asp** - List all servers
|
||||
2. **displayserver.asp** - Server detail page with inline edit
|
||||
3. **addserver.asp** - Add new server form (with model/vendor support)
|
||||
4. **saveserver_direct.asp** - Server save endpoint
|
||||
|
||||
#### Switch Management (4 files needed)
|
||||
1. **displayswitches.asp** - List all switches
|
||||
2. **displayswitch.asp** - Switch detail page with inline edit
|
||||
3. **addswitch.asp** - Add new switch form (with model/vendor support)
|
||||
4. **saveswitch_direct.asp** - Switch save endpoint
|
||||
|
||||
#### Camera Management (4 files needed)
|
||||
1. **displaycameras.asp** - List all cameras
|
||||
2. **displaycamera.asp** - Camera detail page with inline edit
|
||||
3. **addcamera.asp** - Add new camera form (with model/vendor support)
|
||||
4. **savecamera_direct.asp** - Camera save endpoint
|
||||
|
||||
### Existing Pages That May Display Infrastructure Data
|
||||
|
||||
**network_map.asp** - Network topology map
|
||||
- **Action Required:** Review to see if servers/switches/cameras are displayed
|
||||
- **Change:** May need to add vendor/model info if displayed
|
||||
|
||||
**printer_installer_map.asp** - Printer map
|
||||
- **Action Required:** Review
|
||||
- **Change:** Unlikely to need changes
|
||||
|
||||
**printermap.asp** - Another printer map
|
||||
- **Action Required:** Review
|
||||
- **Change:** Unlikely to need changes
|
||||
|
||||
---
|
||||
|
||||
## Part 3: Vendor Type Reference IDs
|
||||
|
||||
After migration, use these IDs:
|
||||
|
||||
| vendortypeid | vendortype | Description |
|
||||
|--------------|------------|-------------|
|
||||
| 1 | TBD | Default/unassigned |
|
||||
| 2 | Printer | Printer manufacturers |
|
||||
| 3 | PC | Computer manufacturers |
|
||||
| 4 | Machine | CNC machine manufacturers |
|
||||
| 5 | Server | Server manufacturers |
|
||||
| 6 | Switch | Network switch manufacturers |
|
||||
| 7 | Camera | Security camera manufacturers |
|
||||
|
||||
---
|
||||
|
||||
## Part 4: Implementation Strategy
|
||||
|
||||
### Phase 1: Database Migration
|
||||
1. Migration scripts already created
|
||||
2. Run `add_infrastructure_vendor_model_support.sql`
|
||||
3. Run `refactor_vendor_types.sql`
|
||||
4. Verify both migrations successful
|
||||
|
||||
### Phase 2: Core Infrastructure (Most Critical)
|
||||
1. **Update includes/data_cache.asp first** (affects everything)
|
||||
- Update existing vendor query functions
|
||||
- Add new infrastructure vendor/model functions
|
||||
2. Test that dropdowns still work
|
||||
|
||||
### Phase 3: Vendor Management Pages (Critical)
|
||||
1. Update **addvendor.asp** - Change UI from checkboxes to dropdown
|
||||
2. Update **savevendor.asp** and **savevendor_direct.asp** - Save vendortypeid instead of flags
|
||||
3. Test vendor creation/editing
|
||||
|
||||
### Phase 4: Update Existing Device Pages (High Priority)
|
||||
1. Printer pages (7 files) - Use vendortypeid=2
|
||||
2. Machine pages (4 files) - Use vendortypeid=4
|
||||
3. PC pages (4 files) - Use vendortypeid=3
|
||||
4. Model management (3 files)
|
||||
5. Test all existing functionality
|
||||
|
||||
### Phase 5: Create Infrastructure Pages (New Development)
|
||||
1. Create server management pages (4 files)
|
||||
2. Create switch management pages (4 files)
|
||||
3. Create camera management pages (4 files)
|
||||
4. Add navigation links
|
||||
5. Test infrastructure CRUD operations
|
||||
|
||||
### Phase 6: Application/KB Pages (Lower Priority)
|
||||
1. Review and update application pages (9 files)
|
||||
2. Review and update KB pages (2 files)
|
||||
3. These likely have minimal vendor flag usage
|
||||
|
||||
### Phase 7: Testing & Documentation
|
||||
1. Full regression testing
|
||||
2. Update user documentation
|
||||
3. Update technical documentation
|
||||
|
||||
---
|
||||
|
||||
## Part 5: Code Pattern Templates
|
||||
|
||||
### Template 1: Simple Vendor Dropdown (Direct ID)
|
||||
```vbscript
|
||||
' Get printer vendors (vendortypeid = 2)
|
||||
strSQL = "SELECT vendorid, vendor FROM vendors WHERE vendortypeid = 2 AND isactive = 1 ORDER BY vendor ASC"
|
||||
Set rsVendors = objConn.Execute(strSQL)
|
||||
```
|
||||
|
||||
### Template 2: Vendor Dropdown (With JOIN)
|
||||
```vbscript
|
||||
' Get machine vendors with type name
|
||||
strSQL = "SELECT v.vendorid, v.vendor, vt.vendortype " & _
|
||||
"FROM vendors v " & _
|
||||
"INNER JOIN vendortypes vt ON v.vendortypeid = vt.vendortypeid " & _
|
||||
"WHERE vt.vendortype = 'Machine' AND v.isactive = 1 " & _
|
||||
"ORDER BY v.vendor ASC"
|
||||
Set rsVendors = objConn.Execute(strSQL)
|
||||
```
|
||||
|
||||
### Template 3: Using Compatibility View (Migration Phase)
|
||||
```vbscript
|
||||
' Temporary: Use view during migration
|
||||
strSQL = "SELECT vendorid, vendor FROM vw_vendors_with_types WHERE isprinter = 1 AND isactive = 1 ORDER BY vendor ASC"
|
||||
Set rsVendors = objConn.Execute(strSQL)
|
||||
```
|
||||
|
||||
### Template 4: Model Dropdown with Vendor (Infrastructure)
|
||||
```vbscript
|
||||
' Get server models with vendor info
|
||||
strSQL = "SELECT m.modelnumberid, m.modelnumber, v.vendor " & _
|
||||
"FROM models m " & _
|
||||
"INNER JOIN vendors v ON m.vendorid = v.vendorid " & _
|
||||
"WHERE v.vendortypeid = 5 AND m.isactive = 1 " & _
|
||||
"ORDER BY m.modelnumber ASC"
|
||||
Set rsModels = objConn.Execute(strSQL)
|
||||
```
|
||||
|
||||
### Template 5: Infrastructure Device with Model/Vendor Display
|
||||
```vbscript
|
||||
' Display server with model and vendor
|
||||
strSQL = "SELECT s.*, 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.serverid = ? AND s.isactive = 1"
|
||||
Set rs = ExecuteParameterizedQuery(objConn, strSQL, Array(serverid))
|
||||
```
|
||||
|
||||
### Template 6: Save Infrastructure Device
|
||||
```vbscript
|
||||
' Insert server with model
|
||||
Dim modelid, serialnumber, ipaddress, description
|
||||
modelid = GetSafeInteger("FORM", "modelid", 0, 0, 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, "")
|
||||
|
||||
strSQL = "INSERT INTO servers (modelid, serialnumber, ipaddress, description, isactive) " & _
|
||||
"VALUES (?, ?, ?, ?, 1)"
|
||||
Set rs = ExecuteParameterizedQuery(objConn, strSQL, Array(modelid, serialnumber, ipaddress, description))
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 6: Testing Checklist
|
||||
|
||||
### Vendor Type Refactoring Tests
|
||||
- [ ] All vendor dropdowns display correct vendors (printer, PC, machine)
|
||||
- [ ] Vendor add/edit form changed from checkboxes to dropdown
|
||||
- [ ] Vendor save correctly sets vendortypeid
|
||||
- [ ] Existing printers/machines/PCs display correct vendor info
|
||||
- [ ] Model add/edit shows correct vendors based on type
|
||||
- [ ] Search functionality still works with vendor queries
|
||||
|
||||
### Infrastructure Support Tests
|
||||
- [ ] Can add server with model/vendor selection
|
||||
- [ ] Can edit server model/vendor
|
||||
- [ ] Can add switch with model/vendor selection
|
||||
- [ ] Can edit switch model/vendor
|
||||
- [ ] Can add camera with model/vendor selection
|
||||
- [ ] Can edit camera model/vendor
|
||||
- [ ] Server/switch/camera lists display vendor/model info
|
||||
- [ ] vw_network_devices view returns correct data
|
||||
- [ ] Infrastructure devices show on network map (if implemented)
|
||||
|
||||
### Data Integrity Tests
|
||||
- [ ] No SQL errors on any page
|
||||
- [ ] All foreign keys working correctly
|
||||
- [ ] Compatibility view returns correct data during migration
|
||||
- [ ] Old boolean flags match new vendortypeid values
|
||||
- [ ] No orphaned records after migration
|
||||
|
||||
---
|
||||
|
||||
## Part 7: Risk Assessment
|
||||
|
||||
### High Risk Areas
|
||||
1. **includes/data_cache.asp** - Used by many pages, breaking this breaks everything
|
||||
2. **addvendor.asp / savevendor.asp** - UI changes required, not just query updates
|
||||
3. **Application pages** - Unknown vendor usage, need detailed review
|
||||
|
||||
### Medium Risk Areas
|
||||
1. Printer/Machine/PC pages - Well-documented, straightforward updates
|
||||
2. Model management - Some inline vendor creation logic
|
||||
|
||||
### Low Risk Areas
|
||||
1. KB pages - Likely minimal vendor interaction
|
||||
2. Display-only pages - Read queries only, easy to update
|
||||
|
||||
### Mitigation Strategies
|
||||
1. **Use compatibility view initially** - Minimal code changes, easy rollback
|
||||
2. **Test data_cache.asp first** - If this works, 80% of dropdowns work
|
||||
3. **Keep old boolean columns** - Don't drop until fully validated
|
||||
4. **Create infrastructure pages incrementally** - Server first, then switch, then camera
|
||||
|
||||
---
|
||||
|
||||
## Part 8: File Change Priority Matrix
|
||||
|
||||
| Priority | Files | Reason | Est. Hours |
|
||||
|----------|-------|--------|------------|
|
||||
| P0 | includes/data_cache.asp | Affects all dropdowns | 2-3h |
|
||||
| P1 | addvendor.asp, savevendor*.asp | UI changes required | 3-4h |
|
||||
| P2 | Printer pages (7 files) | High usage feature | 4-5h |
|
||||
| P2 | Machine pages (4 files) | High usage feature | 3-4h |
|
||||
| P2 | PC pages (4 files) | High usage feature | 3-4h |
|
||||
| P3 | Model management (3 files) | Backend only | 2-3h |
|
||||
| P3 | Create server pages (4 files) | New development | 6-8h |
|
||||
| P3 | Create switch pages (4 files) | New development | 4-6h |
|
||||
| P3 | Create camera pages (4 files) | New development | 4-6h |
|
||||
| P4 | Application pages (9 files) | Low vendor interaction | 4-6h |
|
||||
| P4 | KB pages (2 files) | Minimal changes | 1-2h |
|
||||
|
||||
**Total Estimated Time:** 36-54 hours
|
||||
|
||||
---
|
||||
|
||||
## Part 9: Files Not Requiring Changes
|
||||
|
||||
The following files were checked and **do NOT** reference vendors or infrastructure tables:
|
||||
- default.asp (dashboard)
|
||||
- calendar.asp
|
||||
- search.asp (searches content, not vendors directly)
|
||||
- displaynotifications.asp
|
||||
- displaysubnets.asp
|
||||
- All other display*.asp not listed in audit
|
||||
|
||||
---
|
||||
|
||||
## Part 10: Next Steps
|
||||
|
||||
1. **Review and approve this audit**
|
||||
2. **Run database migrations** (add_infrastructure_vendor_model_support.sql + refactor_vendor_types.sql)
|
||||
3. **Create vendor_helpers.asp** include file
|
||||
4. **Update includes/data_cache.asp** (P0 - most critical)
|
||||
5. **Test vendor dropdowns** across application
|
||||
6. **Begin P1-P4 file updates** in priority order
|
||||
7. **Create infrastructure CRUD pages**
|
||||
8. **Full regression testing**
|
||||
9. **Document and deploy**
|
||||
|
||||
---
|
||||
|
||||
**Audit Completed By:** Claude Code
|
||||
**Audit Date:** 2025-10-23
|
||||
**Status:** Ready for Implementation
|
||||
**Next Action:** Review audit and approve implementation plan
|
||||
|
||||
481
docs/archive/VENDOR_TYPE_REFACTORING_PLAN.md
Normal file
481
docs/archive/VENDOR_TYPE_REFACTORING_PLAN.md
Normal file
@@ -0,0 +1,481 @@
|
||||
# Vendor Type Refactoring Plan
|
||||
|
||||
## Overview
|
||||
Refactor the `vendors` table to use a normalized many-to-many relationship for vendor types instead of multiple boolean columns.
|
||||
|
||||
---
|
||||
|
||||
## Current Design (Problems)
|
||||
|
||||
### Vendors Table Structure:
|
||||
```sql
|
||||
vendorid INT(11) PK
|
||||
vendor VARCHAR(50)
|
||||
isactive CHAR(50) -- Should be BIT(1)!
|
||||
isprinter BIT(1) -- Boolean flag
|
||||
ispc BIT(1) -- Boolean flag
|
||||
ismachine BIT(1) -- Boolean flag
|
||||
isserver BIT(1) -- Boolean flag
|
||||
isswitch BIT(1) -- Boolean flag
|
||||
iscamera BIT(1) -- Boolean flag
|
||||
```
|
||||
|
||||
### Issues:
|
||||
1. **Not Normalized**: Multiple boolean columns for types
|
||||
2. **Not Scalable**: Adding new device types requires ALTER TABLE
|
||||
3. **Inefficient Queries**: Need to check multiple columns
|
||||
4. **Data Type Issue**: `isactive` is CHAR(50) instead of BIT(1)
|
||||
5. **No Multi-Type Support**: Hard to query "vendors that are both printer AND pc"
|
||||
|
||||
---
|
||||
|
||||
## Proposed Design (Solution)
|
||||
|
||||
### New Tables:
|
||||
|
||||
#### 1. `vendortypes` (Lookup Table)
|
||||
```sql
|
||||
CREATE TABLE vendortypes (
|
||||
vendortypeid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
vendortype VARCHAR(50) NOT NULL UNIQUE,
|
||||
description VARCHAR(255),
|
||||
isactive BIT(1) DEFAULT b'1'
|
||||
);
|
||||
|
||||
-- Initial Data:
|
||||
INSERT INTO vendortypes (vendortype, description) VALUES
|
||||
('TBD', 'To be determined / Unassigned'),
|
||||
('Printer', 'Printer manufacturers'),
|
||||
('PC', 'Computer manufacturers'),
|
||||
('Machine', 'CNC machine manufacturers'),
|
||||
('Server', 'Server manufacturers'),
|
||||
('Switch', 'Network switch manufacturers'),
|
||||
('Camera', 'Security camera manufacturers');
|
||||
```
|
||||
|
||||
#### 2. Updated `vendors` Table (One-to-Many):
|
||||
```sql
|
||||
-- Add vendortypeid, remove old flags, fix isactive
|
||||
ALTER TABLE vendors
|
||||
ADD COLUMN vendortypeid INT(11) DEFAULT 1 AFTER vendorid,
|
||||
ADD INDEX idx_vendortypeid (vendortypeid),
|
||||
ADD FOREIGN KEY (vendortypeid) REFERENCES vendortypes(vendortypeid) ON DELETE SET NULL,
|
||||
DROP COLUMN isprinter,
|
||||
DROP COLUMN ispc,
|
||||
DROP COLUMN ismachine,
|
||||
DROP COLUMN isserver,
|
||||
DROP COLUMN isswitch,
|
||||
DROP COLUMN iscamera,
|
||||
MODIFY COLUMN isactive BIT(1) DEFAULT b'1';
|
||||
```
|
||||
|
||||
**Note**: Each vendor has ONE type. Default is vendortypeid=1 (TBD).
|
||||
|
||||
---
|
||||
|
||||
## Benefits
|
||||
|
||||
**Normalized**: Proper relational design
|
||||
**Scalable**: Add new types without schema changes
|
||||
**Simpler**: One type per vendor (one-to-many relationship)
|
||||
**Cleaner Queries**: `JOIN vendortypes WHERE vendortypeid = 2`
|
||||
**Better Reporting**: Easy to query "all vendors by type"
|
||||
**Maintainable**: Type list managed in one place
|
||||
**TBD Support**: Default type for unassigned/unknown vendors
|
||||
|
||||
---
|
||||
|
||||
## Data Migration Strategy
|
||||
|
||||
### Step 1: Create New Tables
|
||||
```sql
|
||||
CREATE TABLE vendortypes (...);
|
||||
CREATE TABLE vendor_vendortypes (...);
|
||||
```
|
||||
|
||||
### Step 2: Migrate Existing Data
|
||||
```sql
|
||||
-- Set vendortypeid based on first TRUE flag found (priority order)
|
||||
UPDATE vendors SET vendortypeid = 2 WHERE isprinter = 1; -- Printer
|
||||
UPDATE vendors SET vendortypeid = 3 WHERE ispc = 1; -- PC
|
||||
UPDATE vendors SET vendortypeid = 4 WHERE ismachine = 1; -- Machine
|
||||
UPDATE vendors SET vendortypeid = 5 WHERE isserver = 1; -- Server
|
||||
UPDATE vendors SET vendortypeid = 6 WHERE isswitch = 1; -- Switch
|
||||
UPDATE vendors SET vendortypeid = 7 WHERE iscamera = 1; -- Camera
|
||||
-- Vendors with all flags = 0 will remain vendortypeid = 1 (TBD)
|
||||
```
|
||||
|
||||
### Step 3: Update Application Code (see below)
|
||||
|
||||
### Step 4: Drop Old Columns
|
||||
```sql
|
||||
ALTER TABLE vendors
|
||||
DROP COLUMN isprinter,
|
||||
DROP COLUMN ispc,
|
||||
DROP COLUMN ismachine,
|
||||
DROP COLUMN isserver,
|
||||
DROP COLUMN isswitch,
|
||||
DROP COLUMN iscamera;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Code Changes Required
|
||||
|
||||
### Pattern: Old vs New
|
||||
|
||||
**OLD WAY:**
|
||||
```sql
|
||||
SELECT vendorid, vendor
|
||||
FROM vendors
|
||||
WHERE isprinter = 1 AND isactive = 1
|
||||
```
|
||||
|
||||
**NEW WAY:**
|
||||
```sql
|
||||
SELECT v.vendorid, v.vendor
|
||||
FROM vendors v
|
||||
INNER JOIN vendortypes vt ON v.vendortypeid = vt.vendortypeid
|
||||
WHERE vt.vendortype = 'Printer' AND v.isactive = 1
|
||||
```
|
||||
|
||||
Or using vendortypeid directly (more efficient):
|
||||
```sql
|
||||
SELECT v.vendorid, v.vendor
|
||||
FROM vendors v
|
||||
WHERE v.vendortypeid = 2 AND v.isactive = 1 -- 2 = Printer
|
||||
```
|
||||
|
||||
### Files Requiring Updates (31 files found):
|
||||
|
||||
#### Printer-Related (7 files):
|
||||
- `/addprinter.asp` - Line 53, 90
|
||||
- `/displayprinter.asp` - Line 291
|
||||
- `/editprinter.asp`
|
||||
- `/saveprinter_direct.asp`
|
||||
- `/includes/data_cache.asp` - Line 30 (RenderVendorOptions function)
|
||||
|
||||
#### Machine-Related (4 files):
|
||||
- `/addmachine.asp` - Line 62, 98
|
||||
- `/displaymachine.asp` - Line 236
|
||||
- `/editmacine.asp`
|
||||
- `/savemachine_direct.asp`
|
||||
|
||||
#### PC-Related (3 files):
|
||||
- `/displaypc.asp`
|
||||
- `/editdevice.asp` - Line 158, 199
|
||||
- `/updatedevice_direct.asp`
|
||||
- `/updatepc_direct.asp`
|
||||
|
||||
#### Model/Vendor Management (6 files):
|
||||
- `/addmodel.asp`
|
||||
- `/savemodel.asp`
|
||||
- `/savemodel_direct.asp`
|
||||
- `/addvendor.asp`
|
||||
- `/savevendor.asp`
|
||||
- `/savevendor_direct.asp`
|
||||
|
||||
#### Application-Related (7 files):
|
||||
- `/addapplication.asp`
|
||||
- `/displayapplication.asp`
|
||||
- `/editapplication.asp`
|
||||
- `/editapplication_direct.asp`
|
||||
- `/editapplication_v2.asp`
|
||||
- `/editapp_standalone.asp`
|
||||
- `/saveapplication.asp`
|
||||
- `/saveapplication_direct.asp`
|
||||
- `/quickadd_application.asp`
|
||||
|
||||
#### Knowledge Base (2 files):
|
||||
- `/addlink_direct.asp`
|
||||
- `/updatelink_direct.asp`
|
||||
|
||||
#### Search (1 file):
|
||||
- `/search.asp` - Lines 493-556 (machine and printer search with vendor joins)
|
||||
|
||||
---
|
||||
|
||||
## Recommended Approach
|
||||
|
||||
### Option 1: Create Helper View (Easier Migration)
|
||||
Create a view that mimics the old structure:
|
||||
|
||||
```sql
|
||||
CREATE VIEW vw_vendors_with_types AS
|
||||
SELECT
|
||||
v.vendorid,
|
||||
v.vendor,
|
||||
v.isactive,
|
||||
v.vendortypeid,
|
||||
vt.vendortype,
|
||||
CASE WHEN vt.vendortype = 'Printer' THEN 1 ELSE 0 END AS isprinter,
|
||||
CASE WHEN vt.vendortype = 'PC' THEN 1 ELSE 0 END AS ispc,
|
||||
CASE WHEN vt.vendortype = 'Machine' THEN 1 ELSE 0 END AS ismachine,
|
||||
CASE WHEN vt.vendortype = 'Server' THEN 1 ELSE 0 END AS isserver,
|
||||
CASE WHEN vt.vendortype = 'Switch' THEN 1 ELSE 0 END AS isswitch,
|
||||
CASE WHEN vt.vendortype = 'Camera' THEN 1 ELSE 0 END AS iscamera
|
||||
FROM vendors v
|
||||
LEFT JOIN vendortypes vt ON v.vendortypeid = vt.vendortypeid;
|
||||
```
|
||||
|
||||
**Benefit**: Minimal code changes - just replace `vendors` with `vw_vendors_with_types` in SELECT queries
|
||||
|
||||
### Option 2: Update All Queries (Better Long-Term)
|
||||
Update all 30 files to use proper JOINs with new tables.
|
||||
|
||||
**Benefit**: Cleaner code, better performance, proper normalization
|
||||
|
||||
---
|
||||
|
||||
## Helper Functions Needed
|
||||
|
||||
### ASP Include: `/includes/vendor_helpers.asp`
|
||||
|
||||
```vbscript
|
||||
<%
|
||||
' Get vendors by type (returns recordset)
|
||||
Function GetVendorsByType(vendorType)
|
||||
Dim sql, rs
|
||||
sql = "SELECT v.vendorid, v.vendor " & _
|
||||
"FROM vendors v " & _
|
||||
"INNER JOIN vendortypes vt ON v.vendortypeid = vt.vendortypeid " & _
|
||||
"WHERE vt.vendortype = '" & Replace(vendorType, "'", "''") & "' " & _
|
||||
"AND v.isactive = 1 " & _
|
||||
"ORDER BY v.vendor ASC"
|
||||
Set rs = objConn.Execute(sql)
|
||||
Set GetVendorsByType = rs
|
||||
End Function
|
||||
|
||||
' Get vendors by type ID (more efficient)
|
||||
Function GetVendorsByTypeId(vendortypeid)
|
||||
Dim sql, rs
|
||||
sql = "SELECT vendorid, vendor " & _
|
||||
"FROM vendors " & _
|
||||
"WHERE vendortypeid = " & vendortypeid & " " & _
|
||||
"AND isactive = 1 " & _
|
||||
"ORDER BY vendor ASC"
|
||||
Set rs = objConn.Execute(sql)
|
||||
Set GetVendorsByTypeId = rs
|
||||
End Function
|
||||
|
||||
' Get vendor type name for a vendor
|
||||
Function GetVendorType(vendorId)
|
||||
Dim sql, rs
|
||||
sql = "SELECT vt.vendortype " & _
|
||||
"FROM vendors v " & _
|
||||
"INNER JOIN vendortypes vt ON v.vendortypeid = vt.vendortypeid " & _
|
||||
"WHERE v.vendorid = " & vendorId
|
||||
Set rs = objConn.Execute(sql)
|
||||
If Not rs.EOF Then
|
||||
GetVendorType = rs("vendortype")
|
||||
Else
|
||||
GetVendorType = "TBD"
|
||||
End If
|
||||
rs.Close
|
||||
Set rs = Nothing
|
||||
End Function
|
||||
%>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Example Code Updates
|
||||
|
||||
### Before (addprinter.asp line 90):
|
||||
```vbscript
|
||||
strSQL = "SELECT vendorid, vendor FROM vendors WHERE isprinter = 1 AND isactive = 1 ORDER BY vendor ASC"
|
||||
Set rsVendors = objConn.Execute(strSQL)
|
||||
```
|
||||
|
||||
### After (Option 1 - Using View):
|
||||
```vbscript
|
||||
strSQL = "SELECT vendorid, vendor FROM vw_vendors_with_types WHERE isprinter = 1 AND isactive = 1 ORDER BY vendor ASC"
|
||||
Set rsVendors = objConn.Execute(strSQL)
|
||||
```
|
||||
|
||||
### After (Option 2 - Using Helper):
|
||||
```vbscript
|
||||
Set rsVendors = GetVendorsByType("Printer")
|
||||
```
|
||||
|
||||
### After (Option 3 - Direct Query with JOIN):
|
||||
```vbscript
|
||||
strSQL = "SELECT v.vendorid, v.vendor " & _
|
||||
"FROM vendors v " & _
|
||||
"INNER JOIN vendortypes vt ON v.vendortypeid = vt.vendortypeid " & _
|
||||
"WHERE vt.vendortype = 'Printer' AND v.isactive = 1 " & _
|
||||
"ORDER BY v.vendor ASC"
|
||||
Set rsVendors = objConn.Execute(strSQL)
|
||||
```
|
||||
|
||||
### After (Option 4 - Direct Query with ID - FASTEST):
|
||||
```vbscript
|
||||
' Printer = vendortypeid 2
|
||||
strSQL = "SELECT vendorid, vendor FROM vendors WHERE vendortypeid = 2 AND isactive = 1 ORDER BY vendor ASC"
|
||||
Set rsVendors = objConn.Execute(strSQL)
|
||||
```
|
||||
|
||||
### Search.asp Special Case:
|
||||
|
||||
The search.asp file (lines 493-556) searches machines and printers with vendor joins. Currently it searches by vendor name, which will continue to work. However, if we want to enable searching by vendor type (e.g., "printer vendors", "machine vendors"), we need to update the query:
|
||||
|
||||
**Current (machine search):**
|
||||
```vbscript
|
||||
strSQL = "SELECT m.machineid, m.machinenumber, m.alias, mt.machinetype " & _
|
||||
"FROM machines m " & _
|
||||
"INNER JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid " & _
|
||||
"LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid " & _
|
||||
"LEFT JOIN vendors v ON mo.vendorid = v.vendorid " & _
|
||||
"WHERE (m.machinenumber LIKE ? OR m.alias LIKE ? OR m.machinenotes LIKE ? OR mt.machinetype LIKE ? OR v.vendor LIKE ?) " & _
|
||||
" AND m.isactive = 1 " & _
|
||||
"LIMIT 10"
|
||||
```
|
||||
|
||||
**New (with vendortype support):**
|
||||
```vbscript
|
||||
strSQL = "SELECT m.machineid, m.machinenumber, m.alias, mt.machinetype " & _
|
||||
"FROM machines m " & _
|
||||
"INNER JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid " & _
|
||||
"LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid " & _
|
||||
"LEFT JOIN vendors v ON mo.vendorid = v.vendorid " & _
|
||||
"LEFT JOIN vendortypes vt ON v.vendortypeid = vt.vendortypeid " & _
|
||||
"WHERE (m.machinenumber LIKE ? OR m.alias LIKE ? OR m.machinenotes LIKE ? OR mt.machinetype LIKE ? OR v.vendor LIKE ? OR vt.vendortype LIKE ?) " & _
|
||||
" AND m.isactive = 1 " & _
|
||||
"LIMIT 10"
|
||||
```
|
||||
|
||||
**Note**: This is optional - the search will continue to work with just vendor names. Only add vendortype searching if desired.
|
||||
|
||||
---
|
||||
|
||||
## Testing Plan
|
||||
|
||||
1. **Create migration script** with new tables
|
||||
2. **Migrate data** from boolean flags to junction table
|
||||
3. **Create view** for backward compatibility
|
||||
4. **Test all 30 files** with view in place
|
||||
5. **Gradually update** code to use new structure
|
||||
6. **Drop view** once all code is updated
|
||||
7. **Drop old columns** from vendors table
|
||||
|
||||
---
|
||||
|
||||
## Timeline Estimate
|
||||
|
||||
- **Database Migration**: 1 hour
|
||||
- **Create Helper Functions**: 30 minutes
|
||||
- **Update 30 Files**: 4-6 hours (depends on approach)
|
||||
- **Testing**: 2-3 hours
|
||||
- **Total**: ~1 day of development work
|
||||
|
||||
---
|
||||
|
||||
## Rollback Plan
|
||||
|
||||
If issues arise:
|
||||
1. Keep old columns during testing phase
|
||||
2. View provides backward compatibility
|
||||
3. Can revert code changes easily
|
||||
4. Only drop columns after full validation
|
||||
|
||||
---
|
||||
|
||||
## Recommendation
|
||||
|
||||
**Use Option 1 (Helper View) for initial migration:**
|
||||
1. Create new tables and migrate data
|
||||
2. Create compatibility view
|
||||
3. Update queries to use view (minimal changes)
|
||||
4. Keep old columns as backup
|
||||
5. After validation, gradually refactor to use new structure directly
|
||||
6. Drop old columns once confident
|
||||
|
||||
This provides a safe, gradual migration path with easy rollback capability.
|
||||
|
||||
---
|
||||
|
||||
## Implementation Checklist
|
||||
|
||||
See the TODO list for detailed tracking. High-level implementation order:
|
||||
|
||||
### Phase 1: Database Migration (Complete)
|
||||
- Migration script created: `/sql/refactor_vendor_types.sql`
|
||||
- Run migration script on test database
|
||||
- Verify vendortypes table populated with 7 types (TBD, Printer, PC, Machine, Server, Switch, Camera)
|
||||
- Verify vendors.vendortypeid column added with proper foreign key
|
||||
- Verify data migrated correctly from boolean flags
|
||||
- Verify compatibility view `vw_vendors_with_types` works
|
||||
- Verify isactive column fixed (CHAR(50) → BIT(1))
|
||||
|
||||
### Phase 2: Code Updates (31 files)
|
||||
Update all files to use new vendortypeid structure. Use one of these approaches:
|
||||
- **Quick**: Replace table name `vendors` with `vw_vendors_with_types` (minimal changes)
|
||||
- **Better**: Use `WHERE vendortypeid = X` (direct column check)
|
||||
- **Best**: Use helper functions from vendor_helpers.asp
|
||||
|
||||
**File Groups**:
|
||||
- Data cache include (1 file) - **START HERE** (affects all dropdowns)
|
||||
- Printer files (7 files)
|
||||
- Machine files (4 files)
|
||||
- PC files (4 files)
|
||||
- Model/Vendor management (6 files)
|
||||
- Application files (9 files)
|
||||
- Knowledge base files (2 files)
|
||||
- Search file (1 file - optional enhancement)
|
||||
|
||||
### Phase 3: Testing
|
||||
- Test vendor dropdowns in all add/edit forms
|
||||
- Test filtering by vendor type works correctly
|
||||
- Test data integrity (vendors show correct type)
|
||||
- Test search functionality still works
|
||||
- Verify no SQL errors in any page
|
||||
|
||||
### Phase 4: Cleanup (FINAL STEP - ONLY AFTER FULL VALIDATION)
|
||||
- Create cleanup script to drop old boolean columns
|
||||
- Run cleanup script to remove isprinter, ispc, ismachine, isserver, isswitch, iscamera
|
||||
- Drop compatibility view if no longer needed
|
||||
- Update documentation
|
||||
|
||||
---
|
||||
|
||||
## Files Reference
|
||||
|
||||
**Migration Script**: `/home/camp/projects/windows/shopdb/sql/refactor_vendor_types.sql`
|
||||
**Design Document**: `/home/camp/projects/windows/shopdb/docs/VENDOR_TYPE_REFACTORING_PLAN.md` (this file)
|
||||
**Helper Functions** (to be created): `/home/camp/projects/windows/shopdb/includes/vendor_helpers.asp`
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference
|
||||
|
||||
**Vendor Type IDs**:
|
||||
- 1 = TBD (default for unassigned)
|
||||
- 2 = Printer
|
||||
- 3 = PC
|
||||
- 4 = Machine
|
||||
- 5 = Server
|
||||
- 6 = Switch
|
||||
- 7 = Camera
|
||||
|
||||
**Common Query Patterns**:
|
||||
```sql
|
||||
-- Get all printer vendors
|
||||
SELECT * FROM vendors WHERE vendortypeid = 2 AND isactive = 1
|
||||
|
||||
-- Get vendor with type name
|
||||
SELECT v.*, vt.vendortype
|
||||
FROM vendors v
|
||||
INNER JOIN vendortypes vt ON v.vendortypeid = vt.vendortypeid
|
||||
WHERE v.vendorid = ?
|
||||
|
||||
-- Get all vendors of a specific type by name
|
||||
SELECT v.* FROM vendors v
|
||||
INNER JOIN vendortypes vt ON v.vendortypeid = vt.vendortypeid
|
||||
WHERE vt.vendortype = 'Printer' AND v.isactive = 1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 2.0
|
||||
**Last Updated**: 2025-10-22
|
||||
**Status**: Ready for Implementation
|
||||
516
docs/archive/WARRANTY_MANAGEMENT_DESIGN.md
Normal file
516
docs/archive/WARRANTY_MANAGEMENT_DESIGN.md
Normal file
@@ -0,0 +1,516 @@
|
||||
# Warranty Management System Design
|
||||
|
||||
**Date Created**: 2025-11-06
|
||||
**Status**: DESIGN PHASE
|
||||
**Related Document**: PC_MACHINES_CONSOLIDATION_PLAN.md
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Instead of storing warranty fields directly on the `machines` table, create a dedicated warranty management system that supports:
|
||||
- Multiple warranties per machine (e.g., hardware warranty + extended support)
|
||||
- Warranty history and renewals
|
||||
- Different warranty providers
|
||||
- Automatic expiration tracking
|
||||
- Better reporting capabilities
|
||||
|
||||
---
|
||||
|
||||
## Part 1: New Warranty Infrastructure
|
||||
|
||||
### 1.1 Simple Warranty Table
|
||||
|
||||
**Design Decision**: Keep it simple - just track warranty name and expiration date.
|
||||
|
||||
**Rationale**:
|
||||
- Most important info: when does warranty expire and what is it called
|
||||
- Avoid over-engineering
|
||||
- Easy to add more fields later if needed
|
||||
|
||||
### 1.2 New Table: warranties
|
||||
|
||||
Minimal warranty tracking - one or more warranties per machine
|
||||
|
||||
```sql
|
||||
CREATE TABLE warranties (
|
||||
warrantyid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
machineid INT(11) NOT NULL,
|
||||
|
||||
-- Core warranty info
|
||||
warrantyname VARCHAR(100) NOT NULL, -- 'ProFlex Support', 'Next Business Day', 'Standard 3-Year', etc.
|
||||
enddate DATE NOT NULL,
|
||||
|
||||
-- Optional metadata
|
||||
notes TEXT,
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
dateadded DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
lastupdated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
|
||||
-- Indexes
|
||||
KEY idx_machineid (machineid),
|
||||
KEY idx_enddate (enddate),
|
||||
KEY idx_isactive (isactive),
|
||||
|
||||
-- Foreign Keys
|
||||
CONSTRAINT fk_warranties_machineid FOREIGN KEY (machineid) REFERENCES machines(machineid)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
```
|
||||
|
||||
**Total Columns**: 8 (simple and clean!)
|
||||
|
||||
**Example Data:**
|
||||
```sql
|
||||
-- Dell PC with ProSupport
|
||||
INSERT INTO warranties (machineid, warrantyname, enddate) VALUES
|
||||
(123, 'Dell ProSupport Plus', '2026-03-15');
|
||||
|
||||
-- CNC Machine with extended warranty
|
||||
INSERT INTO warranties (machineid, warrantyname, enddate) VALUES
|
||||
(456, 'Okuma Extended Service Agreement', '2027-12-31');
|
||||
|
||||
-- Server with multiple warranties
|
||||
INSERT INTO warranties (machineid, warrantyname, enddate) VALUES
|
||||
(789, 'HP Standard Hardware Warranty', '2025-06-30'),
|
||||
(789, 'HP 24/7 Support Contract', '2027-06-30');
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 2: Updated Machines Table Design
|
||||
|
||||
### 2.1 No Warranty Fields on Machines Table
|
||||
|
||||
**Design Decision**: Don't add any warranty fields to the machines table.
|
||||
|
||||
**Rationale**:
|
||||
- Warranties are separate entities in their own table
|
||||
- Use JOINs or views when you need warranty info
|
||||
- Keeps machines table clean
|
||||
- Supports multiple warranties per machine
|
||||
|
||||
---
|
||||
|
||||
## Part 3: Useful Views for Warranty Management
|
||||
|
||||
### 3.1 View: vw_machine_warranties
|
||||
|
||||
Show all machines with their warranties
|
||||
|
||||
```sql
|
||||
CREATE VIEW vw_machine_warranties AS
|
||||
SELECT
|
||||
m.machineid,
|
||||
m.machinenumber,
|
||||
m.hostname,
|
||||
m.serialnumber,
|
||||
mt.machinetype,
|
||||
mo.modelnumber,
|
||||
v.vendor,
|
||||
|
||||
-- Warranty info
|
||||
w.warrantyid,
|
||||
w.warrantyname,
|
||||
w.enddate AS warranty_enddate,
|
||||
DATEDIFF(w.enddate, CURDATE()) AS days_remaining,
|
||||
|
||||
-- Status calculation
|
||||
CASE
|
||||
WHEN w.enddate IS NULL THEN 'No Warranty'
|
||||
WHEN w.enddate < CURDATE() THEN 'Expired'
|
||||
WHEN DATEDIFF(w.enddate, CURDATE()) <= 30 THEN 'Expiring Soon'
|
||||
ELSE 'Active'
|
||||
END AS warranty_status,
|
||||
|
||||
-- How many warranties total for this machine
|
||||
(SELECT COUNT(*) FROM warranties w2
|
||||
WHERE w2.machineid = m.machineid AND w2.isactive = 1) AS total_warranties,
|
||||
|
||||
w.notes AS warranty_notes
|
||||
|
||||
FROM machines m
|
||||
LEFT JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN vendors v ON mo.vendorid = v.vendorid
|
||||
LEFT JOIN warranties w ON m.machineid = w.machineid AND w.isactive = 1
|
||||
|
||||
WHERE m.isactive = 1
|
||||
ORDER BY m.machinenumber, w.enddate DESC;
|
||||
```
|
||||
|
||||
### 3.2 View: vw_warranties_expiring
|
||||
|
||||
Show warranties expiring in the next 90 days
|
||||
|
||||
```sql
|
||||
CREATE VIEW vw_warranties_expiring AS
|
||||
SELECT
|
||||
m.machineid,
|
||||
m.machinenumber,
|
||||
m.hostname,
|
||||
m.serialnumber,
|
||||
mt.machinetype,
|
||||
mo.modelnumber,
|
||||
v.vendor AS manufacturer,
|
||||
|
||||
w.warrantyname,
|
||||
w.enddate AS warranty_enddate,
|
||||
DATEDIFF(w.enddate, CURDATE()) AS days_remaining,
|
||||
|
||||
CASE
|
||||
WHEN DATEDIFF(w.enddate, CURDATE()) <= 7 THEN 'Critical'
|
||||
WHEN DATEDIFF(w.enddate, CURDATE()) <= 30 THEN 'Warning'
|
||||
WHEN DATEDIFF(w.enddate, CURDATE()) <= 90 THEN 'Notice'
|
||||
ELSE 'Active'
|
||||
END AS urgency,
|
||||
|
||||
w.notes
|
||||
|
||||
FROM warranties w
|
||||
INNER JOIN machines m ON w.machineid = m.machineid
|
||||
LEFT JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN vendors v ON mo.vendorid = v.vendorid
|
||||
|
||||
WHERE w.isactive = 1
|
||||
AND w.enddate >= CURDATE()
|
||||
AND DATEDIFF(w.enddate, CURDATE()) <= 90
|
||||
AND m.isactive = 1
|
||||
|
||||
ORDER BY days_remaining ASC;
|
||||
```
|
||||
|
||||
### 3.3 View: vw_warranty_summary
|
||||
|
||||
Summary statistics for reporting
|
||||
|
||||
```sql
|
||||
CREATE VIEW vw_warranty_summary AS
|
||||
SELECT
|
||||
COUNT(*) AS total_warranties,
|
||||
SUM(CASE WHEN w.enddate >= CURDATE() THEN 1 ELSE 0 END) AS active_warranties,
|
||||
SUM(CASE WHEN w.enddate < CURDATE() THEN 1 ELSE 0 END) AS expired_warranties,
|
||||
SUM(CASE WHEN DATEDIFF(w.enddate, CURDATE()) <= 90 AND w.enddate >= CURDATE() THEN 1 ELSE 0 END) AS expiring_soon,
|
||||
|
||||
MIN(w.enddate) AS earliest_expiration,
|
||||
MAX(w.enddate) AS latest_expiration
|
||||
|
||||
FROM warranties w
|
||||
|
||||
WHERE w.isactive = 1;
|
||||
```
|
||||
|
||||
### 3.4 View: vw_machines_without_warranty
|
||||
|
||||
Find machines with no warranty coverage
|
||||
|
||||
```sql
|
||||
CREATE VIEW vw_machines_without_warranty AS
|
||||
SELECT
|
||||
m.machineid,
|
||||
m.machinenumber,
|
||||
m.hostname,
|
||||
m.serialnumber,
|
||||
mt.machinetype,
|
||||
mo.modelnumber,
|
||||
v.vendor AS manufacturer,
|
||||
m.dateadded,
|
||||
DATEDIFF(CURDATE(), m.dateadded) AS days_since_added
|
||||
|
||||
FROM machines m
|
||||
LEFT JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN vendors v ON mo.vendorid = v.vendorid
|
||||
LEFT JOIN warranties w ON m.machineid = w.machineid AND w.isactive = 1 AND w.status = 'Active'
|
||||
|
||||
WHERE m.isactive = 1
|
||||
AND w.warrantyid IS NULL
|
||||
|
||||
ORDER BY m.dateadded DESC;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 4: Data Migration from PC Table
|
||||
|
||||
### 4.1 Migrate PC Warranty Data
|
||||
|
||||
```sql
|
||||
-- Step 1: Insert warranty records for all PCs with warranty data
|
||||
INSERT INTO warranties (
|
||||
machineid,
|
||||
warrantytypeid,
|
||||
warrantyvendorid,
|
||||
startdate,
|
||||
enddate,
|
||||
servicelevel,
|
||||
servicetag,
|
||||
status,
|
||||
isprimary,
|
||||
lastcheckeddate,
|
||||
notes,
|
||||
isactive
|
||||
)
|
||||
SELECT
|
||||
-- Map to new machine ID (assuming PCs have been migrated to machines)
|
||||
m.machineid,
|
||||
|
||||
-- Default to 'Standard Hardware' warranty type
|
||||
(SELECT warrantytypeid FROM warrantytypes WHERE typename = 'Standard Hardware' LIMIT 1),
|
||||
|
||||
-- Map vendor from models table
|
||||
(SELECT mo.vendorid
|
||||
FROM models mo
|
||||
WHERE mo.modelnumberid = p.modelnumberid
|
||||
LIMIT 1),
|
||||
|
||||
-- Calculate start date (assume 3 years before end date, or use dateadded)
|
||||
COALESCE(DATE_SUB(p.warrantyenddate, INTERVAL 3 YEAR), p.dateadded),
|
||||
|
||||
-- End date from PC table
|
||||
p.warrantyenddate,
|
||||
|
||||
-- Service level
|
||||
p.warrantyservicelevel,
|
||||
|
||||
-- Use serial number as service tag
|
||||
p.serialnumber,
|
||||
|
||||
-- Status based on current date
|
||||
CASE
|
||||
WHEN p.warrantyenddate < CURDATE() THEN 'Expired'
|
||||
WHEN p.warrantystatus = 'Unknown' THEN 'Pending'
|
||||
ELSE 'Active'
|
||||
END,
|
||||
|
||||
-- Set as primary warranty
|
||||
1,
|
||||
|
||||
-- Last checked date
|
||||
p.warrantylastchecked,
|
||||
|
||||
-- Notes
|
||||
CONCAT('Migrated from PC table. Original status: ', COALESCE(p.warrantystatus, 'Unknown')),
|
||||
|
||||
-- Active flag
|
||||
1
|
||||
|
||||
FROM pc p
|
||||
INNER JOIN machines m ON p.hostname = m.hostname -- Link by hostname after PC migration
|
||||
WHERE p.warrantyenddate IS NOT NULL;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 5: SQL Migration Scripts
|
||||
|
||||
### 5.1 Script 04: Create Warranty Infrastructure
|
||||
|
||||
File: `sql/04_create_warranty_infrastructure.sql`
|
||||
|
||||
```sql
|
||||
-- =====================================================
|
||||
-- SCRIPT 04: Create Warranty Management Infrastructure
|
||||
-- =====================================================
|
||||
-- Date: 2025-11-06
|
||||
-- Purpose: Create warranty tables and views
|
||||
-- Status: REVERSIBLE (has rollback script)
|
||||
-- =====================================================
|
||||
|
||||
USE shopdb;
|
||||
SET SQL_SAFE_UPDATES = 0;
|
||||
|
||||
-- Create warrantytypes table
|
||||
CREATE TABLE IF NOT EXISTS warrantytypes (
|
||||
warrantytypeid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
typename VARCHAR(50) NOT NULL UNIQUE,
|
||||
description VARCHAR(255),
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
displayorder INT(11) DEFAULT 0,
|
||||
|
||||
KEY idx_isactive (isactive),
|
||||
KEY idx_displayorder (displayorder)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- Insert warranty types
|
||||
INSERT INTO warrantytypes (typename, description, displayorder) VALUES
|
||||
('Standard Hardware', 'Manufacturer standard warranty', 1),
|
||||
('Extended Hardware', 'Extended manufacturer warranty', 2),
|
||||
('Premium Support', 'Premium/ProSupport service level', 3),
|
||||
('Onsite Service', 'Next business day onsite service', 4),
|
||||
('Accidental Damage', 'Accidental damage protection', 5),
|
||||
('Software Support', 'Software/OS support coverage', 6),
|
||||
('Preventive Maintenance', 'Scheduled preventive maintenance', 7),
|
||||
('Parts Only', 'Parts replacement only, no labor', 8);
|
||||
|
||||
-- Create warranties table
|
||||
CREATE TABLE IF NOT EXISTS warranties (
|
||||
warrantyid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
machineid INT(11) NOT NULL,
|
||||
warrantytypeid INT(11) NOT NULL,
|
||||
vendorid INT(11),
|
||||
|
||||
startdate DATE NOT NULL,
|
||||
enddate DATE NOT NULL,
|
||||
|
||||
servicelevel VARCHAR(100),
|
||||
servicetag VARCHAR(100),
|
||||
ordernumber VARCHAR(100),
|
||||
|
||||
coveragenotes TEXT,
|
||||
cost DECIMAL(10,2),
|
||||
|
||||
status VARCHAR(50) DEFAULT 'Active',
|
||||
isprimary TINYINT(1) DEFAULT 0,
|
||||
autorenew TINYINT(1) DEFAULT 0,
|
||||
|
||||
lastcheckeddate DATETIME,
|
||||
daysremaining INT(11) GENERATED ALWAYS AS (DATEDIFF(enddate, CURDATE())) VIRTUAL,
|
||||
|
||||
notify_60days TINYINT(1) DEFAULT 1,
|
||||
notify_30days TINYINT(1) DEFAULT 1,
|
||||
notify_7days TINYINT(1) DEFAULT 1,
|
||||
notificationemail VARCHAR(255),
|
||||
|
||||
notes TEXT,
|
||||
isactive TINYINT(1) DEFAULT 1,
|
||||
dateadded DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
lastupdated DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
addedby VARCHAR(100),
|
||||
|
||||
KEY idx_machineid (machineid),
|
||||
KEY idx_warrantytypeid (warrantytypeid),
|
||||
KEY idx_vendorid (vendorid),
|
||||
KEY idx_enddate (enddate),
|
||||
KEY idx_status (status),
|
||||
KEY idx_isprimary (isprimary),
|
||||
KEY idx_isactive (isactive),
|
||||
|
||||
CONSTRAINT fk_warranties_machineid FOREIGN KEY (machineid) REFERENCES machines(machineid),
|
||||
CONSTRAINT fk_warranties_warrantytypeid FOREIGN KEY (warrantytypeid) REFERENCES warrantytypes(warrantytypeid),
|
||||
CONSTRAINT fk_warranties_vendorid FOREIGN KEY (vendorid) REFERENCES vendors(vendorid)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- Create warrantyhistory table
|
||||
CREATE TABLE IF NOT EXISTS warrantyhistory (
|
||||
historyid INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
warrantyid INT(11) NOT NULL,
|
||||
machineid INT(11) NOT NULL,
|
||||
|
||||
action VARCHAR(50) NOT NULL,
|
||||
oldenddate DATE,
|
||||
newenddate DATE,
|
||||
oldstatus VARCHAR(50),
|
||||
newstatus VARCHAR(50),
|
||||
|
||||
reason TEXT,
|
||||
cost DECIMAL(10,2),
|
||||
|
||||
actiondate DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
actionby VARCHAR(100),
|
||||
|
||||
KEY idx_warrantyid (warrantyid),
|
||||
KEY idx_machineid (machineid),
|
||||
KEY idx_actiondate (actiondate),
|
||||
|
||||
CONSTRAINT fk_warrantyhistory_warrantyid FOREIGN KEY (warrantyid) REFERENCES warranties(warrantyid),
|
||||
CONSTRAINT fk_warrantyhistory_machineid FOREIGN KEY (machineid) REFERENCES machines(machineid)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- Verification
|
||||
SELECT 'Warranty infrastructure created' AS status;
|
||||
SELECT COUNT(*) AS warranty_type_count FROM warrantytypes;
|
||||
|
||||
SET SQL_SAFE_UPDATES = 1;
|
||||
```
|
||||
|
||||
### 5.2 Rollback Script 04
|
||||
|
||||
File: `sql/ROLLBACK_04_warranty_infrastructure.sql`
|
||||
|
||||
```sql
|
||||
-- =====================================================
|
||||
-- ROLLBACK 04: Remove Warranty Infrastructure
|
||||
-- =====================================================
|
||||
|
||||
USE shopdb;
|
||||
SET SQL_SAFE_UPDATES = 0;
|
||||
|
||||
-- Drop tables in correct order (FK constraints)
|
||||
DROP TABLE IF EXISTS warrantyhistory;
|
||||
DROP TABLE IF EXISTS warranties;
|
||||
DROP TABLE IF EXISTS warrantytypes;
|
||||
|
||||
SELECT 'Warranty infrastructure removed' AS status;
|
||||
|
||||
SET SQL_SAFE_UPDATES = 1;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 6: Benefits of Warranty System
|
||||
|
||||
### 6.1 Advantages Over Field-Based Approach
|
||||
|
||||
| Feature | Old (fields on machines) | New (warranty tables) |
|
||||
|---------|-------------------------|----------------------|
|
||||
| Multiple warranties | No | Yes |
|
||||
| Warranty history | No | Yes |
|
||||
| Renewal tracking | No | Yes |
|
||||
| Cost tracking | No | Yes |
|
||||
| Different vendors | No | Yes |
|
||||
| Auto-notifications | No | Yes |
|
||||
| Reporting | Limited | Comprehensive |
|
||||
| Audit trail | No | Yes |
|
||||
|
||||
### 6.2 Example Use Cases
|
||||
|
||||
**Use Case 1: PC with multiple warranties**
|
||||
- Dell standard 3-year warranty (expires 2026-01-15)
|
||||
- Extended ProSupport warranty (expires 2027-01-15)
|
||||
- Accidental damage protection (expires 2026-01-15)
|
||||
|
||||
**Use Case 2: CNC Machine**
|
||||
- Okuma manufacturer warranty (expired 2020-05-01)
|
||||
- Extended service contract (expires 2026-12-31)
|
||||
- Preventive maintenance agreement (expires 2025-06-30)
|
||||
|
||||
**Use Case 3: Server**
|
||||
- HP standard warranty (expires 2025-03-15) - Primary
|
||||
- Extended 24/7 support (expires 2027-03-15)
|
||||
|
||||
---
|
||||
|
||||
## Part 7: Integration with PC Migration
|
||||
|
||||
Update the machines table design from PC_MACHINES_CONSOLIDATION_PLAN.md:
|
||||
|
||||
### Remove These Fields:
|
||||
```sql
|
||||
-- DO NOT ADD:
|
||||
-- warrantyenddate
|
||||
-- warrantystatus
|
||||
-- warrantydaysremaining
|
||||
-- warrantyservicelevel
|
||||
-- warrantylastchecked
|
||||
```
|
||||
|
||||
### Keep Machines Table Clean:
|
||||
The machines table should NOT have warranty fields. All warranty information will be in the `warranties` table and accessed via JOINs or views.
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. Review warranty table design
|
||||
2. Create warranty management views
|
||||
3. Create data migration script for PC warranties
|
||||
4. Update PC migration plan to use warranty tables
|
||||
5. Create ASP pages for warranty management
|
||||
6. Create warranty expiration notification system
|
||||
|
||||
---
|
||||
|
||||
**Document Status**: DRAFT - Ready for Review
|
||||
**Dependencies**: Requires machines table from PC consolidation
|
||||
**Production Impact**: New tables, no breaking changes
|
||||
417
docs/archive/sessions/SESSION_SUMMARY_2025-11-10.md
Normal file
417
docs/archive/sessions/SESSION_SUMMARY_2025-11-10.md
Normal file
@@ -0,0 +1,417 @@
|
||||
# Session Summary - 2025-11-10
|
||||
|
||||
**Session Focus:** Machine Relationships Fixes + Printer Modernization + Phase 3 Planning
|
||||
|
||||
---
|
||||
|
||||
## Work Completed
|
||||
|
||||
### 1. **Fixed Machine Relationship Display Issues**
|
||||
|
||||
**Problem:** Machine 195 showed relationship to 5274, but 5274 didn't show relationship back to 195.
|
||||
|
||||
**Root Cause:**
|
||||
- displaymachine.asp only showed ONE direction of relationships
|
||||
- Missing reverse lookup for "machines this machine controls"
|
||||
|
||||
**Files Modified:**
|
||||
- `/home/camp/projects/windows/shopdb/displaymachine.asp`
|
||||
|
||||
**Changes Made:**
|
||||
1. Added new section "Machines Controlled by This Machine" (lines 416-467)
|
||||
- Shows which machines THIS machine controls (reverse relationship)
|
||||
- Query: `WHERE mr.machineid = ? AND rt.relationshiptype = 'Controls'`
|
||||
|
||||
2. Updated "Controlled By PC" section (line 386)
|
||||
- Now handles both 'Controls' and 'Controlled By' relationship types
|
||||
- Query: `WHERE mr.related_machineid = ? AND (rt.relationshiptype = 'Controls' OR rt.relationshiptype = 'Controlled By')`
|
||||
|
||||
3. Fixed machine type display (lines 436, 489)
|
||||
- Changed JOIN from `models.machinetypeid` to `machines.machinetypeid`
|
||||
- Now correctly shows "Vertical Lathe" instead of "N/A"
|
||||
|
||||
4. Fixed controlling PC IP address display (line 385)
|
||||
- Added filter: `c.comstypeid IN (1, 3)` for IP-based communications only
|
||||
- Removed `isprimary = 1` filter
|
||||
- Added `GROUP BY` to avoid duplicates
|
||||
|
||||
**Testing Results:**
|
||||
- Machine 195 shows: "Controlled by 5274 (GJBJC724ESF)" with IP 192.168.1.2
|
||||
- Machine 5274 shows: "Controls 195 (2014)" and "Controls 133 (2013)"
|
||||
- Machine types display correctly as "Vertical Lathe"
|
||||
- Bidirectional relationships working
|
||||
|
||||
---
|
||||
|
||||
### 2. **Modernized Printer Management Pages**
|
||||
|
||||
**Goal:** Match printer pages to machine/PC pages' look and feel
|
||||
|
||||
**Pages Reviewed:**
|
||||
|
||||
#### displayprinters.asp (List Page)
|
||||
- **Status:** Already modern
|
||||
- Bootstrap theme, responsive table, modern icons
|
||||
|
||||
#### displayprinter.asp (View Page)
|
||||
- **Status:** Already modern
|
||||
- Tabbed interface (Settings, Edit)
|
||||
- Profile card with printer image
|
||||
- Nested entity creation (vendor, model)
|
||||
|
||||
#### editprinter.asp (Backend Processor)
|
||||
- **Status:** MODERNIZED THIS SESSION
|
||||
|
||||
**Changes to editprinter.asp:**
|
||||
|
||||
**Before (Old Style):**
|
||||
```asp
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="./style.css" type="text/css">
|
||||
Response.Write("<div class='alert alert-danger'>Error</div>")
|
||||
Response.Write("<a href='...'>Go back</a>")
|
||||
```
|
||||
|
||||
**After (Modern):**
|
||||
```asp
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!--#include file="./includes/header.asp"-->
|
||||
<!--#include file="./includes/sql.asp"-->
|
||||
Response.Redirect("displayprinter.asp?printerid=X&error=CODE")
|
||||
```
|
||||
|
||||
**Improvements:**
|
||||
1. Bootstrap theme with modern includes
|
||||
2. HTML5 DOCTYPE
|
||||
3. Error handling via redirects (not inline HTML)
|
||||
4. Success redirect with `?success=1` parameter
|
||||
5. Fallback page with Bootstrap styling
|
||||
6. All security features preserved (parameterized queries, validation)
|
||||
|
||||
**Error Codes Added:**
|
||||
- `INVALID_PRINTER_ID`
|
||||
- `INVALID_MODEL_ID`
|
||||
- `INVALID_MACHINE_ID`
|
||||
- `FIELD_LENGTH_EXCEEDED`
|
||||
- `MODEL_REQUIRED`
|
||||
- `VENDOR_REQUIRED`
|
||||
- `MODEL_FIELD_LENGTH_EXCEEDED`
|
||||
- `VENDOR_NAME_REQUIRED`
|
||||
- `VENDOR_NAME_TOO_LONG`
|
||||
- `VENDOR_CREATE_FAILED`
|
||||
- `MODEL_CREATE_FAILED`
|
||||
- `UPDATE_FAILED`
|
||||
|
||||
**Testing:**
|
||||
- displayprinters.asp - HTTP 200
|
||||
- displayprinter.asp - HTTP 200, tabs functional
|
||||
- editprinter.asp - Modernized and working
|
||||
|
||||
---
|
||||
|
||||
### 3. **Phase 3 Migration Planning**
|
||||
|
||||
**Decision:** Consolidate ALL network devices into `machines` table (except printers)
|
||||
|
||||
#### Devices to Migrate:
|
||||
- Servers → machinetypeid 30
|
||||
- Switches → machinetypeid 31
|
||||
- Cameras → machinetypeid 32
|
||||
- Access Points → machinetypeid 33
|
||||
- IDFs → machinetypeid 34
|
||||
- Routers → machinetypeid 35
|
||||
- Firewalls → machinetypeid 36
|
||||
|
||||
#### Keep Separate:
|
||||
- Printers (unique fields, workflows, APIs)
|
||||
|
||||
#### Why This Architecture?
|
||||
|
||||
**machines table will contain:**
|
||||
```
|
||||
├── Equipment (machinetypeid 1-24, pctypeid IS NULL)
|
||||
├── PCs (machinetypeid 25-29, pctypeid IS NOT NULL)
|
||||
└── Network Devices (machinetypeid 30-36, pctypeid IS NULL)
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
1. Single source of truth for all infrastructure
|
||||
2. Unified relationships (Camera → Switch → IDF using machinerelationships)
|
||||
3. Unified communications (all IPs in one table)
|
||||
4. Consistent UI (one set of pages for all devices)
|
||||
5. Powerful queries (cross-device reports, topology mapping)
|
||||
6. Better compliance tracking
|
||||
|
||||
#### Example Relationship Structure:
|
||||
```
|
||||
IDF-Building-A (machinetypeid 34)
|
||||
└── Connected To: Switch-Core-01 (machinetypeid 31)
|
||||
├── Connected To: Camera-Shop-01 (machinetypeid 32)
|
||||
├── Connected To: Camera-Shop-02 (machinetypeid 32)
|
||||
├── Connected To: Server-01 (machinetypeid 30)
|
||||
└── Connected To: PC-5274 (machinetypeid 29)
|
||||
└── Controls: Machine-2001 (machinetypeid 8)
|
||||
```
|
||||
|
||||
**All using the SAME machinerelationships table!**
|
||||
|
||||
---
|
||||
|
||||
## Documents Created
|
||||
|
||||
1. **PRINTER_PAGES_MODERNIZATION_2025-11-10.md**
|
||||
- Complete summary of printer page modernization
|
||||
- Before/after comparisons
|
||||
- Testing results
|
||||
|
||||
2. **PHASE3_NETWORK_DEVICES_MIGRATION_PLAN.md**
|
||||
- Comprehensive migration plan
|
||||
- Architecture design
|
||||
- Data mapping
|
||||
- Risk assessment
|
||||
- Timeline estimate (10-15 hours total work)
|
||||
|
||||
3. **SESSION_SUMMARY_2025-11-10.md** (this document)
|
||||
- Complete session overview
|
||||
- All changes and decisions documented
|
||||
|
||||
---
|
||||
|
||||
## Migration Scripts Started
|
||||
|
||||
Created directory structure:
|
||||
```
|
||||
/home/camp/projects/windows/shopdb/sql/migration_phase3/
|
||||
├── 01_create_network_machinetypes.sql CREATED
|
||||
├── 02_migrate_servers_to_machines.sql (next)
|
||||
├── 03_migrate_switches_to_machines.sql (next)
|
||||
├── 04_migrate_cameras_to_machines.sql (next)
|
||||
├── 05_migrate_accesspoints_to_machines.sql (next)
|
||||
├── 06_migrate_idfs_to_machines.sql (next)
|
||||
├── 07_migrate_network_communications.sql (next)
|
||||
├── 08_create_network_relationships.sql (next)
|
||||
├── 09_update_views_for_network_devices.sql (next)
|
||||
├── 10_update_vendor_flags.sql (next)
|
||||
├── VERIFY_PHASE3_MIGRATION.sql (next)
|
||||
├── RUN_ALL_PHASE3_SCRIPTS.sql (next)
|
||||
└── ROLLBACK_PHASE3.sql (next)
|
||||
```
|
||||
|
||||
**Script 01 Created:**
|
||||
- Adds machinetypes 30-36 for network devices
|
||||
- Includes verification queries
|
||||
- Shows machine type structure
|
||||
|
||||
---
|
||||
|
||||
## New Relationship Types Planned
|
||||
|
||||
```sql
|
||||
-- Existing
|
||||
('Dualpath', 'Machines sharing the same controller', 1)
|
||||
('Controls', 'PC controls this machine', 0)
|
||||
|
||||
-- Planned for Phase 3
|
||||
('Connected To', 'Device physically connected to infrastructure', 0)
|
||||
('Powered By', 'Device powered by this power source', 0)
|
||||
('Mounted In', 'Device mounted in rack/cabinet', 0)
|
||||
('Feeds Video To', 'Camera feeds video to this server/NVR', 0)
|
||||
('Provides Network', 'Infrastructure provides network to device', 0)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Filtering Strategy After Phase 3
|
||||
|
||||
```sql
|
||||
-- All PCs
|
||||
SELECT * FROM machines WHERE pctypeid IS NOT NULL;
|
||||
|
||||
-- All Equipment
|
||||
SELECT * FROM machines
|
||||
WHERE pctypeid IS NULL AND machinetypeid BETWEEN 1 AND 24;
|
||||
|
||||
-- All Network Devices
|
||||
SELECT * FROM machines
|
||||
WHERE pctypeid IS NULL AND machinetypeid BETWEEN 30 AND 36;
|
||||
|
||||
-- Specific types
|
||||
SELECT * FROM machines WHERE machinetypeid = 30; -- Servers
|
||||
SELECT * FROM machines WHERE machinetypeid = 31; -- Switches
|
||||
SELECT * FROM machines WHERE machinetypeid = 32; -- Cameras
|
||||
|
||||
-- All infrastructure (everything except printers)
|
||||
SELECT * FROM machines;
|
||||
|
||||
-- Cross-device query example
|
||||
SELECT m.*, mt.machinetype, c.address AS ipaddress
|
||||
FROM machines m
|
||||
JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid
|
||||
LEFT JOIN communications c ON m.machineid = c.machineid
|
||||
WHERE c.address LIKE '192.168.1.%'
|
||||
ORDER BY mt.category, m.machinenumber;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Code Updates Required (Post-Migration)
|
||||
|
||||
### Pages to Update:
|
||||
1. **displaymachines.asp** - Add network device filter tabs
|
||||
2. **machine_edit.asp** - Already supports all types
|
||||
3. **displaymachine.asp** - Already supports all types
|
||||
4. **adddevice.asp** - Add network device types
|
||||
|
||||
### Pages to Deprecate:
|
||||
1. **displayservers.asp** → Redirect to displaymachines.asp?type=server
|
||||
2. **displayswitches.asp** → Redirect to displaymachines.asp?type=switch
|
||||
3. **displaycameras.asp** → Redirect to displaymachines.asp?type=camera
|
||||
4. **network_devices.asp** → Redirect to displaymachines.asp?category=network
|
||||
|
||||
---
|
||||
|
||||
## Timeline Estimate for Phase 3
|
||||
|
||||
- **Planning & Plan Document:** 2 hours (COMPLETED)
|
||||
- **Script 01 Creation:** 30 minutes (COMPLETED)
|
||||
- **Remaining Scripts:** 1.5 hours
|
||||
- **Testing on Backup:** 1-2 hours
|
||||
- **Production Migration:** 30-45 minutes
|
||||
- **Verification:** 1 hour
|
||||
- **Code Updates:** 3-4 hours
|
||||
- **Testing & Bug Fixes:** 2-3 hours
|
||||
|
||||
**Total:** ~10-15 hours (2-3 hours completed)
|
||||
|
||||
---
|
||||
|
||||
## Risk Assessment
|
||||
|
||||
### Low Risk:
|
||||
- Pattern proven with Phase 2 PC migration (successful)
|
||||
- Can be rolled back easily
|
||||
- Old tables kept temporarily
|
||||
- Comprehensive verification planned
|
||||
|
||||
### Mitigation:
|
||||
- Test on backup database first
|
||||
- Migrate one device type at a time
|
||||
- Verify after each migration
|
||||
- Keep old tables for 30 days
|
||||
- Update code incrementally
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
### Immediate (Next Session):
|
||||
1. ⏭ Complete remaining migration scripts (02-10)
|
||||
2. ⏭ Create VERIFY_PHASE3_MIGRATION.sql
|
||||
3. ⏭ Create RUN_ALL_PHASE3_SCRIPTS.sql
|
||||
4. ⏭ Create ROLLBACK_PHASE3.sql
|
||||
5. ⏭ Test scripts on backup database
|
||||
|
||||
### After Testing:
|
||||
1. ⏭ Review and approve migration
|
||||
2. ⏭ Schedule maintenance window
|
||||
3. ⏭ Execute Phase 3 migration
|
||||
4. ⏭ Verify data integrity
|
||||
5. ⏭ Update UI code
|
||||
6. ⏭ Test all device types
|
||||
7. ⏭ Monitor for 30 days
|
||||
8. ⏭ Drop old tables (if stable)
|
||||
|
||||
---
|
||||
|
||||
## Success Metrics
|
||||
|
||||
### Completed This Session:
|
||||
- Machine relationships fixed (bidirectional display)
|
||||
- Machine type display fixed
|
||||
- PC IP address display fixed
|
||||
- Printer pages modernized
|
||||
- Phase 3 migration plan created
|
||||
- Script 01 created (machinetypes)
|
||||
|
||||
### Phase 3 Success Criteria:
|
||||
1. All network device records migrated (counts match)
|
||||
2. All IP addresses in communications table
|
||||
3. All relationships preserved
|
||||
4. Camera → IDF relationships working
|
||||
5. UI displays all device types correctly
|
||||
6. No data loss
|
||||
7. Rollback tested
|
||||
8. Performance acceptable
|
||||
|
||||
---
|
||||
|
||||
## Key Decisions Made
|
||||
|
||||
1. **Consolidate network devices into machines table**
|
||||
- Rationale: Unified data model, better relationships, less code duplication
|
||||
|
||||
2. **Keep printers separate**
|
||||
- Rationale: Unique fields (toner, drivers, CSF names), special APIs, different workflow
|
||||
|
||||
3. **Use machinetypeid 30-36 for network devices**
|
||||
- Rationale: Clear separation, easy filtering, extensible
|
||||
|
||||
4. **Use machinerelationships for ALL device relationships**
|
||||
- Rationale: Camera → Switch → IDF, unified topology, powerful queries
|
||||
|
||||
5. **Follow Phase 2 migration pattern**
|
||||
- Rationale: Proven successful, well-tested, documented
|
||||
|
||||
---
|
||||
|
||||
## Questions Answered
|
||||
|
||||
**Q:** "Should we just use machines for all types of devices besides printer?"
|
||||
**A:** YES! Excellent idea. Consolidate servers, switches, cameras, access points, IDFs into machines. Keep printers separate (too unique).
|
||||
|
||||
**Q:** "Can't we use the same table that machines use to define what pc they're associated with?"
|
||||
**A:** YES! Use the SAME `machinerelationships` table for Camera → IDF relationships using 'Connected To' relationship type.
|
||||
|
||||
---
|
||||
|
||||
## Files Modified This Session
|
||||
|
||||
1. `/home/camp/projects/windows/shopdb/displaymachine.asp`
|
||||
- Added "Machines Controlled by This Machine" section
|
||||
- Fixed machine type display
|
||||
- Fixed PC IP address display
|
||||
|
||||
2. `/home/camp/projects/windows/shopdb/editprinter.asp`
|
||||
- Complete modernization with Bootstrap theme
|
||||
- Improved error handling
|
||||
- Modern includes
|
||||
|
||||
3. `/home/camp/projects/windows/shopdb/docs/PHASE3_NETWORK_DEVICES_MIGRATION_PLAN.md`
|
||||
- New file - comprehensive migration plan
|
||||
|
||||
4. `/home/camp/projects/windows/shopdb/docs/PRINTER_PAGES_MODERNIZATION_2025-11-10.md`
|
||||
- New file - printer modernization summary
|
||||
|
||||
5. `/home/camp/projects/windows/shopdb/sql/migration_phase3/01_create_network_machinetypes.sql`
|
||||
- New file - adds machinetypes 30-36
|
||||
|
||||
---
|
||||
|
||||
## Session Statistics
|
||||
|
||||
- **Duration:** ~3 hours
|
||||
- **Files Modified:** 2
|
||||
- **Files Created:** 5 (3 docs + 1 SQL script + 1 directory)
|
||||
- **Bugs Fixed:** 4 (relationships, machine type, IP display, printer backend)
|
||||
- **Features Added:** 1 (reverse relationship display)
|
||||
- **Planning Documents:** 2
|
||||
- **Migration Scripts:** 1 of 13 created
|
||||
|
||||
---
|
||||
|
||||
**Status:** Session complete. Ready to continue with remaining Phase 3 migration scripts in next session.
|
||||
|
||||
**Recommendation:** Test Script 01 on backup database before proceeding with Scripts 02-10.
|
||||
686
docs/archive/sessions/SESSION_SUMMARY_2025-11-13.md
Normal file
686
docs/archive/sessions/SESSION_SUMMARY_2025-11-13.md
Normal file
@@ -0,0 +1,686 @@
|
||||
# Development Session Summary - November 13, 2025
|
||||
|
||||
**Date:** 2025-11-13
|
||||
**Session Duration:** Multiple hours
|
||||
**Environment:** DEV Server (http://192.168.122.151:8080/)
|
||||
**Primary Focus:** Phase 2 testing continuation, network_map.asp updates, network device infrastructure
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
This session was a continuation of Phase 2 PC migration testing. The main accomplishments were:
|
||||
1. Completed Phase 2 testing and bug fixes
|
||||
2. Enhanced network_map.asp to show all network device types
|
||||
3. Updated vw_network_devices view to support both separate tables and machines table
|
||||
4. Created and tested sample network infrastructure data
|
||||
5. Simplified displaypcs.asp table columns
|
||||
|
||||
---
|
||||
|
||||
## 1. Phase 2 Testing Completion
|
||||
|
||||
### Context
|
||||
- Continued from previous session where Phase 2 PC migration had been completed
|
||||
- User requested comprehensive testing of all pages, including edit and add pages
|
||||
- Total of 123 ASP files needed testing
|
||||
|
||||
### Testing Results
|
||||
|
||||
**Pages Tested:** 15 out of 123
|
||||
|
||||
** PASSED - Critical PC Pages:**
|
||||
- displaypcs.asp
|
||||
- displaypc.asp
|
||||
- displaymachines.asp
|
||||
- displaymachine.asp
|
||||
- adddevice.asp
|
||||
- savedevice.asp
|
||||
- savedevice_direct.asp
|
||||
- editdevice.asp (after fix)
|
||||
- updatedevice.asp (after migration)
|
||||
- updatedevice_direct.asp (after migration)
|
||||
- check_all_warranties.asp
|
||||
- check_all_warranties_clean.asp
|
||||
- network_map.asp (after enhancements)
|
||||
- network_devices.asp
|
||||
|
||||
** Issues Found:**
|
||||
- displaysubnet.asp - Runtime error (subscript out of range) - NOT FIXED
|
||||
- 3 warranty pages in v2 directory using old schema - NOT FIXED
|
||||
|
||||
### Bugs Fixed During Session
|
||||
|
||||
#### Bug 1: editdevice.asp - Undefined Variable (Line 95)
|
||||
**File:** editdevice.asp
|
||||
**Issue:** Used undefined variable `pcid`
|
||||
**Fix:** Changed to `machineid`
|
||||
|
||||
```asp
|
||||
' OLD (line 95):
|
||||
<input type="hidden" name="pcid" value="<%=pcid%>">
|
||||
|
||||
' NEW:
|
||||
<input type="hidden" name="pcid" value="<%=machineid%>">
|
||||
```
|
||||
|
||||
**Status:** Fixed
|
||||
|
||||
#### Bug 2: updatedevice.asp - Phase 2 Schema Migration
|
||||
**File:** updatedevice.asp
|
||||
**Issue:** Still using old `pc` table instead of Phase 2 `machines` table
|
||||
**Changes Made:**
|
||||
|
||||
```asp
|
||||
' Variable declaration (line 11):
|
||||
' OLD: Dim pcid, pcstatusid, pctypeid, ...
|
||||
' NEW: Dim pcid, machinestatusid, pctypeid, ...
|
||||
|
||||
' Form data retrieval (line 14):
|
||||
' OLD: pcstatusid = Trim(Request.Form("pcstatusid"))
|
||||
' NEW: machinestatusid = Trim(Request.Form("machinestatusid"))
|
||||
|
||||
' Validation (line 26):
|
||||
' OLD: If Not ValidateID(pcstatusid) Then
|
||||
' NEW: If Not ValidateID(machinestatusid) Then
|
||||
|
||||
' Record exists check (line 31):
|
||||
' OLD: If Not RecordExists(objConn, "pc", "pcid", pcid) Then
|
||||
' NEW: If Not RecordExists(objConn, "machines", "machineid", pcid) Then
|
||||
|
||||
' UPDATE query (line 64):
|
||||
' OLD: updateSQL = "UPDATE pc SET pcstatusid = ?, isactive = ?, "
|
||||
' NEW: updateSQL = "UPDATE machines SET machinestatusid = ?, isactive = ?, "
|
||||
|
||||
' WHERE clause (line 118):
|
||||
' OLD: updateSQL = updateSQL & "lastupdated = NOW() WHERE pcid = ?"
|
||||
' NEW: updateSQL = updateSQL & "lastupdated = NOW() WHERE machineid = ? AND pctypeid IS NOT NULL"
|
||||
```
|
||||
|
||||
**Status:** Fixed
|
||||
|
||||
#### Bug 3: updatedevice_direct.asp - Phase 2 Schema Migration
|
||||
**File:** updatedevice_direct.asp
|
||||
**Issue:** Still using old `pc` table instead of Phase 2 `machines` table
|
||||
**Changes Made:**
|
||||
|
||||
```asp
|
||||
' Variable declaration (line 12):
|
||||
' OLD: Dim pcid, pcstatusid, pctypeid, ...
|
||||
' NEW: Dim pcid, machinestatusid, pctypeid, ...
|
||||
|
||||
' Form data (line 15):
|
||||
' OLD: pcstatusid = Trim(Request.Form("pcstatusid"))
|
||||
' NEW: machinestatusid = Trim(Request.Form("machinestatusid"))
|
||||
|
||||
' Validation (line 38):
|
||||
' OLD: If Not IsNumeric(pcstatusid) Or CLng(pcstatusid) < 1 Then
|
||||
' NEW: If Not IsNumeric(machinestatusid) Or CLng(machinestatusid) < 1 Then
|
||||
|
||||
' UPDATE query (line 176):
|
||||
' OLD: updateSQL = "UPDATE pc SET pcstatusid = ?, ... WHERE pcid = ?"
|
||||
' NEW: updateSQL = "UPDATE machines SET machinestatusid = ?, ... WHERE machineid = ? AND pctypeid IS NOT NULL"
|
||||
|
||||
' Parameters (line 181):
|
||||
' OLD: cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@pcstatusid", 3, 1, , CLng(pcstatusid))
|
||||
' NEW: cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@machinestatusid", 3, 1, , CLng(machinestatusid))
|
||||
|
||||
' Final parameter (line 212):
|
||||
' OLD: cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@pcid", 3, 1, , CLng(pcid))
|
||||
' NEW: cmdUpdate.Parameters.Append cmdUpdate.CreateParameter("@machineid", 3, 1, , CLng(pcid))
|
||||
```
|
||||
|
||||
**Status:** Fixed
|
||||
|
||||
---
|
||||
|
||||
## 2. Network Map Enhancement
|
||||
|
||||
### Issue Reported
|
||||
User reported: "it's not showing the other types of network devices, just printers"
|
||||
|
||||
### Investigation
|
||||
- Initially investigated separate tables (servers, switches, cameras, accesspoints, idfs)
|
||||
- Found these tables were EMPTY (0 records)
|
||||
- Discovered network devices are stored in `machines` table with specific `machinetypeid` values:
|
||||
- Access Point: machinetypeid = 16
|
||||
- IDF: machinetypeid = 17
|
||||
- Camera: machinetypeid = 18
|
||||
- Switch: machinetypeid = 19
|
||||
- Server: machinetypeid = 20
|
||||
|
||||
### Fix Applied: network_map.asp
|
||||
|
||||
**File:** network_map.asp (lines 223-255)
|
||||
|
||||
**OLD Query:** Only queried separate empty tables for each device type
|
||||
|
||||
**NEW Query:** Replaced all separate table queries with single unified query from machines table
|
||||
|
||||
```asp
|
||||
strSQL = "SELECT printers.printerid AS id, machines.machinenumber AS name, machines.alias, " &_
|
||||
"printers.mapleft, printers.maptop, printers.ipaddress, NULL AS machinetypeid, " &_
|
||||
"'Printer' AS type, models.modelnumber, vendors.vendor, 'printers' AS source " &_
|
||||
"FROM printers " &_
|
||||
"INNER JOIN machines ON printers.machineid = machines.machineid " &_
|
||||
"LEFT JOIN models ON printers.modelid = models.modelnumberid " &_
|
||||
"LEFT JOIN vendors ON models.vendorid = vendors.vendorid " &_
|
||||
"WHERE printers.isactive = 1 " &_
|
||||
"AND printers.mapleft IS NOT NULL " &_
|
||||
"AND printers.maptop IS NOT NULL " &_
|
||||
"" &_
|
||||
"UNION ALL " &_
|
||||
"" &_
|
||||
"SELECT m.machineid AS id, m.machinenumber AS name, m.alias, " &_
|
||||
"m.mapleft, m.maptop, c.address AS ipaddress, m.machinetypeid, " &_
|
||||
"mt.machinetype AS type, mo.modelnumber, v.vendor, 'machines' AS source " &_
|
||||
"FROM machines m " &_
|
||||
"INNER JOIN machinetypes mt ON m.machinetypeid = mt.machinetypeid " &_
|
||||
"LEFT JOIN models mo ON m.modelnumberid = mo.modelnumberid " &_
|
||||
"LEFT JOIN vendors v ON mo.vendorid = v.vendorid " &_
|
||||
"LEFT JOIN communications c ON m.machineid = c.machineid AND c.isprimary = 1 AND c.comstypeid = 1 " &_
|
||||
"WHERE mt.machinetypeid IN (16, 17, 18, 19, 20) " &_
|
||||
"AND m.isactive = 1 " &_
|
||||
"AND m.mapleft IS NOT NULL " &_
|
||||
"AND m.maptop IS NOT NULL " &_
|
||||
"" &_
|
||||
"ORDER BY type, name ASC"
|
||||
```
|
||||
|
||||
**Key Changes:**
|
||||
1. Removed separate queries for servers, switches, cameras, accesspoints, idfs tables
|
||||
2. Added single UNION ALL query for machines table filtering by machinetypeid IN (16,17,18,19,20)
|
||||
3. Fixed column name: `accesspoints.accesspointid` → `accesspoints.apid` (was causing SQL error)
|
||||
4. Updated detail URL routing (lines 420-430) to handle all device types from machines table
|
||||
|
||||
**Also Updated:** Detail page URL routing
|
||||
|
||||
```javascript
|
||||
// OLD:
|
||||
if (sourceTable === 'printers') {
|
||||
detailUrl = './displayprinter.asp?printerid=' + machineId;
|
||||
} else if (sourceTable === 'machines') {
|
||||
detailUrl = './displaymachine.asp?machineid=' + machineId;
|
||||
} else {
|
||||
detailUrl = './network_devices.asp';
|
||||
}
|
||||
|
||||
// NEW:
|
||||
if (sourceTable === 'printers') {
|
||||
detailUrl = './displayprinter.asp?printerid=' + machineId;
|
||||
} else if (sourceTable === 'machines') {
|
||||
detailUrl = './displaymachine.asp?machineid=' + machineId;
|
||||
} else if (sourceTable === 'servers') {
|
||||
detailUrl = './displayserver.asp?id=' + machineId;
|
||||
} else if (sourceTable === 'switches') {
|
||||
detailUrl = './displayswitch.asp?id=' + machineId;
|
||||
} else if (sourceTable === 'cameras') {
|
||||
detailUrl = './displaycamera.asp?id=' + machineId;
|
||||
} else if (sourceTable === 'accesspoints') {
|
||||
detailUrl = './displayaccesspoint.asp?id=' + machineId;
|
||||
} else if (sourceTable === 'idfs') {
|
||||
detailUrl = './displayidf.asp?id=' + machineId;
|
||||
} else {
|
||||
detailUrl = './network_devices.asp';
|
||||
}
|
||||
```
|
||||
|
||||
**Result:** Network map now correctly queries and displays network devices from machines table
|
||||
|
||||
**Status:** Fixed
|
||||
|
||||
---
|
||||
|
||||
## 3. Database View Update - vw_network_devices
|
||||
|
||||
### Issue
|
||||
User reported: "I don't see any of these devices popping up in network devices lists"
|
||||
|
||||
### Root Cause
|
||||
The `vw_network_devices` view only queried separate empty tables, not the machines table where network devices with machinetypeid 16-20 are stored.
|
||||
|
||||
### Fix Applied
|
||||
|
||||
**File Created:** `/home/camp/projects/windows/shopdb/sql/update_vw_network_devices_view.sql`
|
||||
|
||||
**Changes:**
|
||||
- Dropped and recreated `vw_network_devices` view
|
||||
- Added UNION ALL query to include devices from machines table with machinetypeid IN (16,17,18,19,20)
|
||||
- Now view queries BOTH separate tables AND machines table
|
||||
|
||||
**New View Structure:**
|
||||
```sql
|
||||
CREATE VIEW vw_network_devices AS
|
||||
-- IDFs from separate table
|
||||
SELECT 'IDF' AS device_type, ...
|
||||
FROM idfs
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Servers from separate table
|
||||
SELECT 'Server' AS device_type, ...
|
||||
FROM servers
|
||||
LEFT JOIN models...
|
||||
LEFT JOIN vendors...
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Switches from separate table
|
||||
SELECT 'Switch' AS device_type, ...
|
||||
FROM switches
|
||||
LEFT JOIN models...
|
||||
LEFT JOIN vendors...
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Cameras from separate table
|
||||
SELECT 'Camera' AS device_type, ...
|
||||
FROM cameras
|
||||
LEFT JOIN models...
|
||||
LEFT JOIN vendors...
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Access Points from separate table
|
||||
SELECT 'Access Point' AS device_type, ...
|
||||
FROM accesspoints
|
||||
LEFT JOIN models...
|
||||
LEFT JOIN vendors...
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Printers from separate table
|
||||
SELECT 'Printer' AS device_type, ...
|
||||
FROM printers
|
||||
LEFT JOIN models...
|
||||
LEFT JOIN vendors...
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- Network devices from machines table (NEW!)
|
||||
SELECT
|
||||
mt.machinetype AS device_type,
|
||||
ma.machineid AS device_id,
|
||||
COALESCE(ma.alias, ma.machinenumber) AS device_name,
|
||||
ma.modelnumberid AS modelid,
|
||||
mo.modelnumber,
|
||||
ve.vendor,
|
||||
ma.serialnumber,
|
||||
c.address AS ipaddress,
|
||||
NULL AS description,
|
||||
ma.maptop,
|
||||
ma.mapleft,
|
||||
ma.isactive,
|
||||
NULL AS idfid,
|
||||
NULL AS idfname,
|
||||
NULL AS macaddress
|
||||
FROM machines ma
|
||||
INNER JOIN machinetypes mt ON ma.machinetypeid = mt.machinetypeid
|
||||
LEFT JOIN models mo ON ma.modelnumberid = mo.modelnumberid
|
||||
LEFT JOIN vendors ve ON mo.vendorid = ve.vendorid
|
||||
LEFT JOIN communications c ON ma.machineid = c.machineid AND c.isprimary = 1 AND c.comstypeid = 1
|
||||
WHERE mt.machinetypeid IN (16, 17, 18, 19, 20);
|
||||
```
|
||||
|
||||
**Result:**
|
||||
- network_devices.asp now shows devices from both separate tables AND machines table
|
||||
- Supports future addition of network devices in either location
|
||||
|
||||
**Status:** Fixed
|
||||
|
||||
---
|
||||
|
||||
## 4. Sample Network Device Creation & Removal
|
||||
|
||||
### Purpose
|
||||
User requested: "i need example switches, idf, cameras"
|
||||
|
||||
### Created Sample Data
|
||||
|
||||
**File Created:** `/home/camp/projects/windows/shopdb/sql/create_sample_network_devices.sql`
|
||||
|
||||
**Devices Created (25 total):**
|
||||
|
||||
**Switches (5):**
|
||||
- SW-CORE-01 (Core Switch 1) - 1200, 800
|
||||
- SW-DIST-01 (Distribution Switch 1) - 1400, 900
|
||||
- SW-ACCESS-01 (Access Switch 1) - 1600, 1000
|
||||
- SW-ACCESS-02 (Access Switch 2) - 800, 1200
|
||||
- SW-OFFICE-01 (Office Switch) - 1800, 1500
|
||||
|
||||
**Servers (5):**
|
||||
- SRV-DC-01 (Domain Controller 1) - 1100, 700
|
||||
- SRV-SQL-01 (SQL Database Server) - 1300, 750
|
||||
- SRV-FILE-01 (File Server) - 1500, 800
|
||||
- SRV-WEB-01 (Web Application Server) - 1700, 850
|
||||
- SRV-BACKUP-01 (Backup Server) - 900, 650
|
||||
|
||||
**Cameras (6):**
|
||||
- CAM-ENTRY-01 (Main Entry Camera) - 600, 1800
|
||||
- CAM-SHIPPING-01 (Shipping Dock Camera) - 2000, 600
|
||||
- CAM-FLOOR-01 (Shop Floor Camera 1) - 1500, 1200
|
||||
- CAM-FLOOR-02 (Shop Floor Camera 2) - 1800, 1400
|
||||
- CAM-OFFICE-01 (Office Area Camera) - 1200, 1900
|
||||
- CAM-PARKING-01 (Parking Lot Camera) - 400, 2000
|
||||
|
||||
**Access Points (5):**
|
||||
- AP-OFFICE-01 (Office Access Point 1) - 1100, 1800
|
||||
- AP-OFFICE-02 (Office Access Point 2) - 1700, 1800
|
||||
- AP-SHOP-01 (Shop Floor AP 1) - 1200, 1100
|
||||
- AP-SHOP-02 (Shop Floor AP 2) - 1600, 1300
|
||||
- AP-WAREHOUSE-01 (Warehouse Access Point) - 2100, 800
|
||||
|
||||
**IDFs (4):**
|
||||
- IDF-MAIN (Main IDF Room) - 1150, 750
|
||||
- IDF-EAST (East Wing IDF) - 1900, 1200
|
||||
- IDF-WEST (West Wing IDF) - 700, 1300
|
||||
- IDF-SHOP (Shop Floor IDF) - 1500, 1000
|
||||
|
||||
**IP Addresses Added:**
|
||||
- SW-CORE-01: 10.80.1.1
|
||||
- SRV-DC-01: 10.80.1.10
|
||||
- SRV-SQL-01: 10.80.1.11
|
||||
- CAM-ENTRY-01: 10.80.2.50
|
||||
- AP-OFFICE-01: 10.80.3.100
|
||||
|
||||
**Verification:**
|
||||
- All 25 devices appeared in network_devices.asp
|
||||
- All 25 devices appeared on network_map.asp with colored markers
|
||||
- Total markers on map: 62 (37 printers + 25 network devices)
|
||||
|
||||
### Sample Data Removal
|
||||
|
||||
**File Created:** `/home/camp/projects/windows/shopdb/sql/remove_sample_network_devices.sql`
|
||||
|
||||
**User Request:** "much better, can we remove these test devices now?"
|
||||
|
||||
**Removal Process:**
|
||||
1. Deleted communications entries for sample devices
|
||||
2. Deleted all 25 sample machines by machinenumber
|
||||
|
||||
**Result:**
|
||||
- Database returned to original state
|
||||
- Only 38 printers remain in vw_network_devices
|
||||
- System proven ready for real network device data
|
||||
|
||||
**Status:** Created, Tested, and Removed
|
||||
|
||||
---
|
||||
|
||||
## 5. UI Simplification - displaypcs.asp
|
||||
|
||||
### User Request
|
||||
"displaypcs.asp shows an ip column, can we delete that along with Machines column"
|
||||
|
||||
### Changes Made
|
||||
|
||||
**File:** displaypcs.asp
|
||||
|
||||
**Table Header (lines 103-110):**
|
||||
```asp
|
||||
' OLD:
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Hostname</th>
|
||||
<th scope="col">Serial</th>
|
||||
<th scope="col">IP</th> <!-- REMOVED -->
|
||||
<th scope="col">Model</th>
|
||||
<th scope="col">OS</th>
|
||||
<th scope="col">Machine</th> <!-- REMOVED -->
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
' NEW:
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Hostname</th>
|
||||
<th scope="col">Serial</th>
|
||||
<th scope="col">Model</th>
|
||||
<th scope="col">OS</th>
|
||||
</tr>
|
||||
</thead>
|
||||
```
|
||||
|
||||
**Table Data Rows (lines 163-175):**
|
||||
```asp
|
||||
' OLD:
|
||||
<tr>
|
||||
<td><a href="..."><%displayName%></a></td>
|
||||
<td><%serialnumber%></td>
|
||||
<td><%ipaddress%></td> <!-- REMOVED -->
|
||||
<td><%modelnumber%></td>
|
||||
<td><%operatingsystem%></td>
|
||||
<td><a href="..."><%machinenumber%></td> <!-- REMOVED -->
|
||||
</tr>
|
||||
|
||||
' NEW:
|
||||
<tr>
|
||||
<td><a href="..."><%displayName%></a></td>
|
||||
<td><%serialnumber%></td>
|
||||
<td><%modelnumber%></td>
|
||||
<td><%operatingsystem%></td>
|
||||
</tr>
|
||||
```
|
||||
|
||||
**Issue Encountered:**
|
||||
- After edit, page returned 404 errors
|
||||
- Root cause: IIS Express had cached the old compiled ASP
|
||||
- Resolution: Environment restart cleared ASP cache
|
||||
|
||||
**Status:** Fixed
|
||||
|
||||
---
|
||||
|
||||
## 6. Documentation & Debugging Tools Created
|
||||
|
||||
### network_map_debug.asp
|
||||
**File Created:** `/home/camp/projects/windows/shopdb/network_map_debug.asp`
|
||||
|
||||
**Purpose:** Debug page to show all printers with map coordinates
|
||||
|
||||
**Features:**
|
||||
- Lists all printers with mapleft/maptop coordinates
|
||||
- Shows IP addresses
|
||||
- Displays total count
|
||||
- Confirms map bounds validation
|
||||
|
||||
**Status:** Created (for troubleshooting)
|
||||
|
||||
### SQL Scripts Created
|
||||
|
||||
1. **assign_random_map_coordinates.sql**
|
||||
- Attempted to assign random coordinates to separate table devices
|
||||
- Not used (tables were empty)
|
||||
|
||||
2. **create_sample_network_devices.sql**
|
||||
- Creates 25 sample network devices in machines table
|
||||
- Assigns map coordinates
|
||||
- Adds IP addresses to communications table
|
||||
|
||||
3. **remove_sample_network_devices.sql**
|
||||
- Removes all 25 sample devices
|
||||
- Cleans up communications entries
|
||||
|
||||
4. **update_vw_network_devices_view.sql**
|
||||
- Drops and recreates vw_network_devices view
|
||||
- Adds machines table query for network devices
|
||||
|
||||
---
|
||||
|
||||
## 7. Testing Summary Updates
|
||||
|
||||
### File Updated
|
||||
`PHASE2_TESTING_SUMMARY.md`
|
||||
|
||||
**Updates Made:**
|
||||
1. Added network_map.asp to critical bugs fixed section
|
||||
2. Updated display pages status
|
||||
3. Added Bug #6 documentation for network_map.asp
|
||||
4. Updated executive summary with network_map.asp fix
|
||||
|
||||
**Current Status:**
|
||||
- **Total Pages Tested:** 15 out of 123
|
||||
- **Pages Passed:** 15
|
||||
- **Critical Bugs Fixed:** 6
|
||||
- **Remaining Issues:** 2 (displaysubnet.asp, v2 directory pages)
|
||||
|
||||
---
|
||||
|
||||
## Database Schema Notes
|
||||
|
||||
### Network Device Storage Architecture
|
||||
|
||||
**Current System Uses TWO Approaches:**
|
||||
|
||||
1. **Separate Tables** (Legacy/Specialized Devices):
|
||||
- `servers` table
|
||||
- `switches` table
|
||||
- `cameras` table
|
||||
- `accesspoints` table (column: `apid`, NOT `accesspointid`)
|
||||
- `idfs` table
|
||||
- `printers` table
|
||||
|
||||
2. **Unified Machines Table** (New/Phase 2 Approach):
|
||||
- Network devices stored in `machines` table
|
||||
- Identified by `machinetypeid`:
|
||||
- 16 = Access Point
|
||||
- 17 = IDF
|
||||
- 18 = Camera
|
||||
- 19 = Switch
|
||||
- 20 = Server
|
||||
- PCs also in machines table: `pctypeid IS NOT NULL`
|
||||
|
||||
**View: vw_network_devices**
|
||||
- UNION ALL query combining both approaches
|
||||
- Supports gradual migration from separate tables to unified machines table
|
||||
- Allows flexibility in where devices are stored
|
||||
|
||||
**Map Coordinates:**
|
||||
- Stored as `mapleft` and `maptop` (integer)
|
||||
- Map bounds: X: 0-3300, Y: 0-2550
|
||||
- Required for devices to appear on network_map.asp
|
||||
|
||||
---
|
||||
|
||||
## Files Modified
|
||||
|
||||
### ASP Pages
|
||||
1. `/home/camp/projects/windows/shopdb/editdevice.asp` - Fixed undefined variable
|
||||
2. `/home/camp/projects/windows/shopdb/updatedevice.asp` - Migrated to Phase 2 schema
|
||||
3. `/home/camp/projects/windows/shopdb/updatedevice_direct.asp` - Migrated to Phase 2 schema
|
||||
4. `/home/camp/projects/windows/shopdb/network_map.asp` - Enhanced to show all device types
|
||||
5. `/home/camp/projects/windows/shopdb/displaypcs.asp` - Removed IP and Machine columns
|
||||
|
||||
### SQL Scripts Created
|
||||
1. `/home/camp/projects/windows/shopdb/sql/assign_random_map_coordinates.sql`
|
||||
2. `/home/camp/projects/windows/shopdb/sql/create_sample_network_devices.sql`
|
||||
3. `/home/camp/projects/windows/shopdb/sql/remove_sample_network_devices.sql`
|
||||
4. `/home/camp/projects/windows/shopdb/sql/update_vw_network_devices_view.sql`
|
||||
|
||||
### Debug Tools Created
|
||||
1. `/home/camp/projects/windows/shopdb/network_map_debug.asp`
|
||||
|
||||
### Documentation Updated
|
||||
1. `/home/camp/projects/windows/shopdb/PHASE2_TESTING_SUMMARY.md`
|
||||
|
||||
### Documentation Created
|
||||
1. `/home/camp/projects/windows/shopdb/SESSION_SUMMARY_2025-11-13.md` (this file)
|
||||
|
||||
---
|
||||
|
||||
## Outstanding Issues
|
||||
|
||||
### High Priority
|
||||
None - all critical Phase 2 PC functionality working
|
||||
|
||||
### Medium Priority
|
||||
1. **displaysubnet.asp** - Runtime error (subscript out of range)
|
||||
- Phase 2 tables used correctly
|
||||
- Logic bug in recordset handling
|
||||
- Not blocking production
|
||||
|
||||
### Low Priority
|
||||
1. **v2 directory warranty pages** - Using old schema
|
||||
- v2/check_warranties_v2.asp
|
||||
- v2/check_all_warranties.asp
|
||||
- v2/check_all_warranties_clean.asp
|
||||
- v2 appears to be legacy directory
|
||||
- Decision needed: update or deprecate?
|
||||
|
||||
---
|
||||
|
||||
## Lessons Learned
|
||||
|
||||
1. **ASP Cache Issues:**
|
||||
- IIS Express caches compiled ASP pages
|
||||
- Syntax errors can cause 404 responses instead of error messages
|
||||
- Environment restart clears cache (but should ask user first!)
|
||||
|
||||
2. **Network Device Architecture:**
|
||||
- System uses both separate tables AND machines table
|
||||
- machinetypeid values critical for identifying device types
|
||||
- vw_network_devices view must query both sources
|
||||
|
||||
3. **Column Name Gotchas:**
|
||||
- accesspoints table uses `apid` not `accesspointid`
|
||||
- Always verify column names before writing queries
|
||||
|
||||
4. **Map Coordinate Requirements:**
|
||||
- Devices need mapleft/maptop to appear on network_map.asp
|
||||
- Empty separate tables caused confusion about where devices are stored
|
||||
|
||||
---
|
||||
|
||||
## Production Readiness
|
||||
|
||||
### Ready for Production
|
||||
- All PC functionality (display, add, edit, update, save)
|
||||
- Phase 2 schema migration complete for critical paths
|
||||
- network_map.asp showing all device types
|
||||
- network_devices.asp unified view working
|
||||
- Security: All pages use parameterized queries
|
||||
|
||||
### Before Production Deployment
|
||||
1. Test remaining 108 ASP pages
|
||||
2. Fix displaysubnet.asp runtime error
|
||||
3. Decide on v2 directory (update or remove)
|
||||
4. Manual testing of all create/update/delete operations
|
||||
5. Monitor IIS logs for 48 hours after deployment
|
||||
6. Create rollback plan
|
||||
|
||||
### Current Test Coverage
|
||||
- **Pages Tested:** 15 / 123 (12%)
|
||||
- **Critical Pages:** 15 / 15 (100%)
|
||||
- **Phase 2 Migration:** Complete for PC pages
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. Continue systematic testing of remaining pages
|
||||
2. Create real network infrastructure devices when ready
|
||||
3. Fix displaysubnet.asp logic bug
|
||||
4. Test POST operations with production-like data
|
||||
5. Consider batch testing strategy for remaining 108 pages
|
||||
|
||||
---
|
||||
|
||||
## Environment Notes
|
||||
|
||||
- **Windows VM:** 192.168.122.151
|
||||
- **IIS Express:** Port 8080
|
||||
- **MySQL:** dev-mysql container (Docker)
|
||||
- **Database:** shopdb
|
||||
- **MySQL User:** root (password: rootpassword)
|
||||
- **Map Image:** /images/sitemap2025-dark.png (or -light.png based on theme)
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
This was a highly productive session with 6 critical bugs fixed, major enhancements to network device display functionality, and comprehensive documentation. The system is now ready to handle network infrastructure devices in the machines table with proper display on both network_map.asp and network_devices.asp.
|
||||
|
||||
All Phase 2 critical PC functionality is working and tested. The unified architecture allows flexible device storage in either separate tables or the machines table, with the view layer handling the abstraction.
|
||||
|
||||
**Status:** Session Objectives Met
|
||||
**Production Readiness:** 85% (core functionality complete, full testing pending)
|
||||
Reference in New Issue
Block a user