Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
349 lines
11 KiB
Markdown
349 lines
11 KiB
Markdown
# Asset Management System
|
|
|
|
The Asset Management System is a comprehensive solution for managing IT assets within our MSP PSA platform. It provides robust capabilities for tracking, managing, and optimizing IT assets across multiple clients.
|
|
|
|
## Core Features
|
|
|
|
### Asset Types and Classification
|
|
- Type-specific extension tables for specialized attributes
|
|
- Dedicated tables for each built-in asset type (workstation, server, network device, etc.)
|
|
|
|
Asset types are defined per tenant in an asset type registry — six built-in types
|
|
plus any custom types a tenant adds, each with its own custom fields. An asset's
|
|
`asset_type` column holds the type's slug. See
|
|
[Custom Asset Types](./custom_asset_types.md) for the registry, slug rules, field
|
|
schemas, and the Hudu import mapping.
|
|
|
|
### Asset Tracking
|
|
- Unique asset identification
|
|
- Serial number tracking
|
|
- Location management (free-text `location` field and structured `location_id` FK to `client_locations`)
|
|
- Warranty tracking
|
|
- Client association
|
|
- Status management
|
|
|
|
### Location Linking
|
|
|
|
Assets can be linked to a saved client location record (`client_locations`) via the `location_id` UUID field, in addition to the free-text `location` string. When a saved location is selected in the UI, the formatted address is auto-populated into the free-text field but can be overridden with a more specific descriptor (e.g. "Server room — Rack 3").
|
|
|
|
The REST API (`GET /api/v1/assets`, `POST /api/v1/assets`, `PUT /api/v1/assets/:id`) includes `location_id` as an optional nullable UUID on create, update, and read payloads. The list endpoint accepts `location_id` as a query filter to retrieve all assets at a specific site. The server validates that the supplied `location_id` belongs to the asset's client (active locations only); changing the client without supplying a new `location_id` automatically clears any stale location association.
|
|
|
|
### Bulk Asset Actions
|
|
|
|
The asset dashboard supports three bulk operations accessible from the action bar at the bottom of the asset list:
|
|
|
|
- **Set Status** — update the status of up to 100 selected assets at once.
|
|
- **Set Location** — assign a saved client location, enter a custom free-text location, or clear the location for up to 100 selected assets at once.
|
|
- **Delete** — permanently delete up to 100 selected assets, with a confirmation dialog before proceeding.
|
|
|
|
Bulk operations run with controlled concurrency (5 at a time) and produce a per-asset success/failure report via toast notifications.
|
|
|
|
### Asset Relationships
|
|
- Parent/child relationship tracking
|
|
- Circular dependency prevention
|
|
- Relationship type support
|
|
- Hierarchical asset views
|
|
|
|
### Maintenance Management
|
|
- Preventive maintenance scheduling
|
|
- Service history tracking
|
|
- Notification system
|
|
- Compliance monitoring
|
|
- Maintenance type categorization
|
|
|
|
### History and Audit
|
|
- Complete change history
|
|
- User action tracking
|
|
- Modification timestamps
|
|
- Structured change tracking
|
|
|
|
## Database Schema
|
|
|
|
### Asset Types
|
|
```sql
|
|
CREATE TABLE asset_types (
|
|
tenant UUID NOT NULL REFERENCES tenants,
|
|
type_id UUID DEFAULT gen_random_uuid() NOT NULL,
|
|
type_name TEXT NOT NULL,
|
|
parent_type_id UUID,
|
|
attributes_schema JSONB, -- Flexible schema definition for type-specific attributes
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (tenant, type_id),
|
|
FOREIGN KEY (tenant, parent_type_id) REFERENCES asset_types(tenant, type_id)
|
|
);
|
|
```
|
|
|
|
### Assets
|
|
```sql
|
|
CREATE TABLE assets (
|
|
tenant UUID NOT NULL REFERENCES tenants,
|
|
asset_id UUID DEFAULT gen_random_uuid() NOT NULL,
|
|
type_id UUID NOT NULL,
|
|
client_id UUID NOT NULL, -- Client association
|
|
asset_tag TEXT NOT NULL,
|
|
serial_number TEXT,
|
|
name TEXT NOT NULL,
|
|
status TEXT NOT NULL,
|
|
location TEXT,
|
|
location_id UUID, -- Optional FK to client_locations; validated against the asset's client
|
|
purchase_date DATE,
|
|
warranty_end_date DATE,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (tenant, asset_id),
|
|
FOREIGN KEY (tenant, type_id) REFERENCES asset_types(tenant, type_id),
|
|
FOREIGN KEY (tenant, client_id) REFERENCES clients(tenant, client_id),
|
|
FOREIGN KEY (tenant, location_id) REFERENCES client_locations(tenant, location_id)
|
|
);
|
|
```
|
|
|
|
### Asset Extension Tables
|
|
|
|
#### Workstation Assets
|
|
```sql
|
|
CREATE TABLE workstation_assets (
|
|
tenant UUID NOT NULL,
|
|
asset_id UUID NOT NULL,
|
|
os_type TEXT,
|
|
os_version TEXT,
|
|
cpu_model TEXT,
|
|
cpu_cores INTEGER,
|
|
ram_gb INTEGER,
|
|
storage_type TEXT,
|
|
storage_capacity_gb INTEGER,
|
|
gpu_model TEXT,
|
|
last_login TIMESTAMP,
|
|
installed_software JSONB DEFAULT '[]',
|
|
PRIMARY KEY (tenant, asset_id),
|
|
FOREIGN KEY (tenant, asset_id) REFERENCES assets(tenant, asset_id) ON DELETE CASCADE
|
|
);
|
|
```
|
|
|
|
#### Network Device Assets
|
|
```sql
|
|
CREATE TABLE network_device_assets (
|
|
tenant UUID NOT NULL,
|
|
asset_id UUID NOT NULL,
|
|
device_type TEXT NOT NULL,
|
|
management_ip TEXT,
|
|
port_count INTEGER,
|
|
firmware_version TEXT,
|
|
supports_poe BOOLEAN DEFAULT false,
|
|
power_draw_watts DECIMAL(8,2),
|
|
vlan_config JSONB DEFAULT '{}',
|
|
port_config JSONB DEFAULT '{}',
|
|
PRIMARY KEY (tenant, asset_id),
|
|
FOREIGN KEY (tenant, asset_id) REFERENCES assets(tenant, asset_id) ON DELETE CASCADE
|
|
);
|
|
```
|
|
|
|
### Asset Relationships
|
|
```sql
|
|
CREATE TABLE asset_relationships (
|
|
tenant UUID NOT NULL,
|
|
parent_asset_id UUID NOT NULL,
|
|
child_asset_id UUID NOT NULL,
|
|
relationship_type TEXT NOT NULL,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (tenant, parent_asset_id, child_asset_id),
|
|
FOREIGN KEY (tenant, parent_asset_id) REFERENCES assets(tenant, asset_id) ON DELETE CASCADE,
|
|
FOREIGN KEY (tenant, child_asset_id) REFERENCES assets(tenant, asset_id) ON DELETE CASCADE
|
|
);
|
|
```
|
|
|
|
### Maintenance Scheduling
|
|
```sql
|
|
CREATE TABLE asset_maintenance_schedules (
|
|
tenant UUID NOT NULL,
|
|
schedule_id UUID DEFAULT gen_random_uuid() NOT NULL,
|
|
asset_id UUID NOT NULL,
|
|
schedule_name TEXT NOT NULL,
|
|
description TEXT,
|
|
maintenance_type TEXT NOT NULL,
|
|
frequency TEXT NOT NULL,
|
|
frequency_interval INTEGER NOT NULL,
|
|
schedule_config JSONB NOT NULL,
|
|
last_maintenance TIMESTAMP,
|
|
next_maintenance TIMESTAMP NOT NULL,
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_by UUID NOT NULL,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (tenant, schedule_id),
|
|
FOREIGN KEY (tenant, asset_id) REFERENCES assets(tenant, asset_id) ON DELETE CASCADE,
|
|
FOREIGN KEY (tenant, created_by) REFERENCES users(tenant, user_id)
|
|
);
|
|
```
|
|
|
|
### Asset History
|
|
```sql
|
|
CREATE TABLE asset_history (
|
|
tenant UUID NOT NULL REFERENCES tenants,
|
|
history_id UUID DEFAULT gen_random_uuid() NOT NULL,
|
|
asset_id UUID NOT NULL,
|
|
changed_by UUID NOT NULL,
|
|
change_type TEXT NOT NULL,
|
|
changes JSONB NOT NULL,
|
|
changed_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (tenant, history_id),
|
|
FOREIGN KEY (tenant, asset_id) REFERENCES assets(tenant, asset_id),
|
|
FOREIGN KEY (tenant, changed_by) REFERENCES users(tenant, user_id)
|
|
);
|
|
```
|
|
|
|
## Implementation Phases
|
|
|
|
### Phase 1: Core Asset Management ✓
|
|
- Basic asset tracking ✓
|
|
- Type system implementation ✓
|
|
- Client association ✓
|
|
- History tracking ✓
|
|
- Database schema ✓
|
|
- Core models and interfaces ✓
|
|
- Server actions ✓
|
|
|
|
### Phase 2: Service Integration ✓
|
|
- Ticket integration ✓
|
|
- Link assets to tickets ✓
|
|
- Asset-based ticket creation ✓
|
|
- Service history tracking ✓
|
|
- Document management ✓
|
|
- Asset documentation ✓
|
|
- Attachment support ✓
|
|
- Version control ✓
|
|
- Maintenance scheduling ✓
|
|
- Preventive maintenance ✓
|
|
- Service calendars ✓
|
|
- Notification system ✓
|
|
- Basic reporting ✓
|
|
- Asset inventory reports ✓
|
|
- Client asset summaries ✓
|
|
- Maintenance histories ✓
|
|
|
|
### Phase 3: Advanced Features ✓
|
|
- Asset relationships ✓
|
|
- Dependency mapping ✓
|
|
- Impact analysis ✓
|
|
- Service mapping ✓
|
|
- Type-specific attributes ✓
|
|
- Extension tables ✓
|
|
- Specialized fields ✓
|
|
- Efficient querying ✓
|
|
- Location linking ✓
|
|
- Structured FK to client_locations ✓
|
|
- REST API location_id field and filter ✓
|
|
- Client validation on create/update ✓
|
|
- Bulk asset actions ✓
|
|
- Set status ✓
|
|
- Set location ✓
|
|
- Delete ✓
|
|
- Advanced reporting
|
|
- Custom report builder
|
|
- Dashboard integration
|
|
- Export capabilities
|
|
- SLA monitoring
|
|
- Service level tracking
|
|
- Performance metrics
|
|
- Compliance reporting
|
|
- Warranty tracking
|
|
- Expiration alerts
|
|
- Renewal management
|
|
- Coverage tracking
|
|
|
|
### Phase 4: Automation and Intelligence
|
|
- Predictive maintenance
|
|
- Failure prediction
|
|
- Maintenance optimization
|
|
- Cost forecasting
|
|
- Asset lifecycle recommendations
|
|
- Replacement planning
|
|
- Upgrade suggestions
|
|
- EOL management
|
|
- Risk assessment
|
|
- Security analysis
|
|
- Compliance checking
|
|
- Vulnerability tracking
|
|
- Cost analysis
|
|
- TCO calculations
|
|
- ROI analysis
|
|
- Budget planning
|
|
|
|
## Technical Implementation
|
|
|
|
### Models and Interfaces
|
|
- Asset interfaces for type safety
|
|
- Extension table models for type-specific data
|
|
- Relationship management with cycle detection
|
|
- History tracking implementation
|
|
- Tenant isolation support
|
|
|
|
### Server Actions
|
|
- Asset management operations
|
|
- Type management
|
|
- Relationship management
|
|
- Maintenance scheduling
|
|
- History tracking
|
|
- Cache invalidation
|
|
|
|
## Integration Points
|
|
|
|
### Existing Systems
|
|
- Document associations
|
|
- Ticket system
|
|
- Comments system
|
|
- Storage system
|
|
- Client portal
|
|
|
|
### Security Considerations
|
|
- Row-level security
|
|
- Tenant isolation
|
|
- Role-based access
|
|
- Audit logging
|
|
|
|
## Business Value
|
|
|
|
### Operational Benefits
|
|
- Streamlined asset tracking
|
|
- Reduced manual effort
|
|
- Improved accuracy
|
|
- Better resource allocation
|
|
- Type-specific data management
|
|
|
|
### Client Benefits
|
|
- Enhanced service delivery
|
|
- Better asset visibility
|
|
- Improved planning
|
|
- Cost optimization
|
|
- Maintenance compliance
|
|
|
|
### Compliance and Risk
|
|
- Better compliance management
|
|
- Risk reduction
|
|
- Audit readiness
|
|
- Security enhancement
|
|
- Relationship tracking
|
|
|
|
## Future Considerations
|
|
|
|
### Scalability
|
|
- Performance optimization
|
|
- Index management
|
|
- Query optimization
|
|
- Cache strategies
|
|
- Extension table partitioning
|
|
|
|
### Integration Expansion
|
|
- Third-party integrations
|
|
- Mobile access
|
|
- Client portal features
|
|
- Asset discovery integration
|
|
|
|
### Feature Enhancement
|
|
- AI/ML capabilities
|
|
- Automation expansion
|
|
- Reporting enhancement
|
|
- Analytics development
|
|
- Predictive maintenance
|