PSA/docs/extensions/softwareone/softwareone-extension-phase5-subtasks.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

342 lines
10 KiB
Markdown

# Phase 5: API Integration & Storage - Detailed Subtasks
## Overview
Phase 5 focuses on replacing the current localStorage implementation with the proper ExtensionStorageService, implementing authenticated API calls to SoftwareOne, and creating billing integration for activated agreements.
## Prerequisites
- Phase 4 (Descriptor Architecture) completed
- Extension registry and storage tables created
- Basic UI components working with mock data
---
## 5.1 Extension Storage Integration
### 5.1.1 Create Storage Context Provider
**Description**: Implement a React context that provides storage access to all components using the ExtensionStorageService API.
**Files to create/modify**:
- `/extensions/softwareone-ext/src/contexts/StorageContext.tsx` (create)
- `/extensions/softwareone-ext/src/hooks/useStorage.ts` (create)
**Key implementation details**:
- Create StorageContext with get/set/delete/clear methods
- Implement useStorage hook for easy component access
- Handle async operations with proper loading states
- Include error handling and retry logic
- Support namespaced storage (e.g., 'settings', 'cache', 'user-prefs')
**Dependencies**: None
**Estimated effort**: 3 hours
---
### 5.1.2 Create Extension Storage API Endpoints
**Description**: Build server-side API endpoints that bridge the extension UI to the ExtensionStorageService.
**Files to create/modify**:
- `/server/src/pages/api/extensions/[extensionId]/storage/[...path].ts` (create)
- `/server/src/lib/extensions/storage/api-handlers.ts` (create)
**Key implementation details**:
- GET /api/extensions/:id/storage/:key - retrieve value
- PUT /api/extensions/:id/storage/:key - store value
- DELETE /api/extensions/:id/storage/:key - remove value
- GET /api/extensions/:id/storage - list keys
- Support batch operations for performance
- Implement proper tenant isolation
- Add rate limiting and quota enforcement
**Dependencies**: Extension registry must be working
**Estimated effort**: 4 hours
---
### 5.1.3 Migrate Settings Storage
**Description**: Replace localStorage usage in SettingsPageWrapper with ExtensionStorageService.
**Files to modify**:
- `/extensions/softwareone-ext/src/components/SettingsPageWrapper.tsx`
- `/extensions/softwareone-ext/src/pages/SettingsPage.tsx`
**Key implementation details**:
- Remove all localStorage calls
- Use storage.getNamespace('settings') for settings storage
- Implement migration logic for existing localStorage data
- Add loading states while fetching settings
- Handle storage errors gracefully
**Dependencies**: 5.1.1, 5.1.2
**Estimated effort**: 2 hours
---
### 5.1.4 Implement Agreement Cache Storage
**Description**: Create a caching layer for agreement data using ExtensionStorageService.
**Files to create/modify**:
- `/extensions/softwareone-ext/src/services/cacheService.ts` (create)
- `/extensions/softwareone-ext/src/hooks/useSwoneQuery.ts` (modify)
**Key implementation details**:
- Use storage.getNamespace('cache') for cached data
- Implement TTL-based expiration (e.g., 5 minutes for agreements)
- Create cache invalidation logic
- Support partial updates
- Add cache warming on initial load
**Dependencies**: 5.1.1, 5.1.2
**Estimated effort**: 3 hours
---
## 5.2 SoftwareOne API Client Integration
### 5.2.1 Implement API Authentication Service
**Description**: Create a service to manage API tokens and handle authentication with SoftwareOne.
**Files to create/modify**:
- `/extensions/softwareone-ext/src/services/authService.ts` (create)
- `/extensions/softwareone-ext/src/api/softwareOneClient.ts` (modify)
**Key implementation details**:
- Store encrypted API credentials in ExtensionStorageService
- Implement token refresh logic if needed
- Add request interceptor for authentication headers
- Handle 401/403 responses with re-authentication
- Support multiple authentication methods (API key, OAuth)
**Dependencies**: 5.1.3 (settings storage must be working)
**Estimated effort**: 4 hours
---
### 5.2.2 Create API Error Handling & Retry Logic
**Description**: Implement robust error handling for API calls with exponential backoff and circuit breaker patterns.
**Files to create/modify**:
- `/extensions/softwareone-ext/src/api/errorHandler.ts` (create)
- `/extensions/softwareone-ext/src/api/retryStrategy.ts` (create)
- `/extensions/softwareone-ext/src/api/softwareOneClient.ts` (modify)
**Key implementation details**:
- Implement exponential backoff for rate limiting (429 errors)
- Add circuit breaker to prevent cascading failures
- Create user-friendly error messages
- Log errors for debugging
- Support manual retry triggers
**Dependencies**: None
**Estimated effort**: 3 hours
---
### 5.2.3 Replace Mock Data with Real API Calls
**Description**: Update all components to use real SoftwareOne API instead of dummy data.
**Files to modify**:
- `/extensions/softwareone-ext/src/hooks/useSwoneQuery.ts`
- `/extensions/softwareone-ext/src/handlers/activateAgreement.ts`
- `/extensions/softwareone-ext/src/handlers/runSync.ts`
- `/extensions/softwareone-ext/src/services/syncService.ts`
- Remove: `/extensions/softwareone-ext/src/data/dummy*.ts`
**Key implementation details**:
- Update useSwoneQuery to use real API client
- Implement proper data transformations
- Add loading and error states
- Support pagination for large datasets
- Cache API responses appropriately
**Dependencies**: 5.2.1, 5.2.2, 5.1.4
**Estimated effort**: 4 hours
---
### 5.2.4 Implement Data Synchronization Service
**Description**: Create a background service that periodically syncs data from SoftwareOne.
**Files to create/modify**:
- `/extensions/softwareone-ext/src/services/backgroundSync.ts` (create)
- `/extensions/softwareone-ext/src/workers/syncWorker.ts` (create)
**Key implementation details**:
- Use Web Workers for background processing
- Implement incremental sync (only changed data)
- Store sync state in ExtensionStorageService
- Add sync status indicators to UI
- Support manual sync triggers
- Handle offline scenarios
**Dependencies**: 5.2.3, 5.1.4
**Estimated effort**: 5 hours
---
## 5.3 Billing Integration
### 5.3.1 Create Invoice Line Item Generator
**Description**: Build service to convert SoftwareOne statements into Alga PSA invoice line items.
**Files to create**:
- `/extensions/softwareone-ext/src/services/billingService.ts`
- `/extensions/softwareone-ext/src/types/billing.ts`
- `/extensions/softwareone-ext/src/mappers/statementToInvoiceMapper.ts`
**Key implementation details**:
- Map SoftwareOne products to Alga service catalog
- Calculate markup based on agreement settings
- Support multiple currencies
- Handle tax calculations
- Create detailed line item descriptions
- Support bulk statement imports
**Dependencies**: None
**Estimated effort**: 5 hours
---
### 5.3.2 Implement Service Catalog Mapping
**Description**: Create UI and logic for mapping SoftwareOne products to Alga PSA services.
**Files to create/modify**:
- `/extensions/softwareone-ext/src/pages/ServiceMapping.tsx` (create)
- `/extensions/softwareone-ext/src/components/ServiceMappingTable.tsx` (create)
- `/extensions/softwareone-ext/src/services/mappingService.ts` (create)
**Key implementation details**:
- Store mappings in ExtensionStorageService
- Support automatic mapping suggestions
- Allow manual override of mappings
- Bulk mapping operations
- Import/export mapping configurations
- Validate mappings before use
**Dependencies**: 5.1.1, 5.1.2
**Estimated effort**: 4 hours
---
### 5.3.3 Create Invoice Preview Component
**Description**: Build a component to preview invoice line items before import.
**Files to create**:
- `/extensions/softwareone-ext/src/components/InvoicePreview.tsx`
- `/extensions/softwareone-ext/src/components/LineItemEditor.tsx`
**Key implementation details**:
- Display calculated line items with markup
- Allow editing before import
- Show totals and tax calculations
- Support line item grouping
- Add/remove/modify line items
- Export to CSV/Excel
**Dependencies**: 5.3.1
**Estimated effort**: 4 hours
---
### 5.3.4 Implement Invoice Import API
**Description**: Create server action to import statement data into Alga PSA invoices.
**Files to create/modify**:
- `/server/src/lib/actions/extension-actions.ts` (modify)
- `/extensions/softwareone-ext/src/handlers/importToInvoice.ts` (create)
**Key implementation details**:
- Create server action for invoice line item creation
- Support draft and final invoice states
- Handle duplicate detection
- Implement transaction rollback on errors
- Create audit trail for imports
- Support batch imports
**Dependencies**: 5.3.1, 5.3.3
**Estimated effort**: 5 hours
---
### 5.3.5 Add Billing Automation Rules
**Description**: Implement configurable rules for automatic statement processing.
**Files to create**:
- `/extensions/softwareone-ext/src/pages/AutomationRules.tsx`
- `/extensions/softwareone-ext/src/services/automationService.ts`
- `/extensions/softwareone-ext/src/types/automation.ts`
**Key implementation details**:
- Define rule types (markup %, fixed fee, tiered pricing)
- Store rules in ExtensionStorageService
- Create rule evaluation engine
- Support conditional rules based on products/amounts
- Preview rule effects before applying
- Schedule automatic imports
**Dependencies**: 5.3.1, 5.3.2
**Estimated effort**: 6 hours
---
## Testing Requirements
### Unit Tests
- Storage service integration tests
- API client tests with mocked responses
- Billing calculation tests
- Mapper function tests
### Integration Tests
- End-to-end storage operations
- API authentication flow
- Complete statement import process
### E2E Tests
- Full workflow from settings to invoice creation
- Error handling scenarios
- Offline functionality
---
## Total Estimated Effort
- **5.1 Extension Storage Integration**: 12 hours
- **5.2 SoftwareOne API Client**: 16 hours
- **5.3 Billing Integration**: 24 hours
- **Testing**: 8 hours
**Total Phase 5**: 60 hours (7.5 days)
---
## Risk Mitigation
1. **API Changes**: Version the API client to handle future SoftwareOne API changes
2. **Data Loss**: Implement backup/restore for critical mappings and settings
3. **Performance**: Use pagination and caching to handle large datasets
4. **Security**: Encrypt sensitive data (API keys) before storage
5. **Quota Limits**: Monitor storage usage and implement cleanup strategies
---
## Success Criteria
1. All localStorage usage replaced with ExtensionStorageService
2. Real SoftwareOne data displayed in UI
3. Successful statement import to invoice
4. Background sync operational
5. All tests passing
6. No regression in existing functionality