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

171 lines
6.3 KiB
JSON

[
{
"id": "F001",
"description": "Migration adds online_meeting_provider, online_meeting_url, online_meeting_id columns to appointment_requests (nullable text).",
"implemented": true,
"prdRefs": ["FR-1"]
},
{
"id": "F002",
"description": "EE migration adds default_meeting_organizer_upn column to teams_integrations (nullable text).",
"implemented": true,
"prdRefs": ["FR-2"]
},
{
"id": "F003",
"description": "createTeamsMeeting helper resolves tenant Microsoft profile and POSTs to Graph /users/{upn}/onlineMeetings, returning { joinWebUrl, meetingId } or null on failure.",
"implemented": true,
"prdRefs": ["FR-3"]
},
{
"id": "F004",
"description": "updateTeamsMeeting helper PATCHes Graph /users/{upn}/onlineMeetings/{id} with new start/end times.",
"implemented": true,
"prdRefs": ["FR-4"]
},
{
"id": "F005",
"description": "deleteTeamsMeeting helper DELETEs the Graph online meeting; errors are logged but do not throw.",
"implemented": true,
"prdRefs": ["FR-5"]
},
{
"id": "F006",
"description": "getTeamsMeetingCapability(tenantId) server action returns { available, reason } for driving toggle visibility.",
"implemented": true,
"prdRefs": ["FR-6"]
},
{
"id": "F007",
"description": "CE-safe shim in packages/scheduling that dynamically resolves the EE Teams meeting service and returns no-op handlers when EE is unavailable.",
"implemented": true,
"prdRefs": ["FR-7"]
},
{
"id": "F008",
"description": "approveAppointmentRequestSchema accepts generate_teams_meeting: boolean (default false).",
"implemented": true,
"prdRefs": ["FR-8"]
},
{
"id": "F009",
"description": "approveAppointmentRequest server action calls createTeamsMeeting when generate_teams_meeting is true, persists the three columns, and passes the URL into email + ICS payloads.",
"implemented": true,
"prdRefs": ["FR-9"]
},
{
"id": "F010",
"description": "approveAppointmentRequest returns teamsMeetingWarning in its response when Graph creation fails; approval still succeeds.",
"implemented": true,
"prdRefs": ["FR-9"]
},
{
"id": "F011",
"description": "updateAppointmentRequestDateTime invokes updateTeamsMeeting when online_meeting_id is present; failure becomes teamsMeetingWarning.",
"implemented": true,
"prdRefs": ["FR-10"]
},
{
"id": "F012",
"description": "cancelAppointmentRequest and MSP-side appointment deletion call deleteTeamsMeeting when an associated Teams meeting exists.",
"implemented": true,
"prdRefs": ["FR-11"]
},
{
"id": "F013",
"description": "Cancel/delete confirmation dialogs include a warning message when a Teams meeting will also be deleted.",
"implemented": true,
"prdRefs": ["FR-11"]
},
{
"id": "F014",
"description": "AppointmentRequestsPanel approval form renders the 'Generate Teams meeting link' toggle only when getTeamsMeetingCapability returns available; default checked.",
"implemented": true,
"prdRefs": ["FR-12"]
},
{
"id": "F015",
"description": "EntryPopup pending-branch approval form renders the same toggle with the same visibility rules.",
"implemented": true,
"prdRefs": ["FR-12"]
},
{
"id": "F016",
"description": "EntryPopup approved-appointment banner displays a 'Join Teams Meeting' button when online_meeting_url is present.",
"implemented": true,
"prdRefs": ["FR-13"]
},
{
"id": "F017",
"description": "AppointmentRequestsPanel detail view displays the join URL / Join button when online_meeting_url is present on an approved request.",
"implemented": true,
"prdRefs": ["FR-13"]
},
{
"id": "F018",
"description": "Client-portal AppointmentRequestDetailsPage renders a primary 'Join Teams Meeting' button when online_meeting_url is present.",
"implemented": true,
"prdRefs": ["FR-14"]
},
{
"id": "F019",
"description": "AvailabilitySettings.tsx adds a conditional 'Teams Meetings' TabsTrigger + TabsContent, visible only when teams_integrations.install_status = 'active'.",
"implemented": true,
"prdRefs": ["FR-15"]
},
{
"id": "F020",
"description": "Teams Meetings tab contains an organizer UPN input, Save action, and Verify button that performs a best-effort Graph check.",
"implemented": true,
"prdRefs": ["FR-15"]
},
{
"id": "F021",
"description": "setDefaultMeetingOrganizer server action writes UPN to teams_integrations with permission check.",
"implemented": true,
"prdRefs": ["FR-15"]
},
{
"id": "F022",
"description": "verifyMeetingOrganizer server action calls Graph /users/{upn} and optionally performs a test-create-and-delete round-trip; returns { valid, displayName?, reason? }.",
"implemented": true,
"prdRefs": ["FR-15"]
},
{
"id": "F023",
"description": "Email template migration adds a conditional 'Join Teams Meeting' block to appointment-request-approved-client and appointment-assigned templates keyed on {{onlineMeetingUrl}}.",
"implemented": true,
"prdRefs": ["FR-16"]
},
{
"id": "F024",
"description": "SystemEmailService approved/assigned methods accept onlineMeetingUrl in their payload type and pass it through to template variables.",
"implemented": true,
"prdRefs": ["FR-16"]
},
{
"id": "F025",
"description": "ICS generator receives url = online_meeting_url and location = 'Microsoft Teams Meeting' when a meeting exists.",
"implemented": true,
"prdRefs": ["FR-17"]
},
{
"id": "F026",
"description": "i18n keys added to English schedule.json for toggle label, join button, Teams Meetings tab, organizer input + verify copy; pseudo-locales regenerated.",
"implemented": true,
"prdRefs": ["FR-18"]
},
{
"id": "F027",
"description": "Azure admin runbook authored at docs/integrations/teams-meetings-setup.md describing required app permission and Application Access Policy.",
"implemented": true,
"prdRefs": ["Phase 3"]
},
{
"id": "F028",
"description": "Structured log lines emitted for each Graph call (create/update/delete) at INFO on success and WARN on failure with tenant, request id, operation, and Graph status code.",
"implemented": true,
"prdRefs": ["Observability"]
}
]