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

276 lines
7.7 KiB
JSON

[
{
"id": "T001",
"description": "Feature 15: Ticket detail API response includes contact_avatar_url when contact has avatar",
"implemented": true,
"featureIds": ["F001", "F003"]
},
{
"id": "T002",
"description": "Feature 15: Ticket detail API response includes client_logo_url when client has logo",
"implemented": true,
"featureIds": ["F002", "F003"]
},
{
"id": "T003",
"description": "Feature 15: contact_avatar_url is null when contact has no avatar",
"implemented": true,
"featureIds": ["F001", "F006"]
},
{
"id": "T004",
"description": "Feature 15: client_logo_url is null when client has no logo",
"implemented": true,
"featureIds": ["F002", "F006"]
},
{
"id": "T005",
"description": "Feature 15: Avatar URLs are null when ticket has no contact or client",
"implemented": true,
"featureIds": ["F001", "F002"]
},
{
"id": "T006",
"description": "Feature 15: Mobile shows Avatar with image next to contact name",
"implemented": true,
"featureIds": ["F004"]
},
{
"id": "T007",
"description": "Feature 15: Mobile shows Avatar with image next to client name",
"implemented": true,
"featureIds": ["F005"]
},
{
"id": "T008",
"description": "Feature 15: Mobile shows initials fallback when avatar/logo URL is null",
"implemented": true,
"featureIds": ["F006"]
},
{
"id": "T010",
"description": "Feature 10: GET /api/v1/tickets/{id}/documents returns document list for ticket",
"implemented": true,
"featureIds": ["F014"]
},
{
"id": "T011",
"description": "Feature 10: GET documents returns empty array for ticket with no documents",
"implemented": true,
"featureIds": ["F014"]
},
{
"id": "T012",
"description": "Feature 10: POST /api/v1/tickets/{id}/documents accepts file upload and creates document",
"implemented": true,
"featureIds": ["F010", "F011", "F012"]
},
{
"id": "T013",
"description": "Feature 10: POST upload creates document_association with entity_type='ticket'",
"implemented": true,
"featureIds": ["F012"]
},
{
"id": "T014",
"description": "Feature 10: POST upload returns created IDocument in response",
"implemented": true,
"featureIds": ["F013"]
},
{
"id": "T015",
"description": "Feature 10: POST upload rejects request without file",
"implemented": true,
"featureIds": ["F010"]
},
{
"id": "T016",
"description": "Feature 10: POST upload requires valid API key authentication",
"implemented": true,
"featureIds": ["F010"]
},
{
"id": "T017",
"description": "Feature 10: Mobile document list displays document name, type, size, date",
"implemented": true,
"featureIds": ["F016", "F017"]
},
{
"id": "T018",
"description": "Feature 10: Mobile document count shows in section header",
"implemented": true,
"featureIds": ["F018"]
},
{
"id": "T019",
"description": "Feature 10: Tapping a document triggers download/open",
"implemented": true,
"featureIds": ["F019"]
},
{
"id": "T020",
"description": "Feature 10: Camera option launches expo-image-picker and uploads photo",
"implemented": true,
"featureIds": ["F020", "F015"]
},
{
"id": "T021",
"description": "Feature 10: File option launches expo-document-picker and uploads file",
"implemented": true,
"featureIds": ["F021", "F015"]
},
{
"id": "T022",
"description": "Feature 10: Upload shows progress indicator while uploading",
"implemented": true,
"featureIds": ["F022"]
},
{
"id": "T023",
"description": "Feature 10: Document list refreshes after successful upload",
"implemented": true,
"featureIds": ["F023"]
},
{
"id": "T024",
"description": "Feature 10: Empty state message shown when no documents attached",
"implemented": true,
"featureIds": ["F024"]
},
{
"id": "T025",
"description": "Feature 10: Upload failure shows error message to user",
"implemented": true,
"featureIds": ["F025"]
},
{
"id": "T026",
"description": "Feature 10: Camera permission denied shows appropriate message",
"implemented": true,
"featureIds": ["F020", "F025"]
},
{
"id": "T030",
"description": "Feature 11: GET /api/v1/tickets/{id}/materials returns materials list with product names",
"implemented": true,
"featureIds": ["F030", "F031"]
},
{
"id": "T031",
"description": "Feature 11: GET materials returns empty array for ticket with no materials",
"implemented": true,
"featureIds": ["F030"]
},
{
"id": "T032",
"description": "Feature 11: POST /api/v1/tickets/{id}/materials creates material with valid data",
"implemented": true,
"featureIds": ["F032", "F033"]
},
{
"id": "T033",
"description": "Feature 11: POST materials resolves client_id from ticket automatically",
"implemented": true,
"featureIds": ["F034"]
},
{
"id": "T034",
"description": "Feature 11: POST materials validates required fields (service_id, quantity, rate)",
"implemented": true,
"featureIds": ["F033"]
},
{
"id": "T035",
"description": "Feature 11: POST materials rejects invalid service_id",
"implemented": true,
"featureIds": ["F033"]
},
{
"id": "T036",
"description": "Feature 11: Mobile materials list displays product name, SKU, quantity, rate",
"implemented": true,
"featureIds": ["F038", "F039"]
},
{
"id": "T037",
"description": "Feature 11: Materials list shows billed/unbilled status badge",
"implemented": true,
"featureIds": ["F039"]
},
{
"id": "T038",
"description": "Feature 11: Add Product button opens product picker with search",
"implemented": true,
"featureIds": ["F040"]
},
{
"id": "T039",
"description": "Feature 11: Product picker shows product name and SKU",
"implemented": true,
"featureIds": ["F040"]
},
{
"id": "T040",
"description": "Feature 11: After product selection, quantity/rate modal appears with pre-filled rate",
"implemented": true,
"featureIds": ["F041", "F042"]
},
{
"id": "T041",
"description": "Feature 11: Submitting quantity/rate creates material and refreshes list",
"implemented": true,
"featureIds": ["F043"]
},
{
"id": "T042",
"description": "Feature 11: Empty state shown when no materials on ticket",
"implemented": true,
"featureIds": ["F044"]
},
{
"id": "T043",
"description": "Feature 11: Add material failure shows error message",
"implemented": true,
"featureIds": ["F045"]
},
{
"id": "T050",
"description": "Test file: TicketDetailScreen.avatars.test.ts exists and passes via npx vitest run",
"implemented": true,
"featureIds": ["F050", "F051"]
},
{
"id": "T051",
"description": "Test file: documents.test.ts exists and passes via npx vitest run",
"implemented": true,
"featureIds": ["F052", "F054"]
},
{
"id": "T052",
"description": "Test file: DocumentsSection.test.ts exists and passes via npx vitest run",
"implemented": true,
"featureIds": ["F053", "F054"]
},
{
"id": "T053",
"description": "Test file: materials.test.ts exists and passes via npx vitest run",
"implemented": true,
"featureIds": ["F055", "F057"]
},
{
"id": "T054",
"description": "Test file: MaterialsSection.test.ts exists and passes via npx vitest run",
"implemented": true,
"featureIds": ["F056", "F057"]
},
{
"id": "T055",
"description": "Full test suite: npx vitest run passes with all existing 126+ tests plus new tests",
"implemented": true,
"featureIds": ["F058"]
}
]