Multi-Site Inventory Tracking Portal
Quick summary
- Why it exists: No off-the-shelf tool hit the full operational checklist without turning into process overhead.
- What it answers: What's deployed, where it lives, how it's configured, and who owns it.
- What it tracks: Channels, lineups, site inventory, files in use, site contacts, plus flexible records.
- Access + ops: Session auth + admin controls, optional Active Directory sign-in, SSL/cert workflows, and Apache-side actions.
- Integrations: Lightweight hooks for Google Drive, Confluence, Jira, and AppSheet (easy to extend).
A tracking portal meant for real operations work: not just "track inventory," but capture what you need to understand what's deployed, where, how it's configured, and who owns it.
Chapter 1: Overview
The ask looked straightforward on paper and was painful in practice: build a single place where an operations team can quickly answer “what is deployed, where, how, and who owns it?” across many sites.
We evaluated the usual options. The problem wasn’t a lack of tools — it was that none of them matched the required checkboxes without forcing the team into a rigid schema, a heavy process, or a fragmented set of spreadsheets and links.
So we built a lightweight, login-protected portal that combines structured tracking (sites, inventory) with flexible records (for everything that evolves). It includes an admin Settings area for access control, SSL/HTTPS, and operational actions that keep the hosting layer maintainable.
Chapter 2: Requirements
- Hit a real-world operational checklist (not a “generic tracker”)
- Multiple sites with nested sub-sites
- Inventory tracked per site plus “what’s deployed here” context
- Track channels and lineups in a way that’s fast to update
- Track files in use (what’s referenced/active per site)
- Track site contacts / ownership (who to call, who approves)
- Flexible per-site records for evolving fields without constant schema migrations
- Admin controls for access, SSL/HTTPS, and operational hosting actions
- Optional Active Directory sign-in (LDAP), while keeping authorization local
Chapter 3: What it tracks
The core goal is completeness: if you’re trying to troubleshoot, plan a change, or hand off operations, this captures the “full picture” per site — not just a list of items.
- Sites & sub-sites: a hierarchy that mirrors real-world structure
- Site inventory: categorized items with model/version/quantity and notes
- Channels: channel identifiers and operational attributes
- Lineups: what is scheduled/assigned/deployed at a site
- Files in use: references to active files/assets and where they’re used
- Site contacts: ownership, escalation contacts, and operational notes
- Flexible records: custom record types that evolve as needs change
Chapter 4: Data model
The schema stays intentionally small so it remains easy to operate and extend. Structured tables cover the repeatable entities, and JSON-backed records cover the “always changing” details.
- Users: login identities with password hashes and last-login tracking
- Sites: hierarchical site tree via a nullable
ParentSiteID - Inventory: rows attached to a site (category/model/version/quantity + notes)
- SiteRecords: flexible per-site records with
FieldsJsonvalidated viaISJSON
Key mechanics:
- Site hierarchy is modeled via a self-referencing FK (
Sites.ParentSiteID) - Site-scoped rows reference
Sites.SiteID(cascading delete prevents orphans) - Indexes support common lookups (by parent site, by site, by category/type)
Chapter 5: API design
The backend follows a minimal JSON API approach designed for a small internal UI: predictable endpoints, session auth, and admin-only operations where appropriate.
login/logout/me: session-based auth and session introspectionsites: manage facilities and sub-sitesinventory: manage inventory; supports filtering (site/category)records+recordTypes: flexible per-site records with hierarchical site supportheaders: admin-managed UI column/label configurationsettings+dbTest: operational settings stored on-disk with a DB connectivity test pathsslUpload+networkingApply: support for SSL/HTTPS and networking workflowsusers+changePassword: user management and password rotationstats: dashboard rollups
Implementation notes:
- Requests are routed by an explicit
actionparameter (e.g.,?action=inventory) - Database access uses PDO (ODBC/SQL Server), with UI-configured settings and env var fallback
- Protected routes require an authenticated session; admin operations are gated by role/access checks
Browser UI | | HTTPS (recommended) v Apache HTTP Server | | Static UI + PHP JSON API (session auth) v MS SQL Server
Chapter 6: Operations & hosting
This portal is designed to be easy to run: simple hosting, predictable settings, and admin actions for the operational “sharp edges” (networking, SSL, and access management). It can coexist with other stacks already running in the environment.
Operational priorities:
- Clear separation of logs, runtime config, and service management
- Admin Settings for networking + SSL/cert workflows (upload/store/apply patterns)
- Integrated Apache-side apply actions (admin-only) to keep changes controlled and repeatable
- Access control that supports internal users and admin-only actions
Chapter 7: Integrations
Integrations in this setup are intentionally minimal — focused on fast linking and workflow alignment — but the architecture supports expanding into deeper, automated sync when needed.
- Google Drive: quick links to site docs, as-builts, and shared artifacts
- Confluence: documentation pages linked from site records
- Jira: ticket links for installs, maintenance, and incident follow-up
- AppSheet: lightweight task/workflow references (where applicable)
Chapter 8: Security notes
This design assumes a production posture where authentication and access are treated seriously:
- Store only password hashes (never plaintext) and require changing any bootstrap credentials
- Prefer HTTPS (certificate + HSTS) for any login-protected UI
- Use least-privilege DB credentials (reader/writer roles only as needed)
- Keep API responses generic on auth failures to reduce account enumeration
- If sensitive record payloads must be stored, encrypt at rest using an application-level key (e.g., an AES-256-GCM envelope)
Impact
Delivered a practical operational portal that hits the checklist: channels, lineups, site inventory, files-in-use references, contacts/ownership, and flexible records — all organized by a site/sub-site hierarchy.
The end result is faster troubleshooting, cleaner handoffs, and less “tribal knowledge” required to answer what’s deployed, where, and how.