@openhi/constructs 0.0.159 → 0.0.161
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/{chunk-HQ67J7BP.mjs → chunk-5S6VFBLT.mjs} +12 -70
- package/lib/chunk-5S6VFBLT.mjs.map +1 -0
- package/lib/{chunk-MVQWAIMC.mjs → chunk-6BB4CRSS.mjs} +3 -312
- package/lib/chunk-6BB4CRSS.mjs.map +1 -0
- package/lib/{chunk-WPCBVDFZ.mjs → chunk-76UM2LQ5.mjs} +2 -2
- package/lib/chunk-7TRO2STL.mjs +4616 -0
- package/lib/chunk-7TRO2STL.mjs.map +1 -0
- package/lib/chunk-BUAYVN3C.mjs +87 -0
- package/lib/chunk-BUAYVN3C.mjs.map +1 -0
- package/lib/{chunk-23PUSHBV.mjs → chunk-D2Y6DDOC.mjs} +2 -2
- package/lib/chunk-DWSWCUZR.mjs +123 -0
- package/lib/chunk-DWSWCUZR.mjs.map +1 -0
- package/lib/{chunk-VZCPGQXA.mjs → chunk-EUIP2U5F.mjs} +69 -1
- package/lib/{chunk-VZCPGQXA.mjs.map → chunk-EUIP2U5F.mjs.map} +1 -1
- package/lib/chunk-GJTPXJKD.mjs +46 -0
- package/lib/chunk-GJTPXJKD.mjs.map +1 -0
- package/lib/chunk-I6LUPJUY.mjs +61 -0
- package/lib/chunk-I6LUPJUY.mjs.map +1 -0
- package/lib/{chunk-KR2Y2CVQ.mjs → chunk-KA3OMP3X.mjs} +2 -2
- package/lib/{chunk-ZM4GDHHC.mjs → chunk-KMEWULMX.mjs} +51 -3
- package/lib/chunk-KMEWULMX.mjs.map +1 -0
- package/lib/chunk-LKKLO66E.mjs +25 -0
- package/lib/chunk-LKKLO66E.mjs.map +1 -0
- package/lib/{chunk-CFJDATDK.mjs → chunk-MLFMW5IF.mjs} +43 -9
- package/lib/chunk-MLFMW5IF.mjs.map +1 -0
- package/lib/chunk-O5VQWB6U.mjs +315 -0
- package/lib/chunk-O5VQWB6U.mjs.map +1 -0
- package/lib/{chunk-7BQHLC7U.mjs → chunk-P3CTZWC2.mjs} +8 -40
- package/lib/chunk-P3CTZWC2.mjs.map +1 -0
- package/lib/chunk-P3NFCKTZ.mjs +502 -0
- package/lib/chunk-P3NFCKTZ.mjs.map +1 -0
- package/lib/{chunk-M7Y3BOQW.mjs → chunk-Q3MKITPY.mjs} +5 -5
- package/lib/chunk-Q64MOYJ7.mjs +218 -0
- package/lib/chunk-Q64MOYJ7.mjs.map +1 -0
- package/lib/chunk-RQKJNMX5.mjs +89 -0
- package/lib/chunk-RQKJNMX5.mjs.map +1 -0
- package/lib/{chunk-ZWSGM6PZ.mjs → chunk-SD7J3N3C.mjs} +2 -2
- package/lib/{chunk-7RZHFI77.mjs → chunk-VESULYQQ.mjs} +2 -2
- package/lib/{chunk-AOSEKL7U.mjs → chunk-WOTU36P3.mjs} +6 -103
- package/lib/chunk-WOTU36P3.mjs.map +1 -0
- package/lib/{chunk-X5E4YJGZ.mjs → chunk-YPTJJ35S.mjs} +2 -2
- package/lib/counter-apply-operation-DZM3MIDm.d.mts +63 -0
- package/lib/counter-apply-operation-DZM3MIDm.d.ts +63 -0
- package/lib/counter-maintenance.handler.d.mts +38 -0
- package/lib/counter-maintenance.handler.d.ts +38 -0
- package/lib/counter-maintenance.handler.js +2885 -0
- package/lib/counter-maintenance.handler.js.map +1 -0
- package/lib/counter-maintenance.handler.mjs +180 -0
- package/lib/counter-maintenance.handler.mjs.map +1 -0
- package/lib/counter-reconciliation.handler.d.mts +116 -0
- package/lib/counter-reconciliation.handler.d.ts +116 -0
- package/lib/counter-reconciliation.handler.js +3324 -0
- package/lib/counter-reconciliation.handler.js.map +1 -0
- package/lib/counter-reconciliation.handler.mjs +295 -0
- package/lib/counter-reconciliation.handler.mjs.map +1 -0
- package/lib/data-store-postgres-replication.handler.js +50 -2
- package/lib/data-store-postgres-replication.handler.js.map +1 -1
- package/lib/data-store-postgres-replication.handler.mjs +2 -2
- package/lib/delete-chunk.handler.js +118 -2
- package/lib/delete-chunk.handler.js.map +1 -1
- package/lib/delete-chunk.handler.mjs +3 -3
- package/lib/{events-DTgo2dcW.d.mts → events-TG654e7L.d.mts} +68 -19
- package/lib/{events-DTgo2dcW.d.ts → events-TG654e7L.d.ts} +68 -19
- package/lib/finalize.handler.js +50 -2
- package/lib/finalize.handler.js.map +1 -1
- package/lib/finalize.handler.mjs +4 -4
- package/lib/firehose-archive-transform.handler.js +50 -2
- package/lib/firehose-archive-transform.handler.js.map +1 -1
- package/lib/firehose-archive-transform.handler.mjs +2 -2
- package/lib/index.d.mts +1283 -4
- package/lib/index.d.ts +1389 -24
- package/lib/index.js +4113 -320
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +602 -195
- package/lib/index.mjs.map +1 -1
- package/lib/list-chunks.handler.js +118 -2
- package/lib/list-chunks.handler.js.map +1 -1
- package/lib/list-chunks.handler.mjs +3 -3
- package/lib/platform-deploy-bridge.handler.js +50 -2
- package/lib/platform-deploy-bridge.handler.js.map +1 -1
- package/lib/platform-deploy-bridge.handler.mjs +1 -1
- package/lib/pre-token-generation.handler.js +68 -0
- package/lib/pre-token-generation.handler.js.map +1 -1
- package/lib/pre-token-generation.handler.mjs +9 -5
- package/lib/pre-token-generation.handler.mjs.map +1 -1
- package/lib/provision-default-workspace.handler.js +887 -4
- package/lib/provision-default-workspace.handler.js.map +1 -1
- package/lib/provision-default-workspace.handler.mjs +14 -9
- package/lib/provision-default-workspace.handler.mjs.map +1 -1
- package/lib/rename-finalize.handler.js +50 -2
- package/lib/rename-finalize.handler.js.map +1 -1
- package/lib/rename-finalize.handler.mjs +2 -2
- package/lib/rename-list-targets.handler.js +118 -2
- package/lib/rename-list-targets.handler.js.map +1 -1
- package/lib/rename-list-targets.handler.mjs +11 -9
- package/lib/rename-list-targets.handler.mjs.map +1 -1
- package/lib/rename-rewrite-chunk.handler.js +68 -0
- package/lib/rename-rewrite-chunk.handler.js.map +1 -1
- package/lib/rename-rewrite-chunk.handler.mjs +2 -2
- package/lib/rest-api-lambda.handler.js +1454 -251
- package/lib/rest-api-lambda.handler.js.map +1 -1
- package/lib/rest-api-lambda.handler.mjs +673 -821
- package/lib/rest-api-lambda.handler.mjs.map +1 -1
- package/lib/seed-demo-data.handler.d.mts +1 -1
- package/lib/seed-demo-data.handler.d.ts +1 -1
- package/lib/seed-demo-data.handler.js +4004 -201
- package/lib/seed-demo-data.handler.js.map +1 -1
- package/lib/seed-demo-data.handler.mjs +10 -7
- package/lib/seed-system-data.handler.js +118 -2
- package/lib/seed-system-data.handler.js.map +1 -1
- package/lib/seed-system-data.handler.mjs +5 -5
- package/package.json +1 -1
- package/lib/chunk-7BQHLC7U.mjs.map +0 -1
- package/lib/chunk-AOSEKL7U.mjs.map +0 -1
- package/lib/chunk-BQMJSDOD.mjs +0 -1136
- package/lib/chunk-BQMJSDOD.mjs.map +0 -1
- package/lib/chunk-CFJDATDK.mjs.map +0 -1
- package/lib/chunk-E6MCKJVS.mjs +0 -212
- package/lib/chunk-E6MCKJVS.mjs.map +0 -1
- package/lib/chunk-HQ67J7BP.mjs.map +0 -1
- package/lib/chunk-MVQWAIMC.mjs.map +0 -1
- package/lib/chunk-ZM4GDHHC.mjs.map +0 -1
- /package/lib/{chunk-WPCBVDFZ.mjs.map → chunk-76UM2LQ5.mjs.map} +0 -0
- /package/lib/{chunk-23PUSHBV.mjs.map → chunk-D2Y6DDOC.mjs.map} +0 -0
- /package/lib/{chunk-KR2Y2CVQ.mjs.map → chunk-KA3OMP3X.mjs.map} +0 -0
- /package/lib/{chunk-M7Y3BOQW.mjs.map → chunk-Q3MKITPY.mjs.map} +0 -0
- /package/lib/{chunk-ZWSGM6PZ.mjs.map → chunk-SD7J3N3C.mjs.map} +0 -0
- /package/lib/{chunk-7RZHFI77.mjs.map → chunk-VESULYQQ.mjs.map} +0 -0
- /package/lib/{chunk-X5E4YJGZ.mjs.map → chunk-YPTJJ35S.mjs.map} +0 -0
package/lib/index.d.ts
CHANGED
|
@@ -8,12 +8,12 @@ import { Key, KeyProps, IKey } from 'aws-cdk-lib/aws-kms';
|
|
|
8
8
|
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
|
|
9
9
|
import { AttributeValue } from '@aws-sdk/client-dynamodb';
|
|
10
10
|
import * as events from 'aws-cdk-lib/aws-events';
|
|
11
|
-
import { EventBus, EventBusProps,
|
|
11
|
+
import { EventBus, EventBusProps, Rule, IEventBus, Archive } from 'aws-cdk-lib/aws-events';
|
|
12
12
|
import * as kinesis from 'aws-cdk-lib/aws-kinesis';
|
|
13
13
|
import * as kinesisfirehose from 'aws-cdk-lib/aws-kinesisfirehose';
|
|
14
14
|
import * as s3 from 'aws-cdk-lib/aws-s3';
|
|
15
15
|
import { IBucket, BucketProps } from 'aws-cdk-lib/aws-s3';
|
|
16
|
-
import { Table, TableProps
|
|
16
|
+
import { ITable, Table, TableProps } from 'aws-cdk-lib/aws-dynamodb';
|
|
17
17
|
import { IFunction, Function } from 'aws-cdk-lib/aws-lambda';
|
|
18
18
|
import * as ec2 from 'aws-cdk-lib/aws-ec2';
|
|
19
19
|
import * as rds from 'aws-cdk-lib/aws-rds';
|
|
@@ -22,8 +22,8 @@ import { StringParameterProps, StringParameter } from 'aws-cdk-lib/aws-ssm';
|
|
|
22
22
|
import { Distribution, Function as Function$1, DistributionProps, CachePolicyProps, BehaviorOptions } from 'aws-cdk-lib/aws-cloudfront';
|
|
23
23
|
import { StateMachine } from 'aws-cdk-lib/aws-stepfunctions';
|
|
24
24
|
import { RenamableEntityType } from '@openhi/workflows';
|
|
25
|
-
export { ControlPlaneOwningDeleteCompleteV1, ControlPlaneOwningDeleteCompleteV1Detail, ControlPlaneOwningDeleteFailedV1, ControlPlaneOwningDeleteFailedV1Detail, ControlPlaneOwningDeleteV1, ControlPlaneOwningDeleteV1Detail, ControlPlaneRenameCompleteV1, ControlPlaneRenameCompleteV1Detail, ControlPlaneRenameFailedV1, ControlPlaneRenameFailedV1Detail, ControlPlaneRenameV1, ControlPlaneRenameV1Detail, OPENHI_DATA_SOURCE, OPENHI_OPS_SOURCE, OWNING_ENTITY_TYPE, OwningEntityType, PlatformDeploymentCompletedV1, PlatformSystemDataSeededV1, RENAMABLE_ENTITY_TYPE, RenamableEntityType } from '@openhi/workflows';
|
|
26
|
-
import { PlatformRoleCode, Patient, Practitioner, Observation, Encounter, Account } from '@openhi/types';
|
|
25
|
+
export { ControlPlaneMembershipCreatedV1, ControlPlaneMembershipDeletedV1, ControlPlaneOwningDeleteCompleteV1, ControlPlaneOwningDeleteCompleteV1Detail, ControlPlaneOwningDeleteFailedV1, ControlPlaneOwningDeleteFailedV1Detail, ControlPlaneOwningDeleteV1, ControlPlaneOwningDeleteV1Detail, ControlPlaneRenameCompleteV1, ControlPlaneRenameCompleteV1Detail, ControlPlaneRenameFailedV1, ControlPlaneRenameFailedV1Detail, ControlPlaneRenameV1, ControlPlaneRenameV1Detail, ControlPlaneRoleAssignmentCreatedV1, ControlPlaneRoleAssignmentDeletedV1, ControlPlaneWorkspaceCreatedV1, ControlPlaneWorkspaceDeletedV1, OPENHI_DATA_SOURCE, OPENHI_OPS_SOURCE, OWNING_ENTITY_TYPE, OwningEntityType, PlatformDeploymentCompletedV1, PlatformSystemDataSeededV1, RENAMABLE_ENTITY_TYPE, RenamableEntityType } from '@openhi/workflows';
|
|
26
|
+
import { PlatformRoleCode, Patient, Practitioner, Observation, Encounter, Account, Location, Organization, Coverage, Appointment, Condition, Procedure, Claim, PaymentNotice, Practitioner_Qualification } from '@openhi/types';
|
|
27
27
|
import { PostConfirmationTriggerEvent } from 'aws-lambda';
|
|
28
28
|
|
|
29
29
|
/*******************************************************************************
|
|
@@ -521,6 +521,44 @@ interface RenameCascadeFinalizeOutput {
|
|
|
521
521
|
/** Env var the construct uses to inject the ops event bus name into the finalize Lambda. */
|
|
522
522
|
declare const RENAME_CASCADE_OPS_EVENT_BUS_ENV_VAR: "RENAME_CASCADE_OPS_EVENT_BUS_NAME";
|
|
523
523
|
|
|
524
|
+
/**
|
|
525
|
+
* Kind of actor performing the operation (for audit trail and UI).
|
|
526
|
+
*/
|
|
527
|
+
type OpenHiActorType = "human" | "internal-system" | "external-system";
|
|
528
|
+
/**
|
|
529
|
+
* Adapter or entry point that created the context (for audit and metrics).
|
|
530
|
+
*/
|
|
531
|
+
type OpenHiContextSource = "rest" | "graphql" | "step-function";
|
|
532
|
+
/**
|
|
533
|
+
* OpenHI context: tenant/workspace scope and acting actor (human or system).
|
|
534
|
+
* Shared by REST, GraphQL, and Step Function adapters when calling the data operations layer.
|
|
535
|
+
* Used for tenant/workspace isolation, audit records, and merging into FHIR data on mutations.
|
|
536
|
+
*
|
|
537
|
+
* @see sites/www-docs/content/packages/@openhi/constructs/rest-api.md — Middleware (REST)
|
|
538
|
+
*/
|
|
539
|
+
interface OpenHiContext {
|
|
540
|
+
/** Tenant (organization) scope; used for multi-tenant isolation and data partition. */
|
|
541
|
+
tenantId: string;
|
|
542
|
+
/** Workspace scope within the tenant; used for workspace-level isolation and data partition. */
|
|
543
|
+
workspaceId: string;
|
|
544
|
+
/** Timestamp of the request/operation (e.g. ISO 8601). */
|
|
545
|
+
date: string;
|
|
546
|
+
/** Stable identifier for the actor (human, internal system, or external integration). */
|
|
547
|
+
actorId: string;
|
|
548
|
+
/** Display name for the actor for audit and UI (e.g. "Jane Doe", "FHIR Sync Service"). */
|
|
549
|
+
actorName: string;
|
|
550
|
+
/** Kind of actor; optional, for audit and display. */
|
|
551
|
+
actorType?: OpenHiActorType;
|
|
552
|
+
/** Role scope for Configuration and other role-scoped resources; optional. */
|
|
553
|
+
roleId?: string;
|
|
554
|
+
/** Request or correlation ID for tracing across adapters and logs; optional. */
|
|
555
|
+
requestId?: string;
|
|
556
|
+
/** Adapter that created this context (rest, graphql, step-function); optional. */
|
|
557
|
+
source?: OpenHiContextSource;
|
|
558
|
+
/** OAuth or client identifier when the caller is an application; optional. */
|
|
559
|
+
clientId?: string;
|
|
560
|
+
}
|
|
561
|
+
|
|
524
562
|
/**
|
|
525
563
|
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/seed-demo-data/events.md
|
|
526
564
|
*/
|
|
@@ -551,16 +589,54 @@ declare const DEMO_PERIOD: {
|
|
|
551
589
|
readonly start: "2026-01-01T00:00:00Z";
|
|
552
590
|
};
|
|
553
591
|
|
|
554
|
-
/**
|
|
592
|
+
/**
|
|
593
|
+
* Placeholder Tenant id.
|
|
594
|
+
*
|
|
595
|
+
* The placeholder is a **system sentinel**, not a user-facing demo
|
|
596
|
+
* tenant. It exists for two reasons:
|
|
597
|
+
*
|
|
598
|
+
* 1. `pre-token-generation.handler.ts` stamps this id into the
|
|
599
|
+
* JWT `ohi_tid` claim when a User cannot be resolved (no
|
|
600
|
+
* DynamoDB record, missing `currentTenant`/`currentWorkspace`,
|
|
601
|
+
* etc.) so the token still satisfies `openHiContextMiddleware`
|
|
602
|
+
* and downstream APIs return a deterministic 403 instead of
|
|
603
|
+
* crashing on a missing claim.
|
|
604
|
+
* 2. The seed workflow re-asserts a Tenant + Workspace record at
|
|
605
|
+
* these ids so the JWT fallback dereferences to a real DynamoDB
|
|
606
|
+
* row (avoids dangling references on read paths that follow
|
|
607
|
+
* `Tenant/placeholder-tenant-id`).
|
|
608
|
+
*
|
|
609
|
+
* Dev users' `currentTenant`/`currentWorkspace` no longer point here
|
|
610
|
+
* (issue #1301) — they point at the on-site demo tenant below. The
|
|
611
|
+
* placeholder records remain seeded purely as a structural sentinel.
|
|
612
|
+
*/
|
|
555
613
|
declare const PLACEHOLDER_TENANT_ID = "placeholder-tenant-id";
|
|
556
|
-
/** Placeholder Workspace id
|
|
614
|
+
/** Placeholder Workspace id. See {@link PLACEHOLDER_TENANT_ID}. */
|
|
557
615
|
declare const PLACEHOLDER_WORKSPACE_ID = "placeholder-workspace-id";
|
|
616
|
+
/**
|
|
617
|
+
* Stable Tenant id for the on-site-medical UAT demo tenant
|
|
618
|
+
* (issue #1301). Downstream demo-data tickets (#1302 providers,
|
|
619
|
+
* #1303 facilities, #1304 patients/encounters, etc.) import this
|
|
620
|
+
* constant to attach their fixture resources without re-discovering
|
|
621
|
+
* the tenant.
|
|
622
|
+
*
|
|
623
|
+
* This is the tenant every seeded dev user lands on at sign-in
|
|
624
|
+
* (`currentTenant` on the seeded User resource). UAT testers see
|
|
625
|
+
* "On-Site Medical — Demo" in the Tenant Switcher on first sign-in.
|
|
626
|
+
*/
|
|
627
|
+
declare const ON_SITE_DEMO_TENANT_ID = "on-site-demo-tenant";
|
|
628
|
+
/**
|
|
629
|
+
* Stable Workspace id under {@link ON_SITE_DEMO_TENANT_ID}. Single
|
|
630
|
+
* workspace for v1 UAT; workspace topology (per business line vs
|
|
631
|
+
* per jurisdiction) is deferred pending an ADR (#1301 design note).
|
|
632
|
+
*/
|
|
633
|
+
declare const ON_SITE_DEMO_WORKSPACE_ID = "on-site-demo-workspace";
|
|
558
634
|
/**
|
|
559
635
|
* Dev-user descriptor. Every entry produces:
|
|
560
636
|
* - one Cognito user (idempotent create-then-skip),
|
|
561
637
|
* - one DynamoDB User record (id = `dev-<email-local-part>`),
|
|
562
|
-
* -
|
|
563
|
-
* -
|
|
638
|
+
* - five Memberships (placeholder + on-site demo + three demo tenants),
|
|
639
|
+
* - five `tenant-admin` RoleAssignments (one per tenant the user
|
|
564
640
|
* belongs to),
|
|
565
641
|
* - one `system-admin` RoleAssignment scoped to {@link PLATFORM_SCOPE_TENANT_ID}.
|
|
566
642
|
*/
|
|
@@ -569,6 +645,10 @@ interface DemoDevUser {
|
|
|
569
645
|
readonly id: string;
|
|
570
646
|
/** Email used as the Cognito `Username` and as the seed for the password algorithm. */
|
|
571
647
|
readonly email: string;
|
|
648
|
+
/** Given name, populated on the seeded User FHIR resource as `name[0].given[0]`. */
|
|
649
|
+
readonly firstName: string;
|
|
650
|
+
/** Family name, populated on the seeded User FHIR resource as `name[0].family`. */
|
|
651
|
+
readonly lastName: string;
|
|
572
652
|
}
|
|
573
653
|
/**
|
|
574
654
|
* Hardcoded dev-user roster. Adding a new developer is a one-line
|
|
@@ -579,8 +659,9 @@ interface DemoDevUser {
|
|
|
579
659
|
declare const DEV_USERS: ReadonlyArray<DemoDevUser>;
|
|
580
660
|
/**
|
|
581
661
|
* A single workspace inside a demo tenant. The mixed tenant has two
|
|
582
|
-
* workspaces (wound-care and primary-care sub-workspaces);
|
|
583
|
-
*
|
|
662
|
+
* workspaces (wound-care and primary-care sub-workspaces); every
|
|
663
|
+
* other tenant (placeholder, on-site demo, wound-care, primary-care)
|
|
664
|
+
* has exactly one.
|
|
584
665
|
*/
|
|
585
666
|
interface DemoWorkspaceSpec {
|
|
586
667
|
/** Stable id (DynamoDB record id; also drives the canonical OHI URN). */
|
|
@@ -601,9 +682,10 @@ interface DemoWorkspaceSpec {
|
|
|
601
682
|
*/
|
|
602
683
|
interface DemoTenantSpec {
|
|
603
684
|
/**
|
|
604
|
-
* Scenario slug — `placeholder`, `
|
|
605
|
-
* `demo-mixed`. The placeholder tenant
|
|
606
|
-
*
|
|
685
|
+
* Scenario slug — `placeholder`, `on-site-demo`, `demo-wound-care`,
|
|
686
|
+
* `demo-primary-care`, `demo-mixed`. The placeholder tenant uses
|
|
687
|
+
* `placeholder`; the on-site UAT demo tenant uses `on-site-demo`
|
|
688
|
+
* (#1301); the three demo tenants use `demo-*` slugs.
|
|
607
689
|
*/
|
|
608
690
|
readonly scenario: string;
|
|
609
691
|
/** Stable id (DynamoDB record id; also drives the canonical OHI URN). */
|
|
@@ -614,17 +696,22 @@ interface DemoTenantSpec {
|
|
|
614
696
|
readonly workspaces: ReadonlyArray<DemoWorkspaceSpec>;
|
|
615
697
|
}
|
|
616
698
|
/**
|
|
617
|
-
* The full demo-tenant graph.
|
|
618
|
-
* JWT-claim fallback resolves to,
|
|
619
|
-
*
|
|
699
|
+
* The full demo-tenant graph. Five entries: the placeholder tenant
|
|
700
|
+
* the JWT-claim fallback resolves to, the on-site-medical UAT demo
|
|
701
|
+
* tenant every dev user lands on at sign-in (#1301), and the three
|
|
702
|
+
* v1 demo scenarios (OPS-009 §"v1 scenarios"):
|
|
620
703
|
*
|
|
621
704
|
* 0. Placeholder tenant — dereferences the JWT-claim fallback in
|
|
622
|
-
* `pre-token-generation.handler.ts
|
|
623
|
-
*
|
|
624
|
-
*
|
|
625
|
-
* 1.
|
|
626
|
-
*
|
|
627
|
-
*
|
|
705
|
+
* `pre-token-generation.handler.ts`. Carries no user-facing
|
|
706
|
+
* content; exists purely so the JWT fallback resolves to a real
|
|
707
|
+
* DynamoDB row instead of dangling.
|
|
708
|
+
* 1. On-site-medical UAT demo tenant — every seeded dev user's
|
|
709
|
+
* `currentTenant`/`currentWorkspace`. Downstream demo-data
|
|
710
|
+
* tickets (providers, facilities, patients) attach to this
|
|
711
|
+
* tenant via {@link ON_SITE_DEMO_TENANT_ID}.
|
|
712
|
+
* 2. Single-workspace wound-care tenant.
|
|
713
|
+
* 3. Single-workspace primary-care tenant.
|
|
714
|
+
* 4. Two-workspace mixed tenant — exercises the cross-workspace
|
|
628
715
|
* isolation flow that single-workspace tenants cannot.
|
|
629
716
|
*/
|
|
630
717
|
declare const DEMO_TENANT_SPECS: ReadonlyArray<DemoTenantSpec>;
|
|
@@ -2730,6 +2817,113 @@ declare class OpenHiRestApiService extends OpenHiService {
|
|
|
2730
2817
|
protected resolveRuntimeConfigEnvVars(): Record<string, string>;
|
|
2731
2818
|
}
|
|
2732
2819
|
|
|
2820
|
+
/**
|
|
2821
|
+
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/counter-maintenance/events.md
|
|
2822
|
+
*
|
|
2823
|
+
* Wiring constants for the ADR-028 counter-maintenance consumer: the
|
|
2824
|
+
* dedup consumer name and the set of `openhi.control` detail-types the
|
|
2825
|
+
* EventBridge rule routes to the Lambda.
|
|
2826
|
+
*/
|
|
2827
|
+
/**
|
|
2828
|
+
* Stable logical name this workflow registers with the shared
|
|
2829
|
+
* `WorkflowDedupTable` (TR-015). Used in both the construct grant
|
|
2830
|
+
* (`WorkflowDedupTable.grantConsumerFromLookup(... , COUNTER_MAINTENANCE_CONSUMER_NAME)`)
|
|
2831
|
+
* and the handler's runtime `recordIfAbsent` call — keep them aligned by
|
|
2832
|
+
* importing this constant in both places.
|
|
2833
|
+
*/
|
|
2834
|
+
declare const COUNTER_MAINTENANCE_CONSUMER_NAME = "counter-maintenance";
|
|
2835
|
+
/**
|
|
2836
|
+
* The six `openhi.control` detail-types the counter-maintenance consumer
|
|
2837
|
+
* subscribes to. The EventBridge rule matches `source: ["openhi.control"]`
|
|
2838
|
+
* and this exact detail-type list; the handler dispatches on the
|
|
2839
|
+
* `detail-type` to choose the counter routing.
|
|
2840
|
+
*/
|
|
2841
|
+
declare const COUNTER_MAINTENANCE_DETAIL_TYPES: readonly [string, string, string, string, string, string];
|
|
2842
|
+
|
|
2843
|
+
interface CounterMaintenanceLambdaProps {
|
|
2844
|
+
/**
|
|
2845
|
+
* Control event bus carrying the `openhi.control` membership /
|
|
2846
|
+
* role-assignment / workspace lifecycle events. The Rule mounts here.
|
|
2847
|
+
*/
|
|
2848
|
+
readonly controlEventBus: IEventBus;
|
|
2849
|
+
/**
|
|
2850
|
+
* Data-store table the consumer applies atomic counter ADDs against.
|
|
2851
|
+
* Wired via `DYNAMO_TABLE_NAME`; granted `dynamodb:UpdateItem` (the
|
|
2852
|
+
* counter mutation is a conditional `ADD` — no reads, no other writes).
|
|
2853
|
+
*/
|
|
2854
|
+
readonly dataStoreTable: ITable;
|
|
2855
|
+
}
|
|
2856
|
+
/** Lambda + EventBridge Rule for the counter-maintenance consumer. */
|
|
2857
|
+
declare class CounterMaintenanceLambda extends Construct {
|
|
2858
|
+
readonly lambda: NodejsFunction;
|
|
2859
|
+
readonly rule: Rule;
|
|
2860
|
+
constructor(scope: Construct, props: CounterMaintenanceLambdaProps);
|
|
2861
|
+
}
|
|
2862
|
+
|
|
2863
|
+
/**
|
|
2864
|
+
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/counter-maintenance/counter-maintenance-workflow.md
|
|
2865
|
+
*
|
|
2866
|
+
* ADR-028 counter-maintenance workflow. Subscribes to the control-plane
|
|
2867
|
+
* membership / role-assignment / workspace lifecycle events on the
|
|
2868
|
+
* control event bus and maintains the denormalized counters on the
|
|
2869
|
+
* canonical Tenant / Workspace / User records via idempotent atomic ADD.
|
|
2870
|
+
*
|
|
2871
|
+
* Mounted on the data-service stack so the IAM grant against the
|
|
2872
|
+
* data-store table stays local. The control event bus and the workflow
|
|
2873
|
+
* dedup table reach in cross-stack via the SSM lookups
|
|
2874
|
+
* `OpenHiGlobalService.controlEventBusFromConstruct` and
|
|
2875
|
+
* `WorkflowDedupTable.grantConsumerFromLookup` respectively — the same
|
|
2876
|
+
* pattern the seed-demo-data workflow uses.
|
|
2877
|
+
*/
|
|
2878
|
+
interface CounterMaintenanceWorkflowProps {
|
|
2879
|
+
/** Control event bus carrying the `openhi.control` counter-relevant events. */
|
|
2880
|
+
readonly controlEventBus: IEventBus;
|
|
2881
|
+
/** Data-store table the counters live on / are mutated against. */
|
|
2882
|
+
readonly dataStoreTable: ITable;
|
|
2883
|
+
}
|
|
2884
|
+
/** Composes the counter-maintenance Lambda and wires it to the dedup table. */
|
|
2885
|
+
declare class CounterMaintenanceWorkflow extends Construct {
|
|
2886
|
+
readonly counterMaintenance: CounterMaintenanceLambda;
|
|
2887
|
+
constructor(scope: Construct, props: CounterMaintenanceWorkflowProps);
|
|
2888
|
+
}
|
|
2889
|
+
|
|
2890
|
+
interface CounterReconciliationLambdaProps {
|
|
2891
|
+
/**
|
|
2892
|
+
* Data-store table the job recomputes counters from and SETs the
|
|
2893
|
+
* repaired values onto. Wired via `DYNAMO_TABLE_NAME`; granted read +
|
|
2894
|
+
* write because the sweep reads every canonical record (and its GSI1 /
|
|
2895
|
+
* projection rows) and writes the recomputed counter back.
|
|
2896
|
+
*/
|
|
2897
|
+
readonly dataStoreTable: ITable;
|
|
2898
|
+
}
|
|
2899
|
+
/** On-demand Lambda for the counter-reconciliation job (no EventBridge trigger). */
|
|
2900
|
+
declare class CounterReconciliationLambda extends Construct {
|
|
2901
|
+
readonly lambda: NodejsFunction;
|
|
2902
|
+
constructor(scope: Construct, props: CounterReconciliationLambdaProps);
|
|
2903
|
+
}
|
|
2904
|
+
|
|
2905
|
+
/**
|
|
2906
|
+
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/counter-reconciliation/counter-reconciliation-workflow.md
|
|
2907
|
+
*
|
|
2908
|
+
* ADR-028 counter-reconciliation workflow. Composes the on-demand
|
|
2909
|
+
* reconciliation Lambda and mounts it on the data-service stack so the
|
|
2910
|
+
* DynamoDB grant against the data-store table stays local.
|
|
2911
|
+
*
|
|
2912
|
+
* Unlike the event-driven counter-maintenance workflow, this job needs no
|
|
2913
|
+
* control-event-bus subscription and no `WorkflowDedupTable` wiring — it
|
|
2914
|
+
* is invoked on demand and is idempotent (it SETs absolute recomputed
|
|
2915
|
+
* values, so re-running corrects nothing on unchanged data).
|
|
2916
|
+
*/
|
|
2917
|
+
interface CounterReconciliationWorkflowProps {
|
|
2918
|
+
/** Data-store table the job recomputes counters from / repairs. */
|
|
2919
|
+
readonly dataStoreTable: ITable;
|
|
2920
|
+
}
|
|
2921
|
+
/** Composes the counter-reconciliation Lambda. */
|
|
2922
|
+
declare class CounterReconciliationWorkflow extends Construct {
|
|
2923
|
+
readonly counterReconciliation: CounterReconciliationLambda;
|
|
2924
|
+
constructor(scope: Construct, props: CounterReconciliationWorkflowProps);
|
|
2925
|
+
}
|
|
2926
|
+
|
|
2733
2927
|
/**
|
|
2734
2928
|
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/seed-demo-data/data-plane-fixtures.md
|
|
2735
2929
|
*
|
|
@@ -2769,6 +2963,111 @@ interface DemoWorkspaceDataPlaneFixtures {
|
|
|
2769
2963
|
readonly observations: ReadonlyArray<Observation>;
|
|
2770
2964
|
readonly encounters: ReadonlyArray<Encounter>;
|
|
2771
2965
|
readonly accounts: ReadonlyArray<Account>;
|
|
2966
|
+
/**
|
|
2967
|
+
* Facility (FHIR Location) fixtures. Optional — only the
|
|
2968
|
+
* on-site UAT demo workspace seeds facilities (#1303). Defaults
|
|
2969
|
+
* to the empty array when omitted.
|
|
2970
|
+
*/
|
|
2971
|
+
readonly locations?: ReadonlyArray<Location>;
|
|
2972
|
+
/**
|
|
2973
|
+
* Directory Organization fixtures (#1308). Optional — only the
|
|
2974
|
+
* on-site UAT demo workspace seeds Organizations today. Covers
|
|
2975
|
+
* DME suppliers and insurance payor contacts; defaults to the
|
|
2976
|
+
* empty array when omitted.
|
|
2977
|
+
*/
|
|
2978
|
+
readonly organizations?: ReadonlyArray<Organization>;
|
|
2979
|
+
/**
|
|
2980
|
+
* Insurance Coverage fixtures (#1304). Optional — only the
|
|
2981
|
+
* on-site UAT demo workspace seeds Coverages today. Defaults to
|
|
2982
|
+
* the empty array when omitted. Coverages reference their
|
|
2983
|
+
* `beneficiary` Patient via `Patient/<id>`, so the seeder writes
|
|
2984
|
+
* Coverages after Patients in the same workspace pass.
|
|
2985
|
+
*/
|
|
2986
|
+
readonly coverages?: ReadonlyArray<Coverage>;
|
|
2987
|
+
/**
|
|
2988
|
+
* Optional dynamic Patient builder. Resolved by the seeder at
|
|
2989
|
+
* write time so per-tenant fixtures that depend on other
|
|
2990
|
+
* fixture modules (cross-module references between blocks +
|
|
2991
|
+
* facilities + facility patients) can be evaluated lazily,
|
|
2992
|
+
* avoiding the TDZ that hits when one fixture module reads a
|
|
2993
|
+
* top-level const from another mid-cycle. When set, the seeder
|
|
2994
|
+
* iterates `buildPatients()` instead of `patients`.
|
|
2995
|
+
*/
|
|
2996
|
+
readonly buildPatients?: () => ReadonlyArray<Patient>;
|
|
2997
|
+
/**
|
|
2998
|
+
* Optional dynamic Coverage builder. Same lazy-evaluation
|
|
2999
|
+
* contract as {@link buildPatients}.
|
|
3000
|
+
*/
|
|
3001
|
+
readonly buildCoverages?: () => ReadonlyArray<Coverage>;
|
|
3002
|
+
/**
|
|
3003
|
+
* Optional dynamic Appointment builder. Resolved by the seeder
|
|
3004
|
+
* with `baseContext` so block-style Appointments can anchor
|
|
3005
|
+
* their recurrence to the current ISO week (#1303 — block
|
|
3006
|
+
* Appointments must show up at a useful position on the demo
|
|
3007
|
+
* calendar relative to "today"). When omitted, no Appointments
|
|
3008
|
+
* are written for this workspace.
|
|
3009
|
+
*/
|
|
3010
|
+
readonly buildAppointments?: (baseContext: OpenHiContext) => ReadonlyArray<Appointment>;
|
|
3011
|
+
/**
|
|
3012
|
+
* Optional static wound / problem Condition fixtures (#1306).
|
|
3013
|
+
* Wound Conditions reference their Patient via `subject` and
|
|
3014
|
+
* sit upstream of wound-exam Observations (which reference the
|
|
3015
|
+
* Condition via `focus`) and wound Procedures (which reference
|
|
3016
|
+
* the Condition via `reasonReference`). The seeder writes
|
|
3017
|
+
* Conditions immediately after Patients so the reference chain
|
|
3018
|
+
* resolves cleanly on read paths.
|
|
3019
|
+
*/
|
|
3020
|
+
readonly conditions?: ReadonlyArray<Condition>;
|
|
3021
|
+
/**
|
|
3022
|
+
* Optional static Procedure fixtures (#1306). Procedures
|
|
3023
|
+
* reference their Encounter via `encounter`, their wound
|
|
3024
|
+
* Condition via `reasonReference[0]`, and their Patient via
|
|
3025
|
+
* `subject`. Written after Encounters and Conditions so the
|
|
3026
|
+
* reference chain resolves cleanly on read paths.
|
|
3027
|
+
*/
|
|
3028
|
+
readonly procedures?: ReadonlyArray<Procedure>;
|
|
3029
|
+
/**
|
|
3030
|
+
* Optional dynamic Condition builder. Same lazy-evaluation
|
|
3031
|
+
* contract as {@link buildPatients} — used so the on-site
|
|
3032
|
+
* encounter fixtures can anchor wound Conditions to the same
|
|
3033
|
+
* `baseContext.date` window the encounter dates are derived
|
|
3034
|
+
* from.
|
|
3035
|
+
*/
|
|
3036
|
+
readonly buildConditions?: (baseContext: OpenHiContext) => ReadonlyArray<Condition>;
|
|
3037
|
+
/**
|
|
3038
|
+
* Optional dynamic Encounter builder. Same lazy-evaluation
|
|
3039
|
+
* contract as {@link buildPatients} — encounter dates depend on
|
|
3040
|
+
* `baseContext.date` (past block occurrences for facility
|
|
3041
|
+
* patients, past visit cadence for home-health patients).
|
|
3042
|
+
*/
|
|
3043
|
+
readonly buildEncounters?: (baseContext: OpenHiContext) => ReadonlyArray<Encounter>;
|
|
3044
|
+
/**
|
|
3045
|
+
* Optional dynamic Observation builder. Same lazy-evaluation
|
|
3046
|
+
* contract as {@link buildPatients} — wound-exam Observations
|
|
3047
|
+
* reference encounters that depend on `baseContext.date`.
|
|
3048
|
+
*/
|
|
3049
|
+
readonly buildObservations?: (baseContext: OpenHiContext) => ReadonlyArray<Observation>;
|
|
3050
|
+
/**
|
|
3051
|
+
* Optional dynamic Procedure builder. Same lazy-evaluation
|
|
3052
|
+
* contract as {@link buildPatients} — wound Procedures
|
|
3053
|
+
* reference encounters that depend on `baseContext.date`.
|
|
3054
|
+
*/
|
|
3055
|
+
readonly buildProcedures?: (baseContext: OpenHiContext) => ReadonlyArray<Procedure>;
|
|
3056
|
+
/**
|
|
3057
|
+
* Optional dynamic Claim builder (#1307). Claims reference
|
|
3058
|
+
* the encounter they bill via `item[].encounter`, the
|
|
3059
|
+
* patient's primary Coverage via `insurance[0].coverage`, and
|
|
3060
|
+
* therefore depend on the encounter + coverage builders above.
|
|
3061
|
+
* Written after Procedures so every reference chain resolves
|
|
3062
|
+
* cleanly on read paths.
|
|
3063
|
+
*/
|
|
3064
|
+
readonly buildClaims?: (baseContext: OpenHiContext) => ReadonlyArray<Claim>;
|
|
3065
|
+
/**
|
|
3066
|
+
* Optional dynamic PaymentNotice builder (#1307). One
|
|
3067
|
+
* PaymentNotice per accepted Claim; references the Claim via
|
|
3068
|
+
* `request` + `payment`. Written after Claims.
|
|
3069
|
+
*/
|
|
3070
|
+
readonly buildPaymentNotices?: (baseContext: OpenHiContext) => ReadonlyArray<PaymentNotice>;
|
|
2772
3071
|
}
|
|
2773
3072
|
/**
|
|
2774
3073
|
* Per-workspace fixtures the data-plane phase writes on every fire.
|
|
@@ -2808,6 +3107,1041 @@ declare const DEMO_DATA_PLANE_FIXTURES: ReadonlyArray<DemoWorkspaceDataPlaneFixt
|
|
|
2808
3107
|
*/
|
|
2809
3108
|
declare const PLATFORM_SCOPE_TENANT_ID = "platform";
|
|
2810
3109
|
|
|
3110
|
+
/**
|
|
3111
|
+
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/seed-demo-data/on-site-demo-blocks.md
|
|
3112
|
+
*
|
|
3113
|
+
* Hand-authored weekly scheduling block fixtures the
|
|
3114
|
+
* `seed-demo-data` workflow upserts into the on-site-medical UAT
|
|
3115
|
+
* demo tenant ({@link ON_SITE_DEMO_TENANT_ID} +
|
|
3116
|
+
* {@link ON_SITE_DEMO_WORKSPACE_ID}) on every non-prod deploy
|
|
3117
|
+
* (issue #1303).
|
|
3118
|
+
*
|
|
3119
|
+
* Modelling choice: blocks are represented as FHIR
|
|
3120
|
+
* `Appointment` resources with `appointmentType.code = "block"`
|
|
3121
|
+
* (matching the on-site app's `isBlockAppointment` helper at
|
|
3122
|
+
* `sites/app-ehr/src/types/appointment.ts`). The on-site
|
|
3123
|
+
* calendar reads `Appointment` records, not `Schedule`/`Slot`
|
|
3124
|
+
* resources, so seeding `Appointment`s is the path that
|
|
3125
|
+
* actually renders something for UAT testers. Each block is
|
|
3126
|
+
* "recurring weekly" — we materialize that as a window of
|
|
3127
|
+
* concrete weekly occurrences anchored to the week containing
|
|
3128
|
+
* the seeder's `baseContext.date`, so blocks always show up at
|
|
3129
|
+
* a useful position relative to "today" on the demo schedule.
|
|
3130
|
+
*
|
|
3131
|
+
* Topology — issue #1303 design:
|
|
3132
|
+
* - Facility 1 (Druid Hills Skilled Nursing) — TWO weekly
|
|
3133
|
+
* blocks: Tuesday + Thursday (the high-volume facility).
|
|
3134
|
+
* - Facility 2 (Buckhead Rehabilitation Center) — one
|
|
3135
|
+
* weekly block on Wednesday.
|
|
3136
|
+
* - Facility 3 (Decatur Senior Living) — one weekly block
|
|
3137
|
+
* on Monday.
|
|
3138
|
+
*
|
|
3139
|
+
* Each block is assigned one doctor and one scribe from the
|
|
3140
|
+
* demo provider pool (#1302). Doctors are distributed so no
|
|
3141
|
+
* single doctor covers all four blocks. Capacities accommodate
|
|
3142
|
+
* 12-20 patients each (the upstream patient-distribution
|
|
3143
|
+
* ticket #1304 reads {@link ON_SITE_DEMO_BLOCK_CAPACITY_EXTENSION_URL}
|
|
3144
|
+
* to spread patients across blocks).
|
|
3145
|
+
*/
|
|
3146
|
+
/**
|
|
3147
|
+
* Extension URL stamped on every block Appointment carrying the
|
|
3148
|
+
* block's intended capacity (number of patients the block can
|
|
3149
|
+
* accommodate). FHIR Appointment has no first-class capacity
|
|
3150
|
+
* field, so we publish a local URL under the on-site
|
|
3151
|
+
* convention.
|
|
3152
|
+
*/
|
|
3153
|
+
declare const ON_SITE_DEMO_BLOCK_CAPACITY_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/block-capacity";
|
|
3154
|
+
/** Coding system the on-site app expects on Appointment.appointmentType. */
|
|
3155
|
+
declare const ON_SITE_APPOINTMENT_TYPE_SYSTEM = "https://onsite-medical.org/appointment-type";
|
|
3156
|
+
/**
|
|
3157
|
+
* Weeks of past occurrences materialized per block. Past
|
|
3158
|
+
* occurrences let UAT testers exercise "history" views without
|
|
3159
|
+
* waiting through time.
|
|
3160
|
+
*/
|
|
3161
|
+
declare const BLOCK_OCCURRENCE_WEEKS_PAST = 4;
|
|
3162
|
+
/**
|
|
3163
|
+
* Weeks of future occurrences materialized per block. Future
|
|
3164
|
+
* occurrences cover the calendar's default "month ahead"
|
|
3165
|
+
* window plus room for testers to navigate forward.
|
|
3166
|
+
*/
|
|
3167
|
+
declare const BLOCK_OCCURRENCE_WEEKS_FUTURE = 8;
|
|
3168
|
+
/**
|
|
3169
|
+
* Total weekly occurrences materialized per block template
|
|
3170
|
+
* (past + current week + future). Re-fires with the same
|
|
3171
|
+
* `baseContext.date` produce byte-identical occurrence ids.
|
|
3172
|
+
*/
|
|
3173
|
+
declare const BLOCK_OCCURRENCES_PER_TEMPLATE: number;
|
|
3174
|
+
/**
|
|
3175
|
+
* ISO day-of-week index used by {@link BlockTemplate.dayOfWeek}.
|
|
3176
|
+
* 1 = Monday, ..., 7 = Sunday (matches ISO 8601 / FHIR usage).
|
|
3177
|
+
*/
|
|
3178
|
+
type IsoDayOfWeek = 1 | 2 | 3 | 4 | 5 | 6 | 7;
|
|
3179
|
+
/** Stable block-template ids in dispatch order. Re-exported for downstream tickets. */
|
|
3180
|
+
declare const ON_SITE_DEMO_BLOCK_TEMPLATE_IDS: ReadonlyArray<string>;
|
|
3181
|
+
/**
|
|
3182
|
+
* Materialize every block template's weekly occurrences,
|
|
3183
|
+
* anchored to the Monday of the ISO week containing
|
|
3184
|
+
* `referenceIso` (typically `baseContext.date`). Each template
|
|
3185
|
+
* produces {@link BLOCK_OCCURRENCES_PER_TEMPLATE} appointments:
|
|
3186
|
+
* `BLOCK_OCCURRENCE_WEEKS_PAST` past weeks, the current week,
|
|
3187
|
+
* and `BLOCK_OCCURRENCE_WEEKS_FUTURE` future weeks. With the
|
|
3188
|
+
* default window of 4 + 1 + 8 = 13 occurrences per template ×
|
|
3189
|
+
* 4 templates, the seeder writes 52 block Appointments per
|
|
3190
|
+
* fire.
|
|
3191
|
+
*
|
|
3192
|
+
* Idempotency: ids are derived from `(templateId, weekOffset)`,
|
|
3193
|
+
* not from a wall-clock timestamp, so re-fires of the seeder
|
|
3194
|
+
* with the same `referenceIso` upsert the same Appointment
|
|
3195
|
+
* records (no duplicates). A re-fire with a different
|
|
3196
|
+
* `referenceIso` (e.g., the deploy event days later) writes a
|
|
3197
|
+
* new set of occurrences and leaves prior weeks' records as
|
|
3198
|
+
* orphaned past history — that is acceptable for UAT.
|
|
3199
|
+
*/
|
|
3200
|
+
declare const buildOnSiteDemoBlockAppointments: (referenceIso: string) => ReadonlyArray<Appointment>;
|
|
3201
|
+
/**
|
|
3202
|
+
* Stable per-template (doctor, scribe) pair for the on-site
|
|
3203
|
+
* block schedule. Downstream tickets (e.g., the patient-
|
|
3204
|
+
* distribution helper in #1304) call this to look up which
|
|
3205
|
+
* provider pair staffs a given block without re-reading the
|
|
3206
|
+
* block-template list.
|
|
3207
|
+
*/
|
|
3208
|
+
declare const findOnSiteDemoBlockTemplate: (templateId: string) => {
|
|
3209
|
+
readonly id: string;
|
|
3210
|
+
readonly facilityId: string;
|
|
3211
|
+
readonly displayName: string;
|
|
3212
|
+
readonly doctorId: string;
|
|
3213
|
+
readonly scribeId: string;
|
|
3214
|
+
readonly capacity: number;
|
|
3215
|
+
readonly dayOfWeek: IsoDayOfWeek;
|
|
3216
|
+
} | undefined;
|
|
3217
|
+
|
|
3218
|
+
/**
|
|
3219
|
+
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/seed-demo-data/on-site-demo-claims.md
|
|
3220
|
+
*
|
|
3221
|
+
* Hand-authored Claim + PaymentNotice fixtures the `seed-demo-data`
|
|
3222
|
+
* workflow upserts into the on-site-medical UAT demo tenant
|
|
3223
|
+
* ({@link ON_SITE_DEMO_TENANT_ID} + {@link ON_SITE_DEMO_WORKSPACE_ID})
|
|
3224
|
+
* on every non-prod deploy (issue #1307).
|
|
3225
|
+
*
|
|
3226
|
+
* Topology — issue #1307 design:
|
|
3227
|
+
* - For each historical encounter (#1306), decide deterministically
|
|
3228
|
+
* whether the visit is billed or explicitly unbilled. The unbilled
|
|
3229
|
+
* decision is recorded by the *absence* of a Claim resource on
|
|
3230
|
+
* that encounter id; the on-site UI can derive "unbilled" by
|
|
3231
|
+
* listing claims and finding no match for an encounter.
|
|
3232
|
+
* - Billed encounters get exactly one {@link Claim} resource keyed
|
|
3233
|
+
* `<encounter-id>-claim`. The Claim carries:
|
|
3234
|
+
* - `status: "active"` (FHIR R4 enum only has
|
|
3235
|
+
* `active|cancelled|draft|entered-in-error`, none of which
|
|
3236
|
+
* encode our domain workflow status — see
|
|
3237
|
+
* {@link CLAIM_WORKFLOW_STATUS_EXTENSION_URL}).
|
|
3238
|
+
* - `claim-workflow-status` extension carrying the domain
|
|
3239
|
+
* status: `submitted` / `accepted` / `rejected` /
|
|
3240
|
+
* `reworked` / `resubmitted`.
|
|
3241
|
+
* - `insurance[0].coverage` referencing the patient's primary
|
|
3242
|
+
* {@link Coverage} (which is what carries the actual payor).
|
|
3243
|
+
* - `item[]` carrying one line: a wound-debridement CPT for
|
|
3244
|
+
* encounters that have a procedure (#1306), otherwise an
|
|
3245
|
+
* E/M visit code (99213/99214/99215) chosen deterministically.
|
|
3246
|
+
* - `total` denormalised from the single line item's `net`.
|
|
3247
|
+
* - Accepted claims get a {@link PaymentNotice} resource keyed
|
|
3248
|
+
* `<encounter-id>-payment` whose `paymentStatus` CodeableConcept
|
|
3249
|
+
* carries the domain payment status: `partial` / `full` /
|
|
3250
|
+
* `write-off`. Submitted / rejected / reworked / resubmitted
|
|
3251
|
+
* claims do not emit a PaymentNotice — the "in flux" subset is
|
|
3252
|
+
* specifically every `submitted` claim with no PaymentNotice.
|
|
3253
|
+
*
|
|
3254
|
+
* Modelling choices:
|
|
3255
|
+
* - **Single Claim per encounter** (not a chain). The "reworked"
|
|
3256
|
+
* status implies history (original rejected → resubmitted),
|
|
3257
|
+
* denormalised onto the same Claim via the
|
|
3258
|
+
* `claim-workflow-status` extension. On-site's current UI
|
|
3259
|
+
* (`sites/app-ehr/src/pages/patient/tabs/insurance/ClaimsTable.tsx`)
|
|
3260
|
+
* shows a single status badge per claim and does not need a
|
|
3261
|
+
* chain to render correctly.
|
|
3262
|
+
* - **PaymentNotice over a denormalised payment summary** —
|
|
3263
|
+
* PaymentNotice operations already exist in the data layer
|
|
3264
|
+
* (`packages/@openhi/constructs/src/data/operations/data/paymentnotice/`),
|
|
3265
|
+
* so we lean on real FHIR resources rather than adding a new
|
|
3266
|
+
* extension schema.
|
|
3267
|
+
* - **Domain status as an extension** — FHIR R4 `Claim.status`
|
|
3268
|
+
* does not include the workflow-status concepts the demo
|
|
3269
|
+
* needs, and stamping a non-standard string onto the enum
|
|
3270
|
+
* would fail the zod schema. The extension approach mirrors
|
|
3271
|
+
* how on-site already encodes domain state on other
|
|
3272
|
+
* resources (hospice status, QMB status, care-context, etc.).
|
|
3273
|
+
*
|
|
3274
|
+
* Distribution targets — chosen so all 5 workflow statuses plus
|
|
3275
|
+
* unbilled appear in the demo data, with payment-status variety
|
|
3276
|
+
* on the accepted bucket and a meaningful "in flux" submitted
|
|
3277
|
+
* bucket:
|
|
3278
|
+
* - ~15% of encounters are unbilled (no Claim)
|
|
3279
|
+
* - ~20% of claims are submitted (no PaymentNotice — "in flux")
|
|
3280
|
+
* - ~45% of claims are accepted (with PaymentNotice)
|
|
3281
|
+
* - ~40% of accepted: partial payment
|
|
3282
|
+
* - ~40% of accepted: full payment
|
|
3283
|
+
* - ~20% of accepted: write-off
|
|
3284
|
+
* - ~10% of claims are rejected
|
|
3285
|
+
* - ~15% of claims are reworked
|
|
3286
|
+
* - ~10% of claims are resubmitted
|
|
3287
|
+
*
|
|
3288
|
+
* Ids are deterministic — re-fires upsert the same records,
|
|
3289
|
+
* matching the workflow's idempotency contract.
|
|
3290
|
+
*/
|
|
3291
|
+
/**
|
|
3292
|
+
* Extension URL stamped on every seeded Claim recording the
|
|
3293
|
+
* domain workflow status — submitted / accepted / rejected /
|
|
3294
|
+
* reworked / resubmitted. FHIR R4 `Claim.status` only carries
|
|
3295
|
+
* the lifecycle states `active|cancelled|draft|entered-in-error`,
|
|
3296
|
+
* so the demo's workflow status sits on this extension instead
|
|
3297
|
+
* of squeezing into the base enum.
|
|
3298
|
+
*/
|
|
3299
|
+
declare const CLAIM_WORKFLOW_STATUS_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/claim-workflow-status";
|
|
3300
|
+
/** Sub-extension under {@link CLAIM_WORKFLOW_STATUS_EXTENSION_URL}. */
|
|
3301
|
+
declare const CLAIM_WORKFLOW_STATUS_VALUE_SUB_EXTENSION_URL = "status";
|
|
3302
|
+
/** Sub-extension under {@link CLAIM_WORKFLOW_STATUS_EXTENSION_URL}. */
|
|
3303
|
+
declare const CLAIM_WORKFLOW_STATUS_LAST_TRANSITION_SUB_EXTENSION_URL = "lastTransition";
|
|
3304
|
+
/**
|
|
3305
|
+
* Domain workflow status values written to
|
|
3306
|
+
* {@link CLAIM_WORKFLOW_STATUS_EXTENSION_URL}.
|
|
3307
|
+
*/
|
|
3308
|
+
declare const CLAIM_WORKFLOW_STATUS: {
|
|
3309
|
+
readonly SUBMITTED: "submitted";
|
|
3310
|
+
readonly ACCEPTED: "accepted";
|
|
3311
|
+
readonly REJECTED: "rejected";
|
|
3312
|
+
readonly REWORKED: "reworked";
|
|
3313
|
+
readonly RESUBMITTED: "resubmitted";
|
|
3314
|
+
};
|
|
3315
|
+
type ClaimWorkflowStatus = (typeof CLAIM_WORKFLOW_STATUS)[keyof typeof CLAIM_WORKFLOW_STATUS];
|
|
3316
|
+
/**
|
|
3317
|
+
* Domain payment status values written to
|
|
3318
|
+
* {@link PaymentNotice.paymentStatus} on accepted claims.
|
|
3319
|
+
*/
|
|
3320
|
+
declare const PAYMENT_STATUS: {
|
|
3321
|
+
readonly PARTIAL: "partial";
|
|
3322
|
+
readonly FULL: "full";
|
|
3323
|
+
readonly WRITE_OFF: "write-off";
|
|
3324
|
+
};
|
|
3325
|
+
type PaymentStatus = (typeof PAYMENT_STATUS)[keyof typeof PAYMENT_STATUS];
|
|
3326
|
+
/** CodeSystem URL stamped on the {@link PaymentNotice.paymentStatus} coding. */
|
|
3327
|
+
declare const PAYMENT_STATUS_SYSTEM = "https://on-site-medical.app/fhir/CodeSystem/payment-status";
|
|
3328
|
+
/**
|
|
3329
|
+
* Test seam — clear caches between test invocations so stale
|
|
3330
|
+
* state from a prior seed run does not leak into the next.
|
|
3331
|
+
*/
|
|
3332
|
+
declare const __resetOnSiteDemoClaimCachesForTests: () => void;
|
|
3333
|
+
/**
|
|
3334
|
+
* Materialise every Claim resource for the on-site UAT demo
|
|
3335
|
+
* workspace. Walks every historical encounter (#1306); skips the
|
|
3336
|
+
* ~15% flagged as unbilled. Returns an empty array if no
|
|
3337
|
+
* encounter metadata is available (intake-only deployments).
|
|
3338
|
+
*/
|
|
3339
|
+
declare const buildOnSiteDemoClaims: (referenceIso: string) => ReadonlyArray<Claim>;
|
|
3340
|
+
/**
|
|
3341
|
+
* Materialise every PaymentNotice resource for the on-site UAT
|
|
3342
|
+
* demo workspace. One per `accepted` Claim (no PaymentNotice on
|
|
3343
|
+
* submitted / rejected / reworked / resubmitted — submitted-with-
|
|
3344
|
+
* no-payment is the "in flux" subset the AC asks for).
|
|
3345
|
+
*/
|
|
3346
|
+
declare const buildOnSiteDemoPaymentNotices: (referenceIso: string) => ReadonlyArray<PaymentNotice>;
|
|
3347
|
+
/**
|
|
3348
|
+
* Stable list of every Claim id seeded for the on-site UAT demo
|
|
3349
|
+
* workspace, anchored to `referenceIso`. Order matches the
|
|
3350
|
+
* underlying encounter list. Downstream tickets (#1308 — billing
|
|
3351
|
+
* directory, etc.) read this to fan out per-claim work.
|
|
3352
|
+
*/
|
|
3353
|
+
declare const onSiteDemoClaimIds: (referenceIso: string) => ReadonlyArray<string>;
|
|
3354
|
+
/**
|
|
3355
|
+
* Stable list of every PaymentNotice id seeded for the on-site
|
|
3356
|
+
* UAT demo workspace, anchored to `referenceIso`.
|
|
3357
|
+
*/
|
|
3358
|
+
declare const onSiteDemoPaymentNoticeIds: (referenceIso: string) => ReadonlyArray<string>;
|
|
3359
|
+
/**
|
|
3360
|
+
* Encounter ids the seeder flags as unbilled (no Claim emitted).
|
|
3361
|
+
* Exposed so tests and downstream tickets can assert the
|
|
3362
|
+
* unbilled cut without re-deriving the hash.
|
|
3363
|
+
*/
|
|
3364
|
+
declare const onSiteDemoUnbilledEncounterIds: (referenceIso: string) => ReadonlyArray<string>;
|
|
3365
|
+
/**
|
|
3366
|
+
* Encounter ids the seeder flags as billed (one Claim emitted per
|
|
3367
|
+
* id). Exposed so tests and downstream tickets can fan out per
|
|
3368
|
+
* billed encounter without re-deriving the hash.
|
|
3369
|
+
*/
|
|
3370
|
+
declare const onSiteDemoBilledEncounterIds: (referenceIso: string) => ReadonlyArray<string>;
|
|
3371
|
+
|
|
3372
|
+
/**
|
|
3373
|
+
* FHIR `Organization.type[0].coding.system` for the standard
|
|
3374
|
+
* organization-type valueset. Carrying the standard coding alongside
|
|
3375
|
+
* the domain category keeps the bodies interoperable.
|
|
3376
|
+
*/
|
|
3377
|
+
declare const FHIR_ORGANIZATION_TYPE_SYSTEM = "http://terminology.hl7.org/CodeSystem/organization-type";
|
|
3378
|
+
/**
|
|
3379
|
+
* On-site domain category system for directory categorisation —
|
|
3380
|
+
* separates `dme-supplier` from `insurance-payor` so the directory
|
|
3381
|
+
* UI's category filter can match a single coding without parsing
|
|
3382
|
+
* the FHIR-standard `prov` / `pay` codes.
|
|
3383
|
+
*/
|
|
3384
|
+
declare const ON_SITE_DIRECTORY_CATEGORY_SYSTEM = "https://on-site-medical.app/fhir/CodeSystem/directory-category";
|
|
3385
|
+
/** Domain category code stamped on every DME-supplier Organization. */
|
|
3386
|
+
declare const DME_SUPPLIER_CATEGORY_CODE = "dme-supplier";
|
|
3387
|
+
/** Domain category code stamped on every insurance-payor Organization. */
|
|
3388
|
+
declare const INSURANCE_PAYOR_CATEGORY_CODE = "insurance-payor";
|
|
3389
|
+
/**
|
|
3390
|
+
* Sub-category coding system stamped on the payor Organization's
|
|
3391
|
+
* `type[1]` so the directory UI can group payors by plan family
|
|
3392
|
+
* (commercial / Medicare / Medicare Advantage) without re-parsing
|
|
3393
|
+
* the display name. Mirrors the
|
|
3394
|
+
* {@link COVERAGE_PAYOR_TYPE_SYSTEM} convention used on Coverage
|
|
3395
|
+
* resources in #1304.
|
|
3396
|
+
*/
|
|
3397
|
+
declare const INSURANCE_PAYOR_PLAN_TYPE_SYSTEM = "https://on-site-medical.app/fhir/CodeSystem/payor-plan-type";
|
|
3398
|
+
/** Commercial plan payor (Aetna, Cigna, UnitedHealthcare, etc.). */
|
|
3399
|
+
declare const PAYOR_PLAN_TYPE_COMMERCIAL = "commercial";
|
|
3400
|
+
/** Traditional Medicare (FFS) — single payor. */
|
|
3401
|
+
declare const PAYOR_PLAN_TYPE_MEDICARE = "medicare";
|
|
3402
|
+
/** Medicare Advantage plan payor (Humana MA, Anthem MA, etc.). */
|
|
3403
|
+
declare const PAYOR_PLAN_TYPE_MEDICARE_ADVANTAGE = "medicare-advantage";
|
|
3404
|
+
/** Union of the three plan-type codes a payor Organization may carry. */
|
|
3405
|
+
type PayorPlanType = typeof PAYOR_PLAN_TYPE_COMMERCIAL | typeof PAYOR_PLAN_TYPE_MEDICARE | typeof PAYOR_PLAN_TYPE_MEDICARE_ADVANTAGE;
|
|
3406
|
+
/**
|
|
3407
|
+
* Root extension URL stamped on each `qualification[]` entry recording
|
|
3408
|
+
* the per-state credentialing context (state code + status). FHIR R4
|
|
3409
|
+
* `Practitioner_Qualification` carries `identifier`, `code`, `period`,
|
|
3410
|
+
* and `issuer` natively but has no `status` field; the extension fills
|
|
3411
|
+
* that gap without forking the schema.
|
|
3412
|
+
*/
|
|
3413
|
+
declare const PRACTITIONER_CREDENTIALING_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/practitioner-credentialing";
|
|
3414
|
+
/** Sub-extension under {@link PRACTITIONER_CREDENTIALING_EXTENSION_URL}. */
|
|
3415
|
+
declare const PRACTITIONER_CREDENTIALING_STATE_SUB_EXTENSION_URL = "state";
|
|
3416
|
+
/** Sub-extension under {@link PRACTITIONER_CREDENTIALING_EXTENSION_URL}. */
|
|
3417
|
+
declare const PRACTITIONER_CREDENTIALING_STATUS_SUB_EXTENSION_URL = "status";
|
|
3418
|
+
/**
|
|
3419
|
+
* Credentialing status values. Mirrors the wound-care industry
|
|
3420
|
+
* convention — credentialing is either active (license current and in
|
|
3421
|
+
* good standing), suspended (under board action), or expired (lapsed
|
|
3422
|
+
* past expiration date).
|
|
3423
|
+
*/
|
|
3424
|
+
declare const CREDENTIALING_STATUS: {
|
|
3425
|
+
readonly ACTIVE: "active";
|
|
3426
|
+
readonly SUSPENDED: "suspended";
|
|
3427
|
+
readonly EXPIRED: "expired";
|
|
3428
|
+
};
|
|
3429
|
+
type CredentialingStatus = (typeof CREDENTIALING_STATUS)[keyof typeof CREDENTIALING_STATUS];
|
|
3430
|
+
/**
|
|
3431
|
+
* FHIR `Identifier.system` for a US state medical license. Uses the
|
|
3432
|
+
* on-site-medical URL prefix so the identifier round-trips through
|
|
3433
|
+
* the on-site directory UI without colliding with the NPI system.
|
|
3434
|
+
*/
|
|
3435
|
+
declare const STATE_MEDICAL_LICENSE_SYSTEM = "https://on-site-medical.app/fhir/sid/state-medical-license";
|
|
3436
|
+
/** Demo DME-supplier Organizations seeded into the on-site UAT workspace. */
|
|
3437
|
+
declare const ON_SITE_DEMO_DME_SUPPLIERS: ReadonlyArray<Organization>;
|
|
3438
|
+
/** Demo insurance-payor Organizations seeded into the on-site UAT workspace. */
|
|
3439
|
+
declare const ON_SITE_DEMO_INSURANCE_PAYORS: ReadonlyArray<Organization>;
|
|
3440
|
+
/** Stable DME-supplier ids in dispatch order. */
|
|
3441
|
+
declare const onSiteDemoDmeSupplierIds: () => ReadonlyArray<string>;
|
|
3442
|
+
/** Stable insurance-payor ids in dispatch order. */
|
|
3443
|
+
declare const onSiteDemoInsurancePayorIds: () => ReadonlyArray<string>;
|
|
3444
|
+
/**
|
|
3445
|
+
* The full directory Organization pool seeded into the on-site UAT
|
|
3446
|
+
* workspace — DME suppliers followed by insurance payors. The seeder
|
|
3447
|
+
* walks this in order via `buildOrganizations`.
|
|
3448
|
+
*/
|
|
3449
|
+
declare const ON_SITE_DEMO_DIRECTORY_ORGANIZATIONS: ReadonlyArray<Organization>;
|
|
3450
|
+
/**
|
|
3451
|
+
* Per-state credentialing spec for one license. The doctor specs in
|
|
3452
|
+
* `on-site-demo-fixtures.ts` carry a small array of these and the
|
|
3453
|
+
* build helper below converts each into a FHIR
|
|
3454
|
+
* `Practitioner_Qualification` entry appended after the "Physician"
|
|
3455
|
+
* qualification.
|
|
3456
|
+
*/
|
|
3457
|
+
interface PractitionerCredentialingSpec {
|
|
3458
|
+
/** Two-letter USPS state code (GA, AL, TN, …). */
|
|
3459
|
+
readonly state: string;
|
|
3460
|
+
/** State medical board display label used for `issuer.display`. */
|
|
3461
|
+
readonly stateBoardDisplay: string;
|
|
3462
|
+
/** Opaque license number (real format varies by state). */
|
|
3463
|
+
readonly licenseNumber: string;
|
|
3464
|
+
/** ISO date the license was issued. */
|
|
3465
|
+
readonly issued: string;
|
|
3466
|
+
/** ISO date the license expires (after-end-of-period if expired). */
|
|
3467
|
+
readonly expires: string;
|
|
3468
|
+
readonly status: CredentialingStatus;
|
|
3469
|
+
}
|
|
3470
|
+
/**
|
|
3471
|
+
* Lookup helper: per-state credentialing entries for one doctor. Returns
|
|
3472
|
+
* an empty array if the practitioner id is not a seeded on-site doctor.
|
|
3473
|
+
*/
|
|
3474
|
+
declare const practitionerCredentialingForDoctor: (practitionerId: string) => ReadonlyArray<PractitionerCredentialingSpec>;
|
|
3475
|
+
/**
|
|
3476
|
+
* Lookup helper: per-state credentialing entry for a specific
|
|
3477
|
+
* (practitionerId, stateCode) pair. Returns `undefined` when the pair
|
|
3478
|
+
* has no credentialing entry — the on-site UI can render this as
|
|
3479
|
+
* "not credentialed in <state>" without inspecting the full list.
|
|
3480
|
+
*/
|
|
3481
|
+
declare const practitionerCredentialingForState: (practitionerId: string, stateCode: string) => PractitionerCredentialingSpec | undefined;
|
|
3482
|
+
/**
|
|
3483
|
+
* Build the FHIR `qualification[]` entries representing per-state
|
|
3484
|
+
* credentialing for one doctor. The on-site demo doctor builder
|
|
3485
|
+
* appends these after the base "Physician" qualification so the
|
|
3486
|
+
* resulting Practitioner.qualification array carries:
|
|
3487
|
+
* - [0] role label (`{text: "Physician"}`)
|
|
3488
|
+
* - [1..N] per-state licenses (one entry per state in the
|
|
3489
|
+
* credentialing map for this doctor)
|
|
3490
|
+
*
|
|
3491
|
+
* Each license entry's identifier is keyed under
|
|
3492
|
+
* {@link STATE_MEDICAL_LICENSE_SYSTEM} so the on-site UI can pluck the
|
|
3493
|
+
* license number without parsing the issuer display.
|
|
3494
|
+
*/
|
|
3495
|
+
declare const buildCredentialingQualifications: (practitionerId: string) => ReadonlyArray<Practitioner_Qualification>;
|
|
3496
|
+
|
|
3497
|
+
/**
|
|
3498
|
+
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/seed-demo-data/on-site-demo-encounters.md
|
|
3499
|
+
*
|
|
3500
|
+
* Historical Encounter + wound-Condition + wound-exam Observation +
|
|
3501
|
+
* wound-debridement Procedure fixtures the `seed-demo-data` workflow
|
|
3502
|
+
* upserts into the on-site-medical UAT demo tenant
|
|
3503
|
+
* ({@link ON_SITE_DEMO_TENANT_ID} + {@link ON_SITE_DEMO_WORKSPACE_ID})
|
|
3504
|
+
* on every non-prod deploy (issue #1306).
|
|
3505
|
+
*
|
|
3506
|
+
* Topology — issue #1306 design:
|
|
3507
|
+
* - Brand-new intake patients (6 facility intake-only + 3 home
|
|
3508
|
+
* intake-only) get **no** encounters. They carry intake +
|
|
3509
|
+
* insurance only.
|
|
3510
|
+
* - Scheduled facility patients (60 patients across 4 blocks) get
|
|
3511
|
+
* one Encounter per past block occurrence their block ran on
|
|
3512
|
+
* (the `BLOCK_OCCURRENCE_WEEKS_PAST` window = 4 past weeks).
|
|
3513
|
+
* Authored by the block's doctor + scribe, dated to that
|
|
3514
|
+
* occurrence's date.
|
|
3515
|
+
* - Scheduled home-health patients (17 patients) get one Encounter
|
|
3516
|
+
* per past visit at their cadence, stepping back from the
|
|
3517
|
+
* reference date. With cadence 14 days and 4 past visits, the
|
|
3518
|
+
* dates land at -14, -28, -42, -56 days. Authored by the
|
|
3519
|
+
* assigned home-health provider.
|
|
3520
|
+
* - ~70% of scheduled patients carry a "current wound" — one
|
|
3521
|
+
* {@link Condition} per patient with `category.text = "wound"`
|
|
3522
|
+
* plus a deterministic lower-extremity body site and wound type.
|
|
3523
|
+
* Every encounter for that patient records a wound-exam
|
|
3524
|
+
* {@link Observation} (LOINC panel 39135-9) whose components
|
|
3525
|
+
* show progression — length / width / depth shrink (healing) or
|
|
3526
|
+
* grow (worsening) across encounters depending on a
|
|
3527
|
+
* deterministic per-patient trajectory.
|
|
3528
|
+
* - ~25% of wound-bearing patients get one wound-debridement
|
|
3529
|
+
* {@link Procedure} on the most-recent wound encounter, using a
|
|
3530
|
+
* CPT code from the on-site EHR's
|
|
3531
|
+
* `PRESET_PROCEDURES` catalogue (e.g. 97597 Sharp Debridement).
|
|
3532
|
+
*
|
|
3533
|
+
* Modelling choices:
|
|
3534
|
+
* - Encounter `class` follows the on-site EHR's
|
|
3535
|
+
* `ENCOUNTER_CLASS_BY_LOCATION` map at
|
|
3536
|
+
* `sites/app-ehr/src/types/encounter.ts` — facility encounters
|
|
3537
|
+
* carry `code: "IMP", display: "Facility"`; home-health
|
|
3538
|
+
* encounters carry `code: "HH", display: "Home Health"`. The
|
|
3539
|
+
* `system` matches the v3 ActCode URL the on-site EHR reads.
|
|
3540
|
+
* - Wound is encoded as a FHIR {@link Condition} with
|
|
3541
|
+
* `category: [{ text: "wound" }]` (mirroring the on-site
|
|
3542
|
+
* `mapWoundFormToCondition` helper at
|
|
3543
|
+
* `sites/app-ehr/src/pages/visit/encounter/components/AddWoundDialog/woundFormMapping.ts`).
|
|
3544
|
+
* Wound exams are encoded as a single panel Observation per
|
|
3545
|
+
* encounter (LOINC 39135-9), with components for length /
|
|
3546
|
+
* width / depth — matching the on-site `buildWoundExamObservation`
|
|
3547
|
+
* mapper at `sites/app-ehr/src/features/wounds/mappers/woundExamMappers.ts`.
|
|
3548
|
+
* - Procedure carries a CPT code on `code.coding[0]` with system
|
|
3549
|
+
* `http://www.ama-assn.org/go/cpt` (the on-site EHR's
|
|
3550
|
+
* `CPT_SYSTEM` constant). `reasonReference` points at the wound
|
|
3551
|
+
* Condition; `encounter` points at the encounter the procedure
|
|
3552
|
+
* was performed during.
|
|
3553
|
+
*
|
|
3554
|
+
* Ids are deterministic — re-fires upsert the same records,
|
|
3555
|
+
* matching the workflow's idempotency contract.
|
|
3556
|
+
*/
|
|
3557
|
+
/** FHIR v3 ActEncounter coding system, used on `Encounter.class`. */
|
|
3558
|
+
declare const ENCOUNTER_CLASS_SYSTEM = "http://terminology.hl7.org/CodeSystem/v3-ActCode";
|
|
3559
|
+
/** Encounter class coding for facility encounters (on-site `ENCOUNTER_CLASS_BY_LOCATION.facility`). */
|
|
3560
|
+
declare const ENCOUNTER_CLASS_FACILITY: {
|
|
3561
|
+
readonly system: "http://terminology.hl7.org/CodeSystem/v3-ActCode";
|
|
3562
|
+
readonly code: "IMP";
|
|
3563
|
+
readonly display: "Facility";
|
|
3564
|
+
};
|
|
3565
|
+
/** Encounter class coding for home-health encounters (on-site `ENCOUNTER_CLASS_BY_LOCATION.home`). */
|
|
3566
|
+
declare const ENCOUNTER_CLASS_HOME_HEALTH: {
|
|
3567
|
+
readonly system: "http://terminology.hl7.org/CodeSystem/v3-ActCode";
|
|
3568
|
+
readonly code: "HH";
|
|
3569
|
+
readonly display: "Home Health";
|
|
3570
|
+
};
|
|
3571
|
+
/** LOINC system URL used on Observation.code.coding entries. */
|
|
3572
|
+
declare const LOINC_SYSTEM = "http://loinc.org";
|
|
3573
|
+
/** SNOMED CT system URL used on Condition.code / bodySite coding entries. */
|
|
3574
|
+
declare const SNOMED_SYSTEM = "http://snomed.info/sct";
|
|
3575
|
+
/** CPT coding system used on Procedure.code (matches on-site `CPT_SYSTEM`). */
|
|
3576
|
+
declare const CPT_SYSTEM = "http://www.ama-assn.org/go/cpt";
|
|
3577
|
+
/**
|
|
3578
|
+
* LOINC panel code for the wound assessment panel (matches on-site
|
|
3579
|
+
* `WOUND_EXAM_PANEL_CODE` at
|
|
3580
|
+
* `sites/app-ehr/src/features/wounds/types/woundExamCodes.ts`).
|
|
3581
|
+
*/
|
|
3582
|
+
declare const WOUND_EXAM_PANEL_CODE = "39135-9";
|
|
3583
|
+
/** Display for {@link WOUND_EXAM_PANEL_CODE}. */
|
|
3584
|
+
declare const WOUND_EXAM_PANEL_DISPLAY = "Wound assessment panel";
|
|
3585
|
+
/** LOINC component code for wound length (cm). */
|
|
3586
|
+
declare const WOUND_LENGTH_CODE = "39126-8";
|
|
3587
|
+
/** LOINC component code for wound width (cm). */
|
|
3588
|
+
declare const WOUND_WIDTH_CODE = "39125-0";
|
|
3589
|
+
/** LOINC component code for wound depth (cm). */
|
|
3590
|
+
declare const WOUND_DEPTH_CODE = "39127-6";
|
|
3591
|
+
/** LOINC component code for wound status (declining / stagnant / improving). */
|
|
3592
|
+
declare const WOUND_STATUS_CODE = "72311-4";
|
|
3593
|
+
/**
|
|
3594
|
+
* Hl7 condition-clinical system URL used on Condition.clinicalStatus.
|
|
3595
|
+
*/
|
|
3596
|
+
declare const CONDITION_CLINICAL_STATUS_SYSTEM = "http://terminology.hl7.org/CodeSystem/condition-clinical";
|
|
3597
|
+
/**
|
|
3598
|
+
* Number of past home-health visits materialized per scheduled
|
|
3599
|
+
* home-health patient. Matches {@link BLOCK_OCCURRENCE_WEEKS_PAST}
|
|
3600
|
+
* so the facility and home-health populations carry comparable
|
|
3601
|
+
* history depths (~4 historical encounters per scheduled patient).
|
|
3602
|
+
*/
|
|
3603
|
+
declare const HOME_HEALTH_VISITS_PAST = 4;
|
|
3604
|
+
/**
|
|
3605
|
+
* Stable wound-Condition id for a patient. The id is the patient
|
|
3606
|
+
* id suffixed with `-wound-001` — one wound per patient suffices
|
|
3607
|
+
* for UAT.
|
|
3608
|
+
*/
|
|
3609
|
+
declare const woundConditionIdForPatient: (patientId: string) => string;
|
|
3610
|
+
/**
|
|
3611
|
+
* Test seam — clear the spec cache between test invocations so
|
|
3612
|
+
* stale state from a prior seed run does not leak into the next.
|
|
3613
|
+
* Not part of the public API contract.
|
|
3614
|
+
*/
|
|
3615
|
+
declare const __resetOnSiteDemoEncounterCachesForTests: () => void;
|
|
3616
|
+
/**
|
|
3617
|
+
* Materialize every Encounter resource for the on-site UAT demo
|
|
3618
|
+
* workspace. Scheduled facility patients fan out over the past 4
|
|
3619
|
+
* block occurrences; scheduled home-health patients fan out over
|
|
3620
|
+
* the past {@link HOME_HEALTH_VISITS_PAST} cadence visits. Intake-
|
|
3621
|
+
* only patients contribute zero encounters.
|
|
3622
|
+
*/
|
|
3623
|
+
declare const buildOnSiteDemoEncounters: (referenceIso: string) => ReadonlyArray<Encounter>;
|
|
3624
|
+
/**
|
|
3625
|
+
* Materialize every wound {@link Condition} resource for the
|
|
3626
|
+
* on-site UAT demo workspace. One Condition per wound-bearing
|
|
3627
|
+
* patient, dated to that patient's earliest encounter.
|
|
3628
|
+
*/
|
|
3629
|
+
declare const buildOnSiteDemoWoundConditions: (referenceIso: string) => ReadonlyArray<Condition>;
|
|
3630
|
+
/**
|
|
3631
|
+
* Materialize every wound-exam {@link Observation} for the on-site
|
|
3632
|
+
* UAT demo workspace. One per encounter on a wound-bearing
|
|
3633
|
+
* patient, with progressing length / width / depth components.
|
|
3634
|
+
*/
|
|
3635
|
+
declare const buildOnSiteDemoWoundObservations: (referenceIso: string) => ReadonlyArray<Observation>;
|
|
3636
|
+
/**
|
|
3637
|
+
* Materialize every wound-debridement {@link Procedure} for the
|
|
3638
|
+
* on-site UAT demo workspace. One per qualifying wound-bearing
|
|
3639
|
+
* patient, on their most-recent encounter, with a real CPT code.
|
|
3640
|
+
*/
|
|
3641
|
+
declare const buildOnSiteDemoWoundProcedures: (referenceIso: string) => ReadonlyArray<Procedure>;
|
|
3642
|
+
/**
|
|
3643
|
+
* Stable list of every Encounter id seeded for the on-site UAT
|
|
3644
|
+
* demo workspace, anchored to `referenceIso`. Downstream tickets
|
|
3645
|
+
* (e.g. #1307 — claims walking each historical encounter) read
|
|
3646
|
+
* this to fan out per-encounter work without re-deriving the
|
|
3647
|
+
* mapping.
|
|
3648
|
+
*/
|
|
3649
|
+
declare const onSiteDemoEncounterIds: (referenceIso: string) => ReadonlyArray<string>;
|
|
3650
|
+
/**
|
|
3651
|
+
* Encounters scoped to a single patient, ordered earliest first.
|
|
3652
|
+
* Returns the empty array for intake-only patients (no
|
|
3653
|
+
* encounters) and for unknown patient ids.
|
|
3654
|
+
*/
|
|
3655
|
+
declare const onSiteDemoEncountersForPatient: (patientId: string, referenceIso: string) => ReadonlyArray<string>;
|
|
3656
|
+
/**
|
|
3657
|
+
* Public projection of an encounter's seed metadata. Downstream
|
|
3658
|
+
* tickets (e.g. #1307 — claims walking each historical encounter)
|
|
3659
|
+
* read this instead of re-parsing the encounter id string.
|
|
3660
|
+
*/
|
|
3661
|
+
interface OnSiteDemoEncounterMetadata {
|
|
3662
|
+
/** Stable Encounter id. */
|
|
3663
|
+
readonly id: string;
|
|
3664
|
+
/** Patient the encounter is authored against. */
|
|
3665
|
+
readonly patientId: string;
|
|
3666
|
+
/** 1-based sequence ordinal within the patient's encounter list (1 = earliest). */
|
|
3667
|
+
readonly sequence: number;
|
|
3668
|
+
/** Total encounters seeded for this patient. */
|
|
3669
|
+
readonly totalEncounters: number;
|
|
3670
|
+
/** ISO 8601 start instant the encounter is dated to. */
|
|
3671
|
+
readonly periodStart: string;
|
|
3672
|
+
/** Whether this encounter carries a wound-debridement Procedure. */
|
|
3673
|
+
readonly hasWoundProcedure: boolean;
|
|
3674
|
+
}
|
|
3675
|
+
/**
|
|
3676
|
+
* Materialize every encounter's seed metadata for the on-site UAT
|
|
3677
|
+
* demo workspace. Order matches {@link onSiteDemoEncounterIds}.
|
|
3678
|
+
* The `hasWoundProcedure` flag is `true` only on the patient's
|
|
3679
|
+
* most-recent encounter when {@link onSiteDemoWoundProcedurePatientIds}
|
|
3680
|
+
* lists that patient — mirroring the procedure-attachment rule in
|
|
3681
|
+
* {@link buildOnSiteDemoWoundProcedures}.
|
|
3682
|
+
*/
|
|
3683
|
+
declare const onSiteDemoEncounterMetadata: (referenceIso: string) => ReadonlyArray<OnSiteDemoEncounterMetadata>;
|
|
3684
|
+
/**
|
|
3685
|
+
* Subset of patients (facility + home-health) the seeder flags as
|
|
3686
|
+
* carrying a current wound. Exported so tests and downstream
|
|
3687
|
+
* tickets can assert wound-coverage targets without re-deriving
|
|
3688
|
+
* the hash. Order matches the input list of scheduled patients.
|
|
3689
|
+
*/
|
|
3690
|
+
declare const onSiteDemoWoundBearingPatientIds: () => ReadonlyArray<string>;
|
|
3691
|
+
/**
|
|
3692
|
+
* Subset of {@link onSiteDemoWoundBearingPatientIds} whose patients
|
|
3693
|
+
* also get a CPT-coded debridement Procedure on their most-recent
|
|
3694
|
+
* encounter.
|
|
3695
|
+
*/
|
|
3696
|
+
declare const onSiteDemoWoundProcedurePatientIds: () => ReadonlyArray<string>;
|
|
3697
|
+
|
|
3698
|
+
/**
|
|
3699
|
+
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/seed-demo-data/on-site-demo-facilities.md
|
|
3700
|
+
*
|
|
3701
|
+
* Hand-authored Facility (FHIR Location) fixtures the
|
|
3702
|
+
* `seed-demo-data` workflow upserts into the on-site-medical UAT
|
|
3703
|
+
* demo tenant ({@link ON_SITE_DEMO_TENANT_ID} +
|
|
3704
|
+
* {@link ON_SITE_DEMO_WORKSPACE_ID}) on every non-prod deploy
|
|
3705
|
+
* (issue #1303).
|
|
3706
|
+
*
|
|
3707
|
+
* Three facilities — UAT testers exercise the calendar's "View by
|
|
3708
|
+
* facility" filter and the home-health vs facility-visit
|
|
3709
|
+
* routing. The on-site `AdminLocationFormPage` reads:
|
|
3710
|
+
* - `name`
|
|
3711
|
+
* - `type[0].text` — `"facility"` (drives the
|
|
3712
|
+
* classification dropdown)
|
|
3713
|
+
* - `address.line/city/state/postalCode/country`
|
|
3714
|
+
* - `telecom` (phone + email + optional fax)
|
|
3715
|
+
* - `status` (`"active"`)
|
|
3716
|
+
*
|
|
3717
|
+
* Director-of-nursing is not a first-class FHIR R4 `Location`
|
|
3718
|
+
* field. We denormalize it as an `extension` (single root
|
|
3719
|
+
* extension with three sub-extensions: `name`, `phone`,
|
|
3720
|
+
* `email`) under the established on-site URL convention
|
|
3721
|
+
* (`https://on-site-medical.app/fhir/StructureDefinition/*`) so a
|
|
3722
|
+
* later on-site UI iteration can pick it up without a schema
|
|
3723
|
+
* change.
|
|
3724
|
+
*
|
|
3725
|
+
* Ids are deterministic — re-fires upsert the same records,
|
|
3726
|
+
* matching the workflow's idempotency contract.
|
|
3727
|
+
*/
|
|
3728
|
+
/**
|
|
3729
|
+
* Root extension URL stamped on every facility Location for the
|
|
3730
|
+
* director-of-nursing contact. The root extension carries three
|
|
3731
|
+
* sub-extensions (`name`, `phone`, `email`) — none of FHIR R4's
|
|
3732
|
+
* shipped extensions cover this exact triple, so we publish a
|
|
3733
|
+
* local URL under the on-site convention.
|
|
3734
|
+
*/
|
|
3735
|
+
declare const DIRECTOR_OF_NURSING_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/director-of-nursing";
|
|
3736
|
+
/** Sub-extension URL: director-of-nursing display name. */
|
|
3737
|
+
declare const DIRECTOR_OF_NURSING_NAME_EXTENSION_URL = "name";
|
|
3738
|
+
/** Sub-extension URL: director-of-nursing phone (E.164). */
|
|
3739
|
+
declare const DIRECTOR_OF_NURSING_PHONE_EXTENSION_URL = "phone";
|
|
3740
|
+
/** Sub-extension URL: director-of-nursing email. */
|
|
3741
|
+
declare const DIRECTOR_OF_NURSING_EMAIL_EXTENSION_URL = "email";
|
|
3742
|
+
/** Demo facilities seeded into the on-site UAT demo workspace. */
|
|
3743
|
+
declare const ON_SITE_DEMO_FACILITIES: ReadonlyArray<Location>;
|
|
3744
|
+
/** Stable facility ids in dispatch order. Re-exported for downstream tickets. */
|
|
3745
|
+
declare const ON_SITE_DEMO_FACILITY_IDS: ReadonlyArray<string>;
|
|
3746
|
+
|
|
3747
|
+
/**
|
|
3748
|
+
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/seed-demo-data/on-site-demo-facility-patients.md
|
|
3749
|
+
*
|
|
3750
|
+
* Hand-authored facility Patient + Coverage fixtures the
|
|
3751
|
+
* `seed-demo-data` workflow upserts into the on-site-medical UAT
|
|
3752
|
+
* demo tenant ({@link ON_SITE_DEMO_TENANT_ID} +
|
|
3753
|
+
* {@link ON_SITE_DEMO_WORKSPACE_ID}) on every non-prod deploy
|
|
3754
|
+
* (issue #1304).
|
|
3755
|
+
*
|
|
3756
|
+
* Topology — issue #1304 design:
|
|
3757
|
+
* - 4 blocks (#1303) × per-block patient count (16 + 14 + 18 +
|
|
3758
|
+
* 12 = 60 scheduled patients). No patient appears in more
|
|
3759
|
+
* than one block.
|
|
3760
|
+
* - Plus 6 intake-complete-not-yet-scheduled patients (2 per
|
|
3761
|
+
* facility — small subset that exercises the "new intake,
|
|
3762
|
+
* not yet on a calendar" UI state). Total: 66 Patients.
|
|
3763
|
+
* - Every patient is assigned `care-context = facility` via
|
|
3764
|
+
* the on-site `patient-default-care-setting` /
|
|
3765
|
+
* `patient-default-care-location` extension pair
|
|
3766
|
+
* (`sites/app-ehr/src/types/fhir-extensions/patient.ts`). The
|
|
3767
|
+
* UI distinguishes facility vs home-health patients by
|
|
3768
|
+
* reading those extensions, so seeding them is the path that
|
|
3769
|
+
* actually surfaces the patient under the right "Patient
|
|
3770
|
+
* Type" column in the on-site EHR.
|
|
3771
|
+
*
|
|
3772
|
+
* Insurance:
|
|
3773
|
+
* - Every patient gets a primary Coverage with
|
|
3774
|
+
* `status: "active"` and a verification date stamped on the
|
|
3775
|
+
* coverage body via the on-site `coverage-verification-date`
|
|
3776
|
+
* extension.
|
|
3777
|
+
* - A subset (~40%) gets a secondary Coverage.
|
|
3778
|
+
* - Payor mix: commercial / Medicare / Medicare Advantage.
|
|
3779
|
+
* - QMB is a Medicare-only program (real-world constraint); the
|
|
3780
|
+
* QMB extension only attaches to Medicare-primary patients.
|
|
3781
|
+
* - ~20% of patients carry the `patient-hospice-status`
|
|
3782
|
+
* extension on the Patient resource (CMS hospice billing
|
|
3783
|
+
* status — separate from QMB).
|
|
3784
|
+
*
|
|
3785
|
+
* Modelling choice — block assignment. The seeder also records
|
|
3786
|
+
* which block template a patient is assigned to so downstream
|
|
3787
|
+
* tickets (#1306 — encounters per scheduled patient per block
|
|
3788
|
+
* occurrence) can fan out without re-deriving the mapping.
|
|
3789
|
+
* Encounters are NOT created here; this ticket only attaches the
|
|
3790
|
+
* block reference via an extension on the Patient body. Intake-
|
|
3791
|
+
* only patients omit the extension entirely.
|
|
3792
|
+
*
|
|
3793
|
+
* Ids are deterministic — re-fires upsert the same records,
|
|
3794
|
+
* matching the workflow's idempotency contract. Adding,
|
|
3795
|
+
* renaming, or moving a patient is a one-line edit here plus a
|
|
3796
|
+
* redeploy.
|
|
3797
|
+
*/
|
|
3798
|
+
/**
|
|
3799
|
+
* Extension URL stamped on the Patient body when the patient's
|
|
3800
|
+
* default care setting is facility-based (mirrors the on-site
|
|
3801
|
+
* EHR's `EXT_PATIENT_DEFAULT_CARE_SETTING` constant at
|
|
3802
|
+
* `sites/app-ehr/src/types/fhir-extensions/patient.ts`).
|
|
3803
|
+
*/
|
|
3804
|
+
declare const PATIENT_DEFAULT_CARE_SETTING_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/patient-default-care-setting";
|
|
3805
|
+
/**
|
|
3806
|
+
* Extension URL stamped on the Patient body when the patient's
|
|
3807
|
+
* default care setting is `facility`, carrying the Location id
|
|
3808
|
+
* (mirrors the on-site EHR's `EXT_PATIENT_DEFAULT_CARE_LOCATION`
|
|
3809
|
+
* constant).
|
|
3810
|
+
*/
|
|
3811
|
+
declare const PATIENT_DEFAULT_CARE_LOCATION_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/patient-default-care-location";
|
|
3812
|
+
/** Extension URL: patient residency admission date (facility-only). */
|
|
3813
|
+
declare const PATIENT_RESIDENCY_ADMISSION_DATE_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/patient-residency-admission-date";
|
|
3814
|
+
/** Extension URL: patient residency room number (facility-only). */
|
|
3815
|
+
declare const PATIENT_RESIDENCY_ROOM_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/patient-residency-room";
|
|
3816
|
+
/**
|
|
3817
|
+
* Extension URL stamped on the Patient body recording which
|
|
3818
|
+
* weekly scheduling block template the patient is assigned to
|
|
3819
|
+
* (#1303 + #1304). Downstream tickets (#1306 — encounters per
|
|
3820
|
+
* block occurrence) read this to fan out per-occurrence
|
|
3821
|
+
* Encounter records. Intake-only patients (no block yet) omit
|
|
3822
|
+
* the extension entirely.
|
|
3823
|
+
*/
|
|
3824
|
+
declare const PATIENT_ASSIGNED_BLOCK_TEMPLATE_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/patient-assigned-block-template";
|
|
3825
|
+
/**
|
|
3826
|
+
* Root extension URL stamped on the Patient body recording the
|
|
3827
|
+
* patient's hospice status (CMS hospice billing flag). Carries
|
|
3828
|
+
* three sub-extensions (`status`, `effectiveDate`,
|
|
3829
|
+
* `terminationDate`) mirroring the on-site Medicare form's
|
|
3830
|
+
* hospice fields at
|
|
3831
|
+
* `sites/app-ehr/src/fixtures/medicareForm.ts`. Only ~20% of
|
|
3832
|
+
* patients carry this extension; the absence of the extension
|
|
3833
|
+
* means the patient is not in hospice.
|
|
3834
|
+
*/
|
|
3835
|
+
declare const PATIENT_HOSPICE_STATUS_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/patient-hospice-status";
|
|
3836
|
+
/** Sub-extension URL under {@link PATIENT_HOSPICE_STATUS_EXTENSION_URL}. */
|
|
3837
|
+
declare const HOSPICE_STATUS_VALUE_SUB_EXTENSION_URL = "status";
|
|
3838
|
+
/** Sub-extension URL under {@link PATIENT_HOSPICE_STATUS_EXTENSION_URL}. */
|
|
3839
|
+
declare const HOSPICE_EFFECTIVE_DATE_SUB_EXTENSION_URL = "effectiveDate";
|
|
3840
|
+
/**
|
|
3841
|
+
* Extension URL stamped on every primary Coverage body recording
|
|
3842
|
+
* the most-recent verification timestamp. The on-site
|
|
3843
|
+
* `VerificationHistoryTable` displays verification rows from this
|
|
3844
|
+
* value (and from the Coverage's audit history downstream). The
|
|
3845
|
+
* value is an ISO 8601 instant in UTC.
|
|
3846
|
+
*/
|
|
3847
|
+
declare const COVERAGE_VERIFICATION_DATE_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/coverage-verification-date";
|
|
3848
|
+
/**
|
|
3849
|
+
* Root extension URL stamped on a Medicare-primary Coverage
|
|
3850
|
+
* recording the QMB (Qualified Medicare Beneficiary) status.
|
|
3851
|
+
* Carries `status` + `effectiveDate` sub-extensions mirroring
|
|
3852
|
+
* the on-site Medicare form (`sites/app-ehr/src/fixtures/medicareForm.ts`).
|
|
3853
|
+
* QMB only attaches to Medicare-primary patients — it is a
|
|
3854
|
+
* Medicare program and is invalid on commercial-primary or
|
|
3855
|
+
* Medicare-Advantage-primary coverages.
|
|
3856
|
+
*/
|
|
3857
|
+
declare const COVERAGE_QMB_STATUS_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/coverage-qmb-status";
|
|
3858
|
+
/** Sub-extension URL under {@link COVERAGE_QMB_STATUS_EXTENSION_URL}. */
|
|
3859
|
+
declare const QMB_STATUS_VALUE_SUB_EXTENSION_URL = "status";
|
|
3860
|
+
/** Sub-extension URL under {@link COVERAGE_QMB_STATUS_EXTENSION_URL}. */
|
|
3861
|
+
declare const QMB_EFFECTIVE_DATE_SUB_EXTENSION_URL = "effectiveDate";
|
|
3862
|
+
/**
|
|
3863
|
+
* Payor codes the on-site app reads from Coverage.type.coding[0].
|
|
3864
|
+
* The values mirror the labels used in the on-site Medicare and
|
|
3865
|
+
* insurance forms. `medicare-advantage` is intentionally distinct
|
|
3866
|
+
* from `medicare` — Medicare Advantage is a private-plan layer on
|
|
3867
|
+
* top of Medicare and bills through different payor pathways.
|
|
3868
|
+
*/
|
|
3869
|
+
declare const COVERAGE_PAYOR_TYPE_SYSTEM = "https://on-site-medical.app/fhir/CodeSystem/coverage-payor-type";
|
|
3870
|
+
/** Payor type values written to {@link COVERAGE_PAYOR_TYPE_SYSTEM}. */
|
|
3871
|
+
declare const PAYOR_TYPE_COMMERCIAL = "commercial";
|
|
3872
|
+
/** Payor type values written to {@link COVERAGE_PAYOR_TYPE_SYSTEM}. */
|
|
3873
|
+
declare const PAYOR_TYPE_MEDICARE = "medicare";
|
|
3874
|
+
/** Payor type values written to {@link COVERAGE_PAYOR_TYPE_SYSTEM}. */
|
|
3875
|
+
declare const PAYOR_TYPE_MEDICARE_ADVANTAGE = "medicare-advantage";
|
|
3876
|
+
/**
|
|
3877
|
+
* Lazily materialize the facility-patient Patient resources
|
|
3878
|
+
* seeded into the on-site UAT demo workspace. Called by the
|
|
3879
|
+
* fixture group when the seeder iterates `group.patients`.
|
|
3880
|
+
*/
|
|
3881
|
+
declare const buildOnSiteDemoFacilityPatients: () => ReadonlyArray<Patient>;
|
|
3882
|
+
/**
|
|
3883
|
+
* Lazily materialize the facility-patient Coverage resources
|
|
3884
|
+
* (primary + optional secondary) for the on-site UAT demo
|
|
3885
|
+
* workspace. Called by the fixture group when the seeder
|
|
3886
|
+
* iterates `group.coverages`.
|
|
3887
|
+
*/
|
|
3888
|
+
declare const buildOnSiteDemoFacilityCoverages: () => ReadonlyArray<Coverage>;
|
|
3889
|
+
/**
|
|
3890
|
+
* Stable facility-patient ids in dispatch order. Lazy — call
|
|
3891
|
+
* this from downstream tickets (e.g. #1306 — encounters per
|
|
3892
|
+
* scheduled patient per block occurrence) instead of capturing
|
|
3893
|
+
* the array at module load.
|
|
3894
|
+
*/
|
|
3895
|
+
declare const onSiteDemoFacilityPatientIds: () => ReadonlyArray<string>;
|
|
3896
|
+
/**
|
|
3897
|
+
* Subset of {@link onSiteDemoFacilityPatientIds} whose patients
|
|
3898
|
+
* are scheduled into a weekly block. Excludes the intake-only
|
|
3899
|
+
* subset. Order matches `PATIENTS_PER_BLOCK` (all block-001
|
|
3900
|
+
* patients first, then block-002, etc.).
|
|
3901
|
+
*/
|
|
3902
|
+
declare const onSiteDemoScheduledFacilityPatientIds: () => ReadonlyArray<string>;
|
|
3903
|
+
/**
|
|
3904
|
+
* Subset of {@link onSiteDemoFacilityPatientIds} whose patients
|
|
3905
|
+
* are intake-complete but not yet on a schedule. These patients
|
|
3906
|
+
* have a facility assignment but no block reference and no
|
|
3907
|
+
* Encounter records (downstream tickets must respect that
|
|
3908
|
+
* absence).
|
|
3909
|
+
*/
|
|
3910
|
+
declare const onSiteDemoIntakeOnlyFacilityPatientIds: () => ReadonlyArray<string>;
|
|
3911
|
+
/**
|
|
3912
|
+
* Look up the block template a facility patient is scheduled
|
|
3913
|
+
* into, or `undefined` for intake-only patients.
|
|
3914
|
+
*/
|
|
3915
|
+
declare const findOnSiteDemoFacilityPatientBlock: (patientId: string) => string | undefined;
|
|
3916
|
+
/**
|
|
3917
|
+
* List facility patients scheduled into a given block template
|
|
3918
|
+
* id. Downstream tickets (encounters, scribe assignments) call
|
|
3919
|
+
* this to fan out per-block work without re-deriving the
|
|
3920
|
+
* mapping.
|
|
3921
|
+
*/
|
|
3922
|
+
declare const facilityPatientsForBlock: (blockTemplateId: string) => ReadonlyArray<string>;
|
|
3923
|
+
|
|
3924
|
+
/**
|
|
3925
|
+
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/seed-demo-data/on-site-demo-fixtures.md
|
|
3926
|
+
*
|
|
3927
|
+
* Hand-authored Practitioner fixtures the `seed-demo-data` workflow
|
|
3928
|
+
* upserts into the on-site-medical UAT demo tenant
|
|
3929
|
+
* ({@link ON_SITE_DEMO_TENANT_ID} + {@link ON_SITE_DEMO_WORKSPACE_ID})
|
|
3930
|
+
* on every non-prod deploy. Issue #1302 — the on-site repo's facility
|
|
3931
|
+
* blocks, home-health visits, and encounter records need a realistic
|
|
3932
|
+
* pool of doctors and scribes to reference.
|
|
3933
|
+
*
|
|
3934
|
+
* Two sets are seeded:
|
|
3935
|
+
* - {@link ON_SITE_DEMO_DOCTORS} — ten Practitioners with
|
|
3936
|
+
* `qualification[0].code.text = "Physician"`. The first five carry
|
|
3937
|
+
* a `home-health-eligible` boolean extension set to `true` so the
|
|
3938
|
+
* on-site UI can filter the home-health-eligible subset for
|
|
3939
|
+
* home-visit scheduling.
|
|
3940
|
+
* - {@link ON_SITE_DEMO_SCRIBES} — five Practitioners with
|
|
3941
|
+
* `qualification[0].code.text = "Scribe"`. Scribes share the
|
|
3942
|
+
* Practitioner resource shape with doctors so the on-site
|
|
3943
|
+
* practitioner CRUD form can edit both without a new resource
|
|
3944
|
+
* type; the `qualification` value distinguishes the role.
|
|
3945
|
+
*
|
|
3946
|
+
* Field set matches what the on-site provider form expects today
|
|
3947
|
+
* (`sites/app-ehr/src/pages/admin/AdminPractitionerFormPage.tsx`):
|
|
3948
|
+
* - `name[0]` — given + family + text
|
|
3949
|
+
* - `qualification[0].code.text` — role label
|
|
3950
|
+
* - `active`
|
|
3951
|
+
* - `gender`, `birthDate`
|
|
3952
|
+
* - `telecom[]` — phone (E.164) + email
|
|
3953
|
+
* - `identifier[0]` — NPI (US national provider identifier)
|
|
3954
|
+
* - `address[0]` — line / city / state / postalCode / country
|
|
3955
|
+
* - `extension[]` — home-health-eligible boolean (doctors only)
|
|
3956
|
+
*
|
|
3957
|
+
* Ids are deterministic — re-fires upsert the same records, matching
|
|
3958
|
+
* the workflow's idempotency contract. Adding or renaming a Practitioner
|
|
3959
|
+
* is a one-line edit here plus a redeploy.
|
|
3960
|
+
*/
|
|
3961
|
+
/** FHIR `Identifier.system` for the US NPI (National Provider Identifier). */
|
|
3962
|
+
declare const US_NPI_SYSTEM = "http://hl7.org/fhir/sid/us-npi";
|
|
3963
|
+
/**
|
|
3964
|
+
* Extension URL stamped on a Practitioner body when the practitioner
|
|
3965
|
+
* is approved to take home-health visits. Mirrors the on-site repo's
|
|
3966
|
+
* convention (`https://on-site-medical.app/fhir/StructureDefinition/*`)
|
|
3967
|
+
* — the on-site UI can pick this extension up directly without a
|
|
3968
|
+
* schema change. Boolean `valueBoolean: true` means eligible.
|
|
3969
|
+
*/
|
|
3970
|
+
declare const HOME_HEALTH_ELIGIBLE_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/home-health-eligible";
|
|
3971
|
+
/** Practitioner.qualification code-text for a physician (matches on-site form). */
|
|
3972
|
+
declare const PRACTITIONER_ROLE_PHYSICIAN = "Physician";
|
|
3973
|
+
/** Practitioner.qualification code-text for a scribe. */
|
|
3974
|
+
declare const PRACTITIONER_ROLE_SCRIBE = "Scribe";
|
|
3975
|
+
/** FHIR `Identifier.system` for internal on-site staff ids (non-NPI). */
|
|
3976
|
+
declare const ON_SITE_STAFF_ID_SYSTEM = "https://on-site-medical.app/fhir/sid/staff-id";
|
|
3977
|
+
/** Demo doctors seeded into the on-site UAT demo workspace. */
|
|
3978
|
+
declare const ON_SITE_DEMO_DOCTORS: ReadonlyArray<Practitioner>;
|
|
3979
|
+
/** Demo scribes seeded into the on-site UAT demo workspace. */
|
|
3980
|
+
declare const ON_SITE_DEMO_SCRIBES: ReadonlyArray<Practitioner>;
|
|
3981
|
+
/** Stable doctor ids in dispatch order. Re-exported for downstream tickets. */
|
|
3982
|
+
declare const ON_SITE_DEMO_DOCTOR_IDS: ReadonlyArray<string>;
|
|
3983
|
+
/** Stable scribe ids in dispatch order. Re-exported for downstream tickets. */
|
|
3984
|
+
declare const ON_SITE_DEMO_SCRIBE_IDS: ReadonlyArray<string>;
|
|
3985
|
+
/**
|
|
3986
|
+
* Subset of {@link ON_SITE_DEMO_DOCTORS} flagged as home-health-eligible
|
|
3987
|
+
* (via the {@link HOME_HEALTH_ELIGIBLE_EXTENSION_URL} extension on the
|
|
3988
|
+
* Practitioner body). Downstream tickets (home-health visit scheduling,
|
|
3989
|
+
* facility-block fixtures) use this helper to attach realistic providers
|
|
3990
|
+
* to home-visit-only encounters without re-reading the extension list.
|
|
3991
|
+
*/
|
|
3992
|
+
declare const homeHealthEligibleDoctors: () => ReadonlyArray<Practitioner>;
|
|
3993
|
+
/**
|
|
3994
|
+
* Fixture group the seeder writes into the on-site UAT demo workspace.
|
|
3995
|
+
* Carries practitioners (doctors + scribes — #1302), facilities
|
|
3996
|
+
* (#1303), recurring weekly block Appointments (#1303), facility
|
|
3997
|
+
* patients + their insurance Coverages (#1304), home-health
|
|
3998
|
+
* patients + their insurance Coverages (#1305), historical
|
|
3999
|
+
* encounters / wounds / wound observations / wound debridement
|
|
4000
|
+
* procedures (#1306), and claims + payment notices tied to those
|
|
4001
|
+
* encounters (#1307). Accounts for this tenant are owned by later
|
|
4002
|
+
* tickets.
|
|
4003
|
+
*
|
|
4004
|
+
* `buildAppointments` is dynamic so the recurring block occurrences
|
|
4005
|
+
* anchor to the ISO week containing the seeder's `baseContext.date`
|
|
4006
|
+
* — re-fires on the same date produce byte-identical Appointment ids,
|
|
4007
|
+
* and re-fires on a later date roll the window forward without
|
|
4008
|
+
* duplicating prior weeks' records.
|
|
4009
|
+
*/
|
|
4010
|
+
declare const ON_SITE_DEMO_FIXTURES: DemoWorkspaceDataPlaneFixtures;
|
|
4011
|
+
|
|
4012
|
+
/**
|
|
4013
|
+
* @see sites/www-docs/content/packages/@openhi/constructs/workflows/control-plane/seed-demo-data/on-site-demo-home-health-patients.md
|
|
4014
|
+
*
|
|
4015
|
+
* Hand-authored home-health Patient + Coverage fixtures the
|
|
4016
|
+
* `seed-demo-data` workflow upserts into the on-site-medical UAT
|
|
4017
|
+
* demo tenant ({@link ON_SITE_DEMO_TENANT_ID} +
|
|
4018
|
+
* {@link ON_SITE_DEMO_WORKSPACE_ID}) on every non-prod deploy
|
|
4019
|
+
* (issue #1305).
|
|
4020
|
+
*
|
|
4021
|
+
* Topology — issue #1305 design:
|
|
4022
|
+
* - 20 home-health patients total. None are assigned to a
|
|
4023
|
+
* facility — `patient-default-care-setting` is `home`
|
|
4024
|
+
* (mirrors the on-site EHR's `LocationClassification = "home"`
|
|
4025
|
+
* at `sites/app-ehr/src/utils/patient/patientDefaultCareSetting.ts`),
|
|
4026
|
+
* and the `patient-default-care-location` extension is
|
|
4027
|
+
* intentionally omitted (home patients have no Location
|
|
4028
|
+
* reference).
|
|
4029
|
+
* - 17 patients are scheduled to a home-health-eligible doctor
|
|
4030
|
+
* (see {@link homeHealthEligibleDoctors}) with a recurring
|
|
4031
|
+
* visit cadence. Doctor assignment is a deterministic
|
|
4032
|
+
* round-robin over the 5 home-health-eligible doctors.
|
|
4033
|
+
* - 3 patients are intake-complete-but-not-yet-scheduled —
|
|
4034
|
+
* they carry a home address + care-context = home but have
|
|
4035
|
+
* no provider assignment and no visit cadence (the on-site
|
|
4036
|
+
* UI state for a brand-new home-health intake that hasn't
|
|
4037
|
+
* been put on the calendar yet).
|
|
4038
|
+
*
|
|
4039
|
+
* Insurance is identical to the facility-patient rules (#1304):
|
|
4040
|
+
* - Every patient gets a primary Coverage with
|
|
4041
|
+
* `status: "active"` and a verification date.
|
|
4042
|
+
* - A subset (~40%) gets a secondary Coverage.
|
|
4043
|
+
* - Payor mix: commercial / Medicare / Medicare Advantage.
|
|
4044
|
+
* - QMB only attaches to Medicare-primary patients.
|
|
4045
|
+
* - ~20% of patients carry the `patient-hospice-status`
|
|
4046
|
+
* extension on the Patient resource.
|
|
4047
|
+
*
|
|
4048
|
+
* Modelling choice — visit cadence. On-site has no formal
|
|
4049
|
+
* home-health visit cadence schema today (the `REPEAT_OPTIONS`
|
|
4050
|
+
* at `sites/app-ehr/src/features/calendar/components/eventPopoverUtils.ts`
|
|
4051
|
+
* are calendar-level recurrences, not patient-level cadences).
|
|
4052
|
+
* Each scheduled home-health patient therefore carries a simple
|
|
4053
|
+
* `home-health-visit-cadence-days` valueInteger extension with
|
|
4054
|
+
* a value drawn from the set 7 / 14 / 28 — weekly / bi-weekly /
|
|
4055
|
+
* monthly — distributed deterministically across the roster so
|
|
4056
|
+
* the UAT tenant exercises all three cadences. Intake-only
|
|
4057
|
+
* patients omit the extension entirely.
|
|
4058
|
+
*
|
|
4059
|
+
* Modelling choice — provider assignment. The home-health
|
|
4060
|
+
* analogue of the facility-patient's block reference is a
|
|
4061
|
+
* `patient-assigned-home-health-provider` `valueReference`
|
|
4062
|
+
* pointing at `Practitioner/<doctor-id>`. Downstream tickets
|
|
4063
|
+
* (#1306 — encounters) read this reference to fan out per-
|
|
4064
|
+
* patient visit Encounters. Intake-only patients omit the
|
|
4065
|
+
* extension (no provider yet → no encounters).
|
|
4066
|
+
*
|
|
4067
|
+
* Ids are deterministic — re-fires upsert the same records,
|
|
4068
|
+
* matching the workflow's idempotency contract. Adding,
|
|
4069
|
+
* renaming, or moving a patient is a one-line edit here plus a
|
|
4070
|
+
* redeploy.
|
|
4071
|
+
*/
|
|
4072
|
+
/**
|
|
4073
|
+
* Extension URL stamped on a home-health Patient body recording
|
|
4074
|
+
* the {@link Practitioner} id of the home-health-eligible doctor
|
|
4075
|
+
* the patient is currently scheduled with. Carries a
|
|
4076
|
+
* `valueReference` shaped `{ reference: "Practitioner/<id>" }`.
|
|
4077
|
+
* Intake-only patients omit this extension.
|
|
4078
|
+
*/
|
|
4079
|
+
declare const PATIENT_ASSIGNED_HOME_HEALTH_PROVIDER_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/patient-assigned-home-health-provider";
|
|
4080
|
+
/**
|
|
4081
|
+
* Extension URL stamped on a home-health Patient body recording
|
|
4082
|
+
* the patient's recurring visit cadence in days. The value is a
|
|
4083
|
+
* `valueInteger` drawn from {@link HOME_HEALTH_VISIT_CADENCE_OPTIONS}
|
|
4084
|
+
* — weekly (7), bi-weekly (14), or monthly (28). On-site has no
|
|
4085
|
+
* formal cadence schema today, so this denormalised extension
|
|
4086
|
+
* captures the visit interval directly on the Patient body until
|
|
4087
|
+
* the on-site team picks a permanent shape. Intake-only patients
|
|
4088
|
+
* omit this extension.
|
|
4089
|
+
*/
|
|
4090
|
+
declare const HOME_HEALTH_VISIT_CADENCE_DAYS_EXTENSION_URL = "https://on-site-medical.app/fhir/StructureDefinition/home-health-visit-cadence-days";
|
|
4091
|
+
/**
|
|
4092
|
+
* Allowed visit-cadence day values. Roughly weekly / bi-weekly /
|
|
4093
|
+
* monthly — enough variation for UAT to exercise distinct
|
|
4094
|
+
* cadences in the calendar without modelling every possible
|
|
4095
|
+
* interval.
|
|
4096
|
+
*/
|
|
4097
|
+
declare const HOME_HEALTH_VISIT_CADENCE_OPTIONS: ReadonlyArray<number>;
|
|
4098
|
+
/** Total home-health patients seeded. */
|
|
4099
|
+
declare const TOTAL_HOME_HEALTH_PATIENTS: number;
|
|
4100
|
+
/**
|
|
4101
|
+
* Lazily materialize the home-health Patient resources seeded
|
|
4102
|
+
* into the on-site UAT demo workspace. Called by the fixture
|
|
4103
|
+
* group when the seeder iterates `group.buildPatients()`.
|
|
4104
|
+
*/
|
|
4105
|
+
declare const buildOnSiteDemoHomeHealthPatients: () => ReadonlyArray<Patient>;
|
|
4106
|
+
/**
|
|
4107
|
+
* Lazily materialize the home-health Coverage resources
|
|
4108
|
+
* (primary + optional secondary) for the on-site UAT demo
|
|
4109
|
+
* workspace.
|
|
4110
|
+
*/
|
|
4111
|
+
declare const buildOnSiteDemoHomeHealthCoverages: () => ReadonlyArray<Coverage>;
|
|
4112
|
+
/**
|
|
4113
|
+
* Stable home-health-patient ids in dispatch order. Lazy — call
|
|
4114
|
+
* this from downstream tickets (e.g. #1306 — encounters per
|
|
4115
|
+
* scheduled home-health visit) instead of capturing the array
|
|
4116
|
+
* at module load.
|
|
4117
|
+
*/
|
|
4118
|
+
declare const onSiteDemoHomeHealthPatientIds: () => ReadonlyArray<string>;
|
|
4119
|
+
/**
|
|
4120
|
+
* Subset of {@link onSiteDemoHomeHealthPatientIds} whose
|
|
4121
|
+
* patients are scheduled with a home-health-eligible provider +
|
|
4122
|
+
* visit cadence. Excludes the intake-only subset.
|
|
4123
|
+
*/
|
|
4124
|
+
declare const onSiteDemoScheduledHomeHealthPatientIds: () => ReadonlyArray<string>;
|
|
4125
|
+
/**
|
|
4126
|
+
* Subset of {@link onSiteDemoHomeHealthPatientIds} whose
|
|
4127
|
+
* patients are intake-complete but not yet on a schedule. These
|
|
4128
|
+
* patients carry a home address + care-context = home but no
|
|
4129
|
+
* provider, no cadence, and (per #1306) no Encounter records.
|
|
4130
|
+
*/
|
|
4131
|
+
declare const onSiteDemoIntakeOnlyHomeHealthPatientIds: () => ReadonlyArray<string>;
|
|
4132
|
+
/**
|
|
4133
|
+
* Look up the home-health-eligible provider assigned to a given
|
|
4134
|
+
* home-health patient, or `undefined` for intake-only patients.
|
|
4135
|
+
* Downstream tickets (encounters per scheduled visit) call this
|
|
4136
|
+
* to fan out per-patient encounter records.
|
|
4137
|
+
*/
|
|
4138
|
+
declare const findOnSiteDemoHomeHealthPatientProvider: (patientId: string) => string | undefined;
|
|
4139
|
+
/**
|
|
4140
|
+
* Look up the visit cadence (in days) for a given home-health
|
|
4141
|
+
* patient, or `undefined` for intake-only patients.
|
|
4142
|
+
*/
|
|
4143
|
+
declare const findOnSiteDemoHomeHealthPatientVisitCadenceDays: (patientId: string) => number | undefined;
|
|
4144
|
+
|
|
2811
4145
|
interface SeedDemoDataLambdaProps {
|
|
2812
4146
|
/**
|
|
2813
4147
|
* Data-store table the workflow upserts demo-data records into.
|
|
@@ -3031,6 +4365,24 @@ declare class OpenHiDataService extends OpenHiService {
|
|
|
3031
4365
|
* target; the construct itself never checks the stage.
|
|
3032
4366
|
*/
|
|
3033
4367
|
readonly seedDemoDataWorkflow?: SeedDemoDataWorkflow;
|
|
4368
|
+
/**
|
|
4369
|
+
* ADR-028 counter-maintenance workflow. Subscribes to the
|
|
4370
|
+
* control-plane membership / role-assignment / workspace lifecycle
|
|
4371
|
+
* events on the control event bus and maintains the denormalized
|
|
4372
|
+
* counters on the canonical Tenant / Workspace / User records via
|
|
4373
|
+
* idempotent atomic ADD. Mounted on every stage (the admin console
|
|
4374
|
+
* reads these counters in prod as well as non-prod).
|
|
4375
|
+
*/
|
|
4376
|
+
readonly counterMaintenanceWorkflow: CounterMaintenanceWorkflow;
|
|
4377
|
+
/**
|
|
4378
|
+
* ADR-028 counter-reconciliation job (#1319). An on-demand Lambda that
|
|
4379
|
+
* recomputes the denormalized counters from canonical data and repairs
|
|
4380
|
+
* any drift the event-driven counter-maintenance path missed
|
|
4381
|
+
* (dropped / replayed events, rows that predate the counter work).
|
|
4382
|
+
* Mounted on every stage; invoked manually or by a separately-wired
|
|
4383
|
+
* schedule — it has no EventBridge trigger of its own.
|
|
4384
|
+
*/
|
|
4385
|
+
readonly counterReconciliationWorkflow: CounterReconciliationWorkflow;
|
|
3034
4386
|
/**
|
|
3035
4387
|
* Cached control-event-bus lookup. `OpenHiGlobalService.controlEventBusFromConstruct`
|
|
3036
4388
|
* registers a child `EventBus.fromEventBusName` construct with a
|
|
@@ -3059,6 +4411,19 @@ declare class OpenHiDataService extends OpenHiService {
|
|
|
3059
4411
|
* does not exist in prod stacks. Override to customize.
|
|
3060
4412
|
*/
|
|
3061
4413
|
protected createSeedDemoDataWorkflow(): SeedDemoDataWorkflow | undefined;
|
|
4414
|
+
/**
|
|
4415
|
+
* Creates the ADR-028 counter-maintenance workflow. Override to
|
|
4416
|
+
* customize. Mounted on every stage — the denormalized counters back
|
|
4417
|
+
* the admin console list columns in prod and non-prod alike.
|
|
4418
|
+
*/
|
|
4419
|
+
protected createCounterMaintenanceWorkflow(): CounterMaintenanceWorkflow;
|
|
4420
|
+
/**
|
|
4421
|
+
* Creates the ADR-028 counter-reconciliation job (#1319). Override to
|
|
4422
|
+
* customize. Mounted on every stage — the recompute-and-repair backstop
|
|
4423
|
+
* is the correctness authority for the denormalized counters in prod
|
|
4424
|
+
* and non-prod alike. On-demand only (no EventBridge trigger).
|
|
4425
|
+
*/
|
|
4426
|
+
protected createCounterReconciliationWorkflow(): CounterReconciliationWorkflow;
|
|
3062
4427
|
/**
|
|
3063
4428
|
* Creates the single-table DynamoDB data store.
|
|
3064
4429
|
* Override to customize.
|
|
@@ -3576,5 +4941,5 @@ declare class RenameCascadeWorkflow extends Construct {
|
|
|
3576
4941
|
constructor(scope: Construct, props: RenameCascadeWorkflowProps);
|
|
3577
4942
|
}
|
|
3578
4943
|
|
|
3579
|
-
export { ADMIN_DOMAIN_PREFIX, BRIDGED_STATUSES, CLOUDFORMATION_EVENT_SOURCE, CLOUDFORMATION_STACK_STATUS_CHANGE_DETAIL_TYPE, CONTROL_EVENT_BUS_NAME_ENV_VAR, ChildHostedZone, CognitoUserPool, CognitoUserPoolClient, CognitoUserPoolDomain, CognitoUserPoolKmsKey, ControlEventBus, DATA_STORE_CHANGE_DETAIL_MAX_UTF8_BYTES, DATA_STORE_CHANGE_DETAIL_TYPE, DEFAULT_PREVIEW_EXPIRATION_DAYS, DEMO_DATA_PLANE_FIXTURES, DEMO_PERIOD, DEMO_TENANT_SPECS, DEMO_URN_SYSTEM, DEV_CORS_ALLOW_ORIGINS, DEV_USERS, DataEventBus, DataStoreHistoricalArchive, DataStorePostgresReplica, DiscoverableStringParameter, DynamoDbDataStore, LOCALHOST_OAUTH_CALLBACK_URLS, LOCALHOST_OAUTH_LOGOUT_URLS, OPENHI_REPO_TAG_KEY_ENV_VAR, OPENHI_RESOURCE_URN_SYSTEM, OPENHI_TAG_KEY_PREFIX_ENV_VAR, OPENHI_TAG_SUFFIX_BRANCH_NAME, OPENHI_TAG_SUFFIX_REPO_NAME, OPENHI_TAG_SUFFIX_SERVICE_TYPE, OPENHI_TAG_SUFFIX_STAGE_TYPE, OWNING_DELETE_CASCADE_CONSUMER_NAME, OWNING_DELETE_CASCADE_DEFAULT_CONCURRENCY, OWNING_DELETE_CASCADE_STUCK_THRESHOLD_MINUTES, OWNING_DELETE_OPS_EVENT_BUS_ENV_VAR, OpenHiApp, OpenHiAuthService, OpenHiDataService, OpenHiEnvironment, OpenHiGlobalService, OpenHiGraphqlService, OpenHiRestApiService, OpenHiService, OpenHiStage, OpenHiWebsiteService, OpsEventBus, OwningDeleteCascadeLambdas, OwningDeleteCascadeWorkflow, PER_BRANCH_PREVIEW_PREFIX, PLACEHOLDER_TENANT_ID, PLACEHOLDER_WORKSPACE_ID, PLATFORM_DEPLOY_BRIDGE_ACTOR_SYSTEM, PLATFORM_SCOPE_TENANT_ID, POSTGRES_REPLICA_CLUSTER_ARN_SSM_NAME, POSTGRES_REPLICA_DATABASE_NAME_SSM_NAME, POSTGRES_REPLICA_SECRET_ARN_SSM_NAME, PROVISION_DEFAULT_WORKSPACE_DETAIL_TYPE, PerBranchHostname, PlatformDeployBridge, PlatformDeployBridgeLambda, PostAuthenticationLambda, PostConfirmationLambda, PreTokenGenerationLambda, ProvisionDefaultWorkspaceLambda, RENAME_CASCADE_CONSUMER_NAME, RENAME_CASCADE_DEFAULT_CONCURRENCY, RENAME_CASCADE_FAILED_THRESHOLD, RENAME_CASCADE_OPS_EVENT_BUS_ENV_VAR, RENAME_CASCADE_SLOW_THRESHOLD_SECONDS, REST_API_BASE_URL_SSM_NAME, REST_API_DOMAIN_NAME_SSM_NAME, RenameCascadeLambdas, RenameCascadeWorkflow, RootGraphqlApi, RootHostedZone, RootHttpApi, RootWildcardCertificate, SEED_DEMO_DATA_CONSUMER_NAME, SEED_SYSTEM_DATA_ACTOR_SYSTEM, SEED_SYSTEM_DATA_CONSUMER_NAME, SEED_SYSTEM_DATA_CONTROL_BUS_ENV_VAR, SSM_PARAM_NAME_FULL_DOMAIN, STATIC_HOSTING_SERVICE_TYPE, SeedDemoDataLambda, SeedDemoDataWorkflow, SeedSystemDataLambda, SeedSystemDataWorkflow, StaticContent, StaticHosting, USER_ONBOARDING_EVENT_SOURCE, UserOnboardingWorkflow, WorkflowDedupConsumerNameInvalidError, WorkflowDedupTable, WorkflowDedupTableDuplicateError, buildFhirCurrentResourceChangeDetail, buildProvisionDefaultWorkspaceRequestedDetail, computeBranchHash, demoMembershipId, demoRoleAssignmentId, demoRolesForUserInTenant, demoScenarioIdentifier, getDynamoDbDataStoreTableName, getPostgresReplicaSchemaName, getWorkflowDedupTableName, openHiTagKey, openhiResourceIdentifier };
|
|
3580
|
-
export type { BridgedStatus, BuildParameterNameProps, CascadeChunkInput, CascadeFinalizeInput, CascadeFinalizeOutput, CascadeListInput, CascadeListOutput, ChildHostedZoneProps, CloudFormationStackStatusChangeDetail, ComposeServiceDomainOptions, ComputeBranchHashOptions, DataEventBusOptions, DataStoreHistoricalArchiveProps, DataStorePostgresReplicaProps, DemoDevUser, DemoTenantSpec, DemoWorkspaceDataPlaneFixtures, DemoWorkspaceSpec, DiscoverableStringParameterProps, DynamoDbDataStoreProps, FhirCurrentResourceChangeDetail, GrantConsumerOptions, HostingMode, OpenHiAppProps, OpenHiAuthServiceProps, OpenHiDataServiceProps, OpenHiEnvironmentProps, OpenHiGlobalServiceProps, OpenHiGraphqlServiceProps, OpenHiRestApiServiceProps, OpenHiServiceProps, OpenHiServiceType, OpenHiStageProps, OpenHiWebsiteServiceProps, OwningDeleteCascadeLambdasProps, OwningDeleteCascadeWorkflowProps, PerBranchHostnameProps, PlatformDeployBridgeLambdaProps, PlatformDeployBridgeProps, PostConfirmationLambdaProps, PreTokenGenerationLambdaProps, ProvisionDefaultWorkspaceLambdaProps, ProvisionDefaultWorkspaceRequestedDetail, RenameCascadeChunkInput, RenameCascadeFinalizeInput, RenameCascadeFinalizeOutput, RenameCascadeLambdasProps, RenameCascadeListInput, RenameCascadeListOutput, RenameCascadeWorkflowProps, RootGraphqlApiProps, RootHttpApiProps, SeedDemoDataLambdaProps, SeedDemoDataWorkflowProps, SeedSystemDataLambdaProps, SeedSystemDataWorkflowProps, StaticContentProps, StaticHostingProps, UserOnboardingWorkflowProps, WorkflowDedupTableProps };
|
|
4944
|
+
export { ADMIN_DOMAIN_PREFIX, BLOCK_OCCURRENCES_PER_TEMPLATE, BLOCK_OCCURRENCE_WEEKS_FUTURE, BLOCK_OCCURRENCE_WEEKS_PAST, BRIDGED_STATUSES, CLAIM_WORKFLOW_STATUS, CLAIM_WORKFLOW_STATUS_EXTENSION_URL, CLAIM_WORKFLOW_STATUS_LAST_TRANSITION_SUB_EXTENSION_URL, CLAIM_WORKFLOW_STATUS_VALUE_SUB_EXTENSION_URL, CLOUDFORMATION_EVENT_SOURCE, CLOUDFORMATION_STACK_STATUS_CHANGE_DETAIL_TYPE, CONDITION_CLINICAL_STATUS_SYSTEM, CONTROL_EVENT_BUS_NAME_ENV_VAR, COUNTER_MAINTENANCE_CONSUMER_NAME, COUNTER_MAINTENANCE_DETAIL_TYPES, COVERAGE_PAYOR_TYPE_SYSTEM, COVERAGE_QMB_STATUS_EXTENSION_URL, COVERAGE_VERIFICATION_DATE_EXTENSION_URL, CPT_SYSTEM, CREDENTIALING_STATUS, ChildHostedZone, CognitoUserPool, CognitoUserPoolClient, CognitoUserPoolDomain, CognitoUserPoolKmsKey, ControlEventBus, CounterMaintenanceLambda, CounterMaintenanceWorkflow, CounterReconciliationLambda, CounterReconciliationWorkflow, DATA_STORE_CHANGE_DETAIL_MAX_UTF8_BYTES, DATA_STORE_CHANGE_DETAIL_TYPE, DEFAULT_PREVIEW_EXPIRATION_DAYS, DEMO_DATA_PLANE_FIXTURES, DEMO_PERIOD, DEMO_TENANT_SPECS, DEMO_URN_SYSTEM, DEV_CORS_ALLOW_ORIGINS, DEV_USERS, DIRECTOR_OF_NURSING_EMAIL_EXTENSION_URL, DIRECTOR_OF_NURSING_EXTENSION_URL, DIRECTOR_OF_NURSING_NAME_EXTENSION_URL, DIRECTOR_OF_NURSING_PHONE_EXTENSION_URL, DME_SUPPLIER_CATEGORY_CODE, DataEventBus, DataStoreHistoricalArchive, DataStorePostgresReplica, DiscoverableStringParameter, DynamoDbDataStore, ENCOUNTER_CLASS_FACILITY, ENCOUNTER_CLASS_HOME_HEALTH, ENCOUNTER_CLASS_SYSTEM, FHIR_ORGANIZATION_TYPE_SYSTEM, HOME_HEALTH_ELIGIBLE_EXTENSION_URL, HOME_HEALTH_VISITS_PAST, HOME_HEALTH_VISIT_CADENCE_DAYS_EXTENSION_URL, HOME_HEALTH_VISIT_CADENCE_OPTIONS, HOSPICE_EFFECTIVE_DATE_SUB_EXTENSION_URL, HOSPICE_STATUS_VALUE_SUB_EXTENSION_URL, INSURANCE_PAYOR_CATEGORY_CODE, INSURANCE_PAYOR_PLAN_TYPE_SYSTEM, LOCALHOST_OAUTH_CALLBACK_URLS, LOCALHOST_OAUTH_LOGOUT_URLS, LOINC_SYSTEM, ON_SITE_APPOINTMENT_TYPE_SYSTEM, ON_SITE_DEMO_BLOCK_CAPACITY_EXTENSION_URL, ON_SITE_DEMO_BLOCK_TEMPLATE_IDS, ON_SITE_DEMO_DIRECTORY_ORGANIZATIONS, ON_SITE_DEMO_DME_SUPPLIERS, ON_SITE_DEMO_DOCTORS, ON_SITE_DEMO_DOCTOR_IDS, ON_SITE_DEMO_FACILITIES, ON_SITE_DEMO_FACILITY_IDS, ON_SITE_DEMO_FIXTURES, ON_SITE_DEMO_INSURANCE_PAYORS, ON_SITE_DEMO_SCRIBES, ON_SITE_DEMO_SCRIBE_IDS, ON_SITE_DEMO_TENANT_ID, ON_SITE_DEMO_WORKSPACE_ID, ON_SITE_DIRECTORY_CATEGORY_SYSTEM, ON_SITE_STAFF_ID_SYSTEM, OPENHI_REPO_TAG_KEY_ENV_VAR, OPENHI_RESOURCE_URN_SYSTEM, OPENHI_TAG_KEY_PREFIX_ENV_VAR, OPENHI_TAG_SUFFIX_BRANCH_NAME, OPENHI_TAG_SUFFIX_REPO_NAME, OPENHI_TAG_SUFFIX_SERVICE_TYPE, OPENHI_TAG_SUFFIX_STAGE_TYPE, OWNING_DELETE_CASCADE_CONSUMER_NAME, OWNING_DELETE_CASCADE_DEFAULT_CONCURRENCY, OWNING_DELETE_CASCADE_STUCK_THRESHOLD_MINUTES, OWNING_DELETE_OPS_EVENT_BUS_ENV_VAR, OpenHiApp, OpenHiAuthService, OpenHiDataService, OpenHiEnvironment, OpenHiGlobalService, OpenHiGraphqlService, OpenHiRestApiService, OpenHiService, OpenHiStage, OpenHiWebsiteService, OpsEventBus, OwningDeleteCascadeLambdas, OwningDeleteCascadeWorkflow, PATIENT_ASSIGNED_BLOCK_TEMPLATE_EXTENSION_URL, PATIENT_ASSIGNED_HOME_HEALTH_PROVIDER_EXTENSION_URL, PATIENT_DEFAULT_CARE_LOCATION_EXTENSION_URL, PATIENT_DEFAULT_CARE_SETTING_EXTENSION_URL, PATIENT_HOSPICE_STATUS_EXTENSION_URL, PATIENT_RESIDENCY_ADMISSION_DATE_EXTENSION_URL, PATIENT_RESIDENCY_ROOM_EXTENSION_URL, PAYMENT_STATUS, PAYMENT_STATUS_SYSTEM, PAYOR_PLAN_TYPE_COMMERCIAL, PAYOR_PLAN_TYPE_MEDICARE, PAYOR_PLAN_TYPE_MEDICARE_ADVANTAGE, PAYOR_TYPE_COMMERCIAL, PAYOR_TYPE_MEDICARE, PAYOR_TYPE_MEDICARE_ADVANTAGE, PER_BRANCH_PREVIEW_PREFIX, PLACEHOLDER_TENANT_ID, PLACEHOLDER_WORKSPACE_ID, PLATFORM_DEPLOY_BRIDGE_ACTOR_SYSTEM, PLATFORM_SCOPE_TENANT_ID, POSTGRES_REPLICA_CLUSTER_ARN_SSM_NAME, POSTGRES_REPLICA_DATABASE_NAME_SSM_NAME, POSTGRES_REPLICA_SECRET_ARN_SSM_NAME, PRACTITIONER_CREDENTIALING_EXTENSION_URL, PRACTITIONER_CREDENTIALING_STATE_SUB_EXTENSION_URL, PRACTITIONER_CREDENTIALING_STATUS_SUB_EXTENSION_URL, PRACTITIONER_ROLE_PHYSICIAN, PRACTITIONER_ROLE_SCRIBE, PROVISION_DEFAULT_WORKSPACE_DETAIL_TYPE, PerBranchHostname, PlatformDeployBridge, PlatformDeployBridgeLambda, PostAuthenticationLambda, PostConfirmationLambda, PreTokenGenerationLambda, ProvisionDefaultWorkspaceLambda, QMB_EFFECTIVE_DATE_SUB_EXTENSION_URL, QMB_STATUS_VALUE_SUB_EXTENSION_URL, RENAME_CASCADE_CONSUMER_NAME, RENAME_CASCADE_DEFAULT_CONCURRENCY, RENAME_CASCADE_FAILED_THRESHOLD, RENAME_CASCADE_OPS_EVENT_BUS_ENV_VAR, RENAME_CASCADE_SLOW_THRESHOLD_SECONDS, REST_API_BASE_URL_SSM_NAME, REST_API_DOMAIN_NAME_SSM_NAME, RenameCascadeLambdas, RenameCascadeWorkflow, RootGraphqlApi, RootHostedZone, RootHttpApi, RootWildcardCertificate, SEED_DEMO_DATA_CONSUMER_NAME, SEED_SYSTEM_DATA_ACTOR_SYSTEM, SEED_SYSTEM_DATA_CONSUMER_NAME, SEED_SYSTEM_DATA_CONTROL_BUS_ENV_VAR, SNOMED_SYSTEM, SSM_PARAM_NAME_FULL_DOMAIN, STATE_MEDICAL_LICENSE_SYSTEM, STATIC_HOSTING_SERVICE_TYPE, SeedDemoDataLambda, SeedDemoDataWorkflow, SeedSystemDataLambda, SeedSystemDataWorkflow, StaticContent, StaticHosting, TOTAL_HOME_HEALTH_PATIENTS, USER_ONBOARDING_EVENT_SOURCE, US_NPI_SYSTEM, UserOnboardingWorkflow, WOUND_DEPTH_CODE, WOUND_EXAM_PANEL_CODE, WOUND_EXAM_PANEL_DISPLAY, WOUND_LENGTH_CODE, WOUND_STATUS_CODE, WOUND_WIDTH_CODE, WorkflowDedupConsumerNameInvalidError, WorkflowDedupTable, WorkflowDedupTableDuplicateError, __resetOnSiteDemoClaimCachesForTests, __resetOnSiteDemoEncounterCachesForTests, buildCredentialingQualifications, buildFhirCurrentResourceChangeDetail, buildOnSiteDemoBlockAppointments, buildOnSiteDemoClaims, buildOnSiteDemoEncounters, buildOnSiteDemoFacilityCoverages, buildOnSiteDemoFacilityPatients, buildOnSiteDemoHomeHealthCoverages, buildOnSiteDemoHomeHealthPatients, buildOnSiteDemoPaymentNotices, buildOnSiteDemoWoundConditions, buildOnSiteDemoWoundObservations, buildOnSiteDemoWoundProcedures, buildProvisionDefaultWorkspaceRequestedDetail, computeBranchHash, demoMembershipId, demoRoleAssignmentId, demoRolesForUserInTenant, demoScenarioIdentifier, facilityPatientsForBlock, findOnSiteDemoBlockTemplate, findOnSiteDemoFacilityPatientBlock, findOnSiteDemoHomeHealthPatientProvider, findOnSiteDemoHomeHealthPatientVisitCadenceDays, getDynamoDbDataStoreTableName, getPostgresReplicaSchemaName, getWorkflowDedupTableName, homeHealthEligibleDoctors, onSiteDemoBilledEncounterIds, onSiteDemoClaimIds, onSiteDemoDmeSupplierIds, onSiteDemoEncounterIds, onSiteDemoEncounterMetadata, onSiteDemoEncountersForPatient, onSiteDemoFacilityPatientIds, onSiteDemoHomeHealthPatientIds, onSiteDemoInsurancePayorIds, onSiteDemoIntakeOnlyFacilityPatientIds, onSiteDemoIntakeOnlyHomeHealthPatientIds, onSiteDemoPaymentNoticeIds, onSiteDemoScheduledFacilityPatientIds, onSiteDemoScheduledHomeHealthPatientIds, onSiteDemoUnbilledEncounterIds, onSiteDemoWoundBearingPatientIds, onSiteDemoWoundProcedurePatientIds, openHiTagKey, openhiResourceIdentifier, practitionerCredentialingForDoctor, practitionerCredentialingForState, woundConditionIdForPatient };
|
|
4945
|
+
export type { BridgedStatus, BuildParameterNameProps, CascadeChunkInput, CascadeFinalizeInput, CascadeFinalizeOutput, CascadeListInput, CascadeListOutput, ChildHostedZoneProps, ClaimWorkflowStatus, CloudFormationStackStatusChangeDetail, ComposeServiceDomainOptions, ComputeBranchHashOptions, CounterMaintenanceLambdaProps, CounterMaintenanceWorkflowProps, CounterReconciliationLambdaProps, CounterReconciliationWorkflowProps, CredentialingStatus, DataEventBusOptions, DataStoreHistoricalArchiveProps, DataStorePostgresReplicaProps, DemoDevUser, DemoTenantSpec, DemoWorkspaceDataPlaneFixtures, DemoWorkspaceSpec, DiscoverableStringParameterProps, DynamoDbDataStoreProps, FhirCurrentResourceChangeDetail, GrantConsumerOptions, HostingMode, IsoDayOfWeek, OnSiteDemoEncounterMetadata, OpenHiAppProps, OpenHiAuthServiceProps, OpenHiDataServiceProps, OpenHiEnvironmentProps, OpenHiGlobalServiceProps, OpenHiGraphqlServiceProps, OpenHiRestApiServiceProps, OpenHiServiceProps, OpenHiServiceType, OpenHiStageProps, OpenHiWebsiteServiceProps, OwningDeleteCascadeLambdasProps, OwningDeleteCascadeWorkflowProps, PaymentStatus, PayorPlanType, PerBranchHostnameProps, PlatformDeployBridgeLambdaProps, PlatformDeployBridgeProps, PostConfirmationLambdaProps, PractitionerCredentialingSpec, PreTokenGenerationLambdaProps, ProvisionDefaultWorkspaceLambdaProps, ProvisionDefaultWorkspaceRequestedDetail, RenameCascadeChunkInput, RenameCascadeFinalizeInput, RenameCascadeFinalizeOutput, RenameCascadeLambdasProps, RenameCascadeListInput, RenameCascadeListOutput, RenameCascadeWorkflowProps, RootGraphqlApiProps, RootHttpApiProps, SeedDemoDataLambdaProps, SeedDemoDataWorkflowProps, SeedSystemDataLambdaProps, SeedSystemDataWorkflowProps, StaticContentProps, StaticHostingProps, UserOnboardingWorkflowProps, WorkflowDedupTableProps };
|