PSA/ee/docs/plans/2026-04-16-service-request-template-starter-pack-design.md
Hermes 284313f908
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
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

296 lines
11 KiB
Markdown

# Service Request Template Starter Pack Design
Date: 2026-04-16
Slug: `service-request-template-starter-pack`
## Summary
Define a stronger built-in service request starter pack for common MSP portal services. The current CE starter pack contains a single `New Hire` template. This design expands the pack to six practical, high-frequency templates that work well with the current CE architecture and field builder, while remaining future-friendly for richer EE workflow variants.
The selected pack is:
1. New Hire Onboarding
2. Employee Offboarding
3. Access Request
4. Hardware Request
5. Software / License Request
6. Shared Mailbox / Distribution List Request
## Current-State Findings
Review of the current implementation shows:
1. Templates are provider-owned in-memory definitions, not database-backed entities.
2. CE currently ships one built-in template in `server/src/lib/service-requests/providers/builtins/starterTemplateProvider.ts`.
3. Template instantiation already creates ordinary draft definitions with no persistent template linkage.
4. The current CE-safe basic form field types are:
- `short-text`
- `long-text`
- `select`
- `checkbox`
- `date`
- `file-upload`
5. Built-in CE templates should remain compatible with:
- `ticket-only` execution
- `basic` form behavior
- `all-authenticated-client-users` visibility
6. The original service request PRD explicitly called out demand around:
- new hire onboarding
- offboarding
- access requests
- hardware requests
- software/license provisioning
This means the best v1 template expansion is not a new architecture. It is a content expansion within the existing provider seam.
## Recommended Approach
Use a **core MSP service desk starter pack**.
Why:
1. It matches the original PRD examples and user demand.
2. It provides immediate value in CE with `ticket-only` execution.
3. It avoids niche or environment-specific templates that many MSPs would delete immediately.
4. It leaves clean room for EE variants later without changing the template contract.
## Design Decisions Confirmed
The approved design choices are:
1. **Template set:** Option A lifecycle/service-desk pack, plus the mailbox/group request template.
2. **Count:** Six templates.
3. **Language:** Vendor-neutral overall, with a light Microsoft 365 bias where natural.
4. **Field density:** Balanced forms, roughly 6-10 fields per template.
5. **Approval-ish fields:** Lightweight only, such as justification, needed-by date, and occasional manager name.
6. **Categories:** Use suggested grouping labels in the design, but leave built-in template `category_id` unset in v1.
7. **Naming convention:** Prefer process-style names over uniform `Request` suffixes.
## Product Rules
1. All built-in templates remain ordinary starter definitions after creation.
2. No new database tables or schema changes are required.
3. No template should assume EE workflow execution to be useful.
4. Each template should be publishable as-is after routing configuration, but still easy to trim or adapt.
5. Template copy should feel polished and service-oriented rather than generic or overly technical.
6. Built-in templates should not match or create tenant `service_categories` rows as a side effect.
## Starter Pack Definition
### 1. New Hire Onboarding
- **Suggested grouping:** People (left unset in template metadata)
- **Icon:** `user-plus`
- **Portal name:** `New Hire Onboarding`
- **Description:** `Request setup for a new employee joining your organization.`
- **Default ticket title:** `New Hire Onboarding: {{employee_name}}`
**Fields**
- `employee_name` — short-text — required
- `start_date` — date — required
- `job_title` — short-text — optional
- `department` — short-text — optional
- `manager_name` — short-text — optional
- `work_location` — select — required
- Office
- Remote
- Hybrid
- `employment_type` — select — optional
- Full-time
- Part-time
- Contractor
- Temporary
- `device_requirements` — long-text — optional
- `software_access_needed` — long-text — optional
### 2. Employee Offboarding
- **Suggested grouping:** People (left unset in template metadata)
- **Icon:** `user-minus`
- **Portal name:** `Employee Offboarding`
- **Description:** `Request account shutdown and return handling for a departing employee.`
- **Default ticket title:** `Employee Offboarding: {{employee_name}}`
**Fields**
- `employee_name` — short-text — required
- `last_working_date` — date — required
- `department` — short-text — optional
- `manager_name` — short-text — optional
- `disable_access_immediately` — checkbox — optional
- `recover_company_equipment` — checkbox — optional
- `mailbox_forwarding_contact` — short-text — optional
- `offboarding_notes` — long-text — optional
### 3. Access Request
- **Suggested grouping:** Access (left unset in template metadata)
- **Icon:** `key`
- **Portal name:** `Access Request`
- **Description:** `Request new, changed, or removed access to a system or application.`
- **Default ticket title:** `Access Request: {{requested_for}} - {{application_or_system}}`
**Fields**
- `requested_for` — short-text — required
- `application_or_system` — short-text — required
- `request_type` — select — required
- New access
- Change existing access
- Remove access
- `access_level_needed` — short-text — optional
- `needed_by_date` — date — optional
- `business_justification` — long-text — required
- `manager_name` — short-text — optional
- `supporting_attachment` — file-upload — optional
### 4. Hardware Request
- **Suggested grouping:** Devices & Software (left unset in template metadata)
- **Icon:** `laptop`
- **Portal name:** `Hardware Request`
- **Description:** `Request new equipment, replacement hardware, or accessories.`
- **Default ticket title:** `Hardware Request: {{requested_for}} - {{hardware_type}}`
**Fields**
- `requested_for` — short-text — required
- `hardware_type` — select — required
- Laptop
- Desktop
- Monitor
- Dock
- Phone
- Accessory
- Other
- `quantity` — short-text — required
- default: `1`
- `request_reason` — select — optional
- New equipment
- Replacement
- Upgrade
- Loaner
- Other
- `needed_by_date` — date — optional
- `delivery_location` — short-text — optional
- `business_justification` — long-text — required
- `additional_details` — long-text — optional
### 5. Software / License Request
- **Suggested grouping:** Devices & Software (left unset in template metadata)
- **Icon:** `app-window`
- **Portal name:** `Software / License Request`
- **Description:** `Request software installation, license provisioning, or additional seats.`
- **Default ticket title:** `Software / License Request: {{requested_for}} - {{software_name}}`
**Fields**
- `requested_for` — short-text — required
- `software_name` — short-text — required
- `platform` — select — optional
- Windows
- macOS
- Web
- Mobile
- Other
- `license_type_or_edition` — short-text — optional
- `needed_by_date` — date — optional
- `business_justification` — long-text — required
- `manager_name` — short-text — optional
- `vendor_quote_or_screenshot` — file-upload — optional
- `additional_details` — long-text — optional
### 6. Shared Mailbox / Distribution List Request
- **Suggested grouping:** Collaboration (left unset in template metadata)
- **Icon:** `mail`
- **Portal name:** `Shared Mailbox / Distribution List Request`
- **Description:** `Request a shared mailbox, distribution list, or Microsoft 365 group.`
- **Default ticket title:** `Mailbox / Group Request: {{mailbox_or_group_name}}`
**Fields**
- `request_type` — select — required
- Shared mailbox
- Distribution list
- Microsoft 365 group
- `mailbox_or_group_name` — short-text — required
- `primary_owner` — short-text — required
- `additional_members` — long-text — optional
- `allow_external_senders` — checkbox — optional
- `department_or_team` — short-text — optional
- `needed_by_date` — date — optional
- `business_purpose` — long-text — required
- `additional_notes` — long-text — optional
## Default Provider Selections
For all six templates, the initial draft should use:
- **Execution provider:** `ticket-only`
- **Form behavior provider:** `basic`
- **Visibility provider:** `all-authenticated-client-users`
- **Linked service:** unset
This keeps the starter pack fully usable in CE and preserves the expected template-instantiation behavior.
## Category Strategy
Use category groupings as design guidance only, but leave built-in template category metadata unset in v1.
Suggested groupings are:
- **People**
- New Hire Onboarding
- Employee Offboarding
- **Access**
- Access Request
- **Devices & Software**
- Hardware Request
- Software / License Request
- **Collaboration**
- Shared Mailbox / Distribution List Request
This avoids coupling starter templates to tenant-specific `service_categories` rows or silently creating billing/service taxonomy records during template instantiation.
## Naming Strategy
Use **process-style names** in the template picker and default metadata:
- `New Hire Onboarding`
- `Employee Offboarding`
- `Access Request`
- `Hardware Request`
- `Software / License Request`
- `Shared Mailbox / Distribution List Request`
This is preferable to making every item a uniform `... Request` label because it feels more service-oriented and less like raw ticket form duplication.
## Implementation Shape
Likely touchpoints:
- `server/src/lib/service-requests/providers/builtins/starterTemplateProvider.ts`
- any tests covering template discovery and template draft creation
- possibly management-page tests that assert template options or template creation behavior
## Testing Focus
Add or update tests for:
1. template provider discovery returning the expanded CE starter pack
2. each template producing a valid draft shape
3. select fields including valid option lists
4. file-upload fields being accepted in template form schemas
5. default execution, form behavior, and visibility providers remaining CE-safe
6. null category assignment, icon, and ticket title templates being stored correctly on instantiation
## Non-Goals
This design does not include:
1. new database entities for templates
2. EE-only workflow-specific template variants
3. conditional field behavior in CE templates
4. template marketplace or tenant-installable packs
5. service-specific routing defaults such as board/category lookup heuristics
## Conclusion
The right v1 move is to strengthen the built-in starter pack with six broadly useful MSP service templates, using balanced forms, light M365 bias where natural, and polished process-style naming. This improves first-run value without changing the underlying service request architecture.