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
399 lines
11 KiB
JSON
399 lines
11 KiB
JSON
[
|
|
{
|
|
"id": "T001",
|
|
"mode": "automated",
|
|
"description": "Cycle orchestration: successful inbound advances cursor to fetch time; inbound applier failure leaves cursor_before in place.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F008",
|
|
"F009"
|
|
]
|
|
},
|
|
{
|
|
"id": "T002",
|
|
"mode": "automated",
|
|
"description": "Cycle orchestration: fetchChanges is called with last cursor_after minus the 5-minute overlap window.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F009"
|
|
]
|
|
},
|
|
{
|
|
"id": "T003",
|
|
"mode": "automated",
|
|
"description": "Cycle orchestration: outbound op failure increments attempts and retries next cycle; at the cap the op becomes skipped and an exception is filed; cursor still advances.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F008",
|
|
"F010"
|
|
]
|
|
},
|
|
{
|
|
"id": "T004",
|
|
"mode": "automated",
|
|
"description": "Cycle orchestration: hard auth failure aborts before CDC \u2014 no fetch, no cursor change, connection marked expired, immediate notification sent.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F008",
|
|
"F034"
|
|
]
|
|
},
|
|
{
|
|
"id": "T005",
|
|
"mode": "automated",
|
|
"description": "Ops queue: enqueueing the same entity+operation while one is pending dedupes to a single op; a done op allows re-enqueue.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F010"
|
|
]
|
|
},
|
|
{
|
|
"id": "T006",
|
|
"mode": "automated",
|
|
"description": "Scheduling: OAuth connect registers the cycle job (15-min, singleton per tenant\u00d7realm), disconnect deregisters, startup re-registers for connected tenants; interval is not coerced to 24h.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F011"
|
|
]
|
|
},
|
|
{
|
|
"id": "T007",
|
|
"mode": "automated",
|
|
"description": "Cycle guard: CE edition or disconnected tenant \u2192 cycle exits as a no-op without error or cursor write.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F013"
|
|
]
|
|
},
|
|
{
|
|
"id": "T008",
|
|
"mode": "automated",
|
|
"description": "Payment applier: single full payment \u2192 invoice_payments row (method quickbooks), payment transaction with qbo_payment_id metadata, invoice status 'paid'.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F016"
|
|
]
|
|
},
|
|
{
|
|
"id": "T009",
|
|
"mode": "automated",
|
|
"description": "Payment applier: partial allocation \u2192 status 'partially_applied'; second payment completing the balance \u2192 'paid'.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F015",
|
|
"F016"
|
|
]
|
|
},
|
|
{
|
|
"id": "T010",
|
|
"mode": "automated",
|
|
"description": "Payment applier: one QBO payment allocated across two mapped invoices applies per-allocation amounts to each.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F016"
|
|
]
|
|
},
|
|
{
|
|
"id": "T011",
|
|
"mode": "automated",
|
|
"description": "Idempotency: re-delivering an already-mapped, unchanged payment (overlap window duplicate) is a no-op \u2014 no duplicate invoice_payments or transactions.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F017"
|
|
]
|
|
},
|
|
{
|
|
"id": "T012",
|
|
"mode": "automated",
|
|
"description": "Payment edit: moved sync token reverses prior application and reapplies current allocations; net invoice_payments/transactions/status reflect only the edited amounts.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F018"
|
|
]
|
|
},
|
|
{
|
|
"id": "T013",
|
|
"mode": "automated",
|
|
"description": "Payment delete: CDC-deleted payment writes payment_reversal transactions and recomputes status back to sent/partially_applied.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F019"
|
|
]
|
|
},
|
|
{
|
|
"id": "T014",
|
|
"mode": "automated",
|
|
"description": "Payment exceptions: allocation to an unmapped QBO invoice files accounting_sync_unmapped_payment and applies nothing; currency mismatch likewise.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F020"
|
|
]
|
|
},
|
|
{
|
|
"id": "T015",
|
|
"mode": "automated",
|
|
"description": "Stats-only inputs: unapplied remainder and RefundReceipt increment cycle stats without creating records.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F021"
|
|
]
|
|
},
|
|
{
|
|
"id": "T016",
|
|
"mode": "automated",
|
|
"description": "Stripe regression: existing PaymentService/webhook tests pass unchanged after the recordExternalPayment extraction.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F014"
|
|
]
|
|
},
|
|
{
|
|
"id": "T017",
|
|
"mode": "automated",
|
|
"description": "Customer applier: QBO rename refreshes mapping display name; deleted/inactive mapped customer files an exception.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F022"
|
|
]
|
|
},
|
|
{
|
|
"id": "T018",
|
|
"mode": "automated",
|
|
"description": "Drift comparator: total change \u2192 drift with both versions in the exception; balance-only change \u2192 no drift; doc-number change \u2192 drift.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F023",
|
|
"F024"
|
|
]
|
|
},
|
|
{
|
|
"id": "T019",
|
|
"mode": "automated",
|
|
"description": "Drift resolutions: re-export sparse-updates QBO (mocked), refreshes snapshot, clears drift and closes the task; accept refreshes snapshot without touching the Alga invoice.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F025",
|
|
"F026"
|
|
]
|
|
},
|
|
{
|
|
"id": "T020",
|
|
"mode": "automated",
|
|
"description": "QBO-side void of a mapped invoice \u2192 external-voided mapping state + drift exception; status read action reports Voided.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F027",
|
|
"F037"
|
|
]
|
|
},
|
|
{
|
|
"id": "T021",
|
|
"mode": "automated",
|
|
"description": "Auto-export producer: finalize with auto-sync on + connected realm enqueues export_invoice; off, CE, or disconnected \u2192 no-op.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F028",
|
|
"F004"
|
|
]
|
|
},
|
|
{
|
|
"id": "T022",
|
|
"mode": "automated",
|
|
"description": "Outbound drain: pending export ops grouped into one batch with origin 'scheduled'; delivered ops marked done, failed ops carry the batch error.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F029",
|
|
"F003"
|
|
]
|
|
},
|
|
{
|
|
"id": "T023",
|
|
"mode": "automated",
|
|
"description": "Scheduled-batch validation failure (missing item mapping) files accounting_sync_export_error and fails the op.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F030"
|
|
]
|
|
},
|
|
{
|
|
"id": "T024",
|
|
"mode": "automated",
|
|
"description": "Manual batch creation marks matching pending export ops done (no double export).",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F031"
|
|
]
|
|
},
|
|
{
|
|
"id": "T025",
|
|
"mode": "automated",
|
|
"description": "Exception dedupe: a second occurrence for the same entity+type updates the open task's context; resolving allows a fresh task next occurrence.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F033",
|
|
"F032"
|
|
]
|
|
},
|
|
{
|
|
"id": "T026",
|
|
"mode": "automated",
|
|
"description": "Token countdown: crossing 14/7/2-day thresholds notifies once per threshold; repeated cycles inside a threshold don't re-notify.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F035"
|
|
]
|
|
},
|
|
{
|
|
"id": "T027",
|
|
"mode": "automated",
|
|
"description": "Cycle summary notification fires only on cycles that produced new exceptions.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F036"
|
|
]
|
|
},
|
|
{
|
|
"id": "T028",
|
|
"mode": "automated",
|
|
"description": "Status aggregation: mapping+ops permutations produce Not synced / Queued / Synced / Drift / Error / Voided correctly (table-driven).",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F037"
|
|
]
|
|
},
|
|
{
|
|
"id": "T029",
|
|
"mode": "automated",
|
|
"description": "UI contract: InvoiceSyncBadge renders each state with tooltip content (doc number, last synced, deep link present).",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F038",
|
|
"F039"
|
|
]
|
|
},
|
|
{
|
|
"id": "T030",
|
|
"mode": "automated",
|
|
"description": "UI contract: settings health panel renders cycle summary, counts with inbox links, token countdown; auto-sync toggle persists via the setting action.",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F041",
|
|
"F004"
|
|
]
|
|
},
|
|
{
|
|
"id": "T031",
|
|
"mode": "automated",
|
|
"description": "Sync-now action is EE + billing_settings gated and triggers a cycle (mocked runner).",
|
|
"implemented": true,
|
|
"featureIds": [
|
|
"F012",
|
|
"F040"
|
|
]
|
|
},
|
|
{
|
|
"id": "T032",
|
|
"mode": "automated",
|
|
"description": "DB-backed integration: seeded tenant with one exported invoice; mocked QBO returns CDC payment + invoice edit; one cycle \u2192 invoice paid, drift exception filed, queued invoice exported in a scheduled batch, cursor advanced, cycle stats recorded.",
|
|
"implemented": false,
|
|
"featureIds": [
|
|
"F008",
|
|
"F016",
|
|
"F024",
|
|
"F029"
|
|
]
|
|
},
|
|
{
|
|
"id": "T033",
|
|
"mode": "automated",
|
|
"description": "Migrations up/down clean for accounting_sync_cycles, accounting_sync_operations, batches.origin, task definitions.",
|
|
"implemented": false,
|
|
"featureIds": [
|
|
"F001",
|
|
"F002",
|
|
"F003",
|
|
"F032"
|
|
]
|
|
},
|
|
{
|
|
"id": "T034",
|
|
"mode": "live-smoke",
|
|
"description": "Sandbox: connect, finalize an invoice with auto-sync on \u2192 appears in QBO within one cycle; badge flips Queued \u2192 Synced with working deep link.",
|
|
"implemented": false,
|
|
"featureIds": [
|
|
"F028",
|
|
"F029",
|
|
"F038"
|
|
]
|
|
},
|
|
{
|
|
"id": "T035",
|
|
"mode": "live-smoke",
|
|
"description": "Sandbox: receive payment in QBO \u2192 Alga invoice flips to paid within one cycle; portal shows paid.",
|
|
"implemented": false,
|
|
"featureIds": [
|
|
"F016"
|
|
]
|
|
},
|
|
{
|
|
"id": "T036",
|
|
"mode": "live-smoke",
|
|
"description": "Sandbox: edit the QBO payment amount \u2192 Alga follows (partially_applied); delete the payment \u2192 reversal, invoice back to sent.",
|
|
"implemented": false,
|
|
"featureIds": [
|
|
"F018",
|
|
"F019"
|
|
]
|
|
},
|
|
{
|
|
"id": "T037",
|
|
"mode": "live-smoke",
|
|
"description": "Sandbox: edit an exported invoice's amount in QBO \u2192 drift exception appears in inbox; re-export resolution restores QBO and clears the badge.",
|
|
"implemented": false,
|
|
"featureIds": [
|
|
"F024",
|
|
"F025"
|
|
]
|
|
},
|
|
{
|
|
"id": "T038",
|
|
"mode": "live-smoke",
|
|
"description": "Sandbox: record a payment against a QBO-only invoice \u2192 unmapped-payment exception with usable context.",
|
|
"implemented": false,
|
|
"featureIds": [
|
|
"F020"
|
|
]
|
|
},
|
|
{
|
|
"id": "T039",
|
|
"mode": "live-smoke",
|
|
"description": "Sandbox: force token expiry (tamper stored credential) \u2192 connection-expired notification + health panel shows expired; reconnect restores cycles.",
|
|
"implemented": false,
|
|
"featureIds": [
|
|
"F034",
|
|
"F035",
|
|
"F041"
|
|
]
|
|
},
|
|
{
|
|
"id": "T040",
|
|
"mode": "live-smoke",
|
|
"description": "Sandbox: Sync Now from settings and from invoice detail both produce an immediate cycle; health panel reflects the run.",
|
|
"implemented": false,
|
|
"featureIds": [
|
|
"F012",
|
|
"F040",
|
|
"F041"
|
|
]
|
|
},
|
|
{
|
|
"id": "T041",
|
|
"mode": "live-smoke",
|
|
"description": "Regression sanity: client-portal Stripe payment still lands correctly (invoice paid, transaction written) after the recordExternalPayment refactor.",
|
|
"implemented": false,
|
|
"featureIds": [
|
|
"F014"
|
|
]
|
|
}
|
|
]
|