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
1171 lines
39 KiB
JSON
1171 lines
39 KiB
JSON
[
|
|
{
|
|
"id": "F001",
|
|
"description": "Extend ContractWizardData with renewal mode, notice period, term months, and override toggle fields.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F002",
|
|
"description": "Initialize renewal fields in ContractWizard default state for new contracts.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F003",
|
|
"description": "Hydrate renewal fields when resuming draft contracts in the wizard.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F004",
|
|
"description": "Hydrate renewal fields when editing existing contracts in the wizard.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F005",
|
|
"description": "Render Renewal Settings card in ContractBasicsStep when end date is present.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F006",
|
|
"description": "Render Evergreen Review settings card in ContractBasicsStep when end date is absent.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F007",
|
|
"description": "Show renewal mode selector with values none/manual/auto in ContractBasicsStep.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F008",
|
|
"description": "Show notice period selector/input in ContractBasicsStep for renewal-enabled modes.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F009",
|
|
"description": "Show renewal term behavior input in ContractBasicsStep for auto-renew mode.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F010",
|
|
"description": "Hide auto-renew-specific term controls when renewal mode is not auto.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F011",
|
|
"description": "Validate renewal mode is required when an end date is set.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F012",
|
|
"description": "Validate notice period is a non-negative integer within configured bounds.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F013",
|
|
"description": "Validate renewal term months is positive when explicitly provided.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F014",
|
|
"description": "Show inline validation errors for invalid renewal settings before wizard progression.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F015",
|
|
"description": "Include renewal fields in contract summary preview in ContractBasicsStep.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F016",
|
|
"description": "Include renewal fields in review step payload preview before submit.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F017",
|
|
"description": "Persist renewal fields in ClientContractWizardSubmission payload builder.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F018",
|
|
"description": "Persist renewal fields when saving draft contracts from wizard.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration"
|
|
]
|
|
},
|
|
{
|
|
"id": "F019",
|
|
"description": "Add tenant default renewal mode field to default billing settings model.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F020",
|
|
"description": "Add tenant default notice period days field to default billing settings model.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F021",
|
|
"description": "Add tenant default due-date action policy field to default billing settings model.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F022",
|
|
"description": "Add tenant default renewal ticket board field to default billing settings model.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F023",
|
|
"description": "Add tenant default renewal ticket status field to default billing settings model.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F024",
|
|
"description": "Add tenant default renewal ticket priority field to default billing settings model.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F025",
|
|
"description": "Add tenant default renewal ticket assignee field to default billing settings model.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F026",
|
|
"description": "Expose renewal defaults in getDefaultBillingSettings action response.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F027",
|
|
"description": "Persist renewal defaults in updateDefaultBillingSettings action writes.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F028",
|
|
"description": "Add use-tenant-defaults toggle to contract renewal settings payload.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F029",
|
|
"description": "Apply tenant defaults to contract assignment when override toggle is enabled.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F030",
|
|
"description": "Apply explicit contract-level override values when override toggle is disabled.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F031",
|
|
"description": "Enforce deterministic fallback precedence when override fields are partially missing.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F032",
|
|
"description": "Expose effective renewal settings in contract assignment read APIs.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F033",
|
|
"description": "Compute decision_due_date for fixed-term assignments using end_date minus notice_period_days.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F034",
|
|
"description": "Compute next evergreen review anchor date from active contract anniversary rules.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F035",
|
|
"description": "Compute evergreen decision_due_date using anchor date minus notice_period_days.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F036",
|
|
"description": "Normalize decision_due_date calculations to date-only semantics used by client_contracts.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F037",
|
|
"description": "Recompute decision_due_date when contract end_date changes.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F038",
|
|
"description": "Recompute decision_due_date when notice period changes.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F039",
|
|
"description": "Recompute decision_due_date when renewal mode changes between none/manual/auto.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F040",
|
|
"description": "Recompute decision_due_date when evergreen anchor basis changes.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F041",
|
|
"description": "Skip decision_due_date generation for terminated/expired contract assignments.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F042",
|
|
"description": "Skip decision_due_date generation when renewal mode is none and no evergreen review is configured.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F043",
|
|
"description": "Create one renewal cycle key per contract assignment cycle for deduplication.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F044",
|
|
"description": "Prevent duplicate active renewal work items for same tenant/client_contract_id/cycle key.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F045",
|
|
"description": "Persist cycle_start and cycle_end boundaries for each generated renewal cycle.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F046",
|
|
"description": "Expose days_until_due as derived queue field for UI sorting and badges.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F047",
|
|
"description": "Clamp past-due decision calculations into queue visibility without negative date corruption.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F048",
|
|
"description": "Add renewals tab value and metadata to billing tab configuration.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F049",
|
|
"description": "Add Renewals Tabs.Content route to BillingDashboard tab host.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F050",
|
|
"description": "Add Renewals queue page component under billing dashboard components.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F051",
|
|
"description": "Load renewal queue rows from server action on Renewals page mount.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F052",
|
|
"description": "Render default 90-day horizon rows in Renewals queue.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F053",
|
|
"description": "Render bucket quick filters for 0-30, 31-60, and 61-90 days.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F054",
|
|
"description": "Render owner filter for assigned user in Renewals queue.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F055",
|
|
"description": "Render status filter for pending/renewing/non_renewing/snoozed/completed.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F056",
|
|
"description": "Render renewal mode filter for none/manual/auto.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F057",
|
|
"description": "Render contract type filter for fixed-term versus evergreen entries.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F058",
|
|
"description": "Sort queue by decision_due_date ascending by default.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F059",
|
|
"description": "Show days-remaining visual state for due-soon and overdue entries.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F060",
|
|
"description": "Add Upcoming Renewals summary widget to ClientContractsTab.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F061",
|
|
"description": "Show 90-day bucket counts in ClientContractsTab upcoming renewals widget.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F062",
|
|
"description": "Navigate from upcoming renewals widget to Renewals tab preserving filter context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F063",
|
|
"description": "Refresh widget counts after queue action mutations complete.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points"
|
|
]
|
|
},
|
|
{
|
|
"id": "F064",
|
|
"description": "Define queue status enum values pending/renewing/non_renewing/snoozed/completed in renewal work-item model.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F065",
|
|
"description": "Implement mark-renewing action that transitions pending entries to renewing.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F066",
|
|
"description": "Implement mark-non-renewing action that transitions pending entries to non_renewing.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F067",
|
|
"description": "Implement create-renewal-draft action for eligible queue entries.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F068",
|
|
"description": "Implement snooze action that sets status to snoozed with snoozed_until date.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F069",
|
|
"description": "Implement assign-owner action to set assigned_to on renewal work item.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F070",
|
|
"description": "Implement unsnooze transition back to pending when snooze period elapses.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F071",
|
|
"description": "Persist action actor user id on each queue mutation.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F072",
|
|
"description": "Persist action timestamp on each queue mutation.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F073",
|
|
"description": "Persist action reason/note text on queue mutation when provided.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F074",
|
|
"description": "Prevent invalid transition from completed back to pending without explicit reopen action.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F075",
|
|
"description": "Prevent invalid transition from non_renewing to renewing without explicit override action.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F076",
|
|
"description": "Enforce snooze date must be in the future on action validation.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F077",
|
|
"description": "Expose queue row action availability based on current status.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F078",
|
|
"description": "Show optimistic UI state while queue actions are in-flight.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F079",
|
|
"description": "Refresh affected queue row state after successful action response.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F080",
|
|
"description": "Include linked draft contract id in queue row once renewal draft is created.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F081",
|
|
"description": "Include linked ticket id in queue row once due-date ticket is created.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F082",
|
|
"description": "Mark work item completed when renewed contract activation is confirmed.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F083",
|
|
"description": "Mark work item completed when non-renewal finalization is confirmed.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F084",
|
|
"description": "Create scheduled renewal processor that scans due decision windows for active contracts.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F085",
|
|
"description": "Upsert renewal work items during scheduled processing for newly eligible cycles.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F086",
|
|
"description": "Respect tenant default due-date action policy during scheduled processing.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F087",
|
|
"description": "Respect contract-level override due-date action policy during scheduled processing.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F088",
|
|
"description": "Create internal ticket at decision due date when effective policy is create_ticket.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F089",
|
|
"description": "Call workflow runtime tickets.create action for renewal ticket creation path.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F090",
|
|
"description": "Populate renewal ticket title with client and contract context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F091",
|
|
"description": "Populate renewal ticket description with due date and renewal settings context.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F092",
|
|
"description": "Populate renewal ticket routing fields from effective renewal ticket defaults.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F093",
|
|
"description": "Persist created ticket id on renewal work item after successful ticket creation.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F094",
|
|
"description": "Use idempotency key per tenant/client_contract_id/cycle key for ticket creation.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F095",
|
|
"description": "Skip duplicate ticket creation when idempotent renewal cycle already has linked ticket.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F096",
|
|
"description": "Record automation_error on work item when ticket creation fails.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F097",
|
|
"description": "Allow manual retry action to re-attempt ticket creation for failed work items.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F098",
|
|
"description": "Ensure due-date automation supports queue-only policy without creating tickets.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F099",
|
|
"description": "Publish/emit renewal-upcoming domain event payloads compatible with queue creation semantics.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F100",
|
|
"description": "Generate renewal queue entries for evergreen contracts based on annual review cycle.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR7 — Evergreen Annual Review Flow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F101",
|
|
"description": "Display evergreen contract type badge in queue rows.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR7 — Evergreen Annual Review Flow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F102",
|
|
"description": "Show evergreen cycle anchor date in queue row details.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR7 — Evergreen Annual Review Flow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F103",
|
|
"description": "Support mark-renewing action for evergreen queue entries.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR7 — Evergreen Annual Review Flow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F104",
|
|
"description": "Support mark-non-renewing action for evergreen queue entries.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR7 — Evergreen Annual Review Flow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F105",
|
|
"description": "Support create-renewal-draft action for evergreen queue entries.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR7 — Evergreen Annual Review Flow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F106",
|
|
"description": "Roll evergreen cycle forward to next annual window after completion.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR7 — Evergreen Annual Review Flow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F107",
|
|
"description": "Prevent duplicate evergreen cycle entries for the same annual period.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR7 — Evergreen Annual Review Flow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F108",
|
|
"description": "Respect evergreen-specific notice period overrides on decision date computation.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR7 — Evergreen Annual Review Flow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F109",
|
|
"description": "Include evergreen entries in upcoming renewals widget counts.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR7 — Evergreen Annual Review Flow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F110",
|
|
"description": "Extend contract expiration report action to expose decision_due_date alongside end_date where available.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR8 — Reporting and Existing Surface Alignment"
|
|
]
|
|
},
|
|
{
|
|
"id": "F111",
|
|
"description": "Include renewal mode in expiration report row payload.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR8 — Reporting and Existing Surface Alignment"
|
|
]
|
|
},
|
|
{
|
|
"id": "F112",
|
|
"description": "Include queue status in expiration report row payload when work item exists.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR8 — Reporting and Existing Surface Alignment"
|
|
]
|
|
},
|
|
{
|
|
"id": "F113",
|
|
"description": "Keep existing expiration report rows for fixed-term contracts without renewal config.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR8 — Reporting and Existing Surface Alignment"
|
|
]
|
|
},
|
|
{
|
|
"id": "F114",
|
|
"description": "Keep existing expiration report sort compatibility for existing report consumers.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR8 — Reporting and Existing Surface Alignment"
|
|
]
|
|
},
|
|
{
|
|
"id": "F115",
|
|
"description": "Expose at-risk count based on decision_due_date windows for dashboard usage.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR8 — Reporting and Existing Surface Alignment"
|
|
]
|
|
},
|
|
{
|
|
"id": "F116",
|
|
"description": "Align contract reports tab expiration copy to reference renewal decisions as well as expiration.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR8 — Reporting and Existing Surface Alignment"
|
|
]
|
|
},
|
|
{
|
|
"id": "F117",
|
|
"description": "Ensure legacy auto_renew display derives from new renewal mode values.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR8 — Reporting and Existing Surface Alignment"
|
|
]
|
|
},
|
|
{
|
|
"id": "F118",
|
|
"description": "Register renewal scheduled processing job in pg-boss on-prem scheduling path.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR9 — Runtime Compatibility (On-prem PG Boss vs Hosted/EE Temporal)"
|
|
]
|
|
},
|
|
{
|
|
"id": "F119",
|
|
"description": "Register renewal scheduled processing workflow in Temporal hosted/EE scheduling path.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR9 — Runtime Compatibility (On-prem PG Boss vs Hosted/EE Temporal)"
|
|
]
|
|
},
|
|
{
|
|
"id": "F120",
|
|
"description": "Use shared renewal processing core logic callable from both pg-boss and Temporal adapters.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR9 — Runtime Compatibility (On-prem PG Boss vs Hosted/EE Temporal)"
|
|
]
|
|
},
|
|
{
|
|
"id": "F121",
|
|
"description": "Keep effective behavior parity for queue creation between pg-boss and Temporal runners.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR9 — Runtime Compatibility (On-prem PG Boss vs Hosted/EE Temporal)"
|
|
]
|
|
},
|
|
{
|
|
"id": "F122",
|
|
"description": "Keep effective behavior parity for ticket creation idempotency between pg-boss and Temporal runners.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR9 — Runtime Compatibility (On-prem PG Boss vs Hosted/EE Temporal)"
|
|
]
|
|
},
|
|
{
|
|
"id": "F123",
|
|
"description": "Honor existing JobRunnerFactory runtime selection without forcing edition-specific code forks in business logic.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR9 — Runtime Compatibility (On-prem PG Boss vs Hosted/EE Temporal)"
|
|
]
|
|
},
|
|
{
|
|
"id": "F124",
|
|
"description": "Fallback gracefully to supported runner path when temporal bootstrap is unavailable.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR9 — Runtime Compatibility (On-prem PG Boss vs Hosted/EE Temporal)"
|
|
]
|
|
},
|
|
{
|
|
"id": "F125",
|
|
"description": "Preserve tenant-scoped execution semantics in both runtime paths.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR9 — Runtime Compatibility (On-prem PG Boss vs Hosted/EE Temporal)"
|
|
]
|
|
},
|
|
{
|
|
"id": "F126",
|
|
"description": "Enforce billing read permission on renewals queue list endpoints.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR10 — Permissions, Security, and Auditability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F127",
|
|
"description": "Enforce billing update permission on queue mutation endpoints.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR10 — Permissions, Security, and Auditability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F128",
|
|
"description": "Enforce billing settings update permission on renewal defaults update endpoints.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR10 — Permissions, Security, and Auditability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F129",
|
|
"description": "Apply tenant filter to all renewal work-item reads by default.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR10 — Permissions, Security, and Auditability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F130",
|
|
"description": "Apply tenant filter to all renewal work-item writes by default.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR10 — Permissions, Security, and Auditability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F131",
|
|
"description": "Audit renewal state transitions with actor id and transition metadata.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR10 — Permissions, Security, and Auditability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F132",
|
|
"description": "Audit ticket automation linkage with actor type system and timestamp metadata.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR10 — Permissions, Security, and Auditability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F133",
|
|
"description": "Audit renewal draft creation linkage with actor id and timestamp metadata.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR10 — Permissions, Security, and Auditability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F134",
|
|
"description": "Reject cross-tenant identifiers during queue mutation validation.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR10 — Permissions, Security, and Auditability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F135",
|
|
"description": "Sanitize user-provided action notes before persistence and render.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Requirements > Functional Requirements > FR10 — Permissions, Security, and Auditability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F136",
|
|
"description": "Add migration adding renewals queue status/audit columns on client_contracts (status, snoozed_until, assigned_to, last_action, last_action_by, last_action_at, last_action_note).",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Rollout / Migration",
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow",
|
|
"Requirements > Functional Requirements > FR10 — Permissions, Security, and Auditability"
|
|
]
|
|
},
|
|
{
|
|
"id": "F137",
|
|
"description": "Add migration adding renewal-cycle columns on client_contracts (decision_due_date, renewal_cycle_start, renewal_cycle_end, renewal_cycle_key).",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Rollout / Migration",
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine",
|
|
"Requirements > Functional Requirements > FR7 — Evergreen Annual Review Flow"
|
|
]
|
|
},
|
|
{
|
|
"id": "F138",
|
|
"description": "Add migration adding renewal automation linkage/policy columns on client_contracts (created_ticket_id, automation_error, renewal_due_date_action_policy, renewal_ticket_board_id, renewal_ticket_status_id, renewal_ticket_priority, renewal_ticket_assignee_id, created_draft_contract_id).",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Rollout / Migration",
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F139",
|
|
"description": "Add migration adding renewal configuration columns on client_contracts (renewal_mode, notice_period_days, renewal_term_months, use_tenant_renewal_defaults).",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Rollout / Migration",
|
|
"Requirements > Functional Requirements > FR1 — Contract Setup and Renewal Configuration",
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides"
|
|
]
|
|
},
|
|
{
|
|
"id": "F140",
|
|
"description": "Add migration adding renewal default/policy columns on default_billing_settings (default_renewal_mode, default_notice_period_days, renewal_due_date_action_policy, renewal_ticket_board_id, renewal_ticket_status_id, renewal_ticket_priority, renewal_ticket_assignee_id).",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Rollout / Migration",
|
|
"Requirements > Functional Requirements > FR2 — Tenant Defaults and Contract-Level Overrides",
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F141",
|
|
"description": "Add migration/backfill for existing active client_contract rows to initialize deterministic renewal state/defaults and compute first decision_due_date/cycle fields.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Rollout / Migration",
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F142",
|
|
"description": "Add indexes and uniqueness constraints supporting queue filtering/sorting and cycle deduplication on client_contracts renewal fields.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Rollout / Migration",
|
|
"Non-functional Requirements",
|
|
"Requirements > Functional Requirements > FR3 — Renewal Decision Date Engine"
|
|
]
|
|
},
|
|
{
|
|
"id": "F143",
|
|
"description": "Add server-side renewal schema readiness guard that fails fast with actionable error when required renewal columns are missing.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Rollout / Migration",
|
|
"Requirements > Functional Requirements > FR4 — Renewals Queue and Dashboard Entry Points",
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
},
|
|
{
|
|
"id": "F144",
|
|
"description": "After migrations ship, remove required-column compatibility branches in renewal queue actions/jobs and run in strict migrated-schema mode.",
|
|
"implemented": true,
|
|
"prdRefs": [
|
|
"Rollout / Migration",
|
|
"Requirements > Functional Requirements > FR5 — Queue Actions and Renewal Workflow",
|
|
"Requirements > Functional Requirements > FR6 — Automation and Ticket Creation"
|
|
]
|
|
}
|
|
]
|