Files
shopdb/PHASE2_PC_MIGRATION_TODO.md
cproudlock 4bcaf0913f Complete Phase 2 PC migration and network device infrastructure updates
This commit captures 20 days of development work (Oct 28 - Nov 17, 2025)
including Phase 2 PC migration, network device unification, and numerous
bug fixes and enhancements.

## Major Changes

### Phase 2: PC Migration to Unified Machines Table
- Migrated all PCs from separate `pc` table to unified `machines` table
- PCs identified by `pctypeid IS NOT NULL` in machines table
- Updated all display, add, edit, and update pages for PC functionality
- Comprehensive testing: 15 critical pages verified working

### Network Device Infrastructure Unification
- Unified network devices (Switches, Servers, Cameras, IDFs, Access Points)
  into machines table using machinetypeid 16-20
- Updated vw_network_devices view to query both legacy tables and machines table
- Enhanced network_map.asp to display all device types from machines table
- Fixed location display for all network device types

### Machine Management System
- Complete machine CRUD operations (Create, Read, Update, Delete)
- 5-tab interface: Basic Info, Network, Relationships, Compliance, Location
- Support for multiple network interfaces (up to 3 per machine)
- Machine relationships: Controls (PC→Equipment) and Dualpath (redundancy)
- Compliance tracking with third-party vendor management

### Bug Fixes (Nov 7-14, 2025)
- Fixed editdevice.asp undefined variable (pcid → machineid)
- Migrated updatedevice.asp and updatedevice_direct.asp to Phase 2 schema
- Fixed network_map.asp to show all network device types
- Fixed displaylocation.asp to query machines table for network devices
- Fixed IP columns migration and compliance column handling
- Fixed dateadded column errors in network device pages
- Fixed PowerShell API integration issues
- Simplified displaypcs.asp (removed IP and Machine columns)

### Documentation
- Created comprehensive session summaries (Nov 10, 13, 14)
- Added Machine Quick Reference Guide
- Documented all bug fixes and migrations
- API documentation for ASP endpoints

### Database Schema Updates
- Phase 2 migration scripts for PC consolidation
- Phase 3 migration scripts for network devices
- Updated views to support hybrid table approach
- Sample data creation/removal scripts for testing

## Files Modified (Key Changes)
- editdevice.asp, updatedevice.asp, updatedevice_direct.asp
- network_map.asp, network_devices.asp, displaylocation.asp
- displaypcs.asp, displaypc.asp, displaymachine.asp
- All machine management pages (add/edit/save/update)
- save_network_device.asp (fixed machine type IDs)

## Testing Status
- 15 critical pages tested and verified
- Phase 2 PC functionality: 100% working
- Network device display: 100% working
- Security: All queries use parameterized commands

## Production Readiness
- Core functionality complete and tested
- 85% production ready
- Remaining: Full test coverage of all 123 ASP pages

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 20:04:06 -05:00

19 KiB

Phase 2 PC Pages Migration TODO

Overview

Machine pages (displaymachine.asp, displaymachines.asp, machine_edit.asp) have been successfully migrated to Phase 2 schema. PC pages still use the old pc and pc_network_interfaces tables and must be updated to use the consolidated machines and communications tables.

Status: COMPLETE (Completed: November 10, 2025) Priority: High (P1) Actual Effort: 6-7 hours

📝 See completion details: PHASE2_PC_MIGRATION_COMPLETE.md


Background

Phase 2 Schema Consolidation

  • Before: Separate pc and machines tables
  • After: Single machines table with pctypeid IS NOT NULL identifying PCs
  • Network Interfaces: pc_network_interfacescommunications
  • Relationships: pc_dualpath_assignmentsmachinerelationships

PC Identification in Phase 2

-- PCs are identified by having a pctypeid
SELECT * FROM machines WHERE pctypeid IS NOT NULL

-- Equipment has pctypeid = NULL
SELECT * FROM machines WHERE pctypeid IS NULL

Machine Pages Completed - Use as Reference

The machine management pages have been successfully migrated and can serve as templates for PC pages:

Reference Files:

  • /home/camp/projects/windows/shopdb/displaymachines.asp - List page (equipment only)
  • /home/camp/projects/windows/shopdb/displaymachine.asp - Individual view page
  • /home/camp/projects/windows/shopdb/machine_edit.asp - Edit page

Key Fixes Applied to Machines (Apply to PCs):

  1. Column name fixes: ipaddressaddress in communications table
  2. Relationship query direction: Controls is PC → Equipment (one-way)
  3. Type conversion: All text fields need & "" for HTMLEncode compatibility
  4. Include all ID columns in SELECT queries for dropdowns
  5. Use LEFT JOIN for optional relationships (functionalaccounts, machinetypes)
  6. Remove inline edit forms, use dedicated edit pages

Files Requiring Migration

1. displaypcs.asp - PC List Page

Status: COMPLETE (Updated: 2025-11-10 14:40) Location: /home/camp/projects/windows/shopdb/displaypcs.asp

Current State:

  • Queries pc table
  • Shows list of all PCs

Required Changes:

  • Update SQL query to use machines WHERE pctypeid IS NOT NULL
  • Update column references from pc.* to machines.*
  • Convert text fields to strings with & "" for HTMLEncode
  • Test with existing PC data
  • Verify links to displaypc.asp work
  • Check pagination if exists

Example Query Update:

' BEFORE:
strSQL = "SELECT * FROM pc WHERE isactive = 1 ORDER BY hostname"

' AFTER:
strSQL = "SELECT m.*, pt.pctype, pt.pctypeid, " & _
        "mo.modelnumber, mo.modelnumberid, " & _
        "v.vendor, v.vendorid, " & _
        "bu.businessunit, bu.businessunitid " & _
        "FROM machines m " & _
        "LEFT JOIN pctypes pt ON m.pctypeid = pt.pctypeid " & _
        "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 " & _
        "WHERE m.pctypeid IS NOT NULL AND m.isactive = 1 " & _
        "ORDER BY m.hostname"

Template: Mirror displaymachines.asp but filter for PCs instead of equipment


2. displaypc.asp - Individual PC View Page

Status: COMPLETE (Updated: 2025-11-10) Location: /home/camp/projects/windows/shopdb/displaypc.asp

Current State:

  • Queries pc table for PC details
  • Queries pc_network_interfaces for network info
  • May have inline edit form

Required Changes:

  • Update main query to use machines WHERE pctypeid IS NOT NULL
  • Update network query to use communications table
  • Update column references:
    • pc.pcidmachines.machineid
    • pc.hostnamemachines.hostname
    • pc.notesmachines.machinenotes
    • pc_network_interfaces.ipaddresscommunications.address
    • pc_network_interfaces.macaddresscommunications.macaddress
  • Convert all text fields to strings with & "" for HTMLEncode
  • Add 5-tab structure (Settings, Network, Relationships, Compliance, Applications)
  • Remove inline edit form if present
  • Add "Edit PC" button linking to pc_edit.asp
  • Update dualpath relationships query to use machinerelationships
  • Update controlled equipment query to use machinerelationships
  • Test with real PC data including special characters

Main Query Example:

strSQL = "SELECT m.machineid, m.machinenumber, m.alias, m.hostname, " & _
        "m.serialnumber, m.machinenotes, m.mapleft, m.maptop, " & _
        "m.modelnumberid, m.businessunitid, m.printerid, m.pctypeid, " & _
        "m.loggedinuser, m.osid, m.machinestatusid, m.lastupdated, m.dateadded, " & _
        "pt.pctype, pt.pctypeid, " & _
        "mo.modelnumber, mo.image, mo.modelnumberid, " & _
        "v.vendor, v.vendorid, " & _
        "bu.businessunit, bu.businessunitid, " & _
        "os.osname, os.osversion, " & _
        "pr.printerwindowsname, pr.printerid " & _
        "FROM machines m " & _
        "LEFT JOIN pctypes pt ON m.pctypeid = pt.pctypeid " & _
        "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 operatingsystems os ON m.osid = os.osid " & _
        "LEFT JOIN printers pr ON m.printerid = pr.printerid " & _
        "WHERE m.machineid = ? AND m.pctypeid IS NOT NULL"

' Load data with string conversion
Dim hostname, alias, machinenotes, serialnumber
hostname = "" : If NOT IsNull(rs("hostname")) Then hostname = rs("hostname") & ""
alias = "" : If NOT IsNull(rs("alias")) Then alias = rs("alias") & ""
machinenotes = "" : If NOT IsNull(rs("machinenotes")) Then machinenotes = rs("machinenotes") & ""
serialnumber = "" : If NOT IsNull(rs("serialnumber")) Then serialnumber = rs("serialnumber") & ""

Template: Mirror displaymachine.asp exactly, just change WHERE clause to filter PCs

Network Query Example:

strSQL = "SELECT c.address, c.macaddress, c.interfacename, c.isprimary, ct.comtype " & _
        "FROM communications c " & _
        "LEFT JOIN comstypes ct ON c.comstypeid = ct.comstypeid " & _
        "WHERE c.machineid = ? AND c.isactive = 1 " & _
        "ORDER BY c.isprimary DESC"

Dualpath Relationships Example:

' Dualpath is bidirectional (PC ↔ PC), so query in both directions
strSQL = "SELECT mr.related_machineid, m.alias, m.hostname " & _
        "FROM machinerelationships mr " & _
        "JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid " & _
        "LEFT JOIN machines m ON mr.related_machineid = m.machineid " & _
        "WHERE mr.machineid = ? AND rt.relationshiptype = 'Dualpath' AND mr.isactive = 1"

Controlled Equipment Example:

' PCs can control multiple pieces of equipment (Controls is PC → Equipment)
' Query: Find equipment WHERE this PC is the controller (machineid = this PC)
strSQL = "SELECT mr.related_machineid AS equipmentid, m.machinenumber, m.alias " & _
        "FROM machinerelationships mr " & _
        "JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid " & _
        "LEFT JOIN machines m ON mr.related_machineid = m.machineid " & _
        "WHERE mr.machineid = ? AND rt.relationshiptype = 'Controls' AND mr.isactive = 1"

Template: Copy displaymachine.asp tabs structure, add Controlled Equipment section in Relationships tab


3. editpc.asp - PC Edit Page

Status: COMPLETE (Updated: 2025-11-10 10:52) Location: /home/camp/projects/windows/shopdb/editpc.asp

Current State:

  • May query pc table
  • May query pc_network_interfaces
  • May query pc_dualpath_assignments

Required Changes:

  • Check if file exists, create if needed (may be editpc.asp or need to create pc_edit.asp)
  • Update main query to use machines WHERE pctypeid IS NOT NULL
  • Update network interfaces to use communications table
  • Update dualpath to use machinerelationships with 'Dualpath' type
  • Fix column names:
    • ipaddressaddress in communications
    • pcidmachineid
    • notesmachinenotes
  • Convert all text fields to strings with & "" for HTMLEncode
  • Add controlled equipment section (PCs can control multiple equipment)
  • Test form submission
  • Verify data saves correctly
  • Test with PCs that have special characters in text fields

Main Query Example:

' Mirror machine_edit.asp main query, change WHERE clause for PCs
strSQL = "SELECT m.*, " &_
        "mo.modelnumber, mo.vendorid AS modelvendorid, mo.machinetypeid, mo.image AS modelimage, " &_
        "v.vendor, " &_
        "bu.businessunit, " &_
        "pt.pctype " &_
        "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 pctypes pt ON m.pctypeid = pt.pctypeid " &_
        "WHERE m.machineid = ? AND m.pctypeid IS NOT NULL"

' Load data with string conversion (CRITICAL for HTMLEncode)
Dim hostname, alias, machinenotes, serialnumber
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") & ""
serialnumber = "" : If NOT IsNull(rsMachine("serialnumber")) Then serialnumber = rsMachine("serialnumber") & ""

Network Query Example:

' Same as machine_edit.asp - use communications table
strSQL = "SELECT address, macaddress FROM communications WHERE machineid = ? AND isactive = 1 ORDER BY isprimary DESC"

' Load with string conversion
Dim ip1, mac1, ip2, mac2, ip3, mac3
ip1 = "" : mac1 = "" : ip2 = "" : mac2 = "" : ip3 = "" : mac3 = ""

While NOT rsComms.EOF AND interfaceCount < 3
    If interfaceCount = 1 Then
        If NOT IsNull(rsComms("address")) Then ip1 = rsComms("address") & ""
        If NOT IsNull(rsComms("macaddress")) Then mac1 = rsComms("macaddress") & ""
    ' ... etc
Wend

Controlling Equipment Query:

' PCs can control multiple pieces of equipment (Controls is PC → Equipment)
' Query: Find equipment WHERE this PC (machineid) is the controller
strSQL = "SELECT mr.related_machineid AS equipmentid FROM machinerelationships mr " &_
        "JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid " &_
        "WHERE mr.machineid = ? AND rt.relationshiptype = 'Controls' AND mr.isactive = 1"

' Note: This is OPPOSITE of machine_edit.asp where we query for controlling PC
' Machine: WHERE mr.related_machineid = ? (find PC that controls THIS equipment)
' PC: WHERE mr.machineid = ? (find equipment that THIS PC controls)

Dualpath Query:

' Same as machine_edit.asp
strSQL = "SELECT related_machineid FROM machinerelationships mr " &_
        "JOIN relationshiptypes rt ON mr.relationshiptypeid = rt.relationshiptypeid " &_
        "WHERE mr.machineid = ? AND rt.relationshiptype = 'Dualpath' AND mr.isactive = 1"

Template: Copy machine_edit.asp structure exactly, adjust:

  1. WHERE clause: m.pctypeid IS NOT NULL instead of IS NULL
  2. Relationships: Show controlled equipment instead of controlling PC
  3. Form fields: May need PC-specific fields (pctype dropdown, etc.)

Column Mapping Reference

PC Table → Machines Table

Old (pc table) New (machines table) Notes
pcid machineid Primary key
hostname hostname Same
serialnumber serialnumber Same
alias alias Same
pctypeid pctypeid Must be NOT NULL for PCs
loggedinuser loggedinuser Same
notes machinenotes Column renamed
modelnumberid modelnumberid Same
businessunitid businessunitid Same
printerid printerid Same
osid osid Same
machinestatusid machinestatusid Same
mapleft mapleft Same
maptop maptop Same
dateadded dateadded Same
lastupdated lastupdated Same
isactive isactive Same

PC Network Interfaces → Communications

Old (pc_network_interfaces) New (communications) Notes
interfaceid comid Primary key renamed
pcid machineid Foreign key renamed
ipaddress address Column renamed
macaddress macaddress Same
interfacename interfacename Same
isprimary isprimary Same
comstypeid comstypeid Same
isactive isactive Same

PC Dualpath → Machine Relationships

Old (pc_dualpath_assignments) New (machinerelationships) Notes
assignmentid relationshipid Primary key
pcid machineid First machine in relationship
dualpath_pcid related_machineid Second machine in relationship
N/A relationshiptypeid NEW: FK to relationshiptypes
N/A Must filter by relationshiptype = 'Dualpath' Bidirectional relationship

Testing Checklist

After Each Page Migration:

  • Page loads without 500 errors
  • All data displays correctly
  • No "Item cannot be found in collection" errors
  • Links work correctly
  • Edit functionality works (if applicable)
  • Data saves correctly (if applicable)
  • Check logs for any errors
  • Test with multiple PCs
  • Test with PCs that have NULL values
  • Test with PCs that have relationships

Integration Testing:

  • displaypcs.asp → displaypc.asp navigation works
  • displaypc.asp → pc_edit.asp navigation works
  • pc_edit.asp saves and redirects correctly
  • Dualpath relationships display correctly
  • Controlling equipment relationships display correctly
  • Network interfaces display correctly
  • All tabs load correctly (if applicable)

Known Issues from Machine Migration

Reference these to avoid similar problems when migrating PC pages:

1. Column Name Errors

Issue: Using wrong column names causes "Item cannot be found" errors Solution: Always verify column names against actual database schema

Common Mistakes:

  • ipaddress → should be address in communications table
  • notes → should be machinenotes in machines table
  • function → should be functionalaccount in functionalaccounts table
  • pcid → should be machineid in machines table

2. Type Mismatch with HTMLEncode

Issue: Type_mismatch:_'HTMLEncode' error on line containing Server.HTMLEncode() Cause: Text fields not explicitly converted to strings Solution: Always concatenate & "" when loading text from recordset

CRITICAL - Apply to ALL PC Pages:

' WRONG - will cause type mismatch with special characters
hostname = rsMachine("hostname")
alias = rsMachine("alias")
machinenotes = rsMachine("machinenotes")

' CORRECT - explicitly convert to string
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") & ""

Test with: PCs that have pipe characters (|), quotes, or other special characters in text fields

3. Missing Columns in SELECT

Issue: Dropdowns fail because ID columns missing Solution: Always include ID columns (vendorid, modelnumberid, pctypeid, etc.) even if only displaying names

Example:

' WRONG - only includes names
SELECT vendor, modelnumber, businessunit

' CORRECT - includes both IDs and names
SELECT v.vendor, v.vendorid, mo.modelnumber, mo.modelnumberid, bu.businessunit, bu.businessunitid

4. Relationship Direction

Issue: Wrong relationships displayed or pre-filled Solution: Understand relationship direction and query accordingly

Controls Relationship (One-Way: PC → Equipment):

' For EQUIPMENT page - find controlling PC:
WHERE mr.related_machineid = ? AND rt.relationshiptype = 'Controls'
SELECT mr.machineid  -- Returns the PC that controls this equipment

' 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 (Bidirectional: PC ↔ PC):

' Same query for both PCs
WHERE mr.machineid = ? AND rt.relationshiptype = 'Dualpath'
SELECT mr.related_machineid

5. LEFT JOIN for Optional Relationships

Issue: Query fails or returns no data when optional table has NULL Solution: Use LEFT JOIN for optional relationships

Required JOINs (INNER):

  • models (every machine has a model)
  • vendors (every model has a vendor)
  • businessunits (every machine has a business unit)

Optional JOINs (LEFT):

  • pctypes (NULL for equipment, NOT NULL for PCs)
  • machinetypes (only for equipment with machine types)
  • functionalaccounts (optional)
  • printers (optional)
  • operatingsystems (optional)

6. IIS Caching Issues

Issue: HTTP 414 "URL Too Long" errors or changes not reflecting Solution:

  • Touch file after edits: touch filename.asp
  • If 414 persists, rename file to new name
  • Clear browser cache when testing

Success Criteria

Migration Complete When:

  1. All three PC pages load without errors
  2. PC list displays correctly
  3. Individual PC view shows all data
  4. PC edit form loads and saves correctly
  5. Network interfaces display correctly
  6. Dualpath relationships display correctly
  7. Controlling equipment relationships display correctly (if applicable)
  8. No references to pc or pc_network_interfaces tables remain
  9. All functionality matches machine pages

Timeline

Estimated Time: 4-6 hours

  • displaypcs.asp: 1-2 hours
  • displaypc.asp: 2-3 hours
  • editpc.asp / pc_edit.asp: 1-2 hours
  • Testing: 1 hour

Priority: High - Should be completed before next production deployment


  • /home/camp/projects/windows/shopdb/BUGFIX_2025-11-07.md - Machine migration fixes
  • /home/camp/projects/windows/shopdb/MACHINE_MANAGEMENT_COMPLETE.md - Machine implementation
  • /home/camp/projects/windows/shopdb/MACHINE_EDIT_FORM_IMPLEMENTATION.md - Edit form details
  • /home/camp/projects/windows/shopdb/sql/migration_phase2/ - Phase 2 SQL migration scripts

Created: 2025-11-07 Completed: 2025-11-10 Status: COMPLETE Documentation: See PHASE2_PC_MIGRATION_COMPLETE.md for full details