From b7e6985bdbdde8118589ed5e4606aecf64f4fc8d Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 15 Oct 2025 16:44:26 -0600 Subject: [PATCH 01/33] WIP: add data client investigation methods --- .../cc_common/data_model/data_client.py | 258 ++++++ .../cc_common/data_model/schema/common.py | 15 + .../data_model/schema/data_event/api.py | 9 + .../cc_common/data_model/schema/fields.py | 12 + .../schema/investigation/__init__.py | 110 +++ .../data_model/schema/investigation/api.py | 57 ++ .../data_model/schema/investigation/record.py | 56 ++ .../data_model/schema/license/api.py | 5 + .../data_model/schema/license/record.py | 19 +- .../data_model/schema/privilege/api.py | 12 +- .../data_model/schema/privilege/record.py | 17 + .../common/cc_common/event_bus_client.py | 100 ++ .../common/common_test/test_constants.py | 6 + .../common/common_test/test_data_generator.py | 37 + .../lambdas/python/common/requirements-dev.in | 2 +- .../python/common/requirements-dev.txt | 130 ++- .../lambdas/python/common/requirements.txt | 14 +- .../common/tests/function/test_data_client.py | 875 ++++++++++++++++++ .../investigation-patch-with-encumbrance.json | 8 + .../resources/api/investigation-patch.json | 3 + .../resources/api/investigation-post.json | 3 + .../test_schema/test_investigation.py | 174 ++++ .../test_investigation_event_bus_client.py | 354 +++++++ 23 files changed, 2250 insertions(+), 26 deletions(-) create mode 100644 backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py create mode 100644 backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py create mode 100644 backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py create mode 100644 backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch-with-encumbrance.json create mode 100644 backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch.json create mode 100644 backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-post.json create mode 100644 backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py create mode 100644 backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index 28a251632..38c27fc8c 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -23,11 +23,14 @@ CCDataClass, CompactEligibilityStatus, HomeJurisdictionChangeStatusEnum, + InvestigationAgainstEnum, + InvestigationStatusEnum, LicenseDeactivatedStatusEnum, LicenseEncumberedStatusEnum, PrivilegeEncumberedStatusEnum, UpdateCategory, ) +from cc_common.data_model.schema.investigation import InvestigationData from cc_common.data_model.schema.license import LicenseData, LicenseUpdateData from cc_common.data_model.schema.military_affiliation import MilitaryAffiliationData from cc_common.data_model.schema.military_affiliation.common import ( @@ -1601,6 +1604,261 @@ def encumber_license(self, adverse_action: AdverseActionData) -> None: logger.info('Set encumbrance for license record') + def create_investigation(self, investigation: InvestigationData) -> None: + """ + Creates an investigation record for a provider in a jurisdiction. + + This will also update the record to have an investigationStatus of 'underInvestigation', + add an update record to show the investigation event. + + :param InvestigationData investigation: The details of the investigation to be added to the records + :raises CCNotFoundException: If the record is not found + """ + with logger.append_context_keys( + compact=investigation.compact, + provider_id=investigation.providerId, + jurisdiction=investigation.jurisdiction, + license_type_abbreviation=investigation.licenseTypeAbbreviation, + ): + # Get the record (privilege or license) + record_type = investigation.investigationAgainst + try: + record = self.config.provider_table.get_item( + Key={ + 'pk': f'{investigation.compact}#PROVIDER#{investigation.providerId}', + 'sk': f'{investigation.compact}#PROVIDER#{record_type}/' + f'{investigation.jurisdiction}/{investigation.licenseTypeAbbreviation}#', + }, + )['Item'] + except KeyError as e: + message = f'{record_type.title()} not found for jurisdiction' + logger.info(message) + raise CCNotFoundException( + f'{record_type.title()} not found for jurisdiction {investigation.jurisdiction}' + ) from e + + if investigation.investigationAgainst == InvestigationAgainstEnum.PRIVILEGE: + record_data = PrivilegeData.from_database_record(record) + update_data_type = PrivilegeUpdateData + update_type = 'privilegeUpdate' + else: + record_data = LicenseData.from_database_record(record) + update_data_type = LicenseUpdateData + update_type = 'licenseUpdate' + + now = config.current_standard_datetime + investigation_details = { + 'investigationId': investigation.investigationId, + } + + # Create the update record + update_record = update_data_type.create_new( + { + 'type': update_type, + 'updateType': UpdateCategory.INVESTIGATION, + 'providerId': investigation.providerId, + 'compact': investigation.compact, + 'jurisdiction': investigation.jurisdiction, + 'createDate': now, + 'effectiveDate': now, + 'licenseType': investigation.licenseType, + 'previous': record_data.to_dict(), + 'updatedValues': { + 'investigationStatus': InvestigationStatusEnum.UNDER_INVESTIGATION, + 'dateOfUpdate': now, + }, + 'investigationDetails': investigation_details, + } + ) + + # Create the investigation record + investigation_record = investigation.serialize_to_database_record() + + # Prepare the transaction items + transaction_items = [ + { + 'Put': { + 'TableName': self.config.provider_table.table_name, + 'Item': investigation_record, + } + }, + { + 'Put': { + 'TableName': self.config.provider_table.table_name, + 'Item': update_record.serialize_to_database_record(), + } + }, + { + 'Update': { + 'TableName': self.config.provider_table.table_name, + 'Key': { + 'pk': f'{investigation.compact}#PROVIDER#{investigation.providerId}', + 'sk': f'{investigation.compact}#PROVIDER#{record_type}/' + f'{investigation.jurisdiction}/{investigation.licenseTypeAbbreviation}#', + }, + 'UpdateExpression': ( + 'SET investigationStatus = :investigationStatus, dateOfUpdate = :dateOfUpdate' + ), + 'ExpressionAttributeValues': { + ':investigationStatus': InvestigationStatusEnum.UNDER_INVESTIGATION.value, + ':dateOfUpdate': now.isoformat(), + }, + } + }, + ] + + # Execute the transaction + self.config.provider_table.meta.client.transact_write_items(TransactItems=transaction_items) + + logger.info(f'Set investigation for {record_type} record') + + def close_investigation( + self, + compact: str, + provider_id: str, + jurisdiction: str, + license_type_abbreviation: str, + investigation_id: str, + closing_user: str, + investigation_against: InvestigationAgainstEnum, + resulting_encumbrance_id: str = None, + ) -> None: + """ + Closes an investigation by updating the investigation record and removing the investigation status. + + :param compact: The compact name + :param provider_id: The provider ID + :param jurisdiction: The jurisdiction + :param license_type_abbreviation: The license type abbreviation + :param investigation_id: The investigation ID + :param closing_user: The user who closed the investigation + :param investigation_against: Whether investigating a privilege or license + :param resulting_encumbrance_id: Optional encumbrance ID to reference in the investigation closure + """ + with logger.append_context_keys( + compact=compact, + provider_id=provider_id, + jurisdiction=jurisdiction, + license_type_abbreviation=license_type_abbreviation, + investigation_id=investigation_id, + ): + record_type = investigation_against.value + + # Get the record (privilege or license) + try: + record = self.config.provider_table.get_item( + Key={ + 'pk': f'{compact}#PROVIDER#{provider_id}', + 'sk': f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#', + }, + )['Item'] + except KeyError as e: + message = f'{record_type.title()} not found for jurisdiction' + logger.info(message) + raise CCNotFoundException(f'{record_type.title()} not found for jurisdiction {jurisdiction}') from e + + if investigation_against == InvestigationAgainstEnum.PRIVILEGE: + record_data = PrivilegeData.from_database_record(record) + update_data_type = PrivilegeUpdateData + update_type = 'privilegeUpdate' + else: + record_data = LicenseData.from_database_record(record) + update_data_type = LicenseUpdateData + update_type = 'licenseUpdate' + + now = config.current_standard_datetime + + # Get license type from the record for the update record + license_type = record_data.licenseType + + # Create the update record for investigation closure + update_record = update_data_type.create_new( + { + 'type': update_type, + 'updateType': UpdateCategory.INVESTIGATION, + 'providerId': provider_id, + 'compact': compact, + 'jurisdiction': jurisdiction, + 'createDate': now, + 'effectiveDate': now, + 'licenseType': license_type, + 'previous': record_data.to_dict(), + 'updatedValues': { + 'dateOfUpdate': now, + }, + 'removedValues': ['investigationStatus'], + } + ) + + # Prepare the transaction items + # Build the investigation update expression and values + investigation_update_expression = ( + 'SET closeDate = :closeDate, closingUser = :closingUser, dateOfUpdate = :dateOfUpdate' + ) + investigation_expression_values = { + ':closeDate': now.isoformat(), + ':closingUser': closing_user, + ':dateOfUpdate': now.isoformat(), + } + + # Add resultingEncumbranceId if an encumbrance was created + if resulting_encumbrance_id: + investigation_update_expression += ', resultingEncumbranceId = :resultingEncumbranceId' + investigation_expression_values[':resultingEncumbranceId'] = str(resulting_encumbrance_id) + + transaction_items = [ + { + 'Update': { + 'TableName': self.config.provider_table.table_name, + 'Key': { + 'pk': f'{compact}#PROVIDER#{provider_id}', + 'sk': ( + f'{compact}#PROVIDER#{record_type}/{jurisdiction}/' + f'{license_type_abbreviation}#INVESTIGATION#{investigation_id}' + ), + }, + 'UpdateExpression': investigation_update_expression, + 'ConditionExpression': 'attribute_exists(pk) AND attribute_not_exists(closeDate)', + 'ExpressionAttributeValues': investigation_expression_values, + } + }, + { + 'Put': { + 'TableName': self.config.provider_table.table_name, + 'Item': update_record.serialize_to_database_record(), + } + }, + { + 'Update': { + 'TableName': self.config.provider_table.table_name, + 'Key': { + 'pk': f'{compact}#PROVIDER#{provider_id}', + 'sk': f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#', + }, + 'UpdateExpression': 'REMOVE investigationStatus SET dateOfUpdate = :dateOfUpdate', + 'ConditionExpression': 'attribute_exists(pk)', + 'ExpressionAttributeValues': { + ':dateOfUpdate': now.isoformat(), + }, + } + }, + ] + + # Execute the transaction + try: + self.config.provider_table.meta.client.transact_write_items(TransactItems=transaction_items) + except Exception as e: + # Check if this is a TransactionCanceledException with ConditionalCheckFailed + if hasattr(e, 'response') and e.response.get('CancellationReasons'): + for reason in e.response['CancellationReasons']: + if reason.get('Code') == 'ConditionalCheckFailed': + logger.info('Investigation not found or already closed') + raise CCNotFoundException(f'Investigation not found: {investigation_id}') from e + # Re-raise if it's not a conditional check failure + raise + + logger.info(f'Closed investigation for {record_type} record') + def lift_privilege_encumbrance( self, compact: str, diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/common.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/common.py index c2f77a878..7167c755c 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/common.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/common.py @@ -284,6 +284,15 @@ class AdverseActionAgainstEnum(StrEnum): LICENSE = 'license' +class InvestigationAgainstEnum(StrEnum): + """ + Enum for possible records that investigations can be made against + """ + + PRIVILEGE = 'privilege' + LICENSE = 'license' + + class UpdateCategory(CCEnum): DEACTIVATION = 'deactivation' EXPIRATION = 'expiration' @@ -291,6 +300,7 @@ class UpdateCategory(CCEnum): OTHER = 'other' RENEWAL = 'renewal' ENCUMBRANCE = 'encumbrance' + INVESTIGATION = 'investigation' HOME_JURISDICTION_CHANGE = 'homeJurisdictionChange' REGISTRATION = 'registration' LIFTING_ENCUMBRANCE = 'lifting_encumbrance' @@ -321,6 +331,11 @@ class PrivilegeEncumberedStatusEnum(CCEnum): LICENSE_ENCUMBERED = 'licenseEncumbered' +class InvestigationStatusEnum(CCEnum): + UNDER_INVESTIGATION = 'underInvestigation' + NOT_UNDER_INVESTIGATION = 'notUnderInvestigation' + + class HomeJurisdictionChangeStatusEnum(CCEnum): """ This is only used if the provider has existing privileges when they change their home jurisdiction, diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py index 0fc2cb6cd..2a6abd8fd 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py @@ -54,6 +54,15 @@ class EncumbranceEventDetailSchema(DataEventDetailBaseSchema): adverseActionCategory = String(required=False, allow_none=False) +class InvestigationEventDetailSchema(DataEventDetailBaseSchema): + providerId = UUID(required=True, allow_none=False) + investigationId = UUID(required=False, allow_none=False) + licenseTypeAbbreviation = String(required=True, allow_none=False) + investigationAgainst = String(required=True, allow_none=False) + investigationStartDate = Date(required=False, allow_none=False) + effectiveDate = Date(required=False, allow_none=False) + + class LicenseDeactivationDetailSchema(DataEventDetailBaseSchema): providerId = UUID(required=True, allow_none=False) licenseType = String(required=True, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/fields.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/fields.py index 759fe2764..c6b1df85d 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/fields.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/fields.py @@ -8,6 +8,8 @@ CompactEligibilityStatus, EncumbranceType, HomeJurisdictionChangeStatusEnum, + InvestigationAgainstEnum, + InvestigationStatusEnum, LicenseDeactivatedStatusEnum, LicenseEncumberedStatusEnum, PrivilegeEncumberedStatusEnum, @@ -80,6 +82,11 @@ def __init__(self, *args, **kwargs): super().__init__(*args, validate=OneOf([entry.value for entry in PrivilegeEncumberedStatusEnum]), **kwargs) +class InvestigationStatusField(String): + def __init__(self, *args, **kwargs): + super().__init__(*args, validate=OneOf([entry.value for entry in InvestigationStatusEnum]), **kwargs) + + class HomeJurisdictionChangeStatusField(String): def __init__(self, *args, **kwargs): super().__init__(*args, validate=OneOf([entry.value for entry in HomeJurisdictionChangeStatusEnum]), **kwargs) @@ -116,6 +123,11 @@ def __init__(self, *args, **kwargs): super().__init__(*args, validate=OneOf([entry.value for entry in ClinicalPrivilegeActionCategory]), **kwargs) +class InvestigationAgainstField(String): + def __init__(self, *args, **kwargs): + super().__init__(*args, validate=OneOf([entry.value for entry in InvestigationAgainstEnum]), **kwargs) + + class PositiveDecimal(Decimal): """A Decimal field that validates the value is greater than or equal to 0.""" diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py new file mode 100644 index 000000000..298392114 --- /dev/null +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py @@ -0,0 +1,110 @@ +# ruff: noqa: N802 we use camelCase to match the marshmallow schema definition +from datetime import date, datetime +from uuid import UUID + +from cc_common.data_model.schema.common import ( + CCDataClass, + InvestigationAgainstEnum, +) +from cc_common.data_model.schema.investigation.record import InvestigationRecordSchema + + +class InvestigationData(CCDataClass): + """ + Class representing an Investigation with getters and setters for all properties. + Takes a dict as an argument to the constructor to avoid primitive obsession. + """ + + # Define record schema at the class level + _record_schema = InvestigationRecordSchema() + + # Can use setters to set field data + _requires_data_at_construction = False + + @property + def compact(self) -> str: + return self._data['compact'] + + @compact.setter + def compact(self, value: str) -> None: + self._data['compact'] = value + + @property + def providerId(self) -> UUID: + return self._data['providerId'] + + @providerId.setter + def providerId(self, value: UUID) -> None: + self._data['providerId'] = value + + @property + def jurisdiction(self) -> str: + return self._data['jurisdiction'] + + @jurisdiction.setter + def jurisdiction(self, value: str) -> None: + self._data['jurisdiction'] = value + + @property + def licenseType(self) -> str: + return self._data['licenseType'] + + @licenseType.setter + def licenseType(self, value: str) -> None: + self._data['licenseType'] = value + + @property + def investigationAgainst(self) -> str: + return self._data['investigationAgainst'] + + @investigationAgainst.setter + def investigationAgainst(self, investigation_against_enum: InvestigationAgainstEnum) -> None: + self._data['investigationAgainst'] = investigation_against_enum.value + + @property + def investigationId(self) -> UUID: + return self._data['investigationId'] + + @investigationId.setter + def investigationId(self, value: UUID) -> None: + self._data['investigationId'] = value + + @property + def submittingUser(self) -> UUID: + return self._data['submittingUser'] + + @submittingUser.setter + def submittingUser(self, value: UUID) -> None: + self._data['submittingUser'] = value + + @property + def creationDate(self) -> datetime: + return self._data['creationDate'] + + @creationDate.setter + def creationDate(self, value: datetime) -> None: + self._data['creationDate'] = value + + @property + def closeDate(self) -> date | None: + return self._data.get('closeDate') + + @closeDate.setter + def closeDate(self, value: date) -> None: + self._data['closeDate'] = value + + @property + def closingUser(self) -> UUID | None: + return self._data.get('closingUser') + + @closingUser.setter + def closingUser(self, value: UUID) -> None: + self._data['closingUser'] = value + + @property + def resultingEncumbranceId(self) -> UUID | None: + return self._data.get('resultingEncumbranceId') + + @resultingEncumbranceId.setter + def resultingEncumbranceId(self, value: UUID) -> None: + self._data['resultingEncumbranceId'] = value diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py new file mode 100644 index 000000000..baa73a5f1 --- /dev/null +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py @@ -0,0 +1,57 @@ +# ruff: noqa: N801, N815 invalid-name +from marshmallow.fields import Nested, Raw, String +from marshmallow.validate import OneOf + +from cc_common.data_model.schema.adverse_action.api import AdverseActionPostRequestSchema +from cc_common.data_model.schema.base_record import ForgivingSchema +from cc_common.data_model.schema.fields import ( + Compact, + Jurisdiction, +) + + +class InvestigationPostRequestSchema(ForgivingSchema): + """ + Schema for investigation POST requests. + + This schema is used to validate incoming requests to the investigation POST API endpoint. + + Serialization direction: + API -> load() -> Python + """ + + +class InvestigationPatchRequestSchema(ForgivingSchema): + """ + Schema for investigation PATCH requests (investigation closing). + + This schema is used to validate incoming requests to the investigation PATCH API endpoint + for closing investigations. + + Serialization direction: + API -> load() -> Python + """ + + # Optional encumbrance data to create when closing investigation + encumbrance = Nested(AdverseActionPostRequestSchema, required=False, allow_none=False) + + +class InvestigationGeneralResponseSchema(ForgivingSchema): + """ + Schema for investigation general responses. + + Serialization direction: + Python -> load() -> API + """ + + type = String(required=True, allow_none=False, validate=OneOf(['investigation'])) + compact = Compact(required=True, allow_none=False) + providerId = Raw(required=True, allow_none=False) + investigationId = Raw(required=True, allow_none=False) + jurisdiction = Jurisdiction(required=True, allow_none=False) + licenseTypeAbbreviation = String(required=True, allow_none=False) + licenseType = String(required=True, allow_none=False) + dateOfUpdate = Raw(required=True, allow_none=False) + + creationDate = Raw(required=True, allow_none=False) + submittingUser = Raw(required=True, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py new file mode 100644 index 000000000..2e887e647 --- /dev/null +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py @@ -0,0 +1,56 @@ +# ruff: noqa: N801, N815 invalid-name +from marshmallow import pre_dump +from marshmallow.fields import UUID, Date, DateTime, String +from marshmallow.validate import ValidationError + +from cc_common.config import config +from cc_common.data_model.schema.base_record import BaseRecordSchema +from cc_common.data_model.schema.fields import ( + Compact, + InvestigationAgainstField, + Jurisdiction, +) + + +@BaseRecordSchema.register_schema('investigation') +class InvestigationRecordSchema(BaseRecordSchema): + """ + Schema for investigation records in the provider data table + + Serialization direction: + DB -> load() -> Python + """ + + _record_type = 'investigation' + + compact = Compact(required=True, allow_none=False) + providerId = UUID(required=True, allow_none=False) + jurisdiction = Jurisdiction(required=True, allow_none=False) + licenseType = String(required=True, allow_none=False) + investigationAgainst = InvestigationAgainstField(required=True, allow_none=False) + + # Populated on creation + investigationId = UUID(required=True, allow_none=False) + submittingUser = UUID(required=True, allow_none=False) + creationDate = DateTime(required=True, allow_none=False) + + # Populated when the investigation is closed + closeDate = Date(required=False, allow_none=False) + closingUser = UUID(required=False, allow_none=False) + resultingEncumbranceId = UUID(required=False, allow_none=False) + + @pre_dump + def generate_pk_sk(self, in_data, **_kwargs): + in_data['pk'] = f'{in_data["compact"]}#PROVIDER#{in_data["providerId"]}' + # ensure this is passed in lowercase + try: + license_type_abbr = config.license_type_abbreviations[in_data['compact']][in_data['licenseType']] + except KeyError as e: + # Validation is usually done on load and this runs on dump, but we depend on this value being valid + # so we might as well raise a ValidationError if we try to dump an invalid license type + license_types = config.license_types_for_compact(in_data['compact']) + raise ValidationError({'licenseType': [f'Must be one of: {", ".join(license_types)}.']}) from e + in_data['sk'] = ( + f'{in_data["compact"]}#PROVIDER#{in_data["investigationAgainst"]}/{in_data["jurisdiction"]}/{license_type_abbr}#INVESTIGATION#{in_data["investigationId"]}' + ) + return in_data diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/api.py index 52c7764ff..7a6c0dc65 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/api.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/api.py @@ -15,6 +15,7 @@ ActiveInactive, Compact, CompactEligibility, + InvestigationStatusField, ITUTE164PhoneNumber, Jurisdiction, NationalProviderIdentifier, @@ -145,6 +146,8 @@ class LicenseGeneralResponseSchema(ForgivingSchema): emailAddress = Email(required=False, allow_none=False) phoneNumber = ITUTE164PhoneNumber(required=False, allow_none=False) adverseActions = List(Nested(AdverseActionGeneralResponseSchema, required=False, allow_none=False)) + # This field is only set if the license is under investigation + investigationStatus = InvestigationStatusField(required=False, allow_none=False) class LicenseReadPrivateResponseSchema(ForgivingSchema): @@ -183,6 +186,8 @@ class LicenseReadPrivateResponseSchema(ForgivingSchema): emailAddress = Email(required=False, allow_none=False) phoneNumber = ITUTE164PhoneNumber(required=False, allow_none=False) adverseActions = List(Nested(AdverseActionGeneralResponseSchema, required=False, allow_none=False)) + # This field is only set if the license is under investigation + investigationStatus = InvestigationStatusField(required=False, allow_none=False) # these fields are specific to the read private role dateOfBirth = Raw(required=False, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py index b763fed4a..461a70fcc 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py @@ -2,7 +2,7 @@ from datetime import date from urllib.parse import quote -from marshmallow import ValidationError, post_dump, post_load, pre_dump, pre_load, validates_schema +from marshmallow import Schema, ValidationError, post_dump, post_load, pre_dump, pre_load, validates_schema from marshmallow.fields import UUID, Date, DateTime, Email, List, Nested, String from marshmallow.validate import Length @@ -21,6 +21,7 @@ ActiveInactive, Compact, CompactEligibility, + InvestigationStatusField, ITUTE164PhoneNumber, Jurisdiction, LicenseEncumberedStatusField, @@ -30,6 +31,16 @@ from cc_common.data_model.schema.license.common import LicenseCommonSchema +class InvestigationDetailsSchema(Schema): + """ + Schema for tracking details about an investigation. + """ + + investigationId = UUID(required=True, allow_none=False) + # present if update is created by upstream license investigation + licenseJurisdiction = Jurisdiction(required=False, allow_none=False) + + @BaseRecordSchema.register_schema('license') class LicenseRecordSchema(BaseRecordSchema, LicenseCommonSchema): """ @@ -52,6 +63,8 @@ class LicenseRecordSchema(BaseRecordSchema, LicenseCommonSchema): # optional field for setting encumbrance status encumberedStatus = LicenseEncumberedStatusField(required=False, allow_none=False) + # optional field for setting investigation status + investigationStatus = InvestigationStatusField(required=False, allow_none=False) # Persisted values jurisdictionUploadedLicenseStatus = ActiveInactive(required=True, allow_none=False) @@ -160,6 +173,8 @@ class LicenseUpdateRecordPreviousSchema(ForgivingSchema): licenseStatusName = String(required=False, allow_none=False, validate=Length(1, 100)) jurisdictionUploadedLicenseStatus = ActiveInactive(required=True, allow_none=False) jurisdictionUploadedCompactEligibility = CompactEligibility(required=True, allow_none=False) + encumberedStatus = LicenseEncumberedStatusField(required=False, allow_none=False) + investigationStatus = InvestigationStatusField(required=False, allow_none=False) @BaseRecordSchema.register_schema('licenseUpdate') @@ -187,6 +202,8 @@ class LicenseUpdateRecordSchema(BaseRecordSchema, ChangeHashMixin): effectiveDate = DateTime(required=True, allow_none=False) # We'll allow any fields that can show up in the previous field to be here as well, but none are required updatedValues = Nested(LicenseUpdateRecordPreviousSchema(partial=True), required=True, allow_none=False) + # optional field that is only included if the update was an investigation + investigationDetails = Nested(InvestigationDetailsSchema(), required=False, allow_none=False) # List of field names that were present in the previous record but removed in the update removedValues = List(String(), required=False, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py index c9edcf635..1cc51264d 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py @@ -8,7 +8,13 @@ AdverseActionPublicResponseSchema, ) from cc_common.data_model.schema.base_record import ForgivingSchema -from cc_common.data_model.schema.fields import ActiveInactive, Compact, Jurisdiction, UpdateType +from cc_common.data_model.schema.fields import ( + ActiveInactive, + Compact, + InvestigationStatusField, + Jurisdiction, + UpdateType, +) class AttestationVersionResponseSchema(Schema): @@ -79,6 +85,8 @@ class PrivilegeGeneralResponseSchema(ForgivingSchema): # This field shows how long the privilege have been continuously active according to # its history activeSince = Raw(required=False, allow_none=False) + # This field is only set if the privilege is under investigation + investigationStatus = InvestigationStatusField(required=False, allow_none=False) class PrivilegeReadPrivateResponseSchema(ForgivingSchema): @@ -111,6 +119,8 @@ class PrivilegeReadPrivateResponseSchema(ForgivingSchema): # This field shows how long the privilege have been continuously active according to # its history activeSince = Raw(required=False, allow_none=False) + # This field is only set if the privilege is under investigation + investigationStatus = InvestigationStatusField(required=False, allow_none=False) # these fields are specific to the read private role dateOfBirth = Raw(required=False, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py index 389d055f2..d7a657afb 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py @@ -20,6 +20,7 @@ ClinicalPrivilegeActionCategoryField, Compact, HomeJurisdictionChangeStatusField, + InvestigationStatusField, Jurisdiction, LicenseDeactivatedStatusField, PrivilegeEncumberedStatusField, @@ -63,6 +64,16 @@ class EncumbranceDetailsSchema(Schema): licenseJurisdiction = Jurisdiction(required=False, allow_none=False) +class InvestigationDetailsSchema(Schema): + """ + Schema for tracking details about an investigation. + """ + + investigationId = UUID(required=True, allow_none=False) + # present if update is created by upstream license investigation + licenseJurisdiction = Jurisdiction(required=False, allow_none=False) + + @BaseRecordSchema.register_schema('privilege') class PrivilegeRecordSchema(BaseRecordSchema, ValidatesLicenseTypeMixin): """ @@ -95,6 +106,8 @@ class PrivilegeRecordSchema(BaseRecordSchema, ValidatesLicenseTypeMixin): # this field is only set if the privilege or the associated license is encumbered encumberedStatus = PrivilegeEncumberedStatusField(required=False, allow_none=False) + # this field is only set if the privilege is under investigation + investigationStatus = InvestigationStatusField(required=False, allow_none=False) # This field is only set if a privilege is deactivated as a result of a provider changing their home jurisdiction # It is removed in the event that the provider is able to repurchase the privilege in the new jurisdiction after @@ -188,6 +201,8 @@ class PrivilegeUpdatePreviousRecordSchema(ForgivingSchema): homeJurisdictionChangeStatus = HomeJurisdictionChangeStatusField(required=False, allow_none=False) # this field is only set if the privilege or the associated license is encumbered encumberedStatus = PrivilegeEncumberedStatusField(required=False, allow_none=False) + # this field is only set if the privilege is under investigation + investigationStatus = InvestigationStatusField(required=False, allow_none=False) # this field is only set if the privilege is deactivated due to a state license deactivation licenseDeactivatedStatus = LicenseDeactivatedStatusField(required=False, allow_none=False) @@ -218,6 +233,8 @@ class PrivilegeUpdateRecordSchema(BaseRecordSchema, ChangeHashMixin, ValidatesLi deactivationDetails = Nested(DeactivationDetailsSchema(), required=False, allow_none=False) # optional field that is only included if the update was an encumbrance encumbranceDetails = Nested(EncumbranceDetailsSchema(), required=False, allow_none=False) + # optional field that is only included if the update was an investigation + investigationDetails = Nested(InvestigationDetailsSchema(), required=False, allow_none=False) # List of field names that were present in the previous record but removed in the update removedValues = List(String(), required=False, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py b/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py index 55754e32a..bcdd68769 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py @@ -3,8 +3,10 @@ from uuid import UUID from cc_common.config import config +from cc_common.data_model.schema.common import InvestigationAgainstEnum from cc_common.data_model.schema.data_event.api import ( EncumbranceEventDetailSchema, + InvestigationEventDetailSchema, LicenseDeactivationDetailSchema, PrivilegeIssuanceDetailSchema, PrivilegePurchaseEventDetailSchema, @@ -336,3 +338,101 @@ def publish_privilege_encumbrance_lifting_event( detail=deserialized_detail, event_batch_writer=event_batch_writer, ) + + def publish_investigation_event( + self, + source: str, + compact: str, + provider_id: UUID, + jurisdiction: str, + license_type_abbreviation: str, + investigation_start_date: date, + investigation_against: InvestigationAgainstEnum, + investigation_id: UUID | None = None, + event_batch_writer: EventBatchWriter | None = None, + ): + """ + Publish an investigation event to the event bus. + + :param source: The source of the event + :param compact: The compact name + :param provider_id: The provider ID + :param jurisdiction: The jurisdiction of the record being investigated + :param license_type_abbreviation: The license type abbreviation + :param investigation_start_date: The date when the investigation started + :param investigation_against: The type of record being investigated (privilege or license) + :param investigation_id: The investigation ID (optional, only for license investigations) + :param event_batch_writer: Optional EventBatchWriter for efficient batch publishing + """ + event_detail = { + 'compact': compact, + 'providerId': provider_id, + 'jurisdiction': jurisdiction, + 'licenseTypeAbbreviation': license_type_abbreviation, + 'investigationAgainst': investigation_against.value, + 'investigationStartDate': investigation_start_date, + 'eventTime': config.current_standard_datetime, + } + + # Add investigation_id if provided (for license investigations) + if investigation_id is not None: + event_detail['investigationId'] = investigation_id + + investigation_detail_schema = InvestigationEventDetailSchema() + deserialized_detail = investigation_detail_schema.dump(event_detail) + + # Determine the detail type based on investigation_against + detail_type = f'{investigation_against}.investigation' + + self._publish_event( + source=source, + detail_type=detail_type, + detail=deserialized_detail, + event_batch_writer=event_batch_writer, + ) + + def publish_investigation_closed_event( + self, + source: str, + compact: str, + provider_id: UUID, + jurisdiction: str, + license_type_abbreviation: str, + effective_date: date, + investigation_against: InvestigationAgainstEnum, + event_batch_writer: EventBatchWriter | None = None, + ): + """ + Publish an investigation closed event to the event bus. + + :param source: The source of the event + :param compact: The compact name + :param provider_id: The provider ID + :param jurisdiction: The jurisdiction of the record being investigated + :param license_type_abbreviation: The license type abbreviation + :param effective_date: The date when the investigation was closed + :param investigation_against: The type of record being investigated (privilege or license) + :param event_batch_writer: Optional EventBatchWriter for efficient batch publishing + """ + event_detail = { + 'compact': compact, + 'providerId': provider_id, + 'jurisdiction': jurisdiction, + 'licenseTypeAbbreviation': license_type_abbreviation, + 'investigationAgainst': investigation_against.value, + 'effectiveDate': effective_date, + 'eventTime': config.current_standard_datetime, + } + + investigation_detail_schema = InvestigationEventDetailSchema() + deserialized_detail = investigation_detail_schema.dump(event_detail) + + # Determine the detail type based on investigation_against + detail_type = f'{investigation_against.value}.investigationClosed' + + self._publish_event( + source=source, + detail_type=detail_type, + detail=deserialized_detail, + event_batch_writer=event_batch_writer, + ) diff --git a/backend/compact-connect/lambdas/python/common/common_test/test_constants.py b/backend/compact-connect/lambdas/python/common/common_test/test_constants.py index 4292917a7..54043c5c3 100644 --- a/backend/compact-connect/lambdas/python/common/common_test/test_constants.py +++ b/backend/compact-connect/lambdas/python/common/common_test/test_constants.py @@ -84,6 +84,12 @@ DEFAULT_AA_SUBMITTING_USER_ID = '12a6377e-c3a5-40e5-bca5-317ec854c556' DEFAULT_ADVERSE_ACTION_ID = '98765432-9876-9876-9876-987654321098' +# Investigation defaults +DEFAULT_INVESTIGATION_AGAINST_PRIVILEGE = 'privilege' +DEFAULT_INVESTIGATION_AGAINST_LICENSE = 'license' +DEFAULT_INVESTIGATION_START_DATE = '2024-02-15' +DEFAULT_INVESTIGATION_ID = '98765432-9876-9876-9876-987654321098' + # Default attestation values DEFAULT_ATTESTATIONS = [{'attestationId': 'jurisprudence-confirmation', 'version': '1'}] diff --git a/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py b/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py index bd2c5f6a9..fa302ef82 100644 --- a/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py +++ b/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py @@ -8,6 +8,7 @@ from cc_common.data_model.schema.adverse_action import AdverseActionData from cc_common.data_model.schema.common import CCDataClass from cc_common.data_model.schema.compact import CompactConfigurationData +from cc_common.data_model.schema.investigation import InvestigationData from cc_common.data_model.schema.jurisdiction import JurisdictionConfigurationData from cc_common.data_model.schema.license import LicenseData, LicenseUpdateData from cc_common.data_model.schema.military_affiliation import MilitaryAffiliationData @@ -150,6 +151,42 @@ def generate_default_adverse_action(value_overrides: dict | None = None) -> Adve return AdverseActionData.create_new(default_adverse_actions) + @staticmethod + def generate_default_investigation(value_overrides: dict | None = None) -> InvestigationData: + """Generate a default investigation""" + from common_test.test_constants import ( + DEFAULT_INVESTIGATION_AGAINST_PRIVILEGE, + DEFAULT_INVESTIGATION_ID, + DEFAULT_INVESTIGATION_START_DATE, + ) + + default_investigation = { + 'providerId': DEFAULT_PROVIDER_ID, + 'compact': DEFAULT_COMPACT, + 'type': 'investigation', + 'jurisdiction': DEFAULT_PRIVILEGE_JURISDICTION, + 'licenseTypeAbbreviation': DEFAULT_LICENSE_TYPE_ABBREVIATION, + 'licenseType': DEFAULT_LICENSE_TYPE, + 'investigationAgainst': DEFAULT_INVESTIGATION_AGAINST_PRIVILEGE, + 'investigationStartDate': date.fromisoformat(DEFAULT_INVESTIGATION_START_DATE), + 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, + 'creationDate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), + 'investigationId': DEFAULT_INVESTIGATION_ID, + } + if value_overrides: + default_investigation.update(value_overrides) + + return InvestigationData.create_new(default_investigation) + + @staticmethod + def put_default_investigation_record_in_provider_table(value_overrides: dict | None = None) -> InvestigationData: + investigation = TestDataGenerator.generate_default_investigation(value_overrides) + investigation_record = investigation.serialize_to_database_record() + + TestDataGenerator.store_record_in_provider_table(investigation_record) + + return investigation + @staticmethod def put_default_adverse_action_record_in_provider_table(value_overrides: dict | None = None) -> AdverseActionData: adverse_action = TestDataGenerator.generate_default_adverse_action(value_overrides) diff --git a/backend/compact-connect/lambdas/python/common/requirements-dev.in b/backend/compact-connect/lambdas/python/common/requirements-dev.in index 6f51419dd..03b06f84d 100644 --- a/backend/compact-connect/lambdas/python/common/requirements-dev.in +++ b/backend/compact-connect/lambdas/python/common/requirements-dev.in @@ -1,4 +1,4 @@ -moto[dynamodb, s3]>=5.0.12, <6 +moto[all]>=5.0.12, <6 boto3-stubs[full] Faker>=28,<29 cryptography>=46, <47 diff --git a/backend/compact-connect/lambdas/python/common/requirements-dev.txt b/backend/compact-connect/lambdas/python/common/requirements-dev.txt index d79ddd986..8385ab378 100644 --- a/backend/compact-connect/lambdas/python/common/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/common/requirements-dev.txt @@ -1,35 +1,57 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/common/requirements-dev.in # -boto3==1.40.35 +annotated-types==0.7.0 + # via pydantic +antlr4-python3-runtime==4.13.2 # via moto -boto3-stubs[full]==1.40.35 +attrs==25.4.0 + # via + # jsonschema + # referencing +aws-sam-translator==1.101.0 + # via cfn-lint +aws-xray-sdk==2.14.0 + # via moto +boto3==1.40.51 + # via + # aws-sam-translator + # moto +boto3-stubs[full]==1.40.51 # via -r lambdas/python/common/requirements-dev.in -boto3-stubs-full==1.40.34 +boto3-stubs-full==1.40.50 # via boto3-stubs -botocore==1.40.35 +botocore==1.40.51 # via + # aws-xray-sdk # boto3 # moto # s3transfer -botocore-stubs==1.40.33 +botocore-stubs==1.40.51 # via boto3-stubs -certifi==2025.8.3 +certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography +cfn-lint==1.40.1 + # via moto charset-normalizer==3.4.3 # via requests -cryptography==46.0.1 - # via moto +cryptography==46.0.2 + # via + # -r lambdas/python/common/requirements-dev.in + # joserfc + # moto docker==7.1.0 # via moto faker==28.4.1 # via -r lambdas/python/common/requirements-dev.in -idna==3.10 +graphql-core==3.2.6 + # via moto +idna==3.11 # via requests jinja2==3.1.6 # via moto @@ -37,40 +59,111 @@ jmespath==1.0.1 # via # boto3 # botocore -markupsafe==3.0.2 +joserfc==1.4.0 + # via moto +jsonpatch==1.33 + # via cfn-lint +jsonpath-ng==1.7.0 + # via moto +jsonpointer==3.0.0 + # via jsonpatch +jsonschema==4.25.1 + # via + # aws-sam-translator + # moto + # openapi-schema-validator + # openapi-spec-validator +jsonschema-path==0.3.4 + # via openapi-spec-validator +jsonschema-specifications==2025.9.1 + # via + # jsonschema + # openapi-schema-validator +lazy-object-proxy==1.12.0 + # via openapi-spec-validator +markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.12 +moto[all]==5.1.14 # via -r lambdas/python/common/requirements-dev.in +mpmath==1.3.0 + # via sympy +multipart==1.3.0 + # via moto +networkx==3.5 + # via cfn-lint +openapi-schema-validator==0.6.3 + # via openapi-spec-validator +openapi-spec-validator==0.7.2 + # via moto +pathable==0.4.4 + # via jsonschema-path +ply==3.11 + # via jsonpath-ng py-partiql-parser==0.6.1 # via moto pycparser==2.23 # via cffi +pydantic==2.12.1 + # via aws-sam-translator +pydantic-core==2.41.3 + # via pydantic +pyparsing==3.2.5 + # via moto python-dateutil==2.9.0.post0 # via # botocore # faker # moto -pyyaml==6.0.2 +pyyaml==6.0.3 # via + # cfn-lint + # jsonschema-path # moto # responses +referencing==0.36.2 + # via + # jsonschema + # jsonschema-path + # jsonschema-specifications +regex==2025.9.18 + # via cfn-lint requests==2.32.5 # via # docker + # jsonschema-path # moto # responses responses==0.25.8 # via moto +rfc3339-validator==0.1.4 + # via openapi-schema-validator +rpds-py==0.27.1 + # via + # jsonschema + # referencing s3transfer==0.14.0 # via boto3 six==1.17.0 - # via python-dateutil -types-awscrt==0.27.6 + # via + # python-dateutil + # rfc3339-validator +sympy==1.14.0 + # via cfn-lint +types-awscrt==0.28.1 # via botocore-stubs -types-s3transfer==0.13.1 +types-s3transfer==0.14.0 # via boto3-stubs +typing-extensions==4.15.0 + # via + # aws-sam-translator + # cfn-lint + # pydantic + # pydantic-core + # typing-inspection +typing-inspection==0.4.2 + # via pydantic urllib3==2.5.0 # via # botocore @@ -79,5 +172,10 @@ urllib3==2.5.0 # responses werkzeug==3.1.3 # via moto +wrapt==1.17.3 + # via aws-xray-sdk xmltodict==1.0.2 # via moto + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/backend/compact-connect/lambdas/python/common/requirements.txt b/backend/compact-connect/lambdas/python/common/requirements.txt index 828f0ab9d..632b0114b 100644 --- a/backend/compact-connect/lambdas/python/common/requirements.txt +++ b/backend/compact-connect/lambdas/python/common/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/common/requirements.in @@ -8,15 +8,15 @@ argon2-cffi==25.1.0 # via -r lambdas/python/common/requirements.in argon2-cffi-bindings==25.1.0 # via argon2-cffi -aws-lambda-powertools==3.20.0 +aws-lambda-powertools==3.21.0 # via -r lambdas/python/common/requirements.in -boto3==1.40.35 +boto3==1.40.51 # via -r lambdas/python/common/requirements.in -botocore==1.40.35 +botocore==1.40.51 # via # boto3 # s3transfer -certifi==2025.8.3 +certifi==2025.10.5 # via requests cffi==2.0.0 # via @@ -24,9 +24,9 @@ cffi==2.0.0 # cryptography charset-normalizer==3.4.3 # via requests -cryptography==46.0.1 +cryptography==46.0.2 # via -r lambdas/python/common/requirements.in -idna==3.10 +idna==3.11 # via requests jmespath==1.0.1 # via diff --git a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py index 71f7ece0b..1b7b6511f 100644 --- a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py +++ b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py @@ -1028,3 +1028,878 @@ def mock_query(**kwargs): finally: # Restore the original query method self.config.provider_table.query = original_query + + def test_create_privilege_investigation_success(self): + """Test successful creation of privilege investigation""" + from cc_common.data_model.data_client import DataClient + + # Load test data + provider_id = self._load_provider_data() + + client = DataClient(self.config) + + # Create investigation data using test data generator + investigation = self.test_data_generator.generate_default_investigation( + { + 'providerId': provider_id, + 'compact': 'aslp', + 'jurisdiction': 'ne', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'privilege', + } + ) + + # Call the method + client.create_investigation(investigation) + + # Verify investigation record was created + investigation_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').begins_with('aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#') + )['Items'] + + self.assertEqual(1, len(investigation_records)) + investigation_record = investigation_records[0] + + # Verify the complete investigation record structure + expected_investigation = { + 'pk': f'aslp#PROVIDER#{provider_id}', + 'sk': f'aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#{investigation.investigationId}', + 'type': 'investigation', + 'compact': 'aslp', + 'providerId': provider_id, + 'jurisdiction': 'ne', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'privilege', + 'investigationId': str(investigation.investigationId), + 'submittingUser': str(investigation.submittingUser), + 'creationDate': investigation.creationDate.isoformat(), + } + # Pop dynamic fields that we don't want to assert on + investigation_record.pop('dateOfUpdate') + + self.assertEqual(expected_investigation, investigation_record) + + # Verify privilege record was updated with investigation status + privilege_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').eq('aslp#PROVIDER#privilege/ne/slp#') + )['Items'] + + self.assertEqual(1, len(privilege_records)) + privilege_record = privilege_records[0] + self.assertEqual('underInvestigation', privilege_record['investigationStatus']) + + # Verify update record was created + update_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').begins_with('aslp#PROVIDER#privilege/ne/slp#UPDATE#') + )['Items'] + + self.assertEqual(1, len(update_records)) + update_record = update_records[0] + + # Verify the complete update record structure + expected_update = { + 'pk': f'aslp#PROVIDER#{provider_id}', + 'sk': 'aslp#PROVIDER#privilege/ne/slp#UPDATE#1731110399/ec3ac1fee136aa61a7c1d4547ced7af7', + 'compactTransactionIdGSIPK': 'COMPACT#aslp#TX#1234567890#', + 'type': 'privilegeUpdate', + 'updateType': 'investigation', + 'compact': 'aslp', + 'providerId': provider_id, + 'jurisdiction': 'ne', + 'licenseType': 'speech-language pathologist', + 'createDate': investigation.creationDate.isoformat(), + 'effectiveDate': investigation.creationDate.isoformat(), + 'previous': { + 'administratorSetStatus': 'active', + 'attestations': [{'attestationId': 'jurisprudence-confirmation', 'version': '1'}], + 'compactTransactionId': '1234567890', + 'dateOfExpiration': '2025-04-04', + 'dateOfIssuance': '2016-05-05T12:59:59+00:00', + 'dateOfRenewal': '2020-05-05T12:59:59+00:00', + 'dateOfUpdate': '2020-05-05T12:59:59+00:00', + 'licenseJurisdiction': 'oh', + 'privilegeId': 'SLP-NE-1', + }, + 'updatedValues': { + 'investigationStatus': 'underInvestigation', + 'dateOfUpdate': investigation.creationDate.isoformat(), + }, + 'investigationDetails': { + 'investigationId': str(investigation.investigationId), + }, + } + # Pop dynamic fields that we don't want to assert on + update_record.pop('dateOfUpdate') + + self.assertEqual(expected_update, update_record) + + def test_create_license_investigation_success(self): + """Test successful creation of license investigation""" + from cc_common.data_model.data_client import DataClient + from cc_common.data_model.schema.investigation import InvestigationData + + # Load test data + provider_id = self._load_provider_data() + + client = DataClient(self.config) + + # Create investigation data + investigation = InvestigationData.create_new( + { + 'providerId': provider_id, + 'compact': 'aslp', + 'jurisdiction': 'oh', + 'licenseTypeAbbreviation': 'slp', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'license', + 'submittingUser': str(uuid4()), + 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + 'investigationId': str(uuid4()), + } + ) + + # Call the method + client.create_investigation(investigation) + + # Verify investigation record was created + investigation_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').begins_with('aslp#PROVIDER#license/oh/slp#INVESTIGATION#') + )['Items'] + + self.assertEqual(1, len(investigation_records)) + investigation_record = investigation_records[0] + + # Verify the complete investigation record structure + expected_investigation = { + 'pk': f'aslp#PROVIDER#{provider_id}', + 'sk': f'aslp#PROVIDER#license/oh/slp#INVESTIGATION#{investigation.investigationId}', + 'type': 'investigation', + 'compact': 'aslp', + 'providerId': provider_id, + 'jurisdiction': 'oh', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'license', + 'investigationId': str(investigation.investigationId), + 'submittingUser': str(investigation.submittingUser), + 'creationDate': investigation.creationDate.isoformat(), + } + # Pop dynamic fields that we don't want to assert on + investigation_record.pop('dateOfUpdate') + + self.assertEqual(expected_investigation, investigation_record) + + # Verify license record was updated with investigation status + license_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').eq('aslp#PROVIDER#license/oh/slp#') + )['Items'] + + self.assertEqual(1, len(license_records)) + license_record = license_records[0] + self.assertEqual('underInvestigation', license_record['investigationStatus']) + + # Verify update record was created + update_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').begins_with('aslp#PROVIDER#license/oh/slp#UPDATE#') + )['Items'] + + self.assertEqual(1, len(update_records)) + update_record = update_records[0] + + # Verify the complete update record structure + expected_update = { + 'pk': f'aslp#PROVIDER#{provider_id}', + 'sk': 'aslp#PROVIDER#license/oh/slp#UPDATE#1731110399/b7d4fcd943bf6baade443d6f7e133ca4', + 'type': 'licenseUpdate', + 'updateType': 'investigation', + 'compact': 'aslp', + 'providerId': provider_id, + 'jurisdiction': 'oh', + 'licenseType': 'speech-language pathologist', + 'createDate': investigation.creationDate.isoformat(), + 'effectiveDate': investigation.creationDate.isoformat(), + 'previous': { + 'npi': '0608337260', + 'licenseNumber': 'A0608337260', + 'ssnLastFour': '1234', + 'givenName': 'Björk', + 'middleName': 'Gunnar', + 'familyName': 'Guðmundsdóttir', + 'dateOfUpdate': '2024-06-06T12:59:59+00:00', + 'dateOfIssuance': '2010-06-06', + 'dateOfRenewal': '2020-04-04', + 'dateOfExpiration': '2025-04-04', + 'dateOfBirth': '1985-06-06', + 'homeAddressStreet1': '123 A St.', + 'homeAddressStreet2': 'Apt 321', + 'homeAddressCity': 'Columbus', + 'homeAddressState': 'oh', + 'homeAddressPostalCode': '43004', + 'emailAddress': 'björk@example.com', + 'phoneNumber': '+13213214321', + 'licenseStatusName': 'DEFINITELY_A_HUMAN', + 'jurisdictionUploadedLicenseStatus': 'active', + 'jurisdictionUploadedCompactEligibility': 'eligible', + }, + 'updatedValues': { + 'investigationStatus': 'underInvestigation', + 'dateOfUpdate': investigation.creationDate.isoformat(), + }, + 'investigationDetails': { + 'investigationId': str(investigation.investigationId), + }, + } + # Pop dynamic fields that we don't want to assert on + update_record.pop('dateOfUpdate') + + self.assertEqual(expected_update, update_record) + + def test_create_privilege_investigation_privilege_not_found(self): + """Test creation of privilege investigation when privilege doesn't exist""" + from cc_common.data_model.data_client import DataClient + from cc_common.data_model.schema.investigation import InvestigationData + from cc_common.exceptions import CCNotFoundException + + client = DataClient(self.config) + + # Create investigation data for non-existent privilege + investigation = InvestigationData.create_new( + { + 'providerId': str(uuid4()), + 'compact': 'aslp', + 'jurisdiction': 'ne', + 'licenseTypeAbbreviation': 'slp', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'privilege', + 'submittingUser': str(uuid4()), + 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + 'investigationId': str(uuid4()), + } + ) + + # Call the method and expect exception + with self.assertRaises(CCNotFoundException) as context: + client.create_investigation(investigation) + + self.assertIn('Privilege not found', str(context.exception)) + + def test_create_license_investigation_license_not_found(self): + """Test creation of license investigation when license doesn't exist""" + from cc_common.data_model.data_client import DataClient + from cc_common.data_model.schema.investigation import InvestigationData + from cc_common.exceptions import CCNotFoundException + + client = DataClient(self.config) + + # Create investigation data for non-existent license + investigation = InvestigationData.create_new( + { + 'providerId': str(uuid4()), + 'compact': 'aslp', + 'jurisdiction': 'oh', + 'licenseTypeAbbreviation': 'slp', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'license', + 'submittingUser': str(uuid4()), + 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + 'investigationId': str(uuid4()), + } + ) + + # Call the method and expect exception + with self.assertRaises(CCNotFoundException) as context: + client.create_investigation(investigation) + + self.assertIn('License not found', str(context.exception)) + + def test_close_privilege_investigation_success(self): + """Test successful closing of privilege investigation""" + from cc_common.data_model.data_client import DataClient + from cc_common.data_model.schema.common import InvestigationAgainstEnum + from cc_common.data_model.schema.investigation import InvestigationData + + # Load test data + provider_id = self._load_provider_data() + + client = DataClient(self.config) + + # First create an investigation + investigation = InvestigationData.create_new( + { + 'providerId': provider_id, + 'compact': 'aslp', + 'jurisdiction': 'ne', + 'licenseTypeAbbreviation': 'slp', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'privilege', + 'submittingUser': str(uuid4()), + 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + 'investigationId': str(uuid4()), + } + ) + + client.create_investigation(investigation) + + # Now close the investigation + closing_user = str(uuid4()) + client.close_investigation( + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + investigation_id=str(investigation.investigationId), + closing_user=closing_user, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + ) + + # Verify investigation record was updated with close information + investigation_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').begins_with('aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#') + )['Items'] + + self.assertEqual(1, len(investigation_records)) + investigation_record = investigation_records[0] + + # Verify the investigation record was updated with close information + expected_investigation_close = { + 'pk': f'aslp#PROVIDER#{provider_id}', + 'sk': f'aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#{investigation.investigationId}', + 'type': 'investigation', + 'compact': 'aslp', + 'providerId': provider_id, + 'jurisdiction': 'ne', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'privilege', + 'investigationId': str(investigation.investigationId), + 'submittingUser': str(investigation.submittingUser), + 'creationDate': investigation.creationDate.isoformat(), + 'closeDate': investigation.creationDate.isoformat(), + 'closingUser': closing_user, + } + # Pop dynamic fields that we don't want to assert on + investigation_record.pop('dateOfUpdate') + + self.assertEqual(expected_investigation_close, investigation_record) + + # Verify privilege record no longer has investigation status + privilege_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').eq('aslp#PROVIDER#privilege/ne/slp#') + )['Items'] + + self.assertEqual(1, len(privilege_records)) + privilege_record = privilege_records[0] + self.assertNotIn('investigationStatus', privilege_record) + + # Verify update record was created for closure + update_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').begins_with('aslp#PROVIDER#privilege/ne/slp#UPDATE#') + )['Items'] + + # Should have 2 update records: one for creation, one for closure + self.assertEqual(2, len(update_records)) + + # Find the closure update record + closure_update = None + for update_record in update_records: + if update_record.get('updateType') == 'investigation': + # Check if this is the closure update (has removedValues) + if 'removedValues' in update_record and 'investigationStatus' in update_record['removedValues']: + closure_update = update_record + break + + self.assertIsNotNone(closure_update, 'Closure update record not found!') + + # Verify the complete closure update record structure + expected_closure_update = { + 'pk': f'aslp#PROVIDER#{provider_id}', + 'sk': 'aslp#PROVIDER#privilege/ne/slp#UPDATE#1731110399/4551cf811d92ea34958e69080e2f935f', + 'type': 'privilegeUpdate', + 'updateType': 'investigation', + 'compact': 'aslp', + 'providerId': provider_id, + 'jurisdiction': 'ne', + 'licenseType': 'speech-language pathologist', + 'createDate': investigation.creationDate.isoformat(), + 'effectiveDate': investigation.creationDate.isoformat(), + 'previous': { + 'administratorSetStatus': 'active', + 'attestations': [{'attestationId': 'jurisprudence-confirmation', 'version': '1'}], + 'compactTransactionId': '1234567890', + 'dateOfExpiration': '2025-04-04', + 'dateOfIssuance': '2016-05-05T12:59:59+00:00', + 'dateOfRenewal': '2020-05-05T12:59:59+00:00', + 'dateOfUpdate': '2024-11-08T23:59:59+00:00', + 'licenseJurisdiction': 'oh', + 'privilegeId': 'SLP-NE-1', + 'investigationStatus': 'underInvestigation', + }, + 'updatedValues': { + 'dateOfUpdate': investigation.creationDate.isoformat(), + }, + 'removedValues': ['investigationStatus'], + } + # Pop dynamic fields that we don't want to assert on + closure_update.pop('dateOfUpdate') + # Only pop compactTransactionIdGSIPK if it exists + if 'compactTransactionIdGSIPK' in closure_update: + closure_update.pop('compactTransactionIdGSIPK') + + self.assertEqual(expected_closure_update, closure_update) + + def test_close_license_investigation_success(self): + """Test successful closing of license investigation""" + from cc_common.data_model.data_client import DataClient + from cc_common.data_model.schema.common import InvestigationAgainstEnum + from cc_common.data_model.schema.investigation import InvestigationData + + # Load test data + provider_id = self._load_provider_data() + + client = DataClient(self.config) + + # First create an investigation + investigation = InvestigationData.create_new( + { + 'providerId': provider_id, + 'compact': 'aslp', + 'jurisdiction': 'oh', + 'licenseTypeAbbreviation': 'slp', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'license', + 'submittingUser': str(uuid4()), + 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + 'investigationId': str(uuid4()), + } + ) + + client.create_investigation(investigation) + + # Now close the investigation + closing_user = str(uuid4()) + client.close_investigation( + compact='aslp', + provider_id=provider_id, + jurisdiction='oh', + license_type_abbreviation='slp', + investigation_id=str(investigation.investigationId), + closing_user=closing_user, + investigation_against=InvestigationAgainstEnum.LICENSE, + ) + + # Verify investigation record was updated with close information + investigation_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').begins_with('aslp#PROVIDER#license/oh/slp#INVESTIGATION#') + )['Items'] + + self.assertEqual(1, len(investigation_records)) + investigation_record = investigation_records[0] + + # Verify the investigation record was updated with close information + expected_investigation_close = { + 'pk': f'aslp#PROVIDER#{provider_id}', + 'sk': f'aslp#PROVIDER#license/oh/slp#INVESTIGATION#{investigation.investigationId}', + 'type': 'investigation', + 'compact': 'aslp', + 'providerId': provider_id, + 'jurisdiction': 'oh', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'license', + 'investigationId': str(investigation.investigationId), + 'submittingUser': str(investigation.submittingUser), + 'creationDate': investigation.creationDate.isoformat(), + 'closeDate': investigation.creationDate.isoformat(), + 'closingUser': closing_user, + } + # Pop dynamic fields that we don't want to assert on + investigation_record.pop('dateOfUpdate') + + self.assertEqual(expected_investigation_close, investigation_record) + + # Verify license record no longer has investigation status + license_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').eq('aslp#PROVIDER#license/oh/slp#') + )['Items'] + + self.assertEqual(1, len(license_records)) + license_record = license_records[0] + self.assertNotIn('investigationStatus', license_record) + + # Verify update record was created for closure + update_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').begins_with('aslp#PROVIDER#license/oh/slp#UPDATE#') + )['Items'] + + # Should have 2 update records: one for creation, one for closure + self.assertEqual(2, len(update_records)) + + # Find the closure update record + closure_update = None + for update_record in update_records: + if update_record.get('updateType') == 'investigation': + # Check if this is the closure update (has removedValues) + if 'removedValues' in update_record and 'investigationStatus' in update_record['removedValues']: + closure_update = update_record + break + + self.assertIsNotNone(closure_update, 'Closure update not found!') + + # Verify the complete closure update record structure + expected_closure_update = { + 'pk': f'aslp#PROVIDER#{provider_id}', + 'sk': 'aslp#PROVIDER#license/oh/slp#UPDATE#1731110399/7d7d7d0f3aac97046124f4084d4db450', + 'type': 'licenseUpdate', + 'updateType': 'investigation', + 'compact': 'aslp', + 'providerId': provider_id, + 'jurisdiction': 'oh', + 'licenseType': 'speech-language pathologist', + 'createDate': investigation.creationDate.isoformat(), + 'effectiveDate': investigation.creationDate.isoformat(), + 'previous': { + 'npi': '0608337260', + 'licenseNumber': 'A0608337260', + 'ssnLastFour': '1234', + 'givenName': 'Björk', + 'middleName': 'Gunnar', + 'familyName': 'Guðmundsdóttir', + 'dateOfUpdate': '2024-11-08T23:59:59+00:00', + 'dateOfIssuance': '2010-06-06', + 'dateOfRenewal': '2020-04-04', + 'dateOfExpiration': '2025-04-04', + 'dateOfBirth': '1985-06-06', + 'homeAddressStreet1': '123 A St.', + 'homeAddressStreet2': 'Apt 321', + 'homeAddressCity': 'Columbus', + 'homeAddressState': 'oh', + 'homeAddressPostalCode': '43004', + 'emailAddress': 'björk@example.com', + 'phoneNumber': '+13213214321', + 'licenseStatusName': 'DEFINITELY_A_HUMAN', + 'jurisdictionUploadedLicenseStatus': 'active', + 'jurisdictionUploadedCompactEligibility': 'eligible', + 'investigationStatus': 'underInvestigation', + }, + 'updatedValues': { + 'dateOfUpdate': investigation.creationDate.isoformat(), + }, + 'removedValues': ['investigationStatus'], + } + # Pop dynamic fields that we don't want to assert on + closure_update.pop('dateOfUpdate') + + self.assertEqual(expected_closure_update, closure_update) + + def test_close_privilege_investigation_not_found(self): + """Test closing privilege investigation when investigation doesn't exist""" + from cc_common.data_model.data_client import DataClient + from cc_common.data_model.schema.common import InvestigationAgainstEnum + from cc_common.exceptions import CCNotFoundException + + # Load test data + provider_id = self._load_provider_data() + + client = DataClient(self.config) + + # Try to close a non-existent investigation + with self.assertRaises(CCNotFoundException) as context: + client.close_investigation( + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + investigation_id=str(uuid4()), + closing_user=str(uuid4()), + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + ) + + self.assertIn('Investigation not found', str(context.exception)) + + def test_close_license_investigation_not_found(self): + """Test closing license investigation when investigation doesn't exist""" + from cc_common.data_model.data_client import DataClient + from cc_common.data_model.schema.common import InvestigationAgainstEnum + from cc_common.exceptions import CCNotFoundException + + # Load test data + provider_id = self._load_provider_data() + + client = DataClient(self.config) + + # Try to close a non-existent investigation + with self.assertRaises(CCNotFoundException) as context: + client.close_investigation( + compact='aslp', + provider_id=provider_id, + jurisdiction='oh', + license_type_abbreviation='slp', + investigation_id=str(uuid4()), + closing_user=str(uuid4()), + investigation_against=InvestigationAgainstEnum.LICENSE, + ) + + self.assertIn('Investigation not found', str(context.exception)) + + def test_close_privilege_investigation_already_closed(self): + """Test closing privilege investigation when investigation was already closed""" + from cc_common.data_model.data_client import DataClient + from cc_common.data_model.schema.common import InvestigationAgainstEnum + from cc_common.data_model.schema.investigation import InvestigationData + from cc_common.exceptions import CCNotFoundException + + # Load test data + provider_id = self._load_provider_data() + + client = DataClient(self.config) + + # First create an investigation + investigation = InvestigationData.create_new( + { + 'providerId': provider_id, + 'compact': 'aslp', + 'jurisdiction': 'ne', + 'licenseTypeAbbreviation': 'slp', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'privilege', + 'submittingUser': str(uuid4()), + 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + 'investigationId': str(uuid4()), + } + ) + + client.create_investigation(investigation) + + # Now close the investigation + closing_user = str(uuid4()) + client.close_investigation( + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + investigation_id=str(investigation.investigationId), + closing_user=closing_user, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + ) + with self.assertRaises(CCNotFoundException) as context: + client.close_investigation( + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + investigation_id=str(investigation.investigationId), + closing_user=closing_user, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + ) + + self.assertIn('Investigation not found', str(context.exception)) + + def test_close_license_investigation_already_closed(self): + """Test closing privilege investigation when investigation was already closed""" + from cc_common.data_model.data_client import DataClient + from cc_common.data_model.schema.common import InvestigationAgainstEnum + from cc_common.data_model.schema.investigation import InvestigationData + from cc_common.exceptions import CCNotFoundException + + # Load test data + provider_id = self._load_provider_data() + + client = DataClient(self.config) + + # First create an investigation + investigation = InvestigationData.create_new( + { + 'providerId': provider_id, + 'compact': 'aslp', + 'jurisdiction': 'oh', + 'licenseTypeAbbreviation': 'slp', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'license', + 'submittingUser': str(uuid4()), + 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + 'investigationId': str(uuid4()), + } + ) + + client.create_investigation(investigation) + + # Now close the investigation + closing_user = str(uuid4()) + client.close_investigation( + compact='aslp', + provider_id=provider_id, + jurisdiction='oh', + license_type_abbreviation='slp', + investigation_id=str(investigation.investigationId), + closing_user=closing_user, + investigation_against=InvestigationAgainstEnum.LICENSE, + ) + with self.assertRaises(CCNotFoundException) as context: + client.close_investigation( + compact='aslp', + provider_id=provider_id, + jurisdiction='oh', + license_type_abbreviation='slp', + investigation_id=str(investigation.investigationId), + closing_user=closing_user, + investigation_against=InvestigationAgainstEnum.LICENSE, + ) + + self.assertIn('Investigation not found', str(context.exception)) + + def test_close_privilege_investigation_with_encumbrance(self): + """Test closing privilege investigation with encumbrance creation""" + from cc_common.data_model.data_client import DataClient + from cc_common.data_model.schema.common import InvestigationAgainstEnum + from cc_common.data_model.schema.investigation import InvestigationData + + # Load test data + provider_id = self._load_provider_data() + + client = DataClient(self.config) + + # First create an investigation + investigation = InvestigationData.create_new( + { + 'providerId': provider_id, + 'compact': 'aslp', + 'jurisdiction': 'ne', + 'licenseTypeAbbreviation': 'slp', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'privilege', + 'submittingUser': str(uuid4()), + 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + 'investigationId': str(uuid4()), + } + ) + + client.create_investigation(investigation) + + # Now close the investigation with encumbrance creation + closing_user = str(uuid4()) + resulting_encumbrance_id = str(uuid4()) + + client.close_investigation( + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + investigation_id=str(investigation.investigationId), + closing_user=closing_user, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + resulting_encumbrance_id=resulting_encumbrance_id, + ) + + # Verify investigation record was updated with close information and encumbrance reference + investigation_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').begins_with('aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#') + )['Items'] + + self.assertEqual(1, len(investigation_records)) + investigation_record = investigation_records[0] + + # Verify the investigation record was updated with close information and encumbrance reference + expected_investigation_close = { + 'pk': f'aslp#PROVIDER#{provider_id}', + 'sk': f'aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#{investigation.investigationId}', + 'type': 'investigation', + 'compact': 'aslp', + 'providerId': provider_id, + 'jurisdiction': 'ne', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'privilege', + 'investigationId': str(investigation.investigationId), + 'submittingUser': str(investigation.submittingUser), + 'creationDate': investigation.creationDate.isoformat(), + 'closeDate': investigation.creationDate.isoformat(), + 'closingUser': closing_user, + 'resultingEncumbranceId': resulting_encumbrance_id, + } + # Pop dynamic fields that we don't want to assert on + investigation_record.pop('dateOfUpdate') + + self.assertEqual(expected_investigation_close, investigation_record) + + def test_close_license_investigation_with_encumbrance(self): + """Test closing license investigation with encumbrance creation""" + from cc_common.data_model.data_client import DataClient + from cc_common.data_model.schema.common import InvestigationAgainstEnum + from cc_common.data_model.schema.investigation import InvestigationData + + # Load test data + provider_id = self._load_provider_data() + + client = DataClient(self.config) + + # First create an investigation + investigation = InvestigationData.create_new( + { + 'providerId': provider_id, + 'compact': 'aslp', + 'jurisdiction': 'oh', + 'licenseTypeAbbreviation': 'slp', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'license', + 'submittingUser': str(uuid4()), + 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + 'investigationId': str(uuid4()), + } + ) + + client.create_investigation(investigation) + + # Now close the investigation with encumbrance creation + closing_user = str(uuid4()) + resulting_encumbrance_id = str(uuid4()) + + client.close_investigation( + compact='aslp', + provider_id=provider_id, + jurisdiction='oh', + license_type_abbreviation='slp', + investigation_id=str(investigation.investigationId), + closing_user=closing_user, + investigation_against=InvestigationAgainstEnum.LICENSE, + resulting_encumbrance_id=resulting_encumbrance_id, + ) + + # Verify investigation record was updated with close information and encumbrance reference + investigation_records = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'aslp#PROVIDER#{provider_id}') + & Key('sk').begins_with('aslp#PROVIDER#license/oh/slp#INVESTIGATION#') + )['Items'] + + self.assertEqual(1, len(investigation_records)) + investigation_record = investigation_records[0] + + # Verify the investigation record was updated with close information and encumbrance reference + expected_investigation_close = { + 'pk': f'aslp#PROVIDER#{provider_id}', + 'sk': f'aslp#PROVIDER#license/oh/slp#INVESTIGATION#{investigation.investigationId}', + 'type': 'investigation', + 'compact': 'aslp', + 'providerId': provider_id, + 'jurisdiction': 'oh', + 'licenseType': 'speech-language pathologist', + 'investigationAgainst': 'license', + 'investigationId': str(investigation.investigationId), + 'submittingUser': str(investigation.submittingUser), + 'creationDate': investigation.creationDate.isoformat(), + 'closeDate': investigation.creationDate.isoformat(), + 'closingUser': closing_user, + 'resultingEncumbranceId': resulting_encumbrance_id, + } + # Pop dynamic fields that we don't want to assert on + investigation_record.pop('dateOfUpdate') + + self.assertEqual(expected_investigation_close, investigation_record) diff --git a/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch-with-encumbrance.json b/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch-with-encumbrance.json new file mode 100644 index 000000000..04a14244e --- /dev/null +++ b/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch-with-encumbrance.json @@ -0,0 +1,8 @@ +{ + "investigationCloseDate": "2024-03-15", + "encumbrance": { + "encumbranceEffectiveDate": "2024-03-15", + "encumbranceType": "suspension", + "clinicalPrivilegeActionCategory": "Unsafe Practice or Substandard Care" + } +} diff --git a/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch.json b/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch.json new file mode 100644 index 000000000..595c85753 --- /dev/null +++ b/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch.json @@ -0,0 +1,3 @@ +{ + "investigationCloseDate": "2024-03-15" +} diff --git a/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-post.json b/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-post.json new file mode 100644 index 000000000..15e66e40b --- /dev/null +++ b/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-post.json @@ -0,0 +1,3 @@ +{ + "investigationStartDate": "2024-02-15" +} diff --git a/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py new file mode 100644 index 000000000..e125abfe9 --- /dev/null +++ b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py @@ -0,0 +1,174 @@ +import json + +from marshmallow import ValidationError + +from tests import TstLambdas + + +class TestInvestigationRecordSchema(TstLambdas): + def setUp(self): + from common_test.test_data_generator import TestDataGenerator + + self.test_data_generator = TestDataGenerator + + def test_serde(self): + """Test round-trip deserialization/serialization""" + from cc_common.data_model.schema.investigation.record import InvestigationRecordSchema + + expected_investigation = ( + self.test_data_generator.generate_default_investigation().serialize_to_database_record() + ) + + schema = InvestigationRecordSchema() + loaded_schema = schema.load(expected_investigation.copy()) + + investigation_data = schema.dump(loaded_schema) + + # Pop dynamic fields + expected_investigation.pop('dateOfUpdate') + investigation_data.pop('dateOfUpdate') + + self.assertEqual(expected_investigation, investigation_data) + + def test_invalid(self): + from cc_common.data_model.schema.investigation.record import InvestigationRecordSchema + + investigation_data = self.test_data_generator.generate_default_investigation().to_dict() + investigation_data.pop('providerId') + + with self.assertRaises(ValidationError): + InvestigationRecordSchema().load(investigation_data) + + def test_invalid_investigation_against(self): + from cc_common.data_model.schema.common import CompactEligibilityStatus + from cc_common.data_model.schema.investigation import InvestigationData + + investigation_data = self.test_data_generator.generate_default_investigation() + + # setting to an invalid value from another enum + investigation_data.investigationAgainst = CompactEligibilityStatus.ELIGIBLE + + with self.assertRaises(ValidationError): + InvestigationData.from_database_record(investigation_data.serialize_to_database_record()) + + def test_invalid_license_type(self): + from cc_common.data_model.schema.investigation import InvestigationData + + investigation_data = self.test_data_generator.generate_default_investigation() + + # setting to an invalid license type name + investigation_data.licenseType = 'foobar' + + with self.assertRaises(ValidationError): + InvestigationData.from_database_record(investigation_data.serialize_to_database_record()) + + +class TestInvestigationDataClass(TstLambdas): + def setUp(self): + from common_test.test_data_generator import TestDataGenerator + + self.test_data_generator = TestDataGenerator + + def test_investigation_data_class_getters_return_expected_values(self): + from cc_common.data_model.schema.investigation import InvestigationData + + investigation_data = self.test_data_generator.generate_default_investigation().serialize_to_database_record() + + investigation = InvestigationData.from_database_record(investigation_data) + + # Use to_dict() method to get expected values + expected_investigation = investigation.to_dict() + + # Create actual object with all fields from database record + actual_investigation = { + 'providerId': investigation_data['providerId'], + 'jurisdiction': investigation_data['jurisdiction'], + 'investigationAgainst': investigation_data['investigationAgainst'], + 'submittingUser': investigation_data['submittingUser'], + 'investigationId': investigation_data['investigationId'], + 'compact': investigation_data['compact'], + 'creationDate': investigation_data['creationDate'], + 'licenseType': investigation_data['licenseType'], + 'type': investigation_data['type'], + } + + # Pop dynamic fields from expected object + expected_investigation.pop('dateOfUpdate') + + # Convert expected values to strings to match database record format + expected_investigation['providerId'] = str(expected_investigation['providerId']) + expected_investigation['investigationId'] = str(expected_investigation['investigationId']) + expected_investigation['submittingUser'] = str(expected_investigation['submittingUser']) + expected_investigation['creationDate'] = expected_investigation['creationDate'].isoformat() + + self.assertEqual(expected_investigation, actual_investigation) + + def test_investigation_data_class_outputs_expected_database_object(self): + # check final snapshot of expected data + investigation_data = self.test_data_generator.generate_default_investigation().serialize_to_database_record() + # Pop dynamic field + investigation_data.pop('dateOfUpdate') + + self.assertEqual( + { + 'investigationAgainst': 'privilege', + 'investigationId': '98765432-9876-9876-9876-987654321098', + 'compact': 'aslp', + 'creationDate': '2024-11-08T23:59:59+00:00', + 'jurisdiction': 'ne', + 'licenseType': 'speech-language pathologist', + 'pk': 'aslp#PROVIDER#89a6377e-c3a5-40e5-bca5-317ec854c570', + 'providerId': '89a6377e-c3a5-40e5-bca5-317ec854c570', + 'sk': 'aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#98765432-9876-9876-9876-987654321098', + 'submittingUser': '12a6377e-c3a5-40e5-bca5-317ec854c556', + 'type': 'investigation', + }, + investigation_data, + ) + + +class TestInvestigationPostRequestSchema(TstLambdas): + def test_validate_post(self): + """Test validation of a POST request""" + from cc_common.data_model.schema.investigation.api import InvestigationPostRequestSchema + + with open('tests/resources/api/investigation-post.json') as f: + InvestigationPostRequestSchema().load(json.load(f)) + + def test_invalid_post(self): + """Test validation error when required field is missing""" + from cc_common.data_model.schema.investigation.api import InvestigationPostRequestSchema + + with open('tests/resources/api/investigation-post.json') as f: + investigation_data = json.load(f) + investigation_data.pop('investigationStartDate') + + with self.assertRaises(ValidationError): + InvestigationPostRequestSchema().load(investigation_data) + + +class TestInvestigationPatchRequestSchema(TstLambdas): + def test_validate_patch(self): + """Test validation of a PATCH request""" + from cc_common.data_model.schema.investigation.api import InvestigationPatchRequestSchema + + with open('tests/resources/api/investigation-patch.json') as f: + InvestigationPatchRequestSchema().load(json.load(f)) + + def test_validate_patch_with_encumbrance(self): + """Test validation of a PATCH request with encumbrance""" + from cc_common.data_model.schema.investigation.api import InvestigationPatchRequestSchema + + with open('tests/resources/api/investigation-patch-with-encumbrance.json') as f: + InvestigationPatchRequestSchema().load(json.load(f)) + + def test_invalid_patch(self): + """Test validation error when required field is missing""" + from cc_common.data_model.schema.investigation.api import InvestigationPatchRequestSchema + + with open('tests/resources/api/investigation-patch.json') as f: + investigation_data = json.load(f) + investigation_data['unsupportedField'] = 'bad' + + with self.assertRaises(ValidationError): + InvestigationPatchRequestSchema().load(investigation_data) diff --git a/backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py b/backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py new file mode 100644 index 000000000..28c74175f --- /dev/null +++ b/backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py @@ -0,0 +1,354 @@ +import json +from datetime import date +from unittest.mock import MagicMock +from uuid import uuid4 + +from tests import TstLambdas + + +class TestInvestigationEventBusClient(TstLambdas): + def setUp(self): + from cc_common.config import config + from cc_common.event_bus_client import EventBusClient + + self.mock_events_client = MagicMock(name='events-client') + config.events_client = self.mock_events_client + + self.client = EventBusClient() + + def test_publish_privilege_investigation_event(self): + """Test publishing privilege investigation event""" + from cc_common.data_model.schema.common import InvestigationAgainstEnum + + provider_id = uuid4() + investigation_start_date = date.fromisoformat('2024-02-15') + + # Call the method + self.client.publish_investigation_event( + source='test.source', + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + investigation_start_date=investigation_start_date, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + ) + + # Verify put_events was called + self.mock_events_client.put_events.assert_called_once() + + # Verify the event structure + call_args = self.mock_events_client.put_events.call_args[1] + entries = call_args['Entries'] + self.assertEqual(1, len(entries)) + + event = entries[0] + + # Create expected event structure (without Detail field) + expected_event = { + 'Source': 'test.source', + 'DetailType': 'privilege.investigation', + 'EventBusName': 'license-data-events', + } + + # Create expected detail structure + expected_detail = { + 'compact': 'aslp', + 'providerId': str(provider_id), + 'jurisdiction': 'ne', + 'licenseTypeAbbreviation': 'slp', + 'investigationAgainst': 'privilege', + 'investigationStartDate': '2024-02-15', + } + + # Pop dynamic field from actual event + actual_event = event.copy() + actual_detail = json.loads(actual_event['Detail']) + actual_detail.pop('eventTime') + actual_event.pop('Detail') + + # Compare event structure and detail separately + self.assertEqual(expected_event, actual_event) + self.assertEqual(expected_detail, actual_detail) + + def test_publish_license_investigation_event(self): + """Test publishing license investigation event""" + from cc_common.data_model.schema.common import InvestigationAgainstEnum + + provider_id = uuid4() + investigation_id = uuid4() + investigation_start_date = date.fromisoformat('2024-02-15') + + # Call the method + self.client.publish_investigation_event( + source='test.source', + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + investigation_start_date=investigation_start_date, + investigation_against=InvestigationAgainstEnum.LICENSE, + investigation_id=investigation_id, + ) + + # Verify put_events was called + self.mock_events_client.put_events.assert_called_once() + + # Verify the event structure + call_args = self.mock_events_client.put_events.call_args[1] + entries = call_args['Entries'] + self.assertEqual(1, len(entries)) + + event = entries[0] + + # Create expected event structure (without Detail field) + expected_event = { + 'Source': 'test.source', + 'DetailType': 'license.investigation', + 'EventBusName': 'license-data-events', + } + + # Create expected detail structure + expected_detail = { + 'compact': 'aslp', + 'providerId': str(provider_id), + 'investigationId': str(investigation_id), + 'jurisdiction': 'ne', + 'licenseTypeAbbreviation': 'slp', + 'investigationAgainst': 'license', + 'investigationStartDate': '2024-02-15', + } + + # Pop dynamic field from actual event + actual_event = event.copy() + actual_detail = json.loads(actual_event['Detail']) + actual_detail.pop('eventTime') + actual_event.pop('Detail') + + # Compare event structure and detail separately + self.assertEqual(expected_event, actual_event) + self.assertEqual(expected_detail, actual_detail) + + def test_publish_privilege_investigation_closed_event(self): + """Test publishing privilege investigation closed event""" + from cc_common.data_model.schema.common import InvestigationAgainstEnum + + provider_id = uuid4() + effective_date = date.fromisoformat('2024-03-15') + + # Call the method + self.client.publish_investigation_closed_event( + source='test.source', + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + effective_date=effective_date, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + ) + + # Verify put_events was called + self.mock_events_client.put_events.assert_called_once() + + # Verify the event structure + call_args = self.mock_events_client.put_events.call_args[1] + entries = call_args['Entries'] + self.assertEqual(1, len(entries)) + + event = entries[0] + + # Create expected event structure (without Detail field) + expected_event = { + 'Source': 'test.source', + 'DetailType': 'privilege.investigationClosed', + 'EventBusName': 'license-data-events', + } + + # Create expected detail structure + expected_detail = { + 'compact': 'aslp', + 'providerId': str(provider_id), + 'jurisdiction': 'ne', + 'licenseTypeAbbreviation': 'slp', + 'investigationAgainst': 'privilege', + 'effectiveDate': '2024-03-15', + } + + # Pop dynamic field from actual event + actual_event = event.copy() + actual_detail = json.loads(actual_event['Detail']) + actual_detail.pop('eventTime') + actual_event.pop('Detail') + + # Compare event structure and detail separately + self.assertEqual(expected_event, actual_event) + self.assertEqual(expected_detail, actual_detail) + + def test_publish_license_investigation_closed_event(self): + """Test publishing license investigation closed event""" + from cc_common.data_model.schema.common import InvestigationAgainstEnum + + provider_id = uuid4() + effective_date = date.fromisoformat('2024-03-15') + + # Call the method + self.client.publish_investigation_closed_event( + source='test.source', + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + effective_date=effective_date, + investigation_against=InvestigationAgainstEnum.LICENSE, + ) + + # Verify put_events was called + self.mock_events_client.put_events.assert_called_once() + + # Verify the event structure + call_args = self.mock_events_client.put_events.call_args[1] + entries = call_args['Entries'] + self.assertEqual(1, len(entries)) + + event = entries[0] + + # Create expected event structure (without Detail field) + expected_event = { + 'Source': 'test.source', + 'DetailType': 'license.investigationClosed', + 'EventBusName': 'license-data-events', + } + + # Create expected detail structure + expected_detail = { + 'compact': 'aslp', + 'providerId': str(provider_id), + 'jurisdiction': 'ne', + 'licenseTypeAbbreviation': 'slp', + 'investigationAgainst': 'license', + 'effectiveDate': '2024-03-15', + } + + # Pop dynamic field from actual event + actual_event = event.copy() + actual_detail = json.loads(actual_event['Detail']) + actual_detail.pop('eventTime') + actual_event.pop('Detail') + + # Compare event structure and detail separately + self.assertEqual(expected_event, actual_event) + self.assertEqual(expected_detail, actual_detail) + + def test_publish_privilege_investigation_event_with_batch_writer(self): + """Test publishing privilege investigation event with batch writer""" + from cc_common.data_model.schema.common import InvestigationAgainstEnum + + provider_id = uuid4() + investigation_start_date = date.fromisoformat('2024-02-15') + + # Mock batch writer + mock_batch_writer = MagicMock() + + # Call the method + self.client.publish_investigation_event( + source='test.source', + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + investigation_start_date=investigation_start_date, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + event_batch_writer=mock_batch_writer, + ) + + # Verify put_events was NOT called directly + self.mock_events_client.put_events.assert_not_called() + + # Verify batch writer was used + mock_batch_writer.put_event.assert_called_once() + + def test_publish_license_investigation_event_with_batch_writer(self): + """Test publishing license investigation event with batch writer""" + from cc_common.data_model.schema.common import InvestigationAgainstEnum + + provider_id = uuid4() + investigation_id = uuid4() + investigation_start_date = date.fromisoformat('2024-02-15') + + # Mock batch writer + mock_batch_writer = MagicMock() + + # Call the method + self.client.publish_investigation_event( + source='test.source', + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + investigation_start_date=investigation_start_date, + investigation_against=InvestigationAgainstEnum.LICENSE, + investigation_id=investigation_id, + event_batch_writer=mock_batch_writer, + ) + + # Verify put_events was NOT called directly + self.mock_events_client.put_events.assert_not_called() + + # Verify batch writer was used + mock_batch_writer.put_event.assert_called_once() + + def test_publish_privilege_investigation_closed_event_with_batch_writer(self): + """Test publishing privilege investigation closed event with batch writer""" + from cc_common.data_model.schema.common import InvestigationAgainstEnum + + provider_id = uuid4() + effective_date = date.fromisoformat('2024-03-15') + + # Mock batch writer + mock_batch_writer = MagicMock() + + # Call the method + self.client.publish_investigation_closed_event( + source='test.source', + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + effective_date=effective_date, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + event_batch_writer=mock_batch_writer, + ) + + # Verify put_events was NOT called directly + self.mock_events_client.put_events.assert_not_called() + + # Verify batch writer was used + mock_batch_writer.put_event.assert_called_once() + + def test_publish_license_investigation_closed_event_with_batch_writer(self): + """Test publishing license investigation closed event with batch writer""" + from cc_common.data_model.schema.common import InvestigationAgainstEnum + + provider_id = uuid4() + effective_date = date.fromisoformat('2024-03-15') + + # Mock batch writer + mock_batch_writer = MagicMock() + + # Call the method + self.client.publish_investigation_closed_event( + source='test.source', + compact='aslp', + provider_id=provider_id, + jurisdiction='ne', + license_type_abbreviation='slp', + effective_date=effective_date, + investigation_against=InvestigationAgainstEnum.LICENSE, + event_batch_writer=mock_batch_writer, + ) + + # Verify put_events was NOT called directly + self.mock_events_client.put_events.assert_not_called() + + # Verify batch writer was used + mock_batch_writer.put_event.assert_called_once() From 4441667e23381726cbaeccfcfaa8b87e8d358da9 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Thu, 16 Oct 2025 14:55:08 -0600 Subject: [PATCH 02/33] WIP: add investigation API handlers --- .../cc_common/data_model/data_client.py | 31 +- .../data_model/schema/data_event/api.py | 2 +- .../data_model/schema/investigation/api.py | 11 - .../common/cc_common/event_bus_client.py | 8 +- .../common/common_test/test_data_generator.py | 2 +- .../common/tests/function/test_data_client.py | 43 +- .../investigation-patch-with-encumbrance.json | 8 - .../resources/api/investigation-patch.json | 3 - .../resources/api/investigation-post.json | 3 - .../test_schema/test_investigation.py | 54 +- .../test_investigation_event_bus_client.py | 20 +- .../provider-data-v1/handlers/encumbrance.py | 171 ++-- .../handlers/investigation.py | 278 ++++++ .../provider-data-v1/requirements-dev.txt | 18 +- .../python/provider-data-v1/requirements.txt | 2 +- .../test_handlers/test_investigation.py | 847 ++++++++++++++++++ 16 files changed, 1327 insertions(+), 174 deletions(-) delete mode 100644 backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch-with-encumbrance.json delete mode 100644 backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch.json delete mode 100644 backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-post.json create mode 100644 backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py create mode 100644 backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index 38c27fc8c..3d4ff65b3 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -1646,7 +1646,6 @@ def create_investigation(self, investigation: InvestigationData) -> None: update_data_type = LicenseUpdateData update_type = 'licenseUpdate' - now = config.current_standard_datetime investigation_details = { 'investigationId': investigation.investigationId, } @@ -1659,27 +1658,23 @@ def create_investigation(self, investigation: InvestigationData) -> None: 'providerId': investigation.providerId, 'compact': investigation.compact, 'jurisdiction': investigation.jurisdiction, - 'createDate': now, - 'effectiveDate': now, + 'createDate': investigation.creationDate, + 'effectiveDate': investigation.creationDate, 'licenseType': investigation.licenseType, 'previous': record_data.to_dict(), 'updatedValues': { 'investigationStatus': InvestigationStatusEnum.UNDER_INVESTIGATION, - 'dateOfUpdate': now, }, 'investigationDetails': investigation_details, } ) - # Create the investigation record - investigation_record = investigation.serialize_to_database_record() - # Prepare the transaction items transaction_items = [ { 'Put': { 'TableName': self.config.provider_table.table_name, - 'Item': investigation_record, + 'Item': investigation.serialize_to_database_record(), } }, { @@ -1701,7 +1696,7 @@ def create_investigation(self, investigation: InvestigationData) -> None: ), 'ExpressionAttributeValues': { ':investigationStatus': InvestigationStatusEnum.UNDER_INVESTIGATION.value, - ':dateOfUpdate': now.isoformat(), + ':dateOfUpdate': investigation.creationDate.isoformat(), }, } }, @@ -1720,6 +1715,7 @@ def close_investigation( license_type_abbreviation: str, investigation_id: str, closing_user: str, + close_date: datetime, investigation_against: InvestigationAgainstEnum, resulting_encumbrance_id: str = None, ) -> None: @@ -1732,6 +1728,7 @@ def close_investigation( :param license_type_abbreviation: The license type abbreviation :param investigation_id: The investigation ID :param closing_user: The user who closed the investigation + :param close_date: The date that the investigation was closed :param investigation_against: Whether investigating a privilege or license :param resulting_encumbrance_id: Optional encumbrance ID to reference in the investigation closure """ @@ -1766,8 +1763,6 @@ def close_investigation( update_data_type = LicenseUpdateData update_type = 'licenseUpdate' - now = config.current_standard_datetime - # Get license type from the record for the update record license_type = record_data.licenseType @@ -1779,13 +1774,11 @@ def close_investigation( 'providerId': provider_id, 'compact': compact, 'jurisdiction': jurisdiction, - 'createDate': now, - 'effectiveDate': now, + 'createDate': close_date, + 'effectiveDate': close_date, 'licenseType': license_type, 'previous': record_data.to_dict(), - 'updatedValues': { - 'dateOfUpdate': now, - }, + 'updatedValues': {}, 'removedValues': ['investigationStatus'], } ) @@ -1796,9 +1789,9 @@ def close_investigation( 'SET closeDate = :closeDate, closingUser = :closingUser, dateOfUpdate = :dateOfUpdate' ) investigation_expression_values = { - ':closeDate': now.isoformat(), + ':closeDate': close_date.isoformat(), ':closingUser': closing_user, - ':dateOfUpdate': now.isoformat(), + ':dateOfUpdate': close_date.isoformat(), } # Add resultingEncumbranceId if an encumbrance was created @@ -1838,7 +1831,7 @@ def close_investigation( 'UpdateExpression': 'REMOVE investigationStatus SET dateOfUpdate = :dateOfUpdate', 'ConditionExpression': 'attribute_exists(pk)', 'ExpressionAttributeValues': { - ':dateOfUpdate': now.isoformat(), + ':dateOfUpdate': close_date.isoformat(), }, } }, diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py index 2a6abd8fd..019d68f45 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py @@ -59,7 +59,7 @@ class InvestigationEventDetailSchema(DataEventDetailBaseSchema): investigationId = UUID(required=False, allow_none=False) licenseTypeAbbreviation = String(required=True, allow_none=False) investigationAgainst = String(required=True, allow_none=False) - investigationStartDate = Date(required=False, allow_none=False) + creationDate = DateTime(required=False, allow_none=False) effectiveDate = Date(required=False, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py index baa73a5f1..8bbe32439 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py @@ -10,17 +10,6 @@ ) -class InvestigationPostRequestSchema(ForgivingSchema): - """ - Schema for investigation POST requests. - - This schema is used to validate incoming requests to the investigation POST API endpoint. - - Serialization direction: - API -> load() -> Python - """ - - class InvestigationPatchRequestSchema(ForgivingSchema): """ Schema for investigation PATCH requests (investigation closing). diff --git a/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py b/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py index bcdd68769..5b68a6578 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py @@ -1,5 +1,5 @@ import json -from datetime import date +from datetime import date, datetime from uuid import UUID from cc_common.config import config @@ -346,7 +346,7 @@ def publish_investigation_event( provider_id: UUID, jurisdiction: str, license_type_abbreviation: str, - investigation_start_date: date, + create_date: datetime, investigation_against: InvestigationAgainstEnum, investigation_id: UUID | None = None, event_batch_writer: EventBatchWriter | None = None, @@ -359,7 +359,7 @@ def publish_investigation_event( :param provider_id: The provider ID :param jurisdiction: The jurisdiction of the record being investigated :param license_type_abbreviation: The license type abbreviation - :param investigation_start_date: The date when the investigation started + :param create_date: The datetime when the investigation record was created :param investigation_against: The type of record being investigated (privilege or license) :param investigation_id: The investigation ID (optional, only for license investigations) :param event_batch_writer: Optional EventBatchWriter for efficient batch publishing @@ -370,7 +370,7 @@ def publish_investigation_event( 'jurisdiction': jurisdiction, 'licenseTypeAbbreviation': license_type_abbreviation, 'investigationAgainst': investigation_against.value, - 'investigationStartDate': investigation_start_date, + 'createDate': create_date, 'eventTime': config.current_standard_datetime, } diff --git a/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py b/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py index fa302ef82..6de72ec04 100644 --- a/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py +++ b/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py @@ -168,7 +168,7 @@ def generate_default_investigation(value_overrides: dict | None = None) -> Inves 'licenseTypeAbbreviation': DEFAULT_LICENSE_TYPE_ABBREVIATION, 'licenseType': DEFAULT_LICENSE_TYPE, 'investigationAgainst': DEFAULT_INVESTIGATION_AGAINST_PRIVILEGE, - 'investigationStartDate': date.fromisoformat(DEFAULT_INVESTIGATION_START_DATE), + 'createDate': date.fromisoformat(DEFAULT_INVESTIGATION_START_DATE), 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, 'creationDate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), 'investigationId': DEFAULT_INVESTIGATION_ID, diff --git a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py index 1b7b6511f..cb98e15c5 100644 --- a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py +++ b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py @@ -16,6 +16,10 @@ class TestDataClient(TstFunction): sample_privilege_attestations = [{'attestationId': 'jurisprudence-confirmation', 'version': '1'}] + def setUp(self): + super().setUp() + self.maxDiff = None + def test_get_provider(self): from cc_common.data_model.data_client import DataClient @@ -1102,7 +1106,6 @@ def test_create_privilege_investigation_success(self): # Verify the complete update record structure expected_update = { 'pk': f'aslp#PROVIDER#{provider_id}', - 'sk': 'aslp#PROVIDER#privilege/ne/slp#UPDATE#1731110399/ec3ac1fee136aa61a7c1d4547ced7af7', 'compactTransactionIdGSIPK': 'COMPACT#aslp#TX#1234567890#', 'type': 'privilegeUpdate', 'updateType': 'investigation', @@ -1125,7 +1128,6 @@ def test_create_privilege_investigation_success(self): }, 'updatedValues': { 'investigationStatus': 'underInvestigation', - 'dateOfUpdate': investigation.creationDate.isoformat(), }, 'investigationDetails': { 'investigationId': str(investigation.investigationId), @@ -1133,6 +1135,7 @@ def test_create_privilege_investigation_success(self): } # Pop dynamic fields that we don't want to assert on update_record.pop('dateOfUpdate') + update_record.pop('sk') self.assertEqual(expected_update, update_record) @@ -1214,7 +1217,6 @@ def test_create_license_investigation_success(self): # Verify the complete update record structure expected_update = { 'pk': f'aslp#PROVIDER#{provider_id}', - 'sk': 'aslp#PROVIDER#license/oh/slp#UPDATE#1731110399/b7d4fcd943bf6baade443d6f7e133ca4', 'type': 'licenseUpdate', 'updateType': 'investigation', 'compact': 'aslp', @@ -1248,7 +1250,6 @@ def test_create_license_investigation_success(self): }, 'updatedValues': { 'investigationStatus': 'underInvestigation', - 'dateOfUpdate': investigation.creationDate.isoformat(), }, 'investigationDetails': { 'investigationId': str(investigation.investigationId), @@ -1256,6 +1257,7 @@ def test_create_license_investigation_success(self): } # Pop dynamic fields that we don't want to assert on update_record.pop('dateOfUpdate') + update_record.pop('sk') self.assertEqual(expected_update, update_record) @@ -1354,6 +1356,7 @@ def test_close_privilege_investigation_success(self): license_type_abbreviation='slp', investigation_id=str(investigation.investigationId), closing_user=closing_user, + close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.PRIVILEGE, ) @@ -1420,7 +1423,6 @@ def test_close_privilege_investigation_success(self): # Verify the complete closure update record structure expected_closure_update = { 'pk': f'aslp#PROVIDER#{provider_id}', - 'sk': 'aslp#PROVIDER#privilege/ne/slp#UPDATE#1731110399/4551cf811d92ea34958e69080e2f935f', 'type': 'privilegeUpdate', 'updateType': 'investigation', 'compact': 'aslp', @@ -1442,12 +1444,12 @@ def test_close_privilege_investigation_success(self): 'investigationStatus': 'underInvestigation', }, 'updatedValues': { - 'dateOfUpdate': investigation.creationDate.isoformat(), }, 'removedValues': ['investigationStatus'], } # Pop dynamic fields that we don't want to assert on closure_update.pop('dateOfUpdate') + closure_update.pop('sk') # Only pop compactTransactionIdGSIPK if it exists if 'compactTransactionIdGSIPK' in closure_update: closure_update.pop('compactTransactionIdGSIPK') @@ -1484,6 +1486,7 @@ def test_close_license_investigation_success(self): # Now close the investigation closing_user = str(uuid4()) + close_date = datetime.fromisoformat('2024-11-08T23:59:59+00:00') client.close_investigation( compact='aslp', provider_id=provider_id, @@ -1491,6 +1494,7 @@ def test_close_license_investigation_success(self): license_type_abbreviation='slp', investigation_id=str(investigation.investigationId), closing_user=closing_user, + close_date=close_date, investigation_against=InvestigationAgainstEnum.LICENSE, ) @@ -1516,7 +1520,7 @@ def test_close_license_investigation_success(self): 'investigationId': str(investigation.investigationId), 'submittingUser': str(investigation.submittingUser), 'creationDate': investigation.creationDate.isoformat(), - 'closeDate': investigation.creationDate.isoformat(), + 'closeDate': close_date.isoformat(), 'closingUser': closing_user, } # Pop dynamic fields that we don't want to assert on @@ -1557,7 +1561,6 @@ def test_close_license_investigation_success(self): # Verify the complete closure update record structure expected_closure_update = { 'pk': f'aslp#PROVIDER#{provider_id}', - 'sk': 'aslp#PROVIDER#license/oh/slp#UPDATE#1731110399/7d7d7d0f3aac97046124f4084d4db450', 'type': 'licenseUpdate', 'updateType': 'investigation', 'compact': 'aslp', @@ -1591,12 +1594,12 @@ def test_close_license_investigation_success(self): 'investigationStatus': 'underInvestigation', }, 'updatedValues': { - 'dateOfUpdate': investigation.creationDate.isoformat(), }, 'removedValues': ['investigationStatus'], } # Pop dynamic fields that we don't want to assert on closure_update.pop('dateOfUpdate') + closure_update.pop('sk') self.assertEqual(expected_closure_update, closure_update) @@ -1620,7 +1623,8 @@ def test_close_privilege_investigation_not_found(self): license_type_abbreviation='slp', investigation_id=str(uuid4()), closing_user=str(uuid4()), - investigation_against=InvestigationAgainstEnum.PRIVILEGE, + close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + investigation_against=InvestigationAgainstEnum.PRIVILEGE, ) self.assertIn('Investigation not found', str(context.exception)) @@ -1645,7 +1649,8 @@ def test_close_license_investigation_not_found(self): license_type_abbreviation='slp', investigation_id=str(uuid4()), closing_user=str(uuid4()), - investigation_against=InvestigationAgainstEnum.LICENSE, + close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + investigation_against=InvestigationAgainstEnum.LICENSE, ) self.assertIn('Investigation not found', str(context.exception)) @@ -1688,6 +1693,7 @@ def test_close_privilege_investigation_already_closed(self): license_type_abbreviation='slp', investigation_id=str(investigation.investigationId), closing_user=closing_user, + close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.PRIVILEGE, ) with self.assertRaises(CCNotFoundException) as context: @@ -1698,7 +1704,8 @@ def test_close_privilege_investigation_already_closed(self): license_type_abbreviation='slp', investigation_id=str(investigation.investigationId), closing_user=closing_user, - investigation_against=InvestigationAgainstEnum.PRIVILEGE, + close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + investigation_against=InvestigationAgainstEnum.PRIVILEGE, ) self.assertIn('Investigation not found', str(context.exception)) @@ -1741,6 +1748,7 @@ def test_close_license_investigation_already_closed(self): license_type_abbreviation='slp', investigation_id=str(investigation.investigationId), closing_user=closing_user, + close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.LICENSE, ) with self.assertRaises(CCNotFoundException) as context: @@ -1751,7 +1759,8 @@ def test_close_license_investigation_already_closed(self): license_type_abbreviation='slp', investigation_id=str(investigation.investigationId), closing_user=closing_user, - investigation_against=InvestigationAgainstEnum.LICENSE, + close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), + investigation_against=InvestigationAgainstEnum.LICENSE, ) self.assertIn('Investigation not found', str(context.exception)) @@ -1788,6 +1797,7 @@ def test_close_privilege_investigation_with_encumbrance(self): closing_user = str(uuid4()) resulting_encumbrance_id = str(uuid4()) + close_date = datetime.fromisoformat('2024-11-08T23:59:59+00:00') client.close_investigation( compact='aslp', provider_id=provider_id, @@ -1795,6 +1805,7 @@ def test_close_privilege_investigation_with_encumbrance(self): license_type_abbreviation='slp', investigation_id=str(investigation.investigationId), closing_user=closing_user, + close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.PRIVILEGE, resulting_encumbrance_id=resulting_encumbrance_id, ) @@ -1821,7 +1832,7 @@ def test_close_privilege_investigation_with_encumbrance(self): 'investigationId': str(investigation.investigationId), 'submittingUser': str(investigation.submittingUser), 'creationDate': investigation.creationDate.isoformat(), - 'closeDate': investigation.creationDate.isoformat(), + 'closeDate': close_date.isoformat(), 'closingUser': closing_user, 'resultingEncumbranceId': resulting_encumbrance_id, } @@ -1862,6 +1873,7 @@ def test_close_license_investigation_with_encumbrance(self): closing_user = str(uuid4()) resulting_encumbrance_id = str(uuid4()) + close_date = datetime.fromisoformat('2024-11-08T23:59:59+00:00') client.close_investigation( compact='aslp', provider_id=provider_id, @@ -1869,6 +1881,7 @@ def test_close_license_investigation_with_encumbrance(self): license_type_abbreviation='slp', investigation_id=str(investigation.investigationId), closing_user=closing_user, + close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.LICENSE, resulting_encumbrance_id=resulting_encumbrance_id, ) @@ -1895,7 +1908,7 @@ def test_close_license_investigation_with_encumbrance(self): 'investigationId': str(investigation.investigationId), 'submittingUser': str(investigation.submittingUser), 'creationDate': investigation.creationDate.isoformat(), - 'closeDate': investigation.creationDate.isoformat(), + 'closeDate': close_date.isoformat(), 'closingUser': closing_user, 'resultingEncumbranceId': resulting_encumbrance_id, } diff --git a/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch-with-encumbrance.json b/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch-with-encumbrance.json deleted file mode 100644 index 04a14244e..000000000 --- a/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch-with-encumbrance.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "investigationCloseDate": "2024-03-15", - "encumbrance": { - "encumbranceEffectiveDate": "2024-03-15", - "encumbranceType": "suspension", - "clinicalPrivilegeActionCategory": "Unsafe Practice or Substandard Care" - } -} diff --git a/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch.json b/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch.json deleted file mode 100644 index 595c85753..000000000 --- a/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-patch.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "investigationCloseDate": "2024-03-15" -} diff --git a/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-post.json b/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-post.json deleted file mode 100644 index 15e66e40b..000000000 --- a/backend/compact-connect/lambdas/python/common/tests/resources/api/investigation-post.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "investigationStartDate": "2024-02-15" -} diff --git a/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py index e125abfe9..59cbd1a0a 100644 --- a/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py +++ b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py @@ -1,5 +1,3 @@ -import json - from marshmallow import ValidationError from tests import TstLambdas @@ -127,48 +125,36 @@ def test_investigation_data_class_outputs_expected_database_object(self): ) -class TestInvestigationPostRequestSchema(TstLambdas): - def test_validate_post(self): - """Test validation of a POST request""" - from cc_common.data_model.schema.investigation.api import InvestigationPostRequestSchema - - with open('tests/resources/api/investigation-post.json') as f: - InvestigationPostRequestSchema().load(json.load(f)) - - def test_invalid_post(self): - """Test validation error when required field is missing""" - from cc_common.data_model.schema.investigation.api import InvestigationPostRequestSchema - - with open('tests/resources/api/investigation-post.json') as f: - investigation_data = json.load(f) - investigation_data.pop('investigationStartDate') - - with self.assertRaises(ValidationError): - InvestigationPostRequestSchema().load(investigation_data) - - class TestInvestigationPatchRequestSchema(TstLambdas): def test_validate_patch(self): - """Test validation of a PATCH request""" + """Test validation of a PATCH request (empty body is valid)""" from cc_common.data_model.schema.investigation.api import InvestigationPatchRequestSchema - with open('tests/resources/api/investigation-patch.json') as f: - InvestigationPatchRequestSchema().load(json.load(f)) + # PATCH schema has no required fields + result = InvestigationPatchRequestSchema().load({}) + self.assertIsInstance(result, dict) def test_validate_patch_with_encumbrance(self): """Test validation of a PATCH request with encumbrance""" from cc_common.data_model.schema.investigation.api import InvestigationPatchRequestSchema - with open('tests/resources/api/investigation-patch-with-encumbrance.json') as f: - InvestigationPatchRequestSchema().load(json.load(f)) + investigation_data = { + 'encumbrance': { + 'encumbranceEffectiveDate': '2024-03-15', + 'encumbranceType': 'suspension', + 'clinicalPrivilegeActionCategory': 'Unsafe Practice or Substandard Care', + } + } + result = InvestigationPatchRequestSchema().load(investigation_data) + self.assertIsInstance(result, dict) - def test_invalid_patch(self): - """Test validation error when required field is missing""" + def test_validate_patch_with_unknown_fields(self): + """Test validation passes even with unknown fields (ForgivingSchema)""" from cc_common.data_model.schema.investigation.api import InvestigationPatchRequestSchema - with open('tests/resources/api/investigation-patch.json') as f: - investigation_data = json.load(f) - investigation_data['unsupportedField'] = 'bad' + # ForgivingSchema allows unknown fields + investigation_data = {'unsupportedField': 'bad'} - with self.assertRaises(ValidationError): - InvestigationPatchRequestSchema().load(investigation_data) + # This should not raise an error + result = InvestigationPatchRequestSchema().load(investigation_data) + self.assertIsInstance(result, dict) diff --git a/backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py b/backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py index 28c74175f..eea1e4d66 100644 --- a/backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py +++ b/backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py @@ -1,5 +1,5 @@ import json -from datetime import date +from datetime import date, datetime from unittest.mock import MagicMock from uuid import uuid4 @@ -21,7 +21,7 @@ def test_publish_privilege_investigation_event(self): from cc_common.data_model.schema.common import InvestigationAgainstEnum provider_id = uuid4() - investigation_start_date = date.fromisoformat('2024-02-15') + create_date = datetime.fromisoformat('2024-02-15T12:00:00+00:00') # Call the method self.client.publish_investigation_event( @@ -30,7 +30,7 @@ def test_publish_privilege_investigation_event(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - investigation_start_date=investigation_start_date, + create_date=create_date, investigation_against=InvestigationAgainstEnum.PRIVILEGE, ) @@ -58,7 +58,6 @@ def test_publish_privilege_investigation_event(self): 'jurisdiction': 'ne', 'licenseTypeAbbreviation': 'slp', 'investigationAgainst': 'privilege', - 'investigationStartDate': '2024-02-15', } # Pop dynamic field from actual event @@ -77,7 +76,7 @@ def test_publish_license_investigation_event(self): provider_id = uuid4() investigation_id = uuid4() - investigation_start_date = date.fromisoformat('2024-02-15') + create_date = datetime.fromisoformat('2024-02-15T12:00:00+00:00') # Call the method self.client.publish_investigation_event( @@ -86,7 +85,7 @@ def test_publish_license_investigation_event(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - investigation_start_date=investigation_start_date, + create_date=create_date, investigation_against=InvestigationAgainstEnum.LICENSE, investigation_id=investigation_id, ) @@ -116,7 +115,6 @@ def test_publish_license_investigation_event(self): 'jurisdiction': 'ne', 'licenseTypeAbbreviation': 'slp', 'investigationAgainst': 'license', - 'investigationStartDate': '2024-02-15', } # Pop dynamic field from actual event @@ -244,7 +242,7 @@ def test_publish_privilege_investigation_event_with_batch_writer(self): from cc_common.data_model.schema.common import InvestigationAgainstEnum provider_id = uuid4() - investigation_start_date = date.fromisoformat('2024-02-15') + create_date = datetime.fromisoformat('2024-02-15T12:00:00+00:00') # Mock batch writer mock_batch_writer = MagicMock() @@ -256,7 +254,7 @@ def test_publish_privilege_investigation_event_with_batch_writer(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - investigation_start_date=investigation_start_date, + create_date=create_date, investigation_against=InvestigationAgainstEnum.PRIVILEGE, event_batch_writer=mock_batch_writer, ) @@ -273,7 +271,7 @@ def test_publish_license_investigation_event_with_batch_writer(self): provider_id = uuid4() investigation_id = uuid4() - investigation_start_date = date.fromisoformat('2024-02-15') + create_date = datetime.fromisoformat('2024-02-15T12:00:00+00:00') # Mock batch writer mock_batch_writer = MagicMock() @@ -285,7 +283,7 @@ def test_publish_license_investigation_event_with_batch_writer(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - investigation_start_date=investigation_start_date, + create_date=create_date, investigation_against=InvestigationAgainstEnum.LICENSE, investigation_id=investigation_id, event_batch_writer=mock_batch_writer, diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py index 36f6768af..3ba1ad099 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py @@ -54,70 +54,80 @@ def encumbrance_handler(event: dict, context: LambdaContext) -> dict: raise CCInvalidRequestException('Invalid endpoint requested') -def _get_submitting_user_id(event: dict): - return event['requestContext']['authorizer']['claims']['sub'] - - -def _generate_adverse_action_for_record_type( - event: dict, adverse_action_against_record_type: AdverseActionAgainstEnum -) -> AdverseActionData: - # get the compact, providerId, jurisdiction, licenseType from the path parameters - compact = event['pathParameters']['compact'] - provider_id = event['pathParameters']['providerId'] - jurisdiction = event['pathParameters']['jurisdiction'] - # the path parameter says licenseType, but it's actually the license type abbreviation - license_type_abbreviation_from_path_parameter = event['pathParameters']['licenseType'].lower() - - body = json.loads(event['body']) - # validate the request body +def _load_adverse_action_post_body(event: dict) -> dict: try: schema = AdverseActionPostRequestSchema() - adverse_action_request = schema.load(body) + return schema.loads(event['body']) except ValidationError as e: raise CCInvalidRequestException(f'Invalid request body: {e.messages}') from e + +def _get_submitting_user_id(event: dict) -> str: + return event['requestContext']['authorizer']['claims']['sub'] + + +def _generate_adverse_action_for_record_type( + compact: str, + provider_id: str, + jurisdiction: str, + license_type_abbr: str, + submitting_user: str, + adverse_action_post_body: dict, + adverse_action_against_record_type: AdverseActionAgainstEnum, +) -> AdverseActionData: current_date = config.expiration_resolution_date - encumbrance_effective_date = adverse_action_request['encumbranceEffectiveDate'] + encumbrance_effective_date = adverse_action_post_body['encumbranceEffectiveDate'] if encumbrance_effective_date > current_date: raise CCInvalidRequestException('The encumbrance date must not be a future date') - # populate the adverse action data to be stored in the database - adverse_action = AdverseActionData.create_new() - adverse_action.compact = compact - adverse_action.providerId = provider_id - adverse_action.jurisdiction = jurisdiction - - license_type = LicenseUtility.get_license_type_by_abbreviation( - compact=compact, abbreviation=license_type_abbreviation_from_path_parameter - ) - + license_type = LicenseUtility.get_license_type_by_abbreviation(compact=compact, abbreviation=license_type_abbr) if not license_type: raise CCInvalidRequestException( f'Could not find license type information based on provided parameters ' - f"compact: '{compact}' licenseType: '{license_type_abbreviation_from_path_parameter}'" + f"compact: '{compact}' licenseType: '{license_type_abbr}'" ) - adverse_action.licenseTypeAbbreviation = license_type.abbreviation - adverse_action.licenseType = license_type.name - adverse_action.actionAgainst = adverse_action_against_record_type - adverse_action.encumbranceType = EncumbranceType(adverse_action_request['encumbranceType']) - adverse_action.clinicalPrivilegeActionCategory = ClinicalPrivilegeActionCategory( - adverse_action_request['clinicalPrivilegeActionCategory'] + # populate the adverse action data to be stored in the database + return AdverseActionData.create_new( + { + 'compact': compact, + 'providerId': provider_id, + 'jurisdiction': jurisdiction, + 'licenseTypeAbbreviation': license_type.abbreviation, + 'licenseType': license_type.name, + 'actionAgainst': adverse_action_against_record_type, + 'encumbranceType': EncumbranceType(adverse_action_post_body['encumbranceType']), + 'effectiveStartDate': encumbrance_effective_date, + 'submittingUser': submitting_user, + 'creationDate': config.current_standard_datetime, + 'adverseActionId': uuid4(), + 'clinicalPrivilegeActionCategory': ClinicalPrivilegeActionCategory( + adverse_action_post_body['clinicalPrivilegeActionCategory'] + ), + } ) - adverse_action.effectiveStartDate = encumbrance_effective_date - adverse_action.submittingUser = _get_submitting_user_id(event) - adverse_action.creationDate = config.current_standard_datetime - adverse_action.adverseActionId = uuid4() - - return adverse_action -def handle_privilege_encumbrance(event: dict) -> dict: +def _create_privilege_encumbrance_internal( + compact: str, + jurisdiction: str, + provider_id: str, + license_type_abbr: str, + submitting_user: str, + adverse_action_post_body: dict, +) -> str: + """Internal handler for creating privilege encumbrances that returns the adverse action ID""" + logger.info('Processing adverse action updates for privilege record') adverse_action = _generate_adverse_action_for_record_type( - event=event, adverse_action_against_record_type=AdverseActionAgainstEnum.PRIVILEGE + compact=compact, + jurisdiction=jurisdiction, + provider_id=provider_id, + license_type_abbr=license_type_abbr, + adverse_action_post_body=adverse_action_post_body, + adverse_action_against_record_type=AdverseActionAgainstEnum.PRIVILEGE, + submitting_user=submitting_user, ) - logger.info('Processing adverse action updates for privilege record') config.data_client.encumber_privilege(adverse_action) # Publish privilege encumbrance event @@ -130,17 +140,49 @@ def handle_privilege_encumbrance(event: dict) -> dict: effective_date=adverse_action.effectiveStartDate, ) - return {'message': 'OK'} + return str(adverse_action.adverseActionId) -def handle_license_encumbrance(event: dict) -> dict: - adverse_action = _generate_adverse_action_for_record_type( - event=event, adverse_action_against_record_type=AdverseActionAgainstEnum.LICENSE +def handle_privilege_encumbrance(event: dict) -> dict: + """Public API handler for creating privilege encumbrances""" + # Parse event parameters + compact = event['pathParameters']['compact'] + jurisdiction = event['pathParameters']['jurisdiction'] + provider_id = event['pathParameters']['providerId'] + license_type_abbr = event['pathParameters']['licenseType'].lower() + submitting_user = _get_submitting_user_id(event) + adverse_action_post_body = _load_adverse_action_post_body(event) + + _create_privilege_encumbrance_internal( + compact=compact, + jurisdiction=jurisdiction, + provider_id=provider_id, + license_type_abbr=license_type_abbr, + submitting_user=submitting_user, + adverse_action_post_body=adverse_action_post_body, ) - logger.info('Processing adverse action updates for license record') + return {'message': 'OK'} - adverse_action.serialize_to_database_record() +def _create_license_encumbrance_internal( + compact: str, + jurisdiction: str, + provider_id: str, + license_type_abbr: str, + submitting_user: str, + adverse_action_post_body: dict, +) -> str: + """Internal handler for creating license encumbrances that returns the adverse action ID""" + logger.info('Processing adverse action updates for license record') + adverse_action = _generate_adverse_action_for_record_type( + compact=compact, + jurisdiction=jurisdiction, + provider_id=provider_id, + license_type_abbr=license_type_abbr, + adverse_action_post_body=adverse_action_post_body, + adverse_action_against_record_type=AdverseActionAgainstEnum.LICENSE, + submitting_user=submitting_user, + ) config.data_client.encumber_license(adverse_action) # Publish license encumbrance event @@ -155,6 +197,27 @@ def handle_license_encumbrance(event: dict) -> dict: effective_date=adverse_action.effectiveStartDate, ) + return str(adverse_action.adverseActionId) + + +def handle_license_encumbrance(event: dict) -> dict: + """Public API handler for creating license encumbrances""" + # Parse event parameters + compact = event['pathParameters']['compact'] + jurisdiction = event['pathParameters']['jurisdiction'] + provider_id = event['pathParameters']['providerId'] + license_type_abbr = event['pathParameters']['licenseType'].lower() + submitting_user = _get_submitting_user_id(event) + adverse_action_post_body = _load_adverse_action_post_body(event) + + _create_license_encumbrance_internal( + compact=compact, + jurisdiction=jurisdiction, + provider_id=provider_id, + license_type_abbr=license_type_abbr, + submitting_user=submitting_user, + adverse_action_post_body=adverse_action_post_body, + ) return {'message': 'OK'} @@ -205,9 +268,9 @@ def handle_privilege_encumbrance_lifting(event: dict) -> dict: jurisdiction=jurisdiction, license_type_abbreviation=license_type_abbreviation, effective_date=lift_date, - ) + ) - return {'message': 'OK'} + return {'message': 'OK'} def handle_license_encumbrance_lifting(event: dict) -> dict: @@ -257,6 +320,6 @@ def handle_license_encumbrance_lifting(event: dict) -> dict: jurisdiction=jurisdiction, license_type_abbreviation=license_type_abbreviation, effective_date=lift_date, - ) + ) - return {'message': 'OK'} + return {'message': 'OK'} diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py new file mode 100644 index 000000000..f25a3e58f --- /dev/null +++ b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py @@ -0,0 +1,278 @@ +import json +from uuid import uuid4 + +from aws_lambda_powertools.utilities.typing import LambdaContext +from cc_common.config import config, logger +from cc_common.data_model.schema.common import ( + CCPermissionsAction, + InvestigationAgainstEnum, +) +from cc_common.data_model.schema.investigation import InvestigationData +from cc_common.data_model.schema.investigation.api import ( + InvestigationPatchRequestSchema, +) +from cc_common.exceptions import CCInvalidRequestException +from cc_common.license_util import LicenseUtility +from cc_common.utils import api_handler, authorize_state_level_only_action +from marshmallow import ValidationError + +from .encumbrance import _create_license_encumbrance_internal, _create_privilege_encumbrance_internal + +PRIVILEGE_INVESTIGATION_ENDPOINT_RESOURCE = ( + '/v1/compacts/{compact}/providers/{providerId}/privileges/' + 'jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation' +) +LICENSE_INVESTIGATION_ENDPOINT_RESOURCE = ( + '/v1/compacts/{compact}/providers/{providerId}/licenses/' + 'jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation' +) +PRIVILEGE_INVESTIGATION_ID_ENDPOINT_RESOURCE = ( + '/v1/compacts/{compact}/providers/{providerId}/privileges/' + 'jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation/{investigationId}' +) +LICENSE_INVESTIGATION_ID_ENDPOINT_RESOURCE = ( + '/v1/compacts/{compact}/providers/{providerId}/licenses/' + 'jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation/{investigationId}' +) + + +@api_handler +@authorize_state_level_only_action(action=CCPermissionsAction.ADMIN) +def investigation_handler(event: dict, context: LambdaContext) -> dict: + """Investigation handler""" + # Get the cognito sub of the caller for tracing + cognito_sub = event['requestContext']['authorizer']['claims']['sub'] + + with logger.append_context_keys(aws_request=context.aws_request_id, cognito_sub=cognito_sub): + if event['httpMethod'] == 'POST' and event['resource'] == PRIVILEGE_INVESTIGATION_ENDPOINT_RESOURCE: + return handle_privilege_investigation(event) + if event['httpMethod'] == 'POST' and event['resource'] == LICENSE_INVESTIGATION_ENDPOINT_RESOURCE: + return handle_license_investigation(event) + if event['httpMethod'] == 'PATCH' and event['resource'] == PRIVILEGE_INVESTIGATION_ID_ENDPOINT_RESOURCE: + return handle_privilege_investigation_close(event) + if event['httpMethod'] == 'PATCH' and event['resource'] == LICENSE_INVESTIGATION_ID_ENDPOINT_RESOURCE: + return handle_license_investigation_close(event) + + raise CCInvalidRequestException('Invalid endpoint requested') + + +def _load_investigation_patch_body(event: dict) -> dict: + # Parse and validate request body + body = json.loads(event['body']) + try: + return InvestigationPatchRequestSchema().load(body) + except ValidationError as e: + raise CCInvalidRequestException(f'Invalid request body: {e.messages}') from e + + +def _generate_investigation_for_record_type( + compact: str, + jurisdiction: str, + provider_id: str, + license_type_abbr: str, + investigation_against_record_type: InvestigationAgainstEnum, cognito_sub: str +) -> InvestigationData: + + license_type = LicenseUtility.get_license_type_by_abbreviation( + compact=compact, abbreviation=license_type_abbr + ) + + if not license_type: + raise CCInvalidRequestException( + f'Could not find license type information based on provided parameters ' + f"compact: '{compact}' licenseType: '{license_type_abbr}'" + ) + + # populate the investigation data to be stored in the database + return InvestigationData.create_new({ + 'compact': compact, + 'jurisdiction': jurisdiction, + 'providerId': provider_id, + 'investigationId': uuid4(), + 'licenseTypeAbbreviation': license_type_abbr, + 'licenseType': license_type.name, + 'investigationAgainst': investigation_against_record_type, + 'submittingUser': cognito_sub, + 'creationDate': config.current_standard_datetime, + }) + + +def handle_privilege_investigation(event: dict) -> dict: + """Public API handler for creating privilege investigations""" + # Parse event parameters + compact = event['pathParameters']['compact'] + jurisdiction = event['pathParameters']['jurisdiction'] + provider_id = event['pathParameters']['providerId'] + license_type_abbr = event['pathParameters']['licenseType'].lower() + cognito_sub = event['requestContext']['authorizer']['claims']['sub'] + + investigation = _generate_investigation_for_record_type( + compact=compact, + jurisdiction=jurisdiction, + provider_id=provider_id, + license_type_abbr=license_type_abbr, + investigation_against_record_type=InvestigationAgainstEnum.PRIVILEGE, + cognito_sub=cognito_sub + ) + logger.info('Processing investigation updates for privilege record') + config.data_client.create_investigation(investigation) + + # Publish privilege investigation event + config.event_bus_client.publish_investigation_event( + source='org.compactconnect.provider-data', + compact=investigation.compact, + provider_id=investigation.providerId, + jurisdiction=investigation.jurisdiction, + create_date=investigation.creationDate, + license_type_abbreviation=investigation.licenseTypeAbbreviation, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + ) + + return {'message': 'OK'} + + +def handle_license_investigation(event: dict) -> dict: + """Public API handler for creating license investigations""" + # Parse event parameters + compact = event['pathParameters']['compact'] + jurisdiction = event['pathParameters']['jurisdiction'] + provider_id = event['pathParameters']['providerId'] + license_type_abbr = event['pathParameters']['licenseType'].lower() + cognito_sub = event['requestContext']['authorizer']['claims']['sub'] + + investigation = _generate_investigation_for_record_type( + compact=compact, + jurisdiction=jurisdiction, + provider_id=provider_id, + license_type_abbr=license_type_abbr, + investigation_against_record_type=InvestigationAgainstEnum.LICENSE, + cognito_sub=cognito_sub + ) + logger.info('Processing investigation updates for license record') + config.data_client.create_investigation(investigation) + + # Publish license investigation event + config.event_bus_client.publish_investigation_event( + source='org.compactconnect.provider-data', + compact=investigation.compact, + provider_id=investigation.providerId, + jurisdiction=investigation.jurisdiction, + create_date=investigation.creationDate, + license_type_abbreviation=investigation.licenseTypeAbbreviation, + investigation_against=InvestigationAgainstEnum.LICENSE, + investigation_id=investigation.investigationId, + ) + + return {'message': 'OK'} + + +def handle_privilege_investigation_close(event: dict) -> dict: + """Handle closing investigation for a privilege record""" + # Parse event parameters + compact = event['pathParameters']['compact'] + jurisdiction = event['pathParameters']['jurisdiction'] + provider_id = event['pathParameters']['providerId'] + license_type_abbr = event['pathParameters']['licenseType'].lower() + investigation_id = event['pathParameters']['investigationId'] + cognito_sub = event['requestContext']['authorizer']['claims']['sub'] + investigation_patch_body = _load_investigation_patch_body(event) + + logger.info('Processing privilege investigation closure') + now = config.current_standard_datetime + + # Create encumbrance if provided + resulting_encumbrance_id = None + encumbrance_data = investigation_patch_body.get('encumbrance') + if encumbrance_data: + # Create the encumbrance the same way we do directly via the encumbrance endpoint + resulting_encumbrance_id = _create_privilege_encumbrance_internal( + compact=compact, + jurisdiction=jurisdiction, + provider_id=provider_id, + license_type_abbr=license_type_abbr, + submitting_user=cognito_sub, + adverse_action_post_body=encumbrance_data, + ) + + # Call the data client method to close the investigation + config.data_client.close_investigation( + compact=compact, + provider_id=provider_id, + jurisdiction=jurisdiction, + license_type_abbreviation=license_type_abbr, + investigation_id=investigation_id, + closing_user=cognito_sub, + close_date=now, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + resulting_encumbrance_id=resulting_encumbrance_id, + ) + + # Publish privilege investigation closure event + config.event_bus_client.publish_investigation_closed_event( + source='org.compactconnect.provider-data', + compact=compact, + provider_id=provider_id, + jurisdiction=jurisdiction, + license_type_abbreviation=license_type_abbr, + effective_date=now, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, + ) + + return {'message': 'OK'} + + +def handle_license_investigation_close(event: dict) -> dict: + """Handle closing investigation for a license record""" + # Parse event parameters + compact = event['pathParameters']['compact'] + jurisdiction = event['pathParameters']['jurisdiction'] + provider_id = event['pathParameters']['providerId'] + license_type_abbr = event['pathParameters']['licenseType'].lower() + investigation_id = event['pathParameters']['investigationId'] + cognito_sub = event['requestContext']['authorizer']['claims']['sub'] + investigation_patch_body = _load_investigation_patch_body(event) + + logger.info('Processing license investigation closure') + + now = config.current_standard_datetime + + # Create encumbrance if provided + resulting_encumbrance_id = None + encumbrance_data = investigation_patch_body.get('encumbrance') + if encumbrance_data: + # Create the encumbrance the same way we do directly via the encumbrance endpoint + resulting_encumbrance_id = _create_license_encumbrance_internal( + compact=compact, + jurisdiction=jurisdiction, + provider_id=provider_id, + license_type_abbr=license_type_abbr, + submitting_user=cognito_sub, + adverse_action_post_body=encumbrance_data, + ) + + + # Call the data client method to close the investigation + config.data_client.close_investigation( + compact=compact, + provider_id=provider_id, + jurisdiction=jurisdiction, + license_type_abbreviation=license_type_abbr, + investigation_id=investigation_id, + closing_user=cognito_sub, + close_date=now, + investigation_against=InvestigationAgainstEnum.LICENSE, + resulting_encumbrance_id=resulting_encumbrance_id, + ) + + # Publish license investigation closure event + config.event_bus_client.publish_investigation_closed_event( + source='org.compactconnect.provider-data', + compact=compact, + provider_id=provider_id, + jurisdiction=jurisdiction, + license_type_abbreviation=license_type_abbr, + effective_date=now, + investigation_against=InvestigationAgainstEnum.LICENSE, + ) + + return {'message': 'OK'} diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.txt b/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.txt index 4c01da874..e9c139a4b 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.txt @@ -1,29 +1,29 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/provider-data-v1/requirements-dev.in # -boto3==1.40.35 +boto3==1.40.51 # via moto -botocore==1.40.35 +botocore==1.40.51 # via # boto3 # moto # s3transfer -certifi==2025.8.3 +certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography charset-normalizer==3.4.3 # via requests -cryptography==46.0.1 +cryptography==46.0.2 # via moto docker==7.1.0 # via moto faker==28.4.1 # via -r lambdas/python/provider-data-v1/requirements-dev.in -idna==3.10 +idna==3.11 # via requests jinja2==3.1.6 # via moto @@ -31,11 +31,11 @@ jmespath==1.0.1 # via # boto3 # botocore -markupsafe==3.0.2 +markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.12 +moto[dynamodb,s3]==5.1.14 # via -r lambdas/python/provider-data-v1/requirements-dev.in py-partiql-parser==0.6.1 # via moto @@ -46,7 +46,7 @@ python-dateutil==2.9.0.post0 # botocore # faker # moto -pyyaml==6.0.2 +pyyaml==6.0.3 # via # moto # responses diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/requirements.txt b/backend/compact-connect/lambdas/python/provider-data-v1/requirements.txt index 15e52fd4e..4de1e6acd 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/requirements.txt +++ b/backend/compact-connect/lambdas/python/provider-data-v1/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/provider-data-v1/requirements.in diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py new file mode 100644 index 000000000..769fedffc --- /dev/null +++ b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py @@ -0,0 +1,847 @@ +import json +from datetime import datetime +from unittest.mock import patch + +from boto3.dynamodb.conditions import Key +from common_test.test_constants import ( + DEFAULT_AA_SUBMITTING_USER_ID, + DEFAULT_DATE_OF_UPDATE_TIMESTAMP, +) +from moto import mock_aws + +from .. import TstFunction + +PRIVILEGE_INVESTIGATION_ENDPOINT_RESOURCE = ( + '/v1/compacts/{compact}/providers/{providerId}/privileges/' + 'jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation' +) +LICENSE_INVESTIGATION_ENDPOINT_RESOURCE = ( + '/v1/compacts/{compact}/providers/{providerId}/licenses/' + 'jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation' +) +PRIVILEGE_INVESTIGATION_ID_ENDPOINT_RESOURCE = ( + '/v1/compacts/{compact}/providers/{providerId}/privileges/' + 'jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation/{investigationId}' +) +LICENSE_INVESTIGATION_ID_ENDPOINT_RESOURCE = ( + '/v1/compacts/{compact}/providers/{providerId}/licenses/' + 'jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation/{investigationId}' +) + +TEST_INVESTIGATION_START_DATE = '2023-01-15' +TEST_INVESTIGATION_CLOSE_DATE = '2023-02-15' +TEST_ENCUMBRANCE_EFFECTIVE_DATE = '2023-01-15' + + +def _generate_test_investigation_close_with_encumbrance_body(): + from cc_common.data_model.schema.common import ClinicalPrivilegeActionCategory, EncumbranceType + + return { + 'encumbrance': { + 'encumbranceEffectiveDate': TEST_ENCUMBRANCE_EFFECTIVE_DATE, + # These Enums are expected to be `str` type, so we'll directly access their .value + 'encumbranceType': EncumbranceType.SUSPENSION.value, + 'clinicalPrivilegeActionCategory': ClinicalPrivilegeActionCategory.UNSAFE_PRACTICE.value, + }, + } + + +@mock_aws +@patch('cc_common.config._Config.current_standard_datetime', datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP)) +class TestPostPrivilegeInvestigation(TstFunction): + """Test suite for privilege investigation endpoints.""" + + def _load_privilege_data(self): + """Load privilege test data from JSON file""" + import json + from decimal import Decimal + + # Load provider record first (needed for encumbrance creation) + with open('../common/tests/resources/dynamo/provider.json') as f: + provider_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=provider_record) + + # Load privilege record + with open('../common/tests/resources/dynamo/privilege.json') as f: + privilege_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=privilege_record) + + # Return the privilege data as a data class + from cc_common.data_model.schema.privilege import PrivilegeData + + return PrivilegeData.from_database_record(privilege_record) + + def _when_testing_privilege_investigation(self): + test_privilege_record = self._load_privilege_data() + + test_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_privilege_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'POST', + 'resource': PRIVILEGE_INVESTIGATION_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseType': test_privilege_record.licenseTypeAbbreviation, + }, + }, + ) + + # return both the test event and the test privilege record + return test_event, test_privilege_record + + def test_privilege_investigation_handler_returns_ok_message_with_valid_body(self): + from handlers.investigation import investigation_handler + + event = self._when_testing_privilege_investigation()[0] + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + response_body = json.loads(response['body']) + + self.assertEqual( + {'message': 'OK'}, + response_body, + ) + + def test_privilege_investigation_handler_adds_investigation_record_in_provider_data_table(self): + from handlers.investigation import investigation_handler + + event, test_privilege_record = self._when_testing_privilege_investigation() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + + # Verify that the investigation record was added to the provider data table + # Perform a query to list all investigations for the provider using the starts_with key condition + investigation_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#INVESTIGATION' + ), + ) + self.assertEqual(1, len(investigation_records['Items'])) + item = investigation_records['Items'][0] + + # Verify the investigation record fields + expected_investigation = { + 'type': 'investigation', + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseType': test_privilege_record.licenseType, + 'investigationAgainst': 'privilege', + 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, + 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'pk': test_privilege_record.serialize_to_database_record()['pk'], + 'sk': ( + f'{test_privilege_record.compact}#PROVIDER#privilege/' + f'{test_privilege_record.jurisdiction}/slp#INVESTIGATION#{item["investigationId"]}' + ), + 'investigationId': item['investigationId'], + } + self.assertEqual(expected_investigation, item) + + def test_privilege_investigation_handler_sets_provider_record_to_under_investigation_in_provider_data_table(self): + from cc_common.data_model.schema.common import InvestigationStatusEnum + from handlers.investigation import investigation_handler + + event, test_privilege_record = self._when_testing_privilege_investigation() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + + # Verify that the privilege record was updated to be under investigation + updated_privilege_record = self._provider_table.get_item( + Key={ + 'pk': test_privilege_record.serialize_to_database_record()['pk'], + 'sk': test_privilege_record.serialize_to_database_record()['sk'], + } + )['Item'] + + self.assertEqual( + InvestigationStatusEnum.UNDER_INVESTIGATION.value, updated_privilege_record['investigationStatus'] + ) + + def test_privilege_investigation_handler_returns_access_denied_if_compact_admin(self): + """Verifying that only state admins are allowed to create privilege investigations""" + from handlers.investigation import investigation_handler + + event, test_privilege_record = self._when_testing_privilege_investigation() + + event['requestContext']['authorizer']['claims']['scope'] = f'openid email {test_privilege_record.compact}/admin' + + response = investigation_handler(event, self.mock_context) + self.assertEqual(403, response['statusCode'], msg=json.loads(response['body'])) + response_body = json.loads(response['body']) + + self.assertEqual( + {'message': 'Access denied'}, + response_body, + ) + + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_privilege_investigation_handler_publishes_event(self, mock_publish_event): + """Test that privilege investigation handler publishes the correct event.""" + from handlers.investigation import investigation_handler + + event, test_privilege_record = self._when_testing_privilege_investigation() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Verify event was published with correct details + mock_publish_event.assert_called_once() + call_args = mock_publish_event.call_args[1] + + expected_event_args = { + 'source': 'org.compactconnect.provider-data', + 'detail_type': 'privilege.investigation', + 'event_batch_writer': None, + 'detail': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseTypeAbbreviation': test_privilege_record.licenseTypeAbbreviation, + 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationAgainst': 'privilege', + }, + } + self.assertEqual(expected_event_args, call_args) + + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_privilege_investigation_handler_handles_event_publishing_failure(self, mock_publish_event): + """Test that privilege investigation handler fails when event publishing fails.""" + from handlers.investigation import investigation_handler + + event, _ = self._when_testing_privilege_investigation() + mock_publish_event.side_effect = Exception('Event publishing failed') + + with self.assertRaises(Exception) as context: + investigation_handler(event, self.mock_context) + self.assertEqual('Event publishing failed', str(context.exception)) + + +@mock_aws +@patch('cc_common.config._Config.current_standard_datetime', datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP)) +class TestPostLicenseInvestigation(TstFunction): + """Test suite for license investigation endpoints.""" + + def _load_license_data(self): + """Load license test data from JSON file""" + import json + from decimal import Decimal + + # Load provider record first (needed for encumbrance creation) + with open('../common/tests/resources/dynamo/provider.json') as f: + provider_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=provider_record) + + # Load license record + with open('../common/tests/resources/dynamo/license.json') as f: + license_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=license_record) + + # Return the license data as a data class + from cc_common.data_model.schema.license import LicenseData + + return LicenseData.from_database_record(license_record) + + def _when_testing_valid_license_investigation(self, body_overrides: dict | None = None): + test_license_record = self._load_license_data() + test_body = {} + if body_overrides: + test_body.update(body_overrides) + + test_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_license_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'POST', + 'resource': LICENSE_INVESTIGATION_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseType': test_license_record.licenseTypeAbbreviation, + }, + 'body': json.dumps(test_body), + }, + ) + + # return both the event and test license record + return test_event, test_license_record + + def test_license_investigation_handler_returns_ok_message_with_valid_body(self): + from handlers.investigation import investigation_handler + + event = self._when_testing_valid_license_investigation()[0] + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + response_body = json.loads(response['body']) + + self.assertEqual( + {'message': 'OK'}, + response_body, + ) + + def test_license_investigation_handler_adds_investigation_record_in_provider_data_table(self): + from handlers.investigation import investigation_handler + + event, test_license_record = self._when_testing_valid_license_investigation() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + + # Verify that the investigation record was added to the provider data table + # Perform a query to list all investigations for the provider using the starts_with key condition + investigation_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#INVESTIGATION' + ), + ) + self.assertEqual(1, len(investigation_records['Items'])) + item = investigation_records['Items'][0] + + # Verify the investigation record fields + expected_investigation = { + 'type': 'investigation', + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseType': test_license_record.licenseType, + 'investigationAgainst': 'license', + 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, + 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'pk': test_license_record.serialize_to_database_record()['pk'], + 'sk': ( + f'{test_license_record.compact}#PROVIDER#license/' + f'{test_license_record.jurisdiction}/slp#INVESTIGATION#{item["investigationId"]}' + ), + 'investigationId': item['investigationId'], + } + self.assertEqual(expected_investigation, item) + + def test_license_investigation_handler_sets_provider_record_to_under_investigation_in_provider_data_table(self): + from cc_common.data_model.schema.common import InvestigationStatusEnum + from handlers.investigation import investigation_handler + + event, test_license_record = self._when_testing_valid_license_investigation() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + + # Verify that the license record was updated to be under investigation + updated_license_record = self._provider_table.get_item( + Key={ + 'pk': test_license_record.serialize_to_database_record()['pk'], + 'sk': test_license_record.serialize_to_database_record()['sk'], + } + )['Item'] + + self.assertEqual( + InvestigationStatusEnum.UNDER_INVESTIGATION.value, updated_license_record['investigationStatus'] + ) + + def test_license_investigation_handler_returns_access_denied_if_compact_admin(self): + """Verifying that only state admins are allowed to create license investigations""" + from handlers.investigation import investigation_handler + + event, test_license_record = self._when_testing_valid_license_investigation() + + event['requestContext']['authorizer']['claims']['scope'] = f'openid email {test_license_record.compact}/admin' + + response = investigation_handler(event, self.mock_context) + self.assertEqual(403, response['statusCode'], msg=json.loads(response['body'])) + response_body = json.loads(response['body']) + + self.assertEqual( + {'message': 'Access denied'}, + response_body, + ) + + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_license_investigation_handler_publishes_event(self, mock_publish_event): + """Test that license investigation handler publishes the correct event.""" + from handlers.investigation import investigation_handler + + event, test_license_record = self._when_testing_valid_license_investigation() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Verify event was published with correct details + mock_publish_event.assert_called_once() + call_args = mock_publish_event.call_args[1] + + expected_event_args = { + 'source': 'org.compactconnect.provider-data', + 'detail_type': 'license.investigation', + 'event_batch_writer': None, + 'detail': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseTypeAbbreviation': test_license_record.licenseTypeAbbreviation, + 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationAgainst': 'license', + 'investigationId': call_args['detail']['investigationId'], + }, + } + self.assertEqual(expected_event_args, call_args) + + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_license_investigation_handler_handles_event_publishing_failure(self, mock_publish_event): + """Test that license investigation handler fails when event publishing fails.""" + from handlers.investigation import investigation_handler + + event, _ = self._when_testing_valid_license_investigation() + mock_publish_event.side_effect = Exception('Event publishing failed') + + with self.assertRaises(Exception) as context: + investigation_handler(event, self.mock_context) + self.assertEqual('Event publishing failed', str(context.exception)) + + +@mock_aws +@patch('cc_common.config._Config.current_standard_datetime', datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP)) +class TestPatchPrivilegeInvestigationClose(TstFunction): + """Test suite for privilege investigation close endpoints.""" + + def _load_privilege_data(self): + """Load privilege test data from JSON file""" + import json + from decimal import Decimal + + # Load provider record first (needed for encumbrance creation) + with open('../common/tests/resources/dynamo/provider.json') as f: + provider_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=provider_record) + + # Load privilege record + with open('../common/tests/resources/dynamo/privilege.json') as f: + privilege_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=privilege_record) + + # Return the privilege data as a data class + from cc_common.data_model.schema.privilege import PrivilegeData + + return PrivilegeData.from_database_record(privilege_record) + + def _when_testing_privilege_investigation_close(self, body_overrides: dict | None = None): + test_privilege_record = self._load_privilege_data() + test_body = {} + if body_overrides: + test_body.update(body_overrides) + + # First create an investigation + create_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_privilege_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'POST', + 'resource': PRIVILEGE_INVESTIGATION_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseType': test_privilege_record.licenseTypeAbbreviation, + }, + }, + ) + + from handlers.investigation import investigation_handler + + investigation_handler(create_event, self.mock_context) + + # Get the investigation ID from the database + investigation_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#INVESTIGATION' + ), + ) + investigation_id = investigation_records['Items'][0]['investigationId'] + + # Now create the close event + test_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_privilege_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'PATCH', + 'resource': PRIVILEGE_INVESTIGATION_ID_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseType': test_privilege_record.licenseTypeAbbreviation, + 'investigationId': investigation_id, + }, + 'body': json.dumps(test_body), + }, + ) + + return test_event, test_privilege_record, investigation_id + + def test_privilege_investigation_close_handler_returns_ok_message_with_valid_body(self): + from handlers.investigation import investigation_handler + + event = self._when_testing_privilege_investigation_close()[0] + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + response_body = json.loads(response['body']) + + self.assertEqual( + {'message': 'OK'}, + response_body, + ) + + def test_privilege_investigation_close_handler_updates_investigation_record(self): + from handlers.investigation import investigation_handler + + event, test_privilege_record, investigation_id = self._when_testing_privilege_investigation_close() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + + # Verify that the investigation record was updated + investigation_record = self._provider_table.get_item( + Key={ + 'pk': test_privilege_record.serialize_to_database_record()['pk'], + 'sk': ( + f'{test_privilege_record.compact}#PROVIDER#privilege/' + f'{test_privilege_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' + ), + } + )['Item'] + + expected_investigation = { + 'pk': test_privilege_record.serialize_to_database_record()['pk'], + 'sk': ( + f'{test_privilege_record.compact}#PROVIDER#privilege/' + f'{test_privilege_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' + ), + 'type': 'investigation', + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseType': test_privilege_record.licenseType, + 'investigationAgainst': 'privilege', + 'investigationId': investigation_id, + 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, + 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'closeDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'closingUser': DEFAULT_AA_SUBMITTING_USER_ID, + 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + } + + self.assertEqual(expected_investigation, investigation_record) + + def test_privilege_investigation_close_handler_removes_investigation_status_from_privilege(self): + from handlers.investigation import investigation_handler + + event, test_privilege_record, investigation_id = self._when_testing_privilege_investigation_close() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + + # Verify that the privilege record no longer has investigation status + updated_privilege_record = self._provider_table.get_item( + Key={ + 'pk': test_privilege_record.serialize_to_database_record()['pk'], + 'sk': test_privilege_record.serialize_to_database_record()['sk'], + } + )['Item'] + + self.assertNotIn('investigationStatus', updated_privilege_record) + + def test_privilege_investigation_close_with_encumbrance_creates_encumbrance(self): + from handlers.investigation import investigation_handler + + event, test_privilege_record, investigation_id = self._when_testing_privilege_investigation_close( + body_overrides=_generate_test_investigation_close_with_encumbrance_body() + ) + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + + # Verify that an encumbrance was created + encumbrance_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#ADVERSE_ACTION' + ), + ) + self.assertEqual(1, len(encumbrance_records['Items'])) + + # Verify that the investigation record has the resulting encumbrance ID + investigation_record = self._provider_table.get_item( + Key={ + 'pk': test_privilege_record.serialize_to_database_record()['pk'], + 'sk': ( + f'{test_privilege_record.compact}#PROVIDER#privilege/' + f'{test_privilege_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' + ), + } + )['Item'] + + self.assertIn('resultingEncumbranceId', investigation_record) + + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_privilege_investigation_close_handler_publishes_event(self, mock_publish_event): + """Test that privilege investigation close handler publishes the correct event.""" + from handlers.investigation import investigation_handler + + event, test_privilege_record, investigation_id = self._when_testing_privilege_investigation_close() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Verify event was published with correct details (should be called twice: creation + closure) + self.assertEqual(2, mock_publish_event.call_count) + call_args = mock_publish_event.call_args[1] + + expected_event_args = { + 'source': 'org.compactconnect.provider-data', + 'detail_type': 'privilege.investigationClosed', + 'event_batch_writer': None, + 'detail': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseTypeAbbreviation': test_privilege_record.licenseTypeAbbreviation, + 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationAgainst': 'privilege', + 'effectiveDate': '2024-11-08', # Date portion of DEFAULT_DATE_OF_UPDATE_TIMESTAMP + }, + } + self.assertEqual(expected_event_args, call_args) + + +@mock_aws +@patch('cc_common.config._Config.current_standard_datetime', datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP)) +class TestPatchLicenseInvestigationClose(TstFunction): + """Test suite for license investigation close endpoints.""" + + def _load_license_data(self): + """Load license test data from JSON file""" + import json + from decimal import Decimal + + # Load provider record first (needed for encumbrance creation) + with open('../common/tests/resources/dynamo/provider.json') as f: + provider_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=provider_record) + + # Load license record + with open('../common/tests/resources/dynamo/license.json') as f: + license_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=license_record) + + # Return the license data as a data class + from cc_common.data_model.schema.license import LicenseData + + return LicenseData.from_database_record(license_record) + + def _when_testing_license_investigation_close(self, body_overrides: dict | None = None): + test_license_record = self._load_license_data() + test_body = {} + if body_overrides: + test_body.update(body_overrides) + + # First create an investigation + create_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_license_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'POST', + 'resource': LICENSE_INVESTIGATION_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseType': test_license_record.licenseTypeAbbreviation, + }, + }, + ) + + from handlers.investigation import investigation_handler + + investigation_handler(create_event, self.mock_context) + + # Get the investigation ID from the database + investigation_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#INVESTIGATION' + ), + ) + investigation_id = investigation_records['Items'][0]['investigationId'] + + # Now create the close event + test_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_license_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'PATCH', + 'resource': LICENSE_INVESTIGATION_ID_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseType': test_license_record.licenseTypeAbbreviation, + 'investigationId': investigation_id, + }, + 'body': json.dumps(test_body), + }, + ) + + return test_event, test_license_record, investigation_id + + def test_license_investigation_close_handler_returns_ok_message_with_valid_body(self): + from handlers.investigation import investigation_handler + + event = self._when_testing_license_investigation_close()[0] + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + response_body = json.loads(response['body']) + + self.assertEqual( + {'message': 'OK'}, + response_body, + ) + + def test_license_investigation_close_handler_updates_investigation_record(self): + from handlers.investigation import investigation_handler + + event, test_license_record, investigation_id = self._when_testing_license_investigation_close() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + + # Verify that the investigation record was updated + investigation_record = self._provider_table.get_item( + Key={ + 'pk': test_license_record.serialize_to_database_record()['pk'], + 'sk': ( + f'{test_license_record.compact}#PROVIDER#license/' + f'{test_license_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' + ), + } + )['Item'] + + expected_investigation = { + 'pk': test_license_record.serialize_to_database_record()['pk'], + 'sk': ( + f'{test_license_record.compact}#PROVIDER#license/' + f'{test_license_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' + ), + 'type': 'investigation', + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseType': test_license_record.licenseType, + 'investigationAgainst': 'license', + 'investigationId': investigation_id, + 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, + 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'closeDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'closingUser': DEFAULT_AA_SUBMITTING_USER_ID, + 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + } + + self.assertEqual(expected_investigation, investigation_record) + + def test_license_investigation_close_handler_removes_investigation_status_from_license(self): + from handlers.investigation import investigation_handler + + event, test_license_record, investigation_id = self._when_testing_license_investigation_close() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + + # Verify that the license record no longer has investigation status + updated_license_record = self._provider_table.get_item( + Key={ + 'pk': test_license_record.serialize_to_database_record()['pk'], + 'sk': test_license_record.serialize_to_database_record()['sk'], + } + )['Item'] + + self.assertNotIn('investigationStatus', updated_license_record) + + def test_license_investigation_close_with_encumbrance_creates_encumbrance(self): + from handlers.investigation import investigation_handler + + event, test_license_record, investigation_id = self._when_testing_license_investigation_close( + body_overrides=_generate_test_investigation_close_with_encumbrance_body() + ) + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) + + # Verify that an encumbrance was created + encumbrance_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#ADVERSE_ACTION' + ), + ) + self.assertEqual(1, len(encumbrance_records['Items'])) + + # Verify that the investigation record has the resulting encumbrance ID + investigation_record = self._provider_table.get_item( + Key={ + 'pk': test_license_record.serialize_to_database_record()['pk'], + 'sk': ( + f'{test_license_record.compact}#PROVIDER#license/' + f'{test_license_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' + ), + } + )['Item'] + + self.assertIn('resultingEncumbranceId', investigation_record) + + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_license_investigation_close_handler_publishes_event(self, mock_publish_event): + """Test that license investigation close handler publishes the correct event.""" + from handlers.investigation import investigation_handler + + event, test_license_record, investigation_id = self._when_testing_license_investigation_close() + + response = investigation_handler(event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Verify event was published with correct details (should be called twice: creation + closure) + self.assertEqual(2, mock_publish_event.call_count) + call_args = mock_publish_event.call_args[1] + + expected_event_args = { + 'source': 'org.compactconnect.provider-data', + 'detail_type': 'license.investigationClosed', + 'event_batch_writer': None, + 'detail': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseTypeAbbreviation': test_license_record.licenseTypeAbbreviation, + 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationAgainst': 'license', + 'effectiveDate': '2024-11-08', # Date portion of DEFAULT_DATE_OF_UPDATE_TIMESTAMP + }, + } + self.assertEqual(expected_event_args, call_args) From fdbc0ece45cecba91579965d06563000f8cbd7af Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Thu, 16 Oct 2025 15:17:00 -0600 Subject: [PATCH 03/33] WIP: add investigations API definitions --- backend/compact-connect/requirements-dev.txt | 22 +- backend/compact-connect/requirements.txt | 16 +- .../stacks/api_lambda_stack/__init__.py | 10 + .../api_lambda_stack/provider_management.py | 65 +++ .../stacks/api_stack/v1_api/api.py | 1 + .../stacks/api_stack/v1_api/api_model.py | 97 ++-- .../api_stack/v1_api/provider_management.py | 104 ++++ .../app/test_api/test_investigation_api.py | 459 ++++++++++++++++ ..._LICENSE_INVESTIGATION_REQUEST_SCHEMA.json | 49 ++ ...RIVILEGE_INVESTIGATION_REQUEST_SCHEMA.json | 49 ++ .../tests/smoke/investigation_smoke_tests.py | 496 ++++++++++++++++++ 11 files changed, 1313 insertions(+), 55 deletions(-) create mode 100644 backend/compact-connect/stacks/api_lambda_stack/provider_management.py create mode 100644 backend/compact-connect/tests/app/test_api/test_investigation_api.py create mode 100644 backend/compact-connect/tests/resources/snapshots/PATCH_LICENSE_INVESTIGATION_REQUEST_SCHEMA.json create mode 100644 backend/compact-connect/tests/resources/snapshots/PATCH_PRIVILEGE_INVESTIGATION_REQUEST_SCHEMA.json create mode 100644 backend/compact-connect/tests/smoke/investigation_smoke_tests.py diff --git a/backend/compact-connect/requirements-dev.txt b/backend/compact-connect/requirements-dev.txt index 82a9ca638..78e2641c3 100644 --- a/backend/compact-connect/requirements-dev.txt +++ b/backend/compact-connect/requirements-dev.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None requirements-dev.in @@ -12,13 +12,13 @@ cachecontrol[filecache]==0.14.3 # via # cachecontrol # pip-audit -certifi==2025.8.3 +certifi==2025.10.5 # via requests charset-normalizer==3.4.3 # via requests click==8.3.0 # via pip-tools -coverage[toml]==7.10.6 +coverage[toml]==7.10.7 # via # -r requirements-dev.in # pytest-cov @@ -28,9 +28,9 @@ defusedxml==0.7.1 # via py-serializable faker==28.4.1 # via -r requirements-dev.in -filelock==3.19.1 +filelock==3.20.0 # via cachecontrol -idna==3.10 +idna==3.11 # via requests iniconfig==2.1.0 # via pytest @@ -40,7 +40,7 @@ markdown-it-py==4.0.0 # via rich mdurl==0.1.2 # via markdown-it-py -msgpack==1.1.1 +msgpack==1.1.2 # via cachecontrol packageurl-python==0.17.5 # via cyclonedx-python-lib @@ -56,9 +56,9 @@ pip-audit==2.9.0 # via -r requirements-dev.in pip-requirements-parser==32.0.1 # via pip-audit -pip-tools==7.5.0 +pip-tools==7.5.1 # via -r requirements-dev.in -platformdirs==4.4.0 +platformdirs==4.5.0 # via pip-audit pluggy==1.6.0 # via @@ -70,7 +70,7 @@ pygments==2.19.2 # via # pytest # rich -pyparsing==3.2.4 +pyparsing==3.2.5 # via pip-requirements-parser pyproject-hooks==1.2.0 # via @@ -88,9 +88,9 @@ requests==2.32.5 # via # cachecontrol # pip-audit -rich==14.1.0 +rich==14.2.0 # via pip-audit -ruff==0.13.1 +ruff==0.14.0 # via -r requirements-dev.in six==1.17.0 # via python-dateutil diff --git a/backend/compact-connect/requirements.txt b/backend/compact-connect/requirements.txt index 97e6c37ff..0cd0e097f 100644 --- a/backend/compact-connect/requirements.txt +++ b/backend/compact-connect/requirements.txt @@ -1,10 +1,10 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None requirements.in # -attrs==25.3.0 +attrs==25.4.0 # via # cattrs # jsii @@ -12,18 +12,18 @@ aws-cdk-asset-awscli-v1==2.2.242 # via aws-cdk-lib aws-cdk-asset-node-proxy-agent-v6==2.1.0 # via aws-cdk-lib -aws-cdk-aws-lambda-python-alpha==2.215.0a0 +aws-cdk-aws-lambda-python-alpha==2.219.0a0 # via -r requirements.in -aws-cdk-cloud-assembly-schema==48.10.0 +aws-cdk-cloud-assembly-schema==48.14.0 # via aws-cdk-lib -aws-cdk-lib==2.215.0 +aws-cdk-lib==2.219.0 # via # -r requirements.in # aws-cdk-aws-lambda-python-alpha # cdk-nag cattrs==25.2.0 # via jsii -cdk-nag==2.37.31 +cdk-nag==2.37.51 # via -r requirements.in constructs==10.4.2 # via @@ -33,7 +33,7 @@ constructs==10.4.2 # cdk-nag importlib-resources==6.5.2 # via jsii -jsii==1.114.1 +jsii==1.115.0 # via # aws-cdk-asset-awscli-v1 # aws-cdk-asset-node-proxy-agent-v6 @@ -54,7 +54,7 @@ publication==0.0.3 # jsii python-dateutil==2.9.0.post0 # via jsii -pyyaml==6.0.2 +pyyaml==6.0.3 # via -r requirements.in six==1.17.0 # via python-dateutil diff --git a/backend/compact-connect/stacks/api_lambda_stack/__init__.py b/backend/compact-connect/stacks/api_lambda_stack/__init__.py index 7220e8dcb..387a0abf5 100644 --- a/backend/compact-connect/stacks/api_lambda_stack/__init__.py +++ b/backend/compact-connect/stacks/api_lambda_stack/__init__.py @@ -3,10 +3,12 @@ from common_constructs.stack import AppStack from constructs import Construct +from common_constructs.ssm_parameter_utility import SSMParameterUtility from stacks import persistent_stack as ps from stacks.provider_users import ProviderUsersStack from .feature_flags import FeatureFlagsLambdas +from .provider_management import ProviderManagementLambdas from .provider_users import ProviderUsersLambdas @@ -47,3 +49,11 @@ def __init__( persistent_stack=persistent_stack, provider_users_stack=provider_users_stack, ) + + # Provider Management related API lambdas + data_event_bus = SSMParameterUtility.load_data_event_bus_from_ssm_parameter(self) + self.provider_management_lambdas = ProviderManagementLambdas( + scope=self, + persistent_stack=persistent_stack, + data_event_bus=data_event_bus, + ) diff --git a/backend/compact-connect/stacks/api_lambda_stack/provider_management.py b/backend/compact-connect/stacks/api_lambda_stack/provider_management.py new file mode 100644 index 000000000..c825eb379 --- /dev/null +++ b/backend/compact-connect/stacks/api_lambda_stack/provider_management.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +import os + +from aws_cdk.aws_events import EventBus +from cdk_nag import NagSuppressions +from common_constructs.stack import Stack + +from common_constructs.python_function import PythonFunction +from stacks import persistent_stack as ps + + +class ProviderManagementLambdas: + def __init__( + self, + *, + scope: Stack, + persistent_stack: ps.PersistentStack, + data_event_bus: EventBus, + ) -> None: + self.scope = scope + self.persistent_stack = persistent_stack + self.data_event_bus = data_event_bus + + self.stack: Stack = Stack.of(scope) + lambda_environment = { + 'PROVIDER_TABLE_NAME': persistent_stack.provider_table.table_name, + 'STAFF_USERS_TABLE_NAME': persistent_stack.staff_users.user_table.table_name, + 'DATA_EVENT_BUS_NAME': data_event_bus.event_bus_name, + **self.stack.common_env_vars, + } + + self.provider_investigation_handler = self._create_provider_investigation_handler(lambda_environment) + + def _create_provider_investigation_handler(self, lambda_environment: dict) -> PythonFunction: + """Create and configure the Lambda handler for investigating a provider's privilege or license.""" + investigation_handler = PythonFunction( + self.scope, + 'ProviderInvestigationHandler', + description='Provider investigation handler', + lambda_dir='provider-data-v1', + index=os.path.join('handlers', 'investigation.py'), + handler='investigation_handler', + environment=lambda_environment, + alarm_topic=self.persistent_stack.alarm_topic, + ) + + # Grant necessary permissions + self.persistent_stack.provider_table.grant_read_write_data(investigation_handler) + self.persistent_stack.staff_users.user_table.grant_read_data(investigation_handler) + self.data_event_bus.grant_put_events_to(investigation_handler) + + NagSuppressions.add_resource_suppressions_by_path( + self.stack, + path=f'{investigation_handler.node.path}/ServiceRole/DefaultPolicy/Resource', + suppressions=[ + { + 'id': 'AwsSolutions-IAM5', + 'reason': 'The actions in this policy are specifically what this lambda needs to read/write ' + 'and is scoped to the needed tables and event bus.', + }, + ], + ) + + return investigation_handler diff --git a/backend/compact-connect/stacks/api_stack/v1_api/api.py b/backend/compact-connect/stacks/api_stack/v1_api/api.py index 3d40fdfd6..64471031d 100644 --- a/backend/compact-connect/stacks/api_stack/v1_api/api.py +++ b/backend/compact-connect/stacks/api_stack/v1_api/api.py @@ -206,6 +206,7 @@ def __init__( api_model=self.api_model, data_event_bus=data_event_bus, privilege_history_function=self.privilege_history_function, + api_lambda_stack=api_lambda_stack, ) # GET /v1/compacts/{compact}/jurisdictions self.jurisdictions_resource = self.compact_resource.add_resource('jurisdictions') diff --git a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py index 792b7b00d..16e4f9b81 100644 --- a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py +++ b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py @@ -411,24 +411,7 @@ def post_privilege_encumbrance_request_model(self) -> Model: self.api._v1_post_privilege_encumbrance_request_model = self.api.add_model( 'V1PostPrivilegeEncumbranceRequestModel', description='Post privilege encumbrance request model', - schema=JsonSchema( - type=JsonSchemaType.OBJECT, - additional_properties=False, - required=['encumbranceEffectiveDate', 'encumbranceType', 'clinicalPrivilegeActionCategory'], - properties={ - 'encumbranceEffectiveDate': JsonSchema( - type=JsonSchemaType.STRING, - description='The effective date of the encumbrance', - format='date', - pattern=cc_api.YMD_FORMAT, - ), - 'encumbranceType': self._encumbrance_type_schema, - 'clinicalPrivilegeActionCategory': JsonSchema( - type=JsonSchemaType.STRING, - description='The category of clinical privilege action', - ), - }, - ), + schema=self._encumbrance_request_schema, ) return self.api._v1_post_privilege_encumbrance_request_model @@ -441,24 +424,7 @@ def post_license_encumbrance_request_model(self) -> Model: self.api._v1_post_license_encumbrance_request_model = self.api.add_model( 'V1PostLicenseEncumbranceRequestModel', description='Post license encumbrance request model', - schema=JsonSchema( - type=JsonSchemaType.OBJECT, - additional_properties=False, - required=['encumbranceEffectiveDate', 'encumbranceType', 'clinicalPrivilegeActionCategory'], - properties={ - 'encumbranceEffectiveDate': JsonSchema( - type=JsonSchemaType.STRING, - description='The effective date of the encumbrance', - format='date', - pattern=cc_api.YMD_FORMAT, - ), - 'encumbranceType': self._encumbrance_type_schema, - 'clinicalPrivilegeActionCategory': JsonSchema( - type=JsonSchemaType.STRING, - description='The category of clinical privilege action', - ), - }, - ), + schema=self._encumbrance_request_schema, ) return self.api._v1_post_license_encumbrance_request_model @@ -1419,6 +1385,29 @@ def _update_type_schema(self) -> JsonSchema: ], ) + @property + def _encumbrance_request_schema(self) -> JsonSchema: + """Common schema for encumbrance request data used in both POST and PATCH investigation endpoints""" + return JsonSchema( + type=JsonSchemaType.OBJECT, + description='Encumbrance data to create', + additional_properties=False, + required=['encumbranceEffectiveDate', 'encumbranceType', 'clinicalPrivilegeActionCategory'], + properties={ + 'encumbranceEffectiveDate': JsonSchema( + type=JsonSchemaType.STRING, + description='The effective date of the encumbrance', + format='date', + pattern=cc_api.YMD_FORMAT, + ), + 'encumbranceType': self._encumbrance_type_schema, + 'clinicalPrivilegeActionCategory': JsonSchema( + type=JsonSchemaType.STRING, + description='The category of clinical privilege action', + ), + }, + ) + @property def _encumbrance_type_schema(self) -> JsonSchema: """Common schema for encumbrance type field""" @@ -2761,3 +2750,39 @@ def check_feature_flag_response_model(self) -> Model: ), ) return self.api._v1_check_feature_flag_response_model + + @property + def patch_privilege_investigation_request_model(self) -> Model: + """PATCH privilege investigation request model""" + if not hasattr(self.api, '_v1_patch_privilege_investigation_request_model'): + self.api._v1_patch_privilege_investigation_request_model = Model( + self.api, + 'V1PatchPrivilegeInvestigationRequestModel', + rest_api=self.api, + description='Patch privilege investigation request model', + schema=JsonSchema( + type=JsonSchemaType.OBJECT, + properties={ + 'encumbrance': self._encumbrance_request_schema, + }, + ), + ) + return self.api._v1_patch_privilege_investigation_request_model + + @property + def patch_license_investigation_request_model(self) -> Model: + """PATCH license investigation request model""" + if not hasattr(self.api, '_v1_patch_license_investigation_request_model'): + self.api._v1_patch_license_investigation_request_model = Model( + self.api, + 'V1PatchLicenseInvestigationRequestModel', + rest_api=self.api, + description='Patch license investigation request model', + schema=JsonSchema( + type=JsonSchemaType.OBJECT, + properties={ + 'encumbrance': self._encumbrance_request_schema, + }, + ), + ) + return self.api._v1_patch_license_investigation_request_model diff --git a/backend/compact-connect/stacks/api_stack/v1_api/provider_management.py b/backend/compact-connect/stacks/api_stack/v1_api/provider_management.py index f119a4447..410637aa3 100644 --- a/backend/compact-connect/stacks/api_stack/v1_api/provider_management.py +++ b/backend/compact-connect/stacks/api_stack/v1_api/provider_management.py @@ -23,6 +23,7 @@ from common_constructs.nodejs_function import NodejsFunction from common_constructs.python_function import PythonFunction from stacks import persistent_stack as ps +from stacks.api_lambda_stack import ApiLambdaStack from stacks.persistent_stack import ProviderTable, ProviderUsersBucket, RateLimitingTable, SSNTable, StaffUsers from .api_model import ApiModel @@ -44,6 +45,7 @@ def __init__( data_event_bus: EventBus, api_model: ApiModel, privilege_history_function: PythonFunction, + api_lambda_stack: ApiLambdaStack, ): super().__init__() @@ -127,6 +129,16 @@ def __init__( self._add_encumber_license(method_options=admin_method_options) + self._add_investigation_privilege( + method_options=admin_method_options, + investigation_handler=api_lambda_stack.provider_management_lambdas.provider_investigation_handler, + ) + + self._add_investigation_license( + method_options=admin_method_options, + investigation_handler=api_lambda_stack.provider_management_lambdas.provider_investigation_handler, + ) + self._add_get_privilege_history( method_options=method_options, privilege_history_function=privilege_history_function, @@ -699,6 +711,98 @@ def _add_encumber_license( authorization_scopes=method_options.authorization_scopes, ) + def _add_investigation_privilege( + self, + method_options: MethodOptions, + investigation_handler: PythonFunction, + ): + """Add POST /providers/{providerId}/privileges/jurisdiction/{jurisdiction} + /licenseType/{licenseType}/investigation endpoint.""" + self.investigation_privilege_resource = self.privilege_jurisdiction_license_type_resource.add_resource( + 'investigation' + ) + self.investigation_privilege_resource.add_method( + 'POST', + request_validator=self.api.parameter_only_validator, + method_responses=[ + MethodResponse( + status_code='200', + response_models={'application/json': self.api_model.message_response_model}, + ), + ], + integration=LambdaIntegration(investigation_handler, timeout=Duration.seconds(29)), + request_parameters={'method.request.header.Authorization': True}, + authorization_type=method_options.authorization_type, + authorizer=method_options.authorizer, + authorization_scopes=method_options.authorization_scopes, + ) + + # Add PATCH method for closing privilege investigations - now with investigationId in path + self.investigation_privilege_id_resource = self.investigation_privilege_resource.add_resource( + '{investigationId}' + ) + self.investigation_privilege_id_resource.add_method( + 'PATCH', + request_validator=self.api.parameter_body_validator, + request_models={'application/json': self.api_model.patch_privilege_investigation_request_model}, + method_responses=[ + MethodResponse( + status_code='200', + response_models={'application/json': self.api_model.message_response_model}, + ), + ], + integration=LambdaIntegration(investigation_handler, timeout=Duration.seconds(29)), + request_parameters={'method.request.header.Authorization': True}, + authorization_type=method_options.authorization_type, + authorizer=method_options.authorizer, + authorization_scopes=method_options.authorization_scopes, + ) + + def _add_investigation_license( + self, + method_options: MethodOptions, + investigation_handler: PythonFunction, + ): + """Add POST /providers/{providerId}/licenses/jurisdiction/{jurisdiction} + /licenseType/{licenseType}/investigation endpoint.""" + self.investigation_license_resource = self.license_jurisdiction_license_type_resource.add_resource( + 'investigation' + ) + self.investigation_license_resource.add_method( + 'POST', + request_validator=self.api.parameter_only_validator, + method_responses=[ + MethodResponse( + status_code='200', + response_models={'application/json': self.api_model.message_response_model}, + ), + ], + integration=LambdaIntegration(investigation_handler, timeout=Duration.seconds(29)), + request_parameters={'method.request.header.Authorization': True}, + authorization_type=method_options.authorization_type, + authorizer=method_options.authorizer, + authorization_scopes=method_options.authorization_scopes, + ) + + # Add PATCH method for closing license investigations - now with investigationId in path + self.investigation_license_id_resource = self.investigation_license_resource.add_resource('{investigationId}') + self.investigation_license_id_resource.add_method( + 'PATCH', + request_validator=self.api.parameter_body_validator, + request_models={'application/json': self.api_model.patch_license_investigation_request_model}, + method_responses=[ + MethodResponse( + status_code='200', + response_models={'application/json': self.api_model.message_response_model}, + ), + ], + integration=LambdaIntegration(investigation_handler, timeout=Duration.seconds(29)), + request_parameters={'method.request.header.Authorization': True}, + authorization_type=method_options.authorization_type, + authorizer=method_options.authorizer, + authorization_scopes=method_options.authorization_scopes, + ) + def _add_get_privilege_history( self, method_options: MethodOptions, diff --git a/backend/compact-connect/tests/app/test_api/test_investigation_api.py b/backend/compact-connect/tests/app/test_api/test_investigation_api.py new file mode 100644 index 000000000..432de0575 --- /dev/null +++ b/backend/compact-connect/tests/app/test_api/test_investigation_api.py @@ -0,0 +1,459 @@ +from aws_cdk.assertions import Capture, Template +from aws_cdk.aws_apigateway import CfnMethod, CfnModel, CfnResource +from aws_cdk.aws_lambda import CfnFunction + +from tests.app.test_api import TestApi + + +class TestInvestigationApi(TestApi): + """ + These tests are focused on checking that the API endpoints for investigation functionality + are configured correctly. + + When adding or modifying API resources under /investigation/, a test should be added to ensure that the + resource is created as expected. The pattern for these tests includes the following checks: + 1. The path and parent id of the API Gateway resource matches expected values. + 2. If the resource has a lambda function associated with it, the function is present with the expected + module and function. + 3. Check the methods associated with the resource, ensuring they are all present and have the correct handlers. + 4. Ensure the request and response models for the endpoint are present and match the expected schemas. + """ + + def _get_privilege_investigation_resource_id(self, api_stack_template, api_stack): + """Helper method to get the privilege investigation resource ID by traversing the resource hierarchy.""" + license_type_param_logical_id = self._get_privilege_license_type_param_resource_id( + api_stack_template, api_stack + ) + + investigation_resource_logical_ids = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': license_type_param_logical_id}, + 'PathPart': 'investigation', + } + }, + ) + self.assertEqual(len(investigation_resource_logical_ids), 1) + return next(key for key in investigation_resource_logical_ids.keys()) + + def _get_privilege_investigation_id_resource_id(self, api_stack_template, api_stack): + """Helper method to get the privilege investigation {investigationId} resource ID.""" + investigation_resource_logical_id = self._get_privilege_investigation_resource_id(api_stack_template, api_stack) + + investigation_id_resource_logical_ids = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': investigation_resource_logical_id}, + 'PathPart': '{investigationId}', + } + }, + ) + self.assertEqual(len(investigation_id_resource_logical_ids), 1) + return next(key for key in investigation_id_resource_logical_ids.keys()) + + def _get_license_investigation_resource_id(self, api_stack_template, api_stack): + """Helper method to get the license investigation resource ID by traversing the resource hierarchy.""" + license_type_param_logical_id = self._get_license_license_type_param_resource_id(api_stack_template, api_stack) + + investigation_resource_logical_ids = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': license_type_param_logical_id}, + 'PathPart': 'investigation', + } + }, + ) + self.assertEqual(len(investigation_resource_logical_ids), 1) + return next(key for key in investigation_resource_logical_ids.keys()) + + def _get_license_investigation_id_resource_id(self, api_stack_template, api_stack): + """Helper method to get the license investigation {investigationId} resource ID.""" + investigation_resource_logical_id = self._get_license_investigation_resource_id(api_stack_template, api_stack) + + investigation_id_resource_logical_ids = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': investigation_resource_logical_id}, + 'PathPart': '{investigationId}', + } + }, + ) + self.assertEqual(len(investigation_id_resource_logical_ids), 1) + return next(key for key in investigation_id_resource_logical_ids.keys()) + + def _get_privilege_license_type_param_resource_id(self, api_stack_template, api_stack): + """ + Helper method to get the privilege {licenseType} parameter resource ID by traversing the resource hierarchy. + """ + provider_resource = api_stack.api.v1_api.provider_management.provider_resource.node.default_child + privileges_logical_id = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': api_stack.get_logical_id(provider_resource)}, + 'PathPart': 'privileges', + } + }, + ) + self.assertEqual(len(privileges_logical_id), 1) + privileges_logical_id = next(key for key in privileges_logical_id.keys()) + + jurisdiction_logical_id = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': privileges_logical_id}, + 'PathPart': 'jurisdiction', + } + }, + ) + self.assertEqual(len(jurisdiction_logical_id), 1) + jurisdiction_logical_id = next(key for key in jurisdiction_logical_id.keys()) + + jurisdiction_param_logical_id = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': jurisdiction_logical_id}, + 'PathPart': '{jurisdiction}', + } + }, + ) + self.assertEqual(len(jurisdiction_param_logical_id), 1) + jurisdiction_param_logical_id = next(key for key in jurisdiction_param_logical_id.keys()) + + license_type_logical_id = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': jurisdiction_param_logical_id}, + 'PathPart': 'licenseType', + } + }, + ) + self.assertEqual(len(license_type_logical_id), 1) + license_type_logical_id = next(key for key in license_type_logical_id.keys()) + + license_type_param_logical_id = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': license_type_logical_id}, + 'PathPart': '{licenseType}', + } + }, + ) + self.assertEqual(len(license_type_param_logical_id), 1) + return next(key for key in license_type_param_logical_id.keys()) + + def _get_license_license_type_param_resource_id(self, api_stack_template, api_stack): + """Helper method to get the license {licenseType} parameter resource ID by traversing the resource hierarchy.""" + provider_resource = api_stack.api.v1_api.provider_management.provider_resource.node.default_child + licenses_logical_id = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': api_stack.get_logical_id(provider_resource)}, + 'PathPart': 'licenses', + } + }, + ) + self.assertEqual(len(licenses_logical_id), 1) + licenses_logical_id = next(key for key in licenses_logical_id.keys()) + + jurisdiction_logical_id = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': licenses_logical_id}, + 'PathPart': 'jurisdiction', + } + }, + ) + self.assertEqual(len(jurisdiction_logical_id), 1) + jurisdiction_logical_id = next(key for key in jurisdiction_logical_id.keys()) + + jurisdiction_param_logical_id = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': jurisdiction_logical_id}, + 'PathPart': '{jurisdiction}', + } + }, + ) + self.assertEqual(len(jurisdiction_param_logical_id), 1) + jurisdiction_param_logical_id = next(key for key in jurisdiction_param_logical_id.keys()) + + license_type_logical_id = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': jurisdiction_param_logical_id}, + 'PathPart': 'licenseType', + } + }, + ) + self.assertEqual(len(license_type_logical_id), 1) + license_type_logical_id = next(key for key in license_type_logical_id.keys()) + + license_type_param_logical_id = api_stack_template.find_resources( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'Properties': { + 'ParentId': {'Ref': license_type_logical_id}, + 'PathPart': '{licenseType}', + } + }, + ) + self.assertEqual(len(license_type_param_logical_id), 1) + return next(key for key in license_type_param_logical_id.keys()) + + def test_synth_generates_privilege_investigation_resource(self): + """Test that the privilege investigation resource is created correctly.""" + api_stack = self.app.sandbox_backend_stage.api_stack + api_stack_template = Template.from_stack(api_stack) + + # Ensure the resource is created with expected path + api_stack_template.has_resource_properties( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'ParentId': {'Ref': self._get_privilege_license_type_param_resource_id(api_stack_template, api_stack)}, + 'PathPart': 'investigation', + }, + ) + + def test_synth_generates_privilege_investigation_id_resource(self): + """Test that the privilege investigation {investigationId} resource is created correctly.""" + api_stack = self.app.sandbox_backend_stage.api_stack + api_stack_template = Template.from_stack(api_stack) + + # Ensure the resource is created with expected path + api_stack_template.has_resource_properties( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'ParentId': {'Ref': self._get_privilege_investigation_resource_id(api_stack_template, api_stack)}, + 'PathPart': '{investigationId}', + }, + ) + + def test_synth_generates_license_investigation_resource(self): + """Test that the license investigation resource is created correctly.""" + api_stack = self.app.sandbox_backend_stage.api_stack + api_stack_template = Template.from_stack(api_stack) + + # Ensure the resource is created with expected path + api_stack_template.has_resource_properties( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'ParentId': {'Ref': self._get_license_license_type_param_resource_id(api_stack_template, api_stack)}, + 'PathPart': 'investigation', + }, + ) + + def test_synth_generates_license_investigation_id_resource(self): + """Test that the license investigation {investigationId} resource is created correctly.""" + api_stack = self.app.sandbox_backend_stage.api_stack + api_stack_template = Template.from_stack(api_stack) + + # Ensure the resource is created with expected path + api_stack_template.has_resource_properties( + type=CfnResource.CFN_RESOURCE_TYPE_NAME, + props={ + 'ParentId': {'Ref': self._get_license_investigation_resource_id(api_stack_template, api_stack)}, + 'PathPart': '{investigationId}', + }, + ) + + def test_synth_generates_privilege_investigation_handler(self): + """Test that the privilege investigation handler lambda is created correctly.""" + api_lambda_stack = self.app.sandbox_backend_stage.api_lambda_stack + api_lambda_stack_template = Template.from_stack(api_lambda_stack) + + # Ensure the lambda is created with expected code path + investigation_handler = TestApi.get_resource_properties_by_logical_id( + api_lambda_stack.get_logical_id( + api_lambda_stack.provider_management_lambdas.provider_investigation_handler.node.default_child + ), + api_lambda_stack_template.find_resources(CfnFunction.CFN_RESOURCE_TYPE_NAME), + ) + + self.assertEqual(investigation_handler['Handler'], 'handlers.investigation.investigation_handler') + + def test_synth_generates_post_privilege_investigation_endpoint(self): + """Test that the POST privilege investigation endpoint is configured correctly.""" + api_stack = self.app.sandbox_backend_stage.api_stack + api_stack_template = Template.from_stack(api_stack) + api_lambda_stack = self.app.sandbox_backend_stage.api_lambda_stack + api_lambda_stack_template = Template.from_stack(api_lambda_stack) + + # Ensure the POST method is configured correctly (no request model required) + api_stack_template.has_resource_properties( + type=CfnMethod.CFN_RESOURCE_TYPE_NAME, + props={ + 'HttpMethod': 'POST', + 'AuthorizationType': 'COGNITO_USER_POOLS', + 'AuthorizerId': { + 'Ref': api_stack.get_logical_id(api_stack.api.staff_users_authorizer.node.default_child), + }, + 'Integration': TestApi.generate_expected_integration_object_for_imported_lambda( + api_lambda_stack, + api_lambda_stack_template, + api_lambda_stack.provider_management_lambdas.provider_investigation_handler, + ), + 'MethodResponses': [ + { + 'ResponseModels': { + 'application/json': { + 'Ref': api_stack.get_logical_id( + api_stack.api.v1_api.api_model.message_response_model.node.default_child + ) + } + }, + 'StatusCode': '200', + }, + ], + }, + ) + + def test_synth_generates_patch_privilege_investigation_endpoint(self): + """Test that the PATCH privilege investigation endpoint is configured correctly.""" + api_stack = self.app.sandbox_backend_stage.api_stack + api_stack_template = Template.from_stack(api_stack) + api_lambda_stack = self.app.sandbox_backend_stage.api_lambda_stack + api_lambda_stack_template = Template.from_stack(api_lambda_stack) + + request_model_logical_id_capture = Capture() + + # Ensure the PATCH method is configured correctly + api_stack_template.has_resource_properties( + type=CfnMethod.CFN_RESOURCE_TYPE_NAME, + props={ + 'HttpMethod': 'PATCH', + 'AuthorizationType': 'COGNITO_USER_POOLS', + 'AuthorizerId': { + 'Ref': api_stack.get_logical_id(api_stack.api.staff_users_authorizer.node.default_child), + }, + 'Integration': TestApi.generate_expected_integration_object_for_imported_lambda( + api_lambda_stack, + api_lambda_stack_template, + api_lambda_stack.provider_management_lambdas.provider_investigation_handler, + ), + 'RequestModels': {'application/json': {'Ref': request_model_logical_id_capture}}, + 'MethodResponses': [ + { + 'ResponseModels': { + 'application/json': { + 'Ref': api_stack.get_logical_id( + api_stack.api.v1_api.api_model.message_response_model.node.default_child + ) + } + }, + 'StatusCode': '200', + }, + ], + }, + ) + + # Verify the request model matches expected schema + patch_privilege_investigation_request_model = TestApi.get_resource_properties_by_logical_id( + request_model_logical_id_capture.as_string(), + api_stack_template.find_resources(CfnModel.CFN_RESOURCE_TYPE_NAME), + ) + + self.compare_snapshot( + patch_privilege_investigation_request_model['Schema'], + 'PATCH_PRIVILEGE_INVESTIGATION_REQUEST_SCHEMA', + overwrite_snapshot=False, + ) + + def test_synth_generates_post_license_investigation_endpoint(self): + """Test that the POST license investigation endpoint is configured correctly.""" + api_stack = self.app.sandbox_backend_stage.api_stack + api_stack_template = Template.from_stack(api_stack) + api_lambda_stack = self.app.sandbox_backend_stage.api_lambda_stack + api_lambda_stack_template = Template.from_stack(api_lambda_stack) + + # Ensure the POST method is configured correctly (no request model required) + api_stack_template.has_resource_properties( + type=CfnMethod.CFN_RESOURCE_TYPE_NAME, + props={ + 'HttpMethod': 'POST', + 'AuthorizationType': 'COGNITO_USER_POOLS', + 'AuthorizerId': { + 'Ref': api_stack.get_logical_id(api_stack.api.staff_users_authorizer.node.default_child), + }, + 'Integration': TestApi.generate_expected_integration_object_for_imported_lambda( + api_lambda_stack, + api_lambda_stack_template, + api_lambda_stack.provider_management_lambdas.provider_investigation_handler, + ), + 'MethodResponses': [ + { + 'ResponseModels': { + 'application/json': { + 'Ref': api_stack.get_logical_id( + api_stack.api.v1_api.api_model.message_response_model.node.default_child + ) + } + }, + 'StatusCode': '200', + }, + ], + }, + ) + + def test_synth_generates_patch_license_investigation_endpoint(self): + """Test that the PATCH license investigation endpoint is configured correctly.""" + api_stack = self.app.sandbox_backend_stage.api_stack + api_stack_template = Template.from_stack(api_stack) + api_lambda_stack = self.app.sandbox_backend_stage.api_lambda_stack + api_lambda_stack_template = Template.from_stack(api_lambda_stack) + + request_model_logical_id_capture = Capture() + + # Ensure the PATCH method is configured correctly + api_stack_template.has_resource_properties( + type=CfnMethod.CFN_RESOURCE_TYPE_NAME, + props={ + 'HttpMethod': 'PATCH', + 'AuthorizationType': 'COGNITO_USER_POOLS', + 'AuthorizerId': { + 'Ref': api_stack.get_logical_id(api_stack.api.staff_users_authorizer.node.default_child), + }, + 'Integration': TestApi.generate_expected_integration_object_for_imported_lambda( + api_lambda_stack, + api_lambda_stack_template, + api_lambda_stack.provider_management_lambdas.provider_investigation_handler, + ), + 'RequestModels': {'application/json': {'Ref': request_model_logical_id_capture}}, + 'MethodResponses': [ + { + 'ResponseModels': { + 'application/json': { + 'Ref': api_stack.get_logical_id( + api_stack.api.v1_api.api_model.message_response_model.node.default_child + ) + } + }, + 'StatusCode': '200', + }, + ], + }, + ) + + # Verify the request model matches expected schema + patch_license_investigation_request_model = TestApi.get_resource_properties_by_logical_id( + request_model_logical_id_capture.as_string(), + api_stack_template.find_resources(CfnModel.CFN_RESOURCE_TYPE_NAME), + ) + + self.compare_snapshot( + patch_license_investigation_request_model['Schema'], + 'PATCH_LICENSE_INVESTIGATION_REQUEST_SCHEMA', + overwrite_snapshot=True, + ) diff --git a/backend/compact-connect/tests/resources/snapshots/PATCH_LICENSE_INVESTIGATION_REQUEST_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/PATCH_LICENSE_INVESTIGATION_REQUEST_SCHEMA.json new file mode 100644 index 000000000..7d2fb0371 --- /dev/null +++ b/backend/compact-connect/tests/resources/snapshots/PATCH_LICENSE_INVESTIGATION_REQUEST_SCHEMA.json @@ -0,0 +1,49 @@ +{ + "properties": { + "encumbrance": { + "additionalProperties": false, + "description": "Encumbrance data to create", + "properties": { + "encumbranceEffectiveDate": { + "description": "The effective date of the encumbrance", + "format": "date", + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string" + }, + "encumbranceType": { + "description": "The type of encumbrance", + "enum": [ + "fine", + "reprimand", + "required supervision", + "completion of continuing education", + "public reprimand", + "probation", + "injunctive action", + "suspension", + "revocation", + "denial", + "surrender of license", + "modification of previous action-extension", + "modification of previous action-reduction", + "other monitoring", + "other adjudicated action not listed" + ], + "type": "string" + }, + "clinicalPrivilegeActionCategory": { + "description": "The category of clinical privilege action", + "type": "string" + } + }, + "required": [ + "encumbranceEffectiveDate", + "encumbranceType", + "clinicalPrivilegeActionCategory" + ], + "type": "object" + } + }, + "type": "object", + "$schema": "http://json-schema.org/draft-04/schema#" +} diff --git a/backend/compact-connect/tests/resources/snapshots/PATCH_PRIVILEGE_INVESTIGATION_REQUEST_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/PATCH_PRIVILEGE_INVESTIGATION_REQUEST_SCHEMA.json new file mode 100644 index 000000000..7d2fb0371 --- /dev/null +++ b/backend/compact-connect/tests/resources/snapshots/PATCH_PRIVILEGE_INVESTIGATION_REQUEST_SCHEMA.json @@ -0,0 +1,49 @@ +{ + "properties": { + "encumbrance": { + "additionalProperties": false, + "description": "Encumbrance data to create", + "properties": { + "encumbranceEffectiveDate": { + "description": "The effective date of the encumbrance", + "format": "date", + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string" + }, + "encumbranceType": { + "description": "The type of encumbrance", + "enum": [ + "fine", + "reprimand", + "required supervision", + "completion of continuing education", + "public reprimand", + "probation", + "injunctive action", + "suspension", + "revocation", + "denial", + "surrender of license", + "modification of previous action-extension", + "modification of previous action-reduction", + "other monitoring", + "other adjudicated action not listed" + ], + "type": "string" + }, + "clinicalPrivilegeActionCategory": { + "description": "The category of clinical privilege action", + "type": "string" + } + }, + "required": [ + "encumbranceEffectiveDate", + "encumbranceType", + "clinicalPrivilegeActionCategory" + ], + "type": "object" + } + }, + "type": "object", + "$schema": "http://json-schema.org/draft-04/schema#" +} diff --git a/backend/compact-connect/tests/smoke/investigation_smoke_tests.py b/backend/compact-connect/tests/smoke/investigation_smoke_tests.py new file mode 100644 index 000000000..96ba9f5c3 --- /dev/null +++ b/backend/compact-connect/tests/smoke/investigation_smoke_tests.py @@ -0,0 +1,496 @@ +#!/usr/bin/env python3 +""" +Smoke tests for investigation functionality. + +This script tests the end-to-end investigation workflow for both licenses and privileges, +including creating investigations and closing them through the API endpoints. +""" + +import time + +import requests +from purchasing_privileges_smoke_tests import test_purchasing_privilege +from smoke_common import ( + SmokeTestFailureException, + call_provider_users_me_endpoint, + config, + create_test_staff_user, + delete_test_staff_user, + get_all_provider_database_records, + get_license_type_abbreviation, + get_provider_user_dynamodb_table, + get_staff_user_auth_headers, + load_smoke_test_env, + logger, +) + + +def clean_investigation_records(): + """ + Clean up any existing investigation records for the provider to start in a clean state. + """ + logger.info('Cleaning up existing investigation records...') + + # Get all provider database records + all_records = get_all_provider_database_records() + + # Filter for investigation records + investigation_records = [record for record in all_records if record.get('type') == 'investigation'] + + if not investigation_records: + logger.info('No investigation records found to clean up') + return + + # Delete each investigation record + dynamodb_table = get_provider_user_dynamodb_table() + for record in investigation_records: + pk = record['pk'] + sk = record['sk'] + logger.info(f'Deleting investigation record: {pk} / {sk}') + dynamodb_table.delete_item(Key={'pk': pk, 'sk': sk}) + + logger.info(f'Cleaned up {len(investigation_records)} investigation records') + + +def _remove_investigation_status_from_license_and_privilege(): + """Remove investigation status from license and privilege records.""" + # Get all provider database records + all_records = get_all_provider_database_records() + + for record in all_records: + if record.get('type') == 'license' or record.get('type') == 'privilege': + if record.get('investigationStatus') == 'underInvestigation': + logger.info( + f'Removing investigation status from {record.get("type")} {record.get("pk")} / {record.get("sk")}' + ) + dynamodb_table = get_provider_user_dynamodb_table() + dynamodb_table.update_item( + Key={'pk': record['pk'], 'sk': record['sk']}, + UpdateExpression='REMOVE investigationStatus', + ) + + +def setup_test_environment(): + """ + Set up the test environment by cleaning investigations and purchasing a privilege. + """ + logger.info('Setting up test environment...') + + # Clean up any existing investigations + clean_investigation_records() + + # Remove investigation status from license and privilege if present + _remove_investigation_status_from_license_and_privilege() + + # Purchase a privilege to ensure we have one to test with + logger.info('Purchasing a privilege for testing...') + test_purchasing_privilege() + + logger.info('Test environment setup complete') + + +def _get_license_data_from_provider_response(provider_data: dict, jurisdiction: str, license_type: str): + """Get license data from provider response.""" + return next( + ( + lic + for lic in provider_data['licenses'] + if lic['jurisdiction'] == jurisdiction and lic['licenseType'] == license_type + ), + None, + ) + + +def _get_privilege_data_from_provider_response(provider_data: dict, jurisdiction: str, license_type: str): + """Get privilege data from provider response.""" + return next( + ( + priv + for priv in provider_data['privileges'] + if priv['jurisdiction'] == jurisdiction and priv['licenseType'] == license_type + ), + None, + ) + + +def test_create_privilege_investigation(): + """Test creating a privilege investigation.""" + logger.info('Testing privilege investigation creation...') + + # Get provider data + provider_data = call_provider_users_me_endpoint() + provider_id = provider_data['providerId'] + compact = provider_data['compact'] + jurisdiction = provider_data['licenseJurisdiction'] + license_type = provider_data['licenses'][0]['licenseType'] + license_type_abbreviation = get_license_type_abbreviation(compact, license_type) + + # Get staff user auth headers + auth_headers = get_staff_user_auth_headers() + + # Create investigation + investigation_data = { + 'investigationStartDate': '2024-01-01', + } + + response = requests.post( + f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation', + json=investigation_data, + headers=auth_headers, + timeout=30, + ) + + if response.status_code != 200: + raise SmokeTestFailureException( + f'Failed to create privilege investigation: {response.status_code} - {response.text}' + ) + + logger.info('Privilege investigation created successfully') + + # Wait for the investigation to be processed + time.sleep(5) + + # Verify the privilege now has investigation status + updated_provider_data = call_provider_users_me_endpoint() + privilege_data = _get_privilege_data_from_provider_response(updated_provider_data, jurisdiction, license_type) + + if not privilege_data: + raise SmokeTestFailureException('Privilege not found after investigation creation') + + if privilege_data.get('investigationStatus') != 'underInvestigation': + status = privilege_data.get("investigationStatus") + raise SmokeTestFailureException( + f'Expected privilege to have investigation status "underInvestigation", but got: {status}' + ) + + logger.info('Privilege investigation status verified successfully') + + +def test_create_license_investigation(): + """Test creating a license investigation.""" + logger.info('Testing license investigation creation...') + + # Get provider data + provider_data = call_provider_users_me_endpoint() + provider_id = provider_data['providerId'] + compact = provider_data['compact'] + jurisdiction = provider_data['licenseJurisdiction'] + license_type = provider_data['licenses'][0]['licenseType'] + license_type_abbreviation = get_license_type_abbreviation(compact, license_type) + + # Get staff user auth headers + auth_headers = get_staff_user_auth_headers() + + # Create investigation + investigation_data = { + 'investigationStartDate': '2024-01-01', + } + + response = requests.post( + f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/licenses/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation', + json=investigation_data, + headers=auth_headers, + timeout=30, + ) + + if response.status_code != 200: + raise SmokeTestFailureException( + f'Failed to create license investigation: {response.status_code} - {response.text}' + ) + + logger.info('License investigation created successfully') + + # Wait for the investigation to be processed + time.sleep(5) + + # Verify the license now has investigation status + updated_provider_data = call_provider_users_me_endpoint() + license_data = _get_license_data_from_provider_response(updated_provider_data, jurisdiction, license_type) + + if not license_data: + raise SmokeTestFailureException('License not found after investigation creation') + + if license_data.get('investigationStatus') != 'underInvestigation': + status = license_data.get("investigationStatus") + raise SmokeTestFailureException( + f'Expected license to have investigation status "underInvestigation", but got: {status}' + ) + + logger.info('License investigation status verified successfully') + + +def test_close_privilege_investigation(): + """Test closing a privilege investigation.""" + logger.info('Testing privilege investigation closing...') + + # Get provider data + provider_data = call_provider_users_me_endpoint() + provider_id = provider_data['providerId'] + compact = provider_data['compact'] + jurisdiction = provider_data['licenseJurisdiction'] + license_type = provider_data['licenses'][0]['licenseType'] + license_type_abbreviation = get_license_type_abbreviation(compact, license_type) + + # Get staff user auth headers + auth_headers = get_staff_user_auth_headers() + + # Get investigation ID from database + all_records = get_all_provider_database_records() + investigation_records = [ + record + for record in all_records + if record.get('type') == 'investigation' + and record.get('investigationAgainst') == 'privilege' + and record.get('jurisdiction') == jurisdiction + and record.get('licenseType') == license_type + ] + + if not investigation_records: + raise SmokeTestFailureException('No privilege investigation found to close') + + investigation_id = investigation_records[0]['investigationId'] + + # Close investigation + close_data = { + 'investigationCloseDate': '2024-01-15', + } + + response = requests.patch( + f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation/{investigation_id}', + json=close_data, + headers=auth_headers, + timeout=30, + ) + + if response.status_code != 200: + raise SmokeTestFailureException( + f'Failed to close privilege investigation: {response.status_code} - {response.text}' + ) + + logger.info('Privilege investigation closed successfully') + + # Wait for the investigation to be processed + time.sleep(5) + + # Verify the privilege no longer has investigation status + updated_provider_data = call_provider_users_me_endpoint() + privilege_data = _get_privilege_data_from_provider_response(updated_provider_data, jurisdiction, license_type) + + if not privilege_data: + raise SmokeTestFailureException('Privilege not found after investigation closing') + + if privilege_data.get('investigationStatus') is not None: + raise SmokeTestFailureException( + f'Expected privilege to not have investigation status, but got: {privilege_data.get("investigationStatus")}' + ) + + logger.info('Privilege investigation closing verified successfully') + + +def test_close_license_investigation(): + """Test closing a license investigation.""" + logger.info('Testing license investigation closing...') + + # Get provider data + provider_data = call_provider_users_me_endpoint() + provider_id = provider_data['providerId'] + compact = provider_data['compact'] + jurisdiction = provider_data['licenseJurisdiction'] + license_type = provider_data['licenses'][0]['licenseType'] + license_type_abbreviation = get_license_type_abbreviation(compact, license_type) + + # Get staff user auth headers + auth_headers = get_staff_user_auth_headers() + + # Get investigation ID from database + all_records = get_all_provider_database_records() + investigation_records = [ + record + for record in all_records + if record.get('type') == 'investigation' + and record.get('investigationAgainst') == 'license' + and record.get('jurisdiction') == jurisdiction + and record.get('licenseType') == license_type + ] + + if not investigation_records: + raise SmokeTestFailureException('No license investigation found to close') + + investigation_id = investigation_records[0]['investigationId'] + + # Close investigation + close_data = { + 'investigationCloseDate': '2024-01-15', + } + + response = requests.patch( + f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/licenses/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation/{investigation_id}', + json=close_data, + headers=auth_headers, + timeout=30, + ) + + if response.status_code != 200: + raise SmokeTestFailureException( + f'Failed to close license investigation: {response.status_code} - {response.text}' + ) + + logger.info('License investigation closed successfully') + + # Wait for the investigation to be processed + time.sleep(5) + + # Verify the license no longer has investigation status + updated_provider_data = call_provider_users_me_endpoint() + license_data = _get_license_data_from_provider_response(updated_provider_data, jurisdiction, license_type) + + if not license_data: + raise SmokeTestFailureException('License not found after investigation closing') + + if license_data.get('investigationStatus') is not None: + raise SmokeTestFailureException( + f'Expected license to not have investigation status, but got: {license_data.get("investigationStatus")}' + ) + + logger.info('License investigation closing verified successfully') + + +def test_close_privilege_investigation_with_encumbrance(): + """Test closing a privilege investigation with encumbrance creation.""" + logger.info('Testing privilege investigation closing with encumbrance...') + + # Get provider data + provider_data = call_provider_users_me_endpoint() + provider_id = provider_data['providerId'] + compact = provider_data['compact'] + jurisdiction = provider_data['licenseJurisdiction'] + license_type = provider_data['licenses'][0]['licenseType'] + license_type_abbreviation = get_license_type_abbreviation(compact, license_type) + + # Get staff user auth headers + auth_headers = get_staff_user_auth_headers() + + # Create a new investigation first + investigation_data = { + 'investigationStartDate': '2024-01-01', + } + + response = requests.post( + f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation', + json=investigation_data, + headers=auth_headers, + timeout=30, + ) + + if response.status_code != 200: + raise SmokeTestFailureException( + f'Failed to create privilege investigation: {response.status_code} - {response.text}' + ) + + # Wait for the investigation to be processed + time.sleep(5) + + # Get investigation ID from database + all_records = get_all_provider_database_records() + investigation_records = [ + record + for record in all_records + if record.get('type') == 'investigation' + and record.get('investigationAgainst') == 'privilege' + and record.get('jurisdiction') == jurisdiction + and record.get('licenseType') == license_type + and record.get('investigationCloseDate') is None + ] + + if not investigation_records: + raise SmokeTestFailureException('No open privilege investigation found to close') + + investigation_id = investigation_records[0]['investigationId'] + + # Close investigation with encumbrance + close_data = { + 'investigationCloseDate': '2024-01-15', + 'encumbrance': { + 'encumbranceEffectiveDate': '2024-01-15', + 'encumbranceType': 'fine', + 'clinicalPrivilegeActionCategory': 'restriction', + }, + } + + response = requests.patch( + f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation/{investigation_id}', + json=close_data, + headers=auth_headers, + timeout=30, + ) + + if response.status_code != 200: + raise SmokeTestFailureException( + f'Failed to close privilege investigation with encumbrance: {response.status_code} - {response.text}' + ) + + logger.info('Privilege investigation closed with encumbrance successfully') + + # Wait for the investigation to be processed + time.sleep(5) + + # Verify the privilege no longer has investigation status + updated_provider_data = call_provider_users_me_endpoint() + privilege_data = _get_privilege_data_from_provider_response(updated_provider_data, jurisdiction, license_type) + + if not privilege_data: + raise SmokeTestFailureException('Privilege not found after investigation closing') + + if privilege_data.get('investigationStatus') is not None: + raise SmokeTestFailureException( + f'Expected privilege to not have investigation status, but got: {privilege_data.get("investigationStatus")}' + ) + + # Verify encumbrance was created + if privilege_data.get('encumberedStatus') != 'encumbered': + raise SmokeTestFailureException( + f'Expected privilege to be encumbered, but got: {privilege_data.get("encumberedStatus")}' + ) + + logger.info('Privilege investigation closing with encumbrance verified successfully') + + +def main(): + """Run all investigation smoke tests.""" + logger.info('Starting investigation smoke tests...') + + try: + # Load test environment + load_smoke_test_env() + + # Set up test environment + setup_test_environment() + + # Create test staff user + create_test_staff_user() + + # Run tests + test_create_privilege_investigation() + test_close_privilege_investigation() + + # Set up for license investigation tests + setup_test_environment() + test_create_license_investigation() + test_close_license_investigation() + + # Test closing with encumbrance + setup_test_environment() + test_close_privilege_investigation_with_encumbrance() + + logger.info('All investigation smoke tests passed!') + + except Exception as e: + logger.error(f'Investigation smoke tests failed: {str(e)}') + raise + finally: + # Clean up test staff user + delete_test_staff_user() + + +if __name__ == '__main__': + main() From 47cecaf0e3d21c6e4ba1a919c0f8b3a8154907f6 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Thu, 16 Oct 2025 16:19:23 -0600 Subject: [PATCH 04/33] WIP: upgrade deps --- .../python/cognito-backup/requirements-dev.in | 2 +- .../cognito-backup/requirements-dev.txt | 20 +++++++++---------- .../python/cognito-backup/requirements.txt | 8 ++++---- .../requirements-dev.txt | 18 ++++++++--------- .../compact-configuration/requirements.txt | 2 +- .../custom-resources/requirements-dev.txt | 18 ++++++++--------- .../python/custom-resources/requirements.txt | 2 +- .../python/data-events/requirements-dev.txt | 18 ++++++++--------- .../python/data-events/requirements.txt | 2 +- .../disaster-recovery/requirements-dev.txt | 18 ++++++++--------- .../python/disaster-recovery/requirements.txt | 2 +- .../python/purchases/requirements-dev.txt | 18 ++++++++--------- .../lambdas/python/purchases/requirements.txt | 6 +++--- .../staff-user-pre-token/requirements-dev.txt | 18 ++++++++--------- .../staff-user-pre-token/requirements.txt | 2 +- .../python/staff-users/requirements-dev.txt | 20 +++++++++---------- .../python/staff-users/requirements.txt | 2 +- 17 files changed, 88 insertions(+), 88 deletions(-) diff --git a/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.in b/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.in index 514e004e9..39256a5a9 100644 --- a/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.in +++ b/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.in @@ -2,4 +2,4 @@ boto3>=1.26.0 botocore>=1.29.0 aws-lambda-powertools>=2.0.0 pytest -moto[cognito-idp,s3] +moto[cognitoidp,s3]>=5, <6 diff --git a/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.txt b/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.txt index b9e90ad65..21fb88c5e 100644 --- a/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.txt @@ -1,30 +1,30 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/cognito-backup/requirements-dev.in # -aws-lambda-powertools==3.20.0 +aws-lambda-powertools==3.21.0 # via -r lambdas/python/cognito-backup/requirements-dev.in -boto3==1.40.35 +boto3==1.40.51 # via # -r lambdas/python/cognito-backup/requirements-dev.in # moto -botocore==1.40.35 +botocore==1.40.51 # via # -r lambdas/python/cognito-backup/requirements-dev.in # boto3 # moto # s3transfer -certifi==2025.8.3 +certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography charset-normalizer==3.4.3 # via requests -cryptography==46.0.1 +cryptography==46.0.2 # via moto -idna==3.10 +idna==3.11 # via requests iniconfig==2.1.0 # via pytest @@ -35,11 +35,11 @@ jmespath==1.0.1 # aws-lambda-powertools # boto3 # botocore -markupsafe==3.0.2 +markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[cognito-idp,s3]==5.1.12 +moto[cognito-idp,s3]==5.1.14 # via -r lambdas/python/cognito-backup/requirements-dev.in packaging==25.0 # via pytest @@ -57,7 +57,7 @@ python-dateutil==2.9.0.post0 # via # botocore # moto -pyyaml==6.0.2 +pyyaml==6.0.3 # via # moto # responses diff --git a/backend/compact-connect/lambdas/python/cognito-backup/requirements.txt b/backend/compact-connect/lambdas/python/cognito-backup/requirements.txt index 8d02a8f2d..9286d9498 100644 --- a/backend/compact-connect/lambdas/python/cognito-backup/requirements.txt +++ b/backend/compact-connect/lambdas/python/cognito-backup/requirements.txt @@ -1,14 +1,14 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/cognito-backup/requirements.in # -aws-lambda-powertools==3.20.0 +aws-lambda-powertools==3.21.0 # via -r lambdas/python/cognito-backup/requirements.in -boto3==1.40.35 +boto3==1.40.51 # via -r lambdas/python/cognito-backup/requirements.in -botocore==1.40.35 +botocore==1.40.51 # via # -r lambdas/python/cognito-backup/requirements.in # boto3 diff --git a/backend/compact-connect/lambdas/python/compact-configuration/requirements-dev.txt b/backend/compact-connect/lambdas/python/compact-configuration/requirements-dev.txt index e30bfbb2a..acae6d897 100644 --- a/backend/compact-connect/lambdas/python/compact-configuration/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/compact-configuration/requirements-dev.txt @@ -1,27 +1,27 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/compact-configuration/requirements-dev.in # -boto3==1.40.35 +boto3==1.40.51 # via moto -botocore==1.40.35 +botocore==1.40.51 # via # boto3 # moto # s3transfer -certifi==2025.8.3 +certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography charset-normalizer==3.4.3 # via requests -cryptography==46.0.1 +cryptography==46.0.2 # via moto docker==7.1.0 # via moto -idna==3.10 +idna==3.11 # via requests jinja2==3.1.6 # via moto @@ -29,11 +29,11 @@ jmespath==1.0.1 # via # boto3 # botocore -markupsafe==3.0.2 +markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.12 +moto[dynamodb,s3]==5.1.14 # via -r lambdas/python/compact-configuration/requirements-dev.in py-partiql-parser==0.6.1 # via moto @@ -43,7 +43,7 @@ python-dateutil==2.9.0.post0 # via # botocore # moto -pyyaml==6.0.2 +pyyaml==6.0.3 # via # moto # responses diff --git a/backend/compact-connect/lambdas/python/compact-configuration/requirements.txt b/backend/compact-connect/lambdas/python/compact-configuration/requirements.txt index f56b86777..300b434df 100644 --- a/backend/compact-connect/lambdas/python/compact-configuration/requirements.txt +++ b/backend/compact-connect/lambdas/python/compact-configuration/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/compact-configuration/requirements.in diff --git a/backend/compact-connect/lambdas/python/custom-resources/requirements-dev.txt b/backend/compact-connect/lambdas/python/custom-resources/requirements-dev.txt index 82c17d527..05af96301 100644 --- a/backend/compact-connect/lambdas/python/custom-resources/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/custom-resources/requirements-dev.txt @@ -1,27 +1,27 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/custom-resources/requirements-dev.in # -boto3==1.40.35 +boto3==1.40.51 # via moto -botocore==1.40.35 +botocore==1.40.51 # via # boto3 # moto # s3transfer -certifi==2025.8.3 +certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography charset-normalizer==3.4.3 # via requests -cryptography==46.0.1 +cryptography==46.0.2 # via moto docker==7.1.0 # via moto -idna==3.10 +idna==3.11 # via requests jinja2==3.1.6 # via moto @@ -29,11 +29,11 @@ jmespath==1.0.1 # via # boto3 # botocore -markupsafe==3.0.2 +markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.12 +moto[dynamodb,s3]==5.1.14 # via -r lambdas/python/custom-resources/requirements-dev.in py-partiql-parser==0.6.1 # via moto @@ -43,7 +43,7 @@ python-dateutil==2.9.0.post0 # via # botocore # moto -pyyaml==6.0.2 +pyyaml==6.0.3 # via # moto # responses diff --git a/backend/compact-connect/lambdas/python/custom-resources/requirements.txt b/backend/compact-connect/lambdas/python/custom-resources/requirements.txt index 6c98adb26..069cb30f7 100644 --- a/backend/compact-connect/lambdas/python/custom-resources/requirements.txt +++ b/backend/compact-connect/lambdas/python/custom-resources/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/custom-resources/requirements.in diff --git a/backend/compact-connect/lambdas/python/data-events/requirements-dev.txt b/backend/compact-connect/lambdas/python/data-events/requirements-dev.txt index c92146177..c8a17b58b 100644 --- a/backend/compact-connect/lambdas/python/data-events/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/data-events/requirements-dev.txt @@ -1,27 +1,27 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/data-events/requirements-dev.in # -boto3==1.40.35 +boto3==1.40.51 # via moto -botocore==1.40.35 +botocore==1.40.51 # via # boto3 # moto # s3transfer -certifi==2025.8.3 +certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography charset-normalizer==3.4.3 # via requests -cryptography==46.0.1 +cryptography==46.0.2 # via moto docker==7.1.0 # via moto -idna==3.10 +idna==3.11 # via requests jinja2==3.1.6 # via moto @@ -29,11 +29,11 @@ jmespath==1.0.1 # via # boto3 # botocore -markupsafe==3.0.2 +markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.12 +moto[dynamodb,s3]==5.1.14 # via -r lambdas/python/data-events/requirements-dev.in py-partiql-parser==0.6.1 # via moto @@ -43,7 +43,7 @@ python-dateutil==2.9.0.post0 # via # botocore # moto -pyyaml==6.0.2 +pyyaml==6.0.3 # via # moto # responses diff --git a/backend/compact-connect/lambdas/python/data-events/requirements.txt b/backend/compact-connect/lambdas/python/data-events/requirements.txt index da006c453..1d72aef4a 100644 --- a/backend/compact-connect/lambdas/python/data-events/requirements.txt +++ b/backend/compact-connect/lambdas/python/data-events/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/data-events/requirements.in diff --git a/backend/compact-connect/lambdas/python/disaster-recovery/requirements-dev.txt b/backend/compact-connect/lambdas/python/disaster-recovery/requirements-dev.txt index 8c2dca592..b2af304c8 100644 --- a/backend/compact-connect/lambdas/python/disaster-recovery/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/disaster-recovery/requirements-dev.txt @@ -1,27 +1,27 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/disaster-recovery/requirements-dev.in # -boto3==1.40.35 +boto3==1.40.51 # via moto -botocore==1.40.35 +botocore==1.40.51 # via # boto3 # moto # s3transfer -certifi==2025.8.3 +certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography charset-normalizer==3.4.3 # via requests -cryptography==46.0.1 +cryptography==46.0.2 # via moto docker==7.1.0 # via moto -idna==3.10 +idna==3.11 # via requests jinja2==3.1.6 # via moto @@ -29,11 +29,11 @@ jmespath==1.0.1 # via # boto3 # botocore -markupsafe==3.0.2 +markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.12 +moto[dynamodb,s3]==5.1.14 # via -r lambdas/python/disaster-recovery/requirements-dev.in py-partiql-parser==0.6.1 # via moto @@ -43,7 +43,7 @@ python-dateutil==2.9.0.post0 # via # botocore # moto -pyyaml==6.0.2 +pyyaml==6.0.3 # via # moto # responses diff --git a/backend/compact-connect/lambdas/python/disaster-recovery/requirements.txt b/backend/compact-connect/lambdas/python/disaster-recovery/requirements.txt index 800fc58fc..bde3b5530 100644 --- a/backend/compact-connect/lambdas/python/disaster-recovery/requirements.txt +++ b/backend/compact-connect/lambdas/python/disaster-recovery/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/disaster-recovery/requirements.in diff --git a/backend/compact-connect/lambdas/python/purchases/requirements-dev.txt b/backend/compact-connect/lambdas/python/purchases/requirements-dev.txt index 2a1ee6b0a..924cf6e4e 100644 --- a/backend/compact-connect/lambdas/python/purchases/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/purchases/requirements-dev.txt @@ -1,27 +1,27 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/purchases/requirements-dev.in # -boto3==1.40.35 +boto3==1.40.51 # via moto -botocore==1.40.35 +botocore==1.40.51 # via # boto3 # moto # s3transfer -certifi==2025.8.3 +certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography charset-normalizer==3.4.3 # via requests -cryptography==46.0.1 +cryptography==46.0.2 # via moto docker==7.1.0 # via moto -idna==3.10 +idna==3.11 # via requests jinja2==3.1.6 # via moto @@ -29,11 +29,11 @@ jmespath==1.0.1 # via # boto3 # botocore -markupsafe==3.0.2 +markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.12 +moto[dynamodb,s3]==5.1.14 # via -r lambdas/python/purchases/requirements-dev.in py-partiql-parser==0.6.1 # via moto @@ -43,7 +43,7 @@ python-dateutil==2.9.0.post0 # via # botocore # moto -pyyaml==6.0.2 +pyyaml==6.0.3 # via # moto # responses diff --git a/backend/compact-connect/lambdas/python/purchases/requirements.txt b/backend/compact-connect/lambdas/python/purchases/requirements.txt index 3b8e3df89..c002cf8e5 100644 --- a/backend/compact-connect/lambdas/python/purchases/requirements.txt +++ b/backend/compact-connect/lambdas/python/purchases/requirements.txt @@ -1,16 +1,16 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/purchases/requirements.in # authorizenet==1.1.6 # via -r lambdas/python/purchases/requirements.in -certifi==2025.8.3 +certifi==2025.10.5 # via requests charset-normalizer==3.4.3 # via requests -idna==3.10 +idna==3.11 # via requests lxml==4.9.4 # via authorizenet diff --git a/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements-dev.txt b/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements-dev.txt index 5ea9fc177..d6a3d6f7b 100644 --- a/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements-dev.txt @@ -1,27 +1,27 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/staff-user-pre-token/requirements-dev.in # -boto3==1.40.35 +boto3==1.40.51 # via moto -botocore==1.40.35 +botocore==1.40.51 # via # boto3 # moto # s3transfer -certifi==2025.8.3 +certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography charset-normalizer==3.4.3 # via requests -cryptography==46.0.1 +cryptography==46.0.2 # via moto docker==7.1.0 # via moto -idna==3.10 +idna==3.11 # via requests jinja2==3.1.6 # via moto @@ -29,11 +29,11 @@ jmespath==1.0.1 # via # boto3 # botocore -markupsafe==3.0.2 +markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.12 +moto[dynamodb,s3]==5.1.14 # via -r lambdas/python/staff-user-pre-token/requirements-dev.in py-partiql-parser==0.6.1 # via moto @@ -43,7 +43,7 @@ python-dateutil==2.9.0.post0 # via # botocore # moto -pyyaml==6.0.2 +pyyaml==6.0.3 # via # moto # responses diff --git a/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements.txt b/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements.txt index 23d37d92a..40d464f51 100644 --- a/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements.txt +++ b/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/staff-user-pre-token/requirements.in diff --git a/backend/compact-connect/lambdas/python/staff-users/requirements-dev.txt b/backend/compact-connect/lambdas/python/staff-users/requirements-dev.txt index 6e72a0e88..f322e300b 100644 --- a/backend/compact-connect/lambdas/python/staff-users/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/staff-users/requirements-dev.txt @@ -1,23 +1,23 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/staff-users/requirements-dev.in # -boto3==1.40.35 +boto3==1.40.51 # via moto -botocore==1.40.35 +botocore==1.40.51 # via # boto3 # moto # s3transfer -certifi==2025.8.3 +certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography charset-normalizer==3.4.3 # via requests -cryptography==46.0.1 +cryptography==46.0.2 # via # joserfc # moto @@ -25,7 +25,7 @@ docker==7.1.0 # via moto faker==28.4.1 # via -r lambdas/python/staff-users/requirements-dev.in -idna==3.10 +idna==3.11 # via requests jinja2==3.1.6 # via moto @@ -33,13 +33,13 @@ jmespath==1.0.1 # via # boto3 # botocore -joserfc==1.3.3 +joserfc==1.4.0 # via moto -markupsafe==3.0.2 +markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[cognitoidp,dynamodb,s3]==5.1.12 +moto[cognitoidp,dynamodb,s3]==5.1.14 # via -r lambdas/python/staff-users/requirements-dev.in py-partiql-parser==0.6.1 # via moto @@ -50,7 +50,7 @@ python-dateutil==2.9.0.post0 # botocore # faker # moto -pyyaml==6.0.2 +pyyaml==6.0.3 # via # moto # responses diff --git a/backend/compact-connect/lambdas/python/staff-users/requirements.txt b/backend/compact-connect/lambdas/python/staff-users/requirements.txt index 3830b77fd..08712efbd 100644 --- a/backend/compact-connect/lambdas/python/staff-users/requirements.txt +++ b/backend/compact-connect/lambdas/python/staff-users/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # # pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/staff-users/requirements.in From 638b6de36d58fd946cacd0234b292f82ce102cb3 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Sun, 19 Oct 2025 00:07:54 -0600 Subject: [PATCH 05/33] Wire investigations to provider responses, smoke test --- .../data_model/provider_record_util.py | 55 ++ .../data_model/schema/investigation/api.py | 1 - .../data_model/schema/investigation/record.py | 4 +- .../data_model/schema/license/api.py | 3 + .../data_model/schema/privilege/api.py | 3 + .../common/tests/function/test_data_client.py | 14 +- .../api/provider-detail-response.json | 4 +- .../provider-data-v1/handlers/encumbrance.py | 4 +- .../handlers/investigation.py | 36 +- .../test_handlers/test_investigation.py | 128 +++++ .../api_lambda_stack/provider_management.py | 2 +- .../stacks/api_stack/v1_api/api_model.py | 40 ++ .../GET_PROVIDER_RESPONSE_SCHEMA.json | 228 +++++++++ .../LICENSE_ENCUMBRANCE_REQUEST_SCHEMA.json | 1 + .../PRIVILEGE_ENCUMBRANCE_REQUEST_SCHEMA.json | 1 + .../PROVIDER_USER_RESPONSE_SCHEMA.json | 228 +++++++++ .../tests/smoke/investigation_smoke_tests.py | 475 +++++++++--------- 17 files changed, 951 insertions(+), 276 deletions(-) mode change 100644 => 100755 backend/compact-connect/tests/smoke/investigation_smoke_tests.py diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py index 1e9048f68..6cd356f18 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py @@ -17,6 +17,7 @@ PrivilegeEncumberedStatusEnum, UpdateCategory, ) +from cc_common.data_model.schema.investigation import InvestigationData from cc_common.data_model.schema.license import LicenseData, LicenseUpdateData from cc_common.data_model.schema.military_affiliation import MilitaryAffiliationData from cc_common.data_model.schema.privilege import PrivilegeData, PrivilegeUpdateData @@ -38,6 +39,7 @@ class ProviderRecordType(StrEnum): PRIVILEGE_UPDATE = 'privilegeUpdate' MILITARY_AFFILIATION = 'militaryAffiliation' ADVERSE_ACTION = 'adverseAction' + INVESTIGATION = 'investigation' # The following update event types are used during events which caused @@ -404,6 +406,7 @@ def __init__(self, provider_records: Iterable[dict]): self._privilege_records: list[PrivilegeData] = [] self._license_records: list[LicenseData] = [] self._adverse_action_records: list[AdverseActionData] = [] + self._investigation_records: list[InvestigationData] = [] self._provider_records: list[ProviderData] = [] self._provider_update_records: list[ProviderUpdateData] = [] self._military_affiliation_records: list[MilitaryAffiliationData] = [] @@ -419,6 +422,8 @@ def __init__(self, provider_records: Iterable[dict]): self._license_records.append(LicenseData.from_database_record(record)) elif record_type == ProviderRecordType.ADVERSE_ACTION: self._adverse_action_records.append(AdverseActionData.from_database_record(record)) + elif record_type == ProviderRecordType.INVESTIGATION: + self._investigation_records.append(InvestigationData.from_database_record(record)) elif record_type == ProviderRecordType.PROVIDER: self._provider_records.append(ProviderData.from_database_record(record)) elif record_type == ProviderRecordType.PROVIDER_UPDATE: @@ -579,6 +584,44 @@ def get_adverse_action_records_for_privilege( and (filter_condition is None or filter_condition(record)) ] + def get_investigation_records_for_privilege( + self, + privilege_jurisdiction: str, + privilege_license_type_abbreviation: str, + filter_condition: Callable[[InvestigationData], bool] | None = None, + ) -> list[InvestigationData]: + """ + Get all investigation records for a given privilege. + """ + return [ + record + for record in self._investigation_records + if record.investigationAgainst == 'privilege' + and record.jurisdiction == privilege_jurisdiction + and record.licenseTypeAbbreviation == privilege_license_type_abbreviation + and record.closeDate is None # Only return active investigations + and (filter_condition is None or filter_condition(record)) + ] + + def get_investigation_records_for_license( + self, + license_jurisdiction: str, + license_type_abbreviation: str, + filter_condition: Callable[[InvestigationData], bool] | None = None, + ) -> list[InvestigationData]: + """ + Get all investigation records for a given license. + """ + return [ + record + for record in self._investigation_records + if record.investigationAgainst == 'license' + and record.jurisdiction == license_jurisdiction + and record.licenseTypeAbbreviation == license_type_abbreviation + and record.closeDate is None # Only return active investigations + and (filter_condition is None or filter_condition(record)) + ] + def get_provider_record(self) -> ProviderData: """ Get the provider record from a list of records associated with a provider. @@ -738,6 +781,12 @@ def generate_api_response_object(self) -> dict: license_record.jurisdiction, license_record.licenseTypeAbbreviation ) ] + license_dict['investigations'] = [ + rec.to_dict() + for rec in self.get_investigation_records_for_license( + license_record.jurisdiction, license_record.licenseTypeAbbreviation + ) + ] licenses.append(license_dict) # Build privileges dict with history and adverseActions @@ -753,6 +802,12 @@ def generate_api_response_object(self) -> dict: privilege_record.jurisdiction, privilege_record.licenseTypeAbbreviation ) ] + privilege_dict['investigations'] = [ + rec.to_dict() + for rec in self.get_investigation_records_for_privilege( + privilege_record.jurisdiction, privilege_record.licenseTypeAbbreviation + ) + ] active_since = ProviderRecordUtility.calculate_privilege_active_since_date( privilege_record, privilege_updates ) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py index 8bbe32439..5a0340576 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/api.py @@ -38,7 +38,6 @@ class InvestigationGeneralResponseSchema(ForgivingSchema): providerId = Raw(required=True, allow_none=False) investigationId = Raw(required=True, allow_none=False) jurisdiction = Jurisdiction(required=True, allow_none=False) - licenseTypeAbbreviation = String(required=True, allow_none=False) licenseType = String(required=True, allow_none=False) dateOfUpdate = Raw(required=True, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py index 2e887e647..701443a34 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py @@ -1,6 +1,6 @@ # ruff: noqa: N801, N815 invalid-name from marshmallow import pre_dump -from marshmallow.fields import UUID, Date, DateTime, String +from marshmallow.fields import UUID, DateTime, String from marshmallow.validate import ValidationError from cc_common.config import config @@ -35,7 +35,7 @@ class InvestigationRecordSchema(BaseRecordSchema): creationDate = DateTime(required=True, allow_none=False) # Populated when the investigation is closed - closeDate = Date(required=False, allow_none=False) + closeDate = DateTime(required=False, allow_none=False) closingUser = UUID(required=False, allow_none=False) resultingEncumbranceId = UUID(required=False, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/api.py index 7a6c0dc65..8e8c271ff 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/api.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/api.py @@ -21,6 +21,7 @@ NationalProviderIdentifier, SocialSecurityNumber, ) +from cc_common.data_model.schema.investigation.api import InvestigationGeneralResponseSchema class LicensePostRequestSchema(CCRequestSchema, StrictSchema): @@ -146,6 +147,7 @@ class LicenseGeneralResponseSchema(ForgivingSchema): emailAddress = Email(required=False, allow_none=False) phoneNumber = ITUTE164PhoneNumber(required=False, allow_none=False) adverseActions = List(Nested(AdverseActionGeneralResponseSchema, required=False, allow_none=False)) + investigations = List(Nested(InvestigationGeneralResponseSchema, required=False, allow_none=False)) # This field is only set if the license is under investigation investigationStatus = InvestigationStatusField(required=False, allow_none=False) @@ -186,6 +188,7 @@ class LicenseReadPrivateResponseSchema(ForgivingSchema): emailAddress = Email(required=False, allow_none=False) phoneNumber = ITUTE164PhoneNumber(required=False, allow_none=False) adverseActions = List(Nested(AdverseActionGeneralResponseSchema, required=False, allow_none=False)) + investigations = List(Nested(InvestigationGeneralResponseSchema, required=False, allow_none=False)) # This field is only set if the license is under investigation investigationStatus = InvestigationStatusField(required=False, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py index 1cc51264d..259cd97c2 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py @@ -15,6 +15,7 @@ Jurisdiction, UpdateType, ) +from cc_common.data_model.schema.investigation.api import InvestigationGeneralResponseSchema class AttestationVersionResponseSchema(Schema): @@ -74,6 +75,7 @@ class PrivilegeGeneralResponseSchema(ForgivingSchema): dateOfExpiration = Raw(required=True, allow_none=False) dateOfUpdate = Raw(required=True, allow_none=False) adverseActions = List(Nested(AdverseActionGeneralResponseSchema, required=False, allow_none=False)) + investigations = List(Nested(InvestigationGeneralResponseSchema, required=False, allow_none=False)) administratorSetStatus = ActiveInactive(required=True, allow_none=False) # the id of the transaction that was made when the user purchased this privilege compactTransactionId = String(required=False, allow_none=False) @@ -108,6 +110,7 @@ class PrivilegeReadPrivateResponseSchema(ForgivingSchema): dateOfExpiration = Raw(required=True, allow_none=False) dateOfUpdate = Raw(required=True, allow_none=False) adverseActions = List(Nested(AdverseActionGeneralResponseSchema, required=False, allow_none=False)) + investigations = List(Nested(InvestigationGeneralResponseSchema, required=False, allow_none=False)) administratorSetStatus = ActiveInactive(required=True, allow_none=False) # the id of the transaction that was made when the user purchased this privilege compactTransactionId = String(required=False, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py index cb98e15c5..9441b16eb 100644 --- a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py +++ b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py @@ -1443,8 +1443,7 @@ def test_close_privilege_investigation_success(self): 'privilegeId': 'SLP-NE-1', 'investigationStatus': 'underInvestigation', }, - 'updatedValues': { - }, + 'updatedValues': {}, 'removedValues': ['investigationStatus'], } # Pop dynamic fields that we don't want to assert on @@ -1593,8 +1592,7 @@ def test_close_license_investigation_success(self): 'jurisdictionUploadedCompactEligibility': 'eligible', 'investigationStatus': 'underInvestigation', }, - 'updatedValues': { - }, + 'updatedValues': {}, 'removedValues': ['investigationStatus'], } # Pop dynamic fields that we don't want to assert on @@ -1624,7 +1622,7 @@ def test_close_privilege_investigation_not_found(self): investigation_id=str(uuid4()), closing_user=str(uuid4()), close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), - investigation_against=InvestigationAgainstEnum.PRIVILEGE, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, ) self.assertIn('Investigation not found', str(context.exception)) @@ -1650,7 +1648,7 @@ def test_close_license_investigation_not_found(self): investigation_id=str(uuid4()), closing_user=str(uuid4()), close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), - investigation_against=InvestigationAgainstEnum.LICENSE, + investigation_against=InvestigationAgainstEnum.LICENSE, ) self.assertIn('Investigation not found', str(context.exception)) @@ -1705,7 +1703,7 @@ def test_close_privilege_investigation_already_closed(self): investigation_id=str(investigation.investigationId), closing_user=closing_user, close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), - investigation_against=InvestigationAgainstEnum.PRIVILEGE, + investigation_against=InvestigationAgainstEnum.PRIVILEGE, ) self.assertIn('Investigation not found', str(context.exception)) @@ -1760,7 +1758,7 @@ def test_close_license_investigation_already_closed(self): investigation_id=str(investigation.investigationId), closing_user=closing_user, close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), - investigation_against=InvestigationAgainstEnum.LICENSE, + investigation_against=InvestigationAgainstEnum.LICENSE, ) self.assertIn('Investigation not found', str(context.exception)) diff --git a/backend/compact-connect/lambdas/python/common/tests/resources/api/provider-detail-response.json b/backend/compact-connect/lambdas/python/common/tests/resources/api/provider-detail-response.json index 8ee8ebbae..47ab5f47d 100644 --- a/backend/compact-connect/lambdas/python/common/tests/resources/api/provider-detail-response.json +++ b/backend/compact-connect/lambdas/python/common/tests/resources/api/provider-detail-response.json @@ -49,7 +49,8 @@ "homeAddressPostalCode": "43004", "emailAddress": "björk@example.com", "phoneNumber": "+13213214321", - "adverseActions": [] + "adverseActions": [], + "investigations": [] } ], "privileges": [ @@ -70,6 +71,7 @@ "privilegeId": "SLP-NE-1", "administratorSetStatus": "active", "adverseActions": [], + "investigations": [], "attestations": [ { "attestationId": "jurisprudence-confirmation", diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py index 3ba1ad099..c0b84dbdb 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py @@ -268,7 +268,7 @@ def handle_privilege_encumbrance_lifting(event: dict) -> dict: jurisdiction=jurisdiction, license_type_abbreviation=license_type_abbreviation, effective_date=lift_date, - ) + ) return {'message': 'OK'} @@ -320,6 +320,6 @@ def handle_license_encumbrance_lifting(event: dict) -> dict: jurisdiction=jurisdiction, license_type_abbreviation=license_type_abbreviation, effective_date=lift_date, - ) + ) return {'message': 'OK'} diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py index f25a3e58f..8e15a83bf 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py @@ -70,12 +70,10 @@ def _generate_investigation_for_record_type( jurisdiction: str, provider_id: str, license_type_abbr: str, - investigation_against_record_type: InvestigationAgainstEnum, cognito_sub: str + investigation_against_record_type: InvestigationAgainstEnum, + cognito_sub: str, ) -> InvestigationData: - - license_type = LicenseUtility.get_license_type_by_abbreviation( - compact=compact, abbreviation=license_type_abbr - ) + license_type = LicenseUtility.get_license_type_by_abbreviation(compact=compact, abbreviation=license_type_abbr) if not license_type: raise CCInvalidRequestException( @@ -84,17 +82,18 @@ def _generate_investigation_for_record_type( ) # populate the investigation data to be stored in the database - return InvestigationData.create_new({ - 'compact': compact, - 'jurisdiction': jurisdiction, - 'providerId': provider_id, - 'investigationId': uuid4(), - 'licenseTypeAbbreviation': license_type_abbr, - 'licenseType': license_type.name, - 'investigationAgainst': investigation_against_record_type, - 'submittingUser': cognito_sub, - 'creationDate': config.current_standard_datetime, - }) + return InvestigationData.create_new( + { + 'compact': compact, + 'jurisdiction': jurisdiction, + 'providerId': provider_id, + 'investigationId': uuid4(), + 'licenseType': license_type.name, + 'investigationAgainst': investigation_against_record_type, + 'submittingUser': cognito_sub, + 'creationDate': config.current_standard_datetime, + } + ) def handle_privilege_investigation(event: dict) -> dict: @@ -112,7 +111,7 @@ def handle_privilege_investigation(event: dict) -> dict: provider_id=provider_id, license_type_abbr=license_type_abbr, investigation_against_record_type=InvestigationAgainstEnum.PRIVILEGE, - cognito_sub=cognito_sub + cognito_sub=cognito_sub, ) logger.info('Processing investigation updates for privilege record') config.data_client.create_investigation(investigation) @@ -146,7 +145,7 @@ def handle_license_investigation(event: dict) -> dict: provider_id=provider_id, license_type_abbr=license_type_abbr, investigation_against_record_type=InvestigationAgainstEnum.LICENSE, - cognito_sub=cognito_sub + cognito_sub=cognito_sub, ) logger.info('Processing investigation updates for license record') config.data_client.create_investigation(investigation) @@ -250,7 +249,6 @@ def handle_license_investigation_close(event: dict) -> dict: adverse_action_post_body=encumbrance_data, ) - # Call the data client method to close the investigation config.data_client.close_investigation( compact=compact, diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py index 769fedffc..92f528d68 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py @@ -149,6 +149,7 @@ def test_privilege_investigation_handler_adds_investigation_record_in_provider_d def test_privilege_investigation_handler_sets_provider_record_to_under_investigation_in_provider_data_table(self): from cc_common.data_model.schema.common import InvestigationStatusEnum from handlers.investigation import investigation_handler + from handlers.providers import get_provider event, test_privilege_record = self._when_testing_privilege_investigation() @@ -167,6 +168,42 @@ def test_privilege_investigation_handler_sets_provider_record_to_under_investiga InvestigationStatusEnum.UNDER_INVESTIGATION.value, updated_privilege_record['investigationStatus'] ) + # Verify that investigation objects are included in the API response + api_event = self.test_data_generator.generate_test_api_event( + scope_override=f'openid email {test_privilege_record.jurisdiction}/aslp.readGeneral', + value_overrides={ + 'httpMethod': 'GET', + 'resource': '/v1/compacts/{compact}/providers/{providerId}', + 'pathParameters': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + }, + }, + ) + + api_response = get_provider(api_event, self.mock_context) + self.assertEqual(200, api_response['statusCode']) + + provider_data = json.loads(api_response['body']) + + # Verify that the privilege has investigation objects + privilege = provider_data['privileges'][0] + investigation = privilege['investigations'][0] + + expected_investigation = { + 'type': 'investigation', + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseType': test_privilege_record.licenseType, + 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, + 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationId': investigation['investigationId'], # Dynamic field + } + + self.assertEqual(expected_investigation, investigation) + def test_privilege_investigation_handler_returns_access_denied_if_compact_admin(self): """Verifying that only state admins are allowed to create privilege investigations""" from handlers.investigation import investigation_handler @@ -333,6 +370,7 @@ def test_license_investigation_handler_adds_investigation_record_in_provider_dat def test_license_investigation_handler_sets_provider_record_to_under_investigation_in_provider_data_table(self): from cc_common.data_model.schema.common import InvestigationStatusEnum from handlers.investigation import investigation_handler + from handlers.providers import get_provider event, test_license_record = self._when_testing_valid_license_investigation() @@ -351,6 +389,42 @@ def test_license_investigation_handler_sets_provider_record_to_under_investigati InvestigationStatusEnum.UNDER_INVESTIGATION.value, updated_license_record['investigationStatus'] ) + # Verify that investigation objects are included in the API response + api_event = self.test_data_generator.generate_test_api_event( + scope_override=f'openid email {test_license_record.jurisdiction}/aslp.readGeneral', + value_overrides={ + 'httpMethod': 'GET', + 'resource': '/v1/compacts/{compact}/providers/{providerId}', + 'pathParameters': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + }, + }, + ) + + api_response = get_provider(api_event, self.mock_context) + self.assertEqual(200, api_response['statusCode']) + + provider_data = json.loads(api_response['body']) + + # Verify that the license has investigation objects + license_obj = provider_data['licenses'][0] + investigation = license_obj['investigations'][0] + + expected_investigation = { + 'type': 'investigation', + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseType': test_license_record.licenseType, + 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, + 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationId': investigation['investigationId'], # Dynamic field + } + + self.assertEqual(expected_investigation, investigation) + def test_license_investigation_handler_returns_access_denied_if_compact_admin(self): """Verifying that only state admins are allowed to create license investigations""" from handlers.investigation import investigation_handler @@ -549,6 +623,7 @@ def test_privilege_investigation_close_handler_updates_investigation_record(self def test_privilege_investigation_close_handler_removes_investigation_status_from_privilege(self): from handlers.investigation import investigation_handler + from handlers.providers import get_provider event, test_privilege_record, investigation_id = self._when_testing_privilege_investigation_close() @@ -565,6 +640,32 @@ def test_privilege_investigation_close_handler_removes_investigation_status_from self.assertNotIn('investigationStatus', updated_privilege_record) + # Verify that investigation objects are removed from the API response + api_event = self.test_data_generator.generate_test_api_event( + scope_override=f'openid email {test_privilege_record.jurisdiction}/aslp.readGeneral', + value_overrides={ + 'httpMethod': 'GET', + 'resource': '/v1/compacts/{compact}/providers/{providerId}', + 'pathParameters': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + }, + }, + ) + + api_response = get_provider(api_event, self.mock_context) + self.assertEqual(200, api_response['statusCode']) + + provider_data = json.loads(api_response['body']) + + # Verify that the privilege has no investigation objects + privilege = provider_data['privileges'][0] + expected_privilege = { + 'investigations': [], + } + + self.assertEqual(expected_privilege['investigations'], privilege['investigations']) + def test_privilege_investigation_close_with_encumbrance_creates_encumbrance(self): from handlers.investigation import investigation_handler @@ -767,6 +868,7 @@ def test_license_investigation_close_handler_updates_investigation_record(self): def test_license_investigation_close_handler_removes_investigation_status_from_license(self): from handlers.investigation import investigation_handler + from handlers.providers import get_provider event, test_license_record, investigation_id = self._when_testing_license_investigation_close() @@ -783,6 +885,32 @@ def test_license_investigation_close_handler_removes_investigation_status_from_l self.assertNotIn('investigationStatus', updated_license_record) + # Verify that investigation objects are removed from the API response + api_event = self.test_data_generator.generate_test_api_event( + scope_override=f'openid email {test_license_record.jurisdiction}/aslp.readGeneral', + value_overrides={ + 'httpMethod': 'GET', + 'resource': '/v1/compacts/{compact}/providers/{providerId}', + 'pathParameters': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + }, + }, + ) + + api_response = get_provider(api_event, self.mock_context) + self.assertEqual(200, api_response['statusCode']) + + provider_data = json.loads(api_response['body']) + + # Verify that the license has no investigation objects + license_obj = provider_data['licenses'][0] + expected_license = { + 'investigations': [], + } + + self.assertEqual(expected_license['investigations'], license_obj['investigations']) + def test_license_investigation_close_with_encumbrance_creates_encumbrance(self): from handlers.investigation import investigation_handler diff --git a/backend/compact-connect/stacks/api_lambda_stack/provider_management.py b/backend/compact-connect/stacks/api_lambda_stack/provider_management.py index c825eb379..d39b8bd8e 100644 --- a/backend/compact-connect/stacks/api_lambda_stack/provider_management.py +++ b/backend/compact-connect/stacks/api_lambda_stack/provider_management.py @@ -26,7 +26,7 @@ def __init__( lambda_environment = { 'PROVIDER_TABLE_NAME': persistent_stack.provider_table.table_name, 'STAFF_USERS_TABLE_NAME': persistent_stack.staff_users.user_table.table_name, - 'DATA_EVENT_BUS_NAME': data_event_bus.event_bus_name, + 'EVENT_BUS_NAME': data_event_bus.event_bus_name, **self.stack.common_env_vars, } diff --git a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py index 16e4f9b81..50cd73c41 100644 --- a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py +++ b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py @@ -1172,6 +1172,10 @@ def _provider_detail_response_schema(self): }, ), ), + 'investigations': JsonSchema( + type=JsonSchemaType.ARRAY, + items=self._investigation_schema, + ), **self._common_license_properties, }, ), @@ -1308,6 +1312,10 @@ def _provider_detail_response_schema(self): }, ), ), + 'investigations': JsonSchema( + type=JsonSchemaType.ARRAY, + items=self._investigation_schema, + ), **self._common_privilege_properties, }, ), @@ -1433,6 +1441,38 @@ def _encumbrance_type_schema(self) -> JsonSchema: ], ) + @property + def _investigation_schema(self) -> JsonSchema: + """Common schema for investigation objects""" + return JsonSchema( + type=JsonSchemaType.OBJECT, + required=[ + 'type', + 'compact', + 'providerId', + 'investigationId', + 'jurisdiction', + 'licenseType', + 'dateOfUpdate', + 'creationDate', + 'submittingUser', + ], + properties={ + 'type': JsonSchema(type=JsonSchemaType.STRING, enum=['investigation']), + 'compact': JsonSchema(type=JsonSchemaType.STRING, enum=self.stack.node.get_context('compacts')), + 'providerId': JsonSchema(type=JsonSchemaType.STRING, pattern=cc_api.UUID4_FORMAT), + 'investigationId': JsonSchema(type=JsonSchemaType.STRING), + 'jurisdiction': JsonSchema( + type=JsonSchemaType.STRING, + enum=self.stack.node.get_context('jurisdictions'), + ), + 'licenseType': JsonSchema(type=JsonSchemaType.STRING), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), + 'creationDate': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), + 'submittingUser': JsonSchema(type=JsonSchemaType.STRING), + }, + ) + @property def _common_license_properties(self) -> dict: return { diff --git a/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json index a336ff68b..a0fb58ac8 100644 --- a/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json @@ -651,6 +651,120 @@ }, "type": "array" }, + "investigations": { + "items": { + "properties": { + "type": { + "enum": [ + "investigation" + ], + "type": "string" + }, + "compact": { + "enum": [ + "aslp", + "octp", + "coun" + ], + "type": "string" + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "investigationId": { + "type": "string" + }, + "jurisdiction": { + "enum": [ + "al", + "ak", + "az", + "ar", + "ca", + "co", + "ct", + "de", + "dc", + "fl", + "ga", + "hi", + "id", + "il", + "in", + "ia", + "ks", + "ky", + "la", + "me", + "md", + "ma", + "mi", + "mn", + "ms", + "mo", + "mt", + "ne", + "nv", + "nh", + "nj", + "nm", + "ny", + "nc", + "nd", + "oh", + "ok", + "or", + "pa", + "pr", + "ri", + "sc", + "sd", + "tn", + "tx", + "ut", + "vt", + "va", + "vi", + "wa", + "wv", + "wi", + "wy" + ], + "type": "string" + }, + "licenseType": { + "type": "string" + }, + "dateOfUpdate": { + "format": "date", + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string" + }, + "creationDate": { + "format": "date", + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string" + }, + "submittingUser": { + "type": "string" + } + }, + "required": [ + "type", + "compact", + "providerId", + "investigationId", + "jurisdiction", + "licenseType", + "dateOfUpdate", + "creationDate", + "submittingUser" + ], + "type": "object" + }, + "type": "array" + }, "npi": { "pattern": "^[0-9]{10}$", "type": "string" @@ -1457,6 +1571,120 @@ }, "type": "array" }, + "investigations": { + "items": { + "properties": { + "type": { + "enum": [ + "investigation" + ], + "type": "string" + }, + "compact": { + "enum": [ + "aslp", + "octp", + "coun" + ], + "type": "string" + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "investigationId": { + "type": "string" + }, + "jurisdiction": { + "enum": [ + "al", + "ak", + "az", + "ar", + "ca", + "co", + "ct", + "de", + "dc", + "fl", + "ga", + "hi", + "id", + "il", + "in", + "ia", + "ks", + "ky", + "la", + "me", + "md", + "ma", + "mi", + "mn", + "ms", + "mo", + "mt", + "ne", + "nv", + "nh", + "nj", + "nm", + "ny", + "nc", + "nd", + "oh", + "ok", + "or", + "pa", + "pr", + "ri", + "sc", + "sd", + "tn", + "tx", + "ut", + "vt", + "va", + "vi", + "wa", + "wv", + "wi", + "wy" + ], + "type": "string" + }, + "licenseType": { + "type": "string" + }, + "dateOfUpdate": { + "format": "date", + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string" + }, + "creationDate": { + "format": "date", + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string" + }, + "submittingUser": { + "type": "string" + } + }, + "required": [ + "type", + "compact", + "providerId", + "investigationId", + "jurisdiction", + "licenseType", + "dateOfUpdate", + "creationDate", + "submittingUser" + ], + "type": "object" + }, + "type": "array" + }, "type": { "enum": [ "privilege" diff --git a/backend/compact-connect/tests/resources/snapshots/LICENSE_ENCUMBRANCE_REQUEST_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/LICENSE_ENCUMBRANCE_REQUEST_SCHEMA.json index c46321a5a..eeb1e2ffe 100644 --- a/backend/compact-connect/tests/resources/snapshots/LICENSE_ENCUMBRANCE_REQUEST_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/LICENSE_ENCUMBRANCE_REQUEST_SCHEMA.json @@ -1,5 +1,6 @@ { "additionalProperties": false, + "description": "Encumbrance data to create", "properties": { "encumbranceEffectiveDate": { "description": "The effective date of the encumbrance", diff --git a/backend/compact-connect/tests/resources/snapshots/PRIVILEGE_ENCUMBRANCE_REQUEST_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/PRIVILEGE_ENCUMBRANCE_REQUEST_SCHEMA.json index c46321a5a..eeb1e2ffe 100644 --- a/backend/compact-connect/tests/resources/snapshots/PRIVILEGE_ENCUMBRANCE_REQUEST_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/PRIVILEGE_ENCUMBRANCE_REQUEST_SCHEMA.json @@ -1,5 +1,6 @@ { "additionalProperties": false, + "description": "Encumbrance data to create", "properties": { "encumbranceEffectiveDate": { "description": "The effective date of the encumbrance", diff --git a/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json index a336ff68b..a0fb58ac8 100644 --- a/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json @@ -651,6 +651,120 @@ }, "type": "array" }, + "investigations": { + "items": { + "properties": { + "type": { + "enum": [ + "investigation" + ], + "type": "string" + }, + "compact": { + "enum": [ + "aslp", + "octp", + "coun" + ], + "type": "string" + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "investigationId": { + "type": "string" + }, + "jurisdiction": { + "enum": [ + "al", + "ak", + "az", + "ar", + "ca", + "co", + "ct", + "de", + "dc", + "fl", + "ga", + "hi", + "id", + "il", + "in", + "ia", + "ks", + "ky", + "la", + "me", + "md", + "ma", + "mi", + "mn", + "ms", + "mo", + "mt", + "ne", + "nv", + "nh", + "nj", + "nm", + "ny", + "nc", + "nd", + "oh", + "ok", + "or", + "pa", + "pr", + "ri", + "sc", + "sd", + "tn", + "tx", + "ut", + "vt", + "va", + "vi", + "wa", + "wv", + "wi", + "wy" + ], + "type": "string" + }, + "licenseType": { + "type": "string" + }, + "dateOfUpdate": { + "format": "date", + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string" + }, + "creationDate": { + "format": "date", + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string" + }, + "submittingUser": { + "type": "string" + } + }, + "required": [ + "type", + "compact", + "providerId", + "investigationId", + "jurisdiction", + "licenseType", + "dateOfUpdate", + "creationDate", + "submittingUser" + ], + "type": "object" + }, + "type": "array" + }, "npi": { "pattern": "^[0-9]{10}$", "type": "string" @@ -1457,6 +1571,120 @@ }, "type": "array" }, + "investigations": { + "items": { + "properties": { + "type": { + "enum": [ + "investigation" + ], + "type": "string" + }, + "compact": { + "enum": [ + "aslp", + "octp", + "coun" + ], + "type": "string" + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "investigationId": { + "type": "string" + }, + "jurisdiction": { + "enum": [ + "al", + "ak", + "az", + "ar", + "ca", + "co", + "ct", + "de", + "dc", + "fl", + "ga", + "hi", + "id", + "il", + "in", + "ia", + "ks", + "ky", + "la", + "me", + "md", + "ma", + "mi", + "mn", + "ms", + "mo", + "mt", + "ne", + "nv", + "nh", + "nj", + "nm", + "ny", + "nc", + "nd", + "oh", + "ok", + "or", + "pa", + "pr", + "ri", + "sc", + "sd", + "tn", + "tx", + "ut", + "vt", + "va", + "vi", + "wa", + "wv", + "wi", + "wy" + ], + "type": "string" + }, + "licenseType": { + "type": "string" + }, + "dateOfUpdate": { + "format": "date", + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string" + }, + "creationDate": { + "format": "date", + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string" + }, + "submittingUser": { + "type": "string" + } + }, + "required": [ + "type", + "compact", + "providerId", + "investigationId", + "jurisdiction", + "licenseType", + "dateOfUpdate", + "creationDate", + "submittingUser" + ], + "type": "object" + }, + "type": "array" + }, "type": { "enum": [ "privilege" diff --git a/backend/compact-connect/tests/smoke/investigation_smoke_tests.py b/backend/compact-connect/tests/smoke/investigation_smoke_tests.py old mode 100644 new mode 100755 index 96ba9f5c3..8da04b402 --- a/backend/compact-connect/tests/smoke/investigation_smoke_tests.py +++ b/backend/compact-connect/tests/smoke/investigation_smoke_tests.py @@ -9,7 +9,6 @@ import time import requests -from purchasing_privileges_smoke_tests import test_purchasing_privilege from smoke_common import ( SmokeTestFailureException, call_provider_users_me_endpoint, @@ -27,65 +26,95 @@ def clean_investigation_records(): """ - Clean up any existing investigation records for the provider to start in a clean state. + Clean up any existing investigation and encumbrance records for the provider to start in a clean state. """ - logger.info('Cleaning up existing investigation records...') + logger.info('Cleaning up existing investigation and encumbrance records...') # Get all provider database records all_records = get_all_provider_database_records() - # Filter for investigation records + for record in all_records: + if record.get('type') == 'license' or record.get('type') == 'privilege': + if record.get('investigationStatus') == 'underInvestigation': + logger.info( + f'Removing investigation and encumbrance status from {record.get("type")} ' + f'{record.get("pk")} / {record.get("sk")}' + ) + dynamodb_table = get_provider_user_dynamodb_table() + dynamodb_table.update_item( + Key={'pk': record['pk'], 'sk': record['sk']}, + UpdateExpression='REMOVE investigationStatus, REMOVE encumbranceStatus', + ) + + # Filter for investigation and encumbrance records investigation_records = [record for record in all_records if record.get('type') == 'investigation'] + encumbrance_records = [record for record in all_records if record.get('type') == 'adverseAction'] - if not investigation_records: - logger.info('No investigation records found to clean up') + # Filter for investigation and encumbrance update records + investigation_update_records = [ + record + for record in all_records + if record.get('type') in ['privilegeUpdate', 'licenseUpdate'] and record.get('updateType') == 'investigation' + ] + encumbrance_update_records = [ + record + for record in all_records + if record.get('type') in ['privilegeUpdate', 'licenseUpdate'] and record.get('updateType') == 'encumbrance' + ] + + if ( + not investigation_records + and not encumbrance_records + and not investigation_update_records + and not encumbrance_update_records + ): + logger.info('No investigation or encumbrance records found to clean up') return - # Delete each investigation record + # Delete each investigation and encumbrance record dynamodb_table = get_provider_user_dynamodb_table() + for record in investigation_records: pk = record['pk'] sk = record['sk'] logger.info(f'Deleting investigation record: {pk} / {sk}') dynamodb_table.delete_item(Key={'pk': pk, 'sk': sk}) - logger.info(f'Cleaned up {len(investigation_records)} investigation records') + for record in encumbrance_records: + pk = record['pk'] + sk = record['sk'] + logger.info(f'Deleting encumbrance record: {pk} / {sk}') + dynamodb_table.delete_item(Key={'pk': pk, 'sk': sk}) + for record in investigation_update_records: + pk = record['pk'] + sk = record['sk'] + logger.info(f'Deleting investigation update record: {pk} / {sk}') + dynamodb_table.delete_item(Key={'pk': pk, 'sk': sk}) -def _remove_investigation_status_from_license_and_privilege(): - """Remove investigation status from license and privilege records.""" - # Get all provider database records - all_records = get_all_provider_database_records() + for record in encumbrance_update_records: + pk = record['pk'] + sk = record['sk'] + logger.info(f'Deleting encumbrance update record: {pk} / {sk}') + dynamodb_table.delete_item(Key={'pk': pk, 'sk': sk}) - for record in all_records: - if record.get('type') == 'license' or record.get('type') == 'privilege': - if record.get('investigationStatus') == 'underInvestigation': - logger.info( - f'Removing investigation status from {record.get("type")} {record.get("pk")} / {record.get("sk")}' - ) - dynamodb_table = get_provider_user_dynamodb_table() - dynamodb_table.update_item( - Key={'pk': record['pk'], 'sk': record['sk']}, - UpdateExpression='REMOVE investigationStatus', - ) + logger.info( + f'Cleaned up {len(investigation_records)} investigation records, ' + f'{len(encumbrance_records)} encumbrance records, ' + f'{len(investigation_update_records)} investigation update records, and ' + f'{len(encumbrance_update_records)} encumbrance update records' + ) def setup_test_environment(): """ - Set up the test environment by cleaning investigations and purchasing a privilege. + Set up the test environment by cleaning investigations. """ logger.info('Setting up test environment...') # Clean up any existing investigations clean_investigation_records() - # Remove investigation status from license and privilege if present - _remove_investigation_status_from_license_and_privilege() - - # Purchase a privilege to ensure we have one to test with - logger.info('Purchasing a privilege for testing...') - test_purchasing_privilege() - logger.info('Test environment setup complete') @@ -113,29 +142,109 @@ def _get_privilege_data_from_provider_response(provider_data: dict, jurisdiction ) -def test_create_privilege_investigation(): +def _verify_no_investigation_exists(record_type: str, jurisdiction: str, license_type: str): + """ + Verify that no open investigation records exist in the database and no investigation status or objects on the + record. + + :param record_type: 'privilege' or 'license' + :param jurisdiction: The jurisdiction of the record + :param license_type: The license type of the record + """ + # Check database for open investigation records + all_records = get_all_provider_database_records() + existing_investigations = [ + record for record in all_records if record.get('type') == 'investigation' and record.get('closeDate') is None + ] + + if existing_investigations: + raise SmokeTestFailureException('Open investigation already exists before creation test') + + # Check API for investigation status + provider_data = call_provider_users_me_endpoint() + + if record_type == 'privilege': + record_data = _get_privilege_data_from_provider_response(provider_data, jurisdiction, license_type) + else: + record_data = _get_license_data_from_provider_response(provider_data, jurisdiction, license_type) + + if not record_data: + raise SmokeTestFailureException(f'{record_type.title()} not found before investigation creation') + + if record_data.get('investigationStatus') is not None: + raise SmokeTestFailureException( + f'Expected {record_type} to not have investigation status, ' + f'but got: {record_data.get("investigationStatus")}' + ) + + if record_data.get('investigations'): + raise SmokeTestFailureException('Investigation objects still exist in API response') + + +def _verify_investigation_exists(record_type: str, jurisdiction: str, license_type: str): + """ + Verify that an open investigation exists and the record has investigation status. + + :param record_type: 'privilege' or 'license' + :param jurisdiction: The jurisdiction of the record + :param license_type: The license type of the record + :return: The investigation ID + """ + # Check database for investigation records + all_records = get_all_provider_database_records() + investigation_records = [ + record + for record in all_records + if record.get('type') == 'investigation' + and record.get('investigationAgainst') == record_type + and record.get('jurisdiction') == jurisdiction + and record.get('licenseType') == license_type + and record.get('closeDate') is None + ] + + if not investigation_records: + raise SmokeTestFailureException(f'No open {record_type} investigation found to close') + + # Check API for investigation status + provider_data = call_provider_users_me_endpoint() + + if record_type == 'privilege': + record_data = _get_privilege_data_from_provider_response(provider_data, jurisdiction, license_type) + else: + record_data = _get_license_data_from_provider_response(provider_data, jurisdiction, license_type) + + if not record_data: + raise SmokeTestFailureException(f'{record_type.title()} not found before investigation closing') + + if record_data.get('investigationStatus') != 'underInvestigation': + raise SmokeTestFailureException( + f'Expected {record_type} to have investigation status "underInvestigation" before closing, ' + f'but got: {record_data.get("investigationStatus")}' + ) + + if not record_data.get('investigations'): + raise SmokeTestFailureException('Investigation object not found in API response before closing') + + return investigation_records[0]['investigationId'] + + +def test_create_privilege_investigation(auth_headers): """Test creating a privilege investigation.""" logger.info('Testing privilege investigation creation...') - # Get provider data provider_data = call_provider_users_me_endpoint() provider_id = provider_data['providerId'] compact = provider_data['compact'] - jurisdiction = provider_data['licenseJurisdiction'] - license_type = provider_data['licenses'][0]['licenseType'] - license_type_abbreviation = get_license_type_abbreviation(compact, license_type) + jurisdiction = provider_data['privileges'][0]['jurisdiction'] + license_type = provider_data['privileges'][0]['licenseType'] + license_type_abbreviation = get_license_type_abbreviation(license_type) - # Get staff user auth headers - auth_headers = get_staff_user_auth_headers() - - # Create investigation - investigation_data = { - 'investigationStartDate': '2024-01-01', - } + _verify_no_investigation_exists('privilege', jurisdiction, license_type) + # Create investigation (no body required) response = requests.post( - f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation', - json=investigation_data, + f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}' + f'/licenseType/{license_type_abbreviation}/investigation', headers=auth_headers, timeout=30, ) @@ -147,48 +256,29 @@ def test_create_privilege_investigation(): logger.info('Privilege investigation created successfully') - # Wait for the investigation to be processed + # Wait for the investigation to be processed and DynamoDB eventual consistency time.sleep(5) - # Verify the privilege now has investigation status - updated_provider_data = call_provider_users_me_endpoint() - privilege_data = _get_privilege_data_from_provider_response(updated_provider_data, jurisdiction, license_type) - - if not privilege_data: - raise SmokeTestFailureException('Privilege not found after investigation creation') - - if privilege_data.get('investigationStatus') != 'underInvestigation': - status = privilege_data.get("investigationStatus") - raise SmokeTestFailureException( - f'Expected privilege to have investigation status "underInvestigation", but got: {status}' - ) - - logger.info('Privilege investigation status verified successfully') + _verify_investigation_exists('privilege', jurisdiction, license_type) -def test_create_license_investigation(): +def test_create_license_investigation(auth_headers): """Test creating a license investigation.""" logger.info('Testing license investigation creation...') - # Get provider data provider_data = call_provider_users_me_endpoint() provider_id = provider_data['providerId'] compact = provider_data['compact'] jurisdiction = provider_data['licenseJurisdiction'] license_type = provider_data['licenses'][0]['licenseType'] - license_type_abbreviation = get_license_type_abbreviation(compact, license_type) - - # Get staff user auth headers - auth_headers = get_staff_user_auth_headers() + license_type_abbreviation = get_license_type_abbreviation(license_type) - # Create investigation - investigation_data = { - 'investigationStartDate': '2024-01-01', - } + _verify_no_investigation_exists('license', jurisdiction, license_type) + # Create investigation (no body required) response = requests.post( - f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/licenses/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation', - json=investigation_data, + f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/licenses/jurisdiction/{jurisdiction}' + f'/licenseType/{license_type_abbreviation}/investigation', headers=auth_headers, timeout=30, ) @@ -200,64 +290,30 @@ def test_create_license_investigation(): logger.info('License investigation created successfully') - # Wait for the investigation to be processed + # Wait for the investigation to be processed and DynamoDB eventual consistency time.sleep(5) - # Verify the license now has investigation status - updated_provider_data = call_provider_users_me_endpoint() - license_data = _get_license_data_from_provider_response(updated_provider_data, jurisdiction, license_type) - - if not license_data: - raise SmokeTestFailureException('License not found after investigation creation') - - if license_data.get('investigationStatus') != 'underInvestigation': - status = license_data.get("investigationStatus") - raise SmokeTestFailureException( - f'Expected license to have investigation status "underInvestigation", but got: {status}' - ) - - logger.info('License investigation status verified successfully') + _verify_investigation_exists('license', jurisdiction, license_type) -def test_close_privilege_investigation(): +def test_close_privilege_investigation(auth_headers): """Test closing a privilege investigation.""" logger.info('Testing privilege investigation closing...') - # Get provider data provider_data = call_provider_users_me_endpoint() provider_id = provider_data['providerId'] compact = provider_data['compact'] - jurisdiction = provider_data['licenseJurisdiction'] - license_type = provider_data['licenses'][0]['licenseType'] - license_type_abbreviation = get_license_type_abbreviation(compact, license_type) - - # Get staff user auth headers - auth_headers = get_staff_user_auth_headers() - - # Get investigation ID from database - all_records = get_all_provider_database_records() - investigation_records = [ - record - for record in all_records - if record.get('type') == 'investigation' - and record.get('investigationAgainst') == 'privilege' - and record.get('jurisdiction') == jurisdiction - and record.get('licenseType') == license_type - ] - - if not investigation_records: - raise SmokeTestFailureException('No privilege investigation found to close') + jurisdiction = provider_data['privileges'][0]['jurisdiction'] + license_type = provider_data['privileges'][0]['licenseType'] + license_type_abbreviation = get_license_type_abbreviation(license_type) - investigation_id = investigation_records[0]['investigationId'] - - # Close investigation - close_data = { - 'investigationCloseDate': '2024-01-15', - } + investigation_id = _verify_investigation_exists('privilege', jurisdiction, license_type) + # Close investigation (empty JSON body) response = requests.patch( - f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation/{investigation_id}', - json=close_data, + f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}' + f'/licenseType/{license_type_abbreviation}/investigation/{investigation_id}', + json={}, headers=auth_headers, timeout=30, ) @@ -269,64 +325,31 @@ def test_close_privilege_investigation(): logger.info('Privilege investigation closed successfully') - # Wait for the investigation to be processed + # Wait for the investigation to be processed and DynamoDB eventual consistency time.sleep(5) - # Verify the privilege no longer has investigation status - updated_provider_data = call_provider_users_me_endpoint() - privilege_data = _get_privilege_data_from_provider_response(updated_provider_data, jurisdiction, license_type) + _verify_no_investigation_exists('privilege', jurisdiction, license_type) - if not privilege_data: - raise SmokeTestFailureException('Privilege not found after investigation closing') - if privilege_data.get('investigationStatus') is not None: - raise SmokeTestFailureException( - f'Expected privilege to not have investigation status, but got: {privilege_data.get("investigationStatus")}' - ) - - logger.info('Privilege investigation closing verified successfully') - - -def test_close_license_investigation(): +def test_close_license_investigation(auth_headers): """Test closing a license investigation.""" logger.info('Testing license investigation closing...') - # Get provider data provider_data = call_provider_users_me_endpoint() provider_id = provider_data['providerId'] compact = provider_data['compact'] jurisdiction = provider_data['licenseJurisdiction'] license_type = provider_data['licenses'][0]['licenseType'] - license_type_abbreviation = get_license_type_abbreviation(compact, license_type) - - # Get staff user auth headers - auth_headers = get_staff_user_auth_headers() - - # Get investigation ID from database - all_records = get_all_provider_database_records() - investigation_records = [ - record - for record in all_records - if record.get('type') == 'investigation' - and record.get('investigationAgainst') == 'license' - and record.get('jurisdiction') == jurisdiction - and record.get('licenseType') == license_type - ] + license_type_abbreviation = get_license_type_abbreviation(license_type) - if not investigation_records: - raise SmokeTestFailureException('No license investigation found to close') - - investigation_id = investigation_records[0]['investigationId'] - - # Close investigation - close_data = { - 'investigationCloseDate': '2024-01-15', - } + investigation_id = _verify_investigation_exists('license', jurisdiction, license_type) + # Close investigation (empty JSON body) response = requests.patch( - f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/licenses/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation/{investigation_id}', - json=close_data, + f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/licenses/jurisdiction/{jurisdiction}' + f'/licenseType/{license_type_abbreviation}/investigation/{investigation_id}', headers=auth_headers, + json={}, timeout=30, ) @@ -337,88 +360,46 @@ def test_close_license_investigation(): logger.info('License investigation closed successfully') - # Wait for the investigation to be processed + # Wait for the investigation to be processed and DynamoDB eventual consistency time.sleep(5) - # Verify the license no longer has investigation status - updated_provider_data = call_provider_users_me_endpoint() - license_data = _get_license_data_from_provider_response(updated_provider_data, jurisdiction, license_type) + _verify_no_investigation_exists('license', jurisdiction, license_type) - if not license_data: - raise SmokeTestFailureException('License not found after investigation closing') - - if license_data.get('investigationStatus') is not None: - raise SmokeTestFailureException( - f'Expected license to not have investigation status, but got: {license_data.get("investigationStatus")}' - ) - logger.info('License investigation closing verified successfully') - - -def test_close_privilege_investigation_with_encumbrance(): +def test_close_privilege_investigation_with_encumbrance(auth_headers): """Test closing a privilege investigation with encumbrance creation.""" logger.info('Testing privilege investigation closing with encumbrance...') - # Get provider data provider_data = call_provider_users_me_endpoint() provider_id = provider_data['providerId'] compact = provider_data['compact'] - jurisdiction = provider_data['licenseJurisdiction'] - license_type = provider_data['licenses'][0]['licenseType'] - license_type_abbreviation = get_license_type_abbreviation(compact, license_type) - - # Get staff user auth headers - auth_headers = get_staff_user_auth_headers() + jurisdiction = provider_data['privileges'][0]['jurisdiction'] + license_type = provider_data['privileges'][0]['licenseType'] + license_type_abbreviation = get_license_type_abbreviation(license_type) - # Create a new investigation first - investigation_data = { - 'investigationStartDate': '2024-01-01', - } - - response = requests.post( - f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation', - json=investigation_data, - headers=auth_headers, - timeout=30, - ) + # Verify initial state: an open investigation should exist + investigation_id = _verify_investigation_exists('privilege', jurisdiction, license_type) - if response.status_code != 200: + # Verify privilege is not already encumbered (no adverse actions) + privilege_data = _get_privilege_data_from_provider_response(provider_data, jurisdiction, license_type) + if privilege_data.get('adverseActions'): raise SmokeTestFailureException( - f'Failed to create privilege investigation: {response.status_code} - {response.text}' + f'Expected privilege to not have adverse actions before closing with encumbrance, ' + f'but got: {privilege_data.get("adverseActions")}' ) - # Wait for the investigation to be processed - time.sleep(5) - - # Get investigation ID from database - all_records = get_all_provider_database_records() - investigation_records = [ - record - for record in all_records - if record.get('type') == 'investigation' - and record.get('investigationAgainst') == 'privilege' - and record.get('jurisdiction') == jurisdiction - and record.get('licenseType') == license_type - and record.get('investigationCloseDate') is None - ] - - if not investigation_records: - raise SmokeTestFailureException('No open privilege investigation found to close') - - investigation_id = investigation_records[0]['investigationId'] - # Close investigation with encumbrance close_data = { - 'investigationCloseDate': '2024-01-15', 'encumbrance': { 'encumbranceEffectiveDate': '2024-01-15', 'encumbranceType': 'fine', - 'clinicalPrivilegeActionCategory': 'restriction', + 'clinicalPrivilegeActionCategory': 'Unsafe Practice or Substandard Care', }, } response = requests.patch( - f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}/licenseType/{license_type_abbreviation}/investigation/{investigation_id}', + f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}' + f'/licenseType/{license_type_abbreviation}/investigation/{investigation_id}', json=close_data, headers=auth_headers, timeout=30, @@ -431,25 +412,18 @@ def test_close_privilege_investigation_with_encumbrance(): logger.info('Privilege investigation closed with encumbrance successfully') - # Wait for the investigation to be processed + # Wait for the investigation to be processed and DynamoDB eventual consistency time.sleep(5) - # Verify the privilege no longer has investigation status - updated_provider_data = call_provider_users_me_endpoint() - privilege_data = _get_privilege_data_from_provider_response(updated_provider_data, jurisdiction, license_type) - - if not privilege_data: - raise SmokeTestFailureException('Privilege not found after investigation closing') - - if privilege_data.get('investigationStatus') is not None: - raise SmokeTestFailureException( - f'Expected privilege to not have investigation status, but got: {privilege_data.get("investigationStatus")}' - ) + _verify_no_investigation_exists('privilege', jurisdiction, license_type) + # Verify encumbrance was created (adverse action exists) + provider_data = call_provider_users_me_endpoint() + privilege_data = _get_privilege_data_from_provider_response(provider_data, jurisdiction, license_type) - # Verify encumbrance was created - if privilege_data.get('encumberedStatus') != 'encumbered': + if not privilege_data.get('adverseActions'): raise SmokeTestFailureException( - f'Expected privilege to be encumbered, but got: {privilege_data.get("encumberedStatus")}' + f'Expected privilege to have adverse actions after closing with encumbrance, ' + f'but got: {privilege_data.get("adverseActions")}' ) logger.info('Privilege investigation closing with encumbrance verified successfully') @@ -459,6 +433,10 @@ def main(): """Run all investigation smoke tests.""" logger.info('Starting investigation smoke tests...') + # Initialize variables for cleanup + staff_user_email = None + staff_user_sub = None + try: # Load test environment load_smoke_test_env() @@ -467,29 +445,42 @@ def main(): setup_test_environment() # Create test staff user - create_test_staff_user() + staff_user_email = 'test-investigation-admin@example.com' + staff_user_sub = create_test_staff_user( + email=staff_user_email, + compact='aslp', + jurisdiction='ne', + permissions={'actions': {'admin'}, 'jurisdictions': {'ne': {'admin'}, 'co': {'admin'}, 'ky': {'admin'}}}, + ) - # Run tests - test_create_privilege_investigation() - test_close_privilege_investigation() + # Get staff user auth headers once for reuse + auth_headers = get_staff_user_auth_headers(staff_user_email) - # Set up for license investigation tests + # Run tests setup_test_environment() - test_create_license_investigation() - test_close_license_investigation() + test_create_privilege_investigation(auth_headers) + test_close_privilege_investigation(auth_headers) # Test closing with encumbrance setup_test_environment() - test_close_privilege_investigation_with_encumbrance() + test_create_privilege_investigation(auth_headers) + test_close_privilege_investigation_with_encumbrance(auth_headers) - logger.info('All investigation smoke tests passed!') + # Test closing a license investigation + setup_test_environment() + test_create_license_investigation(auth_headers) + test_close_license_investigation(auth_headers) except Exception as e: logger.error(f'Investigation smoke tests failed: {str(e)}') raise finally: # Clean up test staff user - delete_test_staff_user() + if staff_user_email and staff_user_sub: + delete_test_staff_user(staff_user_email, staff_user_sub, 'aslp') + clean_investigation_records() + + logger.info('All investigation smoke tests passed!') if __name__ == '__main__': From d5d23aea4f6820cf74d65b31db3d3f09342ce083 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Tue, 21 Oct 2025 09:49:17 -0600 Subject: [PATCH 06/33] Update api docs --- .../api-specification/latest-oas30.json | 1092 ++++++++++--- .../internal/postman/postman-collection.json | 1352 ++++++++++++----- .../docs/postman/postman-collection.json | 38 +- 3 files changed, 1936 insertions(+), 546 deletions(-) diff --git a/backend/compact-connect/docs/internal/api-specification/latest-oas30.json b/backend/compact-connect/docs/internal/api-specification/latest-oas30.json index ca3814bff..ebe7e6b1b 100644 --- a/backend/compact-connect/docs/internal/api-specification/latest-oas30.json +++ b/backend/compact-connect/docs/internal/api-specification/latest-oas30.json @@ -2,7 +2,7 @@ "openapi": "3.0.1", "info": { "title": "LicenseApi", - "version": "2025-10-10T20:12:46Z" + "version": "2025-10-18T00:04:47Z" }, "servers": [ { @@ -478,7 +478,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenMiDI81d6EYvq" + "$ref": "#/components/schemas/SandboLicenho2LdLilGqAc" } } } @@ -938,6 +938,216 @@ ] } }, + "/v1/compacts/{compact}/providers/{providerId}/licenses/jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation": { + "post": { + "parameters": [ + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "compact", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "jurisdiction", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "licenseType", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboLicengeanQqZ1NjKt" + } + } + } + } + }, + "security": [ + { + "SandboxAPIStackLicenseApiStaffUsersPoolAuthorizer14A84A9B": [ + "aslp/admin", + "al/aslp.admin", + "ak/aslp.admin", + "ar/aslp.admin", + "co/aslp.admin", + "de/aslp.admin", + "ky/aslp.admin", + "la/aslp.admin", + "me/aslp.admin", + "md/aslp.admin", + "mn/aslp.admin", + "ms/aslp.admin", + "mo/aslp.admin", + "ne/aslp.admin", + "oh/aslp.admin", + "octp/admin", + "al/octp.admin", + "ar/octp.admin", + "ky/octp.admin", + "la/octp.admin", + "ms/octp.admin", + "ne/octp.admin", + "oh/octp.admin", + "coun/admin", + "al/coun.admin", + "ar/coun.admin", + "fl/coun.admin", + "ga/coun.admin", + "ky/coun.admin", + "ne/coun.admin", + "oh/coun.admin", + "ut/coun.admin" + ] + } + ] + } + }, + "/v1/compacts/{compact}/providers/{providerId}/licenses/jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation/{investigationId}": { + "patch": { + "parameters": [ + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "compact", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "jurisdiction", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "licenseType", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "investigationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboLicenvJ6cvnUE8Wwa" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboLicengeanQqZ1NjKt" + } + } + } + } + }, + "security": [ + { + "SandboxAPIStackLicenseApiStaffUsersPoolAuthorizer14A84A9B": [ + "aslp/admin", + "al/aslp.admin", + "ak/aslp.admin", + "ar/aslp.admin", + "co/aslp.admin", + "de/aslp.admin", + "ky/aslp.admin", + "la/aslp.admin", + "me/aslp.admin", + "md/aslp.admin", + "mn/aslp.admin", + "ms/aslp.admin", + "mo/aslp.admin", + "ne/aslp.admin", + "oh/aslp.admin", + "octp/admin", + "al/octp.admin", + "ar/octp.admin", + "ky/octp.admin", + "la/octp.admin", + "ms/octp.admin", + "ne/octp.admin", + "oh/octp.admin", + "coun/admin", + "al/coun.admin", + "ar/coun.admin", + "fl/coun.admin", + "ga/coun.admin", + "ky/coun.admin", + "ne/coun.admin", + "oh/coun.admin", + "ut/coun.admin" + ] + } + ] + } + }, "/v1/compacts/{compact}/providers/{providerId}/privileges/jurisdiction/{jurisdiction}/licenseType/{licenseType}/deactivate": { "post": { "parameters": [ @@ -1044,7 +1254,294 @@ ] } }, - "/v1/compacts/{compact}/providers/{providerId}/privileges/jurisdiction/{jurisdiction}/licenseType/{licenseType}/encumbrance": { + "/v1/compacts/{compact}/providers/{providerId}/privileges/jurisdiction/{jurisdiction}/licenseType/{licenseType}/encumbrance": { + "post": { + "parameters": [ + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "compact", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "jurisdiction", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "licenseType", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboLicen6bEbVSG2KkBx" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboLicengeanQqZ1NjKt" + } + } + } + } + }, + "security": [ + { + "SandboxAPIStackLicenseApiStaffUsersPoolAuthorizer14A84A9B": [ + "aslp/admin", + "al/aslp.admin", + "ak/aslp.admin", + "ar/aslp.admin", + "co/aslp.admin", + "de/aslp.admin", + "ky/aslp.admin", + "la/aslp.admin", + "me/aslp.admin", + "md/aslp.admin", + "mn/aslp.admin", + "ms/aslp.admin", + "mo/aslp.admin", + "ne/aslp.admin", + "oh/aslp.admin", + "octp/admin", + "al/octp.admin", + "ar/octp.admin", + "ky/octp.admin", + "la/octp.admin", + "ms/octp.admin", + "ne/octp.admin", + "oh/octp.admin", + "coun/admin", + "al/coun.admin", + "ar/coun.admin", + "fl/coun.admin", + "ga/coun.admin", + "ky/coun.admin", + "ne/coun.admin", + "oh/coun.admin", + "ut/coun.admin" + ] + } + ] + } + }, + "/v1/compacts/{compact}/providers/{providerId}/privileges/jurisdiction/{jurisdiction}/licenseType/{licenseType}/encumbrance/{encumbranceId}": { + "patch": { + "parameters": [ + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "compact", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "jurisdiction", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "licenseType", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "encumbranceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboLicenVZHLGnXN7APB" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboLicengeanQqZ1NjKt" + } + } + } + } + }, + "security": [ + { + "SandboxAPIStackLicenseApiStaffUsersPoolAuthorizer14A84A9B": [ + "aslp/admin", + "al/aslp.admin", + "ak/aslp.admin", + "ar/aslp.admin", + "co/aslp.admin", + "de/aslp.admin", + "ky/aslp.admin", + "la/aslp.admin", + "me/aslp.admin", + "md/aslp.admin", + "mn/aslp.admin", + "ms/aslp.admin", + "mo/aslp.admin", + "ne/aslp.admin", + "oh/aslp.admin", + "octp/admin", + "al/octp.admin", + "ar/octp.admin", + "ky/octp.admin", + "la/octp.admin", + "ms/octp.admin", + "ne/octp.admin", + "oh/octp.admin", + "coun/admin", + "al/coun.admin", + "ar/coun.admin", + "fl/coun.admin", + "ga/coun.admin", + "ky/coun.admin", + "ne/coun.admin", + "oh/coun.admin", + "ut/coun.admin" + ] + } + ] + } + }, + "/v1/compacts/{compact}/providers/{providerId}/privileges/jurisdiction/{jurisdiction}/licenseType/{licenseType}/history": { + "get": { + "parameters": [ + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "compact", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "providerId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "jurisdiction", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "licenseType", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboLicenobivPmYh5SvH" + } + } + } + } + }, + "security": [ + { + "SandboxAPIStackLicenseApiStaffUsersPoolAuthorizer14A84A9B": [ + "aslp/readGeneral", + "octp/readGeneral", + "coun/readGeneral" + ] + } + ] + } + }, + "/v1/compacts/{compact}/providers/{providerId}/privileges/jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation": { "post": { "parameters": [ { @@ -1088,16 +1585,6 @@ } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SandboLicen6bEbVSG2KkBx" - } - } - }, - "required": true - }, "responses": { "200": { "description": "200 response", @@ -1150,7 +1637,7 @@ ] } }, - "/v1/compacts/{compact}/providers/{providerId}/privileges/jurisdiction/{jurisdiction}/licenseType/{licenseType}/encumbrance/{encumbranceId}": { + "/v1/compacts/{compact}/providers/{providerId}/privileges/jurisdiction/{jurisdiction}/licenseType/{licenseType}/investigation/{investigationId}": { "patch": { "parameters": [ { @@ -1194,7 +1681,7 @@ } }, { - "name": "encumbranceId", + "name": "investigationId", "in": "path", "required": true, "schema": { @@ -1206,7 +1693,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenVZHLGnXN7APB" + "$ref": "#/components/schemas/SandboLicenmwNUQ4l5yt99" } } }, @@ -1264,73 +1751,6 @@ ] } }, - "/v1/compacts/{compact}/providers/{providerId}/privileges/jurisdiction/{jurisdiction}/licenseType/{licenseType}/history": { - "get": { - "parameters": [ - { - "name": "Authorization", - "in": "header", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "compact", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "providerId", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "jurisdiction", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "licenseType", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "200 response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SandboLicenobivPmYh5SvH" - } - } - } - } - }, - "security": [ - { - "SandboxAPIStackLicenseApiStaffUsersPoolAuthorizer14A84A9B": [ - "aslp/readGeneral", - "octp/readGeneral", - "coun/readGeneral" - ] - } - ] - } - }, "/v1/compacts/{compact}/providers/{providerId}/ssn": { "get": { "parameters": [ @@ -1925,7 +2345,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicenJJIxiEwTVetd" + "$ref": "#/components/schemas/SandboLicenHVkU4oNl0nsF" } } }, @@ -1937,7 +2357,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SandboLicen9LUz5xMGHXhV" + "$ref": "#/components/schemas/SandboLicen0ONaFbyAwP9V" } } } @@ -2640,6 +3060,54 @@ }, "additionalProperties": false }, + "SandboLicenvJ6cvnUE8Wwa": { + "type": "object", + "properties": { + "encumbrance": { + "required": [ + "clinicalPrivilegeActionCategory", + "encumbranceEffectiveDate", + "encumbranceType" + ], + "type": "object", + "properties": { + "encumbranceEffectiveDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "description": "The effective date of the encumbrance", + "format": "date" + }, + "encumbranceType": { + "type": "string", + "description": "The type of encumbrance", + "enum": [ + "fine", + "reprimand", + "required supervision", + "completion of continuing education", + "public reprimand", + "probation", + "injunctive action", + "suspension", + "revocation", + "denial", + "surrender of license", + "modification of previous action-extension", + "modification of previous action-reduction", + "other monitoring", + "other adjudicated action not listed" + ] + }, + "clinicalPrivilegeActionCategory": { + "type": "string", + "description": "The category of clinical privilege action" + } + }, + "additionalProperties": false, + "description": "Encumbrance data to create" + } + } + }, "SandboLicenJIK60DVCsApb": { "required": [ "upload" @@ -2706,7 +3174,8 @@ "description": "The category of clinical privilege action" } }, - "additionalProperties": false + "additionalProperties": false, + "description": "Encumbrance data to create" }, "SandboLicenVZHLGnXN7APB": { "required": [ @@ -2922,30 +3391,6 @@ } } }, - "SandboLicenMiDI81d6EYvq": { - "type": "object", - "properties": { - "message": { - "type": "string", - "description": "Message indicating success or failure" - }, - "errors": { - "type": "object", - "additionalProperties": { - "type": "object", - "additionalProperties": { - "type": "array", - "description": "List of error messages for a field", - "items": { - "type": "string" - } - }, - "description": "Errors for a specific record" - }, - "description": "Validation errors by record index" - } - } - }, "SandboLicenYwiFMNF2Vu7Z": { "required": [ "query" @@ -3113,6 +3558,30 @@ } } }, + "SandboLicenho2LdLilGqAc": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message indicating success or failure" + }, + "errors": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "array", + "description": "List of error messages for a field", + "items": { + "type": "string" + } + }, + "description": "Errors for a specific record" + }, + "description": "Validation errors by record index" + } + } + }, "SandboLicenTi9BrhAERjPp": { "required": [ "jurisdictionAdverseActionsNotificationEmails", @@ -3239,32 +3708,6 @@ }, "additionalProperties": false }, - "SandboLicenJJIxiEwTVetd": { - "type": "object", - "properties": { - "context": { - "type": "object", - "properties": { - "userId": { - "maxLength": 100, - "minLength": 1, - "type": "string", - "description": "Optional user ID for feature flag evaluation" - }, - "customAttributes": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "description": "Optional custom attributes for feature flag evaluation" - } - }, - "additionalProperties": false, - "description": "Optional context for feature flag evaluation" - } - }, - "additionalProperties": false - }, "SandboLicenBxXRobaYJSR9": { "required": [ "pagination", @@ -3793,6 +4236,32 @@ }, "additionalProperties": false }, + "SandboLicenHVkU4oNl0nsF": { + "type": "object", + "properties": { + "context": { + "type": "object", + "properties": { + "userId": { + "maxLength": 100, + "minLength": 1, + "type": "string", + "description": "Optional user ID for feature flag evaluation" + }, + "customAttributes": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Optional custom attributes for feature flag evaluation" + } + }, + "additionalProperties": false, + "description": "Optional context for feature flag evaluation" + } + }, + "additionalProperties": false + }, "SandboLicenEAecRKtirVZk": { "required": [ "clinicalPrivilegeActionCategory", @@ -3833,7 +4302,8 @@ "description": "The category of clinical privilege action" } }, - "additionalProperties": false + "additionalProperties": false, + "description": "Encumbrance data to create" }, "SandboLicendF8CsBCXAU1x": { "required": [ @@ -4945,35 +5415,95 @@ } } }, - "SandboLicenLPepHoMLi1aj": { + "SandboLicenLPepHoMLi1aj": { + "required": [ + "apiLoginId", + "processor", + "transactionKey" + ], + "type": "object", + "properties": { + "apiLoginId": { + "maxLength": 100, + "minLength": 1, + "type": "string", + "description": "The api login id for the payment processor" + }, + "transactionKey": { + "maxLength": 100, + "minLength": 1, + "type": "string", + "description": "The transaction key for the payment processor" + }, + "processor": { + "type": "string", + "description": "The type of payment processor", + "enum": [ + "authorize.net" + ] + } + }, + "additionalProperties": false + }, + "SandboLicenmwNUQ4l5yt99": { + "type": "object", + "properties": { + "encumbrance": { + "required": [ + "clinicalPrivilegeActionCategory", + "encumbranceEffectiveDate", + "encumbranceType" + ], + "type": "object", + "properties": { + "encumbranceEffectiveDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "description": "The effective date of the encumbrance", + "format": "date" + }, + "encumbranceType": { + "type": "string", + "description": "The type of encumbrance", + "enum": [ + "fine", + "reprimand", + "required supervision", + "completion of continuing education", + "public reprimand", + "probation", + "injunctive action", + "suspension", + "revocation", + "denial", + "surrender of license", + "modification of previous action-extension", + "modification of previous action-reduction", + "other monitoring", + "other adjudicated action not listed" + ] + }, + "clinicalPrivilegeActionCategory": { + "type": "string", + "description": "The category of clinical privilege action" + } + }, + "additionalProperties": false, + "description": "Encumbrance data to create" + } + } + }, + "SandboLicen0ONaFbyAwP9V": { "required": [ - "apiLoginId", - "processor", - "transactionKey" + "enabled" ], "type": "object", "properties": { - "apiLoginId": { - "maxLength": 100, - "minLength": 1, - "type": "string", - "description": "The api login id for the payment processor" - }, - "transactionKey": { - "maxLength": 100, - "minLength": 1, - "type": "string", - "description": "The transaction key for the payment processor" - }, - "processor": { - "type": "string", - "description": "The type of payment processor", - "enum": [ - "authorize.net" - ] + "enabled": { + "type": "boolean", + "description": "Whether the feature flag is enabled" } - }, - "additionalProperties": false + } }, "SandboLicenrzUhY3WW0Y7L": { "required": [ @@ -5170,18 +5700,6 @@ }, "additionalProperties": false }, - "SandboLicen9LUz5xMGHXhV": { - "required": [ - "enabled" - ], - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "description": "Whether the feature flag is enabled" - } - } - }, "SandboLicenLLx7v2Sq2Nku": { "type": "object", "properties": { @@ -6902,6 +7420,120 @@ } } }, + "investigations": { + "type": "array", + "items": { + "required": [ + "compact", + "creationDate", + "dateOfUpdate", + "investigationId", + "jurisdiction", + "licenseType", + "providerId", + "submittingUser", + "type" + ], + "type": "object", + "properties": { + "licenseType": { + "type": "string" + }, + "investigationId": { + "type": "string" + }, + "compact": { + "type": "string", + "enum": [ + "aslp", + "octp", + "coun" + ] + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "jurisdiction": { + "type": "string", + "enum": [ + "al", + "ak", + "az", + "ar", + "ca", + "co", + "ct", + "de", + "dc", + "fl", + "ga", + "hi", + "id", + "il", + "in", + "ia", + "ks", + "ky", + "la", + "me", + "md", + "ma", + "mi", + "mn", + "ms", + "mo", + "mt", + "ne", + "nv", + "nh", + "nj", + "nm", + "ny", + "nc", + "nd", + "oh", + "ok", + "or", + "pa", + "pr", + "ri", + "sc", + "sd", + "tn", + "tx", + "ut", + "vt", + "va", + "vi", + "wa", + "wv", + "wi", + "wy" + ] + }, + "submittingUser": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "investigation" + ] + }, + "creationDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "dateOfUpdate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + } + } + } + }, "history": { "type": "array", "items": { @@ -7978,6 +8610,120 @@ "minLength": 2, "type": "string" }, + "investigations": { + "type": "array", + "items": { + "required": [ + "compact", + "creationDate", + "dateOfUpdate", + "investigationId", + "jurisdiction", + "licenseType", + "providerId", + "submittingUser", + "type" + ], + "type": "object", + "properties": { + "licenseType": { + "type": "string" + }, + "investigationId": { + "type": "string" + }, + "compact": { + "type": "string", + "enum": [ + "aslp", + "octp", + "coun" + ] + }, + "providerId": { + "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab]{1}[0-9a-f]{3}-[0-9a-f]{12}", + "type": "string" + }, + "jurisdiction": { + "type": "string", + "enum": [ + "al", + "ak", + "az", + "ar", + "ca", + "co", + "ct", + "de", + "dc", + "fl", + "ga", + "hi", + "id", + "il", + "in", + "ia", + "ks", + "ky", + "la", + "me", + "md", + "ma", + "mi", + "mn", + "ms", + "mo", + "mt", + "ne", + "nv", + "nh", + "nj", + "nm", + "ny", + "nc", + "nd", + "oh", + "ok", + "or", + "pa", + "pr", + "ri", + "sc", + "sd", + "tn", + "tx", + "ut", + "vt", + "va", + "vi", + "wa", + "wv", + "wi", + "wy" + ] + }, + "submittingUser": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "investigation" + ] + }, + "creationDate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + }, + "dateOfUpdate": { + "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "type": "string", + "format": "date" + } + } + } + }, "type": { "type": "string", "enum": [ diff --git a/backend/compact-connect/docs/internal/postman/postman-collection.json b/backend/compact-connect/docs/internal/postman/postman-collection.json index 0b8e7222f..d018bf262 100644 --- a/backend/compact-connect/docs/internal/postman/postman-collection.json +++ b/backend/compact-connect/docs/internal/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "5f492f68-5627-4a3f-8743-e7c1799807b3", + "_postman_id": "c807f816-c374-4deb-9a72-738530a080e5", "description": { "content": "", "type": "text/plain" @@ -401,7 +401,7 @@ "item": [ { "event": [], - "id": "68f0420e-8442-4ef0-8571-93fc93520599", + "id": "378cab93-bd66-4bbd-980e-fe9474b6d703", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -444,7 +444,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ne\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"sc\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}", + "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"pr\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nm\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}", "code": 200, "cookie": [], "header": [ @@ -453,7 +453,7 @@ "value": "application/json" } ], - "id": "1fe7020a-cc42-497c-893a-18136710f2b3", + "id": "36f9b21a-fd80-4b42-a81b-8ba774476cc0", "name": "200 response", "originalRequest": { "body": {}, @@ -491,7 +491,7 @@ }, { "event": [], - "id": "a4321217-8afc-4bfc-818e-4cbfe1134311", + "id": "a1b76cc3-5a02-4f75-bece-5d1fa12d3792", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -505,7 +505,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"mi\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ok\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"al\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ak\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" }, "description": {}, "header": [ @@ -556,7 +556,7 @@ "value": "application/json" } ], - "id": "f9cd8109-469c-4a24-842f-204c73511e7f", + "id": "e7de36f8-bf85-40aa-905b-023d52642666", "name": "200 response", "originalRequest": { "body": { @@ -567,7 +567,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"mi\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ok\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"al\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ak\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" }, "header": [ { @@ -613,7 +613,7 @@ "item": [ { "event": [], - "id": "08a5e2f3-040d-4409-8126-5d38e5173168", + "id": "5c3070e4-3e23-4c38-a2ab-2f3b27e7ce01", "name": "/v1/compacts/:compact/attestations/:attestationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -668,7 +668,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"dateCreated\": \"\",\n \"attestationId\": \"\",\n \"compact\": \"octp\",\n \"text\": \"\",\n \"type\": \"attestation\",\n \"locale\": \"\",\n \"version\": \"\",\n \"required\": \"\"\n}", + "body": "{\n \"dateCreated\": \"\",\n \"attestationId\": \"\",\n \"compact\": \"aslp\",\n \"text\": \"\",\n \"type\": \"attestation\",\n \"locale\": \"\",\n \"version\": \"\",\n \"required\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -677,7 +677,7 @@ "value": "application/json" } ], - "id": "d02dbde3-3803-40d0-a05d-766c0c55a6cd", + "id": "e06d83bc-0b31-4a72-9c7a-5601a0996bc4", "name": "200 response", "originalRequest": { "body": {}, @@ -729,7 +729,7 @@ "item": [ { "event": [], - "id": "8983d39d-ff32-408b-86ac-8c2c898a7342", + "id": "8ccfe8ec-b13c-4499-87a4-e30df3f76681", "name": "/v1/compacts/:compact/credentials/payment-processor", "protocolProfileBehavior": { "disableBodyPruning": true @@ -796,7 +796,7 @@ "value": "application/json" } ], - "id": "9d6a6149-0100-4ac9-a844-da7b7da31eac", + "id": "0bc0308d-ac1f-40f9-b3a1-ffe528b23c46", "name": "200 response", "originalRequest": { "body": { @@ -858,7 +858,7 @@ "item": [ { "event": [], - "id": "efd220bd-7b7c-4d3a-b049-93c42cecb6bc", + "id": "e6185cd1-c402-4e17-a51a-3cfb4011367f", "name": "/v1/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -911,7 +911,7 @@ "value": "application/json" } ], - "id": "db231ae7-5140-42ca-aa4e-885ba7d7ca91", + "id": "ff8b0ae9-70a5-46a6-bbd7-0554167de9f2", "name": "200 response", "originalRequest": { "body": {}, @@ -956,7 +956,7 @@ "item": [ { "event": [], - "id": "70f9e08d-63d0-4e89-96cb-5c51cac0561d", + "id": "bf5b516c-3df7-42fb-a0bd-d5adf976fdf0", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1021,7 +1021,7 @@ "value": "application/json" } ], - "id": "42787a86-c0f1-4805-b19f-825d2c8d28f9", + "id": "0c7b4738-5a83-4362-97ca-486d65b673d2", "name": "200 response", "originalRequest": { "body": {}, @@ -1060,7 +1060,7 @@ }, { "_postman_previewlanguage": "json", - "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ],\n \"key_2\": [\n \"\",\n \"\"\n ],\n \"key_3\": [\n \"\",\n \"\"\n ]\n },\n \"key_1\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ]\n },\n \"key_2\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ],\n \"key_2\": [\n \"\",\n \"\"\n ]\n },\n \"key_3\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ],\n \"key_2\": [\n \"\",\n \"\"\n ]\n }\n }\n}", + "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ]\n }\n }\n}", "code": 400, "cookie": [], "header": [ @@ -1069,7 +1069,7 @@ "value": "application/json" } ], - "id": "7c4b8847-e4c1-4931-a4c8-8d6ea23d6ff5", + "id": "35973789-15a2-49d0-baf4-0fe4d68ab8ab", "name": "400 response", "originalRequest": { "body": {}, @@ -1138,7 +1138,7 @@ } } ], - "id": "8c27923f-5065-4a16-be71-86793a152c3d", + "id": "108f900f-6cc8-457d-90b2-f230f9060e1c", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1195,7 +1195,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"upload\": {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n },\n \"url\": \"\"\n }\n}", + "body": "{\n \"upload\": {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\",\n \"key_3\": \"\"\n },\n \"url\": \"\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -1204,7 +1204,7 @@ "value": "application/json" } ], - "id": "dc0db506-543a-4483-9e56-b84c4e8b47c5", + "id": "8339615c-34ef-4381-9c48-1e6259dd9158", "name": "200 response", "originalRequest": { "body": {}, @@ -1264,7 +1264,7 @@ "item": [ { "event": [], - "id": "68d2329c-f0b9-476b-8052-a7226f5556ae", + "id": "27060ef7-c87a-4e7d-8b3b-523a7219e4f8", "name": "/v1/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1278,7 +1278,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"7e651bfc-493a-488f-86bc-5751905747cf\",\n \"jurisdiction\": \"nm\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"a63f7f33-f63e-4d11-944d-ddcc64dacb8e\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" }, "description": {}, "header": [ @@ -1322,7 +1322,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"16-00\",\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2014-10-22\",\n \"dateOfUpdate\": \"1135-02-05\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"me\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"mn\",\n \"ct\"\n ],\n \"providerId\": \"60f95f47-c65d-4f35-9aa1-d144a4afef3b\",\n \"type\": \"provider\",\n \"npi\": \"3758648602\",\n \"dateOfBirth\": \"1799-02-29\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"mo\",\n \"ssnLastFour\": \"9067\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"04-22\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1039-05-30\",\n \"dateOfUpdate\": \"2740-05-06\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"ks\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"ia\",\n \"nh\"\n ],\n \"providerId\": \"6b620401-6c57-4681-a9fc-d9070b1f8d09\",\n \"type\": \"provider\",\n \"npi\": \"3106798211\",\n \"dateOfBirth\": \"2308-12-04\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ms\",\n \"ssnLastFour\": \"7206\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"18-13\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2746-02-31\",\n \"dateOfUpdate\": \"2699-07-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"hi\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"ne\",\n \"nd\"\n ],\n \"providerId\": \"dbd67eab-ddad-48f2-9357-fd0f4f70d2c1\",\n \"type\": \"provider\",\n \"npi\": \"6182323315\",\n \"dateOfBirth\": \"1164-11-31\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"de\",\n \"ssnLastFour\": \"1382\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"15-39\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1947-01-01\",\n \"dateOfUpdate\": \"2219-11-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"ok\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"vt\",\n \"nj\"\n ],\n \"providerId\": \"71702dda-14c7-469f-a989-add20cafeb95\",\n \"type\": \"provider\",\n \"npi\": \"7290021647\",\n \"dateOfBirth\": \"1428-01-31\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"tx\",\n \"ssnLastFour\": \"6550\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -1331,7 +1331,7 @@ "value": "application/json" } ], - "id": "38d665a0-9c29-4753-81d4-98478c78b7ae", + "id": "6ffac135-5644-435c-b52f-4b0005452d41", "name": "200 response", "originalRequest": { "body": { @@ -1342,7 +1342,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"7e651bfc-493a-488f-86bc-5751905747cf\",\n \"jurisdiction\": \"nm\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"a63f7f33-f63e-4d11-944d-ddcc64dacb8e\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" }, "header": [ { @@ -1390,7 +1390,7 @@ "item": [ { "event": [], - "id": "6f1f983b-9a60-4a3c-8a16-977540b8dc2b", + "id": "e4cfcab8-5d1e-4d10-a862-9b0479f62eab", "name": "/v1/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1445,7 +1445,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"18-05\",\n \"compact\": \"aslp\",\n \"dateOfExpiration\": \"1114-09-12\",\n \"dateOfUpdate\": \"1433-03-23\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ar\",\n \"licenses\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1306-03-08\",\n \"dateOfIssuance\": \"1030-12-30\",\n \"dateOfRenewal\": \"2474-02-05\",\n \"dateOfUpdate\": \"2475-10-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1010-10-30\",\n \"jurisdiction\": \"nm\",\n \"previous\": {\n \"dateOfExpiration\": \"2000-10-31\",\n \"dateOfIssuance\": \"1844-02-31\",\n \"dateOfRenewal\": \"1608-11-02\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1753423147\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1452-01-06\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+1309397612826\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3671735098\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2873-07-02\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1031-11-02\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1975-11-12\",\n \"phoneNumber\": \"+17851605\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1695-07-10\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1541-11-31\",\n \"jurisdiction\": \"ma\",\n \"previous\": {\n \"dateOfExpiration\": \"1936-10-30\",\n \"dateOfIssuance\": \"2331-04-30\",\n \"dateOfRenewal\": \"2842-11-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9804384619\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2010-11-16\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+71413357\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8250482424\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1069-04-05\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2613-04-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2711-11-03\",\n \"phoneNumber\": \"+2050697721898\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1517-05-02\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"az\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"licensed professional counselor\",\n \"middleName\": \"\",\n \"providerId\": \"b0496763-ec92-4a47-ab2f-4536b681bd38\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"6095695256\",\n \"dateOfBirth\": \"1320-04-03\",\n \"ssnLastFour\": \"1076\",\n \"phoneNumber\": \"+382839208006\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1214-10-30\",\n \"dateOfUpdate\": \"2390-11-06\",\n \"effectiveStartDate\": \"2953-01-18\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"hi\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"0b8fe736-c033-4136-91f5-eda7f2b8ba7f\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2194-04-08\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1503-05-25\",\n \"dateOfUpdate\": \"1262-01-13\",\n \"effectiveStartDate\": \"2162-09-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3d8e7a68-4df4-47c3-adb9-d5e575911bc0\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2812-01-31\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2646-12-18\",\n \"dateOfIssuance\": \"1304-11-30\",\n \"dateOfRenewal\": \"1212-10-06\",\n \"dateOfUpdate\": \"2731-02-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2968-11-05\",\n \"jurisdiction\": \"oh\",\n \"previous\": {\n \"dateOfExpiration\": \"1495-02-09\",\n \"dateOfIssuance\": \"2074-08-09\",\n \"dateOfRenewal\": \"2897-05-18\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3591668223\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2528-12-16\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+925332212023\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3128128708\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1615-03-27\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1858-12-12\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2093-05-06\",\n \"phoneNumber\": \"+88862351397\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2188-02-03\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1014-09-30\",\n \"jurisdiction\": \"nc\",\n \"previous\": {\n \"dateOfExpiration\": \"2200-12-17\",\n \"dateOfIssuance\": \"1483-08-09\",\n \"dateOfRenewal\": \"1580-11-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7107653147\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1684-12-09\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+982749013585799\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1201882644\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1252-11-27\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1019-08-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1397-11-30\",\n \"phoneNumber\": \"+52496923166065\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2633-03-17\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"md\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"e3b45a75-ebd9-4b90-aa3e-93a1ccef8db3\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"1310126629\",\n \"dateOfBirth\": \"2033-10-30\",\n \"ssnLastFour\": \"4546\",\n \"phoneNumber\": \"+2458662829273\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1494-09-09\",\n \"dateOfUpdate\": \"1137-01-30\",\n \"effectiveStartDate\": \"1605-10-27\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"77f72e9e-b1c0-4550-8378-2ef810a520b5\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2220-10-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1487-10-03\",\n \"dateOfUpdate\": \"2605-12-30\",\n \"effectiveStartDate\": \"1965-06-14\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"il\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a4311387-4e26-4f26-ba5a-1deafc45e728\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1069-05-25\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1725-12-30\",\n \"dateOfUpload\": \"2049-12-25\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"e0e86c9f-b5eb-426a-90ac-36829f8388bd\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1892-12-11\",\n \"dateOfUpload\": \"1877-11-07\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"8385072b-15c4-4e87-b06b-97a1eb9e68a7\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"mn\",\n \"tn\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"octp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1446-11-31\",\n \"dateOfIssuance\": \"1724-04-07\",\n \"dateOfRenewal\": \"2644-08-21\",\n \"dateOfUpdate\": \"2229-06-07\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2991-04-08\",\n \"jurisdiction\": \"il\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1660-12-30\",\n \"dateOfIssuance\": \"1313-03-24\",\n \"dateOfRenewal\": \"2145-12-31\",\n \"dateOfUpdate\": \"2403-05-30\",\n \"licenseJurisdiction\": \"vi\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"il\",\n \"type\": \"privilege\",\n \"providerId\": \"d4ad584f-9f2b-4b92-ba60-7fe995bbf582\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"va\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"al\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1534-03-30\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2504-03-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"e3713f86-cda1-48f5-8683-caf9abb02462\",\n \"dateOfRenewal\": \"2667-12-07\",\n \"dateOfUpdate\": \"2148-10-04\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2016-07-31\",\n \"jurisdiction\": \"ks\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2781-11-17\",\n \"dateOfIssuance\": \"2079-03-20\",\n \"dateOfRenewal\": \"2623-10-31\",\n \"dateOfUpdate\": \"2572-07-31\",\n \"licenseJurisdiction\": \"la\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ne\",\n \"type\": \"privilege\",\n \"providerId\": \"eb1f0881-30a4-40ff-b2b1-fac2a1af50d3\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ar\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"tn\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2044-12-09\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1521-08-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"09e6288d-de40-4fc0-b519-d19cf7e84a25\",\n \"dateOfRenewal\": \"2128-07-18\",\n \"dateOfUpdate\": \"1744-04-06\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ga\",\n \"licenseJurisdiction\": \"md\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"e5e4b3ff-d893-4958-a1d3-50e1fddb2521\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2273-02-08\",\n \"dateOfUpdate\": \"1801-06-24\",\n \"effectiveStartDate\": \"2299-08-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"7540c90b-f2ce-4e8d-aff7-00ed6bf8a3b8\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2819-12-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2967-12-30\",\n \"dateOfUpdate\": \"2051-03-19\",\n \"effectiveStartDate\": \"2562-10-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wi\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9a1790c1-066a-493c-af95-06983d3362be\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1103-10-12\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1800-11-05\",\n \"dateOfIssuance\": \"2485-03-30\",\n \"dateOfRenewal\": \"1669-04-31\",\n \"dateOfUpdate\": \"1350-10-05\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2614-10-01\",\n \"jurisdiction\": \"ne\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1548-10-30\",\n \"dateOfIssuance\": \"2661-11-09\",\n \"dateOfRenewal\": \"2248-01-29\",\n \"dateOfUpdate\": \"2755-12-25\",\n \"licenseJurisdiction\": \"il\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"mi\",\n \"type\": \"privilege\",\n \"providerId\": \"b119e009-e3eb-4e39-a447-d1f5a0d988bf\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"nm\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ut\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2223-12-26\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2850-10-08\",\n \"privilegeId\": \"\",\n \"providerId\": \"af1366f2-f7b6-473d-b051-1a4a8283155d\",\n \"dateOfRenewal\": \"1460-06-08\",\n \"dateOfUpdate\": \"1832-12-14\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1183-11-31\",\n \"jurisdiction\": \"wv\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2933-09-11\",\n \"dateOfIssuance\": \"2180-10-02\",\n \"dateOfRenewal\": \"1762-02-07\",\n \"dateOfUpdate\": \"2602-11-05\",\n \"licenseJurisdiction\": \"mn\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"wv\",\n \"type\": \"privilege\",\n \"providerId\": \"b41e9a0f-0596-401e-9e13-dd17170e1a1c\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pr\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"sd\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2472-11-09\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1343-12-16\",\n \"privilegeId\": \"\",\n \"providerId\": \"3040c8ef-5bd6-40e4-882a-4657292afe28\",\n \"dateOfRenewal\": \"2523-10-30\",\n \"dateOfUpdate\": \"2533-04-19\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ia\",\n \"licenseJurisdiction\": \"sc\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"54c8c814-9dfb-4f13-8b96-722dd65cd6f9\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1172-10-05\",\n \"dateOfUpdate\": \"2404-07-05\",\n \"effectiveStartDate\": \"2365-03-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"098a460c-fd37-4c28-899e-85dbf064cb56\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1464-07-01\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2725-03-23\",\n \"dateOfUpdate\": \"2839-04-26\",\n \"effectiveStartDate\": \"1105-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"il\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"26b21d87-9527-433f-aa95-752626fca36f\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2025-05-26\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"83940727-a1af-4b19-99bb-c35b22f25c66\",\n \"type\": \"provider\",\n \"npi\": \"4129573768\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1535-03-08\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"sd\",\n \"ssnLastFour\": \"5379\",\n \"licenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"12-26\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"1551-07-31\",\n \"dateOfUpdate\": \"1106-04-05\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"wv\",\n \"licenses\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2964-09-13\",\n \"dateOfIssuance\": \"2740-03-30\",\n \"dateOfRenewal\": \"2706-08-02\",\n \"dateOfUpdate\": \"2938-12-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1493-06-01\",\n \"jurisdiction\": \"sc\",\n \"previous\": {\n \"dateOfExpiration\": \"2874-06-02\",\n \"dateOfIssuance\": \"2945-11-10\",\n \"dateOfRenewal\": \"1810-11-10\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6670883159\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2154-07-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+5694198825224\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8286117972\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2413-11-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2851-11-08\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2945-12-30\",\n \"phoneNumber\": \"+29046722\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2653-12-29\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1080-06-09\",\n \"jurisdiction\": \"oh\",\n \"previous\": {\n \"dateOfExpiration\": \"2097-11-30\",\n \"dateOfIssuance\": \"2477-12-01\",\n \"dateOfRenewal\": \"2741-12-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2479221518\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2882-03-08\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+38682681713\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2602550575\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2484-03-22\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2183-02-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2937-07-31\",\n \"phoneNumber\": \"+11234935514\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1852-12-09\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"fl\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"d7e6eede-1d38-48e8-86fc-1d4b4c1a13a1\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1171-10-30\",\n \"dateOfUpdate\": \"1264-04-01\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"providerId\": \"563d9793-1a56-4e7d-800b-bfe7a3879017\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2375-05-18\",\n \"dateOfUpdate\": \"1754-08-23\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"la\",\n \"licenseType\": \"\",\n \"providerId\": \"2b6fad8a-82c1-4380-8d58-20b9059f3a6a\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"6022136795\",\n \"dateOfBirth\": \"2967-12-21\",\n \"ssnLastFour\": \"2014\",\n \"phoneNumber\": \"+41544480\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1358-06-12\",\n \"dateOfUpdate\": \"1458-10-31\",\n \"effectiveStartDate\": \"2908-04-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"04886aaf-0ad5-467d-9e74-269b3481597c\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1170-08-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2228-11-13\",\n \"dateOfUpdate\": \"1851-09-30\",\n \"effectiveStartDate\": \"1134-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"me\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9468ad35-9387-43ad-a560-a5044d6cf65c\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1563-11-10\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1857-07-08\",\n \"dateOfIssuance\": \"2537-10-30\",\n \"dateOfRenewal\": \"2176-09-31\",\n \"dateOfUpdate\": \"2872-12-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1561-11-05\",\n \"jurisdiction\": \"me\",\n \"previous\": {\n \"dateOfExpiration\": \"2826-11-30\",\n \"dateOfIssuance\": \"1820-09-01\",\n \"dateOfRenewal\": \"1510-03-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0580762832\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1606-10-16\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+331066958\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0390027717\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2717-11-06\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2237-11-06\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1851-10-10\",\n \"phoneNumber\": \"+553347120577998\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1762-01-03\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1232-03-05\",\n \"jurisdiction\": \"wy\",\n \"previous\": {\n \"dateOfExpiration\": \"1426-09-14\",\n \"dateOfIssuance\": \"1386-07-15\",\n \"dateOfRenewal\": \"2763-12-23\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4651974073\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1159-04-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+3128513735\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0839042399\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2907-02-06\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2516-06-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2269-11-22\",\n \"phoneNumber\": \"+3076364826382\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2871-12-05\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"md\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"a4363987-f1c3-438e-a713-0090074868aa\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2821-12-27\",\n \"dateOfUpdate\": \"1744-08-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"providerId\": \"ce5c78f5-4cda-4b95-b4a4-a4df7c500951\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2145-11-16\",\n \"dateOfUpdate\": \"1482-05-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"dc\",\n \"licenseType\": \"\",\n \"providerId\": \"409143f2-e7ed-4625-b463-98112f4a373c\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"3536621926\",\n \"dateOfBirth\": \"1790-07-31\",\n \"ssnLastFour\": \"9958\",\n \"phoneNumber\": \"+54047993\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2079-06-15\",\n \"dateOfUpdate\": \"1290-10-08\",\n \"effectiveStartDate\": \"1209-11-18\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"635c4998-88b8-4fe1-831d-4b3148b056c9\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1836-12-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1883-12-14\",\n \"dateOfUpdate\": \"1744-07-04\",\n \"effectiveStartDate\": \"1627-06-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"38af0242-27a5-405c-8f58-e75d6546038e\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1597-08-30\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1660-10-21\",\n \"dateOfUpload\": \"2691-08-04\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"f8417074-5c9c-4776-a522-990938e5d07c\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2105-12-31\",\n \"dateOfUpload\": \"1381-06-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"68eaa44e-0711-4de2-a7e5-154bb5d320b0\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"mi\",\n \"ut\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"octp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1057-11-13\",\n \"dateOfIssuance\": \"1218-10-29\",\n \"dateOfRenewal\": \"2792-11-07\",\n \"dateOfUpdate\": \"2496-07-24\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1987-09-09\",\n \"jurisdiction\": \"ca\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1689-11-25\",\n \"dateOfIssuance\": \"2820-10-03\",\n \"dateOfRenewal\": \"2435-06-30\",\n \"dateOfUpdate\": \"2233-05-01\",\n \"licenseJurisdiction\": \"de\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"vi\",\n \"type\": \"privilege\",\n \"providerId\": \"60978e58-e4db-4dca-9b17-44ca1086ae71\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"tn\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ny\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2569-01-15\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2366-11-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"5fda3d1c-dfe2-429b-bac4-afa714621d52\",\n \"dateOfRenewal\": \"2162-11-05\",\n \"dateOfUpdate\": \"2527-11-17\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2821-12-08\",\n \"jurisdiction\": \"nv\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2879-03-03\",\n \"dateOfIssuance\": \"2484-11-05\",\n \"dateOfRenewal\": \"1920-10-23\",\n \"dateOfUpdate\": \"1312-08-31\",\n \"licenseJurisdiction\": \"co\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"va\",\n \"type\": \"privilege\",\n \"providerId\": \"52656e71-216a-474d-a721-151b226833ed\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"sd\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"oh\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2645-08-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2194-11-06\",\n \"privilegeId\": \"\",\n \"providerId\": \"e1e737a4-ef9f-4c57-b6eb-c7ddff454d96\",\n \"dateOfRenewal\": \"1975-10-11\",\n \"dateOfUpdate\": \"1903-10-31\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ri\",\n \"licenseJurisdiction\": \"ok\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"c31885ae-dd58-4029-9034-d6751eba3708\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1962-03-01\",\n \"dateOfUpdate\": \"1693-11-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"providerId\": \"09dee976-b64a-498e-bec5-d12a42877923\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2856-09-31\",\n \"dateOfUpdate\": \"1753-12-09\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"0d2cd0d5-d250-45f5-9365-e6627ad640e4\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1520-10-30\",\n \"dateOfUpdate\": \"2513-04-31\",\n \"effectiveStartDate\": \"1562-12-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e3d0c2e1-e4b1-43f6-b6de-2133dec40e8d\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2365-11-03\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2372-02-26\",\n \"dateOfUpdate\": \"2227-10-31\",\n \"effectiveStartDate\": \"2681-12-03\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"sd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e014f2c4-ec73-40b0-ae37-da670b7f849a\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2248-12-07\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2541-05-01\",\n \"dateOfIssuance\": \"1604-09-30\",\n \"dateOfRenewal\": \"1081-10-30\",\n \"dateOfUpdate\": \"1116-02-13\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1736-08-28\",\n \"jurisdiction\": \"la\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1319-10-14\",\n \"dateOfIssuance\": \"2183-01-06\",\n \"dateOfRenewal\": \"2554-12-22\",\n \"dateOfUpdate\": \"2695-11-31\",\n \"licenseJurisdiction\": \"ct\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"dc\",\n \"type\": \"privilege\",\n \"providerId\": \"7472d4df-e3a8-4389-a4a2-cb49edce4b6e\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ok\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ga\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2895-12-30\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1355-04-19\",\n \"privilegeId\": \"\",\n \"providerId\": \"ed891a33-4bde-4573-a46e-8d9429b2a32e\",\n \"dateOfRenewal\": \"1131-08-18\",\n \"dateOfUpdate\": \"1943-09-22\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2014-10-14\",\n \"jurisdiction\": \"id\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2285-11-31\",\n \"dateOfIssuance\": \"1219-09-09\",\n \"dateOfRenewal\": \"2746-08-20\",\n \"dateOfUpdate\": \"2653-12-20\",\n \"licenseJurisdiction\": \"vi\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wv\",\n \"type\": \"privilege\",\n \"providerId\": \"5c49424a-dcf0-4943-8f37-b7596db87809\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pr\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"nj\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1721-12-31\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2286-12-03\",\n \"privilegeId\": \"\",\n \"providerId\": \"5909f954-efb5-4f1e-b3f9-04fe35c79b3d\",\n \"dateOfRenewal\": \"1148-12-07\",\n \"dateOfUpdate\": \"1303-12-08\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"tn\",\n \"licenseJurisdiction\": \"or\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"d7e992cc-a401-41d6-8889-088003df65ae\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2633-11-04\",\n \"dateOfUpdate\": \"1658-11-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"providerId\": \"b068c6de-3f01-4fe2-8f2f-8962d45c76c5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2566-11-05\",\n \"dateOfUpdate\": \"1755-09-06\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"c9d6b593-f709-4e8e-8232-e215d785b7b7\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1822-11-18\",\n \"dateOfUpdate\": \"2048-04-03\",\n \"effectiveStartDate\": \"2723-02-07\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1cbba6b4-7bb5-4c3d-811a-551083e27b45\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1606-01-31\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1069-03-21\",\n \"dateOfUpdate\": \"2086-10-20\",\n \"effectiveStartDate\": \"2962-10-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"88ec9865-d5b4-49cd-9243-ad6000b526ef\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1279-11-01\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"dc6dd272-12e0-49a5-9f97-9e12963e66c1\",\n \"type\": \"provider\",\n \"npi\": \"9149208010\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1567-03-08\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"tx\",\n \"ssnLastFour\": \"2327\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -1454,7 +1454,7 @@ "value": "application/json" } ], - "id": "44acb98f-f78b-4463-a6f1-a7a45e99c7ee", + "id": "6f583753-86c6-42a6-ad81-7cd921d0c884", "name": "200 response", "originalRequest": { "body": {}, @@ -1512,7 +1512,7 @@ "item": [ { "event": [], - "id": "53c9e443-2ec6-4920-bd4a-6fda18c34f92", + "id": "ff81349e-db7d-44b1-ab74-7544d1c9f969", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1526,7 +1526,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2902-12-31\",\n \"encumbranceType\": \"revocation\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1586-11-01\",\n \"encumbranceType\": \"fine\"\n}" }, "description": {}, "header": [ @@ -1615,7 +1615,7 @@ "value": "application/json" } ], - "id": "df7a55a0-13f1-4d9e-92fe-ca80d8bb8c30", + "id": "ed186f26-aea5-4d39-93ce-2ade118b45af", "name": "200 response", "originalRequest": { "body": { @@ -1626,7 +1626,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2902-12-31\",\n \"encumbranceType\": \"revocation\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1586-11-01\",\n \"encumbranceType\": \"fine\"\n}" }, "header": [ { @@ -1677,7 +1677,7 @@ "item": [ { "event": [], - "id": "8a6f952e-b548-464d-b5fe-40fe7727f054", + "id": "12ebe5df-db93-4d59-b429-bf86bb91ce30", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1691,7 +1691,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1840-05-08\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"2419-03-30\"\n}" }, "description": {}, "header": [ @@ -1791,7 +1791,7 @@ "value": "application/json" } ], - "id": "884da41c-a402-4383-b1d4-8a90af9a2908", + "id": "198f1a02-2111-453d-b226-d76e407c1295", "name": "200 response", "originalRequest": { "body": { @@ -1802,7 +1802,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1840-05-08\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"2419-03-30\"\n}" }, "header": [ { @@ -1854,6 +1854,328 @@ } ], "name": "encumbrance" + }, + { + "description": "", + "item": [ + { + "event": [], + "id": "587e8439-09ba-45cd-9938-f1b614e35f9b", + "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "body": {}, + "description": {}, + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "method": "POST", + "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "compacts", + ":compact", + "providers", + ":providerId", + "licenses", + "jurisdiction", + ":jurisdiction", + "licenseType", + ":licenseType", + "investigation" + ], + "query": [], + "variable": [ + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "compact", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "providerId", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "jurisdiction", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "licenseType", + "type": "any", + "value": "" + } + ] + } + }, + "response": [ + { + "_postman_previewlanguage": "json", + "body": "{\n \"message\": \"\"\n}", + "code": 200, + "cookie": [], + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "id": "9c41b567-be86-43a9-8383-7b21d58e1daa", + "name": "200 response", + "originalRequest": { + "body": {}, + "header": [ + { + "key": "Accept", + "value": "application/json" + }, + { + "description": { + "content": "Added as a part of security scheme: apikey", + "type": "text/plain" + }, + "key": "Authorization", + "value": "" + } + ], + "method": "POST", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "compacts", + ":compact", + "providers", + ":providerId", + "licenses", + "jurisdiction", + ":jurisdiction", + "licenseType", + ":licenseType", + "investigation" + ], + "query": [], + "variable": [] + } + }, + "status": "OK" + } + ] + }, + { + "description": "", + "item": [ + { + "event": [], + "id": "bc8e4d23-924c-4b22-b513-56b042be5353", + "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1710-05-30\",\n \"encumbranceType\": \"denial\"\n }\n}" + }, + "description": {}, + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "method": "PATCH", + "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "compacts", + ":compact", + "providers", + ":providerId", + "licenses", + "jurisdiction", + ":jurisdiction", + "licenseType", + ":licenseType", + "investigation", + ":investigationId" + ], + "query": [], + "variable": [ + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "compact", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "providerId", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "jurisdiction", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "licenseType", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "investigationId", + "type": "any", + "value": "" + } + ] + } + }, + "response": [ + { + "_postman_previewlanguage": "json", + "body": "{\n \"message\": \"\"\n}", + "code": 200, + "cookie": [], + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "id": "e8353133-b3f7-41ea-9dc3-a4bf5a3f8640", + "name": "200 response", + "originalRequest": { + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1710-05-30\",\n \"encumbranceType\": \"denial\"\n }\n}" + }, + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + }, + { + "description": { + "content": "Added as a part of security scheme: apikey", + "type": "text/plain" + }, + "key": "Authorization", + "value": "" + } + ], + "method": "PATCH", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "compacts", + ":compact", + "providers", + ":providerId", + "licenses", + "jurisdiction", + ":jurisdiction", + "licenseType", + ":licenseType", + "investigation", + ":investigationId" + ], + "query": [], + "variable": [] + } + }, + "status": "OK" + } + ] + } + ], + "name": "{investigationId}" + } + ], + "name": "investigation" } ], "name": "{licenseType}" @@ -1890,35 +2212,538 @@ "item": [ { "event": [], - "id": "595819aa-14ed-446b-b1bd-79b784d1ad15", - "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/deactivate", + "id": "bcf48b0b-a187-4622-9c6e-ad9f682efd44", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/deactivate", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{\n \"deactivationNote\": \"\"\n}" + }, + "description": {}, + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "method": "POST", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/deactivate", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "compacts", + ":compact", + "providers", + ":providerId", + "privileges", + "jurisdiction", + ":jurisdiction", + "licenseType", + ":licenseType", + "deactivate" + ], + "query": [], + "variable": [ + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "compact", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "providerId", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "jurisdiction", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "licenseType", + "type": "any", + "value": "" + } + ] + } + }, + "response": [ + { + "_postman_previewlanguage": "json", + "body": "{\n \"message\": \"\"\n}", + "code": 200, + "cookie": [], + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "id": "16a27230-7885-42fc-b7c7-05d08705cfee", + "name": "200 response", + "originalRequest": { + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{\n \"deactivationNote\": \"\"\n}" + }, + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + }, + { + "description": { + "content": "Added as a part of security scheme: apikey", + "type": "text/plain" + }, + "key": "Authorization", + "value": "" + } + ], + "method": "POST", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "compacts", + ":compact", + "providers", + ":providerId", + "privileges", + "jurisdiction", + ":jurisdiction", + "licenseType", + ":licenseType", + "deactivate" + ], + "query": [], + "variable": [] + } + }, + "status": "OK" + } + ] + } + ], + "name": "deactivate" + }, + { + "description": "", + "item": [ + { + "event": [], + "id": "3bbd0dea-8359-4188-9ab9-28d9dbb5fdf1", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1586-11-01\",\n \"encumbranceType\": \"fine\"\n}" + }, + "description": {}, + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "method": "POST", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "compacts", + ":compact", + "providers", + ":providerId", + "privileges", + "jurisdiction", + ":jurisdiction", + "licenseType", + ":licenseType", + "encumbrance" + ], + "query": [], + "variable": [ + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "compact", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "providerId", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "jurisdiction", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "licenseType", + "type": "any", + "value": "" + } + ] + } + }, + "response": [ + { + "_postman_previewlanguage": "json", + "body": "{\n \"message\": \"\"\n}", + "code": 200, + "cookie": [], + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "id": "e542483b-faa3-43bc-8afc-12aef1b7126c", + "name": "200 response", + "originalRequest": { + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1586-11-01\",\n \"encumbranceType\": \"fine\"\n}" + }, + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + }, + { + "description": { + "content": "Added as a part of security scheme: apikey", + "type": "text/plain" + }, + "key": "Authorization", + "value": "" + } + ], + "method": "POST", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "compacts", + ":compact", + "providers", + ":providerId", + "privileges", + "jurisdiction", + ":jurisdiction", + "licenseType", + ":licenseType", + "encumbrance" + ], + "query": [], + "variable": [] + } + }, + "status": "OK" + } + ] + }, + { + "description": "", + "item": [ + { + "event": [], + "id": "c499e41c-1041-4919-9fd6-6055f02d9744", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{\n \"effectiveLiftDate\": \"2419-03-30\"\n}" + }, + "description": {}, + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "method": "PATCH", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "compacts", + ":compact", + "providers", + ":providerId", + "privileges", + "jurisdiction", + ":jurisdiction", + "licenseType", + ":licenseType", + "encumbrance", + ":encumbranceId" + ], + "query": [], + "variable": [ + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "compact", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "providerId", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "jurisdiction", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "licenseType", + "type": "any", + "value": "" + }, + { + "description": { + "content": "(Required) ", + "type": "text/plain" + }, + "disabled": false, + "key": "encumbranceId", + "type": "any", + "value": "" + } + ] + } + }, + "response": [ + { + "_postman_previewlanguage": "json", + "body": "{\n \"message\": \"\"\n}", + "code": 200, + "cookie": [], + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "id": "751a2925-49bc-44e3-b1b0-4eec74f76f8e", + "name": "200 response", + "originalRequest": { + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{\n \"effectiveLiftDate\": \"2419-03-30\"\n}" + }, + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + }, + { + "description": { + "content": "Added as a part of security scheme: apikey", + "type": "text/plain" + }, + "key": "Authorization", + "value": "" + } + ], + "method": "PATCH", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "compacts", + ":compact", + "providers", + ":providerId", + "privileges", + "jurisdiction", + ":jurisdiction", + "licenseType", + ":licenseType", + "encumbrance", + ":encumbranceId" + ], + "query": [], + "variable": [] + } + }, + "status": "OK" + } + ] + } + ], + "name": "{encumbranceId}" + } + ], + "name": "encumbrance" + }, + { + "description": "", + "item": [ + { + "event": [], + "id": "faddf96d-7ca0-4c62-9983-4ff083f67b57", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true }, "request": { - "body": { - "mode": "raw", - "options": { - "raw": { - "headerFamily": "json", - "language": "json" - } - }, - "raw": "{\n \"deactivationNote\": \"\"\n}" - }, + "body": {}, "description": {}, "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, { "key": "Accept", "value": "application/json" } ], - "method": "POST", - "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/deactivate", + "method": "GET", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "url": { "host": [ "{{baseUrl}}" @@ -1934,7 +2759,7 @@ ":jurisdiction", "licenseType", ":licenseType", - "deactivate" + "history" ], "query": [], "variable": [ @@ -1984,7 +2809,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"message\": \"\"\n}", + "body": "{\n \"compact\": \"octp\",\n \"events\": [\n {\n \"createDate\": \"2787-10-31\",\n \"dateOfUpdate\": \"2310-09-03\",\n \"effectiveDate\": \"2678-06-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"1854-11-08\",\n \"dateOfUpdate\": \"2995-02-27\",\n \"effectiveDate\": \"2049-06-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"hi\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"2dba0e24-f0a5-408c-912d-941be4c11f19\"\n}", "code": 200, "cookie": [], "header": [ @@ -1993,24 +2818,11 @@ "value": "application/json" } ], - "id": "a57a09a4-c7df-400e-863d-2cba82b20fda", + "id": "125cba7c-5f5f-4fd3-a08e-ee336ab29bd0", "name": "200 response", "originalRequest": { - "body": { - "mode": "raw", - "options": { - "raw": { - "headerFamily": "json", - "language": "json" - } - }, - "raw": "{\n \"deactivationNote\": \"\"\n}" - }, + "body": {}, "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, { "key": "Accept", "value": "application/json" @@ -2024,7 +2836,7 @@ "value": "" } ], - "method": "POST", + "method": "GET", "url": { "host": [ "{{baseUrl}}" @@ -2040,7 +2852,7 @@ ":jurisdiction", "licenseType", ":licenseType", - "deactivate" + "history" ], "query": [], "variable": [] @@ -2051,42 +2863,29 @@ ] } ], - "name": "deactivate" + "name": "history" }, { "description": "", "item": [ { "event": [], - "id": "981a70bc-5eb8-4922-9ad0-c8c2a2fa2b2e", - "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", + "id": "3a32b06e-51c4-46f4-9dc1-064bf8be4865", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true }, "request": { - "body": { - "mode": "raw", - "options": { - "raw": { - "headerFamily": "json", - "language": "json" - } - }, - "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2902-12-31\",\n \"encumbranceType\": \"revocation\"\n}" - }, + "body": {}, "description": {}, "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, { "key": "Accept", "value": "application/json" } ], "method": "POST", - "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "url": { "host": [ "{{baseUrl}}" @@ -2102,7 +2901,7 @@ ":jurisdiction", "licenseType", ":licenseType", - "encumbrance" + "investigation" ], "query": [], "variable": [ @@ -2161,24 +2960,11 @@ "value": "application/json" } ], - "id": "1e5eb73a-ff53-476c-bcdf-2db5e6f51922", + "id": "647f003c-6520-4076-ae3b-18e041862fb6", "name": "200 response", "originalRequest": { - "body": { - "mode": "raw", - "options": { - "raw": { - "headerFamily": "json", - "language": "json" - } - }, - "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2902-12-31\",\n \"encumbranceType\": \"revocation\"\n}" - }, + "body": {}, "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, { "key": "Accept", "value": "application/json" @@ -2208,7 +2994,7 @@ ":jurisdiction", "licenseType", ":licenseType", - "encumbrance" + "investigation" ], "query": [], "variable": [] @@ -2223,8 +3009,8 @@ "item": [ { "event": [], - "id": "26cb2cb6-a19c-4bca-be2f-7c852b428912", - "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", + "id": "5185b870-7b1f-4483-ae5a-771f4f4d683d", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true }, @@ -2237,7 +3023,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1840-05-08\"\n}" + "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1710-05-30\",\n \"encumbranceType\": \"denial\"\n }\n}" }, "description": {}, "header": [ @@ -2251,7 +3037,7 @@ } ], "method": "PATCH", - "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", + "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "url": { "host": [ "{{baseUrl}}" @@ -2267,8 +3053,8 @@ ":jurisdiction", "licenseType", ":licenseType", - "encumbrance", - ":encumbranceId" + "investigation", + ":investigationId" ], "query": [], "variable": [ @@ -2318,7 +3104,7 @@ "type": "text/plain" }, "disabled": false, - "key": "encumbranceId", + "key": "investigationId", "type": "any", "value": "" } @@ -2337,7 +3123,7 @@ "value": "application/json" } ], - "id": "9c4f8a0a-155c-4fc7-b330-e4455bb332f3", + "id": "53dd9999-edaa-44a3-a4de-825ea076cadd", "name": "200 response", "originalRequest": { "body": { @@ -2348,7 +3134,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1840-05-08\"\n}" + "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1710-05-30\",\n \"encumbranceType\": \"denial\"\n }\n}" }, "header": [ { @@ -2384,8 +3170,8 @@ ":jurisdiction", "licenseType", ":licenseType", - "encumbrance", - ":encumbranceId" + "investigation", + ":investigationId" ], "query": [], "variable": [] @@ -2396,152 +3182,10 @@ ] } ], - "name": "{encumbranceId}" - } - ], - "name": "encumbrance" - }, - { - "description": "", - "item": [ - { - "event": [], - "id": "5f71f6c5-c018-4578-b137-23a2cf02af4a", - "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/history", - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "body": {}, - "description": {}, - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "method": "GET", - "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/history", - "url": { - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "compacts", - ":compact", - "providers", - ":providerId", - "privileges", - "jurisdiction", - ":jurisdiction", - "licenseType", - ":licenseType", - "history" - ], - "query": [], - "variable": [ - { - "description": { - "content": "(Required) ", - "type": "text/plain" - }, - "disabled": false, - "key": "compact", - "type": "any", - "value": "" - }, - { - "description": { - "content": "(Required) ", - "type": "text/plain" - }, - "disabled": false, - "key": "providerId", - "type": "any", - "value": "" - }, - { - "description": { - "content": "(Required) ", - "type": "text/plain" - }, - "disabled": false, - "key": "jurisdiction", - "type": "any", - "value": "" - }, - { - "description": { - "content": "(Required) ", - "type": "text/plain" - }, - "disabled": false, - "key": "licenseType", - "type": "any", - "value": "" - } - ] - } - }, - "response": [ - { - "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"aslp\",\n \"events\": [\n {\n \"createDate\": \"2045-12-31\",\n \"dateOfUpdate\": \"1129-07-16\",\n \"effectiveDate\": \"2387-02-11\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2088-04-04\",\n \"dateOfUpdate\": \"2290-11-08\",\n \"effectiveDate\": \"2973-10-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"wi\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"ac8c9bc7-3eff-45a8-bd01-e4e0e4746cfd\"\n}", - "code": 200, - "cookie": [], - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "id": "cff30401-7a31-4e2d-91a9-a79a25e81454", - "name": "200 response", - "originalRequest": { - "body": {}, - "header": [ - { - "key": "Accept", - "value": "application/json" - }, - { - "description": { - "content": "Added as a part of security scheme: apikey", - "type": "text/plain" - }, - "key": "Authorization", - "value": "" - } - ], - "method": "GET", - "url": { - "host": [ - "{{baseUrl}}" - ], - "path": [ - "v1", - "compacts", - ":compact", - "providers", - ":providerId", - "privileges", - "jurisdiction", - ":jurisdiction", - "licenseType", - ":licenseType", - "history" - ], - "query": [], - "variable": [] - } - }, - "status": "OK" - } - ] + "name": "{investigationId}" } ], - "name": "history" + "name": "investigation" } ], "name": "{licenseType}" @@ -2563,7 +3207,7 @@ "item": [ { "event": [], - "id": "bee4355f-cdb0-403d-9d4b-1e426889e9b1", + "id": "c8cada73-beaa-4849-9b88-c3acb7e78719", "name": "/v1/compacts/:compact/providers/:providerId/ssn", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2619,7 +3263,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"ssn\": \"172-12-8247\"\n}", + "body": "{\n \"ssn\": \"945-51-8012\"\n}", "code": 200, "cookie": [], "header": [ @@ -2628,7 +3272,7 @@ "value": "application/json" } ], - "id": "e651c5eb-d895-47ba-873f-49de5d2b42a5", + "id": "a221bccf-5d86-4d2e-b734-c7e43890211a", "name": "200 response", "originalRequest": { "body": {}, @@ -2681,7 +3325,7 @@ "item": [ { "event": [], - "id": "54d66f86-c11d-45a5-a71b-edd76de9babb", + "id": "f00253fa-75a1-4050-b0e1-cfa8965f4416", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2725,7 +3369,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n }\n ]\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n }\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -2743,7 +3387,7 @@ "value": "" } ], - "id": "6c3a420b-f667-4ff6-b766-4902011ce6e8", + "id": "7ca3145a-7ae4-4c1c-81bf-a6eca85a2818", "name": "200 response", "originalRequest": { "body": {}, @@ -2782,7 +3426,7 @@ }, { "event": [], - "id": "9f5cd004-d32d-4874-abb6-24250d4b316e", + "id": "86bb688b-3a3d-4593-bc98-2750b4456da3", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2796,7 +3440,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -2857,7 +3501,7 @@ "value": "" } ], - "id": "b9a0bbed-474f-4831-a485-503edbd9cc9f", + "id": "b8704d2b-48a7-4704-9dd3-b75660809098", "name": "200 response", "originalRequest": { "body": { @@ -2868,7 +3512,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -2912,7 +3556,7 @@ "item": [ { "event": [], - "id": "f9b11053-7ad6-41ff-b5e6-98afe6716fb2", + "id": "cd4323dc-dfaf-4890-88ad-5768ad006aad", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2985,7 +3629,7 @@ "value": "" } ], - "id": "993e2a5b-49c8-4a3f-8f52-69b1c325148e", + "id": "61ee6c56-6d0f-4e2b-b3be-e789ca9c6a8c", "name": "200 response", "originalRequest": { "body": {}, @@ -3032,7 +3676,7 @@ "value": "application/json" } ], - "id": "183e0dd7-d1f2-456d-8bef-6fed2d05f575", + "id": "297f6c07-adc6-477a-8908-f052460b171b", "name": "404 response", "originalRequest": { "body": {}, @@ -3072,7 +3716,7 @@ }, { "event": [], - "id": "c6e3a762-0076-4377-bfcf-96323fc4be88", + "id": "30c6e4f8-cae9-41a6-a4f1-ba49eec42498", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3136,7 +3780,7 @@ "value": "application/json" } ], - "id": "18566da3-8a86-4418-bbb5-bf5b1dcdf41d", + "id": "6e710a7d-7867-4250-89f6-ded1bb32d892", "name": "200 response", "originalRequest": { "body": {}, @@ -3183,7 +3827,7 @@ "value": "application/json" } ], - "id": "8fb3cde9-c0d1-4d5d-87ef-1febf8f70e08", + "id": "66026c95-a4c1-445a-90e7-1d36a19e6c61", "name": "404 response", "originalRequest": { "body": {}, @@ -3223,7 +3867,7 @@ }, { "event": [], - "id": "de777b08-534d-4b0e-a3e0-8beb87fd4b81", + "id": "d90210f3-1d85-414d-b91a-6635e7d12306", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3237,7 +3881,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3309,7 +3953,7 @@ "value": "" } ], - "id": "953b30de-0870-4c25-8e4e-a4ea36f257d1", + "id": "140eb696-8c68-4b1b-b81b-fbe5082e3b70", "name": "200 response", "originalRequest": { "body": { @@ -3320,7 +3964,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3369,7 +4013,7 @@ "value": "application/json" } ], - "id": "678d42a1-fb71-4ee3-9d16-02a159e57b0d", + "id": "5c94a5f8-0df4-4616-b9c7-9ab6d29c5c0a", "name": "404 response", "originalRequest": { "body": { @@ -3380,7 +4024,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3425,7 +4069,7 @@ "item": [ { "event": [], - "id": "37431eba-9269-4f2e-b5cd-d29086712dd7", + "id": "ce7cad7e-3ad3-446d-a200-96d98d9cae99", "name": "/v1/compacts/:compact/staff-users/:userId/reinvite", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3490,7 +4134,7 @@ "value": "application/json" } ], - "id": "35dcee34-292c-4843-9f26-2cd9f67d5b71", + "id": "2262bef6-0155-49db-a1ed-b7555086fd3a", "name": "200 response", "originalRequest": { "body": {}, @@ -3538,7 +4182,7 @@ "value": "application/json" } ], - "id": "5d62643f-3434-425c-ac6a-586c59d0f6a0", + "id": "48605014-f3a5-424c-9f57-040b3d4a8b34", "name": "404 response", "originalRequest": { "body": {}, @@ -3603,7 +4247,7 @@ "item": [ { "event": [], - "id": "29b03e3b-ece9-41fe-acfb-080f481f7ea7", + "id": "acf643c2-58e1-445a-be9f-776f162155da", "name": "/v1/flags/:flagId/check", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3620,7 +4264,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\"\n }\n }\n}" }, "description": {}, "header": [ @@ -3672,7 +4316,7 @@ "value": "application/json" } ], - "id": "526a261a-ef21-4de4-a499-e9a5d8f6aac0", + "id": "419b5b60-3c7d-4809-be09-e5b193f139ed", "name": "200 response", "originalRequest": { "body": { @@ -3683,7 +4327,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\"\n }\n }\n}" }, "header": [ { @@ -3741,7 +4385,7 @@ "item": [ { "event": [], - "id": "bb60b0cb-9a3d-4223-8832-18d43a3f2d8a", + "id": "5816d6e2-5727-4d18-b142-8fc6cb41b9c6", "name": "/v1/provider-users/initiateRecovery", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3758,7 +4402,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"coun\",\n \"dob\": \"1421-10-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"fl\",\n \"licenseType\": \"occupational therapist\",\n \"partialSocial\": \"7143\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" + "raw": "{\n \"compact\": \"aslp\",\n \"dob\": \"2953-08-26\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"in\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"2228\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" }, "description": {}, "header": [ @@ -3798,7 +4442,7 @@ "value": "application/json" } ], - "id": "e130482e-b115-45f0-9ace-04054ab2b2c1", + "id": "0b6dbf50-80e6-4638-8ac7-79df9665202e", "name": "200 response", "originalRequest": { "body": { @@ -3809,7 +4453,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"coun\",\n \"dob\": \"1421-10-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"fl\",\n \"licenseType\": \"occupational therapist\",\n \"partialSocial\": \"7143\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" + "raw": "{\n \"compact\": \"aslp\",\n \"dob\": \"2953-08-26\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"in\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"2228\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" }, "header": [ { @@ -3847,7 +4491,7 @@ "item": [ { "event": [], - "id": "338d97c6-0953-4f70-b7f0-0ab38bf45c3c", + "id": "fefaec39-58d9-42dc-a84c-51cdf3b2cb31", "name": "/v1/provider-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3879,7 +4523,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"18-05\",\n \"compact\": \"aslp\",\n \"dateOfExpiration\": \"1114-09-12\",\n \"dateOfUpdate\": \"1433-03-23\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ar\",\n \"licenses\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1306-03-08\",\n \"dateOfIssuance\": \"1030-12-30\",\n \"dateOfRenewal\": \"2474-02-05\",\n \"dateOfUpdate\": \"2475-10-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1010-10-30\",\n \"jurisdiction\": \"nm\",\n \"previous\": {\n \"dateOfExpiration\": \"2000-10-31\",\n \"dateOfIssuance\": \"1844-02-31\",\n \"dateOfRenewal\": \"1608-11-02\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1753423147\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1452-01-06\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+1309397612826\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3671735098\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2873-07-02\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1031-11-02\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1975-11-12\",\n \"phoneNumber\": \"+17851605\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1695-07-10\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1541-11-31\",\n \"jurisdiction\": \"ma\",\n \"previous\": {\n \"dateOfExpiration\": \"1936-10-30\",\n \"dateOfIssuance\": \"2331-04-30\",\n \"dateOfRenewal\": \"2842-11-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9804384619\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2010-11-16\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+71413357\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8250482424\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1069-04-05\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2613-04-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2711-11-03\",\n \"phoneNumber\": \"+2050697721898\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1517-05-02\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"az\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"licensed professional counselor\",\n \"middleName\": \"\",\n \"providerId\": \"b0496763-ec92-4a47-ab2f-4536b681bd38\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"6095695256\",\n \"dateOfBirth\": \"1320-04-03\",\n \"ssnLastFour\": \"1076\",\n \"phoneNumber\": \"+382839208006\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1214-10-30\",\n \"dateOfUpdate\": \"2390-11-06\",\n \"effectiveStartDate\": \"2953-01-18\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"hi\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"0b8fe736-c033-4136-91f5-eda7f2b8ba7f\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2194-04-08\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1503-05-25\",\n \"dateOfUpdate\": \"1262-01-13\",\n \"effectiveStartDate\": \"2162-09-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3d8e7a68-4df4-47c3-adb9-d5e575911bc0\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2812-01-31\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2646-12-18\",\n \"dateOfIssuance\": \"1304-11-30\",\n \"dateOfRenewal\": \"1212-10-06\",\n \"dateOfUpdate\": \"2731-02-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2968-11-05\",\n \"jurisdiction\": \"oh\",\n \"previous\": {\n \"dateOfExpiration\": \"1495-02-09\",\n \"dateOfIssuance\": \"2074-08-09\",\n \"dateOfRenewal\": \"2897-05-18\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3591668223\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2528-12-16\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+925332212023\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3128128708\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1615-03-27\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1858-12-12\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2093-05-06\",\n \"phoneNumber\": \"+88862351397\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2188-02-03\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1014-09-30\",\n \"jurisdiction\": \"nc\",\n \"previous\": {\n \"dateOfExpiration\": \"2200-12-17\",\n \"dateOfIssuance\": \"1483-08-09\",\n \"dateOfRenewal\": \"1580-11-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7107653147\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1684-12-09\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+982749013585799\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1201882644\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1252-11-27\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1019-08-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1397-11-30\",\n \"phoneNumber\": \"+52496923166065\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2633-03-17\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"md\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"e3b45a75-ebd9-4b90-aa3e-93a1ccef8db3\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"1310126629\",\n \"dateOfBirth\": \"2033-10-30\",\n \"ssnLastFour\": \"4546\",\n \"phoneNumber\": \"+2458662829273\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1494-09-09\",\n \"dateOfUpdate\": \"1137-01-30\",\n \"effectiveStartDate\": \"1605-10-27\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"77f72e9e-b1c0-4550-8378-2ef810a520b5\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2220-10-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1487-10-03\",\n \"dateOfUpdate\": \"2605-12-30\",\n \"effectiveStartDate\": \"1965-06-14\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"il\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a4311387-4e26-4f26-ba5a-1deafc45e728\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1069-05-25\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1725-12-30\",\n \"dateOfUpload\": \"2049-12-25\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"e0e86c9f-b5eb-426a-90ac-36829f8388bd\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1892-12-11\",\n \"dateOfUpload\": \"1877-11-07\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"8385072b-15c4-4e87-b06b-97a1eb9e68a7\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"mn\",\n \"tn\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"octp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1446-11-31\",\n \"dateOfIssuance\": \"1724-04-07\",\n \"dateOfRenewal\": \"2644-08-21\",\n \"dateOfUpdate\": \"2229-06-07\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2991-04-08\",\n \"jurisdiction\": \"il\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1660-12-30\",\n \"dateOfIssuance\": \"1313-03-24\",\n \"dateOfRenewal\": \"2145-12-31\",\n \"dateOfUpdate\": \"2403-05-30\",\n \"licenseJurisdiction\": \"vi\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"il\",\n \"type\": \"privilege\",\n \"providerId\": \"d4ad584f-9f2b-4b92-ba60-7fe995bbf582\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"va\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"al\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1534-03-30\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2504-03-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"e3713f86-cda1-48f5-8683-caf9abb02462\",\n \"dateOfRenewal\": \"2667-12-07\",\n \"dateOfUpdate\": \"2148-10-04\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2016-07-31\",\n \"jurisdiction\": \"ks\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2781-11-17\",\n \"dateOfIssuance\": \"2079-03-20\",\n \"dateOfRenewal\": \"2623-10-31\",\n \"dateOfUpdate\": \"2572-07-31\",\n \"licenseJurisdiction\": \"la\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ne\",\n \"type\": \"privilege\",\n \"providerId\": \"eb1f0881-30a4-40ff-b2b1-fac2a1af50d3\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ar\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"tn\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2044-12-09\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1521-08-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"09e6288d-de40-4fc0-b519-d19cf7e84a25\",\n \"dateOfRenewal\": \"2128-07-18\",\n \"dateOfUpdate\": \"1744-04-06\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ga\",\n \"licenseJurisdiction\": \"md\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"e5e4b3ff-d893-4958-a1d3-50e1fddb2521\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2273-02-08\",\n \"dateOfUpdate\": \"1801-06-24\",\n \"effectiveStartDate\": \"2299-08-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"7540c90b-f2ce-4e8d-aff7-00ed6bf8a3b8\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2819-12-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2967-12-30\",\n \"dateOfUpdate\": \"2051-03-19\",\n \"effectiveStartDate\": \"2562-10-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wi\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9a1790c1-066a-493c-af95-06983d3362be\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1103-10-12\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1800-11-05\",\n \"dateOfIssuance\": \"2485-03-30\",\n \"dateOfRenewal\": \"1669-04-31\",\n \"dateOfUpdate\": \"1350-10-05\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2614-10-01\",\n \"jurisdiction\": \"ne\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1548-10-30\",\n \"dateOfIssuance\": \"2661-11-09\",\n \"dateOfRenewal\": \"2248-01-29\",\n \"dateOfUpdate\": \"2755-12-25\",\n \"licenseJurisdiction\": \"il\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"mi\",\n \"type\": \"privilege\",\n \"providerId\": \"b119e009-e3eb-4e39-a447-d1f5a0d988bf\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"nm\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ut\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2223-12-26\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2850-10-08\",\n \"privilegeId\": \"\",\n \"providerId\": \"af1366f2-f7b6-473d-b051-1a4a8283155d\",\n \"dateOfRenewal\": \"1460-06-08\",\n \"dateOfUpdate\": \"1832-12-14\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1183-11-31\",\n \"jurisdiction\": \"wv\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2933-09-11\",\n \"dateOfIssuance\": \"2180-10-02\",\n \"dateOfRenewal\": \"1762-02-07\",\n \"dateOfUpdate\": \"2602-11-05\",\n \"licenseJurisdiction\": \"mn\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"wv\",\n \"type\": \"privilege\",\n \"providerId\": \"b41e9a0f-0596-401e-9e13-dd17170e1a1c\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pr\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"sd\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2472-11-09\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1343-12-16\",\n \"privilegeId\": \"\",\n \"providerId\": \"3040c8ef-5bd6-40e4-882a-4657292afe28\",\n \"dateOfRenewal\": \"2523-10-30\",\n \"dateOfUpdate\": \"2533-04-19\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ia\",\n \"licenseJurisdiction\": \"sc\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"54c8c814-9dfb-4f13-8b96-722dd65cd6f9\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1172-10-05\",\n \"dateOfUpdate\": \"2404-07-05\",\n \"effectiveStartDate\": \"2365-03-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"098a460c-fd37-4c28-899e-85dbf064cb56\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1464-07-01\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2725-03-23\",\n \"dateOfUpdate\": \"2839-04-26\",\n \"effectiveStartDate\": \"1105-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"il\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"26b21d87-9527-433f-aa95-752626fca36f\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2025-05-26\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"83940727-a1af-4b19-99bb-c35b22f25c66\",\n \"type\": \"provider\",\n \"npi\": \"4129573768\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1535-03-08\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"sd\",\n \"ssnLastFour\": \"5379\",\n \"licenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"12-26\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"1551-07-31\",\n \"dateOfUpdate\": \"1106-04-05\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"wv\",\n \"licenses\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2964-09-13\",\n \"dateOfIssuance\": \"2740-03-30\",\n \"dateOfRenewal\": \"2706-08-02\",\n \"dateOfUpdate\": \"2938-12-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1493-06-01\",\n \"jurisdiction\": \"sc\",\n \"previous\": {\n \"dateOfExpiration\": \"2874-06-02\",\n \"dateOfIssuance\": \"2945-11-10\",\n \"dateOfRenewal\": \"1810-11-10\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6670883159\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2154-07-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+5694198825224\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8286117972\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2413-11-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2851-11-08\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2945-12-30\",\n \"phoneNumber\": \"+29046722\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2653-12-29\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1080-06-09\",\n \"jurisdiction\": \"oh\",\n \"previous\": {\n \"dateOfExpiration\": \"2097-11-30\",\n \"dateOfIssuance\": \"2477-12-01\",\n \"dateOfRenewal\": \"2741-12-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2479221518\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2882-03-08\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+38682681713\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2602550575\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2484-03-22\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2183-02-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2937-07-31\",\n \"phoneNumber\": \"+11234935514\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1852-12-09\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"fl\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"d7e6eede-1d38-48e8-86fc-1d4b4c1a13a1\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1171-10-30\",\n \"dateOfUpdate\": \"1264-04-01\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"providerId\": \"563d9793-1a56-4e7d-800b-bfe7a3879017\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2375-05-18\",\n \"dateOfUpdate\": \"1754-08-23\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"la\",\n \"licenseType\": \"\",\n \"providerId\": \"2b6fad8a-82c1-4380-8d58-20b9059f3a6a\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"6022136795\",\n \"dateOfBirth\": \"2967-12-21\",\n \"ssnLastFour\": \"2014\",\n \"phoneNumber\": \"+41544480\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1358-06-12\",\n \"dateOfUpdate\": \"1458-10-31\",\n \"effectiveStartDate\": \"2908-04-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"04886aaf-0ad5-467d-9e74-269b3481597c\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1170-08-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2228-11-13\",\n \"dateOfUpdate\": \"1851-09-30\",\n \"effectiveStartDate\": \"1134-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"me\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9468ad35-9387-43ad-a560-a5044d6cf65c\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1563-11-10\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1857-07-08\",\n \"dateOfIssuance\": \"2537-10-30\",\n \"dateOfRenewal\": \"2176-09-31\",\n \"dateOfUpdate\": \"2872-12-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1561-11-05\",\n \"jurisdiction\": \"me\",\n \"previous\": {\n \"dateOfExpiration\": \"2826-11-30\",\n \"dateOfIssuance\": \"1820-09-01\",\n \"dateOfRenewal\": \"1510-03-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0580762832\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1606-10-16\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+331066958\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0390027717\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2717-11-06\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2237-11-06\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1851-10-10\",\n \"phoneNumber\": \"+553347120577998\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1762-01-03\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1232-03-05\",\n \"jurisdiction\": \"wy\",\n \"previous\": {\n \"dateOfExpiration\": \"1426-09-14\",\n \"dateOfIssuance\": \"1386-07-15\",\n \"dateOfRenewal\": \"2763-12-23\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4651974073\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1159-04-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+3128513735\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0839042399\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2907-02-06\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2516-06-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2269-11-22\",\n \"phoneNumber\": \"+3076364826382\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2871-12-05\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"md\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"a4363987-f1c3-438e-a713-0090074868aa\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2821-12-27\",\n \"dateOfUpdate\": \"1744-08-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"providerId\": \"ce5c78f5-4cda-4b95-b4a4-a4df7c500951\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2145-11-16\",\n \"dateOfUpdate\": \"1482-05-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"dc\",\n \"licenseType\": \"\",\n \"providerId\": \"409143f2-e7ed-4625-b463-98112f4a373c\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"3536621926\",\n \"dateOfBirth\": \"1790-07-31\",\n \"ssnLastFour\": \"9958\",\n \"phoneNumber\": \"+54047993\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2079-06-15\",\n \"dateOfUpdate\": \"1290-10-08\",\n \"effectiveStartDate\": \"1209-11-18\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"635c4998-88b8-4fe1-831d-4b3148b056c9\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1836-12-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1883-12-14\",\n \"dateOfUpdate\": \"1744-07-04\",\n \"effectiveStartDate\": \"1627-06-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"38af0242-27a5-405c-8f58-e75d6546038e\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1597-08-30\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1660-10-21\",\n \"dateOfUpload\": \"2691-08-04\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"f8417074-5c9c-4776-a522-990938e5d07c\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2105-12-31\",\n \"dateOfUpload\": \"1381-06-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"68eaa44e-0711-4de2-a7e5-154bb5d320b0\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"mi\",\n \"ut\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"octp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1057-11-13\",\n \"dateOfIssuance\": \"1218-10-29\",\n \"dateOfRenewal\": \"2792-11-07\",\n \"dateOfUpdate\": \"2496-07-24\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1987-09-09\",\n \"jurisdiction\": \"ca\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1689-11-25\",\n \"dateOfIssuance\": \"2820-10-03\",\n \"dateOfRenewal\": \"2435-06-30\",\n \"dateOfUpdate\": \"2233-05-01\",\n \"licenseJurisdiction\": \"de\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"vi\",\n \"type\": \"privilege\",\n \"providerId\": \"60978e58-e4db-4dca-9b17-44ca1086ae71\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"tn\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ny\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2569-01-15\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2366-11-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"5fda3d1c-dfe2-429b-bac4-afa714621d52\",\n \"dateOfRenewal\": \"2162-11-05\",\n \"dateOfUpdate\": \"2527-11-17\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2821-12-08\",\n \"jurisdiction\": \"nv\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2879-03-03\",\n \"dateOfIssuance\": \"2484-11-05\",\n \"dateOfRenewal\": \"1920-10-23\",\n \"dateOfUpdate\": \"1312-08-31\",\n \"licenseJurisdiction\": \"co\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"va\",\n \"type\": \"privilege\",\n \"providerId\": \"52656e71-216a-474d-a721-151b226833ed\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"sd\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"oh\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2645-08-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2194-11-06\",\n \"privilegeId\": \"\",\n \"providerId\": \"e1e737a4-ef9f-4c57-b6eb-c7ddff454d96\",\n \"dateOfRenewal\": \"1975-10-11\",\n \"dateOfUpdate\": \"1903-10-31\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ri\",\n \"licenseJurisdiction\": \"ok\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"c31885ae-dd58-4029-9034-d6751eba3708\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1962-03-01\",\n \"dateOfUpdate\": \"1693-11-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"providerId\": \"09dee976-b64a-498e-bec5-d12a42877923\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2856-09-31\",\n \"dateOfUpdate\": \"1753-12-09\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"0d2cd0d5-d250-45f5-9365-e6627ad640e4\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1520-10-30\",\n \"dateOfUpdate\": \"2513-04-31\",\n \"effectiveStartDate\": \"1562-12-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e3d0c2e1-e4b1-43f6-b6de-2133dec40e8d\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2365-11-03\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2372-02-26\",\n \"dateOfUpdate\": \"2227-10-31\",\n \"effectiveStartDate\": \"2681-12-03\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"sd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e014f2c4-ec73-40b0-ae37-da670b7f849a\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2248-12-07\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2541-05-01\",\n \"dateOfIssuance\": \"1604-09-30\",\n \"dateOfRenewal\": \"1081-10-30\",\n \"dateOfUpdate\": \"1116-02-13\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1736-08-28\",\n \"jurisdiction\": \"la\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1319-10-14\",\n \"dateOfIssuance\": \"2183-01-06\",\n \"dateOfRenewal\": \"2554-12-22\",\n \"dateOfUpdate\": \"2695-11-31\",\n \"licenseJurisdiction\": \"ct\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"dc\",\n \"type\": \"privilege\",\n \"providerId\": \"7472d4df-e3a8-4389-a4a2-cb49edce4b6e\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ok\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ga\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2895-12-30\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1355-04-19\",\n \"privilegeId\": \"\",\n \"providerId\": \"ed891a33-4bde-4573-a46e-8d9429b2a32e\",\n \"dateOfRenewal\": \"1131-08-18\",\n \"dateOfUpdate\": \"1943-09-22\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2014-10-14\",\n \"jurisdiction\": \"id\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2285-11-31\",\n \"dateOfIssuance\": \"1219-09-09\",\n \"dateOfRenewal\": \"2746-08-20\",\n \"dateOfUpdate\": \"2653-12-20\",\n \"licenseJurisdiction\": \"vi\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wv\",\n \"type\": \"privilege\",\n \"providerId\": \"5c49424a-dcf0-4943-8f37-b7596db87809\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pr\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"nj\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1721-12-31\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2286-12-03\",\n \"privilegeId\": \"\",\n \"providerId\": \"5909f954-efb5-4f1e-b3f9-04fe35c79b3d\",\n \"dateOfRenewal\": \"1148-12-07\",\n \"dateOfUpdate\": \"1303-12-08\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"tn\",\n \"licenseJurisdiction\": \"or\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"d7e992cc-a401-41d6-8889-088003df65ae\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2633-11-04\",\n \"dateOfUpdate\": \"1658-11-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"providerId\": \"b068c6de-3f01-4fe2-8f2f-8962d45c76c5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2566-11-05\",\n \"dateOfUpdate\": \"1755-09-06\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"c9d6b593-f709-4e8e-8232-e215d785b7b7\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1822-11-18\",\n \"dateOfUpdate\": \"2048-04-03\",\n \"effectiveStartDate\": \"2723-02-07\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1cbba6b4-7bb5-4c3d-811a-551083e27b45\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1606-01-31\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1069-03-21\",\n \"dateOfUpdate\": \"2086-10-20\",\n \"effectiveStartDate\": \"2962-10-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"88ec9865-d5b4-49cd-9243-ad6000b526ef\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1279-11-01\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"dc6dd272-12e0-49a5-9f97-9e12963e66c1\",\n \"type\": \"provider\",\n \"npi\": \"9149208010\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1567-03-08\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"tx\",\n \"ssnLastFour\": \"2327\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3888,7 +4532,7 @@ "value": "application/json" } ], - "id": "d814fa51-d6d3-4b8b-a80c-c8be12366bb5", + "id": "0bbdd19a-d419-40f6-b1bf-364d4977581b", "name": "200 response", "originalRequest": { "body": {}, @@ -3929,7 +4573,7 @@ "item": [ { "event": [], - "id": "b3f5a9a9-7252-4808-a3aa-0e0d5087bf42", + "id": "36ab0cb5-4c67-423d-be25-93f88cf8af95", "name": "/v1/provider-users/me/email", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3984,7 +4628,7 @@ "value": "application/json" } ], - "id": "cbe67273-226e-42b0-9239-e2862a58cd7b", + "id": "9c74706a-1469-4c6a-beb2-c1fbaed2cb09", "name": "200 response", "originalRequest": { "body": { @@ -4039,7 +4683,7 @@ "item": [ { "event": [], - "id": "cce2d524-d6db-4b8a-9143-19c2fef73e90", + "id": "b1ea23af-4516-4776-b576-f6e3c9ca2180", "name": "/v1/provider-users/me/email/verify", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4053,7 +4697,7 @@ "language": "json" } }, - "raw": "{\n \"verificationCode\": \"1519\"\n}" + "raw": "{\n \"verificationCode\": \"1241\"\n}" }, "description": {}, "header": [ @@ -4095,7 +4739,7 @@ "value": "application/json" } ], - "id": "b96ca4c3-5ca4-46d4-aceb-03f67f9a1fb2", + "id": "cddc0aae-c687-4db1-8fd0-9aba31c160d3", "name": "200 response", "originalRequest": { "body": { @@ -4106,7 +4750,7 @@ "language": "json" } }, - "raw": "{\n \"verificationCode\": \"1519\"\n}" + "raw": "{\n \"verificationCode\": \"1241\"\n}" }, "header": [ { @@ -4157,7 +4801,7 @@ "item": [ { "event": [], - "id": "c5fad2d0-070a-4985-8315-7b570ec93d41", + "id": "2be40c01-2357-4848-af89-22bd17a4a577", "name": "/v1/provider-users/me/home-jurisdiction", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4171,7 +4815,7 @@ "language": "json" } }, - "raw": "{\n \"jurisdiction\": \"tx\"\n}" + "raw": "{\n \"jurisdiction\": \"mi\"\n}" }, "description": {}, "header": [ @@ -4212,7 +4856,7 @@ "value": "application/json" } ], - "id": "a890bb29-d0ee-44cf-82c2-ea0487bf7234", + "id": "6a5975bf-eba2-4040-b7f9-42a0e27ca93b", "name": "200 response", "originalRequest": { "body": { @@ -4223,7 +4867,7 @@ "language": "json" } }, - "raw": "{\n \"jurisdiction\": \"tx\"\n}" + "raw": "{\n \"jurisdiction\": \"mi\"\n}" }, "header": [ { @@ -4282,7 +4926,7 @@ "item": [ { "event": [], - "id": "be81c466-cd83-4548-b88b-eb877f706ea0", + "id": "ee591bbc-c801-4174-a6f1-88fe86f627d6", "name": "/v1/provider-users/me/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4340,7 +4984,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"aslp\",\n \"events\": [\n {\n \"createDate\": \"2045-12-31\",\n \"dateOfUpdate\": \"1129-07-16\",\n \"effectiveDate\": \"2387-02-11\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2088-04-04\",\n \"dateOfUpdate\": \"2290-11-08\",\n \"effectiveDate\": \"2973-10-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"wi\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"ac8c9bc7-3eff-45a8-bd01-e4e0e4746cfd\"\n}", + "body": "{\n \"compact\": \"octp\",\n \"events\": [\n {\n \"createDate\": \"2787-10-31\",\n \"dateOfUpdate\": \"2310-09-03\",\n \"effectiveDate\": \"2678-06-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"1854-11-08\",\n \"dateOfUpdate\": \"2995-02-27\",\n \"effectiveDate\": \"2049-06-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"hi\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"2dba0e24-f0a5-408c-912d-941be4c11f19\"\n}", "code": 200, "cookie": [], "header": [ @@ -4349,7 +4993,7 @@ "value": "application/json" } ], - "id": "20b3ab17-30a5-428e-b97c-c066c5e3a064", + "id": "409d2edc-960f-4e99-a1d6-7855627c853a", "name": "200 response", "originalRequest": { "body": {}, @@ -4410,7 +5054,7 @@ "item": [ { "event": [], - "id": "08fbb1eb-4400-42dd-9460-9c4543f538ee", + "id": "ac220891-c729-43f3-a64f-d28aacf4da0e", "name": "/v1/provider-users/me/military-affiliation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4424,7 +5068,7 @@ "language": "json" } }, - "raw": "{\n \"affiliationType\": \"militaryMemberSpouse\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}" + "raw": "{\n \"affiliationType\": \"militaryMember\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}" }, "description": {}, "header": [ @@ -4456,7 +5100,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"affiliationType\": \"militaryMemberSpouse\",\n \"dateOfUpdate\": \"1822-11-31\",\n \"dateOfUpload\": \"1077-04-08\",\n \"documentUploadFields\": [\n {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n },\n \"url\": \"\"\n },\n {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\",\n \"key_3\": \"\"\n },\n \"url\": \"\"\n }\n ],\n \"status\": \"\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}", + "body": "{\n \"affiliationType\": \"militaryMember\",\n \"dateOfUpdate\": \"1516-07-31\",\n \"dateOfUpload\": \"1157-02-04\",\n \"documentUploadFields\": [\n {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n },\n {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n }\n ],\n \"status\": \"\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -4465,7 +5109,7 @@ "value": "application/json" } ], - "id": "07943649-508c-47f6-9506-418cfd90460d", + "id": "3cd75524-583b-4f0a-acdd-0ef4a9679c21", "name": "200 response", "originalRequest": { "body": { @@ -4476,7 +5120,7 @@ "language": "json" } }, - "raw": "{\n \"affiliationType\": \"militaryMemberSpouse\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}" + "raw": "{\n \"affiliationType\": \"militaryMember\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}" }, "header": [ { @@ -4517,7 +5161,7 @@ }, { "event": [], - "id": "40bb4075-7159-416d-928d-2ca3271a890b", + "id": "c89b557c-64fb-4286-b1ea-bbe564129da7", "name": "/v1/provider-users/me/military-affiliation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4572,7 +5216,7 @@ "value": "application/json" } ], - "id": "cfe18cab-cf43-444e-b587-fda2561502c2", + "id": "c3f9560e-ba54-40d4-9f7a-3c3b700f3bd2", "name": "200 response", "originalRequest": { "body": { @@ -4633,7 +5277,7 @@ "item": [ { "event": [], - "id": "b9e4c83a-e086-4bf3-bb34-30adae5d0f1a", + "id": "1b1823d9-014b-4ca4-b83d-2373c1240e5c", "name": "/v1/provider-users/registration", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4650,7 +5294,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"\",\n \"dob\": \"1752-02-28\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ar\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" + "raw": "{\n \"compact\": \"\",\n \"dob\": \"2819-09-30\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"licensed professional counselor\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" }, "description": {}, "header": [ @@ -4690,7 +5334,7 @@ "value": "application/json" } ], - "id": "1696c659-00f2-4575-ad6b-bd08af4d7e95", + "id": "cca625e3-6568-4c7c-8f4a-fad926bee364", "name": "200 response", "originalRequest": { "body": { @@ -4701,7 +5345,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"\",\n \"dob\": \"1752-02-28\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ar\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" + "raw": "{\n \"compact\": \"\",\n \"dob\": \"2819-09-30\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"licensed professional counselor\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" }, "header": [ { @@ -4739,7 +5383,7 @@ "item": [ { "event": [], - "id": "64398b24-7748-4169-a330-116a0061a61e", + "id": "35beea24-d544-47ef-be3e-266dc92d1c15", "name": "/v1/provider-users/verifyRecovery", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4756,7 +5400,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"coun\",\n \"providerId\": \"d35f5c35-fe50-499d-ba51-d3b993d4bf63\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" + "raw": "{\n \"compact\": \"octp\",\n \"providerId\": \"0efe6305-5374-4492-b074-0261b98f6069\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" }, "description": {}, "header": [ @@ -4796,7 +5440,7 @@ "value": "application/json" } ], - "id": "3e3f4ab2-328e-4539-b3af-fd1730e11e86", + "id": "cd851d45-e6f9-4ffb-b18e-35a71d59a7ee", "name": "200 response", "originalRequest": { "body": { @@ -4807,7 +5451,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"coun\",\n \"providerId\": \"d35f5c35-fe50-499d-ba51-d3b993d4bf63\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" + "raw": "{\n \"compact\": \"octp\",\n \"providerId\": \"0efe6305-5374-4492-b074-0261b98f6069\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" }, "header": [ { @@ -4857,7 +5501,7 @@ "item": [ { "event": [], - "id": "2abc3398-bf30-4256-b7ec-b2ec9d9f57b9", + "id": "1dbc6084-2967-4860-98b2-92d45c90eea2", "name": "/v1/public/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4914,7 +5558,7 @@ "value": "application/json" } ], - "id": "57e70b3b-1395-4661-8e0e-795919c3b727", + "id": "d5186322-6bbf-4bbd-bbfd-a9e885ffcbda", "name": "200 response", "originalRequest": { "body": {}, @@ -4955,7 +5599,7 @@ "item": [ { "event": [], - "id": "99303856-17ea-4e1e-bed1-79a661417ede", + "id": "e69e5f22-2bf4-4c8c-b8be-3929233083e3", "name": "/v1/public/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4972,7 +5616,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"7e651bfc-493a-488f-86bc-5751905747cf\",\n \"jurisdiction\": \"nm\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"a63f7f33-f63e-4d11-944d-ddcc64dacb8e\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" }, "description": {}, "header": [ @@ -5017,7 +5661,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"octp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"or\",\n \"privilegeJurisdictions\": [\n \"dc\",\n \"ok\"\n ],\n \"providerId\": \"940de4cb-fb1e-47e3-98c4-3928fbbf9948\",\n \"type\": \"provider\",\n \"npi\": \"0370788298\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"other\",\n \"dateOfUpdate\": \"1260-04-02\"\n },\n {\n \"compact\": \"octp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ky\",\n \"privilegeJurisdictions\": [\n \"ia\",\n \"ma\"\n ],\n \"providerId\": \"d3f7628c-5fe3-4225-8101-79131587a314\",\n \"type\": \"provider\",\n \"npi\": \"9671937403\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"id\",\n \"dateOfUpdate\": \"2449-04-30\"\n }\n ],\n \"query\": {\n \"providerId\": \"b497bdf2-8c97-4de7-a23f-eb6f5853175f\",\n \"jurisdiction\": \"ct\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"aslp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"in\",\n \"privilegeJurisdictions\": [\n \"sc\",\n \"ny\"\n ],\n \"providerId\": \"e4252ae3-571b-4166-b32e-cd9989f391d0\",\n \"type\": \"provider\",\n \"npi\": \"3745526136\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"mn\",\n \"dateOfUpdate\": \"1040-12-07\"\n },\n {\n \"compact\": \"octp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"co\",\n \"privilegeJurisdictions\": [\n \"md\",\n \"ut\"\n ],\n \"providerId\": \"5203d204-1ce6-4427-a62a-ac4e6fd0071a\",\n \"type\": \"provider\",\n \"npi\": \"2629130019\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"or\",\n \"dateOfUpdate\": \"1617-11-03\"\n }\n ],\n \"query\": {\n \"providerId\": \"54d3ed76-f32c-4256-a3a5-6fcc12cdce8b\",\n \"jurisdiction\": \"nj\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -5026,7 +5670,7 @@ "value": "application/json" } ], - "id": "3e5d6201-2278-43d6-913b-b8047bccfb0c", + "id": "8c64fe03-6a1e-4728-8460-9158fd919181", "name": "200 response", "originalRequest": { "body": { @@ -5037,7 +5681,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"7e651bfc-493a-488f-86bc-5751905747cf\",\n \"jurisdiction\": \"nm\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"a63f7f33-f63e-4d11-944d-ddcc64dacb8e\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" }, "header": [ { @@ -5078,7 +5722,7 @@ "item": [ { "event": [], - "id": "66fa4cb2-a06b-44b2-be78-6f47b6d107db", + "id": "10ecdb87-19c6-486d-8a8a-79f8634a9864", "name": "/v1/public/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5137,7 +5781,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1747-05-19\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"md\",\n \"privilegeJurisdictions\": [\n \"wa\",\n \"ak\"\n ],\n \"providerId\": \"771da59b-b4f6-48e2-b6be-06c8330ba968\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"1398-12-23\",\n \"dateOfIssuance\": \"1871-01-24\",\n \"dateOfRenewal\": \"2284-10-31\",\n \"dateOfUpdate\": \"2136-03-30\",\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"ga\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"ffeb6149-f452-4a21-9b92-12a869a6be09\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2387-05-30\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"licensed professional counselor\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1705-04-04\",\n \"dateOfIssuance\": \"2342-03-03\",\n \"dateOfRenewal\": \"1853-01-30\",\n \"dateOfUpdate\": \"1473-11-06\",\n \"licenseJurisdiction\": \"co\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"e65a8a63-4f8f-4ecc-ab0b-7ffaf5e2838f\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1465-01-25\",\n \"licenseJurisdiction\": \"ny\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2578-10-18\",\n \"dateOfIssuance\": \"2187-11-30\",\n \"dateOfUpdate\": \"1013-05-18\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2046-10-02\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"audiologist\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2826-10-30\",\n \"dateOfIssuance\": \"1425-11-11\",\n \"dateOfRenewal\": \"1439-10-07\",\n \"dateOfUpdate\": \"2021-06-13\",\n \"licenseJurisdiction\": \"sc\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"df8f0241-25e7-4146-8484-08f036d6deb1\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1014-03-27\",\n \"licenseJurisdiction\": \"co\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1350-11-31\",\n \"dateOfIssuance\": \"2925-10-02\",\n \"dateOfUpdate\": \"1980-11-30\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1527-09-04\",\n \"dateOfUpdate\": \"2192-11-03\",\n \"effectiveStartDate\": \"2382-02-30\",\n \"jurisdiction\": \"fl\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b7526fbc-6e03-42ca-b2db-9d826d861509\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2037-08-30\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1569-05-02\",\n \"dateOfUpdate\": \"1727-11-02\",\n \"effectiveStartDate\": \"1030-04-02\",\n \"jurisdiction\": \"nc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"447c2bec-9971-4923-9e28-5131d8524b1e\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1671-07-30\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"1603-11-06\",\n \"dateOfIssuance\": \"1632-12-13\",\n \"dateOfRenewal\": \"2095-07-30\",\n \"dateOfUpdate\": \"2370-11-31\",\n \"jurisdiction\": \"vi\",\n \"licenseJurisdiction\": \"ma\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"60d06dba-64f6-42f1-ac32-44cea6e7f759\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1485-07-31\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"licensed professional counselor\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2169-11-20\",\n \"dateOfIssuance\": \"2988-05-04\",\n \"dateOfRenewal\": \"2576-12-31\",\n \"dateOfUpdate\": \"1571-02-06\",\n \"licenseJurisdiction\": \"md\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"d74eede7-ea20-4c78-a074-d329a8e64213\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1824-03-22\",\n \"licenseJurisdiction\": \"nj\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2112-02-30\",\n \"dateOfIssuance\": \"2745-11-30\",\n \"dateOfUpdate\": \"2211-11-08\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1843-05-31\",\n \"jurisdiction\": \"ar\",\n \"licenseType\": \"audiologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1584-06-30\",\n \"dateOfIssuance\": \"1316-01-04\",\n \"dateOfRenewal\": \"2509-09-25\",\n \"dateOfUpdate\": \"2570-06-06\",\n \"licenseJurisdiction\": \"ia\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"4a4a8bfd-3f0b-4439-9c95-ecd166b683d3\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2132-04-03\",\n \"licenseJurisdiction\": \"ct\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2260-03-30\",\n \"dateOfIssuance\": \"1698-08-06\",\n \"dateOfUpdate\": \"2919-10-09\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1951-09-31\",\n \"dateOfUpdate\": \"1879-12-25\",\n \"effectiveStartDate\": \"1776-09-20\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"88301cf5-2fb1-47d6-b34f-3132f496d510\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2801-12-31\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2409-06-03\",\n \"dateOfUpdate\": \"2968-02-15\",\n \"effectiveStartDate\": \"2813-07-01\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a1a2458f-fcb7-4a30-80f6-5f55d330df2f\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1255-09-20\"\n }\n ]\n }\n ],\n \"npi\": \"6010456029\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"va\",\n \"middleName\": \"\"\n}", + "body": "{\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2603-12-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"sc\",\n \"privilegeJurisdictions\": [\n \"fl\",\n \"ky\"\n ],\n \"providerId\": \"1ae13ed5-aa8f-42d1-98d7-89bca1689174\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"1239-11-08\",\n \"dateOfIssuance\": \"2345-12-31\",\n \"dateOfRenewal\": \"2850-01-31\",\n \"dateOfUpdate\": \"2128-10-30\",\n \"jurisdiction\": \"ct\",\n \"licenseJurisdiction\": \"mn\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"6b9b9850-f534-4358-8609-62924b8e44b9\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1613-01-02\",\n \"jurisdiction\": \"nj\",\n \"licenseType\": \"occupational therapy assistant\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1322-10-03\",\n \"dateOfIssuance\": \"1342-11-30\",\n \"dateOfRenewal\": \"2764-10-09\",\n \"dateOfUpdate\": \"1969-04-23\",\n \"licenseJurisdiction\": \"ma\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"e0a53e29-1bc7-4b9e-8e87-44f492e5fa34\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1446-10-05\",\n \"licenseJurisdiction\": \"ga\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1192-04-07\",\n \"dateOfIssuance\": \"1118-12-09\",\n \"dateOfUpdate\": \"2910-11-06\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1959-05-14\",\n \"jurisdiction\": \"ny\",\n \"licenseType\": \"occupational therapy assistant\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1451-06-21\",\n \"dateOfIssuance\": \"1114-08-08\",\n \"dateOfRenewal\": \"2518-12-16\",\n \"dateOfUpdate\": \"2588-11-04\",\n \"licenseJurisdiction\": \"fl\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"278a35a3-db42-464e-80ac-7578748657aa\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1192-10-03\",\n \"licenseJurisdiction\": \"mi\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1227-03-30\",\n \"dateOfIssuance\": \"2080-04-31\",\n \"dateOfUpdate\": \"1381-10-31\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1822-08-11\",\n \"dateOfUpdate\": \"2401-11-07\",\n \"effectiveStartDate\": \"1288-01-09\",\n \"jurisdiction\": \"hi\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"314b7ec2-0f3b-4875-b46e-e5dfe0b0a2f8\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2151-03-31\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2895-10-08\",\n \"dateOfUpdate\": \"1104-12-09\",\n \"effectiveStartDate\": \"2834-03-30\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"0e140166-5402-45e2-a2e7-b19e3de858ae\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2380-10-03\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"2139-10-31\",\n \"dateOfIssuance\": \"2730-06-31\",\n \"dateOfRenewal\": \"1257-02-07\",\n \"dateOfUpdate\": \"1832-02-31\",\n \"jurisdiction\": \"ct\",\n \"licenseJurisdiction\": \"mn\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"a5a596b2-42f5-4efb-a1ba-5b530f6ebf15\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1690-10-07\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"licensed professional counselor\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1241-12-18\",\n \"dateOfIssuance\": \"1855-04-07\",\n \"dateOfRenewal\": \"1881-10-31\",\n \"dateOfUpdate\": \"1145-03-17\",\n \"licenseJurisdiction\": \"ri\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"c30ceab6-bcd3-4f98-9d2f-09b01c6a8c0a\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2009-08-30\",\n \"licenseJurisdiction\": \"az\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1678-12-03\",\n \"dateOfIssuance\": \"2323-07-16\",\n \"dateOfUpdate\": \"1630-08-05\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1487-12-31\",\n \"jurisdiction\": \"vi\",\n \"licenseType\": \"audiologist\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1184-03-31\",\n \"dateOfIssuance\": \"1916-11-30\",\n \"dateOfRenewal\": \"1601-12-22\",\n \"dateOfUpdate\": \"2877-03-01\",\n \"licenseJurisdiction\": \"tn\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"2455f1b3-7b69-4a40-bd5f-3698f637bb73\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2887-03-30\",\n \"licenseJurisdiction\": \"id\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2051-10-26\",\n \"dateOfIssuance\": \"1049-07-05\",\n \"dateOfUpdate\": \"1865-01-05\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1520-04-12\",\n \"dateOfUpdate\": \"1256-08-11\",\n \"effectiveStartDate\": \"2778-11-06\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"63dbe116-68d2-414e-b45f-a9ff849fabb6\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2986-03-07\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1687-08-30\",\n \"dateOfUpdate\": \"1047-11-31\",\n \"effectiveStartDate\": \"2971-02-30\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"6d8d71a8-06e8-4371-a8ff-4ba86469f0b9\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2675-04-21\"\n }\n ]\n }\n ],\n \"npi\": \"7139423957\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"mn\",\n \"middleName\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -5146,7 +5790,7 @@ "value": "application/json" } ], - "id": "34254f79-00af-4e6b-b34f-a174441a9846", + "id": "14c930e5-7506-46c9-81cc-1fb3596d47ab", "name": "200 response", "originalRequest": { "body": {}, @@ -5194,7 +5838,7 @@ "item": [ { "event": [], - "id": "d0a844bf-5043-4f04-aa24-d9bde85b9c5d", + "id": "73fe6920-502a-43d3-87d5-2c8b7dabd606", "name": "/v1/public/compacts/:compact/providers/:providerId/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5278,7 +5922,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"aslp\",\n \"events\": [\n {\n \"createDate\": \"2045-12-31\",\n \"dateOfUpdate\": \"1129-07-16\",\n \"effectiveDate\": \"2387-02-11\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2088-04-04\",\n \"dateOfUpdate\": \"2290-11-08\",\n \"effectiveDate\": \"2973-10-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"wi\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"ac8c9bc7-3eff-45a8-bd01-e4e0e4746cfd\"\n}", + "body": "{\n \"compact\": \"octp\",\n \"events\": [\n {\n \"createDate\": \"2787-10-31\",\n \"dateOfUpdate\": \"2310-09-03\",\n \"effectiveDate\": \"2678-06-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"1854-11-08\",\n \"dateOfUpdate\": \"2995-02-27\",\n \"effectiveDate\": \"2049-06-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"hi\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"2dba0e24-f0a5-408c-912d-941be4c11f19\"\n}", "code": 200, "cookie": [], "header": [ @@ -5287,7 +5931,7 @@ "value": "application/json" } ], - "id": "4b891dc1-320c-4385-a389-2e51200c2166", + "id": "a1d55769-38fb-46ca-84b7-47eeb03f5442", "name": "200 response", "originalRequest": { "body": {}, @@ -5361,7 +6005,7 @@ "item": [ { "event": [], - "id": "dc9383ca-4fa0-47c3-b2cb-1bcfb648f5ba", + "id": "b75df5cf-7a33-4950-aa4b-20ba4b90916a", "name": "/v1/purchases/privileges", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5375,7 +6019,7 @@ "language": "json" } }, - "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"276\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"22500886\"\n }\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"ri\",\n \"az\"\n ]\n}" + "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"8255025762\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"020352\"\n }\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"nj\",\n \"pr\"\n ]\n}" }, "description": {}, "header": [ @@ -5415,7 +6059,7 @@ "value": "application/json" } ], - "id": "d185a1f5-bd5c-45c4-b30d-3aa411bc66c8", + "id": "ff6f4099-2846-4d70-aa01-823ee3b0dbf0", "name": "200 response", "originalRequest": { "body": { @@ -5426,7 +6070,7 @@ "language": "json" } }, - "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"276\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"22500886\"\n }\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"ri\",\n \"az\"\n ]\n}" + "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"8255025762\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"020352\"\n }\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"nj\",\n \"pr\"\n ]\n}" }, "header": [ { @@ -5469,7 +6113,7 @@ "item": [ { "event": [], - "id": "cc062755-4622-439d-939c-ad5a1298cd34", + "id": "f1114b6f-a017-4346-a054-85e35e36ab0d", "name": "/v1/purchases/privileges/options", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5511,7 +6155,7 @@ "value": "application/json" } ], - "id": "21b3529a-30c8-4c16-a5e8-32120ff76409", + "id": "0656fe67-52f7-483d-8ee8-9f467c98be00", "name": "200 response", "originalRequest": { "body": {}, @@ -5565,7 +6209,7 @@ "item": [ { "event": [], - "id": "8e61081c-0817-45be-8ccc-06020b626fe2", + "id": "636aa3dc-04c4-4147-a9a5-7234632fc8f2", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5615,7 +6259,7 @@ "value": "" } ], - "id": "cb7d68ce-fa59-49e1-a4e6-5306503a1567", + "id": "075489ec-17b8-494b-b9fe-e68880752573", "name": "200 response", "originalRequest": { "body": {}, @@ -5660,7 +6304,7 @@ "value": "application/json" } ], - "id": "3b37e4ba-38d9-4e24-bad4-78c1d45e0f4d", + "id": "42e108b2-0b75-4d8d-80cb-c466dd852eb1", "name": "404 response", "originalRequest": { "body": {}, @@ -5698,7 +6342,7 @@ }, { "event": [], - "id": "5ec8f4c1-859f-4fff-b4aa-828decda37a1", + "id": "fa90f5be-5496-4c05-bb1a-4bee1a508fd0", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5761,7 +6405,7 @@ "value": "" } ], - "id": "464ec98c-0260-4da3-b36a-903675059d72", + "id": "83de1f76-a0fc-4555-af19-af4289eaae8d", "name": "200 response", "originalRequest": { "body": { @@ -5819,7 +6463,7 @@ "value": "application/json" } ], - "id": "16e98316-3b27-46e4-9b33-4a9b9214c20a", + "id": "81a2425c-0038-482e-869c-90b20b2170a5", "name": "404 response", "originalRequest": { "body": { diff --git a/backend/compact-connect/docs/postman/postman-collection.json b/backend/compact-connect/docs/postman/postman-collection.json index 199152544..643abc7a9 100644 --- a/backend/compact-connect/docs/postman/postman-collection.json +++ b/backend/compact-connect/docs/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "5f66dede-44e7-4836-974c-7d95890c630e", + "_postman_id": "189cd199-c3fb-4756-9123-a81f7e4da683", "description": { "content": "", "type": "text/plain" @@ -410,7 +410,7 @@ "item": [ { "event": [], - "id": "2947be35-f9b4-426e-bd4c-d7d4c22d6805", + "id": "8dc12956-b7b0-4161-a9a2-81c03f65f37e", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses", "protocolProfileBehavior": { "disableBodyPruning": true @@ -424,7 +424,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2645-07-26\",\n \"dateOfExpiration\": \"2828-03-03\",\n \"dateOfIssuance\": \"2731-01-13\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"ssn\": \"136-74-9894\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4963053110\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+30127955274\",\n \"dateOfRenewal\": \"1892-11-26\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2074-12-30\",\n \"dateOfExpiration\": \"2405-01-30\",\n \"dateOfIssuance\": \"2351-10-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"003-96-8237\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7623604602\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+79745125\",\n \"dateOfRenewal\": \"2956-08-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2052-10-30\",\n \"dateOfExpiration\": \"1511-10-08\",\n \"dateOfIssuance\": \"1843-11-21\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"239-43-2056\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3369587726\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+72545228\",\n \"dateOfRenewal\": \"2960-02-10\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1860-06-30\",\n \"dateOfExpiration\": \"2458-07-20\",\n \"dateOfIssuance\": \"1476-12-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"756-03-1406\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1398035599\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+042857896627\",\n \"dateOfRenewal\": \"1752-11-30\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "description": {}, "header": [ @@ -488,7 +488,7 @@ "value": "application/json" } ], - "id": "35a5a8a2-4609-407d-9d3f-222c66df1788", + "id": "24793fe5-8462-4285-a5ea-ec05fb9c99b4", "name": "200 response", "originalRequest": { "body": { @@ -499,7 +499,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2645-07-26\",\n \"dateOfExpiration\": \"2828-03-03\",\n \"dateOfIssuance\": \"2731-01-13\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"ssn\": \"136-74-9894\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4963053110\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+30127955274\",\n \"dateOfRenewal\": \"1892-11-26\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2074-12-30\",\n \"dateOfExpiration\": \"2405-01-30\",\n \"dateOfIssuance\": \"2351-10-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"003-96-8237\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7623604602\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+79745125\",\n \"dateOfRenewal\": \"2956-08-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2052-10-30\",\n \"dateOfExpiration\": \"1511-10-08\",\n \"dateOfIssuance\": \"1843-11-21\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"239-43-2056\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3369587726\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+72545228\",\n \"dateOfRenewal\": \"2960-02-10\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1860-06-30\",\n \"dateOfExpiration\": \"2458-07-20\",\n \"dateOfIssuance\": \"1476-12-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"756-03-1406\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1398035599\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+042857896627\",\n \"dateOfRenewal\": \"1752-11-30\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -540,7 +540,7 @@ }, { "_postman_previewlanguage": "json", - "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ]\n },\n \"key_1\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ]\n },\n \"key_2\": {\n \"key_0\": [\n \"\",\n \"\"\n ]\n },\n \"key_3\": {\n \"key_0\": [\n \"\",\n \"\"\n ]\n }\n }\n}", + "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ],\n \"key_2\": [\n \"\",\n \"\"\n ],\n \"key_3\": [\n \"\",\n \"\"\n ]\n }\n }\n}", "code": 400, "cookie": [], "header": [ @@ -549,7 +549,7 @@ "value": "application/json" } ], - "id": "a69fcb9f-37f9-4c6d-a195-9ae23053d841", + "id": "cab7e9ad-9e40-4453-aca0-c661c14d7008", "name": "400 response", "originalRequest": { "body": { @@ -560,7 +560,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2645-07-26\",\n \"dateOfExpiration\": \"2828-03-03\",\n \"dateOfIssuance\": \"2731-01-13\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"ssn\": \"136-74-9894\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4963053110\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+30127955274\",\n \"dateOfRenewal\": \"1892-11-26\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2074-12-30\",\n \"dateOfExpiration\": \"2405-01-30\",\n \"dateOfIssuance\": \"2351-10-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"003-96-8237\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7623604602\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+79745125\",\n \"dateOfRenewal\": \"2956-08-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2052-10-30\",\n \"dateOfExpiration\": \"1511-10-08\",\n \"dateOfIssuance\": \"1843-11-21\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"239-43-2056\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3369587726\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+72545228\",\n \"dateOfRenewal\": \"2960-02-10\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1860-06-30\",\n \"dateOfExpiration\": \"2458-07-20\",\n \"dateOfIssuance\": \"1476-12-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"756-03-1406\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1398035599\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+042857896627\",\n \"dateOfRenewal\": \"1752-11-30\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -631,7 +631,7 @@ } } ], - "id": "7be4d7f8-5b9a-40af-b7eb-19ace4dbd635", + "id": "d878087f-a06b-4d18-8bd6-41b090d6d28e", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -688,7 +688,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"upload\": {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n }\n}", + "body": "{\n \"upload\": {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\"\n },\n \"url\": \"\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -697,7 +697,7 @@ "value": "application/json" } ], - "id": "86562271-fd3e-4b33-920a-67cb03e72f84", + "id": "6147f109-c02e-4b35-8828-0db854e64b10", "name": "200 response", "originalRequest": { "body": {}, @@ -751,7 +751,7 @@ "item": [ { "event": [], - "id": "96eeb21f-485f-4bae-a755-1c83d559b766", + "id": "8030c288-7d5e-4779-ab13-16d6f225f108", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -765,7 +765,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"endDateTime\": \"1263-06-30T11:18:46Z\",\n \"startDateTime\": \"2179-10-19T23:39:33.39Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"endDateTime\": \"1517-12-03T23:50:46Z\",\n \"startDateTime\": \"1528-02-30T23:04:17Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -821,7 +821,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"17-32\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2120-08-30\",\n \"dateOfUpdate\": \"1173-06-05\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"wy\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"md\",\n \"co\"\n ],\n \"providerId\": \"5d8ebac9-4e07-4542-8cd1-fe5e880c3faf\",\n \"type\": \"provider\",\n \"npi\": \"5345682984\",\n \"dateOfBirth\": \"2663-11-06\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"9299\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"09-21\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1289-11-30\",\n \"dateOfUpdate\": \"2080-03-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"il\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"or\",\n \"ga\"\n ],\n \"providerId\": \"61431134-8e7c-4ef4-b17f-f5f553606b24\",\n \"type\": \"provider\",\n \"npi\": \"1773499258\",\n \"dateOfBirth\": \"1334-10-01\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"8312\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"02-02\",\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1610-12-07\",\n \"dateOfUpdate\": \"2920-10-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"ar\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"il\",\n \"nv\"\n ],\n \"providerId\": \"df6359ef-43ae-4807-91d8-dac3e4cccff1\",\n \"type\": \"provider\",\n \"npi\": \"3284060698\",\n \"dateOfBirth\": \"2303-09-30\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"0326\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"14-28\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1546-08-30\",\n \"dateOfUpdate\": \"1447-10-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"co\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"ny\",\n \"nc\"\n ],\n \"providerId\": \"c776fbfd-f2a9-485c-845b-4ff20bad5426\",\n \"type\": \"provider\",\n \"npi\": \"4369796985\",\n \"dateOfBirth\": \"1852-12-07\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"9749\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -830,7 +830,7 @@ "value": "application/json" } ], - "id": "fd157d64-b01d-4f79-ab23-69a99602f647", + "id": "1651689e-18b1-4a1a-ba86-2c520edb2154", "name": "200 response", "originalRequest": { "body": { @@ -841,7 +841,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"endDateTime\": \"1263-06-30T11:18:46Z\",\n \"startDateTime\": \"2179-10-19T23:39:33.39Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"endDateTime\": \"1517-12-03T23:50:46Z\",\n \"startDateTime\": \"1528-02-30T23:04:17Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -891,7 +891,7 @@ "item": [ { "event": [], - "id": "bde6bd63-70ba-4a55-bfdf-a49075d23e64", + "id": "e51ae75c-d529-4448-8ed4-7af441dda520", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -958,7 +958,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"privileges\": [\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1532-10-09\",\n \"dateOfIssuance\": \"2232-05-26\",\n \"dateOfRenewal\": \"2135-05-19\",\n \"dateOfUpdate\": \"2760-10-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ct\",\n \"licenseJurisdiction\": \"ri\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"01bba77b-79c3-4692-bcac-55721dc440e7\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"1296707478\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2962-06-30\",\n \"ssnLastFour\": \"8929\",\n \"phoneNumber\": \"+97589140949\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2474-12-13\",\n \"dateOfIssuance\": \"1648-03-07\",\n \"dateOfRenewal\": \"2527-12-03\",\n \"dateOfUpdate\": \"2575-12-24\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseJurisdiction\": \"wa\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"77d601ee-f28e-42ee-99a0-c086c6453645\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"0576030936\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2668-05-06\",\n \"ssnLastFour\": \"8289\",\n \"phoneNumber\": \"+2343846641\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n ],\n \"providerUIUrl\": \"\"\n}", + "body": "{\n \"privileges\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1972-09-09\",\n \"dateOfIssuance\": \"1247-05-01\",\n \"dateOfRenewal\": \"1087-09-07\",\n \"dateOfUpdate\": \"2935-03-01\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseJurisdiction\": \"sc\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"3c15f14f-3c2a-42b8-89e0-6f8f49db1f6b\",\n \"status\": \"active\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"4120280340\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2378-07-31\",\n \"ssnLastFour\": \"8907\",\n \"phoneNumber\": \"+965485591316\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2306-02-30\",\n \"dateOfIssuance\": \"1687-02-05\",\n \"dateOfRenewal\": \"2549-09-03\",\n \"dateOfUpdate\": \"1153-10-19\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ca\",\n \"licenseJurisdiction\": \"id\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"62e94259-1e5b-488e-8506-83c4637f34e4\",\n \"status\": \"active\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"9363356562\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2611-09-05\",\n \"ssnLastFour\": \"5869\",\n \"phoneNumber\": \"+90256877325325\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n ],\n \"providerUIUrl\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -967,7 +967,7 @@ "value": "application/json" } ], - "id": "c1a4cf7d-4e4e-44f7-a748-6205c0858200", + "id": "bf64bb35-a160-41b8-ad6b-a7e54328b7d9", "name": "200 response", "originalRequest": { "body": {}, From 81401f36217083dc28e9d3ec69f31fcf463ae745 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Tue, 21 Oct 2025 12:26:54 -0600 Subject: [PATCH 07/33] Tweak api docs --- .../api-specification/latest-oas30.json | 16 +- .../internal/postman/postman-collection.json | 306 +++++++++--------- .../docs/postman/postman-collection.json | 38 +-- .../stacks/api_stack/v1_api/api_model.py | 10 + .../GET_PROVIDER_RESPONSE_SCHEMA.json | 14 + .../PROVIDER_USER_RESPONSE_SCHEMA.json | 14 + 6 files changed, 225 insertions(+), 173 deletions(-) diff --git a/backend/compact-connect/docs/internal/api-specification/latest-oas30.json b/backend/compact-connect/docs/internal/api-specification/latest-oas30.json index ebe7e6b1b..9f19263d5 100644 --- a/backend/compact-connect/docs/internal/api-specification/latest-oas30.json +++ b/backend/compact-connect/docs/internal/api-specification/latest-oas30.json @@ -2,7 +2,7 @@ "openapi": "3.0.1", "info": { "title": "LicenseApi", - "version": "2025-10-18T00:04:47Z" + "version": "2025-10-21T17:05:28Z" }, "servers": [ { @@ -7276,6 +7276,13 @@ ], "type": "object", "properties": { + "investigationStatus": { + "type": "string", + "description": "Status indicating if the privilege is under investigation", + "enum": [ + "underInvestigation" + ] + }, "licenseJurisdiction": { "type": "string", "enum": [ @@ -8790,6 +8797,13 @@ "minLength": 1, "type": "string" }, + "investigationStatus": { + "type": "string", + "description": "Status indicating if the license is under investigation", + "enum": [ + "underInvestigation" + ] + }, "npi": { "pattern": "^[0-9]{10}$", "type": "string" diff --git a/backend/compact-connect/docs/internal/postman/postman-collection.json b/backend/compact-connect/docs/internal/postman/postman-collection.json index d018bf262..53c8c42e6 100644 --- a/backend/compact-connect/docs/internal/postman/postman-collection.json +++ b/backend/compact-connect/docs/internal/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "c807f816-c374-4deb-9a72-738530a080e5", + "_postman_id": "c3a072d2-b4f5-4371-a031-9ab8dedae3e8", "description": { "content": "", "type": "text/plain" @@ -401,7 +401,7 @@ "item": [ { "event": [], - "id": "378cab93-bd66-4bbd-980e-fe9474b6d703", + "id": "6ad1ee7e-dd0a-4b11-bf65-c6defba61488", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -444,7 +444,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"pr\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nm\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}", + "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"tn\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"de\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}", "code": 200, "cookie": [], "header": [ @@ -453,7 +453,7 @@ "value": "application/json" } ], - "id": "36f9b21a-fd80-4b42-a81b-8ba774476cc0", + "id": "43f8436f-b66f-4b5b-a54c-44af63632a22", "name": "200 response", "originalRequest": { "body": {}, @@ -491,7 +491,7 @@ }, { "event": [], - "id": "a1b76cc3-5a02-4f75-bece-5d1fa12d3792", + "id": "cf079f07-fc77-4115-a679-a70a58d59b04", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -505,7 +505,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"al\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ak\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"de\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"mt\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" }, "description": {}, "header": [ @@ -556,7 +556,7 @@ "value": "application/json" } ], - "id": "e7de36f8-bf85-40aa-905b-023d52642666", + "id": "eb39cfd9-6318-4a96-9ad7-ab370830c135", "name": "200 response", "originalRequest": { "body": { @@ -567,7 +567,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"al\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ak\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"de\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"mt\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" }, "header": [ { @@ -613,7 +613,7 @@ "item": [ { "event": [], - "id": "5c3070e4-3e23-4c38-a2ab-2f3b27e7ce01", + "id": "e851c485-48e8-4030-8aa1-5106e2bbbdd1", "name": "/v1/compacts/:compact/attestations/:attestationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -668,7 +668,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"dateCreated\": \"\",\n \"attestationId\": \"\",\n \"compact\": \"aslp\",\n \"text\": \"\",\n \"type\": \"attestation\",\n \"locale\": \"\",\n \"version\": \"\",\n \"required\": \"\"\n}", + "body": "{\n \"dateCreated\": \"\",\n \"attestationId\": \"\",\n \"compact\": \"coun\",\n \"text\": \"\",\n \"type\": \"attestation\",\n \"locale\": \"\",\n \"version\": \"\",\n \"required\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -677,7 +677,7 @@ "value": "application/json" } ], - "id": "e06d83bc-0b31-4a72-9c7a-5601a0996bc4", + "id": "d4978e9d-a039-40f2-abd2-dc5f460c6b82", "name": "200 response", "originalRequest": { "body": {}, @@ -729,7 +729,7 @@ "item": [ { "event": [], - "id": "8ccfe8ec-b13c-4499-87a4-e30df3f76681", + "id": "99b45af1-acb1-4737-ab8b-1be2ea8e0fde", "name": "/v1/compacts/:compact/credentials/payment-processor", "protocolProfileBehavior": { "disableBodyPruning": true @@ -796,7 +796,7 @@ "value": "application/json" } ], - "id": "0bc0308d-ac1f-40f9-b3a1-ffe528b23c46", + "id": "7b491db1-24e4-4340-bc74-0c9d09ab9d2f", "name": "200 response", "originalRequest": { "body": { @@ -858,7 +858,7 @@ "item": [ { "event": [], - "id": "e6185cd1-c402-4e17-a51a-3cfb4011367f", + "id": "493e7bab-41fe-4a12-b5f4-cf73aecec7ee", "name": "/v1/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -911,7 +911,7 @@ "value": "application/json" } ], - "id": "ff8b0ae9-70a5-46a6-bbd7-0554167de9f2", + "id": "4a64b97b-4550-44bb-b9a2-a7e48c5e78ad", "name": "200 response", "originalRequest": { "body": {}, @@ -956,7 +956,7 @@ "item": [ { "event": [], - "id": "bf5b516c-3df7-42fb-a0bd-d5adf976fdf0", + "id": "303a13ae-0fb8-45bb-92c5-25e4948466bf", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1021,7 +1021,7 @@ "value": "application/json" } ], - "id": "0c7b4738-5a83-4362-97ca-486d65b673d2", + "id": "34b5f4a4-e308-4286-a1e4-54ff683d86cc", "name": "200 response", "originalRequest": { "body": {}, @@ -1060,7 +1060,7 @@ }, { "_postman_previewlanguage": "json", - "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ]\n }\n }\n}", + "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ],\n \"key_2\": [\n \"\",\n \"\"\n ]\n },\n \"key_1\": {\n \"key_0\": [\n \"\",\n \"\"\n ]\n }\n }\n}", "code": 400, "cookie": [], "header": [ @@ -1069,7 +1069,7 @@ "value": "application/json" } ], - "id": "35973789-15a2-49d0-baf4-0fe4d68ab8ab", + "id": "bf29ade9-1681-4965-b80c-bd8e8b1bed31", "name": "400 response", "originalRequest": { "body": {}, @@ -1138,7 +1138,7 @@ } } ], - "id": "108f900f-6cc8-457d-90b2-f230f9060e1c", + "id": "00b164de-ca99-4844-9c7e-9315e2c8d2bb", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1195,7 +1195,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"upload\": {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\",\n \"key_3\": \"\"\n },\n \"url\": \"\"\n }\n}", + "body": "{\n \"upload\": {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -1204,7 +1204,7 @@ "value": "application/json" } ], - "id": "8339615c-34ef-4381-9c48-1e6259dd9158", + "id": "7e2f5b61-5145-4708-a8ad-32411afe6340", "name": "200 response", "originalRequest": { "body": {}, @@ -1264,7 +1264,7 @@ "item": [ { "event": [], - "id": "27060ef7-c87a-4e7d-8b3b-523a7219e4f8", + "id": "38fedb92-58f7-49f7-9ccd-bc362df7167b", "name": "/v1/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1278,7 +1278,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"a63f7f33-f63e-4d11-944d-ddcc64dacb8e\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"422eedd3-e6e6-4e51-8c54-c8c147e4017a\",\n \"jurisdiction\": \"ca\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -1322,7 +1322,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"18-13\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2746-02-31\",\n \"dateOfUpdate\": \"2699-07-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"hi\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"ne\",\n \"nd\"\n ],\n \"providerId\": \"dbd67eab-ddad-48f2-9357-fd0f4f70d2c1\",\n \"type\": \"provider\",\n \"npi\": \"6182323315\",\n \"dateOfBirth\": \"1164-11-31\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"de\",\n \"ssnLastFour\": \"1382\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"15-39\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1947-01-01\",\n \"dateOfUpdate\": \"2219-11-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"ok\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"vt\",\n \"nj\"\n ],\n \"providerId\": \"71702dda-14c7-469f-a989-add20cafeb95\",\n \"type\": \"provider\",\n \"npi\": \"7290021647\",\n \"dateOfBirth\": \"1428-01-31\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"tx\",\n \"ssnLastFour\": \"6550\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"06-26\",\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1930-11-02\",\n \"dateOfUpdate\": \"1712-11-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"la\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"ca\",\n \"ak\"\n ],\n \"providerId\": \"8c2cdc59-0e01-47e0-ace0-9611fc88023c\",\n \"type\": \"provider\",\n \"npi\": \"7695950418\",\n \"dateOfBirth\": \"2184-11-22\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ca\",\n \"ssnLastFour\": \"3561\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"06-34\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2855-12-14\",\n \"dateOfUpdate\": \"1992-12-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"ms\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"ne\",\n \"nc\"\n ],\n \"providerId\": \"5950857b-d8d7-4369-be7c-53fb194f4767\",\n \"type\": \"provider\",\n \"npi\": \"0946048286\",\n \"dateOfBirth\": \"2034-05-30\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ak\",\n \"ssnLastFour\": \"7642\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -1331,7 +1331,7 @@ "value": "application/json" } ], - "id": "6ffac135-5644-435c-b52f-4b0005452d41", + "id": "5c40ab79-b500-43e5-8f49-1cfacc08f5be", "name": "200 response", "originalRequest": { "body": { @@ -1342,7 +1342,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"a63f7f33-f63e-4d11-944d-ddcc64dacb8e\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"422eedd3-e6e6-4e51-8c54-c8c147e4017a\",\n \"jurisdiction\": \"ca\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -1390,7 +1390,7 @@ "item": [ { "event": [], - "id": "e4cfcab8-5d1e-4d10-a862-9b0479f62eab", + "id": "c76bb895-18ed-4d79-bbc3-1bde8a468730", "name": "/v1/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1445,7 +1445,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"12-26\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"1551-07-31\",\n \"dateOfUpdate\": \"1106-04-05\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"wv\",\n \"licenses\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2964-09-13\",\n \"dateOfIssuance\": \"2740-03-30\",\n \"dateOfRenewal\": \"2706-08-02\",\n \"dateOfUpdate\": \"2938-12-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1493-06-01\",\n \"jurisdiction\": \"sc\",\n \"previous\": {\n \"dateOfExpiration\": \"2874-06-02\",\n \"dateOfIssuance\": \"2945-11-10\",\n \"dateOfRenewal\": \"1810-11-10\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6670883159\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2154-07-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+5694198825224\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8286117972\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2413-11-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2851-11-08\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2945-12-30\",\n \"phoneNumber\": \"+29046722\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2653-12-29\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1080-06-09\",\n \"jurisdiction\": \"oh\",\n \"previous\": {\n \"dateOfExpiration\": \"2097-11-30\",\n \"dateOfIssuance\": \"2477-12-01\",\n \"dateOfRenewal\": \"2741-12-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2479221518\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2882-03-08\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+38682681713\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2602550575\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2484-03-22\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2183-02-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2937-07-31\",\n \"phoneNumber\": \"+11234935514\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1852-12-09\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"fl\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"d7e6eede-1d38-48e8-86fc-1d4b4c1a13a1\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1171-10-30\",\n \"dateOfUpdate\": \"1264-04-01\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"providerId\": \"563d9793-1a56-4e7d-800b-bfe7a3879017\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2375-05-18\",\n \"dateOfUpdate\": \"1754-08-23\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"la\",\n \"licenseType\": \"\",\n \"providerId\": \"2b6fad8a-82c1-4380-8d58-20b9059f3a6a\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"6022136795\",\n \"dateOfBirth\": \"2967-12-21\",\n \"ssnLastFour\": \"2014\",\n \"phoneNumber\": \"+41544480\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1358-06-12\",\n \"dateOfUpdate\": \"1458-10-31\",\n \"effectiveStartDate\": \"2908-04-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"04886aaf-0ad5-467d-9e74-269b3481597c\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1170-08-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2228-11-13\",\n \"dateOfUpdate\": \"1851-09-30\",\n \"effectiveStartDate\": \"1134-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"me\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9468ad35-9387-43ad-a560-a5044d6cf65c\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1563-11-10\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1857-07-08\",\n \"dateOfIssuance\": \"2537-10-30\",\n \"dateOfRenewal\": \"2176-09-31\",\n \"dateOfUpdate\": \"2872-12-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1561-11-05\",\n \"jurisdiction\": \"me\",\n \"previous\": {\n \"dateOfExpiration\": \"2826-11-30\",\n \"dateOfIssuance\": \"1820-09-01\",\n \"dateOfRenewal\": \"1510-03-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0580762832\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1606-10-16\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+331066958\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0390027717\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2717-11-06\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2237-11-06\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1851-10-10\",\n \"phoneNumber\": \"+553347120577998\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1762-01-03\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1232-03-05\",\n \"jurisdiction\": \"wy\",\n \"previous\": {\n \"dateOfExpiration\": \"1426-09-14\",\n \"dateOfIssuance\": \"1386-07-15\",\n \"dateOfRenewal\": \"2763-12-23\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4651974073\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1159-04-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+3128513735\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0839042399\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2907-02-06\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2516-06-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2269-11-22\",\n \"phoneNumber\": \"+3076364826382\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2871-12-05\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"md\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"a4363987-f1c3-438e-a713-0090074868aa\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2821-12-27\",\n \"dateOfUpdate\": \"1744-08-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"providerId\": \"ce5c78f5-4cda-4b95-b4a4-a4df7c500951\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2145-11-16\",\n \"dateOfUpdate\": \"1482-05-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"dc\",\n \"licenseType\": \"\",\n \"providerId\": \"409143f2-e7ed-4625-b463-98112f4a373c\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"3536621926\",\n \"dateOfBirth\": \"1790-07-31\",\n \"ssnLastFour\": \"9958\",\n \"phoneNumber\": \"+54047993\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2079-06-15\",\n \"dateOfUpdate\": \"1290-10-08\",\n \"effectiveStartDate\": \"1209-11-18\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"635c4998-88b8-4fe1-831d-4b3148b056c9\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1836-12-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1883-12-14\",\n \"dateOfUpdate\": \"1744-07-04\",\n \"effectiveStartDate\": \"1627-06-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"38af0242-27a5-405c-8f58-e75d6546038e\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1597-08-30\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1660-10-21\",\n \"dateOfUpload\": \"2691-08-04\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"f8417074-5c9c-4776-a522-990938e5d07c\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2105-12-31\",\n \"dateOfUpload\": \"1381-06-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"68eaa44e-0711-4de2-a7e5-154bb5d320b0\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"mi\",\n \"ut\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"octp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1057-11-13\",\n \"dateOfIssuance\": \"1218-10-29\",\n \"dateOfRenewal\": \"2792-11-07\",\n \"dateOfUpdate\": \"2496-07-24\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1987-09-09\",\n \"jurisdiction\": \"ca\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1689-11-25\",\n \"dateOfIssuance\": \"2820-10-03\",\n \"dateOfRenewal\": \"2435-06-30\",\n \"dateOfUpdate\": \"2233-05-01\",\n \"licenseJurisdiction\": \"de\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"vi\",\n \"type\": \"privilege\",\n \"providerId\": \"60978e58-e4db-4dca-9b17-44ca1086ae71\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"tn\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ny\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2569-01-15\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2366-11-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"5fda3d1c-dfe2-429b-bac4-afa714621d52\",\n \"dateOfRenewal\": \"2162-11-05\",\n \"dateOfUpdate\": \"2527-11-17\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2821-12-08\",\n \"jurisdiction\": \"nv\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2879-03-03\",\n \"dateOfIssuance\": \"2484-11-05\",\n \"dateOfRenewal\": \"1920-10-23\",\n \"dateOfUpdate\": \"1312-08-31\",\n \"licenseJurisdiction\": \"co\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"va\",\n \"type\": \"privilege\",\n \"providerId\": \"52656e71-216a-474d-a721-151b226833ed\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"sd\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"oh\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2645-08-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2194-11-06\",\n \"privilegeId\": \"\",\n \"providerId\": \"e1e737a4-ef9f-4c57-b6eb-c7ddff454d96\",\n \"dateOfRenewal\": \"1975-10-11\",\n \"dateOfUpdate\": \"1903-10-31\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ri\",\n \"licenseJurisdiction\": \"ok\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"c31885ae-dd58-4029-9034-d6751eba3708\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1962-03-01\",\n \"dateOfUpdate\": \"1693-11-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"providerId\": \"09dee976-b64a-498e-bec5-d12a42877923\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2856-09-31\",\n \"dateOfUpdate\": \"1753-12-09\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"0d2cd0d5-d250-45f5-9365-e6627ad640e4\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1520-10-30\",\n \"dateOfUpdate\": \"2513-04-31\",\n \"effectiveStartDate\": \"1562-12-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e3d0c2e1-e4b1-43f6-b6de-2133dec40e8d\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2365-11-03\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2372-02-26\",\n \"dateOfUpdate\": \"2227-10-31\",\n \"effectiveStartDate\": \"2681-12-03\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"sd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e014f2c4-ec73-40b0-ae37-da670b7f849a\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2248-12-07\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2541-05-01\",\n \"dateOfIssuance\": \"1604-09-30\",\n \"dateOfRenewal\": \"1081-10-30\",\n \"dateOfUpdate\": \"1116-02-13\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1736-08-28\",\n \"jurisdiction\": \"la\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1319-10-14\",\n \"dateOfIssuance\": \"2183-01-06\",\n \"dateOfRenewal\": \"2554-12-22\",\n \"dateOfUpdate\": \"2695-11-31\",\n \"licenseJurisdiction\": \"ct\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"dc\",\n \"type\": \"privilege\",\n \"providerId\": \"7472d4df-e3a8-4389-a4a2-cb49edce4b6e\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ok\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ga\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2895-12-30\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1355-04-19\",\n \"privilegeId\": \"\",\n \"providerId\": \"ed891a33-4bde-4573-a46e-8d9429b2a32e\",\n \"dateOfRenewal\": \"1131-08-18\",\n \"dateOfUpdate\": \"1943-09-22\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2014-10-14\",\n \"jurisdiction\": \"id\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2285-11-31\",\n \"dateOfIssuance\": \"1219-09-09\",\n \"dateOfRenewal\": \"2746-08-20\",\n \"dateOfUpdate\": \"2653-12-20\",\n \"licenseJurisdiction\": \"vi\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wv\",\n \"type\": \"privilege\",\n \"providerId\": \"5c49424a-dcf0-4943-8f37-b7596db87809\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pr\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"nj\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1721-12-31\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2286-12-03\",\n \"privilegeId\": \"\",\n \"providerId\": \"5909f954-efb5-4f1e-b3f9-04fe35c79b3d\",\n \"dateOfRenewal\": \"1148-12-07\",\n \"dateOfUpdate\": \"1303-12-08\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"tn\",\n \"licenseJurisdiction\": \"or\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"d7e992cc-a401-41d6-8889-088003df65ae\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2633-11-04\",\n \"dateOfUpdate\": \"1658-11-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"providerId\": \"b068c6de-3f01-4fe2-8f2f-8962d45c76c5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2566-11-05\",\n \"dateOfUpdate\": \"1755-09-06\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"c9d6b593-f709-4e8e-8232-e215d785b7b7\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1822-11-18\",\n \"dateOfUpdate\": \"2048-04-03\",\n \"effectiveStartDate\": \"2723-02-07\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1cbba6b4-7bb5-4c3d-811a-551083e27b45\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1606-01-31\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1069-03-21\",\n \"dateOfUpdate\": \"2086-10-20\",\n \"effectiveStartDate\": \"2962-10-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"88ec9865-d5b4-49cd-9243-ad6000b526ef\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1279-11-01\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"dc6dd272-12e0-49a5-9f97-9e12963e66c1\",\n \"type\": \"provider\",\n \"npi\": \"9149208010\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1567-03-08\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"tx\",\n \"ssnLastFour\": \"2327\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"03-22\",\n \"compact\": \"aslp\",\n \"dateOfExpiration\": \"2657-11-31\",\n \"dateOfUpdate\": \"1604-06-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"pa\",\n \"licenses\": [\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2574-12-31\",\n \"dateOfIssuance\": \"2044-10-20\",\n \"dateOfRenewal\": \"1010-04-05\",\n \"dateOfUpdate\": \"1544-11-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2524-12-17\",\n \"jurisdiction\": \"wa\",\n \"previous\": {\n \"dateOfExpiration\": \"2484-11-16\",\n \"dateOfIssuance\": \"2041-10-06\",\n \"dateOfRenewal\": \"1974-04-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6442416970\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2516-12-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+14716334733\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0995585070\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2411-11-30\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2244-11-10\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1713-01-07\",\n \"phoneNumber\": \"+574251462853\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2553-07-30\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2584-04-25\",\n \"jurisdiction\": \"la\",\n \"previous\": {\n \"dateOfExpiration\": \"1989-05-02\",\n \"dateOfIssuance\": \"2851-11-02\",\n \"dateOfRenewal\": \"1298-11-07\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0650459974\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1937-09-05\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+376845697340586\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7224020406\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2507-12-31\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1876-05-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1806-10-08\",\n \"phoneNumber\": \"+37933151358370\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1071-11-30\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"pr\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"4e44d44e-970b-4af2-91f8-2fe7c6e6c833\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1607-10-01\",\n \"dateOfUpdate\": \"2402-05-22\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"fl\",\n \"licenseType\": \"\",\n \"providerId\": \"781ce0f4-b82a-4de1-9e35-4a037055f8e2\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2917-12-19\",\n \"dateOfUpdate\": \"2749-10-24\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"providerId\": \"69e0724f-a213-48b8-a8d6-117318e034e0\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8668688589\",\n \"dateOfBirth\": \"1640-11-31\",\n \"ssnLastFour\": \"4582\",\n \"phoneNumber\": \"+42942621417\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2878-09-31\",\n \"dateOfUpdate\": \"2396-02-03\",\n \"effectiveStartDate\": \"1806-12-25\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"dc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8f22deda-2b45-42a9-802e-0f92b84108cc\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2859-01-06\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2950-12-31\",\n \"dateOfUpdate\": \"2822-06-08\",\n \"effectiveStartDate\": \"1264-02-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wv\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"444915b6-7afc-402f-ab2d-df19c4a651cc\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2525-11-06\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2432-05-10\",\n \"dateOfIssuance\": \"1781-01-06\",\n \"dateOfRenewal\": \"1277-01-03\",\n \"dateOfUpdate\": \"2119-11-10\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2489-10-05\",\n \"jurisdiction\": \"ct\",\n \"previous\": {\n \"dateOfExpiration\": \"2929-03-30\",\n \"dateOfIssuance\": \"1749-11-30\",\n \"dateOfRenewal\": \"2732-03-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1435047632\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2282-06-17\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+88163559391529\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9353688494\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2046-07-06\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2776-08-15\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1475-12-31\",\n \"phoneNumber\": \"+235534655391758\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2288-11-14\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1694-12-30\",\n \"jurisdiction\": \"il\",\n \"previous\": {\n \"dateOfExpiration\": \"2092-01-16\",\n \"dateOfIssuance\": \"1915-12-05\",\n \"dateOfRenewal\": \"2230-07-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4218943561\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2795-10-26\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+06909950\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7663347370\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1746-05-10\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2751-01-08\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1190-11-30\",\n \"phoneNumber\": \"+403789329496\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1238-10-08\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ok\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"middleName\": \"\",\n \"providerId\": \"fe6eda6a-ffa1-4e00-af65-2b5d9abf381a\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2718-04-30\",\n \"dateOfUpdate\": \"1458-07-06\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ia\",\n \"licenseType\": \"\",\n \"providerId\": \"989e9102-768d-4466-b850-5a91f08aa44f\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2908-11-09\",\n \"dateOfUpdate\": \"1291-10-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"db13fac7-b280-4f45-b7b8-d943752dd7dc\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8441754185\",\n \"dateOfBirth\": \"2745-10-03\",\n \"ssnLastFour\": \"9644\",\n \"phoneNumber\": \"+14980061408\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1441-11-31\",\n \"dateOfUpdate\": \"1813-10-30\",\n \"effectiveStartDate\": \"1547-10-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"pa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a8deaf8a-b322-4bd0-88ac-a82eb9fe9b1d\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1745-08-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2237-12-16\",\n \"dateOfUpdate\": \"1857-12-30\",\n \"effectiveStartDate\": \"2190-03-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"664202ba-985b-4b39-bd5b-ef489655e428\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1505-01-19\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2733-12-18\",\n \"dateOfUpload\": \"1363-01-08\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"3fe889b9-d7de-4f96-b5fe-0644e30444cb\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1728-10-05\",\n \"dateOfUpload\": \"2605-04-22\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"831a8155-5ac3-41e0-8e9e-ed7710f0796a\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"co\",\n \"or\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"octp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1259-11-30\",\n \"dateOfIssuance\": \"1363-05-30\",\n \"dateOfRenewal\": \"2389-12-10\",\n \"dateOfUpdate\": \"1900-09-31\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2022-01-31\",\n \"jurisdiction\": \"tn\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1042-12-21\",\n \"dateOfIssuance\": \"2805-08-31\",\n \"dateOfRenewal\": \"2995-12-06\",\n \"dateOfUpdate\": \"2905-03-23\",\n \"licenseJurisdiction\": \"fl\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"vi\",\n \"type\": \"privilege\",\n \"providerId\": \"2e721160-889e-4f70-a693-0fb2458c9a4e\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pa\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"nc\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1028-09-30\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2319-10-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"f0d492aa-ffef-4a8c-a265-ec0e177018f8\",\n \"dateOfRenewal\": \"2412-10-02\",\n \"dateOfUpdate\": \"1252-05-30\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2422-03-31\",\n \"jurisdiction\": \"pr\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2818-12-18\",\n \"dateOfIssuance\": \"2622-10-27\",\n \"dateOfRenewal\": \"1130-12-19\",\n \"dateOfUpdate\": \"2233-11-21\",\n \"licenseJurisdiction\": \"tn\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"tx\",\n \"type\": \"privilege\",\n \"providerId\": \"f69e67a5-b3ca-4896-a9b3-a5a74c8a054d\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"tx\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wy\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2746-07-21\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2172-11-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"f86a9693-a435-4c7f-b951-631e2e87084f\",\n \"dateOfRenewal\": \"2146-09-02\",\n \"dateOfUpdate\": \"1388-10-03\",\n \"status\": \"active\"\n }\n }\n ],\n \"jurisdiction\": \"fl\",\n \"licenseJurisdiction\": \"mi\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"5be867b1-6585-4ada-8282-3f4d85c34ad2\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1331-10-05\",\n \"dateOfUpdate\": \"2068-01-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"\",\n \"providerId\": \"e9cbbb0f-cf7b-464b-9d84-c0e1275fd9eb\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2562-11-01\",\n \"dateOfUpdate\": \"1288-12-22\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"or\",\n \"licenseType\": \"\",\n \"providerId\": \"4baed6e7-c08f-4442-b180-ee327399bb85\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1550-04-16\",\n \"dateOfUpdate\": \"1448-04-30\",\n \"effectiveStartDate\": \"1507-01-02\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4d203fd3-7400-4be1-a2a5-cd9439f72371\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2273-09-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1658-12-18\",\n \"dateOfUpdate\": \"1322-09-30\",\n \"effectiveStartDate\": \"2324-10-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"860218c9-eff0-44fc-bc5b-b6b28fd24516\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2696-12-31\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1158-11-23\",\n \"dateOfIssuance\": \"2092-12-31\",\n \"dateOfRenewal\": \"2905-08-08\",\n \"dateOfUpdate\": \"2882-10-30\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1488-12-31\",\n \"jurisdiction\": \"hi\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1934-09-19\",\n \"dateOfIssuance\": \"1673-04-10\",\n \"dateOfRenewal\": \"2565-10-30\",\n \"dateOfUpdate\": \"2424-10-31\",\n \"licenseJurisdiction\": \"tx\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"de\",\n \"type\": \"privilege\",\n \"providerId\": \"ad9efd55-c764-446b-87a5-4e5832d98578\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"mo\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"co\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1695-10-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2557-03-14\",\n \"privilegeId\": \"\",\n \"providerId\": \"dc3ed083-ada3-4fe3-b783-c89e14cc061a\",\n \"dateOfRenewal\": \"2111-11-18\",\n \"dateOfUpdate\": \"2763-02-02\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2343-12-15\",\n \"jurisdiction\": \"co\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1872-10-28\",\n \"dateOfIssuance\": \"2218-06-31\",\n \"dateOfRenewal\": \"1817-11-03\",\n \"dateOfUpdate\": \"1499-10-02\",\n \"licenseJurisdiction\": \"or\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"in\",\n \"type\": \"privilege\",\n \"providerId\": \"bfda02d9-23be-47e8-98e9-6e121e753cf6\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ca\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"la\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1494-09-03\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1911-02-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"864086a2-0c4b-453e-84b2-28373fd90b7d\",\n \"dateOfRenewal\": \"2887-10-30\",\n \"dateOfUpdate\": \"2903-11-09\",\n \"status\": \"active\"\n }\n }\n ],\n \"jurisdiction\": \"ak\",\n \"licenseJurisdiction\": \"nv\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"b859a4d1-335d-4976-85c1-f64ed079a9d3\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1887-02-06\",\n \"dateOfUpdate\": \"2425-12-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wv\",\n \"licenseType\": \"\",\n \"providerId\": \"c830f472-498d-4397-9960-bb642bd86c9e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1301-10-29\",\n \"dateOfUpdate\": \"2375-12-11\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"tx\",\n \"licenseType\": \"\",\n \"providerId\": \"be6bd06e-d53e-493c-afd4-6e9012c0c47f\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1358-10-19\",\n \"dateOfUpdate\": \"1464-06-02\",\n \"effectiveStartDate\": \"2568-11-27\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ca\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"f4cfc154-91f1-428e-a369-4f0eeb24fb08\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1473-05-25\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1863-01-04\",\n \"dateOfUpdate\": \"1211-12-30\",\n \"effectiveStartDate\": \"2638-09-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ct\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b0c424b7-37a9-4e9f-a4d3-85e1ad0f4b49\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1806-12-27\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"f1f4e32f-c9f0-4a5c-bf5b-a2f8873bc510\",\n \"type\": \"provider\",\n \"npi\": \"2373388240\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1172-11-26\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"nj\",\n \"ssnLastFour\": \"0051\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -1454,7 +1454,7 @@ "value": "application/json" } ], - "id": "6f583753-86c6-42a6-ad81-7cd921d0c884", + "id": "e7966138-f686-4bf8-a227-5a1b38812208", "name": "200 response", "originalRequest": { "body": {}, @@ -1512,7 +1512,7 @@ "item": [ { "event": [], - "id": "ff81349e-db7d-44b1-ab74-7544d1c9f969", + "id": "cb8a79cc-a00b-4054-a9de-ab1d59c40a37", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1526,7 +1526,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1586-11-01\",\n \"encumbranceType\": \"fine\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2814-11-16\",\n \"encumbranceType\": \"probation\"\n}" }, "description": {}, "header": [ @@ -1615,7 +1615,7 @@ "value": "application/json" } ], - "id": "ed186f26-aea5-4d39-93ce-2ade118b45af", + "id": "d00d7d1f-429d-4525-bfb5-1c85a7694555", "name": "200 response", "originalRequest": { "body": { @@ -1626,7 +1626,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1586-11-01\",\n \"encumbranceType\": \"fine\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2814-11-16\",\n \"encumbranceType\": \"probation\"\n}" }, "header": [ { @@ -1677,7 +1677,7 @@ "item": [ { "event": [], - "id": "12ebe5df-db93-4d59-b429-bf86bb91ce30", + "id": "0e14106b-9fae-43f7-87ed-5f94e8a39d9b", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1691,7 +1691,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2419-03-30\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1837-05-02\"\n}" }, "description": {}, "header": [ @@ -1791,7 +1791,7 @@ "value": "application/json" } ], - "id": "198f1a02-2111-453d-b226-d76e407c1295", + "id": "ff522442-046e-4ced-b9e1-2d182bc41de4", "name": "200 response", "originalRequest": { "body": { @@ -1802,7 +1802,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2419-03-30\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1837-05-02\"\n}" }, "header": [ { @@ -1860,7 +1860,7 @@ "item": [ { "event": [], - "id": "587e8439-09ba-45cd-9938-f1b614e35f9b", + "id": "337f8f5d-20b0-4e47-b56d-1ccaf59f2d15", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1950,7 +1950,7 @@ "value": "application/json" } ], - "id": "9c41b567-be86-43a9-8383-7b21d58e1daa", + "id": "e94df1f1-1b14-4b71-ba2a-7380b1847279", "name": "200 response", "originalRequest": { "body": {}, @@ -1999,7 +1999,7 @@ "item": [ { "event": [], - "id": "bc8e4d23-924c-4b22-b513-56b042be5353", + "id": "e617975f-6e32-4afc-96b1-a686be9757aa", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2013,7 +2013,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1710-05-30\",\n \"encumbranceType\": \"denial\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2500-10-06\",\n \"encumbranceType\": \"other monitoring\"\n }\n}" }, "description": {}, "header": [ @@ -2113,7 +2113,7 @@ "value": "application/json" } ], - "id": "e8353133-b3f7-41ea-9dc3-a4bf5a3f8640", + "id": "539c62f9-047a-439b-b743-cb1b4106af28", "name": "200 response", "originalRequest": { "body": { @@ -2124,7 +2124,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1710-05-30\",\n \"encumbranceType\": \"denial\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2500-10-06\",\n \"encumbranceType\": \"other monitoring\"\n }\n}" }, "header": [ { @@ -2212,7 +2212,7 @@ "item": [ { "event": [], - "id": "bcf48b0b-a187-4622-9c6e-ad9f682efd44", + "id": "5538d966-6677-4b12-8974-f29241523029", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/deactivate", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2315,7 +2315,7 @@ "value": "application/json" } ], - "id": "16a27230-7885-42fc-b7c7-05d08705cfee", + "id": "a0aeff27-bcfc-4302-9a2a-bb6bdf125331", "name": "200 response", "originalRequest": { "body": { @@ -2380,7 +2380,7 @@ "item": [ { "event": [], - "id": "3bbd0dea-8359-4188-9ab9-28d9dbb5fdf1", + "id": "c7849cf4-5781-41a5-a357-1fc315f90be7", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2394,7 +2394,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1586-11-01\",\n \"encumbranceType\": \"fine\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2814-11-16\",\n \"encumbranceType\": \"probation\"\n}" }, "description": {}, "header": [ @@ -2483,7 +2483,7 @@ "value": "application/json" } ], - "id": "e542483b-faa3-43bc-8afc-12aef1b7126c", + "id": "3cb59468-cc20-4913-ac5a-1a28ebc971b8", "name": "200 response", "originalRequest": { "body": { @@ -2494,7 +2494,7 @@ "language": "json" } }, - "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1586-11-01\",\n \"encumbranceType\": \"fine\"\n}" + "raw": "{\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2814-11-16\",\n \"encumbranceType\": \"probation\"\n}" }, "header": [ { @@ -2545,7 +2545,7 @@ "item": [ { "event": [], - "id": "c499e41c-1041-4919-9fd6-6055f02d9744", + "id": "17959c7e-0a68-4d84-ae7e-10c6ea7203cd", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2559,7 +2559,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2419-03-30\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1837-05-02\"\n}" }, "description": {}, "header": [ @@ -2659,7 +2659,7 @@ "value": "application/json" } ], - "id": "751a2925-49bc-44e3-b1b0-4eec74f76f8e", + "id": "da3bfdee-b5f1-4337-8ec5-e3365475b1f1", "name": "200 response", "originalRequest": { "body": { @@ -2670,7 +2670,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2419-03-30\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1837-05-02\"\n}" }, "header": [ { @@ -2728,7 +2728,7 @@ "item": [ { "event": [], - "id": "faddf96d-7ca0-4c62-9983-4ff083f67b57", + "id": "dbb42521-da9e-45f1-8940-08a14ca344b5", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2809,7 +2809,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"octp\",\n \"events\": [\n {\n \"createDate\": \"2787-10-31\",\n \"dateOfUpdate\": \"2310-09-03\",\n \"effectiveDate\": \"2678-06-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"1854-11-08\",\n \"dateOfUpdate\": \"2995-02-27\",\n \"effectiveDate\": \"2049-06-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"hi\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"2dba0e24-f0a5-408c-912d-941be4c11f19\"\n}", + "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"2740-12-30\",\n \"dateOfUpdate\": \"2363-06-19\",\n \"effectiveDate\": \"1840-05-03\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2804-11-30\",\n \"dateOfUpdate\": \"1752-10-31\",\n \"effectiveDate\": \"1738-06-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ca\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"8d73f1ff-26af-4ed6-856f-dbff3116800d\"\n}", "code": 200, "cookie": [], "header": [ @@ -2818,7 +2818,7 @@ "value": "application/json" } ], - "id": "125cba7c-5f5f-4fd3-a08e-ee336ab29bd0", + "id": "cc9735d3-8109-4f67-9581-29dbb8ca6d5b", "name": "200 response", "originalRequest": { "body": {}, @@ -2870,7 +2870,7 @@ "item": [ { "event": [], - "id": "3a32b06e-51c4-46f4-9dc1-064bf8be4865", + "id": "7446f0e0-734f-40c2-b57d-840b48e06405", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2960,7 +2960,7 @@ "value": "application/json" } ], - "id": "647f003c-6520-4076-ae3b-18e041862fb6", + "id": "dac75a66-40a4-42fe-8c1f-6a5a225f2b0f", "name": "200 response", "originalRequest": { "body": {}, @@ -3009,7 +3009,7 @@ "item": [ { "event": [], - "id": "5185b870-7b1f-4483-ae5a-771f4f4d683d", + "id": "a47a97e8-b118-4c59-9217-c96bb2203dc0", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3023,7 +3023,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1710-05-30\",\n \"encumbranceType\": \"denial\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2500-10-06\",\n \"encumbranceType\": \"other monitoring\"\n }\n}" }, "description": {}, "header": [ @@ -3123,7 +3123,7 @@ "value": "application/json" } ], - "id": "53dd9999-edaa-44a3-a4de-825ea076cadd", + "id": "b4c91482-ec0f-49bc-bf2c-77dd5ecf64e4", "name": "200 response", "originalRequest": { "body": { @@ -3134,7 +3134,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"1710-05-30\",\n \"encumbranceType\": \"denial\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"clinicalPrivilegeActionCategory\": \"\",\n \"encumbranceEffectiveDate\": \"2500-10-06\",\n \"encumbranceType\": \"other monitoring\"\n }\n}" }, "header": [ { @@ -3207,7 +3207,7 @@ "item": [ { "event": [], - "id": "c8cada73-beaa-4849-9b88-c3acb7e78719", + "id": "6d9f3168-5ad7-4e4f-8e5c-b3adbf678364", "name": "/v1/compacts/:compact/providers/:providerId/ssn", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3263,7 +3263,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"ssn\": \"945-51-8012\"\n}", + "body": "{\n \"ssn\": \"185-92-5880\"\n}", "code": 200, "cookie": [], "header": [ @@ -3272,7 +3272,7 @@ "value": "application/json" } ], - "id": "a221bccf-5d86-4d2e-b734-c7e43890211a", + "id": "1732ac45-3a4d-48bf-89ac-c808ecf71cf3", "name": "200 response", "originalRequest": { "body": {}, @@ -3325,7 +3325,7 @@ "item": [ { "event": [], - "id": "f00253fa-75a1-4050-b0e1-cfa8965f4416", + "id": "e73bbabb-703c-4d63-9eb7-9058912b9a38", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3369,7 +3369,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n }\n ]\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n }\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -3387,7 +3387,7 @@ "value": "" } ], - "id": "7ca3145a-7ae4-4c1c-81bf-a6eca85a2818", + "id": "21d1ecc2-5980-43a0-8e24-7588b85e0f4e", "name": "200 response", "originalRequest": { "body": {}, @@ -3426,7 +3426,7 @@ }, { "event": [], - "id": "86bb688b-3a3d-4593-bc98-2750b4456da3", + "id": "1f1b9377-ea37-4b31-8694-2523807a5850", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3440,7 +3440,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3483,7 +3483,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3501,7 +3501,7 @@ "value": "" } ], - "id": "b8704d2b-48a7-4704-9dd3-b75660809098", + "id": "728f23c9-5bc6-4b4d-9917-bde67c2d96ae", "name": "200 response", "originalRequest": { "body": { @@ -3512,7 +3512,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3556,7 +3556,7 @@ "item": [ { "event": [], - "id": "cd4323dc-dfaf-4890-88ad-5768ad006aad", + "id": "0a712c5e-5819-47e9-b66b-1af4bc8423fa", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3611,7 +3611,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3629,7 +3629,7 @@ "value": "" } ], - "id": "61ee6c56-6d0f-4e2b-b3be-e789ca9c6a8c", + "id": "c224c3f2-4c71-408b-b9a0-e961c949c3a6", "name": "200 response", "originalRequest": { "body": {}, @@ -3676,7 +3676,7 @@ "value": "application/json" } ], - "id": "297f6c07-adc6-477a-8908-f052460b171b", + "id": "b904ca8d-be50-4dbc-b7a9-e1617b67c1ca", "name": "404 response", "originalRequest": { "body": {}, @@ -3716,7 +3716,7 @@ }, { "event": [], - "id": "30c6e4f8-cae9-41a6-a4f1-ba49eec42498", + "id": "42483e79-796a-4ca1-9c97-75eda50a6882", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3780,7 +3780,7 @@ "value": "application/json" } ], - "id": "6e710a7d-7867-4250-89f6-ded1bb32d892", + "id": "49d84db8-8bbf-44be-9c54-19b3359d1bd6", "name": "200 response", "originalRequest": { "body": {}, @@ -3827,7 +3827,7 @@ "value": "application/json" } ], - "id": "66026c95-a4c1-445a-90e7-1d36a19e6c61", + "id": "41bdeb61-2734-4df7-bf35-6185cce108e2", "name": "404 response", "originalRequest": { "body": {}, @@ -3867,7 +3867,7 @@ }, { "event": [], - "id": "d90210f3-1d85-414d-b91a-6635e7d12306", + "id": "0565d444-80e3-4cbf-be9e-7274e8a2183e", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3881,7 +3881,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3935,7 +3935,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3953,7 +3953,7 @@ "value": "" } ], - "id": "140eb696-8c68-4b1b-b81b-fbe5082e3b70", + "id": "ff537cb1-b66f-4fda-b1c6-c29e3515cd13", "name": "200 response", "originalRequest": { "body": { @@ -3964,7 +3964,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -4013,7 +4013,7 @@ "value": "application/json" } ], - "id": "5c94a5f8-0df4-4616-b9c7-9ab6d29c5c0a", + "id": "ac1bb47d-1179-4910-ad1d-dc24d92152b8", "name": "404 response", "originalRequest": { "body": { @@ -4024,7 +4024,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -4069,7 +4069,7 @@ "item": [ { "event": [], - "id": "ce7cad7e-3ad3-446d-a200-96d98d9cae99", + "id": "613988b6-b7f5-4cac-b59e-7e5c36fe126b", "name": "/v1/compacts/:compact/staff-users/:userId/reinvite", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4134,7 +4134,7 @@ "value": "application/json" } ], - "id": "2262bef6-0155-49db-a1ed-b7555086fd3a", + "id": "09eefbaf-1840-4658-bc4b-76387782dc96", "name": "200 response", "originalRequest": { "body": {}, @@ -4182,7 +4182,7 @@ "value": "application/json" } ], - "id": "48605014-f3a5-424c-9f57-040b3d4a8b34", + "id": "74f6e062-0dc8-48cc-b68d-ae245745ef51", "name": "404 response", "originalRequest": { "body": {}, @@ -4247,7 +4247,7 @@ "item": [ { "event": [], - "id": "acf643c2-58e1-445a-be9f-776f162155da", + "id": "ee72b4cf-920f-4b0f-885a-3a79ea774e73", "name": "/v1/flags/:flagId/check", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4316,7 +4316,7 @@ "value": "application/json" } ], - "id": "419b5b60-3c7d-4809-be09-e5b193f139ed", + "id": "da920bd5-6097-4cf5-b7ae-4ba23ae63d90", "name": "200 response", "originalRequest": { "body": { @@ -4385,7 +4385,7 @@ "item": [ { "event": [], - "id": "5816d6e2-5727-4d18-b142-8fc6cb41b9c6", + "id": "68bd5b73-1d68-4499-aae8-8209a7b0849c", "name": "/v1/provider-users/initiateRecovery", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4402,7 +4402,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"aslp\",\n \"dob\": \"2953-08-26\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"in\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"2228\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" + "raw": "{\n \"compact\": \"coun\",\n \"dob\": \"1789-12-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ia\",\n \"licenseType\": \"occupational therapist\",\n \"partialSocial\": \"8910\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" }, "description": {}, "header": [ @@ -4442,7 +4442,7 @@ "value": "application/json" } ], - "id": "0b6dbf50-80e6-4638-8ac7-79df9665202e", + "id": "c36e782d-faa6-46a3-aba9-d9f9f1c4f332", "name": "200 response", "originalRequest": { "body": { @@ -4453,7 +4453,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"aslp\",\n \"dob\": \"2953-08-26\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"in\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"2228\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" + "raw": "{\n \"compact\": \"coun\",\n \"dob\": \"1789-12-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ia\",\n \"licenseType\": \"occupational therapist\",\n \"partialSocial\": \"8910\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" }, "header": [ { @@ -4491,7 +4491,7 @@ "item": [ { "event": [], - "id": "fefaec39-58d9-42dc-a84c-51cdf3b2cb31", + "id": "380dcb78-d4f7-4ef8-b23e-4b6f1ab5ef14", "name": "/v1/provider-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4523,7 +4523,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"12-26\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"1551-07-31\",\n \"dateOfUpdate\": \"1106-04-05\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"wv\",\n \"licenses\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2964-09-13\",\n \"dateOfIssuance\": \"2740-03-30\",\n \"dateOfRenewal\": \"2706-08-02\",\n \"dateOfUpdate\": \"2938-12-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1493-06-01\",\n \"jurisdiction\": \"sc\",\n \"previous\": {\n \"dateOfExpiration\": \"2874-06-02\",\n \"dateOfIssuance\": \"2945-11-10\",\n \"dateOfRenewal\": \"1810-11-10\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6670883159\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2154-07-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+5694198825224\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8286117972\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2413-11-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2851-11-08\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2945-12-30\",\n \"phoneNumber\": \"+29046722\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2653-12-29\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1080-06-09\",\n \"jurisdiction\": \"oh\",\n \"previous\": {\n \"dateOfExpiration\": \"2097-11-30\",\n \"dateOfIssuance\": \"2477-12-01\",\n \"dateOfRenewal\": \"2741-12-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2479221518\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2882-03-08\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+38682681713\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2602550575\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2484-03-22\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2183-02-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2937-07-31\",\n \"phoneNumber\": \"+11234935514\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1852-12-09\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"fl\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"d7e6eede-1d38-48e8-86fc-1d4b4c1a13a1\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1171-10-30\",\n \"dateOfUpdate\": \"1264-04-01\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"providerId\": \"563d9793-1a56-4e7d-800b-bfe7a3879017\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2375-05-18\",\n \"dateOfUpdate\": \"1754-08-23\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"la\",\n \"licenseType\": \"\",\n \"providerId\": \"2b6fad8a-82c1-4380-8d58-20b9059f3a6a\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"6022136795\",\n \"dateOfBirth\": \"2967-12-21\",\n \"ssnLastFour\": \"2014\",\n \"phoneNumber\": \"+41544480\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1358-06-12\",\n \"dateOfUpdate\": \"1458-10-31\",\n \"effectiveStartDate\": \"2908-04-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"04886aaf-0ad5-467d-9e74-269b3481597c\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1170-08-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2228-11-13\",\n \"dateOfUpdate\": \"1851-09-30\",\n \"effectiveStartDate\": \"1134-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"me\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9468ad35-9387-43ad-a560-a5044d6cf65c\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1563-11-10\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1857-07-08\",\n \"dateOfIssuance\": \"2537-10-30\",\n \"dateOfRenewal\": \"2176-09-31\",\n \"dateOfUpdate\": \"2872-12-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1561-11-05\",\n \"jurisdiction\": \"me\",\n \"previous\": {\n \"dateOfExpiration\": \"2826-11-30\",\n \"dateOfIssuance\": \"1820-09-01\",\n \"dateOfRenewal\": \"1510-03-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0580762832\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1606-10-16\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+331066958\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0390027717\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2717-11-06\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2237-11-06\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1851-10-10\",\n \"phoneNumber\": \"+553347120577998\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1762-01-03\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1232-03-05\",\n \"jurisdiction\": \"wy\",\n \"previous\": {\n \"dateOfExpiration\": \"1426-09-14\",\n \"dateOfIssuance\": \"1386-07-15\",\n \"dateOfRenewal\": \"2763-12-23\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4651974073\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1159-04-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+3128513735\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0839042399\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2907-02-06\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2516-06-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2269-11-22\",\n \"phoneNumber\": \"+3076364826382\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2871-12-05\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"md\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"a4363987-f1c3-438e-a713-0090074868aa\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2821-12-27\",\n \"dateOfUpdate\": \"1744-08-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"providerId\": \"ce5c78f5-4cda-4b95-b4a4-a4df7c500951\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2145-11-16\",\n \"dateOfUpdate\": \"1482-05-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"dc\",\n \"licenseType\": \"\",\n \"providerId\": \"409143f2-e7ed-4625-b463-98112f4a373c\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"npi\": \"3536621926\",\n \"dateOfBirth\": \"1790-07-31\",\n \"ssnLastFour\": \"9958\",\n \"phoneNumber\": \"+54047993\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2079-06-15\",\n \"dateOfUpdate\": \"1290-10-08\",\n \"effectiveStartDate\": \"1209-11-18\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"635c4998-88b8-4fe1-831d-4b3148b056c9\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1836-12-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1883-12-14\",\n \"dateOfUpdate\": \"1744-07-04\",\n \"effectiveStartDate\": \"1627-06-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"38af0242-27a5-405c-8f58-e75d6546038e\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1597-08-30\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1660-10-21\",\n \"dateOfUpload\": \"2691-08-04\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"f8417074-5c9c-4776-a522-990938e5d07c\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2105-12-31\",\n \"dateOfUpload\": \"1381-06-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"68eaa44e-0711-4de2-a7e5-154bb5d320b0\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"mi\",\n \"ut\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"octp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1057-11-13\",\n \"dateOfIssuance\": \"1218-10-29\",\n \"dateOfRenewal\": \"2792-11-07\",\n \"dateOfUpdate\": \"2496-07-24\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1987-09-09\",\n \"jurisdiction\": \"ca\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1689-11-25\",\n \"dateOfIssuance\": \"2820-10-03\",\n \"dateOfRenewal\": \"2435-06-30\",\n \"dateOfUpdate\": \"2233-05-01\",\n \"licenseJurisdiction\": \"de\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"vi\",\n \"type\": \"privilege\",\n \"providerId\": \"60978e58-e4db-4dca-9b17-44ca1086ae71\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"tn\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ny\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2569-01-15\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2366-11-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"5fda3d1c-dfe2-429b-bac4-afa714621d52\",\n \"dateOfRenewal\": \"2162-11-05\",\n \"dateOfUpdate\": \"2527-11-17\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2821-12-08\",\n \"jurisdiction\": \"nv\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2879-03-03\",\n \"dateOfIssuance\": \"2484-11-05\",\n \"dateOfRenewal\": \"1920-10-23\",\n \"dateOfUpdate\": \"1312-08-31\",\n \"licenseJurisdiction\": \"co\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"va\",\n \"type\": \"privilege\",\n \"providerId\": \"52656e71-216a-474d-a721-151b226833ed\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"sd\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"oh\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2645-08-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2194-11-06\",\n \"privilegeId\": \"\",\n \"providerId\": \"e1e737a4-ef9f-4c57-b6eb-c7ddff454d96\",\n \"dateOfRenewal\": \"1975-10-11\",\n \"dateOfUpdate\": \"1903-10-31\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ri\",\n \"licenseJurisdiction\": \"ok\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"c31885ae-dd58-4029-9034-d6751eba3708\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1962-03-01\",\n \"dateOfUpdate\": \"1693-11-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"providerId\": \"09dee976-b64a-498e-bec5-d12a42877923\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2856-09-31\",\n \"dateOfUpdate\": \"1753-12-09\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"0d2cd0d5-d250-45f5-9365-e6627ad640e4\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1520-10-30\",\n \"dateOfUpdate\": \"2513-04-31\",\n \"effectiveStartDate\": \"1562-12-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e3d0c2e1-e4b1-43f6-b6de-2133dec40e8d\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2365-11-03\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2372-02-26\",\n \"dateOfUpdate\": \"2227-10-31\",\n \"effectiveStartDate\": \"2681-12-03\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"sd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e014f2c4-ec73-40b0-ae37-da670b7f849a\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2248-12-07\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2541-05-01\",\n \"dateOfIssuance\": \"1604-09-30\",\n \"dateOfRenewal\": \"1081-10-30\",\n \"dateOfUpdate\": \"1116-02-13\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1736-08-28\",\n \"jurisdiction\": \"la\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1319-10-14\",\n \"dateOfIssuance\": \"2183-01-06\",\n \"dateOfRenewal\": \"2554-12-22\",\n \"dateOfUpdate\": \"2695-11-31\",\n \"licenseJurisdiction\": \"ct\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"dc\",\n \"type\": \"privilege\",\n \"providerId\": \"7472d4df-e3a8-4389-a4a2-cb49edce4b6e\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ok\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ga\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2895-12-30\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1355-04-19\",\n \"privilegeId\": \"\",\n \"providerId\": \"ed891a33-4bde-4573-a46e-8d9429b2a32e\",\n \"dateOfRenewal\": \"1131-08-18\",\n \"dateOfUpdate\": \"1943-09-22\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2014-10-14\",\n \"jurisdiction\": \"id\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2285-11-31\",\n \"dateOfIssuance\": \"1219-09-09\",\n \"dateOfRenewal\": \"2746-08-20\",\n \"dateOfUpdate\": \"2653-12-20\",\n \"licenseJurisdiction\": \"vi\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wv\",\n \"type\": \"privilege\",\n \"providerId\": \"5c49424a-dcf0-4943-8f37-b7596db87809\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pr\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"nj\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1721-12-31\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2286-12-03\",\n \"privilegeId\": \"\",\n \"providerId\": \"5909f954-efb5-4f1e-b3f9-04fe35c79b3d\",\n \"dateOfRenewal\": \"1148-12-07\",\n \"dateOfUpdate\": \"1303-12-08\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"tn\",\n \"licenseJurisdiction\": \"or\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"d7e992cc-a401-41d6-8889-088003df65ae\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2633-11-04\",\n \"dateOfUpdate\": \"1658-11-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"providerId\": \"b068c6de-3f01-4fe2-8f2f-8962d45c76c5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2566-11-05\",\n \"dateOfUpdate\": \"1755-09-06\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"c9d6b593-f709-4e8e-8232-e215d785b7b7\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1822-11-18\",\n \"dateOfUpdate\": \"2048-04-03\",\n \"effectiveStartDate\": \"2723-02-07\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1cbba6b4-7bb5-4c3d-811a-551083e27b45\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1606-01-31\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1069-03-21\",\n \"dateOfUpdate\": \"2086-10-20\",\n \"effectiveStartDate\": \"2962-10-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"88ec9865-d5b4-49cd-9243-ad6000b526ef\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1279-11-01\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"dc6dd272-12e0-49a5-9f97-9e12963e66c1\",\n \"type\": \"provider\",\n \"npi\": \"9149208010\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1567-03-08\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"tx\",\n \"ssnLastFour\": \"2327\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"03-22\",\n \"compact\": \"aslp\",\n \"dateOfExpiration\": \"2657-11-31\",\n \"dateOfUpdate\": \"1604-06-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"pa\",\n \"licenses\": [\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2574-12-31\",\n \"dateOfIssuance\": \"2044-10-20\",\n \"dateOfRenewal\": \"1010-04-05\",\n \"dateOfUpdate\": \"1544-11-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2524-12-17\",\n \"jurisdiction\": \"wa\",\n \"previous\": {\n \"dateOfExpiration\": \"2484-11-16\",\n \"dateOfIssuance\": \"2041-10-06\",\n \"dateOfRenewal\": \"1974-04-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6442416970\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2516-12-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+14716334733\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0995585070\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2411-11-30\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2244-11-10\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1713-01-07\",\n \"phoneNumber\": \"+574251462853\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2553-07-30\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2584-04-25\",\n \"jurisdiction\": \"la\",\n \"previous\": {\n \"dateOfExpiration\": \"1989-05-02\",\n \"dateOfIssuance\": \"2851-11-02\",\n \"dateOfRenewal\": \"1298-11-07\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0650459974\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1937-09-05\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+376845697340586\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7224020406\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2507-12-31\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1876-05-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1806-10-08\",\n \"phoneNumber\": \"+37933151358370\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1071-11-30\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"pr\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"4e44d44e-970b-4af2-91f8-2fe7c6e6c833\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1607-10-01\",\n \"dateOfUpdate\": \"2402-05-22\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"fl\",\n \"licenseType\": \"\",\n \"providerId\": \"781ce0f4-b82a-4de1-9e35-4a037055f8e2\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2917-12-19\",\n \"dateOfUpdate\": \"2749-10-24\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"providerId\": \"69e0724f-a213-48b8-a8d6-117318e034e0\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8668688589\",\n \"dateOfBirth\": \"1640-11-31\",\n \"ssnLastFour\": \"4582\",\n \"phoneNumber\": \"+42942621417\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2878-09-31\",\n \"dateOfUpdate\": \"2396-02-03\",\n \"effectiveStartDate\": \"1806-12-25\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"dc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8f22deda-2b45-42a9-802e-0f92b84108cc\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2859-01-06\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2950-12-31\",\n \"dateOfUpdate\": \"2822-06-08\",\n \"effectiveStartDate\": \"1264-02-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wv\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"444915b6-7afc-402f-ab2d-df19c4a651cc\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2525-11-06\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2432-05-10\",\n \"dateOfIssuance\": \"1781-01-06\",\n \"dateOfRenewal\": \"1277-01-03\",\n \"dateOfUpdate\": \"2119-11-10\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2489-10-05\",\n \"jurisdiction\": \"ct\",\n \"previous\": {\n \"dateOfExpiration\": \"2929-03-30\",\n \"dateOfIssuance\": \"1749-11-30\",\n \"dateOfRenewal\": \"2732-03-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1435047632\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2282-06-17\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+88163559391529\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9353688494\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2046-07-06\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2776-08-15\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1475-12-31\",\n \"phoneNumber\": \"+235534655391758\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2288-11-14\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1694-12-30\",\n \"jurisdiction\": \"il\",\n \"previous\": {\n \"dateOfExpiration\": \"2092-01-16\",\n \"dateOfIssuance\": \"1915-12-05\",\n \"dateOfRenewal\": \"2230-07-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4218943561\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2795-10-26\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+06909950\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7663347370\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1746-05-10\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2751-01-08\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1190-11-30\",\n \"phoneNumber\": \"+403789329496\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1238-10-08\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ok\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"middleName\": \"\",\n \"providerId\": \"fe6eda6a-ffa1-4e00-af65-2b5d9abf381a\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2718-04-30\",\n \"dateOfUpdate\": \"1458-07-06\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ia\",\n \"licenseType\": \"\",\n \"providerId\": \"989e9102-768d-4466-b850-5a91f08aa44f\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2908-11-09\",\n \"dateOfUpdate\": \"1291-10-31\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"db13fac7-b280-4f45-b7b8-d943752dd7dc\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8441754185\",\n \"dateOfBirth\": \"2745-10-03\",\n \"ssnLastFour\": \"9644\",\n \"phoneNumber\": \"+14980061408\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1441-11-31\",\n \"dateOfUpdate\": \"1813-10-30\",\n \"effectiveStartDate\": \"1547-10-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"pa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a8deaf8a-b322-4bd0-88ac-a82eb9fe9b1d\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1745-08-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2237-12-16\",\n \"dateOfUpdate\": \"1857-12-30\",\n \"effectiveStartDate\": \"2190-03-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"664202ba-985b-4b39-bd5b-ef489655e428\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1505-01-19\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2733-12-18\",\n \"dateOfUpload\": \"1363-01-08\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"3fe889b9-d7de-4f96-b5fe-0644e30444cb\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1728-10-05\",\n \"dateOfUpload\": \"2605-04-22\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"831a8155-5ac3-41e0-8e9e-ed7710f0796a\",\n \"status\": \"inactive\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"co\",\n \"or\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"octp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1259-11-30\",\n \"dateOfIssuance\": \"1363-05-30\",\n \"dateOfRenewal\": \"2389-12-10\",\n \"dateOfUpdate\": \"1900-09-31\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2022-01-31\",\n \"jurisdiction\": \"tn\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1042-12-21\",\n \"dateOfIssuance\": \"2805-08-31\",\n \"dateOfRenewal\": \"2995-12-06\",\n \"dateOfUpdate\": \"2905-03-23\",\n \"licenseJurisdiction\": \"fl\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"vi\",\n \"type\": \"privilege\",\n \"providerId\": \"2e721160-889e-4f70-a693-0fb2458c9a4e\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pa\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"nc\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1028-09-30\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2319-10-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"f0d492aa-ffef-4a8c-a265-ec0e177018f8\",\n \"dateOfRenewal\": \"2412-10-02\",\n \"dateOfUpdate\": \"1252-05-30\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2422-03-31\",\n \"jurisdiction\": \"pr\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2818-12-18\",\n \"dateOfIssuance\": \"2622-10-27\",\n \"dateOfRenewal\": \"1130-12-19\",\n \"dateOfUpdate\": \"2233-11-21\",\n \"licenseJurisdiction\": \"tn\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"tx\",\n \"type\": \"privilege\",\n \"providerId\": \"f69e67a5-b3ca-4896-a9b3-a5a74c8a054d\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"tx\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wy\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2746-07-21\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2172-11-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"f86a9693-a435-4c7f-b951-631e2e87084f\",\n \"dateOfRenewal\": \"2146-09-02\",\n \"dateOfUpdate\": \"1388-10-03\",\n \"status\": \"active\"\n }\n }\n ],\n \"jurisdiction\": \"fl\",\n \"licenseJurisdiction\": \"mi\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"5be867b1-6585-4ada-8282-3f4d85c34ad2\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1331-10-05\",\n \"dateOfUpdate\": \"2068-01-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"\",\n \"providerId\": \"e9cbbb0f-cf7b-464b-9d84-c0e1275fd9eb\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2562-11-01\",\n \"dateOfUpdate\": \"1288-12-22\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"or\",\n \"licenseType\": \"\",\n \"providerId\": \"4baed6e7-c08f-4442-b180-ee327399bb85\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1550-04-16\",\n \"dateOfUpdate\": \"1448-04-30\",\n \"effectiveStartDate\": \"1507-01-02\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4d203fd3-7400-4be1-a2a5-cd9439f72371\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2273-09-30\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1658-12-18\",\n \"dateOfUpdate\": \"1322-09-30\",\n \"effectiveStartDate\": \"2324-10-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"860218c9-eff0-44fc-bc5b-b6b28fd24516\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2696-12-31\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1158-11-23\",\n \"dateOfIssuance\": \"2092-12-31\",\n \"dateOfRenewal\": \"2905-08-08\",\n \"dateOfUpdate\": \"2882-10-30\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1488-12-31\",\n \"jurisdiction\": \"hi\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1934-09-19\",\n \"dateOfIssuance\": \"1673-04-10\",\n \"dateOfRenewal\": \"2565-10-30\",\n \"dateOfUpdate\": \"2424-10-31\",\n \"licenseJurisdiction\": \"tx\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"de\",\n \"type\": \"privilege\",\n \"providerId\": \"ad9efd55-c764-446b-87a5-4e5832d98578\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"mo\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"co\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1695-10-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2557-03-14\",\n \"privilegeId\": \"\",\n \"providerId\": \"dc3ed083-ada3-4fe3-b783-c89e14cc061a\",\n \"dateOfRenewal\": \"2111-11-18\",\n \"dateOfUpdate\": \"2763-02-02\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2343-12-15\",\n \"jurisdiction\": \"co\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1872-10-28\",\n \"dateOfIssuance\": \"2218-06-31\",\n \"dateOfRenewal\": \"1817-11-03\",\n \"dateOfUpdate\": \"1499-10-02\",\n \"licenseJurisdiction\": \"or\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"in\",\n \"type\": \"privilege\",\n \"providerId\": \"bfda02d9-23be-47e8-98e9-6e121e753cf6\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ca\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"la\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1494-09-03\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1911-02-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"864086a2-0c4b-453e-84b2-28373fd90b7d\",\n \"dateOfRenewal\": \"2887-10-30\",\n \"dateOfUpdate\": \"2903-11-09\",\n \"status\": \"active\"\n }\n }\n ],\n \"jurisdiction\": \"ak\",\n \"licenseJurisdiction\": \"nv\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"b859a4d1-335d-4976-85c1-f64ed079a9d3\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1887-02-06\",\n \"dateOfUpdate\": \"2425-12-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wv\",\n \"licenseType\": \"\",\n \"providerId\": \"c830f472-498d-4397-9960-bb642bd86c9e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1301-10-29\",\n \"dateOfUpdate\": \"2375-12-11\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"tx\",\n \"licenseType\": \"\",\n \"providerId\": \"be6bd06e-d53e-493c-afd4-6e9012c0c47f\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1358-10-19\",\n \"dateOfUpdate\": \"1464-06-02\",\n \"effectiveStartDate\": \"2568-11-27\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ca\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"f4cfc154-91f1-428e-a369-4f0eeb24fb08\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1473-05-25\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1863-01-04\",\n \"dateOfUpdate\": \"1211-12-30\",\n \"effectiveStartDate\": \"2638-09-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ct\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b0c424b7-37a9-4e9f-a4d3-85e1ad0f4b49\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1806-12-27\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"f1f4e32f-c9f0-4a5c-bf5b-a2f8873bc510\",\n \"type\": \"provider\",\n \"npi\": \"2373388240\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1172-11-26\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"nj\",\n \"ssnLastFour\": \"0051\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -4532,7 +4532,7 @@ "value": "application/json" } ], - "id": "0bbdd19a-d419-40f6-b1bf-364d4977581b", + "id": "2211565f-649f-4124-b181-05371f3792dd", "name": "200 response", "originalRequest": { "body": {}, @@ -4573,7 +4573,7 @@ "item": [ { "event": [], - "id": "36ab0cb5-4c67-423d-be25-93f88cf8af95", + "id": "3f7926de-a04a-4ddc-a619-c3e37c91b455", "name": "/v1/provider-users/me/email", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4628,7 +4628,7 @@ "value": "application/json" } ], - "id": "9c74706a-1469-4c6a-beb2-c1fbaed2cb09", + "id": "7b1b0ada-a239-40f3-a979-f3b9075e784e", "name": "200 response", "originalRequest": { "body": { @@ -4683,7 +4683,7 @@ "item": [ { "event": [], - "id": "b1ea23af-4516-4776-b576-f6e3c9ca2180", + "id": "7f6d090a-8c17-40c6-aeee-cc0a608d264d", "name": "/v1/provider-users/me/email/verify", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4697,7 +4697,7 @@ "language": "json" } }, - "raw": "{\n \"verificationCode\": \"1241\"\n}" + "raw": "{\n \"verificationCode\": \"8172\"\n}" }, "description": {}, "header": [ @@ -4739,7 +4739,7 @@ "value": "application/json" } ], - "id": "cddc0aae-c687-4db1-8fd0-9aba31c160d3", + "id": "936b1d05-524c-48ee-a54f-9afc8a455a58", "name": "200 response", "originalRequest": { "body": { @@ -4750,7 +4750,7 @@ "language": "json" } }, - "raw": "{\n \"verificationCode\": \"1241\"\n}" + "raw": "{\n \"verificationCode\": \"8172\"\n}" }, "header": [ { @@ -4801,7 +4801,7 @@ "item": [ { "event": [], - "id": "2be40c01-2357-4848-af89-22bd17a4a577", + "id": "d7908191-928b-475c-92e3-9cbaf8e899d9", "name": "/v1/provider-users/me/home-jurisdiction", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4815,7 +4815,7 @@ "language": "json" } }, - "raw": "{\n \"jurisdiction\": \"mi\"\n}" + "raw": "{\n \"jurisdiction\": \"dc\"\n}" }, "description": {}, "header": [ @@ -4856,7 +4856,7 @@ "value": "application/json" } ], - "id": "6a5975bf-eba2-4040-b7f9-42a0e27ca93b", + "id": "e3f67ddf-4daf-42b2-8a69-4680a26be548", "name": "200 response", "originalRequest": { "body": { @@ -4867,7 +4867,7 @@ "language": "json" } }, - "raw": "{\n \"jurisdiction\": \"mi\"\n}" + "raw": "{\n \"jurisdiction\": \"dc\"\n}" }, "header": [ { @@ -4926,7 +4926,7 @@ "item": [ { "event": [], - "id": "ee591bbc-c801-4174-a6f1-88fe86f627d6", + "id": "26d02309-89f0-4ad9-8ef8-e32d554b66a8", "name": "/v1/provider-users/me/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4984,7 +4984,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"octp\",\n \"events\": [\n {\n \"createDate\": \"2787-10-31\",\n \"dateOfUpdate\": \"2310-09-03\",\n \"effectiveDate\": \"2678-06-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"1854-11-08\",\n \"dateOfUpdate\": \"2995-02-27\",\n \"effectiveDate\": \"2049-06-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"hi\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"2dba0e24-f0a5-408c-912d-941be4c11f19\"\n}", + "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"2740-12-30\",\n \"dateOfUpdate\": \"2363-06-19\",\n \"effectiveDate\": \"1840-05-03\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2804-11-30\",\n \"dateOfUpdate\": \"1752-10-31\",\n \"effectiveDate\": \"1738-06-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ca\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"8d73f1ff-26af-4ed6-856f-dbff3116800d\"\n}", "code": 200, "cookie": [], "header": [ @@ -4993,7 +4993,7 @@ "value": "application/json" } ], - "id": "409d2edc-960f-4e99-a1d6-7855627c853a", + "id": "a6075dd7-e3b2-45db-ac82-84b00a6b08f4", "name": "200 response", "originalRequest": { "body": {}, @@ -5054,7 +5054,7 @@ "item": [ { "event": [], - "id": "ac220891-c729-43f3-a64f-d28aacf4da0e", + "id": "587ddfdf-7171-49a9-a9bd-485b0655b63b", "name": "/v1/provider-users/me/military-affiliation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5100,7 +5100,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"affiliationType\": \"militaryMember\",\n \"dateOfUpdate\": \"1516-07-31\",\n \"dateOfUpload\": \"1157-02-04\",\n \"documentUploadFields\": [\n {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n },\n {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n }\n ],\n \"status\": \"\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}", + "body": "{\n \"affiliationType\": \"militaryMemberSpouse\",\n \"dateOfUpdate\": \"1445-12-31\",\n \"dateOfUpload\": \"1126-01-12\",\n \"documentUploadFields\": [\n {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n },\n \"url\": \"\"\n },\n {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n },\n \"url\": \"\"\n }\n ],\n \"status\": \"\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -5109,7 +5109,7 @@ "value": "application/json" } ], - "id": "3cd75524-583b-4f0a-acdd-0ef4a9679c21", + "id": "39819054-41e5-4ed0-8d18-8c4535a4b0bf", "name": "200 response", "originalRequest": { "body": { @@ -5161,7 +5161,7 @@ }, { "event": [], - "id": "c89b557c-64fb-4286-b1ea-bbe564129da7", + "id": "ca9c6f2a-886d-4dcc-99f8-e0057fd6f995", "name": "/v1/provider-users/me/military-affiliation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5216,7 +5216,7 @@ "value": "application/json" } ], - "id": "c3f9560e-ba54-40d4-9f7a-3c3b700f3bd2", + "id": "8e149f77-6c9c-4c08-9ccc-192243b47539", "name": "200 response", "originalRequest": { "body": { @@ -5277,7 +5277,7 @@ "item": [ { "event": [], - "id": "1b1823d9-014b-4ca4-b83d-2373c1240e5c", + "id": "c75c5f64-4382-4a68-b04b-8f78f1df37d7", "name": "/v1/provider-users/registration", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5294,7 +5294,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"\",\n \"dob\": \"2819-09-30\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"licensed professional counselor\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" + "raw": "{\n \"compact\": \"\",\n \"dob\": \"2923-10-31\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"il\",\n \"licenseType\": \"occupational therapist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" }, "description": {}, "header": [ @@ -5334,7 +5334,7 @@ "value": "application/json" } ], - "id": "cca625e3-6568-4c7c-8f4a-fad926bee364", + "id": "061569dc-1115-4db0-9ece-f598621def64", "name": "200 response", "originalRequest": { "body": { @@ -5345,7 +5345,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"\",\n \"dob\": \"2819-09-30\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"licensed professional counselor\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" + "raw": "{\n \"compact\": \"\",\n \"dob\": \"2923-10-31\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"il\",\n \"licenseType\": \"occupational therapist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" }, "header": [ { @@ -5383,7 +5383,7 @@ "item": [ { "event": [], - "id": "35beea24-d544-47ef-be3e-266dc92d1c15", + "id": "a5d95ad7-c024-47db-89eb-d6149604b23c", "name": "/v1/provider-users/verifyRecovery", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5400,7 +5400,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"octp\",\n \"providerId\": \"0efe6305-5374-4492-b074-0261b98f6069\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" + "raw": "{\n \"compact\": \"coun\",\n \"providerId\": \"57449527-a3ee-493f-b5c5-53a9110f025e\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" }, "description": {}, "header": [ @@ -5440,7 +5440,7 @@ "value": "application/json" } ], - "id": "cd851d45-e6f9-4ffb-b18e-35a71d59a7ee", + "id": "917868e9-a108-4f97-99d6-cc3be59e1611", "name": "200 response", "originalRequest": { "body": { @@ -5451,7 +5451,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"octp\",\n \"providerId\": \"0efe6305-5374-4492-b074-0261b98f6069\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" + "raw": "{\n \"compact\": \"coun\",\n \"providerId\": \"57449527-a3ee-493f-b5c5-53a9110f025e\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" }, "header": [ { @@ -5501,7 +5501,7 @@ "item": [ { "event": [], - "id": "1dbc6084-2967-4860-98b2-92d45c90eea2", + "id": "6f37abda-44a9-4e7d-83a8-f98a7817e006", "name": "/v1/public/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5558,7 +5558,7 @@ "value": "application/json" } ], - "id": "d5186322-6bbf-4bbd-bbfd-a9e885ffcbda", + "id": "80acf2b0-d2b9-4da2-aa3d-47fd8d39de2e", "name": "200 response", "originalRequest": { "body": {}, @@ -5599,7 +5599,7 @@ "item": [ { "event": [], - "id": "e69e5f22-2bf4-4c8c-b8be-3929233083e3", + "id": "0efe804f-47b3-4201-b1fb-06141671dfa4", "name": "/v1/public/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5616,7 +5616,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"a63f7f33-f63e-4d11-944d-ddcc64dacb8e\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"422eedd3-e6e6-4e51-8c54-c8c147e4017a\",\n \"jurisdiction\": \"ca\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -5661,7 +5661,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"aslp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"in\",\n \"privilegeJurisdictions\": [\n \"sc\",\n \"ny\"\n ],\n \"providerId\": \"e4252ae3-571b-4166-b32e-cd9989f391d0\",\n \"type\": \"provider\",\n \"npi\": \"3745526136\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"mn\",\n \"dateOfUpdate\": \"1040-12-07\"\n },\n {\n \"compact\": \"octp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"co\",\n \"privilegeJurisdictions\": [\n \"md\",\n \"ut\"\n ],\n \"providerId\": \"5203d204-1ce6-4427-a62a-ac4e6fd0071a\",\n \"type\": \"provider\",\n \"npi\": \"2629130019\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"or\",\n \"dateOfUpdate\": \"1617-11-03\"\n }\n ],\n \"query\": {\n \"providerId\": \"54d3ed76-f32c-4256-a3a5-6fcc12cdce8b\",\n \"jurisdiction\": \"nj\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"aslp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"oh\",\n \"privilegeJurisdictions\": [\n \"ny\",\n \"ms\"\n ],\n \"providerId\": \"d1d973f1-853b-4889-94fc-bdfcbdb143ab\",\n \"type\": \"provider\",\n \"npi\": \"3124110621\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ia\",\n \"dateOfUpdate\": \"2645-10-01\"\n },\n {\n \"compact\": \"aslp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"nc\",\n \"privilegeJurisdictions\": [\n \"hi\",\n \"tn\"\n ],\n \"providerId\": \"1faea94a-fa3b-4570-9d52-9aa4a499dd8a\",\n \"type\": \"provider\",\n \"npi\": \"1877278543\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"tn\",\n \"dateOfUpdate\": \"2040-10-07\"\n }\n ],\n \"query\": {\n \"providerId\": \"79c99edf-35d5-49a9-b26d-a3a54353aea0\",\n \"jurisdiction\": \"vi\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -5670,7 +5670,7 @@ "value": "application/json" } ], - "id": "8c64fe03-6a1e-4728-8460-9158fd919181", + "id": "ac99ab85-44e8-4cd8-ab2d-3904793702d2", "name": "200 response", "originalRequest": { "body": { @@ -5681,7 +5681,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"a63f7f33-f63e-4d11-944d-ddcc64dacb8e\",\n \"jurisdiction\": \"va\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"422eedd3-e6e6-4e51-8c54-c8c147e4017a\",\n \"jurisdiction\": \"ca\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -5722,7 +5722,7 @@ "item": [ { "event": [], - "id": "10ecdb87-19c6-486d-8a8a-79f8634a9864", + "id": "52a32972-92ed-46cd-b5ce-a714ec69c2dc", "name": "/v1/public/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5781,7 +5781,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2603-12-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"sc\",\n \"privilegeJurisdictions\": [\n \"fl\",\n \"ky\"\n ],\n \"providerId\": \"1ae13ed5-aa8f-42d1-98d7-89bca1689174\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"1239-11-08\",\n \"dateOfIssuance\": \"2345-12-31\",\n \"dateOfRenewal\": \"2850-01-31\",\n \"dateOfUpdate\": \"2128-10-30\",\n \"jurisdiction\": \"ct\",\n \"licenseJurisdiction\": \"mn\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"6b9b9850-f534-4358-8609-62924b8e44b9\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1613-01-02\",\n \"jurisdiction\": \"nj\",\n \"licenseType\": \"occupational therapy assistant\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1322-10-03\",\n \"dateOfIssuance\": \"1342-11-30\",\n \"dateOfRenewal\": \"2764-10-09\",\n \"dateOfUpdate\": \"1969-04-23\",\n \"licenseJurisdiction\": \"ma\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"e0a53e29-1bc7-4b9e-8e87-44f492e5fa34\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1446-10-05\",\n \"licenseJurisdiction\": \"ga\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1192-04-07\",\n \"dateOfIssuance\": \"1118-12-09\",\n \"dateOfUpdate\": \"2910-11-06\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1959-05-14\",\n \"jurisdiction\": \"ny\",\n \"licenseType\": \"occupational therapy assistant\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1451-06-21\",\n \"dateOfIssuance\": \"1114-08-08\",\n \"dateOfRenewal\": \"2518-12-16\",\n \"dateOfUpdate\": \"2588-11-04\",\n \"licenseJurisdiction\": \"fl\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"278a35a3-db42-464e-80ac-7578748657aa\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1192-10-03\",\n \"licenseJurisdiction\": \"mi\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1227-03-30\",\n \"dateOfIssuance\": \"2080-04-31\",\n \"dateOfUpdate\": \"1381-10-31\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1822-08-11\",\n \"dateOfUpdate\": \"2401-11-07\",\n \"effectiveStartDate\": \"1288-01-09\",\n \"jurisdiction\": \"hi\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"314b7ec2-0f3b-4875-b46e-e5dfe0b0a2f8\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2151-03-31\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2895-10-08\",\n \"dateOfUpdate\": \"1104-12-09\",\n \"effectiveStartDate\": \"2834-03-30\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"0e140166-5402-45e2-a2e7-b19e3de858ae\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2380-10-03\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"2139-10-31\",\n \"dateOfIssuance\": \"2730-06-31\",\n \"dateOfRenewal\": \"1257-02-07\",\n \"dateOfUpdate\": \"1832-02-31\",\n \"jurisdiction\": \"ct\",\n \"licenseJurisdiction\": \"mn\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"a5a596b2-42f5-4efb-a1ba-5b530f6ebf15\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1690-10-07\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"licensed professional counselor\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1241-12-18\",\n \"dateOfIssuance\": \"1855-04-07\",\n \"dateOfRenewal\": \"1881-10-31\",\n \"dateOfUpdate\": \"1145-03-17\",\n \"licenseJurisdiction\": \"ri\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"c30ceab6-bcd3-4f98-9d2f-09b01c6a8c0a\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2009-08-30\",\n \"licenseJurisdiction\": \"az\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1678-12-03\",\n \"dateOfIssuance\": \"2323-07-16\",\n \"dateOfUpdate\": \"1630-08-05\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1487-12-31\",\n \"jurisdiction\": \"vi\",\n \"licenseType\": \"audiologist\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1184-03-31\",\n \"dateOfIssuance\": \"1916-11-30\",\n \"dateOfRenewal\": \"1601-12-22\",\n \"dateOfUpdate\": \"2877-03-01\",\n \"licenseJurisdiction\": \"tn\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"2455f1b3-7b69-4a40-bd5f-3698f637bb73\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2887-03-30\",\n \"licenseJurisdiction\": \"id\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2051-10-26\",\n \"dateOfIssuance\": \"1049-07-05\",\n \"dateOfUpdate\": \"1865-01-05\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1520-04-12\",\n \"dateOfUpdate\": \"1256-08-11\",\n \"effectiveStartDate\": \"2778-11-06\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"63dbe116-68d2-414e-b45f-a9ff849fabb6\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2986-03-07\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1687-08-30\",\n \"dateOfUpdate\": \"1047-11-31\",\n \"effectiveStartDate\": \"2971-02-30\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"6d8d71a8-06e8-4371-a8ff-4ba86469f0b9\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2675-04-21\"\n }\n ]\n }\n ],\n \"npi\": \"7139423957\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"mn\",\n \"middleName\": \"\"\n}", + "body": "{\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2694-06-16\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ok\",\n \"privilegeJurisdictions\": [\n \"in\",\n \"ny\"\n ],\n \"providerId\": \"f805c589-53d7-4a39-b78b-3a3d30227471\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"aslp\",\n \"dateOfExpiration\": \"1993-10-30\",\n \"dateOfIssuance\": \"2017-06-01\",\n \"dateOfRenewal\": \"1442-02-08\",\n \"dateOfUpdate\": \"2663-09-01\",\n \"jurisdiction\": \"nh\",\n \"licenseJurisdiction\": \"nh\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"0e099b4f-4313-4342-8ed8-13deb0b407d8\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1903-04-31\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"occupational therapist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2443-02-06\",\n \"dateOfIssuance\": \"1090-02-01\",\n \"dateOfRenewal\": \"2174-07-18\",\n \"dateOfUpdate\": \"1883-10-19\",\n \"licenseJurisdiction\": \"vt\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"9154dd14-72f2-4bca-8b74-d53b0075adba\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"expiration\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1620-10-08\",\n \"licenseJurisdiction\": \"mo\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1647-03-30\",\n \"dateOfIssuance\": \"1202-12-31\",\n \"dateOfUpdate\": \"2894-12-30\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2876-12-04\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"occupational therapy assistant\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1932-10-05\",\n \"dateOfIssuance\": \"1199-11-02\",\n \"dateOfRenewal\": \"2081-09-05\",\n \"dateOfUpdate\": \"1340-10-06\",\n \"licenseJurisdiction\": \"md\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"cfcba5ac-fb17-4cf4-93e3-bb2bea6a3fac\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2185-11-30\",\n \"licenseJurisdiction\": \"nv\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2976-10-13\",\n \"dateOfIssuance\": \"1148-07-25\",\n \"dateOfUpdate\": \"1330-09-30\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1079-11-10\",\n \"dateOfUpdate\": \"1058-12-31\",\n \"effectiveStartDate\": \"1544-01-06\",\n \"jurisdiction\": \"pa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9d688cf1-d921-47ad-8b65-bb00c1c05523\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2993-12-06\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2140-09-31\",\n \"dateOfUpdate\": \"2241-09-29\",\n \"effectiveStartDate\": \"1057-05-30\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"5f495c71-88c3-405c-9520-17bdfaa372bc\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2978-12-30\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"2219-12-20\",\n \"dateOfIssuance\": \"1265-11-15\",\n \"dateOfRenewal\": \"2700-05-16\",\n \"dateOfUpdate\": \"1968-12-31\",\n \"jurisdiction\": \"nv\",\n \"licenseJurisdiction\": \"la\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"446a1f6e-e408-4843-962a-52b34a72c011\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1264-12-31\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"occupational therapy assistant\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1412-04-04\",\n \"dateOfIssuance\": \"1840-12-07\",\n \"dateOfRenewal\": \"1176-11-03\",\n \"dateOfUpdate\": \"1695-08-08\",\n \"licenseJurisdiction\": \"ny\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"9ff4d957-db9a-4e86-821a-1e1a141a9dab\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1737-01-23\",\n \"licenseJurisdiction\": \"nc\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2003-08-09\",\n \"dateOfIssuance\": \"2948-10-30\",\n \"dateOfUpdate\": \"2518-10-14\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1205-06-26\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"occupational therapy assistant\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2117-10-30\",\n \"dateOfIssuance\": \"1358-10-18\",\n \"dateOfRenewal\": \"1622-03-02\",\n \"dateOfUpdate\": \"2769-03-30\",\n \"licenseJurisdiction\": \"in\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"3d2a209d-72e9-40cf-b77c-dd7c603ca177\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1138-07-07\",\n \"licenseJurisdiction\": \"mt\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1353-12-31\",\n \"dateOfIssuance\": \"1997-10-31\",\n \"dateOfUpdate\": \"1929-05-22\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2230-10-30\",\n \"dateOfUpdate\": \"2367-02-31\",\n \"effectiveStartDate\": \"1942-12-17\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3bb4e873-2b26-47bb-babc-145b785a5f06\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1854-11-15\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1001-10-30\",\n \"dateOfUpdate\": \"2276-10-31\",\n \"effectiveStartDate\": \"2172-04-31\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"41f464c2-6ee9-4b7e-aa77-9730ecd6ccc3\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1644-07-01\"\n }\n ]\n }\n ],\n \"npi\": \"3665015176\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"md\",\n \"middleName\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -5790,7 +5790,7 @@ "value": "application/json" } ], - "id": "14c930e5-7506-46c9-81cc-1fb3596d47ab", + "id": "f226932e-8b37-4ebf-b3ba-7ae110475e69", "name": "200 response", "originalRequest": { "body": {}, @@ -5838,7 +5838,7 @@ "item": [ { "event": [], - "id": "73fe6920-502a-43d3-87d5-2c8b7dabd606", + "id": "b1795257-6a6c-4afb-a8e8-cf6cc76bb64c", "name": "/v1/public/compacts/:compact/providers/:providerId/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5922,7 +5922,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"octp\",\n \"events\": [\n {\n \"createDate\": \"2787-10-31\",\n \"dateOfUpdate\": \"2310-09-03\",\n \"effectiveDate\": \"2678-06-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"1854-11-08\",\n \"dateOfUpdate\": \"2995-02-27\",\n \"effectiveDate\": \"2049-06-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"hi\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"2dba0e24-f0a5-408c-912d-941be4c11f19\"\n}", + "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"2740-12-30\",\n \"dateOfUpdate\": \"2363-06-19\",\n \"effectiveDate\": \"1840-05-03\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2804-11-30\",\n \"dateOfUpdate\": \"1752-10-31\",\n \"effectiveDate\": \"1738-06-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ca\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"8d73f1ff-26af-4ed6-856f-dbff3116800d\"\n}", "code": 200, "cookie": [], "header": [ @@ -5931,7 +5931,7 @@ "value": "application/json" } ], - "id": "a1d55769-38fb-46ca-84b7-47eeb03f5442", + "id": "0bb34e89-b53f-4e65-8507-bfaaff1a90c0", "name": "200 response", "originalRequest": { "body": {}, @@ -6005,7 +6005,7 @@ "item": [ { "event": [], - "id": "b75df5cf-7a33-4950-aa4b-20ba4b90916a", + "id": "7f9da497-758e-40d6-9347-97f932cdfcb0", "name": "/v1/purchases/privileges", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6019,7 +6019,7 @@ "language": "json" } }, - "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"8255025762\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"020352\"\n }\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"nj\",\n \"pr\"\n ]\n}" + "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"5747478461\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"61929\"\n }\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"ri\",\n \"oh\"\n ]\n}" }, "description": {}, "header": [ @@ -6059,7 +6059,7 @@ "value": "application/json" } ], - "id": "ff6f4099-2846-4d70-aa01-823ee3b0dbf0", + "id": "4ca7650d-842d-4c51-99fa-dc7a10595795", "name": "200 response", "originalRequest": { "body": { @@ -6070,7 +6070,7 @@ "language": "json" } }, - "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"8255025762\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"020352\"\n }\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"nj\",\n \"pr\"\n ]\n}" + "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"5747478461\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"61929\"\n }\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"ri\",\n \"oh\"\n ]\n}" }, "header": [ { @@ -6113,7 +6113,7 @@ "item": [ { "event": [], - "id": "f1114b6f-a017-4346-a054-85e35e36ab0d", + "id": "f559d108-3978-4d98-901b-586a398c2821", "name": "/v1/purchases/privileges/options", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6155,7 +6155,7 @@ "value": "application/json" } ], - "id": "0656fe67-52f7-483d-8ee8-9f467c98be00", + "id": "124fbe5d-95ec-44bd-b54b-7f106feea18c", "name": "200 response", "originalRequest": { "body": {}, @@ -6209,7 +6209,7 @@ "item": [ { "event": [], - "id": "636aa3dc-04c4-4147-a9a5-7234632fc8f2", + "id": "f28ab1b7-f0bf-414a-9d11-7fd4ebe9679d", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6241,7 +6241,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -6259,7 +6259,7 @@ "value": "" } ], - "id": "075489ec-17b8-494b-b9fe-e68880752573", + "id": "a1c5cae6-8052-47b2-bb1a-173b1c584884", "name": "200 response", "originalRequest": { "body": {}, @@ -6304,7 +6304,7 @@ "value": "application/json" } ], - "id": "42e108b2-0b75-4d8d-80cb-c466dd852eb1", + "id": "2a5b838c-2d88-4e5c-a09b-f60964bcf2fc", "name": "404 response", "originalRequest": { "body": {}, @@ -6342,7 +6342,7 @@ }, { "event": [], - "id": "fa90f5be-5496-4c05-bb1a-4bee1a508fd0", + "id": "9218b1a9-9d02-4336-8ff8-5061ec6607b8", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6387,7 +6387,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -6405,7 +6405,7 @@ "value": "" } ], - "id": "83de1f76-a0fc-4555-af19-af4289eaae8d", + "id": "c2be6a6c-bb07-478a-8ab8-fae968a190f8", "name": "200 response", "originalRequest": { "body": { @@ -6463,7 +6463,7 @@ "value": "application/json" } ], - "id": "81a2425c-0038-482e-869c-90b20b2170a5", + "id": "54c1936d-34cc-47f7-b2a0-9b59c6d9c07e", "name": "404 response", "originalRequest": { "body": { diff --git a/backend/compact-connect/docs/postman/postman-collection.json b/backend/compact-connect/docs/postman/postman-collection.json index 643abc7a9..22374b843 100644 --- a/backend/compact-connect/docs/postman/postman-collection.json +++ b/backend/compact-connect/docs/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "189cd199-c3fb-4756-9123-a81f7e4da683", + "_postman_id": "09227faf-53be-4e3e-8e03-373d549d8b91", "description": { "content": "", "type": "text/plain" @@ -410,7 +410,7 @@ "item": [ { "event": [], - "id": "8dc12956-b7b0-4161-a9a2-81c03f65f37e", + "id": "faa15284-f5ce-441b-80a8-2c3cb73b4109", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses", "protocolProfileBehavior": { "disableBodyPruning": true @@ -424,7 +424,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2052-10-30\",\n \"dateOfExpiration\": \"1511-10-08\",\n \"dateOfIssuance\": \"1843-11-21\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"239-43-2056\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3369587726\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+72545228\",\n \"dateOfRenewal\": \"2960-02-10\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1860-06-30\",\n \"dateOfExpiration\": \"2458-07-20\",\n \"dateOfIssuance\": \"1476-12-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"756-03-1406\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1398035599\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+042857896627\",\n \"dateOfRenewal\": \"1752-11-30\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2569-10-30\",\n \"dateOfExpiration\": \"2706-02-26\",\n \"dateOfIssuance\": \"2865-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"ssn\": \"555-89-9226\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9583517184\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+4746844552617\",\n \"dateOfRenewal\": \"2915-04-06\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2799-10-06\",\n \"dateOfExpiration\": \"2806-02-13\",\n \"dateOfIssuance\": \"2948-12-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"ssn\": \"505-41-4862\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2839783264\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+38810920\",\n \"dateOfRenewal\": \"1359-10-30\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "description": {}, "header": [ @@ -488,7 +488,7 @@ "value": "application/json" } ], - "id": "24793fe5-8462-4285-a5ea-ec05fb9c99b4", + "id": "947e191b-0b07-4902-9439-c22969590051", "name": "200 response", "originalRequest": { "body": { @@ -499,7 +499,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2052-10-30\",\n \"dateOfExpiration\": \"1511-10-08\",\n \"dateOfIssuance\": \"1843-11-21\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"239-43-2056\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3369587726\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+72545228\",\n \"dateOfRenewal\": \"2960-02-10\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1860-06-30\",\n \"dateOfExpiration\": \"2458-07-20\",\n \"dateOfIssuance\": \"1476-12-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"756-03-1406\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1398035599\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+042857896627\",\n \"dateOfRenewal\": \"1752-11-30\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2569-10-30\",\n \"dateOfExpiration\": \"2706-02-26\",\n \"dateOfIssuance\": \"2865-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"ssn\": \"555-89-9226\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9583517184\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+4746844552617\",\n \"dateOfRenewal\": \"2915-04-06\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2799-10-06\",\n \"dateOfExpiration\": \"2806-02-13\",\n \"dateOfIssuance\": \"2948-12-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"ssn\": \"505-41-4862\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2839783264\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+38810920\",\n \"dateOfRenewal\": \"1359-10-30\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -540,7 +540,7 @@ }, { "_postman_previewlanguage": "json", - "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ],\n \"key_2\": [\n \"\",\n \"\"\n ],\n \"key_3\": [\n \"\",\n \"\"\n ]\n }\n }\n}", + "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ]\n },\n \"key_1\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ],\n \"key_2\": [\n \"\",\n \"\"\n ]\n }\n }\n}", "code": 400, "cookie": [], "header": [ @@ -549,7 +549,7 @@ "value": "application/json" } ], - "id": "cab7e9ad-9e40-4453-aca0-c661c14d7008", + "id": "7e432d18-d824-4a6b-9a19-9e69af57f78a", "name": "400 response", "originalRequest": { "body": { @@ -560,7 +560,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2052-10-30\",\n \"dateOfExpiration\": \"1511-10-08\",\n \"dateOfIssuance\": \"1843-11-21\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"239-43-2056\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3369587726\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+72545228\",\n \"dateOfRenewal\": \"2960-02-10\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1860-06-30\",\n \"dateOfExpiration\": \"2458-07-20\",\n \"dateOfIssuance\": \"1476-12-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"756-03-1406\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1398035599\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+042857896627\",\n \"dateOfRenewal\": \"1752-11-30\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2569-10-30\",\n \"dateOfExpiration\": \"2706-02-26\",\n \"dateOfIssuance\": \"2865-10-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"ssn\": \"555-89-9226\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9583517184\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+4746844552617\",\n \"dateOfRenewal\": \"2915-04-06\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2799-10-06\",\n \"dateOfExpiration\": \"2806-02-13\",\n \"dateOfIssuance\": \"2948-12-08\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"ssn\": \"505-41-4862\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2839783264\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+38810920\",\n \"dateOfRenewal\": \"1359-10-30\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -631,7 +631,7 @@ } } ], - "id": "d878087f-a06b-4d18-8bd6-41b090d6d28e", + "id": "28c16267-da9b-4401-a370-823c4a34ab30", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -688,7 +688,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"upload\": {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\"\n },\n \"url\": \"\"\n }\n}", + "body": "{\n \"upload\": {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -697,7 +697,7 @@ "value": "application/json" } ], - "id": "6147f109-c02e-4b35-8828-0db854e64b10", + "id": "ce14fcf9-cfc6-41e3-af6d-4cf800db8f35", "name": "200 response", "originalRequest": { "body": {}, @@ -751,7 +751,7 @@ "item": [ { "event": [], - "id": "8030c288-7d5e-4779-ab13-16d6f225f108", + "id": "f1d99f61-836a-4240-9c4a-5f509ed97c66", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -765,7 +765,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"endDateTime\": \"1517-12-03T23:50:46Z\",\n \"startDateTime\": \"1528-02-30T23:04:17Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"endDateTime\": \"2829-03-31T20:12:55.6Z\",\n \"startDateTime\": \"2843-03-03T20:27:52Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}" }, "description": {}, "header": [ @@ -821,7 +821,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"02-02\",\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1610-12-07\",\n \"dateOfUpdate\": \"2920-10-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"ar\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"il\",\n \"nv\"\n ],\n \"providerId\": \"df6359ef-43ae-4807-91d8-dac3e4cccff1\",\n \"type\": \"provider\",\n \"npi\": \"3284060698\",\n \"dateOfBirth\": \"2303-09-30\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"0326\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"14-28\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1546-08-30\",\n \"dateOfUpdate\": \"1447-10-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"co\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"ny\",\n \"nc\"\n ],\n \"providerId\": \"c776fbfd-f2a9-485c-845b-4ff20bad5426\",\n \"type\": \"provider\",\n \"npi\": \"4369796985\",\n \"dateOfBirth\": \"1852-12-07\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"9749\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"12-17\",\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2959-05-31\",\n \"dateOfUpdate\": \"1788-11-10\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"co\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"pa\",\n \"tx\"\n ],\n \"providerId\": \"04a988f3-3ac3-4d0b-8f0d-a3d721a7db64\",\n \"type\": \"provider\",\n \"npi\": \"1212405781\",\n \"dateOfBirth\": \"1704-11-01\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"4287\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"07-31\",\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1997-11-24\",\n \"dateOfUpdate\": \"2386-12-21\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"vi\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"il\",\n \"nj\"\n ],\n \"providerId\": \"7922e6fd-c209-4686-8ab2-5609ff9651b6\",\n \"type\": \"provider\",\n \"npi\": \"5425347055\",\n \"dateOfBirth\": \"1291-12-08\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"2632\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -830,7 +830,7 @@ "value": "application/json" } ], - "id": "1651689e-18b1-4a1a-ba86-2c520edb2154", + "id": "2884d4e1-7c56-45e2-b259-ca916db4eb58", "name": "200 response", "originalRequest": { "body": { @@ -841,7 +841,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"endDateTime\": \"1517-12-03T23:50:46Z\",\n \"startDateTime\": \"1528-02-30T23:04:17Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"endDateTime\": \"2829-03-31T20:12:55.6Z\",\n \"startDateTime\": \"2843-03-03T20:27:52Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}" }, "header": [ { @@ -891,7 +891,7 @@ "item": [ { "event": [], - "id": "e51ae75c-d529-4448-8ed4-7af441dda520", + "id": "ada2d854-c5e5-44d0-80a4-43618c807454", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -958,7 +958,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"privileges\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1972-09-09\",\n \"dateOfIssuance\": \"1247-05-01\",\n \"dateOfRenewal\": \"1087-09-07\",\n \"dateOfUpdate\": \"2935-03-01\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseJurisdiction\": \"sc\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"3c15f14f-3c2a-42b8-89e0-6f8f49db1f6b\",\n \"status\": \"active\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"4120280340\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2378-07-31\",\n \"ssnLastFour\": \"8907\",\n \"phoneNumber\": \"+965485591316\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2306-02-30\",\n \"dateOfIssuance\": \"1687-02-05\",\n \"dateOfRenewal\": \"2549-09-03\",\n \"dateOfUpdate\": \"1153-10-19\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ca\",\n \"licenseJurisdiction\": \"id\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"62e94259-1e5b-488e-8506-83c4637f34e4\",\n \"status\": \"active\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"9363356562\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2611-09-05\",\n \"ssnLastFour\": \"5869\",\n \"phoneNumber\": \"+90256877325325\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n ],\n \"providerUIUrl\": \"\"\n}", + "body": "{\n \"privileges\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1220-09-28\",\n \"dateOfIssuance\": \"2589-10-22\",\n \"dateOfRenewal\": \"2784-08-21\",\n \"dateOfUpdate\": \"2668-08-25\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseJurisdiction\": \"ar\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"baeb9c2a-ccb8-43af-8d90-3ebfd86b6449\",\n \"status\": \"active\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"9712798261\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"1413-12-06\",\n \"ssnLastFour\": \"6251\",\n \"phoneNumber\": \"+21660980678\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2269-10-13\",\n \"dateOfIssuance\": \"2343-12-16\",\n \"dateOfRenewal\": \"2291-11-02\",\n \"dateOfUpdate\": \"2127-10-09\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"wi\",\n \"licenseJurisdiction\": \"ct\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"94acba3e-9e91-4871-ba53-02d3d65eec7d\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"4622762030\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"1270-04-30\",\n \"ssnLastFour\": \"2620\",\n \"phoneNumber\": \"+981997488166\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n ],\n \"providerUIUrl\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -967,7 +967,7 @@ "value": "application/json" } ], - "id": "bf64bb35-a160-41b8-ad6b-a7e54328b7d9", + "id": "93ed5cef-466a-4d4e-92f7-5607a1915d8b", "name": "200 response", "originalRequest": { "body": {}, diff --git a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py index 50cd73c41..f858c26e5 100644 --- a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py +++ b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py @@ -1176,6 +1176,11 @@ def _provider_detail_response_schema(self): type=JsonSchemaType.ARRAY, items=self._investigation_schema, ), + 'investigationStatus': JsonSchema( + type=JsonSchemaType.STRING, + enum=['underInvestigation'], + description='Status indicating if the license is under investigation', + ), **self._common_license_properties, }, ), @@ -1316,6 +1321,11 @@ def _provider_detail_response_schema(self): type=JsonSchemaType.ARRAY, items=self._investigation_schema, ), + 'investigationStatus': JsonSchema( + type=JsonSchemaType.STRING, + enum=['underInvestigation'], + description='Status indicating if the privilege is under investigation', + ), **self._common_privilege_properties, }, ), diff --git a/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json index a0fb58ac8..6ac7376d8 100644 --- a/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json @@ -765,6 +765,13 @@ }, "type": "array" }, + "investigationStatus": { + "description": "Status indicating if the license is under investigation", + "enum": [ + "underInvestigation" + ], + "type": "string" + }, "npi": { "pattern": "^[0-9]{10}$", "type": "string" @@ -1685,6 +1692,13 @@ }, "type": "array" }, + "investigationStatus": { + "description": "Status indicating if the privilege is under investigation", + "enum": [ + "underInvestigation" + ], + "type": "string" + }, "type": { "enum": [ "privilege" diff --git a/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json index a0fb58ac8..6ac7376d8 100644 --- a/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json @@ -765,6 +765,13 @@ }, "type": "array" }, + "investigationStatus": { + "description": "Status indicating if the license is under investigation", + "enum": [ + "underInvestigation" + ], + "type": "string" + }, "npi": { "pattern": "^[0-9]{10}$", "type": "string" @@ -1685,6 +1692,13 @@ }, "type": "array" }, + "investigationStatus": { + "description": "Status indicating if the privilege is under investigation", + "enum": [ + "underInvestigation" + ], + "type": "string" + }, "type": { "enum": [ "privilege" From 486d848b8fd630c4f194a58f772ffe7083b4b022 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Tue, 21 Oct 2025 17:05:24 -0600 Subject: [PATCH 08/33] WIP: add investigation event listeners --- .../email-notification-service/lambda.ts | 171 ++++- .../lambdas/nodejs/lib/email/index.ts | 1 + .../investigation-notification-service.ts | 461 +++++++++++++ ...investigation-notification-service.test.ts | 598 ++++++++++++++++ .../common/cc_common/email_service_client.py | 249 +++++++ .../handlers/investigation_events.py | 461 +++++++++++++ .../function/test_investigation_events.py | 645 ++++++++++++++++++ .../stacks/notification_stack.py | 56 ++ .../tests/app/test_notification_stack.py | 327 +++++++++ 9 files changed, 2968 insertions(+), 1 deletion(-) create mode 100644 backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts create mode 100644 backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts create mode 100644 backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py create mode 100644 backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py diff --git a/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts b/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts index 91579cd30..ffab0568f 100644 --- a/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts +++ b/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts @@ -8,7 +8,7 @@ import { Context } from 'aws-lambda'; import { EnvironmentVariablesService } from '../lib/environment-variables-service'; import { CompactConfigurationClient } from '../lib/compact-configuration-client'; import { JurisdictionClient } from '../lib/jurisdiction-client'; -import { EmailNotificationService, EncumbranceNotificationService } from '../lib/email'; +import { EmailNotificationService, EncumbranceNotificationService, InvestigationNotificationService } from '../lib/email'; import { EmailNotificationEvent, EmailNotificationResponse } from '../lib/models/email-notification-service-event'; const environmentVariables = new EnvironmentVariablesService(); @@ -23,6 +23,7 @@ interface LambdaProperties { export class Lambda implements LambdaInterface { private readonly emailService: EmailNotificationService; private readonly encumbranceService: EncumbranceNotificationService; + private readonly investigationService: InvestigationNotificationService; constructor(props: LambdaProperties) { const compactConfigurationClient = new CompactConfigurationClient({ @@ -50,6 +51,14 @@ export class Lambda implements LambdaInterface { compactConfigurationClient: compactConfigurationClient, jurisdictionClient: jurisdictionClient }); + + this.investigationService = new InvestigationNotificationService({ + logger: logger, + sesClient: props.sesClient, + s3Client: props.s3Client, + compactConfigurationClient: compactConfigurationClient, + jurisdictionClient: jurisdictionClient + }); } /** @@ -357,6 +366,166 @@ export class Lambda implements LambdaInterface { event.templateVariables.recoveryToken ); break; + case 'licenseInvestigationProviderNotification': + if (!event.specificEmails?.length) { + throw new Error('No recipients found for license investigation provider notification email'); + } + if (!event.templateVariables?.providerFirstName + || !event.templateVariables?.providerLastName + || !event.templateVariables?.investigationJurisdiction + || !event.templateVariables?.licenseType) { + throw new Error('Missing required template variables for licenseInvestigationProviderNotification template.'); + } + await this.investigationService.sendLicenseInvestigationProviderNotificationEmail( + event.compact, + event.specificEmails, + event.templateVariables.providerFirstName, + event.templateVariables.providerLastName, + event.templateVariables.investigationJurisdiction, + event.templateVariables.licenseType + ); + break; + case 'licenseInvestigationStateNotification': + if (!event.jurisdiction) { + throw new Error('No jurisdiction provided for license investigation state notification email'); + } + if (!event.templateVariables?.providerFirstName + || !event.templateVariables?.providerLastName + || !event.templateVariables?.providerId + || !event.templateVariables?.investigationJurisdiction + || !event.templateVariables?.licenseType) { + throw new Error('Missing required template variables for licenseInvestigationStateNotification template.'); + } + await this.investigationService.sendLicenseInvestigationStateNotificationEmail( + event.compact, + event.jurisdiction, + event.templateVariables.providerFirstName, + event.templateVariables.providerLastName, + event.templateVariables.providerId, + event.templateVariables.investigationJurisdiction, + event.templateVariables.licenseType + ); + break; + case 'licenseInvestigationClosedProviderNotification': + if (!event.specificEmails?.length) { + throw new Error('No recipients found for license investigation closed provider notification email'); + } + if (!event.templateVariables?.providerFirstName + || !event.templateVariables?.providerLastName + || !event.templateVariables?.investigationJurisdiction + || !event.templateVariables?.licenseType) { + throw new Error('Missing required template variables for licenseInvestigationClosedProviderNotification template.'); + } + await this.investigationService.sendLicenseInvestigationClosedProviderNotificationEmail( + event.compact, + event.specificEmails, + event.templateVariables.providerFirstName, + event.templateVariables.providerLastName, + event.templateVariables.investigationJurisdiction, + event.templateVariables.licenseType + ); + break; + case 'licenseInvestigationClosedStateNotification': + if (!event.jurisdiction) { + throw new Error('No jurisdiction provided for license investigation closed state notification email'); + } + if (!event.templateVariables?.providerFirstName + || !event.templateVariables?.providerLastName + || !event.templateVariables?.providerId + || !event.templateVariables?.investigationJurisdiction + || !event.templateVariables?.licenseType) { + throw new Error('Missing required template variables for licenseInvestigationClosedStateNotification template.'); + } + await this.investigationService.sendLicenseInvestigationClosedStateNotificationEmail( + event.compact, + event.jurisdiction, + event.templateVariables.providerFirstName, + event.templateVariables.providerLastName, + event.templateVariables.providerId, + event.templateVariables.investigationJurisdiction, + event.templateVariables.licenseType + ); + break; + case 'privilegeInvestigationProviderNotification': + if (!event.specificEmails?.length) { + throw new Error('No recipients found for privilege investigation provider notification email'); + } + if (!event.templateVariables?.providerFirstName + || !event.templateVariables?.providerLastName + || !event.templateVariables?.investigationJurisdiction + || !event.templateVariables?.licenseType) { + throw new Error('Missing required template variables for privilegeInvestigationProviderNotification template.'); + } + await this.investigationService.sendPrivilegeInvestigationProviderNotificationEmail( + event.compact, + event.specificEmails, + event.templateVariables.providerFirstName, + event.templateVariables.providerLastName, + event.templateVariables.investigationJurisdiction, + event.templateVariables.licenseType + ); + break; + case 'privilegeInvestigationStateNotification': + if (!event.jurisdiction) { + throw new Error('No jurisdiction provided for privilege investigation state notification email'); + } + if (!event.templateVariables?.providerFirstName + || !event.templateVariables?.providerLastName + || !event.templateVariables?.providerId + || !event.templateVariables?.investigationJurisdiction + || !event.templateVariables?.licenseType) { + throw new Error('Missing required template variables for privilegeInvestigationStateNotification template.'); + } + await this.investigationService.sendPrivilegeInvestigationStateNotificationEmail( + event.compact, + event.jurisdiction, + event.templateVariables.providerFirstName, + event.templateVariables.providerLastName, + event.templateVariables.providerId, + event.templateVariables.investigationJurisdiction, + event.templateVariables.licenseType + ); + break; + case 'privilegeInvestigationClosedProviderNotification': + if (!event.specificEmails?.length) { + throw new Error('No recipients found for privilege investigation closed provider notification email'); + } + if (!event.templateVariables?.providerFirstName + || !event.templateVariables?.providerLastName + || !event.templateVariables?.investigationJurisdiction + || !event.templateVariables?.licenseType) { + throw new Error('Missing required template variables for privilegeInvestigationClosedProviderNotification template.'); + } + await this.investigationService.sendPrivilegeInvestigationClosedProviderNotificationEmail( + event.compact, + event.specificEmails, + event.templateVariables.providerFirstName, + event.templateVariables.providerLastName, + event.templateVariables.investigationJurisdiction, + event.templateVariables.licenseType + ); + break; + case 'privilegeInvestigationClosedStateNotification': + if (!event.jurisdiction) { + throw new Error('No jurisdiction provided for privilege investigation closed state notification email'); + } + if (!event.templateVariables?.providerFirstName + || !event.templateVariables?.providerLastName + || !event.templateVariables?.providerId + || !event.templateVariables?.investigationJurisdiction + || !event.templateVariables?.licenseType) { + throw new Error('Missing required template variables for privilegeInvestigationClosedStateNotification template.'); + } + await this.investigationService.sendPrivilegeInvestigationClosedStateNotificationEmail( + event.compact, + event.jurisdiction, + event.templateVariables.providerFirstName, + event.templateVariables.providerLastName, + event.templateVariables.providerId, + event.templateVariables.investigationJurisdiction, + event.templateVariables.licenseType + ); + break; default: logger.info('Unsupported email template provided', { template: event.template }); throw new Error(`Unsupported email template: ${event.template}`); diff --git a/backend/compact-connect/lambdas/nodejs/lib/email/index.ts b/backend/compact-connect/lambdas/nodejs/lib/email/index.ts index 6a09b913a..66e5ba1e8 100644 --- a/backend/compact-connect/lambdas/nodejs/lib/email/index.ts +++ b/backend/compact-connect/lambdas/nodejs/lib/email/index.ts @@ -1,5 +1,6 @@ export { CognitoEmailService } from './cognito-email-service'; export { EmailNotificationService } from './email-notification-service'; export { EncumbranceNotificationService } from './encumbrance-notification-service'; +export { InvestigationNotificationService } from './investigation-notification-service'; export { IngestEventEmailService } from './ingest-event-email-service'; export { EnvironmentBannerService } from './environment-banner-service'; diff --git a/backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts b/backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts new file mode 100644 index 000000000..1fc0fb63e --- /dev/null +++ b/backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts @@ -0,0 +1,461 @@ +import { BaseEmailService } from './base-email-service'; +import { EnvironmentVariablesService } from '../environment-variables-service'; +import { IJurisdiction } from 'lib/models/jurisdiction'; + +const environmentVariableService = new EnvironmentVariablesService(); + +/** + * Service for handling investigation-related email notifications + */ +export class InvestigationNotificationService extends BaseEmailService { + private async getJurisdictionAdverseActionRecipients( + jurisdictionConfig: IJurisdiction + ): Promise { + const recipients = jurisdictionConfig.jurisdictionAdverseActionsNotificationEmails; + + if (recipients.length === 0) { + // If the state hasn't provided a contact for adverse actions, we note it and move on, preferring to + // continue with other notifications, rather than failing the entire notification process. + this.logger.warn('No adverse action notification recipients found for jurisdiction', { + compact: jurisdictionConfig.compact, + jurisdiction: jurisdictionConfig.postalAbbreviation + }); + return []; + } + + return recipients; + } + + /** + * Gets jurisdiction configurations and adverse action recipients for state notifications, + * handling errors gracefully by logging warnings and continuing + * @param compact - The compact name + * @param notifyingJurisdiction - The jurisdiction that should be notified + * @param affectedJurisdiction - The jurisdiction where the investigation occurred + * @param context - Context for logging (e.g., 'license investigation', 'privilege investigation closed') + * @returns Object containing recipients and affected jurisdiction config, or empty if error occurred + */ + private async getStateNotificationData( + compact: string, + notifyingJurisdiction: string, + affectedJurisdiction: string, + context: string + ): Promise<{ + recipients: string[]; + affectedJurisdictionConfig: IJurisdiction | undefined; + }> { + let affectedJurisdictionConfig: IJurisdiction | undefined; + let recipients: string[] = []; + + try { + const notifyingJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( + compact, notifyingJurisdiction + ); + + if (notifyingJurisdictionConfig.postalAbbreviation !== affectedJurisdiction) { + affectedJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( + compact, affectedJurisdiction + ); + } else { + affectedJurisdictionConfig = notifyingJurisdictionConfig; + } + + recipients = await this.getJurisdictionAdverseActionRecipients(notifyingJurisdictionConfig); + } catch (error) { + // If we have missing jurisdiction configuration, we note it and move on, preferring to + // continue, rather than failing the entire notification process. + this.logger.warn(`Error getting jurisdiction configuration for state ${context} notification email`, { + compact: compact, + notifyingJurisdiction: notifyingJurisdiction, + affectedJurisdiction: affectedJurisdiction, + error: error + }); + } + + return { recipients, affectedJurisdictionConfig }; + } + + /** + * Sends a license investigation notification email to the provider + * @param compact - The compact name + * @param specificEmails - The provider's email address + * @param providerFirstName - The provider's first name + * @param providerLastName - The provider's last name + * @param jurisdiction - The jurisdiction where the license is under investigation + * @param licenseType - The license type that is under investigation + */ + public async sendLicenseInvestigationProviderNotificationEmail( + compact: string, + specificEmails: string[], + providerFirstName: string, + providerLastName: string, + investigationJurisdiction: string, + licenseType: string + ): Promise { + this.logger.info('Sending license investigation provider notification email', { compact: compact }); + + if (specificEmails.length === 0) { + throw new Error('No recipients specified for provider license investigation notification email'); + } + + const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( + compact, investigationJurisdiction + ); + const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); + + const report = this.getNewEmailTemplate(); + const subject = `Your ${licenseType} license in ${investigationJurisdictionConfig.jurisdictionName} is under investigation`; + const bodyText = `${providerFirstName} ${providerLastName},\n\n` + + `This message is to notify you that your *${licenseType}* license in ${investigationJurisdictionConfig.jurisdictionName} is under investigation. ` + + `Please contact the licensing board in ${investigationJurisdictionConfig.jurisdictionName} for more information about this investigation.`; + + this.insertHeader(report, subject); + this.insertBody(report, bodyText, 'center', true); + this.insertFooter(report); + + const htmlContent = this.renderTemplate(report); + + await this.sendEmail({ htmlContent, subject, recipients: specificEmails, errorMessage: 'Unable to send provider license investigation notification email' }); + } + + /** + * Sends a license investigation notification email to state authorities + * @param compact - The compact name + * @param jurisdiction - The jurisdiction to notify + * @param providerFirstName - The provider's first name + * @param providerLastName - The provider's last name + * @param providerId - The provider's ID + * @param investigationJurisdiction - The jurisdiction where the license is under investigation + * @param licenseType - The license type that is under investigation + */ + public async sendLicenseInvestigationStateNotificationEmail( + compact: string, + jurisdiction: string, + providerFirstName: string, + providerLastName: string, + providerId: string, + investigationJurisdiction: string, + licenseType: string + ): Promise { + this.logger.info('Sending license investigation state notification email', { + compact: compact, + jurisdiction: jurisdiction + }); + + const { recipients, affectedJurisdictionConfig } = await this.getStateNotificationData( + compact, jurisdiction, investigationJurisdiction, 'license investigation' + ); + + if (recipients.length === 0) { + this.logger.warn('No recipients found for license investigation state notification', { + compact: compact, + jurisdiction: jurisdiction + }); + return; + } + + const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); + const report = this.getNewEmailTemplate(); + const subject = `${providerFirstName} ${providerLastName} holding ${licenseType} license in ${affectedJurisdictionConfig?.jurisdictionName} is under investigation`; + const bodyText = `This message is to notify you that ${providerFirstName} ${providerLastName} (Provider ID: ${providerId}) ` + + `holding a *${licenseType}* license in ${affectedJurisdictionConfig?.jurisdictionName} is under investigation ` + + `in the ${compactConfig.compactName} compact.\n\n` + + `Please contact the licensing board in ${affectedJurisdictionConfig?.jurisdictionName} for more information about this investigation.`; + + this.insertHeader(report, subject); + this.insertBody(report, bodyText, 'center', true); + this.insertFooter(report); + + const htmlContent = this.renderTemplate(report); + + await this.sendEmail({ htmlContent, subject, recipients, errorMessage: 'Unable to send license investigation state notification email' }); + } + + /** + * Sends a license investigation closed notification email to the provider + * @param compact - The compact name + * @param specificEmails - The provider's email address + * @param providerFirstName - The provider's first name + * @param providerLastName - The provider's last name + * @param jurisdiction - The jurisdiction where the license investigation was closed + * @param licenseType - The license type that was under investigation + */ + public async sendLicenseInvestigationClosedProviderNotificationEmail( + compact: string, + specificEmails: string[], + providerFirstName: string, + providerLastName: string, + investigationJurisdiction: string, + licenseType: string + ): Promise { + this.logger.info('Sending license investigation closed provider notification email', { compact: compact }); + + if (specificEmails.length === 0) { + throw new Error('No recipients specified for provider license investigation closed notification email'); + } + + const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( + compact, investigationJurisdiction + ); + const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); + + const report = this.getNewEmailTemplate(); + const subject = `The investigation on your ${licenseType} license in ${investigationJurisdictionConfig.jurisdictionName} has been closed`; + const bodyText = `${providerFirstName} ${providerLastName},\n\n` + + `This message is to notify you that the investigation on your *${licenseType}* license in ${investigationJurisdictionConfig.jurisdictionName} has been closed. ` + + `Please contact the licensing board in ${investigationJurisdictionConfig.jurisdictionName} for more information about this investigation closure.`; + + this.insertHeader(report, subject); + this.insertBody(report, bodyText, 'center', true); + this.insertFooter(report); + + const htmlContent = this.renderTemplate(report); + + await this.sendEmail({ htmlContent, subject, recipients: specificEmails, errorMessage: 'Unable to send provider license investigation closed notification email' }); + } + + /** + * Sends a license investigation closed notification email to state authorities + * @param compact - The compact name + * @param jurisdiction - The jurisdiction to notify + * @param providerFirstName - The provider's first name + * @param providerLastName - The provider's last name + * @param providerId - The provider's ID + * @param investigationJurisdiction - The jurisdiction where the license investigation was closed + * @param licenseType - The license type that was under investigation + */ + public async sendLicenseInvestigationClosedStateNotificationEmail( + compact: string, + jurisdiction: string, + providerFirstName: string, + providerLastName: string, + providerId: string, + investigationJurisdiction: string, + licenseType: string + ): Promise { + this.logger.info('Sending license investigation closed state notification email', { + compact: compact, + jurisdiction: jurisdiction + }); + + const { recipients, affectedJurisdictionConfig } = await this.getStateNotificationData( + compact, jurisdiction, investigationJurisdiction, 'license investigation closed' + ); + + if (recipients.length === 0) { + this.logger.warn('No recipients found for license investigation closed state notification', { + compact: compact, + jurisdiction: jurisdiction + }); + return; + } + + const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); + const report = this.getNewEmailTemplate(); + const subject = `Investigation on ${providerFirstName} ${providerLastName}'s ${licenseType} license in ${affectedJurisdictionConfig?.jurisdictionName} has been closed`; + const bodyText = `This message is to notify you that the investigation on ${providerFirstName} ${providerLastName} (Provider ID: ${providerId}) ` + + `holding a *${licenseType}* license in ${affectedJurisdictionConfig?.jurisdictionName} has been closed ` + + `in the ${compactConfig.compactName} compact.\n\n` + + `Please contact the licensing board in ${affectedJurisdictionConfig?.jurisdictionName} for more information about this investigation closure.`; + + this.insertHeader(report, subject); + this.insertBody(report, bodyText, 'center', true); + this.insertFooter(report); + + const htmlContent = this.renderTemplate(report); + + await this.sendEmail({ htmlContent, subject, recipients, errorMessage: 'Unable to send license investigation closed state notification email' }); + } + + /** + * Sends a privilege investigation notification email to the provider + * @param compact - The compact name + * @param specificEmails - The provider's email address + * @param providerFirstName - The provider's first name + * @param providerLastName - The provider's last name + * @param jurisdiction - The jurisdiction where the privilege is under investigation + * @param licenseType - The license type that is under investigation + */ + public async sendPrivilegeInvestigationProviderNotificationEmail( + compact: string, + specificEmails: string[], + providerFirstName: string, + providerLastName: string, + investigationJurisdiction: string, + licenseType: string + ): Promise { + this.logger.info('Sending privilege investigation provider notification email', { compact: compact }); + + if (specificEmails.length === 0) { + throw new Error('No recipients specified for provider privilege investigation notification email'); + } + + const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( + compact, investigationJurisdiction + ); + const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); + + const report = this.getNewEmailTemplate(); + const subject = `Your ${licenseType} privilege in ${investigationJurisdictionConfig.jurisdictionName} is under investigation`; + const bodyText = `${providerFirstName} ${providerLastName},\n\n` + + `This message is to notify you that your *${licenseType}* privilege in ${investigationJurisdictionConfig.jurisdictionName} is under investigation. ` + + `Please contact the licensing board in ${investigationJurisdictionConfig.jurisdictionName} for more information about this investigation.`; + + this.insertHeader(report, subject); + this.insertBody(report, bodyText, 'center', true); + this.insertFooter(report); + + const htmlContent = this.renderTemplate(report); + + await this.sendEmail({ htmlContent, subject, recipients: specificEmails, errorMessage: 'Unable to send provider privilege investigation notification email' }); + } + + /** + * Sends a privilege investigation notification email to state authorities + * @param compact - The compact name + * @param jurisdiction - The jurisdiction to notify + * @param providerFirstName - The provider's first name + * @param providerLastName - The provider's last name + * @param providerId - The provider's ID + * @param investigationJurisdiction - The jurisdiction where the privilege is under investigation + * @param licenseType - The license type that is under investigation + */ + public async sendPrivilegeInvestigationStateNotificationEmail( + compact: string, + jurisdiction: string, + providerFirstName: string, + providerLastName: string, + providerId: string, + investigationJurisdiction: string, + licenseType: string + ): Promise { + this.logger.info('Sending privilege investigation state notification email', { + compact: compact, + jurisdiction: jurisdiction + }); + + const { recipients, affectedJurisdictionConfig } = await this.getStateNotificationData( + compact, jurisdiction, investigationJurisdiction, 'privilege investigation' + ); + + if (recipients.length === 0) { + this.logger.warn('No recipients found for privilege investigation state notification', { + compact: compact, + jurisdiction: jurisdiction + }); + return; + } + + const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); + const report = this.getNewEmailTemplate(); + const subject = `${providerFirstName} ${providerLastName} holding ${licenseType} privilege in ${affectedJurisdictionConfig?.jurisdictionName} is under investigation`; + const bodyText = `This message is to notify you that ${providerFirstName} ${providerLastName} (Provider ID: ${providerId}) ` + + `holding a *${licenseType}* privilege in ${affectedJurisdictionConfig?.jurisdictionName} is under investigation ` + + `in the ${compactConfig.compactName} compact.\n\n` + + `Please contact the licensing board in ${affectedJurisdictionConfig?.jurisdictionName} for more information about this investigation.`; + + this.insertHeader(report, subject); + this.insertBody(report, bodyText, 'center', true); + this.insertFooter(report); + + const htmlContent = this.renderTemplate(report); + + await this.sendEmail({ htmlContent, subject, recipients, errorMessage: 'Unable to send privilege investigation state notification email' }); + } + + /** + * Sends a privilege investigation closed notification email to the provider + * @param compact - The compact name + * @param specificEmails - The provider's email address + * @param providerFirstName - The provider's first name + * @param providerLastName - The provider's last name + * @param jurisdiction - The jurisdiction where the privilege investigation was closed + * @param licenseType - The license type that was under investigation + */ + public async sendPrivilegeInvestigationClosedProviderNotificationEmail( + compact: string, + specificEmails: string[], + providerFirstName: string, + providerLastName: string, + investigationJurisdiction: string, + licenseType: string + ): Promise { + this.logger.info('Sending privilege investigation closed provider notification email', { compact: compact }); + + if (specificEmails.length === 0) { + throw new Error('No recipients specified for provider privilege investigation closed notification email'); + } + + const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( + compact, investigationJurisdiction + ); + const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); + + const report = this.getNewEmailTemplate(); + const subject = `The investigation on your ${licenseType} privilege in ${investigationJurisdictionConfig.jurisdictionName} has been closed`; + const bodyText = `${providerFirstName} ${providerLastName},\n\n` + + `This message is to notify you that the investigation on your *${licenseType}* privilege in ${investigationJurisdictionConfig.jurisdictionName} has been closed. ` + + `Please contact the licensing board in ${investigationJurisdictionConfig.jurisdictionName} for more information about this investigation closure.`; + + this.insertHeader(report, subject); + this.insertBody(report, bodyText, 'center', true); + this.insertFooter(report); + + const htmlContent = this.renderTemplate(report); + + await this.sendEmail({ htmlContent, subject, recipients: specificEmails, errorMessage: 'Unable to send provider privilege investigation closed notification email' }); + } + + /** + * Sends a privilege investigation closed notification email to state authorities + * @param compact - The compact name + * @param jurisdiction - The jurisdiction to notify + * @param providerFirstName - The provider's first name + * @param providerLastName - The provider's last name + * @param providerId - The provider's ID + * @param investigationJurisdiction - The jurisdiction where the privilege investigation was closed + * @param licenseType - The license type that was under investigation + */ + public async sendPrivilegeInvestigationClosedStateNotificationEmail( + compact: string, + jurisdiction: string, + providerFirstName: string, + providerLastName: string, + providerId: string, + investigationJurisdiction: string, + licenseType: string + ): Promise { + this.logger.info('Sending privilege investigation closed state notification email', { + compact: compact, + jurisdiction: jurisdiction + }); + + const { recipients, affectedJurisdictionConfig } = await this.getStateNotificationData( + compact, jurisdiction, investigationJurisdiction, 'privilege investigation closed' + ); + + if (recipients.length === 0) { + this.logger.warn('No recipients found for privilege investigation closed state notification', { + compact: compact, + jurisdiction: jurisdiction + }); + return; + } + + const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); + const report = this.getNewEmailTemplate(); + const subject = `Investigation on ${providerFirstName} ${providerLastName}'s ${licenseType} privilege in ${affectedJurisdictionConfig?.jurisdictionName} has been closed`; + const bodyText = `This message is to notify you that the investigation on ${providerFirstName} ${providerLastName} (Provider ID: ${providerId}) ` + + `holding a *${licenseType}* privilege in ${affectedJurisdictionConfig?.jurisdictionName} has been closed ` + + `in the ${compactConfig.compactName} compact.\n\n` + + `Please contact the licensing board in ${affectedJurisdictionConfig?.jurisdictionName} for more information about this investigation closure.`; + + this.insertHeader(report, subject); + this.insertBody(report, bodyText, 'center', true); + this.insertFooter(report); + + const htmlContent = this.renderTemplate(report); + + await this.sendEmail({ htmlContent, subject, recipients, errorMessage: 'Unable to send privilege investigation closed state notification email' }); + } +} diff --git a/backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts b/backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts new file mode 100644 index 000000000..192451c5b --- /dev/null +++ b/backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts @@ -0,0 +1,598 @@ +import { mockClient } from 'aws-sdk-client-mock'; +import 'aws-sdk-client-mock-jest'; +import { Logger } from '@aws-lambda-powertools/logger'; +import { SendEmailCommand, SESv2Client } from '@aws-sdk/client-sesv2'; +import { S3Client } from '@aws-sdk/client-s3'; +import { InvestigationNotificationService } from '../../../lib/email'; +import { CompactConfigurationClient } from '../../../lib/compact-configuration-client'; +import { JurisdictionClient } from '../../../lib/jurisdiction-client'; +import { EmailTemplateCapture } from '../../utils/email-template-capture'; +import { TReaderDocument } from '@jusdino-ia/email-builder'; +import { describe, it, expect, beforeEach, beforeAll, afterAll, jest } from '@jest/globals'; +import { Compact } from '../../../lib/models/compact'; +import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; + +const SAMPLE_COMPACT_CONFIG: Compact = { + pk: 'aslp#CONFIGURATION', + sk: 'aslp#CONFIGURATION', + compactAdverseActionsNotificationEmails: ['adverse@example.com'], + compactCommissionFee: { + feeAmount: 3.5, + feeType: 'FLAT_RATE' + }, + compactAbbr: 'aslp', + compactName: 'Audiology and Speech Language Pathology', + compactOperationsTeamEmails: ['operations@example.com'], + compactSummaryReportNotificationEmails: ['summary@example.com'], + dateOfUpdate: '2024-12-10T19:27:28+00:00', + type: 'compact' +}; + +const SAMPLE_JURISDICTION_CONFIG = { + pk: 'aslp#CONFIGURATION', + sk: 'aslp#JURISDICTION#oh', + jurisdictionName: 'Ohio', + postalAbbreviation: 'oh', + compact: 'aslp', + jurisdictionOperationsTeamEmails: ['oh-ops@example.com'], + jurisdictionAdverseActionsNotificationEmails: ['oh-adverse@example.com'], + jurisdictionSummaryReportNotificationEmails: ['oh-summary@example.com'] +}; + +const asSESClient = (mock: ReturnType) => + mock as unknown as SESv2Client; + +const asS3Client = (mock: ReturnType) => + mock as unknown as S3Client; + +class MockCompactConfigurationClient extends CompactConfigurationClient { + constructor() { + super({ + logger: new Logger({ serviceName: 'test' }), + dynamoDBClient: {} as DynamoDBClient + }); + } + + public async getCompactConfiguration(compact: string): Promise { + return SAMPLE_COMPACT_CONFIG; + } +} + +describe('InvestigationNotificationService', () => { + let investigationService: InvestigationNotificationService; + let mockSESClient: ReturnType; + let mockS3Client: ReturnType; + let mockCompactConfigurationClient: MockCompactConfigurationClient; + let mockJurisdictionClient: jest.Mocked; + + beforeAll(() => { + // Mock the renderTemplate method if template capture is enabled + if (EmailTemplateCapture.isEnabled()) { + const original = (InvestigationNotificationService.prototype as any).renderTemplate; + + jest.spyOn(InvestigationNotificationService.prototype as any, 'renderTemplate').mockImplementation(function (this: any, ...args: any[]) { + const [template, options] = args as [TReaderDocument, any]; + + EmailTemplateCapture.captureTemplate(template); + const html = original.apply(this, args); + + EmailTemplateCapture.captureHtml(html, template, options); + return html; + }); + } + }); + + afterAll(() => { + jest.restoreAllMocks(); + }); + + beforeEach(() => { + jest.clearAllMocks(); + mockSESClient = mockClient(SESv2Client); + mockS3Client = mockClient(S3Client); + mockCompactConfigurationClient = new MockCompactConfigurationClient(); + mockJurisdictionClient = { + getJurisdictionConfigurations: jest.fn(), + getJurisdictionConfiguration: jest.fn() + } as any; + + // Reset environment variables + process.env.FROM_ADDRESS = 'noreply@example.org'; + process.env.UI_BASE_PATH_URL = 'https://app.test.compactconnect.org'; + + // Set up default successful responses + mockSESClient.on(SendEmailCommand).resolves({ + MessageId: 'message-id-123' + }); + + mockJurisdictionClient.getJurisdictionConfiguration.mockResolvedValue(SAMPLE_JURISDICTION_CONFIG); + + investigationService = new InvestigationNotificationService({ + logger: new Logger({ serviceName: 'test' }), + sesClient: asSESClient(mockSESClient), + s3Client: asS3Client(mockS3Client), + compactConfigurationClient: mockCompactConfigurationClient, + jurisdictionClient: mockJurisdictionClient + }); + }); + + describe('License Investigation Provider Notification', () => { + it('should send license investigation provider notification email', async () => { + await investigationService.sendLicenseInvestigationProviderNotificationEmail( + 'aslp', + ['provider@example.com'], + 'John', + 'Doe', + 'OH', + 'Audiologist' + ); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['provider@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('Your Audiologist license in Ohio is under investigation') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'Your Audiologist license in Ohio is under investigation' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when no recipients provided', async () => { + await expect( + investigationService.sendLicenseInvestigationProviderNotificationEmail( + 'aslp', + [], + 'John', + 'Doe', + 'OH', + 'Audiologist' + ) + ).rejects.toThrow('No recipients specified for provider license investigation notification email'); + }); + }); + + describe('License Investigation State Notification', () => { + it('should send license investigation state notification email', async () => { + await investigationService.sendLicenseInvestigationStateNotificationEmail( + 'aslp', + 'OH', + 'John', + 'Doe', + 'provider-123', + 'OH', + 'Audiologist' + ); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['oh-adverse@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('John Doe holding Audiologist license in Ohio is under investigation') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'John Doe holding Audiologist license in Ohio is under investigation' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should handle missing jurisdiction configuration gracefully', async () => { + mockJurisdictionClient.getJurisdictionConfiguration.mockRejectedValue(new Error('Jurisdiction not found')); + + await investigationService.sendLicenseInvestigationStateNotificationEmail( + 'aslp', + 'OH', + 'John', + 'Doe', + 'provider-123', + 'OH', + 'Audiologist' + ); + + // Should not throw an error, but also should not send email + expect(mockSESClient).not.toHaveReceivedCommand(SendEmailCommand); + }); + }); + + describe('License Investigation Closed Provider Notification', () => { + it('should send license investigation closed provider notification email', async () => { + await investigationService.sendLicenseInvestigationClosedProviderNotificationEmail( + 'aslp', + ['provider@example.com'], + 'John', + 'Doe', + 'OH', + 'Audiologist' + ); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['provider@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('The investigation on your Audiologist license in Ohio has been closed') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'The investigation on your Audiologist license in Ohio has been closed' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when no recipients provided', async () => { + await expect( + investigationService.sendLicenseInvestigationClosedProviderNotificationEmail( + 'aslp', + [], + 'John', + 'Doe', + 'OH', + 'Audiologist' + ) + ).rejects.toThrow('No recipients specified for provider license investigation closed notification email'); + }); + }); + + describe('License Investigation Closed State Notification', () => { + it('should send license investigation closed state notification email', async () => { + await investigationService.sendLicenseInvestigationClosedStateNotificationEmail( + 'aslp', + 'OH', + 'John', + 'Doe', + 'provider-123', + 'OH', + 'Audiologist' + ); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['oh-adverse@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('holding a Audiologist license in Ohio has been closed') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'Investigation on John Doe\'s Audiologist license in Ohio has been closed' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + }); + + describe('Privilege Investigation Provider Notification', () => { + it('should send privilege investigation provider notification email', async () => { + await investigationService.sendPrivilegeInvestigationProviderNotificationEmail( + 'aslp', + ['provider@example.com'], + 'John', + 'Doe', + 'OH', + 'Audiologist' + ); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['provider@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('Your Audiologist privilege in Ohio is under investigation') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'Your Audiologist privilege in Ohio is under investigation' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when no recipients provided', async () => { + await expect( + investigationService.sendPrivilegeInvestigationProviderNotificationEmail( + 'aslp', + [], + 'John', + 'Doe', + 'OH', + 'Audiologist' + ) + ).rejects.toThrow('No recipients specified for provider privilege investigation notification email'); + }); + }); + + describe('Privilege Investigation State Notification', () => { + it('should send privilege investigation state notification email', async () => { + await investigationService.sendPrivilegeInvestigationStateNotificationEmail( + 'aslp', + 'OH', + 'John', + 'Doe', + 'provider-123', + 'OH', + 'Audiologist' + ); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['oh-adverse@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('John Doe holding Audiologist privilege in Ohio is under investigation') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'John Doe holding Audiologist privilege in Ohio is under investigation' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + }); + + describe('Privilege Investigation Closed Provider Notification', () => { + it('should send privilege investigation closed provider notification email', async () => { + await investigationService.sendPrivilegeInvestigationClosedProviderNotificationEmail( + 'aslp', + ['provider@example.com'], + 'John', + 'Doe', + 'OH', + 'Audiologist' + ); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['provider@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('The investigation on your Audiologist privilege in Ohio has been closed') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'The investigation on your Audiologist privilege in Ohio has been closed' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when no recipients provided', async () => { + await expect( + investigationService.sendPrivilegeInvestigationClosedProviderNotificationEmail( + 'aslp', + [], + 'John', + 'Doe', + 'OH', + 'Audiologist' + ) + ).rejects.toThrow('No recipients specified for provider privilege investigation closed notification email'); + }); + }); + + describe('Privilege Investigation Closed State Notification', () => { + it('should send privilege investigation closed state notification email', async () => { + await investigationService.sendPrivilegeInvestigationClosedStateNotificationEmail( + 'aslp', + 'OH', + 'John', + 'Doe', + 'provider-123', + 'OH', + 'Audiologist' + ); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['oh-adverse@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('holding a Audiologist privilege in Ohio has been closed') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'Investigation on John Doe\'s Audiologist privilege in Ohio has been closed' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + }); + + describe('Error Handling', () => { + it('should handle SES client errors gracefully', async () => { + mockSESClient.on(SendEmailCommand).rejects(new Error('SES service error')); + + await expect( + investigationService.sendLicenseInvestigationProviderNotificationEmail( + 'aslp', + ['provider@example.com'], + 'John', + 'Doe', + 'OH', + 'Audiologist' + ) + ).rejects.toThrow('SES service error'); + }); + + it('should handle missing adverse action recipients gracefully', async () => { + const jurisdictionConfigWithoutAdverseActions = { + ...SAMPLE_JURISDICTION_CONFIG, + jurisdictionAdverseActionsNotificationEmails: [] + }; + + mockJurisdictionClient.getJurisdictionConfiguration.mockResolvedValue( + jurisdictionConfigWithoutAdverseActions + ); + + await investigationService.sendLicenseInvestigationStateNotificationEmail( + 'aslp', + 'OH', + 'John', + 'Doe', + 'provider-123', + 'OH', + 'Audiologist' + ); + + // Should not throw an error, but also should not send email + expect(mockSESClient).not.toHaveReceivedCommand(SendEmailCommand); + }); + + it('should handle missing recipients for license investigation closed state notification', async () => { + const jurisdictionConfigWithoutAdverseActions = { + ...SAMPLE_JURISDICTION_CONFIG, + jurisdictionAdverseActionsNotificationEmails: [] + }; + + mockJurisdictionClient.getJurisdictionConfiguration.mockResolvedValue( + jurisdictionConfigWithoutAdverseActions + ); + + await investigationService.sendLicenseInvestigationClosedStateNotificationEmail( + 'aslp', + 'OH', + 'John', + 'Doe', + 'provider-123', + 'OH', + 'Audiologist' + ); + + // Should not throw an error, but also should not send email + expect(mockSESClient).not.toHaveReceivedCommand(SendEmailCommand); + }); + + it('should handle missing recipients for privilege investigation state notification', async () => { + const jurisdictionConfigWithoutAdverseActions = { + ...SAMPLE_JURISDICTION_CONFIG, + jurisdictionAdverseActionsNotificationEmails: [] + }; + + mockJurisdictionClient.getJurisdictionConfiguration.mockResolvedValue( + jurisdictionConfigWithoutAdverseActions + ); + + await investigationService.sendPrivilegeInvestigationStateNotificationEmail( + 'aslp', + 'OH', + 'John', + 'Doe', + 'provider-123', + 'OH', + 'Audiologist' + ); + + // Should not throw an error, but also should not send email + expect(mockSESClient).not.toHaveReceivedCommand(SendEmailCommand); + }); + + it('should handle missing recipients for privilege investigation closed state notification', async () => { + const jurisdictionConfigWithoutAdverseActions = { + ...SAMPLE_JURISDICTION_CONFIG, + jurisdictionAdverseActionsNotificationEmails: [] + }; + + mockJurisdictionClient.getJurisdictionConfiguration.mockResolvedValue( + jurisdictionConfigWithoutAdverseActions + ); + + await investigationService.sendPrivilegeInvestigationClosedStateNotificationEmail( + 'aslp', + 'OH', + 'John', + 'Doe', + 'provider-123', + 'OH', + 'Audiologist' + ); + + // Should not throw an error, but also should not send email + expect(mockSESClient).not.toHaveReceivedCommand(SendEmailCommand); + }); + + it('should handle same notifying and affected jurisdiction', async () => { + // Reset mocks to ensure clean state + jest.clearAllMocks(); + mockJurisdictionClient.getJurisdictionConfiguration.mockResolvedValue(SAMPLE_JURISDICTION_CONFIG); + + // When notifying jurisdiction equals affected jurisdiction, it should use the same config + await investigationService.sendLicenseInvestigationStateNotificationEmail( + 'aslp', + 'OH', + 'John', + 'Doe', + 'provider-123', + 'OH', // Same as notifying jurisdiction + 'Audiologist' + ); + + // Should have been called at least once with the jurisdiction + expect(mockJurisdictionClient.getJurisdictionConfiguration).toHaveBeenCalledWith('aslp', 'OH'); + // Should have sent the email successfully + expect(mockSESClient).toHaveReceivedCommand(SendEmailCommand); + }); + }); +}); diff --git a/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py b/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py index 410a8e764..3f6c4ea65 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py @@ -24,6 +24,19 @@ class EncumbranceNotificationTemplateVariables: provider_id: UUID | None = None +@dataclass +class InvestigationNotificationTemplateVariables: + """ + Template variables for investigation notification emails. + """ + + provider_first_name: str + provider_last_name: str + investigation_jurisdiction: str + license_type: str + provider_id: UUID | None = None + + class ProviderNotificationMethod(Protocol): """Protocol for provider encumbrance notification methods.""" @@ -595,3 +608,239 @@ def send_provider_account_recovery_confirmation_email( } return self._invoke_lambda(payload) + + def send_license_investigation_provider_notification_email( + self, + *, + compact: str, + provider_email: str, + template_variables: InvestigationNotificationTemplateVariables, + ) -> dict[str, str]: + """ + Send a license investigation notification email to a provider. + + :param compact: Compact name + :param provider_email: Email address of the provider + :param template_variables: Template variables for the email + :return: Response from the email notification service + """ + payload = { + 'compact': compact, + 'template': 'licenseInvestigationProviderNotification', + 'recipientType': 'SPECIFIC', + 'specificEmails': [provider_email], + 'templateVariables': { + 'providerFirstName': template_variables.provider_first_name, + 'providerLastName': template_variables.provider_last_name, + 'investigationJurisdiction': template_variables.investigation_jurisdiction, + 'licenseType': template_variables.license_type, + }, + } + return self._invoke_lambda(payload) + + def send_license_investigation_state_notification_email( + self, + *, + compact: str, + jurisdiction: str, + template_variables: InvestigationNotificationTemplateVariables, + ) -> dict[str, str]: + """ + Send a license investigation notification email to a state. + + :param compact: Compact name + :param jurisdiction: Jurisdiction to notify + :param template_variables: Template variables for the email + :return: Response from the email notification service + """ + payload = { + 'compact': compact, + 'jurisdiction': jurisdiction, + 'template': 'licenseInvestigationStateNotification', + 'recipientType': 'JURISDICTION_ADVERSE_ACTIONS', + 'templateVariables': { + 'providerFirstName': template_variables.provider_first_name, + 'providerLastName': template_variables.provider_last_name, + 'providerId': str(template_variables.provider_id), + 'investigationJurisdiction': template_variables.investigation_jurisdiction, + 'licenseType': template_variables.license_type, + }, + } + return self._invoke_lambda(payload) + + def send_license_investigation_closed_provider_notification_email( + self, + *, + compact: str, + provider_email: str, + template_variables: InvestigationNotificationTemplateVariables, + ) -> dict[str, str]: + """ + Send a license investigation closed notification email to a provider. + + :param compact: Compact name + :param provider_email: Email address of the provider + :param template_variables: Template variables for the email + :return: Response from the email notification service + """ + payload = { + 'compact': compact, + 'template': 'licenseInvestigationClosedProviderNotification', + 'recipientType': 'SPECIFIC', + 'specificEmails': [provider_email], + 'templateVariables': { + 'providerFirstName': template_variables.provider_first_name, + 'providerLastName': template_variables.provider_last_name, + 'investigationJurisdiction': template_variables.investigation_jurisdiction, + 'licenseType': template_variables.license_type, + }, + } + return self._invoke_lambda(payload) + + def send_license_investigation_closed_state_notification_email( + self, + *, + compact: str, + jurisdiction: str, + template_variables: InvestigationNotificationTemplateVariables, + ) -> dict[str, str]: + """ + Send a license investigation closed notification email to a state. + + :param compact: Compact name + :param jurisdiction: Jurisdiction to notify + :param template_variables: Template variables for the email + :return: Response from the email notification service + """ + payload = { + 'compact': compact, + 'jurisdiction': jurisdiction, + 'template': 'licenseInvestigationClosedStateNotification', + 'recipientType': 'JURISDICTION_ADVERSE_ACTIONS', + 'templateVariables': { + 'providerFirstName': template_variables.provider_first_name, + 'providerLastName': template_variables.provider_last_name, + 'providerId': str(template_variables.provider_id), + 'investigationJurisdiction': template_variables.investigation_jurisdiction, + 'licenseType': template_variables.license_type, + }, + } + return self._invoke_lambda(payload) + + def send_privilege_investigation_provider_notification_email( + self, + *, + compact: str, + provider_email: str, + template_variables: InvestigationNotificationTemplateVariables, + ) -> dict[str, str]: + """ + Send a privilege investigation notification email to a provider. + + :param compact: Compact name + :param provider_email: Email address of the provider + :param template_variables: Template variables for the email + :return: Response from the email notification service + """ + payload = { + 'compact': compact, + 'template': 'privilegeInvestigationProviderNotification', + 'recipientType': 'SPECIFIC', + 'specificEmails': [provider_email], + 'templateVariables': { + 'providerFirstName': template_variables.provider_first_name, + 'providerLastName': template_variables.provider_last_name, + 'investigationJurisdiction': template_variables.investigation_jurisdiction, + 'licenseType': template_variables.license_type, + }, + } + return self._invoke_lambda(payload) + + def send_privilege_investigation_state_notification_email( + self, + *, + compact: str, + jurisdiction: str, + template_variables: InvestigationNotificationTemplateVariables, + ) -> dict[str, str]: + """ + Send a privilege investigation notification email to a state. + + :param compact: Compact name + :param jurisdiction: Jurisdiction to notify + :param template_variables: Template variables for the email + :return: Response from the email notification service + """ + payload = { + 'compact': compact, + 'jurisdiction': jurisdiction, + 'template': 'privilegeInvestigationStateNotification', + 'recipientType': 'JURISDICTION_ADVERSE_ACTIONS', + 'templateVariables': { + 'providerFirstName': template_variables.provider_first_name, + 'providerLastName': template_variables.provider_last_name, + 'providerId': str(template_variables.provider_id), + 'investigationJurisdiction': template_variables.investigation_jurisdiction, + 'licenseType': template_variables.license_type, + }, + } + return self._invoke_lambda(payload) + + def send_privilege_investigation_closed_provider_notification_email( + self, + *, + compact: str, + provider_email: str, + template_variables: InvestigationNotificationTemplateVariables, + ) -> dict[str, str]: + """ + Send a privilege investigation closed notification email to a provider. + + :param compact: Compact name + :param provider_email: Email address of the provider + :param template_variables: Template variables for the email + :return: Response from the email notification service + """ + payload = { + 'compact': compact, + 'template': 'privilegeInvestigationClosedProviderNotification', + 'recipientType': 'SPECIFIC', + 'specificEmails': [provider_email], + 'templateVariables': { + 'providerFirstName': template_variables.provider_first_name, + 'providerLastName': template_variables.provider_last_name, + 'investigationJurisdiction': template_variables.investigation_jurisdiction, + 'licenseType': template_variables.license_type, + }, + } + return self._invoke_lambda(payload) + + def send_privilege_investigation_closed_state_notification_email( + self, + *, + compact: str, + jurisdiction: str, + template_variables: InvestigationNotificationTemplateVariables, + ) -> dict[str, str]: + """ + Send a privilege investigation closed notification email to a state. + + :param compact: Compact name + :param jurisdiction: Jurisdiction to notify + :param template_variables: Template variables for the email + :return: Response from the email notification service + """ + payload = { + 'compact': compact, + 'jurisdiction': jurisdiction, + 'template': 'privilegeInvestigationClosedStateNotification', + 'recipientType': 'JURISDICTION_ADVERSE_ACTIONS', + 'templateVariables': { + 'providerFirstName': template_variables.provider_first_name, + 'providerLastName': template_variables.provider_last_name, + 'providerId': str(template_variables.provider_id), + 'investigationJurisdiction': template_variables.investigation_jurisdiction, + 'licenseType': template_variables.license_type, + }, + } + return self._invoke_lambda(payload) diff --git a/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py b/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py new file mode 100644 index 000000000..c1b869999 --- /dev/null +++ b/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py @@ -0,0 +1,461 @@ +from uuid import UUID + +from cc_common.config import config, logger +from cc_common.data_model.provider_record_util import ProviderData, ProviderUserRecords +from cc_common.data_model.schema.data_event.api import ( + InvestigationEventDetailSchema, +) +from cc_common.email_service_client import InvestigationNotificationTemplateVariables, ProviderNotificationMethod +from cc_common.license_util import LicenseUtility +from cc_common.utils import sqs_handler + + +def _get_license_type_name(compact: str, license_type_abbreviation: str) -> str: + """ + Get the license type name from abbreviation. + + :param compact: The compact identifier + :param license_type_abbreviation: The license type abbreviation + :return: The license type name + """ + return LicenseUtility.get_license_type_by_abbreviation(compact, license_type_abbreviation).name + + +def _get_provider_records(compact: str, provider_id: str) -> tuple[ProviderUserRecords, ProviderData]: + """ + Retrieve and validate provider records for notification processing. + + :param compact: The compact identifier + :param provider_id: The provider ID + :return: Tuple of (provider_records, provider_record) + :raises Exception: If provider records cannot be retrieved + """ + try: + provider_records = config.data_client.get_provider_user_records( + compact=compact, + provider_id=provider_id, + ) + provider_record = provider_records.get_provider_record() + return provider_records, provider_record + except Exception as e: + logger.error('Failed to retrieve provider records for notification', exception=str(e)) + raise + + +def _send_provider_notification( + notification_method: ProviderNotificationMethod, + notification_type: str, + *, + provider_record: ProviderData, + compact: str, + **notification_kwargs, +) -> None: + """ + Send notification to provider if they are registered. + + :param provider_record: The provider record + :param notification_method: The email service method to call + :param notification_type: Type of notification for logging + :param compact: The compact identifier + :param notification_kwargs: Additional arguments for the notification method + """ + provider_email = provider_record.compactConnectRegisteredEmailAddress + if provider_email: + logger.info(f'Sending {notification_type} notification to provider', provider_email=provider_email) + try: + notification_method( + compact=compact, + provider_email=provider_email, + template_variables=InvestigationNotificationTemplateVariables( + provider_first_name=provider_record.givenName, + provider_last_name=provider_record.familyName, + **notification_kwargs, + ), + ) + except Exception as e: + logger.error('Failed to send provider notification', exception=str(e)) + raise + else: + logger.info('Provider not registered in system, skipping provider notification') + + +def _send_primary_state_notification( + notification_method: ProviderNotificationMethod, + notification_type: str, + *, + provider_record: ProviderData, + jurisdiction: str, + compact: str, + **notification_kwargs, +) -> None: + """ + Send notification to the primary affected state. + + :param notification_method: The email service method to call + :param notification_type: Type of notification for logging + :param provider_record: The provider record + :param jurisdiction: The jurisdiction to notify + :param compact: The compact identifier + :param notification_kwargs: Additional arguments for the notification method + """ + logger.info(f'Sending {notification_type} notification to affected state', affected_jurisdiction=jurisdiction) + try: + notification_method( + compact=compact, + jurisdiction=jurisdiction, + template_variables=InvestigationNotificationTemplateVariables( + provider_first_name=provider_record.givenName, + provider_last_name=provider_record.familyName, + **notification_kwargs, + ), + ) + except Exception as e: + logger.error('Failed to send state notification', jurisdiction=jurisdiction, exception=str(e)) + raise + + +def _send_additional_state_notifications( + notification_method: ProviderNotificationMethod, + notification_type: str, + *, + provider_records: ProviderUserRecords, + provider_record: ProviderData, + provider_id: UUID, + excluded_jurisdiction: str, + compact: str, + **notification_kwargs, +) -> None: + """ + Send notifications to all other states where the provider has licenses or privileges. + + :param provider_records: The provider records collection + :param notification_method: The email service method to call + :param notification_type: Type of notification for logging + :param provider_record: The provider record + :param provider_id: The provider ID + :param excluded_jurisdiction: Jurisdiction to exclude from notifications + :param compact: The compact identifier + :param notification_kwargs: Additional arguments for the notification method + """ + # Query provider's records to find all states where they hold or have held licenses or privileges + all_licenses = provider_records.get_license_records() + all_privileges = provider_records.get_privilege_records() + + # Get unique jurisdictions (excluding the one already notified) + notification_jurisdictions = set() + for license_record in all_licenses: + if license_record.jurisdiction != excluded_jurisdiction: + notification_jurisdictions.add(license_record.jurisdiction) + for privilege_record in all_privileges: + if privilege_record.jurisdiction != excluded_jurisdiction: + notification_jurisdictions.add(privilege_record.jurisdiction) + + # Send notifications to all other states with provider licenses or privileges + template_variables = InvestigationNotificationTemplateVariables( + provider_first_name=provider_record.givenName, + provider_last_name=provider_record.familyName, + provider_id=provider_id, + **notification_kwargs, + ) + for notification_jurisdiction in notification_jurisdictions: + logger.info( + f'Sending {notification_type} notification to other state', + notification_jurisdiction=notification_jurisdiction, + ) + try: + notification_method( + compact=compact, + jurisdiction=notification_jurisdiction, + template_variables=template_variables, + ) + except Exception as e: + logger.error( + 'Failed to send notification to other state', + notification_jurisdiction=notification_jurisdiction, + exception=str(e), + ) + raise + + +@sqs_handler +def license_investigation_notification_listener(message: dict): + """ + Handle license investigation events by sending notifications. + + This handler processes 'license.investigation' events and sends notifications + to the affected provider and relevant states. + """ + detail_schema = InvestigationEventDetailSchema() + detail = detail_schema.load(message['detail']) + + compact = detail['compact'] + provider_id = detail['providerId'] + jurisdiction = detail['jurisdiction'] + license_type_abbreviation = detail['licenseTypeAbbreviation'] + event_time = detail['eventTime'] + + with logger.append_context_keys( + compact=compact, + provider_id=provider_id, + jurisdiction=jurisdiction, + license_type_abbreviation=license_type_abbreviation, + event_time=event_time, + ): + logger.info('Processing license investigation event') + + # Get license type name from abbreviation (lookup once at the top) + license_type_name = _get_license_type_name(compact, license_type_abbreviation) + + # Get provider records to gather notification targets and provider information + provider_records, provider_record = _get_provider_records(compact, provider_id) + + # Provider Notification + _send_provider_notification( + config.email_service_client.send_license_investigation_provider_notification_email, + 'license investigation', + provider_record=provider_record, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + # State Notifications + # Send notification to the state where the license is under investigation + _send_primary_state_notification( + config.email_service_client.send_license_investigation_state_notification_email, + 'license investigation', + provider_record=provider_record, + provider_id=provider_id, + jurisdiction=jurisdiction, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + # Send notifications to all other states with provider licenses or privileges + _send_additional_state_notifications( + config.email_service_client.send_license_investigation_state_notification_email, + 'license investigation', + provider_records=provider_records, + provider_record=provider_record, + provider_id=provider_id, + excluded_jurisdiction=jurisdiction, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + logger.info('Successfully processed license investigation event') + + +@sqs_handler +def license_investigation_closed_notification_listener(message: dict): + """ + Handle license investigation closed events by sending notifications. + + This handler processes 'license.investigationClosed' events and sends notifications + to the affected provider and relevant states. + """ + detail_schema = InvestigationEventDetailSchema() + detail = detail_schema.load(message['detail']) + + compact = detail['compact'] + provider_id = detail['providerId'] + jurisdiction = detail['jurisdiction'] + license_type_abbreviation = detail['licenseTypeAbbreviation'] + event_time = detail['eventTime'] + + with logger.append_context_keys( + compact=compact, + provider_id=provider_id, + jurisdiction=jurisdiction, + license_type_abbreviation=license_type_abbreviation, + event_time=event_time, + ): + logger.info('Processing license investigation closed event') + + # Get license type name from abbreviation (lookup once at the top) + license_type_name = _get_license_type_name(compact, license_type_abbreviation) + + # Get provider records to gather notification targets and provider information + provider_records, provider_record = _get_provider_records(compact, provider_id) + + # Provider Notification + _send_provider_notification( + config.email_service_client.send_license_investigation_closed_provider_notification_email, + 'license investigation closed', + provider_record=provider_record, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + # State Notifications + # Send notification to the state where the license investigation was closed + _send_primary_state_notification( + config.email_service_client.send_license_investigation_closed_state_notification_email, + 'license investigation closed', + provider_record=provider_record, + provider_id=provider_id, + jurisdiction=jurisdiction, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + # Send notifications to all other states with provider licenses or privileges + _send_additional_state_notifications( + config.email_service_client.send_license_investigation_closed_state_notification_email, + 'license investigation closed', + provider_records=provider_records, + provider_record=provider_record, + provider_id=provider_id, + excluded_jurisdiction=jurisdiction, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + logger.info('Successfully processed license investigation closed event') + + +@sqs_handler +def privilege_investigation_notification_listener(message: dict): + """ + Handle privilege investigation events by sending notifications. + + This handler processes 'privilege.investigation' events and sends notifications + to the affected provider and relevant states. + """ + detail_schema = InvestigationEventDetailSchema() + detail = detail_schema.load(message['detail']) + + compact = detail['compact'] + provider_id = detail['providerId'] + jurisdiction = detail['jurisdiction'] + license_type_abbreviation = detail['licenseTypeAbbreviation'] + event_time = detail['eventTime'] + + with logger.append_context_keys( + compact=compact, + provider_id=provider_id, + jurisdiction=jurisdiction, + license_type_abbreviation=license_type_abbreviation, + event_time=event_time, + ): + logger.info('Processing privilege investigation event') + + # Get license type name from abbreviation (lookup once at the top) + license_type_name = _get_license_type_name(compact, license_type_abbreviation) + + # Get provider records to gather notification targets and provider information + provider_records, provider_record = _get_provider_records(compact, provider_id) + + # Provider Notification + _send_provider_notification( + config.email_service_client.send_privilege_investigation_provider_notification_email, + 'privilege investigation', + provider_record=provider_record, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + # State Notifications + # Send notification to the state where the privilege is under investigation + _send_primary_state_notification( + config.email_service_client.send_privilege_investigation_state_notification_email, + 'privilege investigation', + provider_record=provider_record, + provider_id=provider_id, + jurisdiction=jurisdiction, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + # Send notifications to all other states with provider licenses or privileges + _send_additional_state_notifications( + config.email_service_client.send_privilege_investigation_state_notification_email, + 'privilege investigation', + provider_records=provider_records, + provider_record=provider_record, + provider_id=provider_id, + excluded_jurisdiction=jurisdiction, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + logger.info('Successfully processed privilege investigation event') + + +@sqs_handler +def privilege_investigation_closed_notification_listener(message: dict): + """ + Handle privilege investigation closed events by sending notifications. + + This handler processes 'privilege.investigationClosed' events and sends notifications + to the affected provider and relevant states. + """ + detail_schema = InvestigationEventDetailSchema() + detail = detail_schema.load(message['detail']) + + compact = detail['compact'] + provider_id = detail['providerId'] + jurisdiction = detail['jurisdiction'] + license_type_abbreviation = detail['licenseTypeAbbreviation'] + event_time = detail['eventTime'] + + with logger.append_context_keys( + compact=compact, + provider_id=provider_id, + jurisdiction=jurisdiction, + license_type_abbreviation=license_type_abbreviation, + event_time=event_time, + ): + logger.info('Processing privilege investigation closed event') + + # Get license type name from abbreviation (lookup once at the top) + license_type_name = _get_license_type_name(compact, license_type_abbreviation) + + # Get provider records to gather notification targets and provider information + provider_records, provider_record = _get_provider_records(compact, provider_id) + + # Provider Notification + _send_provider_notification( + config.email_service_client.send_privilege_investigation_closed_provider_notification_email, + 'privilege investigation closed', + provider_record=provider_record, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + # State Notifications + # Send notification to the state where the privilege investigation was closed + _send_primary_state_notification( + config.email_service_client.send_privilege_investigation_closed_state_notification_email, + 'privilege investigation closed', + provider_record=provider_record, + provider_id=provider_id, + jurisdiction=jurisdiction, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + # Send notifications to all other states with provider licenses or privileges + _send_additional_state_notifications( + config.email_service_client.send_privilege_investigation_closed_state_notification_email, + 'privilege investigation closed', + provider_records=provider_records, + provider_record=provider_record, + provider_id=provider_id, + excluded_jurisdiction=jurisdiction, + compact=compact, + investigation_jurisdiction=jurisdiction, + license_type=license_type_name, + ) + + logger.info('Successfully processed privilege investigation closed event') diff --git a/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py b/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py new file mode 100644 index 000000000..de44d7234 --- /dev/null +++ b/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py @@ -0,0 +1,645 @@ +import json +from datetime import datetime +from unittest.mock import patch +from uuid import UUID + +from common_test.test_constants import ( + DEFAULT_COMPACT, + DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + DEFAULT_LICENSE_JURISDICTION, + DEFAULT_LICENSE_TYPE_ABBREVIATION, + DEFAULT_PRIVILEGE_JURISDICTION, + DEFAULT_PROVIDER_ID, +) +from moto import mock_aws + +from . import TstFunction + + +@mock_aws +@patch('cc_common.config._Config.current_standard_datetime', datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP)) +class TestInvestigationEvents(TstFunction): + """Test suite for investigation event handlers.""" + + def _generate_license_investigation_message(self, message_overrides=None): + """Generate a test SQS message for license investigation events.""" + message = { + 'detail': { + 'compact': DEFAULT_COMPACT, + 'providerId': DEFAULT_PROVIDER_ID, + 'jurisdiction': DEFAULT_LICENSE_JURISDICTION, + 'licenseTypeAbbreviation': DEFAULT_LICENSE_TYPE_ABBREVIATION, + 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationAgainst': 'license', + 'createDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + } + } + if message_overrides: + message['detail'].update(message_overrides) + return message + + def _generate_license_investigation_closed_message(self, message_overrides=None): + """Generate a test SQS message for license investigation closed events.""" + message = { + 'detail': { + 'compact': DEFAULT_COMPACT, + 'providerId': DEFAULT_PROVIDER_ID, + 'jurisdiction': DEFAULT_LICENSE_JURISDICTION, + 'licenseTypeAbbreviation': DEFAULT_LICENSE_TYPE_ABBREVIATION, + 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationAgainst': 'license', + 'effectiveDate': '2024-01-15', + } + } + if message_overrides: + message['detail'].update(message_overrides) + return message + + def _generate_privilege_investigation_message(self, message_overrides=None): + """Generate a test SQS message for privilege investigation events.""" + message = { + 'detail': { + 'compact': DEFAULT_COMPACT, + 'providerId': DEFAULT_PROVIDER_ID, + 'jurisdiction': DEFAULT_PRIVILEGE_JURISDICTION, + 'licenseTypeAbbreviation': DEFAULT_LICENSE_TYPE_ABBREVIATION, + 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationAgainst': 'privilege', + 'createDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + } + } + if message_overrides: + message['detail'].update(message_overrides) + return message + + def _generate_privilege_investigation_closed_message(self, message_overrides=None): + """Generate a test SQS message for privilege investigation closed events.""" + message = { + 'detail': { + 'compact': DEFAULT_COMPACT, + 'providerId': DEFAULT_PROVIDER_ID, + 'jurisdiction': DEFAULT_PRIVILEGE_JURISDICTION, + 'licenseTypeAbbreviation': DEFAULT_LICENSE_TYPE_ABBREVIATION, + 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationAgainst': 'privilege', + 'effectiveDate': '2024-01-15', + } + } + if message_overrides: + message['detail'].update(message_overrides) + return message + + def _create_sqs_event(self, message): + """Create a proper SQS event structure with the message in the body.""" + return {'Records': [{'messageId': '123', 'body': json.dumps(message)}]} + + @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_state_notification_email') + @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_provider_notification_email') + def test_license_investigation_listener_processes_event_with_registered_provider( + self, mock_provider_email, mock_state_email + ): + """Test that license investigation listener processes events for registered providers.""" + from cc_common.email_service_client import InvestigationNotificationTemplateVariables + from handlers.investigation_events import license_investigation_notification_listener + + # Set up test data with registered provider + self.test_data_generator.put_default_provider_record_in_provider_table( + value_overrides={'compactConnectRegisteredEmailAddress': 'provider@example.com'} + ) + + # Add the license that is under investigation + self.test_data_generator.put_default_license_record_in_provider_table() + + # Create additional licenses and privileges for notification testing + self.test_data_generator.put_default_license_record_in_provider_table( + value_overrides={ + 'jurisdiction': 'co', + 'jurisdictionUploadedLicenseStatus': 'active', + } + ) + self.test_data_generator.put_default_privilege_record_in_provider_table( + value_overrides={ + 'jurisdiction': 'ky', + 'administratorSetStatus': 'active', + } + ) + + message = self._generate_license_investigation_message() + event = self._create_sqs_event(message) + + # Execute the handler + result = license_investigation_notification_listener(event, self.mock_context) + + # Should succeed with no batch failures + self.assertEqual({'batchItemFailures': []}, result) + + # Verify provider notification + mock_provider_email.assert_called_once_with( + compact=DEFAULT_COMPACT, + provider_email='provider@example.com', + template_variables=InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=None, + ), + ) + + # Verify state notifications (investigation state + other states with active licenses/privileges) + expected_template_variables_oh = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_template_variables_co = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_template_variables_ky = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_state_calls = [ + # State 'oh' (investigation jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': DEFAULT_LICENSE_JURISDICTION, + 'template_variables': expected_template_variables_oh, + }, + # State 'co' (active license jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': 'co', + 'template_variables': expected_template_variables_co, + }, + # State 'ky' (active privilege jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': 'ky', + 'template_variables': expected_template_variables_ky, + }, + ] + + # Verify all state notifications were sent + self.assertEqual(3, mock_state_email.call_count) + actual_state_calls = [call.kwargs for call in mock_state_email.call_args_list] + + # Sort both lists for comparison + expected_state_calls_sorted = sorted(expected_state_calls, key=lambda x: x['jurisdiction']) + actual_state_calls_sorted = sorted(actual_state_calls, key=lambda x: x['jurisdiction']) + + self.assertEqual(expected_state_calls_sorted, actual_state_calls_sorted) + + @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_state_notification_email') + @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_provider_notification_email') + def test_license_investigation_listener_processes_event_with_unregistered_provider( + self, mock_provider_email, mock_state_email + ): + """ + Test that license investigation listener handles unregistered providers. + + Note: An unregistered provider holding a license should not be possible in our system. + This test is just stressing the limits of our investigation logic, to make sure it handles it gracefully. + """ + from cc_common.email_service_client import InvestigationNotificationTemplateVariables + from handlers.investigation_events import license_investigation_notification_listener + + # Set up test data with unregistered provider (no email) + self.test_data_generator.put_default_provider_record_in_provider_table(is_registered=False) + + # Add the license that is under investigation + self.test_data_generator.put_default_license_record_in_provider_table() + + message = self._generate_license_investigation_message() + event = self._create_sqs_event(message) + + # Execute the handler + result = license_investigation_notification_listener(event, self.mock_context) + + # Should succeed with no batch failures + self.assertEqual({'batchItemFailures': []}, result) + + # Verify no provider notification was sent + mock_provider_email.assert_not_called() + + # Verify state notification was still sent + mock_state_email.assert_called_once_with( + compact=DEFAULT_COMPACT, + jurisdiction=DEFAULT_LICENSE_JURISDICTION, + template_variables=InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ), + ) + + @patch( + 'cc_common.email_service_client.EmailServiceClient.send_license_investigation_closed_state_notification_email' + ) + @patch( + 'cc_common.email_service_client.EmailServiceClient.send_license_investigation_closed_provider_notification_email' + ) + def test_license_investigation_closed_listener_processes_event_with_registered_provider( + self, mock_provider_email, mock_state_email + ): + """Test that license investigation closed listener processes events for registered providers.""" + from cc_common.email_service_client import InvestigationNotificationTemplateVariables + from handlers.investigation_events import license_investigation_closed_notification_listener + + # Set up test data with registered provider + self.test_data_generator.put_default_provider_record_in_provider_table( + value_overrides={'compactConnectRegisteredEmailAddress': 'provider@example.com'} + ) + + # Add the license that was under investigation + self.test_data_generator.put_default_license_record_in_provider_table() + + # Create additional licenses and privileges for notification testing + self.test_data_generator.put_default_license_record_in_provider_table( + value_overrides={ + 'jurisdiction': 'co', + 'jurisdictionUploadedLicenseStatus': 'active', + } + ) + self.test_data_generator.put_default_privilege_record_in_provider_table( + value_overrides={ + 'jurisdiction': 'ky', + 'administratorSetStatus': 'active', + } + ) + + message = self._generate_license_investigation_closed_message() + event = self._create_sqs_event(message) + + # Execute the handler + result = license_investigation_closed_notification_listener(event, self.mock_context) + + # Should succeed with no batch failures + self.assertEqual({'batchItemFailures': []}, result) + + # Verify provider notification + mock_provider_email.assert_called_once_with( + compact=DEFAULT_COMPACT, + provider_email='provider@example.com', + template_variables=InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=None, + ), + ) + + # Verify state notifications (investigation state + other states with active licenses/privileges) + expected_template_variables_oh = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_template_variables_co = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_template_variables_ky = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_state_calls = [ + # State 'oh' (investigation jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': DEFAULT_LICENSE_JURISDICTION, + 'template_variables': expected_template_variables_oh, + }, + # State 'co' (active license jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': 'co', + 'template_variables': expected_template_variables_co, + }, + # State 'ky' (active privilege jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': 'ky', + 'template_variables': expected_template_variables_ky, + }, + ] + + # Verify all state notifications were sent + self.assertEqual(3, mock_state_email.call_count) + actual_state_calls = [call.kwargs for call in mock_state_email.call_args_list] + + # Sort both lists for comparison + expected_state_calls_sorted = sorted(expected_state_calls, key=lambda x: x['jurisdiction']) + actual_state_calls_sorted = sorted(actual_state_calls, key=lambda x: x['jurisdiction']) + + self.assertEqual(expected_state_calls_sorted, actual_state_calls_sorted) + + @patch('cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_state_notification_email') + @patch('cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_provider_notification_email') + def test_privilege_investigation_listener_processes_event_with_registered_provider( + self, mock_provider_email, mock_state_email + ): + """Test that privilege investigation listener processes events for registered providers.""" + from cc_common.email_service_client import InvestigationNotificationTemplateVariables + from handlers.investigation_events import privilege_investigation_notification_listener + + # Set up test data with registered provider + self.test_data_generator.put_default_provider_record_in_provider_table( + value_overrides={'compactConnectRegisteredEmailAddress': 'provider@example.com'} + ) + + # Add the privilege that is under investigation + self.test_data_generator.put_default_privilege_record_in_provider_table() + + # Create additional licenses and privileges for notification testing + self.test_data_generator.put_default_license_record_in_provider_table( + value_overrides={ + 'jurisdiction': 'co', + 'jurisdictionUploadedLicenseStatus': 'active', + } + ) + self.test_data_generator.put_default_privilege_record_in_provider_table( + value_overrides={ + 'jurisdiction': 'ky', + 'administratorSetStatus': 'active', + } + ) + + message = self._generate_privilege_investigation_message() + event = self._create_sqs_event(message) + + # Execute the handler + result = privilege_investigation_notification_listener(event, self.mock_context) + + # Should succeed with no batch failures + self.assertEqual({'batchItemFailures': []}, result) + + # Verify provider notification + mock_provider_email.assert_called_once_with( + compact=DEFAULT_COMPACT, + provider_email='provider@example.com', + template_variables=InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_PRIVILEGE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=None, + ), + ) + + # Verify state notifications (investigation state + other states with active licenses/privileges) + expected_template_variables_ne = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_PRIVILEGE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_template_variables_co = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_PRIVILEGE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_template_variables_ky = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_PRIVILEGE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_state_calls = [ + # State 'ne' (investigation jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': DEFAULT_PRIVILEGE_JURISDICTION, + 'template_variables': expected_template_variables_ne, + }, + # State 'co' (active license jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': 'co', + 'template_variables': expected_template_variables_co, + }, + # State 'ky' (active privilege jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': 'ky', + 'template_variables': expected_template_variables_ky, + }, + ] + + # Verify all state notifications were sent + self.assertEqual(3, mock_state_email.call_count) + actual_state_calls = [call.kwargs for call in mock_state_email.call_args_list] + + # Sort both lists for comparison + expected_state_calls_sorted = sorted(expected_state_calls, key=lambda x: x['jurisdiction']) + actual_state_calls_sorted = sorted(actual_state_calls, key=lambda x: x['jurisdiction']) + + self.assertEqual(expected_state_calls_sorted, actual_state_calls_sorted) + + @patch( + 'cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_closed_state_notification_email' + ) + @patch( + 'cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_closed_provider_notification_email' + ) + def test_privilege_investigation_closed_listener_processes_event_with_registered_provider( + self, mock_provider_email, mock_state_email + ): + """Test that privilege investigation closed listener processes events for registered providers.""" + from cc_common.email_service_client import InvestigationNotificationTemplateVariables + from handlers.investigation_events import privilege_investigation_closed_notification_listener + + # Set up test data with registered provider + self.test_data_generator.put_default_provider_record_in_provider_table( + value_overrides={'compactConnectRegisteredEmailAddress': 'provider@example.com'} + ) + + # Add the privilege that was under investigation + self.test_data_generator.put_default_privilege_record_in_provider_table() + + # Create additional licenses and privileges for notification testing + self.test_data_generator.put_default_license_record_in_provider_table( + value_overrides={ + 'jurisdiction': 'co', + 'jurisdictionUploadedLicenseStatus': 'active', + } + ) + self.test_data_generator.put_default_privilege_record_in_provider_table( + value_overrides={ + 'jurisdiction': 'ky', + 'administratorSetStatus': 'active', + } + ) + + message = self._generate_privilege_investigation_closed_message() + event = self._create_sqs_event(message) + + # Execute the handler + result = privilege_investigation_closed_notification_listener(event, self.mock_context) + + # Should succeed with no batch failures + self.assertEqual({'batchItemFailures': []}, result) + + # Verify provider notification + mock_provider_email.assert_called_once_with( + compact=DEFAULT_COMPACT, + provider_email='provider@example.com', + template_variables=InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_PRIVILEGE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=None, + ), + ) + + # Verify state notifications (investigation state + other states with active licenses/privileges) + expected_template_variables_ne = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_PRIVILEGE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_template_variables_co = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_PRIVILEGE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_template_variables_ky = InvestigationNotificationTemplateVariables( + provider_first_name='Björk', + provider_last_name='Guðmundsdóttir', + investigation_jurisdiction=DEFAULT_PRIVILEGE_JURISDICTION, + license_type='speech-language pathologist', + provider_id=UUID(DEFAULT_PROVIDER_ID), + ) + expected_state_calls = [ + # State 'ne' (investigation jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': DEFAULT_PRIVILEGE_JURISDICTION, + 'template_variables': expected_template_variables_ne, + }, + # State 'co' (active license jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': 'co', + 'template_variables': expected_template_variables_co, + }, + # State 'ky' (active privilege jurisdiction) + { + 'compact': DEFAULT_COMPACT, + 'jurisdiction': 'ky', + 'template_variables': expected_template_variables_ky, + }, + ] + + # Verify all state notifications were sent + self.assertEqual(3, mock_state_email.call_count) + actual_state_calls = [call.kwargs for call in mock_state_email.call_args_list] + + # Sort both lists for comparison + expected_state_calls_sorted = sorted(expected_state_calls, key=lambda x: x['jurisdiction']) + actual_state_calls_sorted = sorted(actual_state_calls, key=lambda x: x['jurisdiction']) + + self.assertEqual(expected_state_calls_sorted, actual_state_calls_sorted) + + def test_license_investigation_listener_handles_missing_provider_records(self): + """Test that license investigation listener handles missing provider records gracefully.""" + from handlers.investigation_events import license_investigation_notification_listener + + # Don't set up any test data - provider records will be missing + message = self._generate_license_investigation_message() + event = self._create_sqs_event(message) + + # SQS handler wrapper catches exceptions and returns batch item failures + result = license_investigation_notification_listener(event, self.mock_context) + + # Should return batch item failure for the message + self.assertEqual(result['batchItemFailures'][0]['itemIdentifier'], '123') + + def test_privilege_investigation_listener_handles_missing_provider_records(self): + """Test that privilege investigation listener handles missing provider records gracefully.""" + from handlers.investigation_events import privilege_investigation_notification_listener + + # Don't set up any test data - provider records will be missing + message = self._generate_privilege_investigation_message() + event = self._create_sqs_event(message) + + # SQS handler wrapper catches exceptions and returns batch item failures + result = privilege_investigation_notification_listener(event, self.mock_context) + + # Should return batch item failure for the message + self.assertEqual(result['batchItemFailures'][0]['itemIdentifier'], '123') + + @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_provider_notification_email') + def test_license_investigation_listener_handles_email_service_failure(self, mock_provider_email): + """Test that license investigation listener handles email service failures gracefully.""" + from handlers.investigation_events import license_investigation_notification_listener + + # Set up test data + self.test_data_generator.put_default_provider_record_in_provider_table( + value_overrides={'compactConnectRegisteredEmailAddress': 'provider@example.com'} + ) + self.test_data_generator.put_default_license_record_in_provider_table() + + # Make the email service raise an exception + mock_provider_email.side_effect = Exception('Email service failure') + + message = self._generate_license_investigation_message() + event = self._create_sqs_event(message) + + # SQS handler wrapper catches exceptions and returns batch item failures + result = license_investigation_notification_listener(event, self.mock_context) + + # Should return batch item failure for the message + self.assertEqual(result['batchItemFailures'][0]['itemIdentifier'], '123') + + @patch('cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_provider_notification_email') + def test_privilege_investigation_listener_handles_email_service_failure(self, mock_provider_email): + """Test that privilege investigation listener handles email service failures gracefully.""" + from handlers.investigation_events import privilege_investigation_notification_listener + + # Set up test data + self.test_data_generator.put_default_provider_record_in_provider_table( + value_overrides={'compactConnectRegisteredEmailAddress': 'provider@example.com'} + ) + self.test_data_generator.put_default_privilege_record_in_provider_table() + + # Make the email service raise an exception + mock_provider_email.side_effect = Exception('Email service failure') + + message = self._generate_privilege_investigation_message() + event = self._create_sqs_event(message) + + # SQS handler wrapper catches exceptions and returns batch item failures + result = privilege_investigation_notification_listener(event, self.mock_context) + + # Should return batch item failure for the message + self.assertEqual(result['batchItemFailures'][0]['itemIdentifier'], '123') diff --git a/backend/compact-connect/stacks/notification_stack.py b/backend/compact-connect/stacks/notification_stack.py index 5bfffff23..d7dd3bee0 100644 --- a/backend/compact-connect/stacks/notification_stack.py +++ b/backend/compact-connect/stacks/notification_stack.py @@ -44,6 +44,10 @@ def __init__( self._add_license_encumbrance_lifting_notification_listener(persistent_stack, data_event_bus) self._add_privilege_encumbrance_notification_listener(persistent_stack, data_event_bus) self._add_privilege_encumbrance_lifting_notification_listener(persistent_stack, data_event_bus) + self._add_license_investigation_notification_listener(persistent_stack, data_event_bus) + self._add_license_investigation_closed_notification_listener(persistent_stack, data_event_bus) + self._add_privilege_investigation_notification_listener(persistent_stack, data_event_bus) + self._add_privilege_investigation_closed_notification_listener(persistent_stack, data_event_bus) def _add_privilege_purchase_notification_chain( self, persistent_stack: ps.PersistentStack, data_event_bus: IEventBus @@ -257,3 +261,55 @@ def _add_privilege_encumbrance_lifting_notification_listener( persistent_stack=persistent_stack, data_event_bus=data_event_bus, ) + + def _add_license_investigation_notification_listener( + self, persistent_stack: ps.PersistentStack, data_event_bus: EventBus + ): + """Add the license investigation notification listener lambda, queues, and event rules.""" + self._add_emailer_event_listener( + construct_id_prefix='LicenseInvestigationNotificationListener', + index='investigation_events.py', + handler='license_investigation_notification_listener', + listener_detail_type='license.investigation', + persistent_stack=persistent_stack, + data_event_bus=data_event_bus, + ) + + def _add_license_investigation_closed_notification_listener( + self, persistent_stack: ps.PersistentStack, data_event_bus: EventBus + ): + """Add the license investigation closed notification listener lambda, queues, and event rules.""" + self._add_emailer_event_listener( + construct_id_prefix='LicenseInvestigationClosedNotificationListener', + index='investigation_events.py', + handler='license_investigation_closed_notification_listener', + listener_detail_type='license.investigationClosed', + persistent_stack=persistent_stack, + data_event_bus=data_event_bus, + ) + + def _add_privilege_investigation_notification_listener( + self, persistent_stack: ps.PersistentStack, data_event_bus: EventBus + ): + """Add the privilege investigation notification listener lambda, queues, and event rules.""" + self._add_emailer_event_listener( + construct_id_prefix='PrivilegeInvestigationNotificationListener', + index='investigation_events.py', + handler='privilege_investigation_notification_listener', + listener_detail_type='privilege.investigation', + persistent_stack=persistent_stack, + data_event_bus=data_event_bus, + ) + + def _add_privilege_investigation_closed_notification_listener( + self, persistent_stack: ps.PersistentStack, data_event_bus: EventBus + ): + """Add the privilege investigation closed notification listener lambda, queues, and event rules.""" + self._add_emailer_event_listener( + construct_id_prefix='PrivilegeInvestigationClosedNotificationListener', + index='investigation_events.py', + handler='privilege_investigation_closed_notification_listener', + listener_detail_type='privilege.investigationClosed', + persistent_stack=persistent_stack, + data_event_bus=data_event_bus, + ) diff --git a/backend/compact-connect/tests/app/test_notification_stack.py b/backend/compact-connect/tests/app/test_notification_stack.py index 3c8038f26..71785982d 100644 --- a/backend/compact-connect/tests/app/test_notification_stack.py +++ b/backend/compact-connect/tests/app/test_notification_stack.py @@ -564,3 +564,330 @@ def test_privilege_encumbrance_lifting_notification_listener_resources_created(s }, event_source_mapping, ) + + def test_license_investigation_notification_resources_created(self): + """ + Test that the license investigation notification listener lambda is added with a SQS queue + and an event bridge event rule that listens for 'license.investigation' detail types. + """ + notification_stack = self.app.sandbox_backend_stage.notification_stack + notification_template = Template.from_stack(notification_stack) + + # Verify the lambda function is created + license_investigation_handler_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'LicenseInvestigationNotificationListener' + ].queue_processor.process_function.node.default_child + ) + license_investigation_handler = TestNotificationStack.get_resource_properties_by_logical_id( + license_investigation_handler_logical_id, + resources=notification_template.find_resources(CfnFunction.CFN_RESOURCE_TYPE_NAME), + ) + + self.assertEqual( + 'handlers.investigation_events.license_investigation_notification_listener', + license_investigation_handler['Handler'], + ) + + # Verify SQS queue is created for the license investigation notification listener + investigation_listener_queue_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'LicenseInvestigationNotificationListener' + ].queue_processor.queue.node.default_child + ) + license_investigation_listener_queue = TestNotificationStack.get_resource_properties_by_logical_id( + investigation_listener_queue_logical_id, + resources=notification_template.find_resources(CfnQueue.CFN_RESOURCE_TYPE_NAME), + ) + + dlq_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'LicenseInvestigationNotificationListener' + ].queue_processor.dlq.node.default_child + ) + + # remove dynamic field + del license_investigation_listener_queue['KmsMasterKeyId'] + + self.assertEqual( + { + 'MessageRetentionPeriod': 43200, + 'RedrivePolicy': {'deadLetterTargetArn': {'Fn::GetAtt': [dlq_logical_id, 'Arn']}, 'maxReceiveCount': 3}, + 'VisibilityTimeout': 300, + }, + license_investigation_listener_queue, + ) + + # Verify EventBridge rule is created with correct detail type + license_investigation_rule = TestNotificationStack.get_resource_properties_by_logical_id( + notification_stack.get_logical_id( + notification_stack.event_processors[ + 'LicenseInvestigationNotificationListener' + ].event_rule.node.default_child + ), + resources=notification_template.find_resources(CfnRule.CFN_RESOURCE_TYPE_NAME), + ) + + self.assertEqual( + { + 'EventBusName': { + 'Fn::Select': [ + 1, + { + 'Fn::Split': [ + '/', + {'Fn::Select': [5, {'Fn::Split': [':', {'Ref': 'DataEventBusArnParameterParameter'}]}]}, + ] + }, + ] + }, + 'EventPattern': {'detail-type': ['license.investigation']}, + 'State': 'ENABLED', + 'Targets': [ + { + 'Arn': {'Fn::GetAtt': [investigation_listener_queue_logical_id, 'Arn']}, + 'DeadLetterConfig': {'Arn': {'Fn::GetAtt': [dlq_logical_id, 'Arn']}}, + 'Id': 'Target0', + } + ], + }, + license_investigation_rule, + ) + + # Verify event source mapping is created + event_source_mapping = TestNotificationStack.get_resource_properties_by_logical_id( + notification_stack.get_logical_id( + notification_stack.event_processors[ + 'LicenseInvestigationNotificationListener' + ].queue_processor.event_source_mapping.node.default_child + ), + resources=notification_template.find_resources(CfnEventSourceMapping.CFN_RESOURCE_TYPE_NAME), + ) + self.assertEqual( + { + 'BatchSize': 10, + 'EventSourceArn': {'Fn::GetAtt': [investigation_listener_queue_logical_id, 'Arn']}, + 'FunctionName': {'Ref': license_investigation_handler_logical_id}, + 'FunctionResponseTypes': ['ReportBatchItemFailures'], + 'MaximumBatchingWindowInSeconds': 15, + }, + event_source_mapping, + ) + + def test_license_investigation_closed_notification_resources_created(self): + """ + Test that the license investigation closed notification listener lambda is added with a SQS queue + and an event bridge event rule that listens for 'license.investigationClosed' detail types. + """ + notification_stack = self.app.sandbox_backend_stage.notification_stack + notification_template = Template.from_stack(notification_stack) + + # Verify the lambda function is created + license_investigation_closed_handler_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'LicenseInvestigationClosedNotificationListener' + ].queue_processor.process_function.node.default_child + ) + license_investigation_closed_handler = TestNotificationStack.get_resource_properties_by_logical_id( + license_investigation_closed_handler_logical_id, + resources=notification_template.find_resources(CfnFunction.CFN_RESOURCE_TYPE_NAME), + ) + + self.assertEqual( + 'handlers.investigation_events.license_investigation_closed_notification_listener', + license_investigation_closed_handler['Handler'], + ) + + # Verify EventBridge rule is created with correct detail type + license_investigation_closed_rule = TestNotificationStack.get_resource_properties_by_logical_id( + notification_stack.get_logical_id( + notification_stack.event_processors[ + 'LicenseInvestigationClosedNotificationListener' + ].event_rule.node.default_child + ), + resources=notification_template.find_resources(CfnRule.CFN_RESOURCE_TYPE_NAME), + ) + + # Get the queue and DLQ logical IDs for the targets + investigation_closed_listener_queue_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'LicenseInvestigationClosedNotificationListener' + ].queue_processor.queue.node.default_child + ) + investigation_closed_dlq_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'LicenseInvestigationClosedNotificationListener' + ].queue_processor.dlq.node.default_child + ) + + self.assertEqual( + { + 'EventBusName': { + 'Fn::Select': [ + 1, + { + 'Fn::Split': [ + '/', + {'Fn::Select': [5, {'Fn::Split': [':', {'Ref': 'DataEventBusArnParameterParameter'}]}]}, + ] + }, + ] + }, + 'EventPattern': {'detail-type': ['license.investigationClosed']}, + 'State': 'ENABLED', + 'Targets': [ + { + 'Arn': {'Fn::GetAtt': [investigation_closed_listener_queue_logical_id, 'Arn']}, + 'DeadLetterConfig': {'Arn': {'Fn::GetAtt': [investigation_closed_dlq_logical_id, 'Arn']}}, + 'Id': 'Target0', + } + ], + }, + license_investigation_closed_rule, + ) + + def test_privilege_investigation_notification_resources_created(self): + """ + Test that the privilege investigation notification listener lambda is added with a SQS queue + and an event bridge event rule that listens for 'privilege.investigation' detail types. + """ + notification_stack = self.app.sandbox_backend_stage.notification_stack + notification_template = Template.from_stack(notification_stack) + + # Verify the lambda function is created + privilege_investigation_handler_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'PrivilegeInvestigationNotificationListener' + ].queue_processor.process_function.node.default_child + ) + privilege_investigation_handler = TestNotificationStack.get_resource_properties_by_logical_id( + privilege_investigation_handler_logical_id, + resources=notification_template.find_resources(CfnFunction.CFN_RESOURCE_TYPE_NAME), + ) + + self.assertEqual( + 'handlers.investigation_events.privilege_investigation_notification_listener', + privilege_investigation_handler['Handler'], + ) + + # Verify EventBridge rule is created with correct detail type + privilege_investigation_rule = TestNotificationStack.get_resource_properties_by_logical_id( + notification_stack.get_logical_id( + notification_stack.event_processors[ + 'PrivilegeInvestigationNotificationListener' + ].event_rule.node.default_child + ), + resources=notification_template.find_resources(CfnRule.CFN_RESOURCE_TYPE_NAME), + ) + + # Get the queue and DLQ logical IDs for the targets + privilege_investigation_listener_queue_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'PrivilegeInvestigationNotificationListener' + ].queue_processor.queue.node.default_child + ) + privilege_investigation_dlq_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'PrivilegeInvestigationNotificationListener' + ].queue_processor.dlq.node.default_child + ) + + self.assertEqual( + { + 'EventBusName': { + 'Fn::Select': [ + 1, + { + 'Fn::Split': [ + '/', + {'Fn::Select': [5, {'Fn::Split': [':', {'Ref': 'DataEventBusArnParameterParameter'}]}]}, + ] + }, + ] + }, + 'EventPattern': {'detail-type': ['privilege.investigation']}, + 'State': 'ENABLED', + 'Targets': [ + { + 'Arn': {'Fn::GetAtt': [privilege_investigation_listener_queue_logical_id, 'Arn']}, + 'DeadLetterConfig': {'Arn': {'Fn::GetAtt': [privilege_investigation_dlq_logical_id, 'Arn']}}, + 'Id': 'Target0', + } + ], + }, + privilege_investigation_rule, + ) + + def test_privilege_investigation_closed_notification_resources_created(self): + """ + Test that the privilege investigation closed notification listener lambda is added with a SQS queue + and an event bridge event rule that listens for 'privilege.investigationClosed' detail types. + """ + notification_stack = self.app.sandbox_backend_stage.notification_stack + notification_template = Template.from_stack(notification_stack) + + # Verify the lambda function is created + privilege_investigation_closed_handler_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'PrivilegeInvestigationClosedNotificationListener' + ].queue_processor.process_function.node.default_child + ) + privilege_investigation_closed_handler = TestNotificationStack.get_resource_properties_by_logical_id( + privilege_investigation_closed_handler_logical_id, + resources=notification_template.find_resources(CfnFunction.CFN_RESOURCE_TYPE_NAME), + ) + + self.assertEqual( + 'handlers.investigation_events.privilege_investigation_closed_notification_listener', + privilege_investigation_closed_handler['Handler'], + ) + + # Verify EventBridge rule is created with correct detail type + privilege_investigation_closed_rule = TestNotificationStack.get_resource_properties_by_logical_id( + notification_stack.get_logical_id( + notification_stack.event_processors[ + 'PrivilegeInvestigationClosedNotificationListener' + ].event_rule.node.default_child + ), + resources=notification_template.find_resources(CfnRule.CFN_RESOURCE_TYPE_NAME), + ) + + # Get the queue and DLQ logical IDs for the targets + privilege_investigation_closed_listener_queue_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'PrivilegeInvestigationClosedNotificationListener' + ].queue_processor.queue.node.default_child + ) + privilege_investigation_closed_dlq_logical_id = notification_stack.get_logical_id( + notification_stack.event_processors[ + 'PrivilegeInvestigationClosedNotificationListener' + ].queue_processor.dlq.node.default_child + ) + + self.assertEqual( + { + 'EventBusName': { + 'Fn::Select': [ + 1, + { + 'Fn::Split': [ + '/', + {'Fn::Select': [5, {'Fn::Split': [':', {'Ref': 'DataEventBusArnParameterParameter'}]}]}, + ] + }, + ] + }, + 'EventPattern': {'detail-type': ['privilege.investigationClosed']}, + 'State': 'ENABLED', + 'Targets': [ + { + 'Arn': {'Fn::GetAtt': [privilege_investigation_closed_listener_queue_logical_id, 'Arn']}, + 'DeadLetterConfig': { + 'Arn': {'Fn::GetAtt': [privilege_investigation_closed_dlq_logical_id, 'Arn']} + }, + 'Id': 'Target0', + } + ], + }, + privilege_investigation_closed_rule, + ) From 1dd4000a025d491edc04abac9d9f08cef23a3418 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 22 Oct 2025 13:43:09 -0600 Subject: [PATCH 09/33] Upgrade dependencies --- .../cognito-backup/requirements-dev.txt | 22 ++++++++------ .../python/cognito-backup/requirements.txt | 8 ++--- .../python/common/requirements-dev.txt | 30 +++++++++---------- .../lambdas/python/common/requirements.txt | 12 ++++---- .../requirements-dev.txt | 12 ++++---- .../compact-configuration/requirements.txt | 2 +- .../custom-resources/requirements-dev.txt | 12 ++++---- .../python/custom-resources/requirements.txt | 2 +- .../python/data-events/requirements-dev.txt | 12 ++++---- .../python/data-events/requirements.txt | 2 +- .../disaster-recovery/requirements-dev.txt | 12 ++++---- .../python/disaster-recovery/requirements.txt | 2 +- .../provider-data-v1/requirements-dev.txt | 12 ++++---- .../python/provider-data-v1/requirements.txt | 2 +- .../python/purchases/requirements-dev.txt | 30 +++++++++---------- .../lambdas/python/purchases/requirements.txt | 4 +-- .../staff-user-pre-token/requirements-dev.txt | 12 ++++---- .../staff-user-pre-token/requirements.txt | 2 +- .../python/staff-users/requirements-dev.txt | 12 ++++---- .../python/staff-users/requirements.txt | 2 +- backend/compact-connect/requirements-dev.txt | 10 +++---- backend/compact-connect/requirements.txt | 14 ++++----- 22 files changed, 116 insertions(+), 112 deletions(-) diff --git a/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.txt b/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.txt index 21fb88c5e..ccf9009a7 100644 --- a/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/cognito-backup/requirements-dev.txt @@ -2,15 +2,15 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/cognito-backup/requirements-dev.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/cognito-backup/requirements-dev.in # -aws-lambda-powertools==3.21.0 +aws-lambda-powertools==3.22.0 # via -r lambdas/python/cognito-backup/requirements-dev.in -boto3==1.40.51 +boto3==1.40.56 # via # -r lambdas/python/cognito-backup/requirements-dev.in # moto -botocore==1.40.51 +botocore==1.40.56 # via # -r lambdas/python/cognito-backup/requirements-dev.in # boto3 @@ -20,13 +20,15 @@ certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -cryptography==46.0.2 - # via moto +cryptography==46.0.3 + # via + # joserfc + # moto idna==3.11 # via requests -iniconfig==2.1.0 +iniconfig==2.3.0 # via pytest jinja2==3.1.6 # via moto @@ -35,11 +37,13 @@ jmespath==1.0.1 # aws-lambda-powertools # boto3 # botocore +joserfc==1.4.0 + # via moto markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[cognito-idp,s3]==5.1.14 +moto[cognitoidp,s3]==5.1.15 # via -r lambdas/python/cognito-backup/requirements-dev.in packaging==25.0 # via pytest diff --git a/backend/compact-connect/lambdas/python/cognito-backup/requirements.txt b/backend/compact-connect/lambdas/python/cognito-backup/requirements.txt index 9286d9498..a9ee3d599 100644 --- a/backend/compact-connect/lambdas/python/cognito-backup/requirements.txt +++ b/backend/compact-connect/lambdas/python/cognito-backup/requirements.txt @@ -2,13 +2,13 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/cognito-backup/requirements.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/cognito-backup/requirements.in # -aws-lambda-powertools==3.21.0 +aws-lambda-powertools==3.22.0 # via -r lambdas/python/cognito-backup/requirements.in -boto3==1.40.51 +boto3==1.40.56 # via -r lambdas/python/cognito-backup/requirements.in -botocore==1.40.51 +botocore==1.40.56 # via # -r lambdas/python/cognito-backup/requirements.in # boto3 diff --git a/backend/compact-connect/lambdas/python/common/requirements-dev.txt b/backend/compact-connect/lambdas/python/common/requirements-dev.txt index 8385ab378..65f18cb4d 100644 --- a/backend/compact-connect/lambdas/python/common/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/common/requirements-dev.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/common/requirements-dev.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/common/requirements-dev.in # annotated-types==0.7.0 # via pydantic @@ -16,31 +16,31 @@ aws-sam-translator==1.101.0 # via cfn-lint aws-xray-sdk==2.14.0 # via moto -boto3==1.40.51 +boto3==1.40.56 # via # aws-sam-translator # moto -boto3-stubs[full]==1.40.51 +boto3-stubs[full]==1.40.56 # via -r lambdas/python/common/requirements-dev.in -boto3-stubs-full==1.40.50 +boto3-stubs-full==1.40.56 # via boto3-stubs -botocore==1.40.51 +botocore==1.40.56 # via # aws-xray-sdk # boto3 # moto # s3transfer -botocore-stubs==1.40.51 +botocore-stubs==1.40.56 # via boto3-stubs certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography -cfn-lint==1.40.1 +cfn-lint==1.40.2 # via moto -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -cryptography==46.0.2 +cryptography==46.0.3 # via # -r lambdas/python/common/requirements-dev.in # joserfc @@ -85,7 +85,7 @@ markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[all]==5.1.14 +moto[all]==5.1.15 # via -r lambdas/python/common/requirements-dev.in mpmath==1.3.0 # via sympy @@ -105,9 +105,9 @@ py-partiql-parser==0.6.1 # via moto pycparser==2.23 # via cffi -pydantic==2.12.1 +pydantic==2.12.3 # via aws-sam-translator -pydantic-core==2.41.3 +pydantic-core==2.41.4 # via pydantic pyparsing==3.2.5 # via moto @@ -127,7 +127,7 @@ referencing==0.36.2 # jsonschema # jsonschema-path # jsonschema-specifications -regex==2025.9.18 +regex==2025.10.23 # via cfn-lint requests==2.32.5 # via @@ -151,7 +151,7 @@ six==1.17.0 # rfc3339-validator sympy==1.14.0 # via cfn-lint -types-awscrt==0.28.1 +types-awscrt==0.28.2 # via botocore-stubs types-s3transfer==0.14.0 # via boto3-stubs @@ -172,7 +172,7 @@ urllib3==2.5.0 # responses werkzeug==3.1.3 # via moto -wrapt==1.17.3 +wrapt==2.0.0 # via aws-xray-sdk xmltodict==1.0.2 # via moto diff --git a/backend/compact-connect/lambdas/python/common/requirements.txt b/backend/compact-connect/lambdas/python/common/requirements.txt index 632b0114b..ce0d0029d 100644 --- a/backend/compact-connect/lambdas/python/common/requirements.txt +++ b/backend/compact-connect/lambdas/python/common/requirements.txt @@ -2,17 +2,17 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/common/requirements.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/common/requirements.in # argon2-cffi==25.1.0 # via -r lambdas/python/common/requirements.in argon2-cffi-bindings==25.1.0 # via argon2-cffi -aws-lambda-powertools==3.21.0 +aws-lambda-powertools==3.22.0 # via -r lambdas/python/common/requirements.in -boto3==1.40.51 +boto3==1.40.56 # via -r lambdas/python/common/requirements.in -botocore==1.40.51 +botocore==1.40.56 # via # boto3 # s3transfer @@ -22,9 +22,9 @@ cffi==2.0.0 # via # argon2-cffi-bindings # cryptography -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -cryptography==46.0.2 +cryptography==46.0.3 # via -r lambdas/python/common/requirements.in idna==3.11 # via requests diff --git a/backend/compact-connect/lambdas/python/compact-configuration/requirements-dev.txt b/backend/compact-connect/lambdas/python/compact-configuration/requirements-dev.txt index acae6d897..c741541bc 100644 --- a/backend/compact-connect/lambdas/python/compact-configuration/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/compact-configuration/requirements-dev.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/compact-configuration/requirements-dev.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/compact-configuration/requirements-dev.in # -boto3==1.40.51 +boto3==1.40.56 # via moto -botocore==1.40.51 +botocore==1.40.56 # via # boto3 # moto @@ -15,9 +15,9 @@ certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -cryptography==46.0.2 +cryptography==46.0.3 # via moto docker==7.1.0 # via moto @@ -33,7 +33,7 @@ markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.14 +moto[dynamodb,s3]==5.1.15 # via -r lambdas/python/compact-configuration/requirements-dev.in py-partiql-parser==0.6.1 # via moto diff --git a/backend/compact-connect/lambdas/python/compact-configuration/requirements.txt b/backend/compact-connect/lambdas/python/compact-configuration/requirements.txt index 300b434df..4e0089cfc 100644 --- a/backend/compact-connect/lambdas/python/compact-configuration/requirements.txt +++ b/backend/compact-connect/lambdas/python/compact-configuration/requirements.txt @@ -2,5 +2,5 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/compact-configuration/requirements.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/compact-configuration/requirements.in # diff --git a/backend/compact-connect/lambdas/python/custom-resources/requirements-dev.txt b/backend/compact-connect/lambdas/python/custom-resources/requirements-dev.txt index 05af96301..0ac54cfb6 100644 --- a/backend/compact-connect/lambdas/python/custom-resources/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/custom-resources/requirements-dev.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/custom-resources/requirements-dev.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/custom-resources/requirements-dev.in # -boto3==1.40.51 +boto3==1.40.56 # via moto -botocore==1.40.51 +botocore==1.40.56 # via # boto3 # moto @@ -15,9 +15,9 @@ certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -cryptography==46.0.2 +cryptography==46.0.3 # via moto docker==7.1.0 # via moto @@ -33,7 +33,7 @@ markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.14 +moto[dynamodb,s3]==5.1.15 # via -r lambdas/python/custom-resources/requirements-dev.in py-partiql-parser==0.6.1 # via moto diff --git a/backend/compact-connect/lambdas/python/custom-resources/requirements.txt b/backend/compact-connect/lambdas/python/custom-resources/requirements.txt index 069cb30f7..a4578b969 100644 --- a/backend/compact-connect/lambdas/python/custom-resources/requirements.txt +++ b/backend/compact-connect/lambdas/python/custom-resources/requirements.txt @@ -2,5 +2,5 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/custom-resources/requirements.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/custom-resources/requirements.in # diff --git a/backend/compact-connect/lambdas/python/data-events/requirements-dev.txt b/backend/compact-connect/lambdas/python/data-events/requirements-dev.txt index c8a17b58b..e081f34c9 100644 --- a/backend/compact-connect/lambdas/python/data-events/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/data-events/requirements-dev.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/data-events/requirements-dev.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/data-events/requirements-dev.in # -boto3==1.40.51 +boto3==1.40.56 # via moto -botocore==1.40.51 +botocore==1.40.56 # via # boto3 # moto @@ -15,9 +15,9 @@ certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -cryptography==46.0.2 +cryptography==46.0.3 # via moto docker==7.1.0 # via moto @@ -33,7 +33,7 @@ markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.14 +moto[dynamodb,s3]==5.1.15 # via -r lambdas/python/data-events/requirements-dev.in py-partiql-parser==0.6.1 # via moto diff --git a/backend/compact-connect/lambdas/python/data-events/requirements.txt b/backend/compact-connect/lambdas/python/data-events/requirements.txt index 1d72aef4a..7df16379d 100644 --- a/backend/compact-connect/lambdas/python/data-events/requirements.txt +++ b/backend/compact-connect/lambdas/python/data-events/requirements.txt @@ -2,5 +2,5 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/data-events/requirements.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/data-events/requirements.in # diff --git a/backend/compact-connect/lambdas/python/disaster-recovery/requirements-dev.txt b/backend/compact-connect/lambdas/python/disaster-recovery/requirements-dev.txt index b2af304c8..050970754 100644 --- a/backend/compact-connect/lambdas/python/disaster-recovery/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/disaster-recovery/requirements-dev.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/disaster-recovery/requirements-dev.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/disaster-recovery/requirements-dev.in # -boto3==1.40.51 +boto3==1.40.56 # via moto -botocore==1.40.51 +botocore==1.40.56 # via # boto3 # moto @@ -15,9 +15,9 @@ certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -cryptography==46.0.2 +cryptography==46.0.3 # via moto docker==7.1.0 # via moto @@ -33,7 +33,7 @@ markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.14 +moto[dynamodb,s3]==5.1.15 # via -r lambdas/python/disaster-recovery/requirements-dev.in py-partiql-parser==0.6.1 # via moto diff --git a/backend/compact-connect/lambdas/python/disaster-recovery/requirements.txt b/backend/compact-connect/lambdas/python/disaster-recovery/requirements.txt index bde3b5530..ffc3ccb09 100644 --- a/backend/compact-connect/lambdas/python/disaster-recovery/requirements.txt +++ b/backend/compact-connect/lambdas/python/disaster-recovery/requirements.txt @@ -2,5 +2,5 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/disaster-recovery/requirements.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/disaster-recovery/requirements.in # diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.txt b/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.txt index e9c139a4b..62531f73c 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/provider-data-v1/requirements-dev.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/provider-data-v1/requirements-dev.in # -boto3==1.40.51 +boto3==1.40.56 # via moto -botocore==1.40.51 +botocore==1.40.56 # via # boto3 # moto @@ -15,9 +15,9 @@ certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -cryptography==46.0.2 +cryptography==46.0.3 # via moto docker==7.1.0 # via moto @@ -35,7 +35,7 @@ markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.14 +moto[dynamodb,s3]==5.1.15 # via -r lambdas/python/provider-data-v1/requirements-dev.in py-partiql-parser==0.6.1 # via moto diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/requirements.txt b/backend/compact-connect/lambdas/python/provider-data-v1/requirements.txt index 4de1e6acd..5060b3544 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/requirements.txt +++ b/backend/compact-connect/lambdas/python/provider-data-v1/requirements.txt @@ -2,5 +2,5 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/provider-data-v1/requirements.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/provider-data-v1/requirements.in # diff --git a/backend/compact-connect/lambdas/python/purchases/requirements-dev.txt b/backend/compact-connect/lambdas/python/purchases/requirements-dev.txt index 3da365642..0468753c3 100644 --- a/backend/compact-connect/lambdas/python/purchases/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/purchases/requirements-dev.txt @@ -1,14 +1,14 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile requirements-dev.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/purchases/requirements-dev.in # boolean-py==5.0 # via license-expression -boto3==1.40.51 +boto3==1.40.56 # via moto -botocore==1.40.51 +botocore==1.40.56 # via # boto3 # moto @@ -23,15 +23,15 @@ certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests click==8.3.0 # via pip-tools coverage[toml]==7.11.0 # via - # -r requirements-dev.in + # -r lambdas/python/purchases/requirements-dev.in # pytest-cov -cryptography==46.0.2 +cryptography==46.0.3 # via moto cyclonedx-python-lib==9.1.0 # via pip-audit @@ -40,7 +40,7 @@ defusedxml==0.7.1 docker==7.1.0 # via moto faker==28.4.1 - # via -r requirements-dev.in + # via -r lambdas/python/purchases/requirements-dev.in filelock==3.20.0 # via cachecontrol idna==3.11 @@ -63,8 +63,8 @@ markupsafe==3.0.3 # werkzeug mdurl==0.1.2 # via markdown-it-py -moto[dynamodb,s3]==5.1.14 - # via -r requirements-dev.in +moto[dynamodb,s3]==5.1.15 + # via -r lambdas/python/purchases/requirements-dev.in msgpack==1.1.2 # via cachecontrol packageurl-python==0.17.5 @@ -78,11 +78,11 @@ packaging==25.0 pip-api==0.0.34 # via pip-audit pip-audit==2.9.0 - # via -r requirements-dev.in + # via -r lambdas/python/purchases/requirements-dev.in pip-requirements-parser==32.0.1 # via pip-audit pip-tools==7.5.1 - # via -r requirements-dev.in + # via -r lambdas/python/purchases/requirements-dev.in platformdirs==4.5.0 # via pip-audit pluggy==1.6.0 @@ -107,10 +107,10 @@ pyproject-hooks==1.2.0 # pip-tools pytest==8.4.2 # via - # -r requirements-dev.in + # -r lambdas/python/purchases/requirements-dev.in # pytest-cov pytest-cov==7.0.0 - # via -r requirements-dev.in + # via -r lambdas/python/purchases/requirements-dev.in python-dateutil==2.9.0.post0 # via # botocore @@ -132,7 +132,7 @@ responses==0.25.8 rich==14.2.0 # via pip-audit ruff==0.14.1 - # via -r requirements-dev.in + # via -r lambdas/python/purchases/requirements-dev.in s3transfer==0.14.0 # via boto3 six==1.17.0 diff --git a/backend/compact-connect/lambdas/python/purchases/requirements.txt b/backend/compact-connect/lambdas/python/purchases/requirements.txt index c002cf8e5..2718af8b8 100644 --- a/backend/compact-connect/lambdas/python/purchases/requirements.txt +++ b/backend/compact-connect/lambdas/python/purchases/requirements.txt @@ -2,13 +2,13 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/purchases/requirements.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/purchases/requirements.in # authorizenet==1.1.6 # via -r lambdas/python/purchases/requirements.in certifi==2025.10.5 # via requests -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests idna==3.11 # via requests diff --git a/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements-dev.txt b/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements-dev.txt index d6a3d6f7b..afffac437 100644 --- a/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements-dev.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/staff-user-pre-token/requirements-dev.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/staff-user-pre-token/requirements-dev.in # -boto3==1.40.51 +boto3==1.40.56 # via moto -botocore==1.40.51 +botocore==1.40.56 # via # boto3 # moto @@ -15,9 +15,9 @@ certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -cryptography==46.0.2 +cryptography==46.0.3 # via moto docker==7.1.0 # via moto @@ -33,7 +33,7 @@ markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[dynamodb,s3]==5.1.14 +moto[dynamodb,s3]==5.1.15 # via -r lambdas/python/staff-user-pre-token/requirements-dev.in py-partiql-parser==0.6.1 # via moto diff --git a/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements.txt b/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements.txt index 40d464f51..43cf8504b 100644 --- a/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements.txt +++ b/backend/compact-connect/lambdas/python/staff-user-pre-token/requirements.txt @@ -2,5 +2,5 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/staff-user-pre-token/requirements.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/staff-user-pre-token/requirements.in # diff --git a/backend/compact-connect/lambdas/python/staff-users/requirements-dev.txt b/backend/compact-connect/lambdas/python/staff-users/requirements-dev.txt index f322e300b..378def7bb 100644 --- a/backend/compact-connect/lambdas/python/staff-users/requirements-dev.txt +++ b/backend/compact-connect/lambdas/python/staff-users/requirements-dev.txt @@ -2,11 +2,11 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/staff-users/requirements-dev.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/staff-users/requirements-dev.in # -boto3==1.40.51 +boto3==1.40.56 # via moto -botocore==1.40.51 +botocore==1.40.56 # via # boto3 # moto @@ -15,9 +15,9 @@ certifi==2025.10.5 # via requests cffi==2.0.0 # via cryptography -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -cryptography==46.0.2 +cryptography==46.0.3 # via # joserfc # moto @@ -39,7 +39,7 @@ markupsafe==3.0.3 # via # jinja2 # werkzeug -moto[cognitoidp,dynamodb,s3]==5.1.14 +moto[cognitoidp,dynamodb,s3]==5.1.15 # via -r lambdas/python/staff-users/requirements-dev.in py-partiql-parser==0.6.1 # via moto diff --git a/backend/compact-connect/lambdas/python/staff-users/requirements.txt b/backend/compact-connect/lambdas/python/staff-users/requirements.txt index 08712efbd..ac407fa42 100644 --- a/backend/compact-connect/lambdas/python/staff-users/requirements.txt +++ b/backend/compact-connect/lambdas/python/staff-users/requirements.txt @@ -2,5 +2,5 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None lambdas/python/staff-users/requirements.in +# pip-compile --no-emit-index-url --no-strip-extras lambdas/python/staff-users/requirements.in # diff --git a/backend/compact-connect/requirements-dev.txt b/backend/compact-connect/requirements-dev.txt index 78e2641c3..6b3eed0b4 100644 --- a/backend/compact-connect/requirements-dev.txt +++ b/backend/compact-connect/requirements-dev.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None requirements-dev.in +# pip-compile --no-emit-index-url --no-strip-extras requirements-dev.in # boolean-py==5.0 # via license-expression @@ -14,11 +14,11 @@ cachecontrol[filecache]==0.14.3 # pip-audit certifi==2025.10.5 # via requests -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests click==8.3.0 # via pip-tools -coverage[toml]==7.10.7 +coverage[toml]==7.11.0 # via # -r requirements-dev.in # pytest-cov @@ -32,7 +32,7 @@ filelock==3.20.0 # via cachecontrol idna==3.11 # via requests -iniconfig==2.1.0 +iniconfig==2.3.0 # via pytest license-expression==30.4.4 # via cyclonedx-python-lib @@ -90,7 +90,7 @@ requests==2.32.5 # pip-audit rich==14.2.0 # via pip-audit -ruff==0.14.0 +ruff==0.14.1 # via -r requirements-dev.in six==1.17.0 # via python-dateutil diff --git a/backend/compact-connect/requirements.txt b/backend/compact-connect/requirements.txt index 0cd0e097f..512097dfd 100644 --- a/backend/compact-connect/requirements.txt +++ b/backend/compact-connect/requirements.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with Python 3.13 # by the following command: # -# pip-compile --cert=None --client-cert=None --index-url=None --no-emit-index-url --pip-args=None requirements.in +# pip-compile --no-emit-index-url --no-strip-extras requirements.in # attrs==25.4.0 # via @@ -12,18 +12,18 @@ aws-cdk-asset-awscli-v1==2.2.242 # via aws-cdk-lib aws-cdk-asset-node-proxy-agent-v6==2.1.0 # via aws-cdk-lib -aws-cdk-aws-lambda-python-alpha==2.219.0a0 +aws-cdk-aws-lambda-python-alpha==2.220.0a0 # via -r requirements.in -aws-cdk-cloud-assembly-schema==48.14.0 +aws-cdk-cloud-assembly-schema==48.16.0 # via aws-cdk-lib -aws-cdk-lib==2.219.0 +aws-cdk-lib==2.220.0 # via # -r requirements.in # aws-cdk-aws-lambda-python-alpha # cdk-nag -cattrs==25.2.0 +cattrs==25.3.0 # via jsii -cdk-nag==2.37.51 +cdk-nag==2.37.55 # via -r requirements.in constructs==10.4.2 # via @@ -33,7 +33,7 @@ constructs==10.4.2 # cdk-nag importlib-resources==6.5.2 # via jsii -jsii==1.115.0 +jsii==1.117.0 # via # aws-cdk-asset-awscli-v1 # aws-cdk-asset-node-proxy-agent-v6 From 4445ff1148914caab4ec6962711aab0931145405 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 22 Oct 2025 13:53:48 -0600 Subject: [PATCH 10/33] Add required empty JSON body for POST investigations --- .../stacks/api_stack/v1_api/api_model.py | 32 +++++++++++++++++++ .../api_stack/v1_api/provider_management.py | 6 ++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py index d8219fafd..0823f378c 100644 --- a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py +++ b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py @@ -2819,6 +2819,38 @@ def check_feature_flag_response_model(self) -> Model: ) return self.api._v1_check_feature_flag_response_model + @property + def post_privilege_investigation_request_model(self) -> Model: + """POST privilege investigation request model""" + if not hasattr(self.api, '_v1_post_privilege_investigation_request_model'): + self.api._v1_post_privilege_investigation_request_model = Model( + self.api, + 'V1PostPrivilegeInvestigationRequestModel', + rest_api=self.api, + description='Post privilege investigation request model', + schema=JsonSchema( + type=JsonSchemaType.OBJECT, + properties={}, + ), + ) + return self.api._v1_post_privilege_investigation_request_model + + @property + def post_license_investigation_request_model(self) -> Model: + """POST license investigation request model""" + if not hasattr(self.api, '_v1_post_license_investigation_request_model'): + self.api._v1_post_license_investigation_request_model = Model( + self.api, + 'V1PostLicenseInvestigationRequestModel', + rest_api=self.api, + description='Post license investigation request model', + schema=JsonSchema( + type=JsonSchemaType.OBJECT, + properties={}, + ), + ) + return self.api._v1_post_license_investigation_request_model + @property def patch_privilege_investigation_request_model(self) -> Model: """PATCH privilege investigation request model""" diff --git a/backend/compact-connect/stacks/api_stack/v1_api/provider_management.py b/backend/compact-connect/stacks/api_stack/v1_api/provider_management.py index 66c6f3e44..df50ec15e 100644 --- a/backend/compact-connect/stacks/api_stack/v1_api/provider_management.py +++ b/backend/compact-connect/stacks/api_stack/v1_api/provider_management.py @@ -346,7 +346,8 @@ def _add_investigation_privilege( ) self.investigation_privilege_resource.add_method( 'POST', - request_validator=self.api.parameter_only_validator, + request_validator=self.api.parameter_body_validator, + request_models={'application/json': self.api_model.post_privilege_investigation_request_model}, method_responses=[ MethodResponse( status_code='200', @@ -393,7 +394,8 @@ def _add_investigation_license( ) self.investigation_license_resource.add_method( 'POST', - request_validator=self.api.parameter_only_validator, + request_validator=self.api.parameter_body_validator, + request_models={'application/json': self.api_model.post_license_investigation_request_model}, method_responses=[ MethodResponse( status_code='200', From 1b773d831a38f95deff75c41b9507feeea782aa7 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 22 Oct 2025 14:32:26 -0600 Subject: [PATCH 11/33] Add email notification service tests, update api docs --- .../api-specification/latest-oas30.json | 30 +- .../internal/postman/postman-collection.json | 360 +++++----- .../docs/postman/postman-collection.json | 38 +- .../tests/email-notification-service.test.ts | 634 ++++++++++++++++++ 4 files changed, 888 insertions(+), 174 deletions(-) diff --git a/backend/compact-connect/docs/internal/api-specification/latest-oas30.json b/backend/compact-connect/docs/internal/api-specification/latest-oas30.json index 9936852fd..28d04aff8 100644 --- a/backend/compact-connect/docs/internal/api-specification/latest-oas30.json +++ b/backend/compact-connect/docs/internal/api-specification/latest-oas30.json @@ -2,7 +2,7 @@ "openapi": "3.0.1", "info": { "title": "LicenseApi", - "version": "2025-10-22T19:30:51Z" + "version": "2025-10-22T20:31:18Z" }, "servers": [ { @@ -892,6 +892,16 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboLicenZ1SdRwpLvl46" + } + } + }, + "required": true + }, "responses": { "200": { "description": "200 response", @@ -1495,6 +1505,16 @@ } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboLicenISmLYcqYrfLq" + } + } + }, + "required": true + }, "responses": { "200": { "description": "200 response", @@ -3024,6 +3044,10 @@ } } }, + "SandboLicenISmLYcqYrfLq": { + "type": "object", + "properties": {} + }, "SandboLicenJIK60DVCsApb": { "required": [ "upload" @@ -6453,6 +6477,10 @@ } } }, + "SandboLicenZ1SdRwpLvl46": { + "type": "object", + "properties": {} + }, "SandboLicenBxfAXNgCl0f1": { "required": [ "compactAbbr", diff --git a/backend/compact-connect/docs/internal/postman/postman-collection.json b/backend/compact-connect/docs/internal/postman/postman-collection.json index 5b3dc7753..65c3de7f3 100644 --- a/backend/compact-connect/docs/internal/postman/postman-collection.json +++ b/backend/compact-connect/docs/internal/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "c5fad285-85b4-46e1-b9a0-ed846772cbd6", + "_postman_id": "0cd0e938-75e5-4181-82d8-d867dbb6b718", "description": { "content": "", "type": "text/plain" @@ -401,7 +401,7 @@ "item": [ { "event": [], - "id": "b56b260f-cc39-41e2-91f1-c0463bc75e78", + "id": "bc96f59d-6d05-4971-a377-67ad2bb95a57", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -444,7 +444,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"az\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"sd\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}", + "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nh\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nv\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}", "code": 200, "cookie": [], "header": [ @@ -453,7 +453,7 @@ "value": "application/json" } ], - "id": "66f760e8-868e-44da-829e-c6ea4ad3d96f", + "id": "75214a0e-3299-4f16-9887-5f3637a082aa", "name": "200 response", "originalRequest": { "body": {}, @@ -491,7 +491,7 @@ }, { "event": [], - "id": "c1c64581-96cd-4f2d-b16e-20f302d04e2f", + "id": "6af922f5-116d-4049-a2b0-7e428910fa75", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -505,7 +505,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"in\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"wa\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nj\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ia\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" }, "description": {}, "header": [ @@ -556,7 +556,7 @@ "value": "application/json" } ], - "id": "ab526af8-56a0-4766-a2bc-69ee7b62b7f1", + "id": "8ce823dd-2109-4e27-9b1d-254c2105a7c3", "name": "200 response", "originalRequest": { "body": { @@ -567,7 +567,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"in\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"wa\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nj\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ia\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" }, "header": [ { @@ -613,7 +613,7 @@ "item": [ { "event": [], - "id": "f9c6825b-f1e5-4978-b4bc-ff087712f38c", + "id": "c14fbbe9-2c8b-4883-8cdb-1bb925b91333", "name": "/v1/compacts/:compact/attestations/:attestationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -668,7 +668,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"dateCreated\": \"\",\n \"attestationId\": \"\",\n \"compact\": \"aslp\",\n \"text\": \"\",\n \"type\": \"attestation\",\n \"locale\": \"\",\n \"version\": \"\",\n \"required\": \"\"\n}", + "body": "{\n \"dateCreated\": \"\",\n \"attestationId\": \"\",\n \"compact\": \"octp\",\n \"text\": \"\",\n \"type\": \"attestation\",\n \"locale\": \"\",\n \"version\": \"\",\n \"required\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -677,7 +677,7 @@ "value": "application/json" } ], - "id": "064678d1-036c-4e4a-989b-12438995a4ac", + "id": "aa687728-796d-4e52-9249-8338bcd979f7", "name": "200 response", "originalRequest": { "body": {}, @@ -729,7 +729,7 @@ "item": [ { "event": [], - "id": "95a82a79-773a-464f-8e72-4c7df7abf6f8", + "id": "ee51e6fd-716a-45e3-9613-ecd41fc7f7d8", "name": "/v1/compacts/:compact/credentials/payment-processor", "protocolProfileBehavior": { "disableBodyPruning": true @@ -796,7 +796,7 @@ "value": "application/json" } ], - "id": "d81b2c8e-396c-432d-a90f-364582613485", + "id": "c01aca6e-66b0-4162-accd-dc40efe57234", "name": "200 response", "originalRequest": { "body": { @@ -858,7 +858,7 @@ "item": [ { "event": [], - "id": "7f701e88-dc01-420c-9380-d3d3411f0e64", + "id": "44536e7f-a567-4dab-8421-9a2dafed5a4c", "name": "/v1/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -911,7 +911,7 @@ "value": "application/json" } ], - "id": "f061b327-f47a-4c32-90a7-22618de45669", + "id": "42f05174-c1a7-4180-a79f-0230ecd63fb9", "name": "200 response", "originalRequest": { "body": {}, @@ -984,7 +984,7 @@ } } ], - "id": "0eae1797-a156-4975-a531-0a7cf19c5d72", + "id": "1b520f33-242b-4922-91df-684e7f07c7d7", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1050,7 +1050,7 @@ "value": "application/json" } ], - "id": "fdfd54ed-d010-4085-9a8c-f6880f5970ec", + "id": "bb66e506-0fc1-4e7f-ac26-6f488d4532ae", "name": "200 response", "originalRequest": { "body": {}, @@ -1110,7 +1110,7 @@ "item": [ { "event": [], - "id": "48a83bc5-79ba-4188-8c18-d46173dbf9ab", + "id": "184c251a-4b61-41c0-8a74-8e0b9ce6cd66", "name": "/v1/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1124,7 +1124,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"4fd693ec-a06a-4754-b007-d43a2262427e\",\n \"jurisdiction\": \"ar\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"6136f0f6-4808-421f-8960-c82a8032fa55\",\n \"jurisdiction\": \"vi\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -1168,7 +1168,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"08-09\",\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2209-12-21\",\n \"dateOfUpdate\": \"1035-08-14\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"wi\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"dc\",\n \"nc\"\n ],\n \"providerId\": \"3aeafc6f-ee46-438d-b315-a3ea07029cc2\",\n \"type\": \"provider\",\n \"npi\": \"1938756324\",\n \"dateOfBirth\": \"2847-10-30\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ca\",\n \"ssnLastFour\": \"0480\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"13-26\",\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2248-10-05\",\n \"dateOfUpdate\": \"2065-07-14\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"va\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"co\",\n \"id\"\n ],\n \"providerId\": \"e52006a5-203c-41ad-a654-5c57afb50685\",\n \"type\": \"provider\",\n \"npi\": \"6180301864\",\n \"dateOfBirth\": \"1893-11-29\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"or\",\n \"ssnLastFour\": \"9441\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"08-04\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2758-07-31\",\n \"dateOfUpdate\": \"2830-08-29\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"ut\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"mt\",\n \"wy\"\n ],\n \"providerId\": \"b4ede3dc-5846-4a0d-9201-4aed91a3cdfa\",\n \"type\": \"provider\",\n \"npi\": \"0416180297\",\n \"dateOfBirth\": \"2522-05-30\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"unknown\",\n \"ssnLastFour\": \"5918\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"05-15\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1354-11-24\",\n \"dateOfUpdate\": \"1146-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"il\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"sc\",\n \"in\"\n ],\n \"providerId\": \"0fb36c63-a643-465c-931b-12b9b490a005\",\n \"type\": \"provider\",\n \"npi\": \"1589523557\",\n \"dateOfBirth\": \"2563-12-02\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"pr\",\n \"ssnLastFour\": \"7998\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -1177,7 +1177,7 @@ "value": "application/json" } ], - "id": "37620f00-754f-4f86-a0c2-3ea83b60277f", + "id": "549423ad-8e4e-42e6-a269-40e68d25255b", "name": "200 response", "originalRequest": { "body": { @@ -1188,7 +1188,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"4fd693ec-a06a-4754-b007-d43a2262427e\",\n \"jurisdiction\": \"ar\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"6136f0f6-4808-421f-8960-c82a8032fa55\",\n \"jurisdiction\": \"vi\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -1236,7 +1236,7 @@ "item": [ { "event": [], - "id": "fcf4b857-3d43-451d-b997-23b5c3e84776", + "id": "4f9bda9a-fe01-4919-9d60-b281b8bf701d", "name": "/v1/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1291,7 +1291,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"13-23\",\n \"compact\": \"aslp\",\n \"dateOfExpiration\": \"1291-11-05\",\n \"dateOfUpdate\": \"1555-10-05\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"la\",\n \"licenses\": [\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1286-12-01\",\n \"dateOfIssuance\": \"1116-10-30\",\n \"dateOfRenewal\": \"2267-12-30\",\n \"dateOfUpdate\": \"1054-04-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2325-09-31\",\n \"jurisdiction\": \"mt\",\n \"previous\": {\n \"dateOfExpiration\": \"1350-11-08\",\n \"dateOfIssuance\": \"2537-08-27\",\n \"dateOfRenewal\": \"1763-08-02\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0484306908\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2542-07-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+5779409504758\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"expiration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4027358470\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1028-11-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1176-07-02\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2758-10-16\",\n \"phoneNumber\": \"+7561990877210\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1696-03-12\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1705-05-09\",\n \"jurisdiction\": \"il\",\n \"previous\": {\n \"dateOfExpiration\": \"1283-11-31\",\n \"dateOfIssuance\": \"1735-09-25\",\n \"dateOfRenewal\": \"2111-11-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3585587602\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2942-06-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+6851235480927\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3649831817\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2517-11-31\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2093-06-08\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1537-12-30\",\n \"phoneNumber\": \"+575048975\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2732-12-05\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"nc\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"dffb43a0-20b1-4b23-8243-b493740555f3\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1233-12-31\",\n \"dateOfUpdate\": \"1763-05-02\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nh\",\n \"licenseType\": \"\",\n \"providerId\": \"d7473835-c2d8-49be-814e-770212cedbee\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1109-10-07\",\n \"dateOfUpdate\": \"2156-12-02\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"\",\n \"providerId\": \"3e0ef5bc-48df-40f3-bcfc-680f346e32d5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8222102521\",\n \"dateOfBirth\": \"2494-10-30\",\n \"ssnLastFour\": \"2228\",\n \"phoneNumber\": \"+98538615958401\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1859-01-16\",\n \"dateOfUpdate\": \"2565-11-31\",\n \"effectiveStartDate\": \"2911-12-03\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nj\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"2bb75d71-41c7-4acf-87c6-02cbc31e237e\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1805-05-04\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1633-11-20\",\n \"dateOfUpdate\": \"1597-01-30\",\n \"effectiveStartDate\": \"2567-12-06\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"pa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"54285348-dc5b-48ad-ac9e-51f60d23a26c\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1275-05-20\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1750-06-04\",\n \"dateOfIssuance\": \"1351-01-31\",\n \"dateOfRenewal\": \"1947-11-16\",\n \"dateOfUpdate\": \"2657-11-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1724-12-19\",\n \"jurisdiction\": \"wv\",\n \"previous\": {\n \"dateOfExpiration\": \"2450-09-31\",\n \"dateOfIssuance\": \"1896-12-31\",\n \"dateOfRenewal\": \"1919-11-07\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5165726263\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2722-01-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+08967532182\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2426866987\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1436-09-31\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1491-11-02\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2729-12-25\",\n \"phoneNumber\": \"+9708243671491\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1157-07-13\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2252-03-08\",\n \"jurisdiction\": \"al\",\n \"previous\": {\n \"dateOfExpiration\": \"2870-11-08\",\n \"dateOfIssuance\": \"2082-09-01\",\n \"dateOfRenewal\": \"2489-08-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6398771128\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2278-07-06\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+3977011943951\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3984717274\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1141-12-16\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2418-01-22\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2252-06-30\",\n \"phoneNumber\": \"+3166052190\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1378-04-07\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"nj\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"middleName\": \"\",\n \"providerId\": \"e92310b3-23f6-45c4-b541-fdef716469e2\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1508-10-25\",\n \"dateOfUpdate\": \"1895-01-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"563b9c4d-20bb-4631-883a-48ac78561955\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2789-02-16\",\n \"dateOfUpdate\": \"1564-10-11\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"providerId\": \"7a9bd919-9559-4637-802f-b2b88c0fd9c5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"7056853003\",\n \"dateOfBirth\": \"1291-12-03\",\n \"ssnLastFour\": \"4632\",\n \"phoneNumber\": \"+1483172929997\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1548-07-09\",\n \"dateOfUpdate\": \"2360-07-10\",\n \"effectiveStartDate\": \"2633-04-18\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ut\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"7c29355c-b873-4cba-b090-96b6bc6d1ae1\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2326-07-25\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2504-11-30\",\n \"dateOfUpdate\": \"2173-11-20\",\n \"effectiveStartDate\": \"1445-11-22\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"465916fa-c30c-44f7-b800-d08f64414bc6\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2151-07-26\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1982-12-30\",\n \"dateOfUpload\": \"1422-03-20\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"bfaadeea-2c4b-416c-84be-ac852a241870\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2050-03-30\",\n \"dateOfUpload\": \"2673-04-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"36e0d0aa-a4ba-4f5b-9f34-89d0d77ae6e6\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"tx\",\n \"mo\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2103-10-02\",\n \"dateOfIssuance\": \"1469-10-08\",\n \"dateOfRenewal\": \"2502-04-03\",\n \"dateOfUpdate\": \"2305-04-30\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1404-11-08\",\n \"jurisdiction\": \"de\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2990-07-17\",\n \"dateOfIssuance\": \"2389-03-30\",\n \"dateOfRenewal\": \"1224-11-22\",\n \"dateOfUpdate\": \"2427-08-23\",\n \"licenseJurisdiction\": \"nv\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"vi\",\n \"type\": \"privilege\",\n \"providerId\": \"f0bb2bf5-917c-44f7-b0cd-61deb765b2d4\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"wy\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"nc\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1638-05-17\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1286-10-07\",\n \"privilegeId\": \"\",\n \"providerId\": \"f5025be5-6fff-4954-8543-cfde5f62a257\",\n \"dateOfRenewal\": \"2035-12-03\",\n \"dateOfUpdate\": \"1302-03-31\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2755-10-30\",\n \"jurisdiction\": \"fl\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1364-11-30\",\n \"dateOfIssuance\": \"2912-11-04\",\n \"dateOfRenewal\": \"2669-10-08\",\n \"dateOfUpdate\": \"2241-01-18\",\n \"licenseJurisdiction\": \"al\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"wa\",\n \"type\": \"privilege\",\n \"providerId\": \"fec77711-9f0b-4a83-92a9-9468c125d48c\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"oh\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wi\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1425-09-09\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2710-10-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"d4e2f5ab-ee44-4c28-abcb-1488e3097f74\",\n \"dateOfRenewal\": \"1024-04-31\",\n \"dateOfUpdate\": \"2748-10-09\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"sd\",\n \"licenseJurisdiction\": \"tn\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"4eeda90f-bcf4-40aa-b9cb-95e94c5e5e09\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1228-11-31\",\n \"dateOfUpdate\": \"1434-06-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wv\",\n \"licenseType\": \"\",\n \"providerId\": \"65d872d7-1b7a-4751-ac37-e77208139120\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1339-10-30\",\n \"dateOfUpdate\": \"2749-10-16\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sd\",\n \"licenseType\": \"\",\n \"providerId\": \"e3f12b01-9cf1-4ac0-9330-9b370dcde8d1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1719-07-09\",\n \"dateOfUpdate\": \"1775-02-29\",\n \"effectiveStartDate\": \"1337-09-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"c10af0ce-c236-44ce-845c-b8cadbce6fdc\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2338-07-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2363-03-09\",\n \"dateOfUpdate\": \"1448-10-07\",\n \"effectiveStartDate\": \"1463-11-05\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b5030f3c-0b69-44a2-b5e2-2d9af36729b2\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2267-09-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2763-10-30\",\n \"dateOfIssuance\": \"1261-01-28\",\n \"dateOfRenewal\": \"1195-01-01\",\n \"dateOfUpdate\": \"1249-09-09\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1486-11-31\",\n \"jurisdiction\": \"ia\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2078-11-25\",\n \"dateOfIssuance\": \"1569-10-08\",\n \"dateOfRenewal\": \"2275-01-04\",\n \"dateOfUpdate\": \"1654-12-26\",\n \"licenseJurisdiction\": \"al\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"wv\",\n \"type\": \"privilege\",\n \"providerId\": \"f9f3257a-9970-46ed-acc1-5eab86c2784a\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"wi\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ri\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2211-05-31\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1652-01-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"5b89ec0b-a1c6-47c4-aedf-caa359ae43c0\",\n \"dateOfRenewal\": \"1861-04-16\",\n \"dateOfUpdate\": \"1013-11-31\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2590-05-29\",\n \"jurisdiction\": \"vi\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1064-11-20\",\n \"dateOfIssuance\": \"2114-08-08\",\n \"dateOfRenewal\": \"2712-02-31\",\n \"dateOfUpdate\": \"2158-07-11\",\n \"licenseJurisdiction\": \"me\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"me\",\n \"type\": \"privilege\",\n \"providerId\": \"5fe80401-0e3e-4a36-9a56-af61de35f8e8\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"in\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"mt\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1886-01-30\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2417-11-03\",\n \"privilegeId\": \"\",\n \"providerId\": \"178390a0-5a4b-45b2-9afc-656dda9cc944\",\n \"dateOfRenewal\": \"2471-05-21\",\n \"dateOfUpdate\": \"2374-05-03\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"ri\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"f589feb0-0b5d-422f-bfa5-22f6148ab000\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2151-12-27\",\n \"dateOfUpdate\": \"1274-09-16\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"providerId\": \"502fa533-6404-4015-98cb-3ea31f712b50\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2213-12-30\",\n \"dateOfUpdate\": \"2874-12-02\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"dc\",\n \"licenseType\": \"\",\n \"providerId\": \"34c1a3d8-5126-4b79-8a48-19cea570fe27\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1844-08-20\",\n \"dateOfUpdate\": \"1322-08-31\",\n \"effectiveStartDate\": \"2568-10-17\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b4ff6bff-d64a-4eb1-af10-71cc6c88ccb5\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2394-05-26\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2005-03-17\",\n \"dateOfUpdate\": \"2353-10-31\",\n \"effectiveStartDate\": \"2845-08-09\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a22264d8-a601-437f-b63e-97e94590f052\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2214-02-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"2e0d1636-20d0-40bc-bddf-ed8c8b77e276\",\n \"type\": \"provider\",\n \"npi\": \"8740369942\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1097-12-19\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"nj\",\n \"ssnLastFour\": \"6550\",\n \"licenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"01-02\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"2154-11-02\",\n \"dateOfUpdate\": \"2104-08-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ok\",\n \"licenses\": [\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2825-07-31\",\n \"dateOfIssuance\": \"2000-12-07\",\n \"dateOfRenewal\": \"2674-07-30\",\n \"dateOfUpdate\": \"2435-09-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1805-04-11\",\n \"jurisdiction\": \"tx\",\n \"previous\": {\n \"dateOfExpiration\": \"1501-06-03\",\n \"dateOfIssuance\": \"1212-11-31\",\n \"dateOfRenewal\": \"1829-03-07\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5428549691\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1502-04-05\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+4481600167198\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0547502503\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1117-03-06\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1631-12-01\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2652-02-25\",\n \"phoneNumber\": \"+73039722088\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1895-11-03\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2984-07-05\",\n \"jurisdiction\": \"ca\",\n \"previous\": {\n \"dateOfExpiration\": \"1153-11-18\",\n \"dateOfIssuance\": \"1339-01-30\",\n \"dateOfRenewal\": \"2929-02-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4516097308\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2539-02-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+00423252\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9173380936\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1285-01-19\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1319-01-25\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1433-11-31\",\n \"phoneNumber\": \"+223839924\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1440-10-04\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"wi\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"37ee6863-6b41-48a7-b775-c54e81b99b1d\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1096-12-22\",\n \"dateOfUpdate\": \"2489-08-04\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"providerId\": \"47b221bd-0571-404a-a809-21ce1cc5b48e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1984-02-07\",\n \"dateOfUpdate\": \"1977-12-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"1b092c99-6b34-44ed-bc50-624472be234b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8344660809\",\n \"dateOfBirth\": \"1428-04-24\",\n \"ssnLastFour\": \"9275\",\n \"phoneNumber\": \"+862914303\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2280-10-07\",\n \"dateOfUpdate\": \"1531-10-11\",\n \"effectiveStartDate\": \"2671-10-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b5f69573-08c7-4c04-93fa-a898126ba6cc\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2769-09-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2179-11-31\",\n \"dateOfUpdate\": \"2605-12-29\",\n \"effectiveStartDate\": \"2811-09-09\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8e21a34e-b2d4-4f01-af21-51ac3e8aa5d8\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1876-09-27\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2484-11-06\",\n \"dateOfIssuance\": \"2211-02-18\",\n \"dateOfRenewal\": \"2332-08-06\",\n \"dateOfUpdate\": \"1945-10-13\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2827-11-02\",\n \"jurisdiction\": \"vi\",\n \"previous\": {\n \"dateOfExpiration\": \"1586-12-06\",\n \"dateOfIssuance\": \"2434-09-31\",\n \"dateOfRenewal\": \"1698-04-01\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8029916107\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2457-08-08\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+572834790400\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7167564830\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1886-04-01\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2329-05-14\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2349-10-03\",\n \"phoneNumber\": \"+917875436006687\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2204-11-31\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2174-05-31\",\n \"jurisdiction\": \"fl\",\n \"previous\": {\n \"dateOfExpiration\": \"1431-12-11\",\n \"dateOfIssuance\": \"2888-12-30\",\n \"dateOfRenewal\": \"1245-11-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6965680746\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2766-11-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+64811211786\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2319157496\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2034-10-30\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1319-09-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2907-08-20\",\n \"phoneNumber\": \"+958705938\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1178-12-13\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"middleName\": \"\",\n \"providerId\": \"c14be4f3-0363-49f5-b4a8-0ce2590aab82\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2207-03-21\",\n \"dateOfUpdate\": \"1304-08-03\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"bf1b4b3c-e9cf-4d3c-8ac3-60a1e9b7f197\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2190-10-03\",\n \"dateOfUpdate\": \"1696-11-06\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"providerId\": \"f9894d80-700a-4848-ba6d-23f37aa109cf\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"7989243429\",\n \"dateOfBirth\": \"1650-09-30\",\n \"ssnLastFour\": \"7179\",\n \"phoneNumber\": \"+23505233735\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2005-12-08\",\n \"dateOfUpdate\": \"1492-09-09\",\n \"effectiveStartDate\": \"1317-11-22\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4b722575-5cc8-4f49-aaa8-48b5459a3894\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1270-11-11\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1641-04-30\",\n \"dateOfUpdate\": \"1530-05-23\",\n \"effectiveStartDate\": \"2272-12-03\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"35a42eda-3ce7-402d-9112-a985ea67fb87\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1595-02-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1615-04-30\",\n \"dateOfUpload\": \"1224-12-31\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"95348a64-0e45-4101-95ae-b98b0005475b\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1233-10-14\",\n \"dateOfUpload\": \"2903-10-20\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"105eb690-6fce-4650-be97-168296d0d4d0\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"dc\",\n \"wy\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2523-09-31\",\n \"dateOfIssuance\": \"1926-05-27\",\n \"dateOfRenewal\": \"1608-11-30\",\n \"dateOfUpdate\": \"2793-11-31\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1404-12-30\",\n \"jurisdiction\": \"or\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1599-12-31\",\n \"dateOfIssuance\": \"2843-03-31\",\n \"dateOfRenewal\": \"1115-01-17\",\n \"dateOfUpdate\": \"2543-05-01\",\n \"licenseJurisdiction\": \"sc\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ms\",\n \"type\": \"privilege\",\n \"providerId\": \"890b5c10-fe97-463a-be4a-37e4374d8278\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"mn\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wa\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1174-12-31\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2534-10-18\",\n \"privilegeId\": \"\",\n \"providerId\": \"1ff3f039-ae34-4bb0-be85-f5729aed7fba\",\n \"dateOfRenewal\": \"2257-05-10\",\n \"dateOfUpdate\": \"1467-12-31\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1749-09-31\",\n \"jurisdiction\": \"ny\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1847-02-11\",\n \"dateOfIssuance\": \"2425-10-08\",\n \"dateOfRenewal\": \"2872-08-31\",\n \"dateOfUpdate\": \"2671-04-18\",\n \"licenseJurisdiction\": \"sd\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ky\",\n \"type\": \"privilege\",\n \"providerId\": \"24c41f5b-5363-444b-a127-fbf286dc9772\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"nv\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ct\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2046-12-05\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1503-11-15\",\n \"privilegeId\": \"\",\n \"providerId\": \"f1cb40c0-682e-4641-999a-f4d5c9096486\",\n \"dateOfRenewal\": \"2583-11-31\",\n \"dateOfUpdate\": \"2680-11-07\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"id\",\n \"licenseJurisdiction\": \"ny\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"aa251ae7-c0c2-4be7-b619-2c14f5cc5a0c\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1078-06-30\",\n \"dateOfUpdate\": \"1718-02-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"95b2a3e4-9bf4-41ab-a243-9e4b9cdfbba9\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2757-11-02\",\n \"dateOfUpdate\": \"2309-10-01\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"2f3dafbe-8ec7-4176-ba8c-eb6aea8616f1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1337-12-01\",\n \"dateOfUpdate\": \"1361-07-31\",\n \"effectiveStartDate\": \"2738-07-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"54696fdf-7347-48fa-9fc4-45927106c14e\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2202-05-13\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1217-05-08\",\n \"dateOfUpdate\": \"2667-09-02\",\n \"effectiveStartDate\": \"1580-03-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"fl\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"ad99d20b-5a86-4d8a-8831-94ec74f169dc\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2728-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2932-10-22\",\n \"dateOfIssuance\": \"1744-03-30\",\n \"dateOfRenewal\": \"1834-03-03\",\n \"dateOfUpdate\": \"2069-11-27\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1377-12-25\",\n \"jurisdiction\": \"ma\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2170-10-27\",\n \"dateOfIssuance\": \"1975-10-12\",\n \"dateOfRenewal\": \"1382-08-20\",\n \"dateOfUpdate\": \"2716-08-17\",\n \"licenseJurisdiction\": \"tx\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ak\",\n \"type\": \"privilege\",\n \"providerId\": \"bac9f437-6759-45a9-a357-4e8e59062df8\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ct\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"fl\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2467-06-02\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2476-01-04\",\n \"privilegeId\": \"\",\n \"providerId\": \"0ae226ca-e340-4af8-8cd3-7d6d46527078\",\n \"dateOfRenewal\": \"2810-05-21\",\n \"dateOfUpdate\": \"2411-10-11\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1390-10-28\",\n \"jurisdiction\": \"de\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2882-02-05\",\n \"dateOfIssuance\": \"1279-01-20\",\n \"dateOfRenewal\": \"2220-11-31\",\n \"dateOfUpdate\": \"2016-10-31\",\n \"licenseJurisdiction\": \"al\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"nj\",\n \"type\": \"privilege\",\n \"providerId\": \"51843ad9-89e6-41db-a24c-cc373e61551c\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"expiration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pa\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"la\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1807-08-24\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2286-09-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"044017cd-c945-4679-a26a-e0f3bf8d362c\",\n \"dateOfRenewal\": \"2219-05-24\",\n \"dateOfUpdate\": \"1832-10-05\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ky\",\n \"licenseJurisdiction\": \"ok\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"d2aabf6a-a1ea-4230-ada7-f41d2785c679\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1239-07-04\",\n \"dateOfUpdate\": \"2383-10-08\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"1424fde8-e2a8-4a06-b056-e738ba92f4d9\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1215-11-05\",\n \"dateOfUpdate\": \"1335-04-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"providerId\": \"2e9706be-6b29-4517-8ed7-1006d00f2f22\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2188-10-16\",\n \"dateOfUpdate\": \"1071-12-31\",\n \"effectiveStartDate\": \"2637-12-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e8f64c1c-18bb-4fbc-b001-7eba71a222aa\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2555-12-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1479-12-30\",\n \"dateOfUpdate\": \"1040-01-01\",\n \"effectiveStartDate\": \"2370-06-15\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1d70365a-74a7-4340-8ac4-52486faa7771\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1460-02-01\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"8abe5187-9b27-4f61-9e90-c61c1864f19a\",\n \"type\": \"provider\",\n \"npi\": \"3521472876\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2029-12-20\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"wv\",\n \"ssnLastFour\": \"1933\",\n \"licenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -1300,7 +1300,7 @@ "value": "application/json" } ], - "id": "cba90919-5ac0-4098-b8da-5947f06ff783", + "id": "ca2cb326-8bcf-496f-a7d5-bd4ccf1f0591", "name": "200 response", "originalRequest": { "body": {}, @@ -1358,7 +1358,7 @@ "item": [ { "event": [], - "id": "b455f85d-fbbe-4846-8f56-cc1d075996c5", + "id": "4d4d4ae6-439e-4ed4-a79f-64bd93e69253", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1372,7 +1372,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"1515-11-06\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"2357-04-21\",\n \"encumbranceType\": \"suspension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "description": {}, "header": [ @@ -1461,7 +1461,7 @@ "value": "application/json" } ], - "id": "2acb97f5-12ce-4fec-9560-6eff5e92537c", + "id": "403c3288-1470-488f-b74f-0749bc13064c", "name": "200 response", "originalRequest": { "body": { @@ -1472,7 +1472,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"1515-11-06\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"2357-04-21\",\n \"encumbranceType\": \"suspension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "header": [ { @@ -1523,7 +1523,7 @@ "item": [ { "event": [], - "id": "96493354-81ba-4284-83ae-b2d318be77f2", + "id": "52707ea1-5087-4d7b-af4f-02790951755c", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1537,7 +1537,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1287-10-27\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"2487-12-06\"\n}" }, "description": {}, "header": [ @@ -1637,7 +1637,7 @@ "value": "application/json" } ], - "id": "8577d275-37b7-4daf-bac5-49e2f5e7d86c", + "id": "f99bd608-0f6a-462d-89e0-b63727e9200d", "name": "200 response", "originalRequest": { "body": { @@ -1648,7 +1648,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1287-10-27\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"2487-12-06\"\n}" }, "header": [ { @@ -1706,15 +1706,28 @@ "item": [ { "event": [], - "id": "259852a8-951c-4ba5-80bc-ead5af62a629", + "id": "20453776-5781-4794-9485-4fe167cc42ef", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true }, "request": { - "body": {}, + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{}" + }, "description": {}, "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, { "key": "Accept", "value": "application/json" @@ -1796,11 +1809,24 @@ "value": "application/json" } ], - "id": "95283fbc-2905-4c04-8e4c-e28a9e1d7426", + "id": "446331b8-f0ca-4e86-a0fc-29e659dcd33e", "name": "200 response", "originalRequest": { - "body": {}, + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{}" + }, "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, { "key": "Accept", "value": "application/json" @@ -1845,7 +1871,7 @@ "item": [ { "event": [], - "id": "af31b804-6c33-41b4-9c67-1a18503b7b1a", + "id": "cde3bbe2-6e2c-47d5-81fe-7ccdca0d0ff6", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1859,7 +1885,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2399-11-06\",\n \"encumbranceType\": \"reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2845-01-30\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "description": {}, "header": [ @@ -1959,7 +1985,7 @@ "value": "application/json" } ], - "id": "9a4a1fd4-bf83-4980-b1fd-7420d7914c33", + "id": "fa39f8f6-1b98-4adc-a594-bd6007b31591", "name": "200 response", "originalRequest": { "body": { @@ -1970,7 +1996,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2399-11-06\",\n \"encumbranceType\": \"reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2845-01-30\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "header": [ { @@ -2058,7 +2084,7 @@ "item": [ { "event": [], - "id": "1ca6686f-a6dd-49b5-ac30-11a32593106d", + "id": "2dcdfc78-5f0d-4fff-b46f-34c30514ee9c", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/deactivate", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2161,7 +2187,7 @@ "value": "application/json" } ], - "id": "a79d8a0a-25f8-460b-a3c0-cc9ba7d8ca53", + "id": "83b6851a-3f2c-4f52-91de-d8c82edca0eb", "name": "200 response", "originalRequest": { "body": { @@ -2226,7 +2252,7 @@ "item": [ { "event": [], - "id": "9cb1c463-4857-4f07-92ed-73494331f213", + "id": "86ad476f-c738-48ee-9b4e-d4cb543a5f46", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2240,7 +2266,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"1515-11-06\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"2357-04-21\",\n \"encumbranceType\": \"suspension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "description": {}, "header": [ @@ -2329,7 +2355,7 @@ "value": "application/json" } ], - "id": "c71b23a6-0c1a-417d-9394-bad4beaa2028", + "id": "e662fa53-d038-4f42-8e53-a90952018bb4", "name": "200 response", "originalRequest": { "body": { @@ -2340,7 +2366,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"1515-11-06\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"2357-04-21\",\n \"encumbranceType\": \"suspension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "header": [ { @@ -2391,7 +2417,7 @@ "item": [ { "event": [], - "id": "ff26dfbe-e7fe-4f16-bb60-5213a7338eed", + "id": "9a5d50d2-a980-4db9-9ec6-1e33fd073a98", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2405,7 +2431,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1287-10-27\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"2487-12-06\"\n}" }, "description": {}, "header": [ @@ -2505,7 +2531,7 @@ "value": "application/json" } ], - "id": "6101cbff-c831-41fc-b0d3-e60b9cc05683", + "id": "80969d57-8214-424c-a3ad-b94083dcab06", "name": "200 response", "originalRequest": { "body": { @@ -2516,7 +2542,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1287-10-27\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"2487-12-06\"\n}" }, "header": [ { @@ -2574,7 +2600,7 @@ "item": [ { "event": [], - "id": "f56ee580-307e-4f0e-ad48-86655e0eaca8", + "id": "cf9931cb-ec4c-4d34-9af5-53dddfd94698", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2655,7 +2681,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"1842-12-05\",\n \"dateOfUpdate\": \"1852-11-12\",\n \"effectiveDate\": \"1264-12-02\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"1753-11-03\",\n \"dateOfUpdate\": \"2153-02-25\",\n \"effectiveDate\": \"2283-12-17\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"166186cd-ab85-40e5-82dd-e841e1d92faf\"\n}", + "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"2530-10-09\",\n \"dateOfUpdate\": \"1693-03-31\",\n \"effectiveDate\": \"1260-11-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2291-10-30\",\n \"dateOfUpdate\": \"1104-10-30\",\n \"effectiveDate\": \"1943-03-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"va\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"61c5d582-0230-461d-84c5-cfed6b3d5e7d\"\n}", "code": 200, "cookie": [], "header": [ @@ -2664,7 +2690,7 @@ "value": "application/json" } ], - "id": "d68f038f-af96-4723-bd44-3179a74a394d", + "id": "31e11f50-dd3a-467f-981e-bcb6ffb54244", "name": "200 response", "originalRequest": { "body": {}, @@ -2716,15 +2742,28 @@ "item": [ { "event": [], - "id": "6beefffd-d8b5-4507-b0cf-8ff00faefc1c", + "id": "e450eb67-2141-4dc3-a5f2-47c4ba57c154", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true }, "request": { - "body": {}, + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{}" + }, "description": {}, "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, { "key": "Accept", "value": "application/json" @@ -2806,11 +2845,24 @@ "value": "application/json" } ], - "id": "bab5f024-28fd-4cfd-a993-43147481cc27", + "id": "11e56107-86b7-420b-9803-d58d371257cb", "name": "200 response", "originalRequest": { - "body": {}, + "body": { + "mode": "raw", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + }, + "raw": "{}" + }, "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, { "key": "Accept", "value": "application/json" @@ -2855,7 +2907,7 @@ "item": [ { "event": [], - "id": "3bebabc7-fd83-4133-863f-6a1290829208", + "id": "4f11a963-cc69-40c3-ba1a-2e90e487416e", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2869,7 +2921,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2399-11-06\",\n \"encumbranceType\": \"reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2845-01-30\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "description": {}, "header": [ @@ -2969,7 +3021,7 @@ "value": "application/json" } ], - "id": "6ba10163-51f5-48ff-afc4-0879ed15c8f3", + "id": "bb8417b4-1165-4d4b-9ae5-2138a8db1a85", "name": "200 response", "originalRequest": { "body": { @@ -2980,7 +3032,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2399-11-06\",\n \"encumbranceType\": \"reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2845-01-30\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "header": [ { @@ -3053,7 +3105,7 @@ "item": [ { "event": [], - "id": "d583696f-295c-43c2-99e0-641a2e2e5247", + "id": "468ef14b-c846-414b-9b4b-dee25f691f28", "name": "/v1/compacts/:compact/providers/:providerId/ssn", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3109,7 +3161,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"ssn\": \"508-51-3859\"\n}", + "body": "{\n \"ssn\": \"546-11-6841\"\n}", "code": 200, "cookie": [], "header": [ @@ -3118,7 +3170,7 @@ "value": "application/json" } ], - "id": "733f10f6-b232-4b90-8e22-2e9daf5d1531", + "id": "28bd4f2f-8185-4934-976b-bbded66b1650", "name": "200 response", "originalRequest": { "body": {}, @@ -3171,7 +3223,7 @@ "item": [ { "event": [], - "id": "051db04e-e6ae-4e12-ad31-75b8f55a0517", + "id": "9d7dbbae-e8ec-4c59-8fcb-a83012e4e129", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3215,7 +3267,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_4\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n }\n ]\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n }\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -3233,7 +3285,7 @@ "value": "" } ], - "id": "f7e4290e-95bf-43dd-9e3d-6270746bfd81", + "id": "c147c550-1c64-44db-b23b-5ea7b5b44b96", "name": "200 response", "originalRequest": { "body": {}, @@ -3272,7 +3324,7 @@ }, { "event": [], - "id": "f1604c7e-42e9-4943-9297-eede03acb94a", + "id": "d8a8f18a-e11e-4586-832f-6cd8dc048f6c", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3286,7 +3338,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3329,7 +3381,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3347,7 +3399,7 @@ "value": "" } ], - "id": "5b678c4c-91d7-421e-be43-538e7c3a7d5a", + "id": "fe288db9-8e35-4abe-858a-e190463b6196", "name": "200 response", "originalRequest": { "body": { @@ -3358,7 +3410,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3402,7 +3454,7 @@ "item": [ { "event": [], - "id": "7d7d00eb-f826-4a25-8293-2a4f9449d496", + "id": "06f3988d-6545-45f8-865f-f69b0fde527b", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3457,7 +3509,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3475,7 +3527,7 @@ "value": "" } ], - "id": "b7efefa6-bdca-4d0d-8d74-327e062247df", + "id": "c4ee66b9-b1cd-4834-abe4-9ff22a133af1", "name": "200 response", "originalRequest": { "body": {}, @@ -3522,7 +3574,7 @@ "value": "application/json" } ], - "id": "6d825121-721c-48ce-8282-acea116f2cd4", + "id": "a596ac1a-2594-4944-b7da-e4dbf3f5404d", "name": "404 response", "originalRequest": { "body": {}, @@ -3562,7 +3614,7 @@ }, { "event": [], - "id": "c861d628-5c03-49c2-8e41-901dd3664c01", + "id": "5885c06c-22e5-434e-848b-deb0b72c7d2c", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3626,7 +3678,7 @@ "value": "application/json" } ], - "id": "e4299952-9a1a-462c-8424-c39781e9799e", + "id": "f94c677f-5066-4565-921f-84fb3e69b7f6", "name": "200 response", "originalRequest": { "body": {}, @@ -3673,7 +3725,7 @@ "value": "application/json" } ], - "id": "e65010f0-5824-4041-8739-7f485aa3d3f8", + "id": "000ac993-2573-413b-a121-6965fa663ef7", "name": "404 response", "originalRequest": { "body": {}, @@ -3713,7 +3765,7 @@ }, { "event": [], - "id": "c0005cc8-93db-407f-accc-74b38a550ae1", + "id": "2c3ebfb1-a636-4d48-ac58-e88b458ad3e7", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3727,7 +3779,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3781,7 +3833,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3799,7 +3851,7 @@ "value": "" } ], - "id": "1e43be38-e297-4b18-96ba-bcc0b82e72c6", + "id": "81ca3c2b-11b7-46da-a58e-8f654efabbe6", "name": "200 response", "originalRequest": { "body": { @@ -3810,7 +3862,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3859,7 +3911,7 @@ "value": "application/json" } ], - "id": "c613a103-9a33-422f-afef-539c4df73508", + "id": "dfdc8fbb-e60c-4c46-b64f-33c79bb3d284", "name": "404 response", "originalRequest": { "body": { @@ -3870,7 +3922,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3915,7 +3967,7 @@ "item": [ { "event": [], - "id": "4c66e27c-4fc7-4800-a833-80d060e0d5b6", + "id": "bac63224-e0b5-4a48-87bb-03056ea9a0f6", "name": "/v1/compacts/:compact/staff-users/:userId/reinvite", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3980,7 +4032,7 @@ "value": "application/json" } ], - "id": "002ae02c-0187-483a-ae09-3ce74cf10a91", + "id": "9a64ff8b-f67f-48bd-9d6d-0292ae79418b", "name": "200 response", "originalRequest": { "body": {}, @@ -4028,7 +4080,7 @@ "value": "application/json" } ], - "id": "65686cab-0aea-42d0-9f37-206e04ca8a28", + "id": "0e6afe62-049e-4292-87e6-5aa544032bd8", "name": "404 response", "originalRequest": { "body": {}, @@ -4093,7 +4145,7 @@ "item": [ { "event": [], - "id": "40b3e3bc-5bed-4b71-9082-f27963d561de", + "id": "bd8c7cbc-be17-4e8b-84ab-04cb3cde05b3", "name": "/v1/flags/:flagId/check", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4110,7 +4162,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\",\n \"key_3\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\"\n }\n }\n}" }, "description": {}, "header": [ @@ -4162,7 +4214,7 @@ "value": "application/json" } ], - "id": "214b8eb1-c1d8-412b-b3d2-cff3da769636", + "id": "700b7ca0-803d-43e8-8f97-786d307f184d", "name": "200 response", "originalRequest": { "body": { @@ -4173,7 +4225,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\",\n \"key_3\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\"\n }\n }\n}" }, "header": [ { @@ -4231,7 +4283,7 @@ "item": [ { "event": [], - "id": "4b64263d-a7fa-4324-bd14-b142be064bff", + "id": "c5f41ebb-ab03-41b3-9ac2-f802996b45e6", "name": "/v1/provider-users/initiateRecovery", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4248,7 +4300,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"coun\",\n \"dob\": \"1869-12-06\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"licensed professional counselor\",\n \"partialSocial\": \"0570\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" + "raw": "{\n \"compact\": \"octp\",\n \"dob\": \"1783-04-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"licensed professional counselor\",\n \"partialSocial\": \"3632\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" }, "description": {}, "header": [ @@ -4288,7 +4340,7 @@ "value": "application/json" } ], - "id": "a9dc8235-68fe-4e49-871e-bb1f8e248803", + "id": "2618e3fa-c29e-4e16-884f-b9dbb44db686", "name": "200 response", "originalRequest": { "body": { @@ -4299,7 +4351,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"coun\",\n \"dob\": \"1869-12-06\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"licensed professional counselor\",\n \"partialSocial\": \"0570\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" + "raw": "{\n \"compact\": \"octp\",\n \"dob\": \"1783-04-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"licensed professional counselor\",\n \"partialSocial\": \"3632\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" }, "header": [ { @@ -4337,7 +4389,7 @@ "item": [ { "event": [], - "id": "28fe44a7-f35c-461e-bd0a-0a782839562e", + "id": "4db92048-d41c-491c-910b-1f98c6d31a4f", "name": "/v1/provider-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4369,7 +4421,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"13-23\",\n \"compact\": \"aslp\",\n \"dateOfExpiration\": \"1291-11-05\",\n \"dateOfUpdate\": \"1555-10-05\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"la\",\n \"licenses\": [\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1286-12-01\",\n \"dateOfIssuance\": \"1116-10-30\",\n \"dateOfRenewal\": \"2267-12-30\",\n \"dateOfUpdate\": \"1054-04-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2325-09-31\",\n \"jurisdiction\": \"mt\",\n \"previous\": {\n \"dateOfExpiration\": \"1350-11-08\",\n \"dateOfIssuance\": \"2537-08-27\",\n \"dateOfRenewal\": \"1763-08-02\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0484306908\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2542-07-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+5779409504758\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"expiration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4027358470\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1028-11-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1176-07-02\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2758-10-16\",\n \"phoneNumber\": \"+7561990877210\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1696-03-12\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1705-05-09\",\n \"jurisdiction\": \"il\",\n \"previous\": {\n \"dateOfExpiration\": \"1283-11-31\",\n \"dateOfIssuance\": \"1735-09-25\",\n \"dateOfRenewal\": \"2111-11-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3585587602\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2942-06-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+6851235480927\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3649831817\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2517-11-31\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2093-06-08\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1537-12-30\",\n \"phoneNumber\": \"+575048975\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2732-12-05\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"nc\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"dffb43a0-20b1-4b23-8243-b493740555f3\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1233-12-31\",\n \"dateOfUpdate\": \"1763-05-02\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nh\",\n \"licenseType\": \"\",\n \"providerId\": \"d7473835-c2d8-49be-814e-770212cedbee\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1109-10-07\",\n \"dateOfUpdate\": \"2156-12-02\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"\",\n \"providerId\": \"3e0ef5bc-48df-40f3-bcfc-680f346e32d5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8222102521\",\n \"dateOfBirth\": \"2494-10-30\",\n \"ssnLastFour\": \"2228\",\n \"phoneNumber\": \"+98538615958401\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1859-01-16\",\n \"dateOfUpdate\": \"2565-11-31\",\n \"effectiveStartDate\": \"2911-12-03\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nj\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"2bb75d71-41c7-4acf-87c6-02cbc31e237e\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1805-05-04\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1633-11-20\",\n \"dateOfUpdate\": \"1597-01-30\",\n \"effectiveStartDate\": \"2567-12-06\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"pa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"54285348-dc5b-48ad-ac9e-51f60d23a26c\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1275-05-20\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1750-06-04\",\n \"dateOfIssuance\": \"1351-01-31\",\n \"dateOfRenewal\": \"1947-11-16\",\n \"dateOfUpdate\": \"2657-11-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1724-12-19\",\n \"jurisdiction\": \"wv\",\n \"previous\": {\n \"dateOfExpiration\": \"2450-09-31\",\n \"dateOfIssuance\": \"1896-12-31\",\n \"dateOfRenewal\": \"1919-11-07\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5165726263\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2722-01-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+08967532182\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2426866987\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1436-09-31\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1491-11-02\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2729-12-25\",\n \"phoneNumber\": \"+9708243671491\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1157-07-13\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2252-03-08\",\n \"jurisdiction\": \"al\",\n \"previous\": {\n \"dateOfExpiration\": \"2870-11-08\",\n \"dateOfIssuance\": \"2082-09-01\",\n \"dateOfRenewal\": \"2489-08-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6398771128\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2278-07-06\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+3977011943951\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3984717274\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1141-12-16\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2418-01-22\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2252-06-30\",\n \"phoneNumber\": \"+3166052190\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1378-04-07\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"nj\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"middleName\": \"\",\n \"providerId\": \"e92310b3-23f6-45c4-b541-fdef716469e2\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1508-10-25\",\n \"dateOfUpdate\": \"1895-01-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"563b9c4d-20bb-4631-883a-48ac78561955\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2789-02-16\",\n \"dateOfUpdate\": \"1564-10-11\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"providerId\": \"7a9bd919-9559-4637-802f-b2b88c0fd9c5\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"7056853003\",\n \"dateOfBirth\": \"1291-12-03\",\n \"ssnLastFour\": \"4632\",\n \"phoneNumber\": \"+1483172929997\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1548-07-09\",\n \"dateOfUpdate\": \"2360-07-10\",\n \"effectiveStartDate\": \"2633-04-18\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ut\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"7c29355c-b873-4cba-b090-96b6bc6d1ae1\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2326-07-25\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2504-11-30\",\n \"dateOfUpdate\": \"2173-11-20\",\n \"effectiveStartDate\": \"1445-11-22\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"465916fa-c30c-44f7-b800-d08f64414bc6\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2151-07-26\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1982-12-30\",\n \"dateOfUpload\": \"1422-03-20\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"bfaadeea-2c4b-416c-84be-ac852a241870\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2050-03-30\",\n \"dateOfUpload\": \"2673-04-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"36e0d0aa-a4ba-4f5b-9f34-89d0d77ae6e6\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"tx\",\n \"mo\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2103-10-02\",\n \"dateOfIssuance\": \"1469-10-08\",\n \"dateOfRenewal\": \"2502-04-03\",\n \"dateOfUpdate\": \"2305-04-30\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1404-11-08\",\n \"jurisdiction\": \"de\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2990-07-17\",\n \"dateOfIssuance\": \"2389-03-30\",\n \"dateOfRenewal\": \"1224-11-22\",\n \"dateOfUpdate\": \"2427-08-23\",\n \"licenseJurisdiction\": \"nv\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"vi\",\n \"type\": \"privilege\",\n \"providerId\": \"f0bb2bf5-917c-44f7-b0cd-61deb765b2d4\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"wy\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"nc\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1638-05-17\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1286-10-07\",\n \"privilegeId\": \"\",\n \"providerId\": \"f5025be5-6fff-4954-8543-cfde5f62a257\",\n \"dateOfRenewal\": \"2035-12-03\",\n \"dateOfUpdate\": \"1302-03-31\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2755-10-30\",\n \"jurisdiction\": \"fl\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1364-11-30\",\n \"dateOfIssuance\": \"2912-11-04\",\n \"dateOfRenewal\": \"2669-10-08\",\n \"dateOfUpdate\": \"2241-01-18\",\n \"licenseJurisdiction\": \"al\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"wa\",\n \"type\": \"privilege\",\n \"providerId\": \"fec77711-9f0b-4a83-92a9-9468c125d48c\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"oh\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wi\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1425-09-09\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2710-10-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"d4e2f5ab-ee44-4c28-abcb-1488e3097f74\",\n \"dateOfRenewal\": \"1024-04-31\",\n \"dateOfUpdate\": \"2748-10-09\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"sd\",\n \"licenseJurisdiction\": \"tn\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"4eeda90f-bcf4-40aa-b9cb-95e94c5e5e09\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1228-11-31\",\n \"dateOfUpdate\": \"1434-06-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wv\",\n \"licenseType\": \"\",\n \"providerId\": \"65d872d7-1b7a-4751-ac37-e77208139120\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1339-10-30\",\n \"dateOfUpdate\": \"2749-10-16\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sd\",\n \"licenseType\": \"\",\n \"providerId\": \"e3f12b01-9cf1-4ac0-9330-9b370dcde8d1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1719-07-09\",\n \"dateOfUpdate\": \"1775-02-29\",\n \"effectiveStartDate\": \"1337-09-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"c10af0ce-c236-44ce-845c-b8cadbce6fdc\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2338-07-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2363-03-09\",\n \"dateOfUpdate\": \"1448-10-07\",\n \"effectiveStartDate\": \"1463-11-05\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b5030f3c-0b69-44a2-b5e2-2d9af36729b2\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2267-09-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2763-10-30\",\n \"dateOfIssuance\": \"1261-01-28\",\n \"dateOfRenewal\": \"1195-01-01\",\n \"dateOfUpdate\": \"1249-09-09\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1486-11-31\",\n \"jurisdiction\": \"ia\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2078-11-25\",\n \"dateOfIssuance\": \"1569-10-08\",\n \"dateOfRenewal\": \"2275-01-04\",\n \"dateOfUpdate\": \"1654-12-26\",\n \"licenseJurisdiction\": \"al\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"wv\",\n \"type\": \"privilege\",\n \"providerId\": \"f9f3257a-9970-46ed-acc1-5eab86c2784a\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"wi\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ri\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2211-05-31\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1652-01-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"5b89ec0b-a1c6-47c4-aedf-caa359ae43c0\",\n \"dateOfRenewal\": \"1861-04-16\",\n \"dateOfUpdate\": \"1013-11-31\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2590-05-29\",\n \"jurisdiction\": \"vi\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1064-11-20\",\n \"dateOfIssuance\": \"2114-08-08\",\n \"dateOfRenewal\": \"2712-02-31\",\n \"dateOfUpdate\": \"2158-07-11\",\n \"licenseJurisdiction\": \"me\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"me\",\n \"type\": \"privilege\",\n \"providerId\": \"5fe80401-0e3e-4a36-9a56-af61de35f8e8\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"in\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"mt\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1886-01-30\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2417-11-03\",\n \"privilegeId\": \"\",\n \"providerId\": \"178390a0-5a4b-45b2-9afc-656dda9cc944\",\n \"dateOfRenewal\": \"2471-05-21\",\n \"dateOfUpdate\": \"2374-05-03\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"co\",\n \"licenseJurisdiction\": \"ri\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"f589feb0-0b5d-422f-bfa5-22f6148ab000\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"2151-12-27\",\n \"dateOfUpdate\": \"1274-09-16\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"providerId\": \"502fa533-6404-4015-98cb-3ea31f712b50\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2213-12-30\",\n \"dateOfUpdate\": \"2874-12-02\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"dc\",\n \"licenseType\": \"\",\n \"providerId\": \"34c1a3d8-5126-4b79-8a48-19cea570fe27\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1844-08-20\",\n \"dateOfUpdate\": \"1322-08-31\",\n \"effectiveStartDate\": \"2568-10-17\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b4ff6bff-d64a-4eb1-af10-71cc6c88ccb5\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2394-05-26\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2005-03-17\",\n \"dateOfUpdate\": \"2353-10-31\",\n \"effectiveStartDate\": \"2845-08-09\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a22264d8-a601-437f-b63e-97e94590f052\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2214-02-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"2e0d1636-20d0-40bc-bddf-ed8c8b77e276\",\n \"type\": \"provider\",\n \"npi\": \"8740369942\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1097-12-19\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"nj\",\n \"ssnLastFour\": \"6550\",\n \"licenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"01-02\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"2154-11-02\",\n \"dateOfUpdate\": \"2104-08-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ok\",\n \"licenses\": [\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2825-07-31\",\n \"dateOfIssuance\": \"2000-12-07\",\n \"dateOfRenewal\": \"2674-07-30\",\n \"dateOfUpdate\": \"2435-09-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1805-04-11\",\n \"jurisdiction\": \"tx\",\n \"previous\": {\n \"dateOfExpiration\": \"1501-06-03\",\n \"dateOfIssuance\": \"1212-11-31\",\n \"dateOfRenewal\": \"1829-03-07\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5428549691\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1502-04-05\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+4481600167198\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0547502503\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1117-03-06\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1631-12-01\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2652-02-25\",\n \"phoneNumber\": \"+73039722088\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1895-11-03\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2984-07-05\",\n \"jurisdiction\": \"ca\",\n \"previous\": {\n \"dateOfExpiration\": \"1153-11-18\",\n \"dateOfIssuance\": \"1339-01-30\",\n \"dateOfRenewal\": \"2929-02-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4516097308\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2539-02-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+00423252\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9173380936\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1285-01-19\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1319-01-25\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1433-11-31\",\n \"phoneNumber\": \"+223839924\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1440-10-04\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"wi\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"37ee6863-6b41-48a7-b775-c54e81b99b1d\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1096-12-22\",\n \"dateOfUpdate\": \"2489-08-04\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"providerId\": \"47b221bd-0571-404a-a809-21ce1cc5b48e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1984-02-07\",\n \"dateOfUpdate\": \"1977-12-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"1b092c99-6b34-44ed-bc50-624472be234b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8344660809\",\n \"dateOfBirth\": \"1428-04-24\",\n \"ssnLastFour\": \"9275\",\n \"phoneNumber\": \"+862914303\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2280-10-07\",\n \"dateOfUpdate\": \"1531-10-11\",\n \"effectiveStartDate\": \"2671-10-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b5f69573-08c7-4c04-93fa-a898126ba6cc\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2769-09-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2179-11-31\",\n \"dateOfUpdate\": \"2605-12-29\",\n \"effectiveStartDate\": \"2811-09-09\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8e21a34e-b2d4-4f01-af21-51ac3e8aa5d8\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1876-09-27\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2484-11-06\",\n \"dateOfIssuance\": \"2211-02-18\",\n \"dateOfRenewal\": \"2332-08-06\",\n \"dateOfUpdate\": \"1945-10-13\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2827-11-02\",\n \"jurisdiction\": \"vi\",\n \"previous\": {\n \"dateOfExpiration\": \"1586-12-06\",\n \"dateOfIssuance\": \"2434-09-31\",\n \"dateOfRenewal\": \"1698-04-01\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8029916107\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2457-08-08\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+572834790400\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7167564830\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1886-04-01\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2329-05-14\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2349-10-03\",\n \"phoneNumber\": \"+917875436006687\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2204-11-31\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2174-05-31\",\n \"jurisdiction\": \"fl\",\n \"previous\": {\n \"dateOfExpiration\": \"1431-12-11\",\n \"dateOfIssuance\": \"2888-12-30\",\n \"dateOfRenewal\": \"1245-11-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6965680746\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2766-11-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+64811211786\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2319157496\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2034-10-30\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1319-09-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2907-08-20\",\n \"phoneNumber\": \"+958705938\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1178-12-13\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"middleName\": \"\",\n \"providerId\": \"c14be4f3-0363-49f5-b4a8-0ce2590aab82\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2207-03-21\",\n \"dateOfUpdate\": \"1304-08-03\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"bf1b4b3c-e9cf-4d3c-8ac3-60a1e9b7f197\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2190-10-03\",\n \"dateOfUpdate\": \"1696-11-06\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"providerId\": \"f9894d80-700a-4848-ba6d-23f37aa109cf\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"7989243429\",\n \"dateOfBirth\": \"1650-09-30\",\n \"ssnLastFour\": \"7179\",\n \"phoneNumber\": \"+23505233735\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2005-12-08\",\n \"dateOfUpdate\": \"1492-09-09\",\n \"effectiveStartDate\": \"1317-11-22\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4b722575-5cc8-4f49-aaa8-48b5459a3894\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1270-11-11\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1641-04-30\",\n \"dateOfUpdate\": \"1530-05-23\",\n \"effectiveStartDate\": \"2272-12-03\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"35a42eda-3ce7-402d-9112-a985ea67fb87\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1595-02-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1615-04-30\",\n \"dateOfUpload\": \"1224-12-31\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"95348a64-0e45-4101-95ae-b98b0005475b\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1233-10-14\",\n \"dateOfUpload\": \"2903-10-20\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"105eb690-6fce-4650-be97-168296d0d4d0\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"dc\",\n \"wy\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2523-09-31\",\n \"dateOfIssuance\": \"1926-05-27\",\n \"dateOfRenewal\": \"1608-11-30\",\n \"dateOfUpdate\": \"2793-11-31\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1404-12-30\",\n \"jurisdiction\": \"or\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1599-12-31\",\n \"dateOfIssuance\": \"2843-03-31\",\n \"dateOfRenewal\": \"1115-01-17\",\n \"dateOfUpdate\": \"2543-05-01\",\n \"licenseJurisdiction\": \"sc\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ms\",\n \"type\": \"privilege\",\n \"providerId\": \"890b5c10-fe97-463a-be4a-37e4374d8278\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"mn\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wa\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1174-12-31\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2534-10-18\",\n \"privilegeId\": \"\",\n \"providerId\": \"1ff3f039-ae34-4bb0-be85-f5729aed7fba\",\n \"dateOfRenewal\": \"2257-05-10\",\n \"dateOfUpdate\": \"1467-12-31\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1749-09-31\",\n \"jurisdiction\": \"ny\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1847-02-11\",\n \"dateOfIssuance\": \"2425-10-08\",\n \"dateOfRenewal\": \"2872-08-31\",\n \"dateOfUpdate\": \"2671-04-18\",\n \"licenseJurisdiction\": \"sd\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ky\",\n \"type\": \"privilege\",\n \"providerId\": \"24c41f5b-5363-444b-a127-fbf286dc9772\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"nv\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ct\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2046-12-05\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1503-11-15\",\n \"privilegeId\": \"\",\n \"providerId\": \"f1cb40c0-682e-4641-999a-f4d5c9096486\",\n \"dateOfRenewal\": \"2583-11-31\",\n \"dateOfUpdate\": \"2680-11-07\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"id\",\n \"licenseJurisdiction\": \"ny\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"aa251ae7-c0c2-4be7-b619-2c14f5cc5a0c\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1078-06-30\",\n \"dateOfUpdate\": \"1718-02-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"95b2a3e4-9bf4-41ab-a243-9e4b9cdfbba9\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2757-11-02\",\n \"dateOfUpdate\": \"2309-10-01\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"2f3dafbe-8ec7-4176-ba8c-eb6aea8616f1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1337-12-01\",\n \"dateOfUpdate\": \"1361-07-31\",\n \"effectiveStartDate\": \"2738-07-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"54696fdf-7347-48fa-9fc4-45927106c14e\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2202-05-13\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1217-05-08\",\n \"dateOfUpdate\": \"2667-09-02\",\n \"effectiveStartDate\": \"1580-03-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"fl\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"ad99d20b-5a86-4d8a-8831-94ec74f169dc\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2728-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2932-10-22\",\n \"dateOfIssuance\": \"1744-03-30\",\n \"dateOfRenewal\": \"1834-03-03\",\n \"dateOfUpdate\": \"2069-11-27\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1377-12-25\",\n \"jurisdiction\": \"ma\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2170-10-27\",\n \"dateOfIssuance\": \"1975-10-12\",\n \"dateOfRenewal\": \"1382-08-20\",\n \"dateOfUpdate\": \"2716-08-17\",\n \"licenseJurisdiction\": \"tx\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ak\",\n \"type\": \"privilege\",\n \"providerId\": \"bac9f437-6759-45a9-a357-4e8e59062df8\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ct\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"fl\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2467-06-02\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2476-01-04\",\n \"privilegeId\": \"\",\n \"providerId\": \"0ae226ca-e340-4af8-8cd3-7d6d46527078\",\n \"dateOfRenewal\": \"2810-05-21\",\n \"dateOfUpdate\": \"2411-10-11\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1390-10-28\",\n \"jurisdiction\": \"de\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2882-02-05\",\n \"dateOfIssuance\": \"1279-01-20\",\n \"dateOfRenewal\": \"2220-11-31\",\n \"dateOfUpdate\": \"2016-10-31\",\n \"licenseJurisdiction\": \"al\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"nj\",\n \"type\": \"privilege\",\n \"providerId\": \"51843ad9-89e6-41db-a24c-cc373e61551c\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"expiration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pa\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"la\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1807-08-24\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2286-09-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"044017cd-c945-4679-a26a-e0f3bf8d362c\",\n \"dateOfRenewal\": \"2219-05-24\",\n \"dateOfUpdate\": \"1832-10-05\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ky\",\n \"licenseJurisdiction\": \"ok\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"d2aabf6a-a1ea-4230-ada7-f41d2785c679\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1239-07-04\",\n \"dateOfUpdate\": \"2383-10-08\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"1424fde8-e2a8-4a06-b056-e738ba92f4d9\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1215-11-05\",\n \"dateOfUpdate\": \"1335-04-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"providerId\": \"2e9706be-6b29-4517-8ed7-1006d00f2f22\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2188-10-16\",\n \"dateOfUpdate\": \"1071-12-31\",\n \"effectiveStartDate\": \"2637-12-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e8f64c1c-18bb-4fbc-b001-7eba71a222aa\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2555-12-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1479-12-30\",\n \"dateOfUpdate\": \"1040-01-01\",\n \"effectiveStartDate\": \"2370-06-15\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1d70365a-74a7-4340-8ac4-52486faa7771\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1460-02-01\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"8abe5187-9b27-4f61-9e90-c61c1864f19a\",\n \"type\": \"provider\",\n \"npi\": \"3521472876\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2029-12-20\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"wv\",\n \"ssnLastFour\": \"1933\",\n \"licenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -4378,7 +4430,7 @@ "value": "application/json" } ], - "id": "3667e215-8b54-4c27-88e4-72d845d53a03", + "id": "4b12bfec-3a1b-4576-9a13-54a88929e789", "name": "200 response", "originalRequest": { "body": {}, @@ -4419,7 +4471,7 @@ "item": [ { "event": [], - "id": "f3054452-1b84-4336-a796-3f4f20bd4c6e", + "id": "caaf2c05-30ad-483f-86c6-b879c0a721f9", "name": "/v1/provider-users/me/email", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4474,7 +4526,7 @@ "value": "application/json" } ], - "id": "5b0a710e-fa84-4d2a-8467-a06f48914dde", + "id": "93b64f5d-f870-46fa-8ab5-d20f616a8f80", "name": "200 response", "originalRequest": { "body": { @@ -4529,7 +4581,7 @@ "item": [ { "event": [], - "id": "24681938-3e42-4463-922b-b594df044176", + "id": "cdf02898-bb40-492d-914d-068562a6301d", "name": "/v1/provider-users/me/email/verify", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4543,7 +4595,7 @@ "language": "json" } }, - "raw": "{\n \"verificationCode\": \"8530\"\n}" + "raw": "{\n \"verificationCode\": \"3579\"\n}" }, "description": {}, "header": [ @@ -4585,7 +4637,7 @@ "value": "application/json" } ], - "id": "d10c3993-f6cd-4969-9583-f3b88d4cd1a1", + "id": "30567f56-b0cd-433a-9b41-b78e93c544e3", "name": "200 response", "originalRequest": { "body": { @@ -4596,7 +4648,7 @@ "language": "json" } }, - "raw": "{\n \"verificationCode\": \"8530\"\n}" + "raw": "{\n \"verificationCode\": \"3579\"\n}" }, "header": [ { @@ -4647,7 +4699,7 @@ "item": [ { "event": [], - "id": "01f2b564-6375-48ee-8d46-08e2e69f4017", + "id": "feb063f0-de5d-4be6-a90b-75d4a5c0b297", "name": "/v1/provider-users/me/home-jurisdiction", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4661,7 +4713,7 @@ "language": "json" } }, - "raw": "{\n \"jurisdiction\": \"ar\"\n}" + "raw": "{\n \"jurisdiction\": \"ky\"\n}" }, "description": {}, "header": [ @@ -4702,7 +4754,7 @@ "value": "application/json" } ], - "id": "7463b951-614a-411e-a9ba-1e8b4498d6fe", + "id": "2d81fc27-6171-4a56-8aeb-d3176405a5a8", "name": "200 response", "originalRequest": { "body": { @@ -4713,7 +4765,7 @@ "language": "json" } }, - "raw": "{\n \"jurisdiction\": \"ar\"\n}" + "raw": "{\n \"jurisdiction\": \"ky\"\n}" }, "header": [ { @@ -4772,7 +4824,7 @@ "item": [ { "event": [], - "id": "12079934-a9db-43ad-ad15-98ccbbc40285", + "id": "e5157e92-7aac-4a13-b427-fb3aa05b60f8", "name": "/v1/provider-users/me/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4830,7 +4882,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"1842-12-05\",\n \"dateOfUpdate\": \"1852-11-12\",\n \"effectiveDate\": \"1264-12-02\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"1753-11-03\",\n \"dateOfUpdate\": \"2153-02-25\",\n \"effectiveDate\": \"2283-12-17\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"166186cd-ab85-40e5-82dd-e841e1d92faf\"\n}", + "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"2530-10-09\",\n \"dateOfUpdate\": \"1693-03-31\",\n \"effectiveDate\": \"1260-11-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2291-10-30\",\n \"dateOfUpdate\": \"1104-10-30\",\n \"effectiveDate\": \"1943-03-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"va\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"61c5d582-0230-461d-84c5-cfed6b3d5e7d\"\n}", "code": 200, "cookie": [], "header": [ @@ -4839,7 +4891,7 @@ "value": "application/json" } ], - "id": "70bc1cd2-3de2-4a6c-974b-e92fd977aecf", + "id": "0d08e47b-addd-4e55-8c2e-b0767b5694a9", "name": "200 response", "originalRequest": { "body": {}, @@ -4900,7 +4952,7 @@ "item": [ { "event": [], - "id": "f9431cfd-4712-459a-89ad-fc85ec5f87a4", + "id": "2af4ef4e-c2bf-41b6-8e33-fc118d836448", "name": "/v1/provider-users/me/military-affiliation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4946,7 +4998,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"affiliationType\": \"militaryMemberSpouse\",\n \"dateOfUpdate\": \"2829-03-10\",\n \"dateOfUpload\": \"2267-09-30\",\n \"documentUploadFields\": [\n {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n },\n {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n }\n ],\n \"status\": \"\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}", + "body": "{\n \"affiliationType\": \"militaryMemberSpouse\",\n \"dateOfUpdate\": \"1068-11-30\",\n \"dateOfUpload\": \"2873-01-01\",\n \"documentUploadFields\": [\n {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n },\n {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n }\n ],\n \"status\": \"\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -4955,7 +5007,7 @@ "value": "application/json" } ], - "id": "e15bdadc-8785-4ff9-8f87-886210361d7f", + "id": "584c3b01-7842-4f9a-8147-a563cd50aab3", "name": "200 response", "originalRequest": { "body": { @@ -5007,7 +5059,7 @@ }, { "event": [], - "id": "08a324bb-58cc-43d7-9749-653992a2b0d3", + "id": "df516c6d-b450-4d5d-81ef-d8cdebbd5b96", "name": "/v1/provider-users/me/military-affiliation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5062,7 +5114,7 @@ "value": "application/json" } ], - "id": "225cf278-f91c-480f-9b09-9f002553deca", + "id": "2d17c0cf-9035-4a78-975c-ec1a2152c7aa", "name": "200 response", "originalRequest": { "body": { @@ -5123,7 +5175,7 @@ "item": [ { "event": [], - "id": "25a746be-6881-408e-beda-f5a3038ad4fb", + "id": "dc5a11c1-ffee-46b3-9a98-f5a24d7cf290", "name": "/v1/provider-users/registration", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5140,7 +5192,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"\",\n \"dob\": \"1977-11-05\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"wi\",\n \"licenseType\": \"audiologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" + "raw": "{\n \"compact\": \"\",\n \"dob\": \"2941-10-30\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" }, "description": {}, "header": [ @@ -5180,7 +5232,7 @@ "value": "application/json" } ], - "id": "1c66d641-7d2b-40fa-a7ea-4d4c65a1bf51", + "id": "3995057e-2366-438d-8e4a-bd1e1a8397f7", "name": "200 response", "originalRequest": { "body": { @@ -5191,7 +5243,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"\",\n \"dob\": \"1977-11-05\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"wi\",\n \"licenseType\": \"audiologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" + "raw": "{\n \"compact\": \"\",\n \"dob\": \"2941-10-30\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" }, "header": [ { @@ -5229,7 +5281,7 @@ "item": [ { "event": [], - "id": "753244ff-7c2d-4aa1-9833-5eec96974672", + "id": "492f106a-87a2-4dcd-9b68-79dec8d2430a", "name": "/v1/provider-users/verifyRecovery", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5246,7 +5298,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"aslp\",\n \"providerId\": \"8b317c31-6983-412d-9b84-9d433c0a62c2\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" + "raw": "{\n \"compact\": \"octp\",\n \"providerId\": \"0a4a1345-30cb-4f49-838f-49c097d4989c\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" }, "description": {}, "header": [ @@ -5286,7 +5338,7 @@ "value": "application/json" } ], - "id": "7dfaee0c-2189-4255-8391-91e7a70ad51f", + "id": "147b8ed4-1100-4aec-9471-4ca26611d748", "name": "200 response", "originalRequest": { "body": { @@ -5297,7 +5349,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"aslp\",\n \"providerId\": \"8b317c31-6983-412d-9b84-9d433c0a62c2\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" + "raw": "{\n \"compact\": \"octp\",\n \"providerId\": \"0a4a1345-30cb-4f49-838f-49c097d4989c\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" }, "header": [ { @@ -5347,7 +5399,7 @@ "item": [ { "event": [], - "id": "2d3d5254-a7a9-44fd-9a74-0715f24c240c", + "id": "3995e65f-482f-4954-b9ae-97fcc4d55e59", "name": "/v1/public/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5404,7 +5456,7 @@ "value": "application/json" } ], - "id": "14acdcba-3ce8-4241-8940-de6de4f1a9b6", + "id": "281de5bd-34fb-4d95-83e1-db3a2b47b0ac", "name": "200 response", "originalRequest": { "body": {}, @@ -5445,7 +5497,7 @@ "item": [ { "event": [], - "id": "1619fce1-f2c7-4cc1-87be-53947951fd7a", + "id": "612e723c-eb1f-49fd-a686-3a79b62755ab", "name": "/v1/public/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5462,7 +5514,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"4fd693ec-a06a-4754-b007-d43a2262427e\",\n \"jurisdiction\": \"ar\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"6136f0f6-4808-421f-8960-c82a8032fa55\",\n \"jurisdiction\": \"vi\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -5507,7 +5559,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"octp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"sd\",\n \"privilegeJurisdictions\": [\n \"id\",\n \"ri\"\n ],\n \"providerId\": \"23da1b49-a133-4b58-a1f6-81a4ff267c45\",\n \"type\": \"provider\",\n \"npi\": \"0159359794\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ok\",\n \"dateOfUpdate\": \"1502-07-31\"\n },\n {\n \"compact\": \"coun\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"az\",\n \"privilegeJurisdictions\": [\n \"mn\",\n \"la\"\n ],\n \"providerId\": \"66414a03-319d-44b0-8ad8-e942ce6eb46e\",\n \"type\": \"provider\",\n \"npi\": \"7040756192\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"mn\",\n \"dateOfUpdate\": \"1775-05-09\"\n }\n ],\n \"query\": {\n \"providerId\": \"27e8a887-212f-48b9-a010-e75ddf8fde12\",\n \"jurisdiction\": \"nm\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"octp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"md\",\n \"privilegeJurisdictions\": [\n \"wi\",\n \"ia\"\n ],\n \"providerId\": \"1838012b-65fa-4e9a-81cd-0317017f72f6\",\n \"type\": \"provider\",\n \"npi\": \"5747287621\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ks\",\n \"dateOfUpdate\": \"1211-12-30\"\n },\n {\n \"compact\": \"coun\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"nh\",\n \"privilegeJurisdictions\": [\n \"tn\",\n \"mi\"\n ],\n \"providerId\": \"a3d0b23c-87cd-470b-8045-8a1cbf336b9c\",\n \"type\": \"provider\",\n \"npi\": \"4657254106\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"tx\",\n \"dateOfUpdate\": \"2463-04-23\"\n }\n ],\n \"query\": {\n \"providerId\": \"bada7cf7-cc56-4344-8073-993098bf8d03\",\n \"jurisdiction\": \"il\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -5516,7 +5568,7 @@ "value": "application/json" } ], - "id": "c497fe22-ee3e-48b8-a4a0-39a8847fa306", + "id": "94339fd0-8b57-466e-a4f8-e7efac900094", "name": "200 response", "originalRequest": { "body": { @@ -5527,7 +5579,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"4fd693ec-a06a-4754-b007-d43a2262427e\",\n \"jurisdiction\": \"ar\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"6136f0f6-4808-421f-8960-c82a8032fa55\",\n \"jurisdiction\": \"vi\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -5568,7 +5620,7 @@ "item": [ { "event": [], - "id": "096f4eee-cbea-462d-9cd4-b105e256b78e", + "id": "11a358e7-ce5a-41d1-9537-a481469b5e12", "name": "/v1/public/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5627,7 +5679,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1117-11-06\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ks\",\n \"privilegeJurisdictions\": [\n \"la\",\n \"ca\"\n ],\n \"providerId\": \"8cb5ffb0-34a0-48db-89eb-9ed76c6fb609\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"aslp\",\n \"dateOfExpiration\": \"1684-11-03\",\n \"dateOfIssuance\": \"2013-02-31\",\n \"dateOfRenewal\": \"2125-10-06\",\n \"dateOfUpdate\": \"2640-09-31\",\n \"jurisdiction\": \"fl\",\n \"licenseJurisdiction\": \"sc\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"3c2d4676-89f0-4a46-9462-8b3580be186b\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1289-02-02\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"occupational therapy assistant\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1365-04-31\",\n \"dateOfIssuance\": \"2490-01-23\",\n \"dateOfRenewal\": \"1080-12-02\",\n \"dateOfUpdate\": \"2523-10-23\",\n \"licenseJurisdiction\": \"oh\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"a5a0c574-2f78-4d8a-9c8e-6bfe549b9bcf\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2691-01-05\",\n \"licenseJurisdiction\": \"nj\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2921-02-31\",\n \"dateOfIssuance\": \"1503-06-12\",\n \"dateOfUpdate\": \"2961-10-05\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1961-11-23\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"audiologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2123-09-26\",\n \"dateOfIssuance\": \"2454-06-01\",\n \"dateOfRenewal\": \"1783-11-14\",\n \"dateOfUpdate\": \"2109-12-01\",\n \"licenseJurisdiction\": \"pa\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"686e64b5-7c03-4b2b-9aa3-58db230b1ad8\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1997-11-30\",\n \"licenseJurisdiction\": \"nv\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2909-09-30\",\n \"dateOfIssuance\": \"2620-03-24\",\n \"dateOfUpdate\": \"1794-03-31\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2925-11-01\",\n \"dateOfUpdate\": \"1319-06-19\",\n \"effectiveStartDate\": \"1931-09-31\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"65ba153e-644b-433f-8a94-099fd47ea8a7\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2525-04-08\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2593-11-17\",\n \"dateOfUpdate\": \"1124-10-02\",\n \"effectiveStartDate\": \"1339-12-04\",\n \"jurisdiction\": \"ia\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"d5b96fcc-86c7-49ea-bbc6-b40ec6a54c69\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1737-11-31\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"aslp\",\n \"dateOfExpiration\": \"2638-03-30\",\n \"dateOfIssuance\": \"1750-04-29\",\n \"dateOfRenewal\": \"2260-11-08\",\n \"dateOfUpdate\": \"2291-10-06\",\n \"jurisdiction\": \"id\",\n \"licenseJurisdiction\": \"sc\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"4b2b36e5-eb41-42b1-8ec0-8d6ab64ed510\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2598-12-25\",\n \"jurisdiction\": \"me\",\n \"licenseType\": \"audiologist\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2162-01-31\",\n \"dateOfIssuance\": \"2002-11-01\",\n \"dateOfRenewal\": \"1421-05-14\",\n \"dateOfUpdate\": \"1410-10-28\",\n \"licenseJurisdiction\": \"mo\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"5882a0ce-4c3e-45a7-a7bd-30540908a329\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1975-08-03\",\n \"licenseJurisdiction\": \"ak\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2519-08-11\",\n \"dateOfIssuance\": \"1721-12-04\",\n \"dateOfUpdate\": \"2293-08-01\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2309-09-25\",\n \"jurisdiction\": \"pa\",\n \"licenseType\": \"licensed professional counselor\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1183-12-09\",\n \"dateOfIssuance\": \"1840-12-30\",\n \"dateOfRenewal\": \"1109-12-30\",\n \"dateOfUpdate\": \"1933-10-31\",\n \"licenseJurisdiction\": \"tx\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"3f67d350-83ba-49b8-9649-52ce18810fbc\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1672-05-31\",\n \"licenseJurisdiction\": \"mt\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1235-05-05\",\n \"dateOfIssuance\": \"1372-09-13\",\n \"dateOfUpdate\": \"2999-04-21\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2902-08-07\",\n \"dateOfUpdate\": \"2949-10-27\",\n \"effectiveStartDate\": \"1685-07-06\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"0f6663ef-fc62-4f77-95fa-f37d628ad08c\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2193-12-09\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2153-11-04\",\n \"dateOfUpdate\": \"2236-12-31\",\n \"effectiveStartDate\": \"1160-01-07\",\n \"jurisdiction\": \"dc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a7238d87-4354-4beb-9318-e864f856ff4b\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1078-04-01\"\n }\n ]\n }\n ],\n \"npi\": \"5774274964\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"nj\",\n \"middleName\": \"\"\n}", + "body": "{\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2224-08-22\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"id\",\n \"privilegeJurisdictions\": [\n \"in\",\n \"nh\"\n ],\n \"providerId\": \"12ab9ce3-8189-4adb-81c4-a3b3a504e961\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"2656-07-31\",\n \"dateOfIssuance\": \"1305-09-31\",\n \"dateOfRenewal\": \"1544-04-21\",\n \"dateOfUpdate\": \"2990-10-31\",\n \"jurisdiction\": \"nv\",\n \"licenseJurisdiction\": \"ia\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"fb0e75c5-f980-4516-b0d9-d1e95681c285\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2888-12-02\",\n \"jurisdiction\": \"pr\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2575-10-15\",\n \"dateOfIssuance\": \"1814-08-09\",\n \"dateOfRenewal\": \"2468-05-15\",\n \"dateOfUpdate\": \"2383-12-12\",\n \"licenseJurisdiction\": \"ak\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"701befe1-a04f-4d92-af8b-d8d9e6c86b57\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1864-06-07\",\n \"licenseJurisdiction\": \"ny\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1978-09-26\",\n \"dateOfIssuance\": \"2178-10-31\",\n \"dateOfUpdate\": \"2422-05-14\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2766-07-31\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2351-10-12\",\n \"dateOfIssuance\": \"1032-10-14\",\n \"dateOfRenewal\": \"2370-11-17\",\n \"dateOfUpdate\": \"1749-01-17\",\n \"licenseJurisdiction\": \"ct\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"0092eb5e-b8b3-42ce-873e-4eb5f565dd01\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2223-07-30\",\n \"licenseJurisdiction\": \"nj\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1830-12-30\",\n \"dateOfIssuance\": \"1692-11-01\",\n \"dateOfUpdate\": \"2346-10-30\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1386-10-11\",\n \"dateOfUpdate\": \"1266-10-02\",\n \"effectiveStartDate\": \"1270-10-30\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"f2127279-7c8e-409f-86f1-362158a3acb7\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2313-11-20\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2881-04-03\",\n \"dateOfUpdate\": \"1464-12-31\",\n \"effectiveStartDate\": \"2115-09-07\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"d441dfd3-ce8e-447e-8020-46f92301348f\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1534-10-31\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"aslp\",\n \"dateOfExpiration\": \"1376-12-30\",\n \"dateOfIssuance\": \"2464-03-25\",\n \"dateOfRenewal\": \"2114-01-31\",\n \"dateOfUpdate\": \"1702-06-07\",\n \"jurisdiction\": \"ok\",\n \"licenseJurisdiction\": \"ma\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"1836f8a0-1ed3-4f13-a145-4db42c04ce7d\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2305-01-27\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1798-10-05\",\n \"dateOfIssuance\": \"1751-04-22\",\n \"dateOfRenewal\": \"1479-12-30\",\n \"dateOfUpdate\": \"1948-02-14\",\n \"licenseJurisdiction\": \"pa\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"e897be14-d79c-4a19-8d18-47aa105a344e\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1412-07-23\",\n \"licenseJurisdiction\": \"ga\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1725-12-13\",\n \"dateOfIssuance\": \"1711-12-30\",\n \"dateOfUpdate\": \"1536-09-30\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1737-12-31\",\n \"jurisdiction\": \"ia\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1962-12-16\",\n \"dateOfIssuance\": \"2300-06-17\",\n \"dateOfRenewal\": \"2369-11-07\",\n \"dateOfUpdate\": \"2736-10-03\",\n \"licenseJurisdiction\": \"ok\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"69d043d3-e711-4b7b-89ec-1b3e9d21336e\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1754-11-25\",\n \"licenseJurisdiction\": \"ca\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2293-06-31\",\n \"dateOfIssuance\": \"1260-07-24\",\n \"dateOfUpdate\": \"2689-11-04\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1066-03-12\",\n \"dateOfUpdate\": \"2000-11-30\",\n \"effectiveStartDate\": \"1064-02-31\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"2f02dca3-03d0-454e-bbc1-6a478dc7de88\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2880-08-01\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2185-08-25\",\n \"dateOfUpdate\": \"2724-03-15\",\n \"effectiveStartDate\": \"1098-08-04\",\n \"jurisdiction\": \"in\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"033fe707-e154-48a3-8f78-9abcf7f733a9\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2637-10-30\"\n }\n ]\n }\n ],\n \"npi\": \"9555934309\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"id\",\n \"middleName\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -5636,7 +5688,7 @@ "value": "application/json" } ], - "id": "82ce20fc-813c-4cdb-9788-2b1496878215", + "id": "c60dd54a-6ca3-4404-bdf8-a61354e90af7", "name": "200 response", "originalRequest": { "body": {}, @@ -5684,7 +5736,7 @@ "item": [ { "event": [], - "id": "40584011-f2b2-4cd0-9f6e-8aea9e7e8328", + "id": "bc4c9c45-d07f-4917-9bee-eb5a13201fc2", "name": "/v1/public/compacts/:compact/providers/:providerId/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5768,7 +5820,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"1842-12-05\",\n \"dateOfUpdate\": \"1852-11-12\",\n \"effectiveDate\": \"1264-12-02\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"1753-11-03\",\n \"dateOfUpdate\": \"2153-02-25\",\n \"effectiveDate\": \"2283-12-17\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"166186cd-ab85-40e5-82dd-e841e1d92faf\"\n}", + "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"2530-10-09\",\n \"dateOfUpdate\": \"1693-03-31\",\n \"effectiveDate\": \"1260-11-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2291-10-30\",\n \"dateOfUpdate\": \"1104-10-30\",\n \"effectiveDate\": \"1943-03-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"va\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"61c5d582-0230-461d-84c5-cfed6b3d5e7d\"\n}", "code": 200, "cookie": [], "header": [ @@ -5777,7 +5829,7 @@ "value": "application/json" } ], - "id": "48d5fd14-a9b7-48d3-9d51-b6567a0206bf", + "id": "fd2f7037-0178-44f8-8d01-bd8b8d81f585", "name": "200 response", "originalRequest": { "body": {}, @@ -5851,7 +5903,7 @@ "item": [ { "event": [], - "id": "44514be9-2e60-4d0a-9bad-790fafe499f7", + "id": "de736016-c62a-486d-812b-03b03fd71571", "name": "/v1/purchases/privileges", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5865,7 +5917,7 @@ "language": "json" } }, - "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"3869791286\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"7\"\n }\n ],\n \"licenseType\": \"occupational therapist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"mo\",\n \"sc\"\n ]\n}" + "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"328125517\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"17034952\"\n }\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"ak\",\n \"ks\"\n ]\n}" }, "description": {}, "header": [ @@ -5905,7 +5957,7 @@ "value": "application/json" } ], - "id": "49ed818c-8b07-443a-ba79-15421362a14c", + "id": "3978b5de-e3d5-43fa-adff-c24c972eec6b", "name": "200 response", "originalRequest": { "body": { @@ -5916,7 +5968,7 @@ "language": "json" } }, - "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"3869791286\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"7\"\n }\n ],\n \"licenseType\": \"occupational therapist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"mo\",\n \"sc\"\n ]\n}" + "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"328125517\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"17034952\"\n }\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"ak\",\n \"ks\"\n ]\n}" }, "header": [ { @@ -5959,7 +6011,7 @@ "item": [ { "event": [], - "id": "f4be24db-1714-4c54-bcec-bcf013907fb3", + "id": "f8bc4790-ff43-48cb-b0bc-ec9a6ccf9a0b", "name": "/v1/purchases/privileges/options", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6001,7 +6053,7 @@ "value": "application/json" } ], - "id": "7f8ba0cf-3337-4214-abc9-626d06d34a51", + "id": "34742561-411b-43f4-b95f-583d51cdd168", "name": "200 response", "originalRequest": { "body": {}, @@ -6055,7 +6107,7 @@ "item": [ { "event": [], - "id": "76b35efc-c51d-4e40-8e44-6e4aa70b5819", + "id": "4d695c24-ec8d-4563-98d5-72f20ce485eb", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6087,7 +6139,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -6105,7 +6157,7 @@ "value": "" } ], - "id": "0c053351-7bf5-4ebf-8dc4-bc01b05ac993", + "id": "7d60d1d3-7dda-420b-a700-572ac98f748e", "name": "200 response", "originalRequest": { "body": {}, @@ -6150,7 +6202,7 @@ "value": "application/json" } ], - "id": "108b88a2-fffd-48d5-ab43-4186be77cc9b", + "id": "fe8f5932-3039-475f-ba71-07978c848809", "name": "404 response", "originalRequest": { "body": {}, @@ -6188,7 +6240,7 @@ }, { "event": [], - "id": "9b891320-f4b5-4524-bb13-fa7f93db2d81", + "id": "b0a24012-067a-483d-9c7d-1f599ca6be11", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6233,7 +6285,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -6251,7 +6303,7 @@ "value": "" } ], - "id": "4181ffa8-26c1-4d67-8a7e-c62ac17b928a", + "id": "d90b7a70-6e9e-43f0-a5b1-c6c38a2d687d", "name": "200 response", "originalRequest": { "body": { @@ -6309,7 +6361,7 @@ "value": "application/json" } ], - "id": "37e840c2-e11a-47e8-9594-59276387e016", + "id": "f5b3e3a7-6541-46d0-9750-732fcfb6f911", "name": "404 response", "originalRequest": { "body": { diff --git a/backend/compact-connect/docs/postman/postman-collection.json b/backend/compact-connect/docs/postman/postman-collection.json index e09c15499..e68cb4647 100644 --- a/backend/compact-connect/docs/postman/postman-collection.json +++ b/backend/compact-connect/docs/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "4ffde850-2e31-4d40-b408-bf44284027e5", + "_postman_id": "a186affe-3e03-401e-ad71-71ec0790c866", "description": { "content": "", "type": "text/plain" @@ -410,7 +410,7 @@ "item": [ { "event": [], - "id": "2c6e019b-5866-4e05-b885-3a9527f9c89d", + "id": "91e458b7-2019-4f71-afe4-36c51c42212e", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses", "protocolProfileBehavior": { "disableBodyPruning": true @@ -424,7 +424,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2186-12-30\",\n \"dateOfExpiration\": \"1297-05-23\",\n \"dateOfIssuance\": \"1198-10-01\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"ssn\": \"141-52-3497\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1882659917\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+1726008378097\",\n \"dateOfRenewal\": \"2453-07-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2820-07-01\",\n \"dateOfExpiration\": \"1502-02-26\",\n \"dateOfIssuance\": \"1156-04-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"127-00-7002\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1100559306\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+33434454551252\",\n \"dateOfRenewal\": \"2790-10-23\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2015-07-03\",\n \"dateOfExpiration\": \"2926-08-04\",\n \"dateOfIssuance\": \"1235-12-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"ssn\": \"442-95-4572\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1797700392\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+832617283834\",\n \"dateOfRenewal\": \"2973-09-05\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2693-08-05\",\n \"dateOfExpiration\": \"2596-11-30\",\n \"dateOfIssuance\": \"1407-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"900-70-9308\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5624774738\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+422989943153\",\n \"dateOfRenewal\": \"1830-05-25\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "description": {}, "header": [ @@ -488,7 +488,7 @@ "value": "application/json" } ], - "id": "a5746d88-e315-4221-b3f3-22c1f2bd180a", + "id": "32461a54-14c2-4233-a947-996d2396b076", "name": "200 response", "originalRequest": { "body": { @@ -499,7 +499,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2186-12-30\",\n \"dateOfExpiration\": \"1297-05-23\",\n \"dateOfIssuance\": \"1198-10-01\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"ssn\": \"141-52-3497\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1882659917\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+1726008378097\",\n \"dateOfRenewal\": \"2453-07-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2820-07-01\",\n \"dateOfExpiration\": \"1502-02-26\",\n \"dateOfIssuance\": \"1156-04-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"127-00-7002\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1100559306\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+33434454551252\",\n \"dateOfRenewal\": \"2790-10-23\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2015-07-03\",\n \"dateOfExpiration\": \"2926-08-04\",\n \"dateOfIssuance\": \"1235-12-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"ssn\": \"442-95-4572\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1797700392\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+832617283834\",\n \"dateOfRenewal\": \"2973-09-05\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2693-08-05\",\n \"dateOfExpiration\": \"2596-11-30\",\n \"dateOfIssuance\": \"1407-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"900-70-9308\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5624774738\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+422989943153\",\n \"dateOfRenewal\": \"1830-05-25\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -540,7 +540,7 @@ }, { "_postman_previewlanguage": "json", - "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ]\n }\n }\n}", + "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ],\n \"key_2\": [\n \"\",\n \"\"\n ]\n },\n \"key_1\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ]\n },\n \"key_2\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ]\n }\n }\n}", "code": 400, "cookie": [], "header": [ @@ -549,7 +549,7 @@ "value": "application/json" } ], - "id": "b64d8575-a7de-4192-9ff7-084ef92993cc", + "id": "83666665-2080-4300-ab30-a599e6991dad", "name": "400 response", "originalRequest": { "body": { @@ -560,7 +560,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2186-12-30\",\n \"dateOfExpiration\": \"1297-05-23\",\n \"dateOfIssuance\": \"1198-10-01\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"ssn\": \"141-52-3497\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1882659917\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+1726008378097\",\n \"dateOfRenewal\": \"2453-07-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2820-07-01\",\n \"dateOfExpiration\": \"1502-02-26\",\n \"dateOfIssuance\": \"1156-04-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"127-00-7002\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1100559306\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+33434454551252\",\n \"dateOfRenewal\": \"2790-10-23\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2015-07-03\",\n \"dateOfExpiration\": \"2926-08-04\",\n \"dateOfIssuance\": \"1235-12-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"ssn\": \"442-95-4572\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1797700392\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+832617283834\",\n \"dateOfRenewal\": \"2973-09-05\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2693-08-05\",\n \"dateOfExpiration\": \"2596-11-30\",\n \"dateOfIssuance\": \"1407-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"900-70-9308\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5624774738\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+422989943153\",\n \"dateOfRenewal\": \"1830-05-25\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -631,7 +631,7 @@ } } ], - "id": "3f726a1e-bd54-40d2-900c-8fb122413277", + "id": "bc02e8d1-e8f7-4313-af48-20f36d304907", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -688,7 +688,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"upload\": {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n },\n \"url\": \"\"\n }\n}", + "body": "{\n \"upload\": {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\"\n },\n \"url\": \"\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -697,7 +697,7 @@ "value": "application/json" } ], - "id": "414fcab5-d824-4cea-b483-b395d3e02f94", + "id": "c44b8d78-6fb8-4903-a3dc-251fb4a6d1d4", "name": "200 response", "originalRequest": { "body": {}, @@ -751,7 +751,7 @@ "item": [ { "event": [], - "id": "7e62e74b-7856-4df0-8985-e573b5062b1f", + "id": "942c4a23-62fd-4496-bb73-e44c8a7bf132", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -765,7 +765,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"endDateTime\": \"2694-12-31T09:13:37.26Z\",\n \"startDateTime\": \"2494-11-30T10:59:39.31Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"endDateTime\": \"1370-06-03T12:31:16Z\",\n \"startDateTime\": \"1650-07-22T23:34:09Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -821,7 +821,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"09-13\",\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2362-11-07\",\n \"dateOfUpdate\": \"1698-08-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"nd\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"va\",\n \"al\"\n ],\n \"providerId\": \"e7b33416-94a5-4e3c-a417-debd11db980b\",\n \"type\": \"provider\",\n \"npi\": \"5259174764\",\n \"dateOfBirth\": \"2430-03-31\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"3378\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"03-25\",\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2595-08-26\",\n \"dateOfUpdate\": \"1092-12-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"wa\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"mi\",\n \"nc\"\n ],\n \"providerId\": \"0e945647-9632-4ffb-acd1-968675dad2b4\",\n \"type\": \"provider\",\n \"npi\": \"8329161015\",\n \"dateOfBirth\": \"2867-11-30\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"6733\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"03-07\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1677-07-05\",\n \"dateOfUpdate\": \"1174-10-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"de\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"nm\",\n \"ms\"\n ],\n \"providerId\": \"51d36f22-543b-45c6-a2b7-578deecf553b\",\n \"type\": \"provider\",\n \"npi\": \"0347934212\",\n \"dateOfBirth\": \"1297-09-07\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"9761\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"09-00\",\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2751-12-31\",\n \"dateOfUpdate\": \"1256-02-24\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"ma\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"pa\",\n \"il\"\n ],\n \"providerId\": \"a720c210-a2e8-49af-8ace-ba92e70b654c\",\n \"type\": \"provider\",\n \"npi\": \"8243759491\",\n \"dateOfBirth\": \"1009-03-03\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"0369\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -830,7 +830,7 @@ "value": "application/json" } ], - "id": "b6180423-11c7-45cc-922e-12997bfe651c", + "id": "388de3d4-d138-4b93-803d-1c20b277890c", "name": "200 response", "originalRequest": { "body": { @@ -841,7 +841,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"endDateTime\": \"2694-12-31T09:13:37.26Z\",\n \"startDateTime\": \"2494-11-30T10:59:39.31Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"endDateTime\": \"1370-06-03T12:31:16Z\",\n \"startDateTime\": \"1650-07-22T23:34:09Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -891,7 +891,7 @@ "item": [ { "event": [], - "id": "ec0d0478-c440-46a6-9e25-23529369d64a", + "id": "3287d4c9-3fd1-4589-81f0-27a773b95fc4", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -958,7 +958,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"privileges\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2227-07-15\",\n \"dateOfIssuance\": \"1035-06-16\",\n \"dateOfRenewal\": \"1768-03-29\",\n \"dateOfUpdate\": \"1358-12-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ma\",\n \"licenseJurisdiction\": \"ny\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"2f542c8c-2775-44be-8bb1-1c5d39da27eb\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"8972602637\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2989-11-10\",\n \"ssnLastFour\": \"0702\",\n \"phoneNumber\": \"+337895402887836\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1748-04-06\",\n \"dateOfIssuance\": \"2558-11-31\",\n \"dateOfRenewal\": \"1472-10-30\",\n \"dateOfUpdate\": \"1342-09-07\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseJurisdiction\": \"id\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"def3a751-a90f-4521-93dc-0f00a93125f9\",\n \"status\": \"active\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"2014993727\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"1645-10-31\",\n \"ssnLastFour\": \"9904\",\n \"phoneNumber\": \"+70804183895992\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n ],\n \"providerUIUrl\": \"\"\n}", + "body": "{\n \"privileges\": [\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2899-05-06\",\n \"dateOfIssuance\": \"1608-02-30\",\n \"dateOfRenewal\": \"1022-11-28\",\n \"dateOfUpdate\": \"2214-07-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"hi\",\n \"licenseJurisdiction\": \"ky\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"44525f26-3857-4280-a75c-a900ec028790\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"0861420316\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2419-10-31\",\n \"ssnLastFour\": \"0984\",\n \"phoneNumber\": \"+7319658149079\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1096-11-03\",\n \"dateOfIssuance\": \"2080-04-30\",\n \"dateOfRenewal\": \"2959-11-08\",\n \"dateOfUpdate\": \"2914-04-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseJurisdiction\": \"md\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"0bc86198-dfac-4107-8b67-f96e14a55a9d\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"8186342154\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2962-03-30\",\n \"ssnLastFour\": \"1222\",\n \"phoneNumber\": \"+630003948118566\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n ],\n \"providerUIUrl\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -967,7 +967,7 @@ "value": "application/json" } ], - "id": "74af630a-d689-423b-8b04-cff2cbfdf4be", + "id": "e4258b9e-da5b-425f-832d-952fe753ffea", "name": "200 response", "originalRequest": { "body": {}, diff --git a/backend/compact-connect/lambdas/nodejs/tests/email-notification-service.test.ts b/backend/compact-connect/lambdas/nodejs/tests/email-notification-service.test.ts index c86e9aedb..f41619ea1 100644 --- a/backend/compact-connect/lambdas/nodejs/tests/email-notification-service.test.ts +++ b/backend/compact-connect/lambdas/nodejs/tests/email-notification-service.test.ts @@ -1444,4 +1444,638 @@ describe('EmailNotificationServiceLambda', () => { .toThrow('Missing required template variables for providerAccountRecoveryConfirmation template'); }); }); + + describe('License Investigation Provider Notification', () => { + const SAMPLE_LICENSE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT: EmailNotificationEvent = { + template: 'licenseInvestigationProviderNotification', + recipientType: 'SPECIFIC', + compact: 'aslp', + specificEmails: ['provider@example.com'], + templateVariables: { + providerFirstName: 'John', + providerLastName: 'Doe', + investigationJurisdiction: 'OH', + licenseType: 'Audiologist' + } + }; + + it('should successfully send license investigation provider notification email', async () => { + const response = await lambda.handler(SAMPLE_LICENSE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, {} as any); + + expect(response).toEqual({ + message: 'Email message sent' + }); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['provider@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'Your Audiologist license in Ohio is under investigation' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when no recipients found', async () => { + const eventWithNoRecipients: EmailNotificationEvent = { + ...SAMPLE_LICENSE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, + specificEmails: [] + }; + + await expect(lambda.handler(eventWithNoRecipients, {} as any)) + .rejects + .toThrow('No recipients found for license investigation provider notification email'); + }); + + it('should throw error when required template variables are missing', async () => { + const eventWithMissingVariables: EmailNotificationEvent = { + ...SAMPLE_LICENSE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, + templateVariables: {} + }; + + await expect(lambda.handler(eventWithMissingVariables, {} as any)) + .rejects + .toThrow('Missing required template variables for licenseInvestigationProviderNotification template.'); + }); + }); + + describe('License Investigation State Notification', () => { + const SAMPLE_LICENSE_INVESTIGATION_STATE_NOTIFICATION_EVENT: EmailNotificationEvent = { + template: 'licenseInvestigationStateNotification', + recipientType: 'JURISDICTION_ADVERSE_ACTIONS', + compact: 'aslp', + jurisdiction: 'ca', + templateVariables: { + providerFirstName: 'John', + providerLastName: 'Doe', + providerId: 'provider-123', + investigationJurisdiction: 'OH', + licenseType: 'Audiologist' + } + }; + + it('should successfully send license investigation state notification email', async () => { + const mockCaJurisdictionConfig = { + 'pk': { S: 'aslp#CONFIGURATION' }, + 'sk': { S: 'aslp#JURISDICTION#ca' }, + 'jurisdictionAdverseActionsNotificationEmails': { L: [{ S: 'ca-adverse@example.com' }]}, + 'type': { S: 'jurisdiction' } + }; + + const mockOhJurisdictionConfig = { + 'pk': { S: 'aslp#CONFIGURATION' }, + 'sk': { S: 'aslp#JURISDICTION#oh' }, + 'jurisdictionName': { S: 'Ohio' }, + 'type': { S: 'jurisdiction' } + }; + + mockDynamoDBClient.on(GetItemCommand).callsFake((input) => { + if (input.Key.sk.S === 'aslp#JURISDICTION#ca') { + return Promise.resolve({ Item: mockCaJurisdictionConfig }); + } else if (input.Key.sk.S === 'aslp#JURISDICTION#oh') { + return Promise.resolve({ Item: mockOhJurisdictionConfig }); + } + return Promise.resolve({ Item: SAMPLE_COMPACT_CONFIGURATION }); + }); + + const response = await lambda.handler(SAMPLE_LICENSE_INVESTIGATION_STATE_NOTIFICATION_EVENT, {} as any); + + expect(response).toEqual({ + message: 'Email message sent' + }); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['ca-adverse@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('John Doe holding Audiologist license in Ohio is under investigation') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'John Doe holding Audiologist license in Ohio is under investigation' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when jurisdiction is missing', async () => { + const eventWithMissingJurisdiction: EmailNotificationEvent = { + ...SAMPLE_LICENSE_INVESTIGATION_STATE_NOTIFICATION_EVENT, + jurisdiction: undefined + }; + + await expect(lambda.handler(eventWithMissingJurisdiction, {} as any)) + .rejects + .toThrow('No jurisdiction provided for license investigation state notification email'); + }); + + it('should throw error when required template variables are missing', async () => { + const eventWithMissingVariables: EmailNotificationEvent = { + ...SAMPLE_LICENSE_INVESTIGATION_STATE_NOTIFICATION_EVENT, + templateVariables: {} + }; + + await expect(lambda.handler(eventWithMissingVariables, {} as any)) + .rejects + .toThrow('Missing required template variables for licenseInvestigationStateNotification template.'); + }); + }); + + describe('License Investigation Closed Provider Notification', () => { + const SAMPLE_LICENSE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT: EmailNotificationEvent = { + template: 'licenseInvestigationClosedProviderNotification', + recipientType: 'SPECIFIC', + compact: 'aslp', + specificEmails: ['provider@example.com'], + templateVariables: { + providerFirstName: 'John', + providerLastName: 'Doe', + investigationJurisdiction: 'OH', + licenseType: 'Audiologist' + } + }; + + it('should successfully send license investigation closed provider notification email', async () => { + const response = await lambda.handler( + SAMPLE_LICENSE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, {} as any + ); + + expect(response).toEqual({ + message: 'Email message sent' + }); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['provider@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'The investigation on your Audiologist license in Ohio has been closed' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when no recipients found', async () => { + const eventWithNoRecipients: EmailNotificationEvent = { + ...SAMPLE_LICENSE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, + specificEmails: [] + }; + + await expect(lambda.handler(eventWithNoRecipients, {} as any)) + .rejects + .toThrow('No recipients found for license investigation closed provider notification email'); + }); + + it('should throw error when required template variables are missing', async () => { + const eventWithMissingVariables: EmailNotificationEvent = { + ...SAMPLE_LICENSE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, + templateVariables: {} + }; + + await expect(lambda.handler(eventWithMissingVariables, {} as any)) + .rejects + .toThrow('Missing required template variables for licenseInvestigationClosedProviderNotification template.'); + }); + }); + + describe('License Investigation Closed State Notification', () => { + const SAMPLE_LICENSE_INVESTIGATION_CLOSED_STATE_NOTIFICATION_EVENT: EmailNotificationEvent = { + template: 'licenseInvestigationClosedStateNotification', + recipientType: 'JURISDICTION_ADVERSE_ACTIONS', + compact: 'aslp', + jurisdiction: 'ca', + templateVariables: { + providerFirstName: 'John', + providerLastName: 'Doe', + providerId: 'provider-123', + investigationJurisdiction: 'OH', + licenseType: 'Audiologist' + } + }; + + it('should successfully send license investigation closed state notification email', async () => { + const mockCaJurisdictionConfig = { + 'pk': { S: 'aslp#CONFIGURATION' }, + 'sk': { S: 'aslp#JURISDICTION#ca' }, + 'jurisdictionAdverseActionsNotificationEmails': { L: [{ S: 'ca-adverse@example.com' }]}, + 'type': { S: 'jurisdiction' } + }; + + const mockOhJurisdictionConfig = { + 'pk': { S: 'aslp#CONFIGURATION' }, + 'sk': { S: 'aslp#JURISDICTION#oh' }, + 'jurisdictionName': { S: 'Ohio' }, + 'type': { S: 'jurisdiction' } + }; + + mockDynamoDBClient.on(GetItemCommand).callsFake((input) => { + if (input.Key.sk.S === 'aslp#JURISDICTION#ca') { + return Promise.resolve({ Item: mockCaJurisdictionConfig }); + } else if (input.Key.sk.S === 'aslp#JURISDICTION#oh') { + return Promise.resolve({ Item: mockOhJurisdictionConfig }); + } + return Promise.resolve({ Item: SAMPLE_COMPACT_CONFIGURATION }); + }); + + const response = await lambda.handler( + SAMPLE_LICENSE_INVESTIGATION_CLOSED_STATE_NOTIFICATION_EVENT, {} as any + ); + + expect(response).toEqual({ + message: 'Email message sent' + }); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['ca-adverse@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('Investigation on John Doe') + } + }, + Subject: { + Charset: 'UTF-8', + Data: expect.stringMatching(/Investigation on John Doe.s Audiologist license in Ohio has been closed/) + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when jurisdiction is missing', async () => { + const eventWithMissingJurisdiction: EmailNotificationEvent = { + ...SAMPLE_LICENSE_INVESTIGATION_CLOSED_STATE_NOTIFICATION_EVENT, + jurisdiction: undefined + }; + + await expect(lambda.handler(eventWithMissingJurisdiction, {} as any)) + .rejects + .toThrow('No jurisdiction provided for license investigation closed state notification email'); + }); + + it('should throw error when required template variables are missing', async () => { + const eventWithMissingVariables: EmailNotificationEvent = { + ...SAMPLE_LICENSE_INVESTIGATION_CLOSED_STATE_NOTIFICATION_EVENT, + templateVariables: {} + }; + + await expect(lambda.handler(eventWithMissingVariables, {} as any)) + .rejects + .toThrow('Missing required template variables for licenseInvestigationClosedStateNotification template.'); + }); + }); + + describe('Privilege Investigation Provider Notification', () => { + const SAMPLE_PRIVILEGE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT: EmailNotificationEvent = { + template: 'privilegeInvestigationProviderNotification', + recipientType: 'SPECIFIC', + compact: 'aslp', + specificEmails: ['provider@example.com'], + templateVariables: { + providerFirstName: 'John', + providerLastName: 'Doe', + investigationJurisdiction: 'OH', + licenseType: 'Audiologist' + } + }; + + it('should successfully send privilege investigation provider notification email', async () => { + const response = await lambda.handler( + SAMPLE_PRIVILEGE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, {} as any + ); + + expect(response).toEqual({ + message: 'Email message sent' + }); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['provider@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'Your Audiologist privilege in Ohio is under investigation' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when no recipients found', async () => { + const eventWithNoRecipients: EmailNotificationEvent = { + ...SAMPLE_PRIVILEGE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, + specificEmails: [] + }; + + await expect(lambda.handler(eventWithNoRecipients, {} as any)) + .rejects + .toThrow('No recipients found for privilege investigation provider notification email'); + }); + + it('should throw error when required template variables are missing', async () => { + const eventWithMissingVariables: EmailNotificationEvent = { + ...SAMPLE_PRIVILEGE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, + templateVariables: {} + }; + + await expect(lambda.handler(eventWithMissingVariables, {} as any)) + .rejects + .toThrow('Missing required template variables for privilegeInvestigationProviderNotification template.'); + }); + }); + + describe('Privilege Investigation State Notification', () => { + const SAMPLE_PRIVILEGE_INVESTIGATION_STATE_NOTIFICATION_EVENT: EmailNotificationEvent = { + template: 'privilegeInvestigationStateNotification', + recipientType: 'JURISDICTION_ADVERSE_ACTIONS', + compact: 'aslp', + jurisdiction: 'ca', + templateVariables: { + providerFirstName: 'John', + providerLastName: 'Doe', + providerId: 'provider-123', + investigationJurisdiction: 'OH', + licenseType: 'Audiologist' + } + }; + + it('should successfully send privilege investigation state notification email', async () => { + const mockCaJurisdictionConfig = { + 'pk': { S: 'aslp#CONFIGURATION' }, + 'sk': { S: 'aslp#JURISDICTION#ca' }, + 'jurisdictionAdverseActionsNotificationEmails': { L: [{ S: 'ca-adverse@example.com' }]}, + 'type': { S: 'jurisdiction' } + }; + + const mockOhJurisdictionConfig = { + 'pk': { S: 'aslp#CONFIGURATION' }, + 'sk': { S: 'aslp#JURISDICTION#oh' }, + 'jurisdictionName': { S: 'Ohio' }, + 'type': { S: 'jurisdiction' } + }; + + mockDynamoDBClient.on(GetItemCommand).callsFake((input) => { + if (input.Key.sk.S === 'aslp#JURISDICTION#ca') { + return Promise.resolve({ Item: mockCaJurisdictionConfig }); + } else if (input.Key.sk.S === 'aslp#JURISDICTION#oh') { + return Promise.resolve({ Item: mockOhJurisdictionConfig }); + } + return Promise.resolve({ Item: SAMPLE_COMPACT_CONFIGURATION }); + }); + + const response = await lambda.handler(SAMPLE_PRIVILEGE_INVESTIGATION_STATE_NOTIFICATION_EVENT, {} as any); + + expect(response).toEqual({ + message: 'Email message sent' + }); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['ca-adverse@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('John Doe holding Audiologist privilege in Ohio is under investigation') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'John Doe holding Audiologist privilege in Ohio is under investigation' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when jurisdiction is missing', async () => { + const eventWithMissingJurisdiction: EmailNotificationEvent = { + ...SAMPLE_PRIVILEGE_INVESTIGATION_STATE_NOTIFICATION_EVENT, + jurisdiction: undefined + }; + + await expect(lambda.handler(eventWithMissingJurisdiction, {} as any)) + .rejects + .toThrow('No jurisdiction provided for privilege investigation state notification email'); + }); + + it('should throw error when required template variables are missing', async () => { + const eventWithMissingVariables: EmailNotificationEvent = { + ...SAMPLE_PRIVILEGE_INVESTIGATION_STATE_NOTIFICATION_EVENT, + templateVariables: {} + }; + + await expect(lambda.handler(eventWithMissingVariables, {} as any)) + .rejects + .toThrow('Missing required template variables for privilegeInvestigationStateNotification template.'); + }); + }); + + describe('Privilege Investigation Closed Provider Notification', () => { + const SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT: EmailNotificationEvent = { + template: 'privilegeInvestigationClosedProviderNotification', + recipientType: 'SPECIFIC', + compact: 'aslp', + specificEmails: ['provider@example.com'], + templateVariables: { + providerFirstName: 'John', + providerLastName: 'Doe', + investigationJurisdiction: 'OH', + licenseType: 'Audiologist' + } + }; + + it('should successfully send privilege investigation closed provider notification email', async () => { + const response = await lambda.handler( + SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, {} as any + ); + + expect(response).toEqual({ + message: 'Email message sent' + }); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['provider@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('') + } + }, + Subject: { + Charset: 'UTF-8', + Data: 'The investigation on your Audiologist privilege in Ohio has been closed' + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when no recipients found', async () => { + const eventWithNoRecipients: EmailNotificationEvent = { + ...SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, + specificEmails: [] + }; + + await expect(lambda.handler(eventWithNoRecipients, {} as any)) + .rejects + .toThrow('No recipients found for privilege investigation closed provider notification email'); + }); + + it('should throw error when required template variables are missing', async () => { + const eventWithMissingVariables: EmailNotificationEvent = { + ...SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, + templateVariables: {} + }; + + await expect(lambda.handler(eventWithMissingVariables, {} as any)) + .rejects + .toThrow('Missing required template variables for privilegeInvestigationClosedProviderNotification template.'); + }); + }); + + describe('Privilege Investigation Closed State Notification', () => { + const SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_STATE_NOTIFICATION_EVENT: EmailNotificationEvent = { + template: 'privilegeInvestigationClosedStateNotification', + recipientType: 'JURISDICTION_ADVERSE_ACTIONS', + compact: 'aslp', + jurisdiction: 'ca', + templateVariables: { + providerFirstName: 'John', + providerLastName: 'Doe', + providerId: 'provider-123', + investigationJurisdiction: 'OH', + licenseType: 'Audiologist' + } + }; + + it('should successfully send privilege investigation closed state notification email', async () => { + const mockCaJurisdictionConfig = { + 'pk': { S: 'aslp#CONFIGURATION' }, + 'sk': { S: 'aslp#JURISDICTION#ca' }, + 'jurisdictionAdverseActionsNotificationEmails': { L: [{ S: 'ca-adverse@example.com' }]}, + 'type': { S: 'jurisdiction' } + }; + + const mockOhJurisdictionConfig = { + 'pk': { S: 'aslp#CONFIGURATION' }, + 'sk': { S: 'aslp#JURISDICTION#oh' }, + 'jurisdictionName': { S: 'Ohio' }, + 'type': { S: 'jurisdiction' } + }; + + mockDynamoDBClient.on(GetItemCommand).callsFake((input) => { + if (input.Key.sk.S === 'aslp#JURISDICTION#ca') { + return Promise.resolve({ Item: mockCaJurisdictionConfig }); + } else if (input.Key.sk.S === 'aslp#JURISDICTION#oh') { + return Promise.resolve({ Item: mockOhJurisdictionConfig }); + } + return Promise.resolve({ Item: SAMPLE_COMPACT_CONFIGURATION }); + }); + + const response = await lambda.handler( + SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_STATE_NOTIFICATION_EVENT, {} as any + ); + + expect(response).toEqual({ + message: 'Email message sent' + }); + + expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { + Destination: { + ToAddresses: ['ca-adverse@example.com'] + }, + Content: { + Simple: { + Body: { + Html: { + Charset: 'UTF-8', + Data: expect.stringContaining('Investigation on John Doe') + } + }, + Subject: { + Charset: 'UTF-8', + Data: expect.stringMatching(/Investigation on John Doe.s Audiologist privilege in Ohio has been closed/) + } + } + }, + FromEmailAddress: 'Compact Connect ' + }); + }); + + it('should throw error when jurisdiction is missing', async () => { + const eventWithMissingJurisdiction: EmailNotificationEvent = { + ...SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_STATE_NOTIFICATION_EVENT, + jurisdiction: undefined + }; + + await expect(lambda.handler(eventWithMissingJurisdiction, {} as any)) + .rejects + .toThrow('No jurisdiction provided for privilege investigation closed state notification email'); + }); + + it('should throw error when required template variables are missing', async () => { + const eventWithMissingVariables: EmailNotificationEvent = { + ...SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_STATE_NOTIFICATION_EVENT, + templateVariables: {} + }; + + await expect(lambda.handler(eventWithMissingVariables, {} as any)) + .rejects + .toThrow('Missing required template variables for privilegeInvestigationClosedStateNotification template.'); + }); + }); }); From 0fcb1861d448486362d99ad558a574208d7f18d3 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 22 Oct 2025 14:40:49 -0600 Subject: [PATCH 12/33] Add empty body to POST requests --- .../tests/smoke/investigation_smoke_tests.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/compact-connect/tests/smoke/investigation_smoke_tests.py b/backend/compact-connect/tests/smoke/investigation_smoke_tests.py index 8da04b402..049df6248 100755 --- a/backend/compact-connect/tests/smoke/investigation_smoke_tests.py +++ b/backend/compact-connect/tests/smoke/investigation_smoke_tests.py @@ -241,10 +241,11 @@ def test_create_privilege_investigation(auth_headers): _verify_no_investigation_exists('privilege', jurisdiction, license_type) - # Create investigation (no body required) + # Create investigation (empty body required) response = requests.post( f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}' f'/licenseType/{license_type_abbreviation}/investigation', + json={}, headers=auth_headers, timeout=30, ) @@ -275,10 +276,11 @@ def test_create_license_investigation(auth_headers): _verify_no_investigation_exists('license', jurisdiction, license_type) - # Create investigation (no body required) + # Create investigation (empty body required) response = requests.post( f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/licenses/jurisdiction/{jurisdiction}' f'/licenseType/{license_type_abbreviation}/investigation', + json={}, headers=auth_headers, timeout=30, ) From 7f57ded8dc1927d38ce032eb0ac9c209c39a1137 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Fri, 24 Oct 2025 09:31:10 -0600 Subject: [PATCH 13/33] Remove unused vars --- .../lambdas/nodejs/cognito-emails/lambda.ts | 2 +- .../nodejs/email-notification-service/lambda.ts | 2 +- .../lambdas/nodejs/eslint.config.mjs | 8 ++++++++ .../email/investigation-notification-service.ts | 6 ------ .../nodejs/tests/ingest-event-reporter.test.ts | 15 +++++++-------- .../lib/email/email-notification-service.test.ts | 4 ---- .../encumbrance-notification-service.test.ts | 2 +- .../investigation-notification-service.test.ts | 2 +- 8 files changed, 19 insertions(+), 22 deletions(-) diff --git a/backend/compact-connect/lambdas/nodejs/cognito-emails/lambda.ts b/backend/compact-connect/lambdas/nodejs/cognito-emails/lambda.ts index b64ad072f..b1c5542df 100644 --- a/backend/compact-connect/lambdas/nodejs/cognito-emails/lambda.ts +++ b/backend/compact-connect/lambdas/nodejs/cognito-emails/lambda.ts @@ -81,7 +81,7 @@ export class Lambda implements LambdaInterface { * @returns Modified event with custom email message and subject */ @logger.injectLambdaContext({ resetKeys: true }) - public async handler(event: CognitoCustomMessageEvent, context: Context): Promise { + public async handler(event: CognitoCustomMessageEvent, _context: Context): Promise { logger.info('Processing Cognito custom message event', { triggerSource: event.triggerSource, userPoolId: event.userPoolId, diff --git a/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts b/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts index ffab0568f..2a386070f 100644 --- a/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts +++ b/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts @@ -72,7 +72,7 @@ export class Lambda implements LambdaInterface { * @returns Email notification response */ @logger.injectLambdaContext({ resetKeys: true }) - public async handler(event: EmailNotificationEvent, context: Context): Promise { + public async handler(event: EmailNotificationEvent, _context: Context): Promise { logger.info('Processing event', { template: event.template, compact: event.compact, jurisdiction: event.jurisdiction }); // Check if FROM_ADDRESS is configured diff --git a/backend/compact-connect/lambdas/nodejs/eslint.config.mjs b/backend/compact-connect/lambdas/nodejs/eslint.config.mjs index bea30f936..0961638b7 100644 --- a/backend/compact-connect/lambdas/nodejs/eslint.config.mjs +++ b/backend/compact-connect/lambdas/nodejs/eslint.config.mjs @@ -56,6 +56,14 @@ export default [ 'implicit-arrow-linebreak': OFF, 'class-methods-use-this': OFF, '@typescript-eslint/no-explicit-any': OFF, + 'no-unused-vars': OFF, // Disabled in favor of @typescript-eslint/no-unused-vars + '@typescript-eslint/no-unused-vars': [ERROR, { + vars: 'all', + args: 'after-used', + ignoreRestSiblings: true, + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }], 'padding-line-between-statements': [ ERROR, { blankLine: 'always', prev: ['const', 'let', 'var'], next: '*' }, diff --git a/backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts b/backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts index 1fc0fb63e..8dbb61791 100644 --- a/backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts +++ b/backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts @@ -1,8 +1,6 @@ import { BaseEmailService } from './base-email-service'; -import { EnvironmentVariablesService } from '../environment-variables-service'; import { IJurisdiction } from 'lib/models/jurisdiction'; -const environmentVariableService = new EnvironmentVariablesService(); /** * Service for handling investigation-related email notifications @@ -101,7 +99,6 @@ export class InvestigationNotificationService extends BaseEmailService { const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( compact, investigationJurisdiction ); - const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); const report = this.getNewEmailTemplate(); const subject = `Your ${licenseType} license in ${investigationJurisdictionConfig.jurisdictionName} is under investigation`; @@ -197,7 +194,6 @@ export class InvestigationNotificationService extends BaseEmailService { const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( compact, investigationJurisdiction ); - const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); const report = this.getNewEmailTemplate(); const subject = `The investigation on your ${licenseType} license in ${investigationJurisdictionConfig.jurisdictionName} has been closed`; @@ -293,7 +289,6 @@ export class InvestigationNotificationService extends BaseEmailService { const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( compact, investigationJurisdiction ); - const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); const report = this.getNewEmailTemplate(); const subject = `Your ${licenseType} privilege in ${investigationJurisdictionConfig.jurisdictionName} is under investigation`; @@ -389,7 +384,6 @@ export class InvestigationNotificationService extends BaseEmailService { const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( compact, investigationJurisdiction ); - const compactConfig = await this.compactConfigurationClient.getCompactConfiguration(compact); const report = this.getNewEmailTemplate(); const subject = `The investigation on your ${licenseType} privilege in ${investigationJurisdictionConfig.jurisdictionName} has been closed`; diff --git a/backend/compact-connect/lambdas/nodejs/tests/ingest-event-reporter.test.ts b/backend/compact-connect/lambdas/nodejs/tests/ingest-event-reporter.test.ts index 34dfd9303..194999d08 100644 --- a/backend/compact-connect/lambdas/nodejs/tests/ingest-event-reporter.test.ts +++ b/backend/compact-connect/lambdas/nodejs/tests/ingest-event-reporter.test.ts @@ -1,12 +1,11 @@ import { mockClient } from 'aws-sdk-client-mock'; import 'aws-sdk-client-mock-jest'; -import { Context, EventBridgeEvent } from 'aws-lambda'; +import { Context } from 'aws-lambda'; import { DynamoDBClient, QueryCommand, GetItemCommand } from '@aws-sdk/client-dynamodb'; import { SendEmailCommand, SESv2Client } from '@aws-sdk/client-sesv2'; import { S3Client } from '@aws-sdk/client-s3'; import { Lambda } from '../ingest-event-reporter/lambda'; -import { IngestEventEmailService } from '../lib/email'; import { IEventBridgeEvent } from '../lib/models/event-bridge-event-detail'; import { SAMPLE_INGEST_FAILURE_ERROR_RECORD, @@ -64,13 +63,13 @@ jest.mock('../lib/email/ingest-event-email-service', () => { }); const mockSendReportEmail = jest.fn().mockImplementation( - (events, recipients: string[]) => Promise.resolve('message-id-123') + (_events, _recipients: string[]) => Promise.resolve('message-id-123') ); const mockSendAllsWellEmail = jest.fn().mockImplementation( - (recipients: string[]) => Promise.resolve('message-id-123') + (_recipients: string[]) => Promise.resolve('message-id-123') ); const mockSendNoLicenseUpdatesEmail = jest.fn().mockImplementation( - (recipients: string[]) => Promise.resolve('message-id-no-license-updates') + (_recipients: string[]) => Promise.resolve('message-id-no-license-updates') ); describe('Frequent runs', () => { @@ -146,7 +145,7 @@ describe('Frequent runs', () => { sesClient: asSESClient(mockSESClient) }); - const resp = await lambda.handler( + await lambda.handler( SAMPLE_NIGHTLY_EVENT, SAMPLE_CONTEXT ); @@ -213,7 +212,7 @@ describe('Frequent runs', () => { sesClient: asSESClient(mockSESClient) }); - const resp = await lambda.handler( + await lambda.handler( SAMPLE_NIGHTLY_EVENT, SAMPLE_CONTEXT ); @@ -510,7 +509,7 @@ describe('Weekly runs', () => { sesClient: asSESClient(mockSESClient) }); - const resp = await lambda.handler( + await lambda.handler( SAMPLE_WEEKLY_EVENT, SAMPLE_CONTEXT ); diff --git a/backend/compact-connect/lambdas/nodejs/tests/lib/email/email-notification-service.test.ts b/backend/compact-connect/lambdas/nodejs/tests/lib/email/email-notification-service.test.ts index 94f44d418..2befda98e 100644 --- a/backend/compact-connect/lambdas/nodejs/tests/lib/email/email-notification-service.test.ts +++ b/backend/compact-connect/lambdas/nodejs/tests/lib/email/email-notification-service.test.ts @@ -48,10 +48,6 @@ const asSESClient = (mock: ReturnType) => const asS3Client = (mock: ReturnType) => mock as unknown as S3Client; -interface MockMailResponse { - messageId: string; -} - const MOCK_TRANSPORT = { sendMail: jest.fn().mockImplementation(async () => ({ messageId: 'test-message-id' })) }; diff --git a/backend/compact-connect/lambdas/nodejs/tests/lib/email/encumbrance-notification-service.test.ts b/backend/compact-connect/lambdas/nodejs/tests/lib/email/encumbrance-notification-service.test.ts index 33bb23748..fd7271eea 100644 --- a/backend/compact-connect/lambdas/nodejs/tests/lib/email/encumbrance-notification-service.test.ts +++ b/backend/compact-connect/lambdas/nodejs/tests/lib/email/encumbrance-notification-service.test.ts @@ -53,7 +53,7 @@ class MockCompactConfigurationClient extends CompactConfigurationClient { }); } - public async getCompactConfiguration(compact: string): Promise { + public async getCompactConfiguration(_compact: string): Promise { return SAMPLE_COMPACT_CONFIG; } } diff --git a/backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts b/backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts index 192451c5b..8241a73d6 100644 --- a/backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts +++ b/backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts @@ -53,7 +53,7 @@ class MockCompactConfigurationClient extends CompactConfigurationClient { }); } - public async getCompactConfiguration(compact: string): Promise { + public async getCompactConfiguration(_compact: string): Promise { return SAMPLE_COMPACT_CONFIG; } } From 148f5d2c4ef72db54c68bff88e42922fed3f369f Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Fri, 24 Oct 2025 12:13:53 -0600 Subject: [PATCH 14/33] Move investigation transactions to low-level client --- .../cc_common/data_model/data_client.py | 59 ++- .../tests/function/__init__.py | 7 + .../test_handlers/test_investigation.py | 340 +++++++----------- 3 files changed, 156 insertions(+), 250 deletions(-) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index bfc7cd8af..abdc407c5 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -1680,39 +1680,29 @@ def create_investigation(self, investigation: InvestigationData) -> None: # Prepare the transaction items transaction_items = [ - { - 'Put': { - 'TableName': self.config.provider_table.table_name, - 'Item': investigation.serialize_to_database_record(), - } - }, - { - 'Put': { - 'TableName': self.config.provider_table.table_name, - 'Item': update_record.serialize_to_database_record(), - } - }, + self._generate_put_transaction_item(investigation.serialize_to_database_record()), + self._generate_put_transaction_item(update_record.serialize_to_database_record()), { 'Update': { 'TableName': self.config.provider_table.table_name, 'Key': { - 'pk': f'{investigation.compact}#PROVIDER#{investigation.providerId}', - 'sk': f'{investigation.compact}#PROVIDER#{record_type}/' - f'{investigation.jurisdiction}/{investigation.licenseTypeAbbreviation}#', + 'pk': {'S': f'{investigation.compact}#PROVIDER#{investigation.providerId}'}, + 'sk': {'S': f'{investigation.compact}#PROVIDER#{record_type}/' + f'{investigation.jurisdiction}/{investigation.licenseTypeAbbreviation}#'}, }, 'UpdateExpression': ( 'SET investigationStatus = :investigationStatus, dateOfUpdate = :dateOfUpdate' ), 'ExpressionAttributeValues': { - ':investigationStatus': InvestigationStatusEnum.UNDER_INVESTIGATION.value, - ':dateOfUpdate': investigation.creationDate.isoformat(), + ':investigationStatus': {'S': InvestigationStatusEnum.UNDER_INVESTIGATION}, + ':dateOfUpdate': {'S': investigation.creationDate.isoformat()}, }, } }, ] # Execute the transaction - self.config.provider_table.meta.client.transact_write_items(TransactItems=transaction_items) + self.config.dynamodb_client.transact_write_items(TransactItems=transaction_items) logger.info(f'Set investigation for {record_type} record') @@ -1798,49 +1788,46 @@ def close_investigation( 'SET closeDate = :closeDate, closingUser = :closingUser, dateOfUpdate = :dateOfUpdate' ) investigation_expression_values = { - ':closeDate': close_date.isoformat(), - ':closingUser': closing_user, - ':dateOfUpdate': close_date.isoformat(), + ':closeDate': {'S': close_date.isoformat()}, + ':closingUser': {'S': closing_user}, + ':dateOfUpdate': {'S': close_date.isoformat()}, } # Add resultingEncumbranceId if an encumbrance was created if resulting_encumbrance_id: investigation_update_expression += ', resultingEncumbranceId = :resultingEncumbranceId' - investigation_expression_values[':resultingEncumbranceId'] = str(resulting_encumbrance_id) + investigation_expression_values[':resultingEncumbranceId'] = {'S': str(resulting_encumbrance_id)} transaction_items = [ { 'Update': { 'TableName': self.config.provider_table.table_name, 'Key': { - 'pk': f'{compact}#PROVIDER#{provider_id}', - 'sk': ( - f'{compact}#PROVIDER#{record_type}/{jurisdiction}/' + 'pk': {'S': f'{compact}#PROVIDER#{provider_id}'}, + 'sk': { + 'S': f'{compact}#PROVIDER#{record_type}/{jurisdiction}/' f'{license_type_abbreviation}#INVESTIGATION#{investigation_id}' - ), + }, }, 'UpdateExpression': investigation_update_expression, 'ConditionExpression': 'attribute_exists(pk) AND attribute_not_exists(closeDate)', 'ExpressionAttributeValues': investigation_expression_values, } }, - { - 'Put': { - 'TableName': self.config.provider_table.table_name, - 'Item': update_record.serialize_to_database_record(), - } - }, + self._generate_put_transaction_item(update_record.serialize_to_database_record()), { 'Update': { 'TableName': self.config.provider_table.table_name, 'Key': { - 'pk': f'{compact}#PROVIDER#{provider_id}', - 'sk': f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#', + 'pk': {'S': f'{compact}#PROVIDER#{provider_id}'}, + 'sk': { + 'S': f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#' + }, }, 'UpdateExpression': 'REMOVE investigationStatus SET dateOfUpdate = :dateOfUpdate', 'ConditionExpression': 'attribute_exists(pk)', 'ExpressionAttributeValues': { - ':dateOfUpdate': close_date.isoformat(), + ':dateOfUpdate': {'S': close_date.isoformat()}, }, } }, @@ -1848,7 +1835,7 @@ def close_investigation( # Execute the transaction try: - self.config.provider_table.meta.client.transact_write_items(TransactItems=transaction_items) + self.config.dynamodb_client.transact_write_items(TransactItems=transaction_items) except Exception as e: # Check if this is a TransactionCanceledException with ConditionalCheckFailed if hasattr(e, 'response') and e.response.get('CancellationReasons'): diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/__init__.py b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/__init__.py index 7ffe1cbbe..fac7ad579 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/__init__.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/__init__.py @@ -22,6 +22,13 @@ class TstFunction(TstLambdas): """Base class to set up Moto mocking and create mock AWS resources for functional testing""" + def assertDictFieldsMatch(self, expected: dict, actual: dict): # noqa: N802 emulating TestCase style here + for key, value in expected.items(): + try: + self.assertEqual(value, actual[key], f'Expected {key}: {value} but got {key}: {actual[key]}') + except KeyError: + self.fail(f'Missing expected key, {key}') + def setUp(self): # noqa: N801 invalid-name super().setUp() diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py index 92f528d68..1f2d9734d 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py @@ -92,10 +92,13 @@ def _when_testing_privilege_investigation(self): # return both the test event and the test privilege record return test_event, test_privilege_record - def test_privilege_investigation_handler_returns_ok_message_with_valid_body(self): + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_privilege_investigation_handler(self, mock_publish_event): + from cc_common.data_model.schema.common import InvestigationStatusEnum from handlers.investigation import investigation_handler + from handlers.providers import get_provider - event = self._when_testing_privilege_investigation()[0] + event, test_privilege_record = self._when_testing_privilege_investigation() response = investigation_handler(event, self.mock_context) self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) @@ -106,14 +109,6 @@ def test_privilege_investigation_handler_returns_ok_message_with_valid_body(self response_body, ) - def test_privilege_investigation_handler_adds_investigation_record_in_provider_data_table(self): - from handlers.investigation import investigation_handler - - event, test_privilege_record = self._when_testing_privilege_investigation() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) - # Verify that the investigation record was added to the provider data table # Perform a query to list all investigations for the provider using the starts_with key condition investigation_records = self._provider_table.query( @@ -146,16 +141,6 @@ def test_privilege_investigation_handler_adds_investigation_record_in_provider_d } self.assertEqual(expected_investigation, item) - def test_privilege_investigation_handler_sets_provider_record_to_under_investigation_in_provider_data_table(self): - from cc_common.data_model.schema.common import InvestigationStatusEnum - from handlers.investigation import investigation_handler - from handlers.providers import get_provider - - event, test_privilege_record = self._when_testing_privilege_investigation() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) - # Verify that the privilege record was updated to be under investigation updated_privilege_record = self._provider_table.get_item( Key={ @@ -188,48 +173,26 @@ def test_privilege_investigation_handler_sets_provider_record_to_under_investiga # Verify that the privilege has investigation objects privilege = provider_data['privileges'][0] - investigation = privilege['investigations'][0] - expected_investigation = { - 'type': 'investigation', - 'compact': test_privilege_record.compact, + expected_privilege = { 'providerId': str(test_privilege_record.providerId), - 'jurisdiction': test_privilege_record.jurisdiction, - 'licenseType': test_privilege_record.licenseType, - 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, - 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'investigationId': investigation['investigationId'], # Dynamic field + 'investigationStatus': 'underInvestigation', + 'investigations': [ + { + 'type': 'investigation', + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseType': test_privilege_record.licenseType, + 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, + 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationId': privilege['investigations'][0]['investigationId'], # Dynamic field + } + ] } - self.assertEqual(expected_investigation, investigation) - - def test_privilege_investigation_handler_returns_access_denied_if_compact_admin(self): - """Verifying that only state admins are allowed to create privilege investigations""" - from handlers.investigation import investigation_handler - - event, test_privilege_record = self._when_testing_privilege_investigation() - - event['requestContext']['authorizer']['claims']['scope'] = f'openid email {test_privilege_record.compact}/admin' - - response = investigation_handler(event, self.mock_context) - self.assertEqual(403, response['statusCode'], msg=json.loads(response['body'])) - response_body = json.loads(response['body']) - - self.assertEqual( - {'message': 'Access denied'}, - response_body, - ) - - @patch('cc_common.event_bus_client.EventBusClient._publish_event') - def test_privilege_investigation_handler_publishes_event(self, mock_publish_event): - """Test that privilege investigation handler publishes the correct event.""" - from handlers.investigation import investigation_handler - - event, test_privilege_record = self._when_testing_privilege_investigation() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode']) + self.assertDictFieldsMatch(expected_privilege, privilege) # Verify event was published with correct details mock_publish_event.assert_called_once() @@ -250,6 +213,23 @@ def test_privilege_investigation_handler_publishes_event(self, mock_publish_even } self.assertEqual(expected_event_args, call_args) + def test_privilege_investigation_handler_returns_access_denied_if_compact_admin(self): + """Verifying that only state admins are allowed to create privilege investigations""" + from handlers.investigation import investigation_handler + + event, test_privilege_record = self._when_testing_privilege_investigation() + + event['requestContext']['authorizer']['claims']['scope'] = f'openid email {test_privilege_record.compact}/admin' + + response = investigation_handler(event, self.mock_context) + self.assertEqual(403, response['statusCode'], msg=json.loads(response['body'])) + response_body = json.loads(response['body']) + + self.assertEqual( + {'message': 'Access denied'}, + response_body, + ) + @patch('cc_common.event_bus_client.EventBusClient._publish_event') def test_privilege_investigation_handler_handles_event_publishing_failure(self, mock_publish_event): """Test that privilege investigation handler fails when event publishing fails.""" @@ -313,10 +293,13 @@ def _when_testing_valid_license_investigation(self, body_overrides: dict | None # return both the event and test license record return test_event, test_license_record - def test_license_investigation_handler_returns_ok_message_with_valid_body(self): + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_license_investigation_handler(self, mock_publish_event): + from cc_common.data_model.schema.common import InvestigationStatusEnum from handlers.investigation import investigation_handler + from handlers.providers import get_provider - event = self._when_testing_valid_license_investigation()[0] + event, test_license_record = self._when_testing_valid_license_investigation() response = investigation_handler(event, self.mock_context) self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) @@ -327,14 +310,6 @@ def test_license_investigation_handler_returns_ok_message_with_valid_body(self): response_body, ) - def test_license_investigation_handler_adds_investigation_record_in_provider_data_table(self): - from handlers.investigation import investigation_handler - - event, test_license_record = self._when_testing_valid_license_investigation() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) - # Verify that the investigation record was added to the provider data table # Perform a query to list all investigations for the provider using the starts_with key condition investigation_records = self._provider_table.query( @@ -367,16 +342,6 @@ def test_license_investigation_handler_adds_investigation_record_in_provider_dat } self.assertEqual(expected_investigation, item) - def test_license_investigation_handler_sets_provider_record_to_under_investigation_in_provider_data_table(self): - from cc_common.data_model.schema.common import InvestigationStatusEnum - from handlers.investigation import investigation_handler - from handlers.providers import get_provider - - event, test_license_record = self._when_testing_valid_license_investigation() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) - # Verify that the license record was updated to be under investigation updated_license_record = self._provider_table.get_item( Key={ @@ -386,7 +351,7 @@ def test_license_investigation_handler_sets_provider_record_to_under_investigati )['Item'] self.assertEqual( - InvestigationStatusEnum.UNDER_INVESTIGATION.value, updated_license_record['investigationStatus'] + InvestigationStatusEnum.UNDER_INVESTIGATION, updated_license_record['investigationStatus'] ) # Verify that investigation objects are included in the API response @@ -411,46 +376,25 @@ def test_license_investigation_handler_sets_provider_record_to_under_investigati license_obj = provider_data['licenses'][0] investigation = license_obj['investigations'][0] - expected_investigation = { - 'type': 'investigation', - 'compact': test_license_record.compact, + expected_license = { 'providerId': str(test_license_record.providerId), - 'jurisdiction': test_license_record.jurisdiction, - 'licenseType': test_license_record.licenseType, - 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, - 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'investigationId': investigation['investigationId'], # Dynamic field + 'investigationStatus': 'underInvestigation', + 'investigations': [ + { + 'type': 'investigation', + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseType': test_license_record.licenseType, + 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, + 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationId': investigation['investigationId'], # Dynamic field + } + ] } - self.assertEqual(expected_investigation, investigation) - - def test_license_investigation_handler_returns_access_denied_if_compact_admin(self): - """Verifying that only state admins are allowed to create license investigations""" - from handlers.investigation import investigation_handler - - event, test_license_record = self._when_testing_valid_license_investigation() - - event['requestContext']['authorizer']['claims']['scope'] = f'openid email {test_license_record.compact}/admin' - - response = investigation_handler(event, self.mock_context) - self.assertEqual(403, response['statusCode'], msg=json.loads(response['body'])) - response_body = json.loads(response['body']) - - self.assertEqual( - {'message': 'Access denied'}, - response_body, - ) - - @patch('cc_common.event_bus_client.EventBusClient._publish_event') - def test_license_investigation_handler_publishes_event(self, mock_publish_event): - """Test that license investigation handler publishes the correct event.""" - from handlers.investigation import investigation_handler - - event, test_license_record = self._when_testing_valid_license_investigation() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode']) + self.assertDictFieldsMatch(expected_license, license_obj) # Verify event was published with correct details mock_publish_event.assert_called_once() @@ -472,6 +416,24 @@ def test_license_investigation_handler_publishes_event(self, mock_publish_event) } self.assertEqual(expected_event_args, call_args) + + def test_license_investigation_handler_returns_access_denied_if_compact_admin(self): + """Verifying that only state admins are allowed to create license investigations""" + from handlers.investigation import investigation_handler + + event, test_license_record = self._when_testing_valid_license_investigation() + + event['requestContext']['authorizer']['claims']['scope'] = f'openid email {test_license_record.compact}/admin' + + response = investigation_handler(event, self.mock_context) + self.assertEqual(403, response['statusCode'], msg=json.loads(response['body'])) + response_body = json.loads(response['body']) + + self.assertEqual( + {'message': 'Access denied'}, + response_body, + ) + @patch('cc_common.event_bus_client.EventBusClient._publish_event') def test_license_investigation_handler_handles_event_publishing_failure(self, mock_publish_event): """Test that license investigation handler fails when event publishing fails.""" @@ -566,10 +528,12 @@ def _when_testing_privilege_investigation_close(self, body_overrides: dict | Non return test_event, test_privilege_record, investigation_id - def test_privilege_investigation_close_handler_returns_ok_message_with_valid_body(self): + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_privilege_investigation_close_handler(self, mock_publish_event): from handlers.investigation import investigation_handler + from handlers.providers import get_provider - event = self._when_testing_privilege_investigation_close()[0] + event, test_privilege_record, investigation_id = self._when_testing_privilege_investigation_close() response = investigation_handler(event, self.mock_context) self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) @@ -580,14 +544,6 @@ def test_privilege_investigation_close_handler_returns_ok_message_with_valid_bod response_body, ) - def test_privilege_investigation_close_handler_updates_investigation_record(self): - from handlers.investigation import investigation_handler - - event, test_privilege_record, investigation_id = self._when_testing_privilege_investigation_close() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) - # Verify that the investigation record was updated investigation_record = self._provider_table.get_item( Key={ @@ -621,15 +577,6 @@ def test_privilege_investigation_close_handler_updates_investigation_record(self self.assertEqual(expected_investigation, investigation_record) - def test_privilege_investigation_close_handler_removes_investigation_status_from_privilege(self): - from handlers.investigation import investigation_handler - from handlers.providers import get_provider - - event, test_privilege_record, investigation_id = self._when_testing_privilege_investigation_close() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) - # Verify that the privilege record no longer has investigation status updated_privilege_record = self._provider_table.get_item( Key={ @@ -666,6 +613,26 @@ def test_privilege_investigation_close_handler_removes_investigation_status_from self.assertEqual(expected_privilege['investigations'], privilege['investigations']) + # Verify event was published with correct details (should be called twice: creation + closure) + self.assertEqual(2, mock_publish_event.call_count) + call_args = mock_publish_event.call_args[1] + + expected_event_args = { + 'source': 'org.compactconnect.provider-data', + 'detail_type': 'privilege.investigationClosed', + 'event_batch_writer': None, + 'detail': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseTypeAbbreviation': test_privilege_record.licenseTypeAbbreviation, + 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationAgainst': 'privilege', + 'effectiveDate': '2024-11-08', # Date portion of DEFAULT_DATE_OF_UPDATE_TIMESTAMP + }, + } + self.assertEqual(expected_event_args, call_args) + def test_privilege_investigation_close_with_encumbrance_creates_encumbrance(self): from handlers.investigation import investigation_handler @@ -699,36 +666,6 @@ def test_privilege_investigation_close_with_encumbrance_creates_encumbrance(self self.assertIn('resultingEncumbranceId', investigation_record) - @patch('cc_common.event_bus_client.EventBusClient._publish_event') - def test_privilege_investigation_close_handler_publishes_event(self, mock_publish_event): - """Test that privilege investigation close handler publishes the correct event.""" - from handlers.investigation import investigation_handler - - event, test_privilege_record, investigation_id = self._when_testing_privilege_investigation_close() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode']) - - # Verify event was published with correct details (should be called twice: creation + closure) - self.assertEqual(2, mock_publish_event.call_count) - call_args = mock_publish_event.call_args[1] - - expected_event_args = { - 'source': 'org.compactconnect.provider-data', - 'detail_type': 'privilege.investigationClosed', - 'event_batch_writer': None, - 'detail': { - 'compact': test_privilege_record.compact, - 'providerId': str(test_privilege_record.providerId), - 'jurisdiction': test_privilege_record.jurisdiction, - 'licenseTypeAbbreviation': test_privilege_record.licenseTypeAbbreviation, - 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'investigationAgainst': 'privilege', - 'effectiveDate': '2024-11-08', # Date portion of DEFAULT_DATE_OF_UPDATE_TIMESTAMP - }, - } - self.assertEqual(expected_event_args, call_args) - @mock_aws @patch('cc_common.config._Config.current_standard_datetime', datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP)) @@ -811,10 +748,12 @@ def _when_testing_license_investigation_close(self, body_overrides: dict | None return test_event, test_license_record, investigation_id - def test_license_investigation_close_handler_returns_ok_message_with_valid_body(self): + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_license_investigation_close_handler(self, mock_publish_event): from handlers.investigation import investigation_handler + from handlers.providers import get_provider - event = self._when_testing_license_investigation_close()[0] + event, test_license_record, investigation_id = self._when_testing_license_investigation_close() response = investigation_handler(event, self.mock_context) self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) @@ -825,14 +764,6 @@ def test_license_investigation_close_handler_returns_ok_message_with_valid_body( response_body, ) - def test_license_investigation_close_handler_updates_investigation_record(self): - from handlers.investigation import investigation_handler - - event, test_license_record, investigation_id = self._when_testing_license_investigation_close() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) - # Verify that the investigation record was updated investigation_record = self._provider_table.get_item( Key={ @@ -866,15 +797,6 @@ def test_license_investigation_close_handler_updates_investigation_record(self): self.assertEqual(expected_investigation, investigation_record) - def test_license_investigation_close_handler_removes_investigation_status_from_license(self): - from handlers.investigation import investigation_handler - from handlers.providers import get_provider - - event, test_license_record, investigation_id = self._when_testing_license_investigation_close() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) - # Verify that the license record no longer has investigation status updated_license_record = self._provider_table.get_item( Key={ @@ -911,6 +833,26 @@ def test_license_investigation_close_handler_removes_investigation_status_from_l self.assertEqual(expected_license['investigations'], license_obj['investigations']) + # Verify event was published with correct details (should be called twice: creation + closure) + self.assertEqual(2, mock_publish_event.call_count) + call_args = mock_publish_event.call_args[1] + + expected_event_args = { + 'source': 'org.compactconnect.provider-data', + 'detail_type': 'license.investigationClosed', + 'event_batch_writer': None, + 'detail': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseTypeAbbreviation': test_license_record.licenseTypeAbbreviation, + 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationAgainst': 'license', + 'effectiveDate': '2024-11-08', # Date portion of DEFAULT_DATE_OF_UPDATE_TIMESTAMP + }, + } + self.assertEqual(expected_event_args, call_args) + def test_license_investigation_close_with_encumbrance_creates_encumbrance(self): from handlers.investigation import investigation_handler @@ -943,33 +885,3 @@ def test_license_investigation_close_with_encumbrance_creates_encumbrance(self): )['Item'] self.assertIn('resultingEncumbranceId', investigation_record) - - @patch('cc_common.event_bus_client.EventBusClient._publish_event') - def test_license_investigation_close_handler_publishes_event(self, mock_publish_event): - """Test that license investigation close handler publishes the correct event.""" - from handlers.investigation import investigation_handler - - event, test_license_record, investigation_id = self._when_testing_license_investigation_close() - - response = investigation_handler(event, self.mock_context) - self.assertEqual(200, response['statusCode']) - - # Verify event was published with correct details (should be called twice: creation + closure) - self.assertEqual(2, mock_publish_event.call_count) - call_args = mock_publish_event.call_args[1] - - expected_event_args = { - 'source': 'org.compactconnect.provider-data', - 'detail_type': 'license.investigationClosed', - 'event_batch_writer': None, - 'detail': { - 'compact': test_license_record.compact, - 'providerId': str(test_license_record.providerId), - 'jurisdiction': test_license_record.jurisdiction, - 'licenseTypeAbbreviation': test_license_record.licenseTypeAbbreviation, - 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'investigationAgainst': 'license', - 'effectiveDate': '2024-11-08', # Date portion of DEFAULT_DATE_OF_UPDATE_TIMESTAMP - }, - } - self.assertEqual(expected_event_args, call_args) From c5cbc8ad3e7af40f4120625497969089f79d8143 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Fri, 24 Oct 2025 14:15:09 -0600 Subject: [PATCH 15/33] Require investigationDetails for investigation updates --- .../cc_common/data_model/data_client.py | 2 +- .../data_model/provider_record_util.py | 13 +++++++-- .../cc_common/data_model/schema/common.py | 1 + .../schema/investigation/__init__.py | 6 ++-- .../data_model/schema/investigation/record.py | 3 +- .../data_model/schema/license/record.py | 11 ++++++++ .../data_model/schema/privilege/record.py | 13 +++++++++ .../test_schema/test_investigation.py | 28 ++++++++----------- .../test_schema/test_license.py | 16 +++++++++++ .../test_schema/test_privilege.py | 16 +++++++++++ 10 files changed, 83 insertions(+), 26 deletions(-) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index abdc407c5..d492e4f96 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -1769,7 +1769,7 @@ def close_investigation( update_record = update_data_type.create_new( { 'type': update_type, - 'updateType': UpdateCategory.INVESTIGATION, + 'updateType': UpdateCategory.CLOSING_INVESTIGATION, 'providerId': provider_id, 'compact': compact, 'jurisdiction': jurisdiction, diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py index eaa3dcd18..d13bf5d8b 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py @@ -257,7 +257,14 @@ def get_enriched_history_with_synthetic_updates_from_privilege( :param history: The raw history records we intend to extrapolate from :return: The enriched privilege history """ - create_date_sorted_original_history = sorted(history, key=lambda x: x['createDate']) + + # We don't ever serve investigation updates via the API - they're only for internal change history tracking + history_without_investigations = [ + update for update in history if update['updateType'] not in ( + UpdateCategory.INVESTIGATION, UpdateCategory.CLOSING_INVESTIGATION + ) + ] + create_date_sorted_original_history = sorted(history_without_investigations, key=lambda x: x['createDate']) # Inject issuance event enriched_history = [ @@ -786,7 +793,7 @@ def generate_api_response_object(self) -> dict: privileges = [] military_affiliations = [record.to_dict() for record in self._military_affiliation_records] - # Build licenses dict with history and adverseActions + # Build licenses dict with investigations and adverseActions for license_record in self._license_records: license_dict = license_record.to_dict() # Note that we do not add synthetic expiration events for license records like we do privileges. @@ -812,7 +819,7 @@ def generate_api_response_object(self) -> dict: ] licenses.append(license_dict) - # Build privileges dict with history and adverseActions + # Build privileges dict with investigations and adverseActions for privilege_record in self._privilege_records: privilege_dict = privilege_record.to_dict() privilege_updates = self.get_update_records_for_privilege( diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/common.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/common.py index 7167c755c..eb37fde1d 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/common.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/common.py @@ -301,6 +301,7 @@ class UpdateCategory(CCEnum): RENEWAL = 'renewal' ENCUMBRANCE = 'encumbrance' INVESTIGATION = 'investigation' + CLOSING_INVESTIGATION = 'closingInvestigation' HOME_JURISDICTION_CHANGE = 'homeJurisdictionChange' REGISTRATION = 'registration' LIFTING_ENCUMBRANCE = 'lifting_encumbrance' diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py index 298392114..da119c89b 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py @@ -1,5 +1,5 @@ # ruff: noqa: N802 we use camelCase to match the marshmallow schema definition -from datetime import date, datetime +from datetime import datetime from uuid import UUID from cc_common.data_model.schema.common import ( @@ -86,11 +86,11 @@ def creationDate(self, value: datetime) -> None: self._data['creationDate'] = value @property - def closeDate(self) -> date | None: + def closeDate(self) -> datetime | None: return self._data.get('closeDate') @closeDate.setter - def closeDate(self, value: date) -> None: + def closeDate(self, value: datetime) -> None: self._data['closeDate'] = value @property diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py index 701443a34..fc477e2d5 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py @@ -1,7 +1,6 @@ # ruff: noqa: N801, N815 invalid-name -from marshmallow import pre_dump +from marshmallow import ValidationError, pre_dump from marshmallow.fields import UUID, DateTime, String -from marshmallow.validate import ValidationError from cc_common.config import config from cc_common.data_model.schema.base_record import BaseRecordSchema diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py index 461a70fcc..bc3d660ee 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py @@ -16,6 +16,7 @@ ChangeHashMixin, CompactEligibilityStatus, LicenseEncumberedStatusEnum, + UpdateCategory, ) from cc_common.data_model.schema.fields import ( ActiveInactive, @@ -232,3 +233,13 @@ def validate_license_type(self, data, **kwargs): # noqa: ARG001 unused-argument license_types = config.license_types_for_compact(data['compact']) if data['licenseType'] not in license_types: raise ValidationError({'licenseType': [f'Must be one of: {", ".join(license_types)}.']}) + + @validates_schema + def validate_investigation_details_present_if_investigation_status_updated(self, data, **kwargs): # noqa: ARG002 + """ + Require investigationDetails whenever update type is investigation + """ + if data['updateType'] == UpdateCategory.INVESTIGATION and not data.get('investigationDetails'): + raise ValidationError({ + 'investigationDetails': ['This field is required when update was investigation type'] + }) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py index d0fb7f3bd..48c24d6fe 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py @@ -255,9 +255,22 @@ def generate_pk_sk(self, in_data, **kwargs): # noqa: ARG001 unused-argument @validates_schema def validate_deactivation_details_present_if_deactivation_update(self, data, **kwargs): # noqa: ARG002 unused-argument + """ + Require deactivationDetails whenever update type is deactivation + """ if data['updateType'] == UpdateCategory.DEACTIVATION and not data.get('deactivationDetails'): raise ValidationError({'deactivationDetails': ['This field is required when update was deactivation type']}) + @validates_schema + def validate_investigation_details_present_if_investigation_status_updated(self, data, **kwargs): # noqa: ARG002 + """ + Require investigationDetails whenever update type is investigation + """ + if data['updateType'] == UpdateCategory.INVESTIGATION and not data.get('investigationDetails'): + raise ValidationError({ + 'investigationDetails': ['This field is required when update was investigation type'] + }) + @pre_dump def generate_compact_transaction_gsi_field(self, in_data, **kwargs): # noqa: ARG001 unused-argument """ diff --git a/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py index 59cbd1a0a..7107791e5 100644 --- a/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py +++ b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py @@ -70,35 +70,29 @@ def setUp(self): def test_investigation_data_class_getters_return_expected_values(self): from cc_common.data_model.schema.investigation import InvestigationData - investigation_data = self.test_data_generator.generate_default_investigation().serialize_to_database_record() + investigation_data = self.test_data_generator.generate_default_investigation() - investigation = InvestigationData.from_database_record(investigation_data) + investigation = InvestigationData.from_database_record(investigation_data.serialize_to_database_record()) # Use to_dict() method to get expected values expected_investigation = investigation.to_dict() # Create actual object with all fields from database record actual_investigation = { - 'providerId': investigation_data['providerId'], - 'jurisdiction': investigation_data['jurisdiction'], - 'investigationAgainst': investigation_data['investigationAgainst'], - 'submittingUser': investigation_data['submittingUser'], - 'investigationId': investigation_data['investigationId'], - 'compact': investigation_data['compact'], - 'creationDate': investigation_data['creationDate'], - 'licenseType': investigation_data['licenseType'], - 'type': investigation_data['type'], + 'providerId': investigation_data.providerId, + 'jurisdiction': investigation_data.jurisdiction, + 'investigationAgainst': investigation_data.investigationAgainst, + 'submittingUser': investigation_data.submittingUser, + 'investigationId': investigation_data.investigationId, + 'compact': investigation_data.compact, + 'creationDate': investigation_data.creationDate, + 'licenseType': investigation_data.licenseType, + 'type': investigation_data.type, } # Pop dynamic fields from expected object expected_investigation.pop('dateOfUpdate') - # Convert expected values to strings to match database record format - expected_investigation['providerId'] = str(expected_investigation['providerId']) - expected_investigation['investigationId'] = str(expected_investigation['investigationId']) - expected_investigation['submittingUser'] = str(expected_investigation['submittingUser']) - expected_investigation['creationDate'] = expected_investigation['creationDate'].isoformat() - self.assertEqual(expected_investigation, actual_investigation) def test_investigation_data_class_outputs_expected_database_object(self): diff --git a/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_license.py b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_license.py index 2fd57fcdd..d251530bc 100644 --- a/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_license.py +++ b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_license.py @@ -244,6 +244,22 @@ def test_hash_is_unique(self): # The hashes should now be different self.assertNotEqual(change_hash, schema.hash_changes(schema.dump(alternate_record))) + def test_invalid_if_missing_investigation_details_when_update_type_is_investigation(self): + from cc_common.data_model.schema.license.record import LicenseUpdateRecordSchema + + with open('tests/resources/dynamo/license-update.json') as f: + privilege_data = json.load(f) + # Privilege investigation updates require an 'investigationDetails' fields + privilege_data['updateType'] = 'investigation' + + with self.assertRaises(ValidationError) as context: + LicenseUpdateRecordSchema().load(privilege_data) + + self.assertEqual( + {'investigationDetails': ['This field is required when update was investigation type']}, + context.exception.messages, + ) + class TestLicenseIngestSchema(TstLambdas): def test_calculated_status_to_jurisdiction_uploaded_status(self): diff --git a/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_privilege.py b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_privilege.py index c64355b47..e58a86270 100644 --- a/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_privilege.py +++ b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_privilege.py @@ -191,6 +191,22 @@ def test_invalid_if_missing_deactivation_details_when_update_type_is_deactivatio context.exception.messages, ) + def test_invalid_if_missing_investigation_details_when_update_type_is_investigation(self): + from cc_common.data_model.schema.privilege.record import PrivilegeUpdateRecordSchema + + with open('tests/resources/dynamo/privilege-update.json') as f: + privilege_data = json.load(f) + # Privilege investigation updates require an 'investigationDetails' fields + privilege_data['updateType'] = 'investigation' + + with self.assertRaises(ValidationError) as context: + PrivilegeUpdateRecordSchema().load(privilege_data) + + self.assertEqual( + {'investigationDetails': ['This field is required when update was investigation type']}, + context.exception.messages, + ) + def test_valid_if_deactivation_details_present_when_update_type_is_deactivation(self): from cc_common.data_model.schema.common import UpdateCategory from cc_common.data_model.schema.privilege.record import PrivilegeUpdateRecordSchema From 3f33b4e119af64a42d4efd6d9ea456dac9042d59 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Fri, 24 Oct 2025 14:45:19 -0600 Subject: [PATCH 16/33] Only remove investigation stats on last investigation closed --- .../cc_common/data_model/data_client.py | 122 +++-- .../common/tests/function/test_data_client.py | 20 +- .../test_handlers/test_investigation.py | 492 ++++++++++++++++++ 3 files changed, 578 insertions(+), 56 deletions(-) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index d492e4f96..0e8df91da 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -1719,7 +1719,9 @@ def close_investigation( resulting_encumbrance_id: str = None, ) -> None: """ - Closes an investigation by updating the investigation record and removing the investigation status. + Closes an investigation by updating the investigation record. + + Only removes the investigation status and creates an update record if this is the last open investigation. :param compact: The compact name :param provider_id: The provider ID @@ -1740,18 +1742,31 @@ def close_investigation( ): record_type = investigation_against.value - # Get the record (privilege or license) - try: - record = self.config.provider_table.get_item( - Key={ - 'pk': f'{compact}#PROVIDER#{provider_id}', - 'sk': f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#', - }, - )['Item'] - except KeyError as e: + # Query for the record (privilege or license) and all its investigations in a single query + from boto3.dynamodb.conditions import Key + + query_results = self.config.provider_table.query( + KeyConditionExpression=Key('pk').eq(f'{compact}#PROVIDER#{provider_id}') + & Key('sk').begins_with( + f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#' + ) + )['Items'] + + # Separate the main record from investigation records + record = None + investigation_records = [] + record_sk = f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#' + + for item in query_results: + if item['sk'] == record_sk: + record = item + elif '#INVESTIGATION#' in item['sk']: + investigation_records.append(item) + + if not record: message = f'{record_type.title()} not found for jurisdiction' logger.info(message) - raise CCNotFoundException(f'{record_type.title()} not found for jurisdiction {jurisdiction}') from e + raise CCNotFoundException(f'{record_type.title()} not found for jurisdiction {jurisdiction}') if investigation_against == InvestigationAgainstEnum.PRIVILEGE: record_data = PrivilegeData.from_database_record(record) @@ -1765,22 +1780,15 @@ def close_investigation( # Get license type from the record for the update record license_type = record_data.licenseType - # Create the update record for investigation closure - update_record = update_data_type.create_new( - { - 'type': update_type, - 'updateType': UpdateCategory.CLOSING_INVESTIGATION, - 'providerId': provider_id, - 'compact': compact, - 'jurisdiction': jurisdiction, - 'createDate': close_date, - 'effectiveDate': close_date, - 'licenseType': license_type, - 'previous': record_data.to_dict(), - 'updatedValues': {}, - 'removedValues': ['investigationStatus'], - } - ) + # Count open investigations (those without closeDate), excluding the one we're closing + open_investigations = [ + inv + for inv in investigation_records + if 'closeDate' not in inv and inv.get('investigationId') != investigation_id + ] + + # Determine if this is the last open investigation + is_last_open_investigation = len(open_investigations) == 0 # Prepare the transaction items # Build the investigation update expression and values @@ -1798,6 +1806,7 @@ def close_investigation( investigation_update_expression += ', resultingEncumbranceId = :resultingEncumbranceId' investigation_expression_values[':resultingEncumbranceId'] = {'S': str(resulting_encumbrance_id)} + # Always update the investigation record itself transaction_items = [ { 'Update': { @@ -1814,25 +1823,50 @@ def close_investigation( 'ExpressionAttributeValues': investigation_expression_values, } }, - self._generate_put_transaction_item(update_record.serialize_to_database_record()), - { - 'Update': { - 'TableName': self.config.provider_table.table_name, - 'Key': { - 'pk': {'S': f'{compact}#PROVIDER#{provider_id}'}, - 'sk': { - 'S': f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#' - }, - }, - 'UpdateExpression': 'REMOVE investigationStatus SET dateOfUpdate = :dateOfUpdate', - 'ConditionExpression': 'attribute_exists(pk)', - 'ExpressionAttributeValues': { - ':dateOfUpdate': {'S': close_date.isoformat()}, - }, - } - }, ] + # Only create update record and remove status if this is the last open investigation + if is_last_open_investigation: + # Create the update record for investigation closure + update_record = update_data_type.create_new( + { + 'type': update_type, + 'updateType': UpdateCategory.CLOSING_INVESTIGATION, + 'providerId': provider_id, + 'compact': compact, + 'jurisdiction': jurisdiction, + 'createDate': close_date, + 'effectiveDate': close_date, + 'licenseType': license_type, + 'previous': record_data.to_dict(), + 'updatedValues': {}, + 'removedValues': ['investigationStatus'], + } + ) + + transaction_items.extend( + [ + self._generate_put_transaction_item(update_record.serialize_to_database_record()), + { + 'Update': { + 'TableName': self.config.provider_table.table_name, + 'Key': { + 'pk': {'S': f'{compact}#PROVIDER#{provider_id}'}, + 'sk': { + 'S': f'{compact}#PROVIDER#{record_type}/{jurisdiction}/' + f'{license_type_abbreviation}#' + }, + }, + 'UpdateExpression': 'REMOVE investigationStatus SET dateOfUpdate = :dateOfUpdate', + 'ConditionExpression': 'attribute_exists(pk)', + 'ExpressionAttributeValues': { + ':dateOfUpdate': {'S': close_date.isoformat()}, + }, + } + }, + ] + ) + # Execute the transaction try: self.config.dynamodb_client.transact_write_items(TransactItems=transaction_items) diff --git a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py index 9441b16eb..925425072 100644 --- a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py +++ b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py @@ -1412,11 +1412,9 @@ def test_close_privilege_investigation_success(self): # Find the closure update record closure_update = None for update_record in update_records: - if update_record.get('updateType') == 'investigation': - # Check if this is the closure update (has removedValues) - if 'removedValues' in update_record and 'investigationStatus' in update_record['removedValues']: - closure_update = update_record - break + if update_record.get('updateType') == 'closingInvestigation': + closure_update = update_record + break self.assertIsNotNone(closure_update, 'Closure update record not found!') @@ -1424,7 +1422,7 @@ def test_close_privilege_investigation_success(self): expected_closure_update = { 'pk': f'aslp#PROVIDER#{provider_id}', 'type': 'privilegeUpdate', - 'updateType': 'investigation', + 'updateType': 'closingInvestigation', 'compact': 'aslp', 'providerId': provider_id, 'jurisdiction': 'ne', @@ -1549,11 +1547,9 @@ def test_close_license_investigation_success(self): # Find the closure update record closure_update = None for update_record in update_records: - if update_record.get('updateType') == 'investigation': - # Check if this is the closure update (has removedValues) - if 'removedValues' in update_record and 'investigationStatus' in update_record['removedValues']: - closure_update = update_record - break + if update_record.get('updateType') == 'closingInvestigation': + closure_update = update_record + break self.assertIsNotNone(closure_update, 'Closure update not found!') @@ -1561,7 +1557,7 @@ def test_close_license_investigation_success(self): expected_closure_update = { 'pk': f'aslp#PROVIDER#{provider_id}', 'type': 'licenseUpdate', - 'updateType': 'investigation', + 'updateType': 'closingInvestigation', 'compact': 'aslp', 'providerId': provider_id, 'jurisdiction': 'oh', diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py index 1f2d9734d..b37abd97f 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py @@ -885,3 +885,495 @@ def test_license_investigation_close_with_encumbrance_creates_encumbrance(self): )['Item'] self.assertIn('resultingEncumbranceId', investigation_record) + + +@mock_aws +@patch('cc_common.config._Config.current_standard_datetime', datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP)) +class TestMultipleSimultaneousPrivilegeInvestigations(TstFunction): + """Test suite for multiple simultaneous privilege investigations.""" + + def _load_privilege_data(self): + """Load privilege test data from JSON file""" + import json + from decimal import Decimal + + # Load provider record first + with open('../common/tests/resources/dynamo/provider.json') as f: + provider_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=provider_record) + + # Load privilege record + with open('../common/tests/resources/dynamo/privilege.json') as f: + privilege_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=privilege_record) + + # Return the privilege data as a data class + from cc_common.data_model.schema.privilege import PrivilegeData + + return PrivilegeData.from_database_record(privilege_record) + + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_closing_one_of_multiple_investigations_maintains_investigation_status(self, mock_publish_event): + """Test that closing one investigation while another is open maintains investigation status.""" + from cc_common.data_model.schema.common import InvestigationStatusEnum, UpdateCategory + from handlers.investigation import investigation_handler + from handlers.providers import get_provider + + test_privilege_record = self._load_privilege_data() + + # Create first investigation + first_investigation_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_privilege_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'POST', + 'resource': PRIVILEGE_INVESTIGATION_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseType': test_privilege_record.licenseTypeAbbreviation, + }, + }, + ) + + response = investigation_handler(first_investigation_event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Get the first investigation ID + investigation_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#INVESTIGATION' + ), + ) + first_investigation_id = investigation_records['Items'][0]['investigationId'] + + # Create second investigation + second_investigation_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_privilege_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'POST', + 'resource': PRIVILEGE_INVESTIGATION_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseType': test_privilege_record.licenseTypeAbbreviation, + }, + }, + ) + + response = investigation_handler(second_investigation_event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Get the second investigation ID + investigation_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#INVESTIGATION' + ), + ) + self.assertEqual(2, len(investigation_records['Items'])) + second_investigation_id = [ + item['investigationId'] + for item in investigation_records['Items'] + if item['investigationId'] != first_investigation_id + ][0] + + # Close the second investigation + close_second_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_privilege_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'PATCH', + 'resource': PRIVILEGE_INVESTIGATION_ID_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseType': test_privilege_record.licenseTypeAbbreviation, + 'investigationId': second_investigation_id, + }, + 'body': json.dumps({}), + }, + ) + + response = investigation_handler(close_second_event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Verify that the privilege record still shows under investigation + updated_privilege_record = self._provider_table.get_item( + Key={ + 'pk': test_privilege_record.serialize_to_database_record()['pk'], + 'sk': test_privilege_record.serialize_to_database_record()['sk'], + } + )['Item'] + + self.assertEqual( + InvestigationStatusEnum.UNDER_INVESTIGATION.value, + updated_privilege_record['investigationStatus'], + ) + + # Verify that one investigation is still visible in the API response + api_event = self.test_data_generator.generate_test_api_event( + scope_override=f'openid email {test_privilege_record.jurisdiction}/aslp.readGeneral', + value_overrides={ + 'httpMethod': 'GET', + 'resource': '/v1/compacts/{compact}/providers/{providerId}', + 'pathParameters': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + }, + }, + ) + + api_response = get_provider(api_event, self.mock_context) + self.assertEqual(200, api_response['statusCode']) + + provider_data = json.loads(api_response['body']) + privilege = provider_data['privileges'][0] + + self.assertEqual(1, len(privilege['investigations'])) + self.assertEqual(first_investigation_id, privilege['investigations'][0]['investigationId']) + + # Verify that there are two INVESTIGATION update records in the DB + update_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#UPDATE#' + ), + )['Items'] + + investigation_update_records = [ + record for record in update_records if record['updateType'] == UpdateCategory.INVESTIGATION + ] + self.assertEqual(2, len(investigation_update_records)) + + # Verify that there are no CLOSING_INVESTIGATION update records + closing_update_records = [ + record for record in update_records if record['updateType'] == UpdateCategory.CLOSING_INVESTIGATION + ] + self.assertEqual(0, len(closing_update_records)) + + # Verify that investigation closed event WAS published (should be 3 calls: 2 creation + 1 closure) + self.assertEqual(3, mock_publish_event.call_count) + call_types = [call[1]['detail_type'] for call in mock_publish_event.call_args_list] + self.assertEqual(2, call_types.count('privilege.investigation')) + self.assertEqual(1, call_types.count('privilege.investigationClosed')) + + # Now close the first investigation + close_first_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_privilege_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'PATCH', + 'resource': PRIVILEGE_INVESTIGATION_ID_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_privilege_record.compact, + 'providerId': str(test_privilege_record.providerId), + 'jurisdiction': test_privilege_record.jurisdiction, + 'licenseType': test_privilege_record.licenseTypeAbbreviation, + 'investigationId': first_investigation_id, + }, + 'body': json.dumps({}), + }, + ) + + response = investigation_handler(close_first_event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Verify that the privilege record no longer has investigation status + updated_privilege_record = self._provider_table.get_item( + Key={ + 'pk': test_privilege_record.serialize_to_database_record()['pk'], + 'sk': test_privilege_record.serialize_to_database_record()['sk'], + } + )['Item'] + + self.assertNotIn('investigationStatus', updated_privilege_record) + + # Verify that there are no investigations visible in the API response + api_response = get_provider(api_event, self.mock_context) + self.assertEqual(200, api_response['statusCode']) + + provider_data = json.loads(api_response['body']) + privilege = provider_data['privileges'][0] + + self.assertEqual(0, len(privilege['investigations'])) + + # Verify that there are still two INVESTIGATION update records in the DB + update_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#UPDATE#' + ), + )['Items'] + + investigation_update_records = [ + record for record in update_records if record['updateType'] == UpdateCategory.INVESTIGATION + ] + self.assertEqual(2, len(investigation_update_records)) + + # Verify that there is one CLOSING_INVESTIGATION update record in the DB + closing_update_records = [ + record for record in update_records if record['updateType'] == UpdateCategory.CLOSING_INVESTIGATION + ] + self.assertEqual(1, len(closing_update_records)) + + # Verify that investigation closed events were published (should be 4 calls total: 2 creation + 2 closure) + self.assertEqual(4, mock_publish_event.call_count) + call_types = [call[1]['detail_type'] for call in mock_publish_event.call_args_list] + self.assertEqual(2, call_types.count('privilege.investigation')) + self.assertEqual(2, call_types.count('privilege.investigationClosed')) + + +@mock_aws +@patch('cc_common.config._Config.current_standard_datetime', datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP)) +class TestMultipleSimultaneousLicenseInvestigations(TstFunction): + """Test suite for multiple simultaneous license investigations.""" + + def _load_license_data(self): + """Load license test data from JSON file""" + import json + from decimal import Decimal + + # Load provider record first + with open('../common/tests/resources/dynamo/provider.json') as f: + provider_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=provider_record) + + # Load license record + with open('../common/tests/resources/dynamo/license.json') as f: + license_record = json.load(f, parse_float=Decimal) + self._provider_table.put_item(Item=license_record) + + # Return the license data as a data class + from cc_common.data_model.schema.license import LicenseData + + return LicenseData.from_database_record(license_record) + + @patch('cc_common.event_bus_client.EventBusClient._publish_event') + def test_closing_one_of_multiple_investigations_maintains_investigation_status(self, mock_publish_event): + """Test that closing one investigation while another is open maintains investigation status.""" + from cc_common.data_model.schema.common import InvestigationStatusEnum, UpdateCategory + from handlers.investigation import investigation_handler + from handlers.providers import get_provider + + test_license_record = self._load_license_data() + + # Create first investigation + first_investigation_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_license_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'POST', + 'resource': LICENSE_INVESTIGATION_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseType': test_license_record.licenseTypeAbbreviation, + }, + }, + ) + + response = investigation_handler(first_investigation_event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Get the first investigation ID + investigation_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#INVESTIGATION' + ), + ) + first_investigation_id = investigation_records['Items'][0]['investigationId'] + + # Create second investigation + second_investigation_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_license_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'POST', + 'resource': LICENSE_INVESTIGATION_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseType': test_license_record.licenseTypeAbbreviation, + }, + }, + ) + + response = investigation_handler(second_investigation_event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Get the second investigation ID + investigation_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#INVESTIGATION' + ), + ) + self.assertEqual(2, len(investigation_records['Items'])) + second_investigation_id = [ + item['investigationId'] + for item in investigation_records['Items'] + if item['investigationId'] != first_investigation_id + ][0] + + # Close the second investigation + close_second_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_license_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'PATCH', + 'resource': LICENSE_INVESTIGATION_ID_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseType': test_license_record.licenseTypeAbbreviation, + 'investigationId': second_investigation_id, + }, + 'body': json.dumps({}), + }, + ) + + response = investigation_handler(close_second_event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Verify that the license record still shows under investigation + updated_license_record = self._provider_table.get_item( + Key={ + 'pk': test_license_record.serialize_to_database_record()['pk'], + 'sk': test_license_record.serialize_to_database_record()['sk'], + } + )['Item'] + + self.assertEqual( + InvestigationStatusEnum.UNDER_INVESTIGATION, + updated_license_record['investigationStatus'], + ) + + # Verify that one investigation is still visible in the API response + api_event = self.test_data_generator.generate_test_api_event( + scope_override=f'openid email {test_license_record.jurisdiction}/aslp.readGeneral', + value_overrides={ + 'httpMethod': 'GET', + 'resource': '/v1/compacts/{compact}/providers/{providerId}', + 'pathParameters': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + }, + }, + ) + + api_response = get_provider(api_event, self.mock_context) + self.assertEqual(200, api_response['statusCode']) + + provider_data = json.loads(api_response['body']) + license_obj = provider_data['licenses'][0] + + self.assertEqual(1, len(license_obj['investigations'])) + self.assertEqual(first_investigation_id, license_obj['investigations'][0]['investigationId']) + + # Verify that there are two INVESTIGATION update records in the DB + update_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#UPDATE#' + ), + )['Items'] + + investigation_update_records = [ + record for record in update_records if record['updateType'] == UpdateCategory.INVESTIGATION + ] + self.assertEqual(2, len(investigation_update_records)) + + # Verify that there are no CLOSING_INVESTIGATION update records + closing_update_records = [ + record for record in update_records if record['updateType'] == UpdateCategory.CLOSING_INVESTIGATION + ] + self.assertEqual(0, len(closing_update_records)) + + # Verify that investigation closed event WAS published (should be 3 calls: 2 creation + 1 closure) + self.assertEqual(3, mock_publish_event.call_count) + call_types = [call[1]['detail_type'] for call in mock_publish_event.call_args_list] + self.assertEqual(2, call_types.count('license.investigation')) + self.assertEqual(1, call_types.count('license.investigationClosed')) + + # Now close the first investigation + close_first_event = self.test_data_generator.generate_test_api_event( + sub_override=DEFAULT_AA_SUBMITTING_USER_ID, + scope_override=f'openid email {test_license_record.jurisdiction}/aslp.admin', + value_overrides={ + 'httpMethod': 'PATCH', + 'resource': LICENSE_INVESTIGATION_ID_ENDPOINT_RESOURCE, + 'pathParameters': { + 'compact': test_license_record.compact, + 'providerId': str(test_license_record.providerId), + 'jurisdiction': test_license_record.jurisdiction, + 'licenseType': test_license_record.licenseTypeAbbreviation, + 'investigationId': first_investigation_id, + }, + 'body': json.dumps({}), + }, + ) + + response = investigation_handler(close_first_event, self.mock_context) + self.assertEqual(200, response['statusCode']) + + # Verify that the license record no longer has investigation status + updated_license_record = self._provider_table.get_item( + Key={ + 'pk': test_license_record.serialize_to_database_record()['pk'], + 'sk': test_license_record.serialize_to_database_record()['sk'], + } + )['Item'] + + self.assertNotIn('investigationStatus', updated_license_record) + + # Verify that there are no investigations visible in the API response + api_response = get_provider(api_event, self.mock_context) + self.assertEqual(200, api_response['statusCode']) + + provider_data = json.loads(api_response['body']) + license_obj = provider_data['licenses'][0] + + self.assertEqual(0, len(license_obj['investigations'])) + + # Verify that there are still two INVESTIGATION update records in the DB + update_records = self._provider_table.query( + Select='ALL_ATTRIBUTES', + KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) + & Key('sk').begins_with( + f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#UPDATE#' + ), + )['Items'] + + investigation_update_records = [ + record for record in update_records if record['updateType'] == UpdateCategory.INVESTIGATION + ] + self.assertEqual(2, len(investigation_update_records)) + + # Verify that there is one CLOSING_INVESTIGATION update record in the DB + closing_update_records = [ + record for record in update_records if record['updateType'] == UpdateCategory.CLOSING_INVESTIGATION + ] + self.assertEqual(1, len(closing_update_records)) + + # Verify that investigation closed events were published (should be 4 calls total: 2 creation + 2 closure) + self.assertEqual(4, mock_publish_event.call_count) + call_types = [call[1]['detail_type'] for call in mock_publish_event.call_args_list] + self.assertEqual(2, call_types.count('license.investigation')) + self.assertEqual(2, call_types.count('license.investigationClosed')) From dce2bda396093f6c5db7de8704d5003a23500bd2 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Fri, 24 Oct 2025 15:36:06 -0600 Subject: [PATCH 17/33] Clean up investigation event interfaces --- .../cc_common/data_model/data_client.py | 2 -- .../data_model/schema/data_event/api.py | 4 +-- .../common/cc_common/email_service_client.py | 24 +++++++++++++ .../common/cc_common/event_bus_client.py | 22 ++++++------ .../test_investigation_event_bus_client.py | 35 +++++++++++++------ .../function/test_investigation_events.py | 10 +++--- .../handlers/investigation.py | 23 ++++++++---- .../test_handlers/test_investigation.py | 7 ++-- 8 files changed, 84 insertions(+), 43 deletions(-) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index 0e8df91da..1385a0c33 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -1743,8 +1743,6 @@ def close_investigation( record_type = investigation_against.value # Query for the record (privilege or license) and all its investigations in a single query - from boto3.dynamodb.conditions import Key - query_results = self.config.provider_table.query( KeyConditionExpression=Key('pk').eq(f'{compact}#PROVIDER#{provider_id}') & Key('sk').begins_with( diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py index 019d68f45..5de6d0f36 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py @@ -56,11 +56,9 @@ class EncumbranceEventDetailSchema(DataEventDetailBaseSchema): class InvestigationEventDetailSchema(DataEventDetailBaseSchema): providerId = UUID(required=True, allow_none=False) - investigationId = UUID(required=False, allow_none=False) + investigationId = UUID(required=True, allow_none=False) licenseTypeAbbreviation = String(required=True, allow_none=False) investigationAgainst = String(required=True, allow_none=False) - creationDate = DateTime(required=False, allow_none=False) - effectiveDate = Date(required=False, allow_none=False) class LicenseDeactivationDetailSchema(DataEventDetailBaseSchema): diff --git a/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py b/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py index 3f6c4ea65..221bbca82 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py @@ -323,6 +323,9 @@ def send_license_encumbrance_state_notification_email( :param template_variables: Template variables for the email :return: Response from the email notification service """ + if template_variables.provider_id is None: + raise ValueError('Provider ID is required for state notification emails') + payload = { 'compact': compact, 'jurisdiction': jurisdiction, @@ -384,6 +387,9 @@ def send_license_encumbrance_lifting_state_notification_email( :param template_variables: Template variables for the email :return: Response from the email notification service """ + if template_variables.provider_id is None: + raise ValueError('Provider ID is required for state notification emails') + payload = { 'compact': compact, 'jurisdiction': jurisdiction, @@ -445,6 +451,9 @@ def send_privilege_encumbrance_state_notification_email( :param template_variables: Template variables for the email :return: Response from the email notification service """ + if template_variables.provider_id is None: + raise ValueError('Provider ID is required for state notification emails.') + payload = { 'compact': compact, 'jurisdiction': jurisdiction, @@ -506,6 +515,9 @@ def send_privilege_encumbrance_lifting_state_notification_email( :param template_variables: Template variables for the email :return: Response from the email notification service """ + if template_variables.provider_id is None: + raise ValueError('Provider ID is required for state notification emails.') + payload = { 'compact': compact, 'jurisdiction': jurisdiction, @@ -653,6 +665,9 @@ def send_license_investigation_state_notification_email( :param template_variables: Template variables for the email :return: Response from the email notification service """ + if template_variables.provider_id is None: + raise ValueError('provider_id must be provided for state notifications') + payload = { 'compact': compact, 'jurisdiction': jurisdiction, @@ -712,6 +727,9 @@ def send_license_investigation_closed_state_notification_email( :param template_variables: Template variables for the email :return: Response from the email notification service """ + if template_variables.provider_id is None: + raise ValueError('provider_id must be provided for state notifications') + payload = { 'compact': compact, 'jurisdiction': jurisdiction, @@ -771,6 +789,9 @@ def send_privilege_investigation_state_notification_email( :param template_variables: Template variables for the email :return: Response from the email notification service """ + if template_variables.provider_id is None: + raise ValueError('provider_id must be provided for state notifications') + payload = { 'compact': compact, 'jurisdiction': jurisdiction, @@ -830,6 +851,9 @@ def send_privilege_investigation_closed_state_notification_email( :param template_variables: Template variables for the email :return: Response from the email notification service """ + if template_variables.provider_id is None: + raise ValueError('provider_id must be provided for state notifications') + payload = { 'compact': compact, 'jurisdiction': jurisdiction, diff --git a/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py b/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py index a673f31f3..b4fbe6490 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py @@ -345,7 +345,7 @@ def publish_investigation_event( license_type_abbreviation: str, create_date: datetime, investigation_against: InvestigationAgainstEnum, - investigation_id: UUID | None = None, + investigation_id: UUID, event_batch_writer: EventBatchWriter | None = None, ): """ @@ -358,7 +358,7 @@ def publish_investigation_event( :param license_type_abbreviation: The license type abbreviation :param create_date: The datetime when the investigation record was created :param investigation_against: The type of record being investigated (privilege or license) - :param investigation_id: The investigation ID (optional, only for license investigations) + :param investigation_id: The investigation ID :param event_batch_writer: Optional EventBatchWriter for efficient batch publishing """ event_detail = { @@ -367,14 +367,10 @@ def publish_investigation_event( 'jurisdiction': jurisdiction, 'licenseTypeAbbreviation': license_type_abbreviation, 'investigationAgainst': investigation_against.value, - 'createDate': create_date, - 'eventTime': config.current_standard_datetime, + 'investigationId': investigation_id, + 'eventTime': create_date, } - # Add investigation_id if provided (for license investigations) - if investigation_id is not None: - event_detail['investigationId'] = investigation_id - investigation_detail_schema = InvestigationEventDetailSchema() deserialized_detail = investigation_detail_schema.dump(event_detail) @@ -395,8 +391,9 @@ def publish_investigation_closed_event( provider_id: UUID, jurisdiction: str, license_type_abbreviation: str, - effective_date: date, + close_date: datetime, investigation_against: InvestigationAgainstEnum, + investigation_id: UUID, event_batch_writer: EventBatchWriter | None = None, ): """ @@ -407,8 +404,9 @@ def publish_investigation_closed_event( :param provider_id: The provider ID :param jurisdiction: The jurisdiction of the record being investigated :param license_type_abbreviation: The license type abbreviation - :param effective_date: The date when the investigation was closed + :param close_date: The datetime when the investigation record was closed :param investigation_against: The type of record being investigated (privilege or license) + :param investigation_id: The id of the investigation closed :param event_batch_writer: Optional EventBatchWriter for efficient batch publishing """ event_detail = { @@ -417,8 +415,8 @@ def publish_investigation_closed_event( 'jurisdiction': jurisdiction, 'licenseTypeAbbreviation': license_type_abbreviation, 'investigationAgainst': investigation_against.value, - 'effectiveDate': effective_date, - 'eventTime': config.current_standard_datetime, + 'investigationId': investigation_id, + 'eventTime': close_date, } investigation_detail_schema = InvestigationEventDetailSchema() diff --git a/backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py b/backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py index eea1e4d66..c7e09d27a 100644 --- a/backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py +++ b/backend/compact-connect/lambdas/python/common/tests/unit/test_investigation_event_bus_client.py @@ -1,5 +1,5 @@ import json -from datetime import date, datetime +from datetime import datetime from unittest.mock import MagicMock from uuid import uuid4 @@ -21,6 +21,7 @@ def test_publish_privilege_investigation_event(self): from cc_common.data_model.schema.common import InvestigationAgainstEnum provider_id = uuid4() + investigation_id = uuid4() create_date = datetime.fromisoformat('2024-02-15T12:00:00+00:00') # Call the method @@ -32,6 +33,7 @@ def test_publish_privilege_investigation_event(self): license_type_abbreviation='slp', create_date=create_date, investigation_against=InvestigationAgainstEnum.PRIVILEGE, + investigation_id=investigation_id, ) # Verify put_events was called @@ -55,6 +57,7 @@ def test_publish_privilege_investigation_event(self): expected_detail = { 'compact': 'aslp', 'providerId': str(provider_id), + 'investigationId': str(investigation_id), 'jurisdiction': 'ne', 'licenseTypeAbbreviation': 'slp', 'investigationAgainst': 'privilege', @@ -132,7 +135,8 @@ def test_publish_privilege_investigation_closed_event(self): from cc_common.data_model.schema.common import InvestigationAgainstEnum provider_id = uuid4() - effective_date = date.fromisoformat('2024-03-15') + investigation_id = uuid4() + close_date = datetime.fromisoformat('2024-03-15T12:00:00+00:00') # Call the method self.client.publish_investigation_closed_event( @@ -141,8 +145,9 @@ def test_publish_privilege_investigation_closed_event(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - effective_date=effective_date, + close_date=close_date, investigation_against=InvestigationAgainstEnum.PRIVILEGE, + investigation_id=investigation_id, ) # Verify put_events was called @@ -166,10 +171,10 @@ def test_publish_privilege_investigation_closed_event(self): expected_detail = { 'compact': 'aslp', 'providerId': str(provider_id), + 'investigationId': str(investigation_id), 'jurisdiction': 'ne', 'licenseTypeAbbreviation': 'slp', 'investigationAgainst': 'privilege', - 'effectiveDate': '2024-03-15', } # Pop dynamic field from actual event @@ -187,7 +192,8 @@ def test_publish_license_investigation_closed_event(self): from cc_common.data_model.schema.common import InvestigationAgainstEnum provider_id = uuid4() - effective_date = date.fromisoformat('2024-03-15') + investigation_id = uuid4() + close_date = datetime.fromisoformat('2024-03-15T12:00:00+00:00') # Call the method self.client.publish_investigation_closed_event( @@ -196,8 +202,9 @@ def test_publish_license_investigation_closed_event(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - effective_date=effective_date, + close_date=close_date, investigation_against=InvestigationAgainstEnum.LICENSE, + investigation_id=investigation_id, ) # Verify put_events was called @@ -221,10 +228,10 @@ def test_publish_license_investigation_closed_event(self): expected_detail = { 'compact': 'aslp', 'providerId': str(provider_id), + 'investigationId': str(investigation_id), 'jurisdiction': 'ne', 'licenseTypeAbbreviation': 'slp', 'investigationAgainst': 'license', - 'effectiveDate': '2024-03-15', } # Pop dynamic field from actual event @@ -242,6 +249,7 @@ def test_publish_privilege_investigation_event_with_batch_writer(self): from cc_common.data_model.schema.common import InvestigationAgainstEnum provider_id = uuid4() + investigation_id = uuid4() create_date = datetime.fromisoformat('2024-02-15T12:00:00+00:00') # Mock batch writer @@ -256,6 +264,7 @@ def test_publish_privilege_investigation_event_with_batch_writer(self): license_type_abbreviation='slp', create_date=create_date, investigation_against=InvestigationAgainstEnum.PRIVILEGE, + investigation_id=investigation_id, event_batch_writer=mock_batch_writer, ) @@ -300,7 +309,8 @@ def test_publish_privilege_investigation_closed_event_with_batch_writer(self): from cc_common.data_model.schema.common import InvestigationAgainstEnum provider_id = uuid4() - effective_date = date.fromisoformat('2024-03-15') + investigation_id = uuid4() + close_date = datetime.fromisoformat('2024-03-15T12:00:00+00:00') # Mock batch writer mock_batch_writer = MagicMock() @@ -312,8 +322,9 @@ def test_publish_privilege_investigation_closed_event_with_batch_writer(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - effective_date=effective_date, + close_date=close_date, investigation_against=InvestigationAgainstEnum.PRIVILEGE, + investigation_id=investigation_id, event_batch_writer=mock_batch_writer, ) @@ -328,7 +339,8 @@ def test_publish_license_investigation_closed_event_with_batch_writer(self): from cc_common.data_model.schema.common import InvestigationAgainstEnum provider_id = uuid4() - effective_date = date.fromisoformat('2024-03-15') + investigation_id = uuid4() + close_date = datetime.fromisoformat('2024-03-15T12:00:00+00:00') # Mock batch writer mock_batch_writer = MagicMock() @@ -340,8 +352,9 @@ def test_publish_license_investigation_closed_event_with_batch_writer(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - effective_date=effective_date, + close_date=close_date, investigation_against=InvestigationAgainstEnum.LICENSE, + investigation_id=investigation_id, event_batch_writer=mock_batch_writer, ) diff --git a/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py b/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py index de44d7234..5444354be 100644 --- a/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py +++ b/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py @@ -1,7 +1,7 @@ import json from datetime import datetime from unittest.mock import patch -from uuid import UUID +from uuid import UUID, uuid4 from common_test.test_constants import ( DEFAULT_COMPACT, @@ -31,7 +31,7 @@ def _generate_license_investigation_message(self, message_overrides=None): 'licenseTypeAbbreviation': DEFAULT_LICENSE_TYPE_ABBREVIATION, 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, 'investigationAgainst': 'license', - 'createDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationId': str(uuid4()), } } if message_overrides: @@ -48,7 +48,7 @@ def _generate_license_investigation_closed_message(self, message_overrides=None) 'licenseTypeAbbreviation': DEFAULT_LICENSE_TYPE_ABBREVIATION, 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, 'investigationAgainst': 'license', - 'effectiveDate': '2024-01-15', + 'investigationId': str(uuid4()), } } if message_overrides: @@ -65,7 +65,7 @@ def _generate_privilege_investigation_message(self, message_overrides=None): 'licenseTypeAbbreviation': DEFAULT_LICENSE_TYPE_ABBREVIATION, 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, 'investigationAgainst': 'privilege', - 'createDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'investigationId': str(uuid4()), } } if message_overrides: @@ -82,7 +82,7 @@ def _generate_privilege_investigation_closed_message(self, message_overrides=Non 'licenseTypeAbbreviation': DEFAULT_LICENSE_TYPE_ABBREVIATION, 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, 'investigationAgainst': 'privilege', - 'effectiveDate': '2024-01-15', + 'investigationId': str(uuid4()), } } if message_overrides: diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py index 8e15a83bf..e8536431b 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py @@ -1,5 +1,5 @@ import json -from uuid import uuid4 +from uuid import UUID, uuid4 from aws_lambda_powertools.utilities.typing import LambdaContext from cc_common.config import config, logger @@ -125,6 +125,7 @@ def handle_privilege_investigation(event: dict) -> dict: create_date=investigation.creationDate, license_type_abbreviation=investigation.licenseTypeAbbreviation, investigation_against=InvestigationAgainstEnum.PRIVILEGE, + investigation_id=investigation.investigationId, ) return {'message': 'OK'} @@ -172,7 +173,10 @@ def handle_privilege_investigation_close(event: dict) -> dict: jurisdiction = event['pathParameters']['jurisdiction'] provider_id = event['pathParameters']['providerId'] license_type_abbr = event['pathParameters']['licenseType'].lower() - investigation_id = event['pathParameters']['investigationId'] + try: + investigation_id = UUID(event['pathParameters']['investigationId']) + except ValueError as e: + raise CCInvalidRequestException('Invalid investigationId provided') from e cognito_sub = event['requestContext']['authorizer']['claims']['sub'] investigation_patch_body = _load_investigation_patch_body(event) @@ -199,7 +203,7 @@ def handle_privilege_investigation_close(event: dict) -> dict: provider_id=provider_id, jurisdiction=jurisdiction, license_type_abbreviation=license_type_abbr, - investigation_id=investigation_id, + investigation_id=str(investigation_id), closing_user=cognito_sub, close_date=now, investigation_against=InvestigationAgainstEnum.PRIVILEGE, @@ -213,8 +217,9 @@ def handle_privilege_investigation_close(event: dict) -> dict: provider_id=provider_id, jurisdiction=jurisdiction, license_type_abbreviation=license_type_abbr, - effective_date=now, + close_date=now, investigation_against=InvestigationAgainstEnum.PRIVILEGE, + investigation_id=investigation_id, ) return {'message': 'OK'} @@ -227,7 +232,10 @@ def handle_license_investigation_close(event: dict) -> dict: jurisdiction = event['pathParameters']['jurisdiction'] provider_id = event['pathParameters']['providerId'] license_type_abbr = event['pathParameters']['licenseType'].lower() - investigation_id = event['pathParameters']['investigationId'] + try: + investigation_id = UUID(event['pathParameters']['investigationId']) + except ValueError as e: + raise CCInvalidRequestException('Invalid investigationId provided') from e cognito_sub = event['requestContext']['authorizer']['claims']['sub'] investigation_patch_body = _load_investigation_patch_body(event) @@ -255,7 +263,7 @@ def handle_license_investigation_close(event: dict) -> dict: provider_id=provider_id, jurisdiction=jurisdiction, license_type_abbreviation=license_type_abbr, - investigation_id=investigation_id, + investigation_id=str(investigation_id), closing_user=cognito_sub, close_date=now, investigation_against=InvestigationAgainstEnum.LICENSE, @@ -269,8 +277,9 @@ def handle_license_investigation_close(event: dict) -> dict: provider_id=provider_id, jurisdiction=jurisdiction, license_type_abbreviation=license_type_abbr, - effective_date=now, + close_date=now, investigation_against=InvestigationAgainstEnum.LICENSE, + investigation_id=investigation_id, ) return {'message': 'OK'} diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py index b37abd97f..934a547e4 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py @@ -209,6 +209,7 @@ def test_privilege_investigation_handler(self, mock_publish_event): 'licenseTypeAbbreviation': test_privilege_record.licenseTypeAbbreviation, 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, 'investigationAgainst': 'privilege', + 'investigationId': call_args['detail']['investigationId'], # Dynamic field }, } self.assertEqual(expected_event_args, call_args) @@ -411,7 +412,7 @@ def test_license_investigation_handler(self, mock_publish_event): 'licenseTypeAbbreviation': test_license_record.licenseTypeAbbreviation, 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, 'investigationAgainst': 'license', - 'investigationId': call_args['detail']['investigationId'], + 'investigationId': call_args['detail']['investigationId'], # Dynamic field }, } self.assertEqual(expected_event_args, call_args) @@ -628,7 +629,7 @@ def test_privilege_investigation_close_handler(self, mock_publish_event): 'licenseTypeAbbreviation': test_privilege_record.licenseTypeAbbreviation, 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, 'investigationAgainst': 'privilege', - 'effectiveDate': '2024-11-08', # Date portion of DEFAULT_DATE_OF_UPDATE_TIMESTAMP + 'investigationId': call_args['detail']['investigationId'], # Dynamic field }, } self.assertEqual(expected_event_args, call_args) @@ -848,7 +849,7 @@ def test_license_investigation_close_handler(self, mock_publish_event): 'licenseTypeAbbreviation': test_license_record.licenseTypeAbbreviation, 'eventTime': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, 'investigationAgainst': 'license', - 'effectiveDate': '2024-11-08', # Date portion of DEFAULT_DATE_OF_UPDATE_TIMESTAMP + 'investigationId': call_args['detail']['investigationId'], # Dynamic field }, } self.assertEqual(expected_event_args, call_args) From 42dcb0ca20cd0d1c908dc7ea93f928f7638d180a Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Sat, 25 Oct 2025 14:26:51 -0600 Subject: [PATCH 18/33] PR feedback --- .../api-specification/latest-oas30.json | 77 ++--- .../internal/postman/postman-collection.json | 300 +++++++++--------- .../docs/postman/postman-collection.json | 36 +-- .../cc_common/data_model/data_client.py | 10 +- .../data_model/provider_record_util.py | 6 +- .../data_model/schema/license/record.py | 6 +- .../data_model/schema/privilege/record.py | 6 +- .../lambdas/python/common/requirements-dev.in | 2 +- .../handlers/investigation_events.py | 7 +- .../provider-data-v1/requirements-dev.in | 2 +- .../test_handlers/test_investigation.py | 9 +- .../python/purchases/requirements-dev.in | 2 +- .../python/staff-users/requirements-dev.in | 2 +- backend/compact-connect/requirements-dev.in | 2 +- .../api_lambda_stack/provider_management.py | 3 +- .../stacks/api_stack/v1_api/api_model.py | 62 ++-- backend/compact-connect/tests/app/base.py | 17 + .../app/test_api/test_investigation_api.py | 6 +- .../GET_PROVIDER_RESPONSE_SCHEMA.json | 42 +-- ..._MILITARY_AFFILIATION_RESPONSE_SCHEMA.json | 3 +- .../PROVIDER_USER_RESPONSE_SCHEMA.json | 42 +-- .../PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json | 18 +- ...UBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json | 3 +- .../QUERY_PROVIDERS_RESPONSE_SCHEMA.json | 3 +- .../tests/smoke/investigation_smoke_tests.py | 2 +- 25 files changed, 299 insertions(+), 369 deletions(-) diff --git a/backend/compact-connect/docs/internal/api-specification/latest-oas30.json b/backend/compact-connect/docs/internal/api-specification/latest-oas30.json index 28d04aff8..cf8fa3caa 100644 --- a/backend/compact-connect/docs/internal/api-specification/latest-oas30.json +++ b/backend/compact-connect/docs/internal/api-specification/latest-oas30.json @@ -2,7 +2,7 @@ "openapi": "3.0.1", "info": { "title": "LicenseApi", - "version": "2025-10-22T20:31:18Z" + "version": "2025-10-25T20:22:36Z" }, "servers": [ { @@ -3305,10 +3305,9 @@ } }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", "description": "The date the document was last updated", - "format": "date" + "format": "date-time" }, "status": { "type": "string", @@ -3999,9 +3998,8 @@ ] }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } } @@ -4520,9 +4518,8 @@ "format": "date" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } }, @@ -4675,9 +4672,8 @@ "format": "date" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } }, @@ -4688,9 +4684,8 @@ ] }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" }, "updateType": { "type": "string", @@ -4878,17 +4873,15 @@ "type": "string" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } } }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" }, "status": { "type": "string", @@ -5123,9 +5116,8 @@ "type": "string" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } }, @@ -5876,9 +5868,8 @@ ] }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" }, "effectiveDate": { "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", @@ -5902,9 +5893,8 @@ ] }, "createDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } } @@ -7006,9 +6996,8 @@ "format": "email" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } } @@ -7467,14 +7456,12 @@ ] }, "creationDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } } @@ -7714,9 +7701,8 @@ "format": "date" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" }, "status": { "type": "string", @@ -7971,9 +7957,8 @@ "format": "date" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" }, "status": { "type": "string", @@ -7991,9 +7976,8 @@ ] }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" }, "updateType": { "type": "string", @@ -8201,17 +8185,15 @@ "type": "string" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } } }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" }, "status": { "type": "string", @@ -8663,14 +8645,12 @@ ] }, "creationDate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } } @@ -9149,9 +9129,8 @@ ] }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" }, "updateType": { "type": "string", @@ -9336,17 +9315,15 @@ "type": "string" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } } }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } } @@ -9424,9 +9401,8 @@ ] }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" }, "fileNames": { "type": "array", @@ -9477,9 +9453,8 @@ "format": "email" }, "dateOfUpdate": { - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", "type": "string", - "format": "date" + "format": "date-time" } } } diff --git a/backend/compact-connect/docs/internal/postman/postman-collection.json b/backend/compact-connect/docs/internal/postman/postman-collection.json index 65c3de7f3..95d30af5f 100644 --- a/backend/compact-connect/docs/internal/postman/postman-collection.json +++ b/backend/compact-connect/docs/internal/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "0cd0e938-75e5-4181-82d8-d867dbb6b718", + "_postman_id": "179bef81-c814-4f39-b68f-25eae581d972", "description": { "content": "", "type": "text/plain" @@ -401,7 +401,7 @@ "item": [ { "event": [], - "id": "bc96f59d-6d05-4971-a377-67ad2bb95a57", + "id": "09f8047e-7146-4010-9338-bf44e22fa398", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -444,7 +444,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nh\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nv\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}", + "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nv\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"mn\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}", "code": 200, "cookie": [], "header": [ @@ -453,7 +453,7 @@ "value": "application/json" } ], - "id": "75214a0e-3299-4f16-9887-5f3637a082aa", + "id": "b8fb575d-d1c3-41b2-b124-b648d65ad31b", "name": "200 response", "originalRequest": { "body": {}, @@ -491,7 +491,7 @@ }, { "event": [], - "id": "6af922f5-116d-4049-a2b0-7e428910fa75", + "id": "641f8416-56ba-44a0-9207-1197b3da2a97", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -505,7 +505,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nj\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ia\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"mo\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ca\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" }, "description": {}, "header": [ @@ -556,7 +556,7 @@ "value": "application/json" } ], - "id": "8ce823dd-2109-4e27-9b1d-254c2105a7c3", + "id": "03c1416d-2792-4aba-9863-fe7209e488ca", "name": "200 response", "originalRequest": { "body": { @@ -567,7 +567,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nj\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ia\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"mo\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ca\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" }, "header": [ { @@ -613,7 +613,7 @@ "item": [ { "event": [], - "id": "c14fbbe9-2c8b-4883-8cdb-1bb925b91333", + "id": "7a448112-dad4-4ba6-a801-942fdbe6476c", "name": "/v1/compacts/:compact/attestations/:attestationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -668,7 +668,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"dateCreated\": \"\",\n \"attestationId\": \"\",\n \"compact\": \"octp\",\n \"text\": \"\",\n \"type\": \"attestation\",\n \"locale\": \"\",\n \"version\": \"\",\n \"required\": \"\"\n}", + "body": "{\n \"dateCreated\": \"\",\n \"attestationId\": \"\",\n \"compact\": \"aslp\",\n \"text\": \"\",\n \"type\": \"attestation\",\n \"locale\": \"\",\n \"version\": \"\",\n \"required\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -677,7 +677,7 @@ "value": "application/json" } ], - "id": "aa687728-796d-4e52-9249-8338bcd979f7", + "id": "e0c50bfb-3cc6-4456-8552-cc21fa2af822", "name": "200 response", "originalRequest": { "body": {}, @@ -729,7 +729,7 @@ "item": [ { "event": [], - "id": "ee51e6fd-716a-45e3-9613-ecd41fc7f7d8", + "id": "a9744b04-3c2c-4946-9bcb-8194b8ce0587", "name": "/v1/compacts/:compact/credentials/payment-processor", "protocolProfileBehavior": { "disableBodyPruning": true @@ -796,7 +796,7 @@ "value": "application/json" } ], - "id": "c01aca6e-66b0-4162-accd-dc40efe57234", + "id": "93d49395-5f6c-4552-b31d-3f7b78de1c37", "name": "200 response", "originalRequest": { "body": { @@ -858,7 +858,7 @@ "item": [ { "event": [], - "id": "44536e7f-a567-4dab-8421-9a2dafed5a4c", + "id": "faa6af95-bfe4-4393-8332-e975ef36745f", "name": "/v1/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -911,7 +911,7 @@ "value": "application/json" } ], - "id": "42f05174-c1a7-4180-a79f-0230ecd63fb9", + "id": "f95d772c-225e-46bf-9061-7d230c4a8b7d", "name": "200 response", "originalRequest": { "body": {}, @@ -984,7 +984,7 @@ } } ], - "id": "1b520f33-242b-4922-91df-684e7f07c7d7", + "id": "3ac54f0c-08a7-4d46-a0b7-8c6aba13b4fc", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1050,7 +1050,7 @@ "value": "application/json" } ], - "id": "bb66e506-0fc1-4e7f-ac26-6f488d4532ae", + "id": "69efbf1b-9470-4a0b-b01a-874e84e9defe", "name": "200 response", "originalRequest": { "body": {}, @@ -1110,7 +1110,7 @@ "item": [ { "event": [], - "id": "184c251a-4b61-41c0-8a74-8e0b9ce6cd66", + "id": "2013b8a1-3e93-4ded-b00e-a3cf38aa1265", "name": "/v1/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1124,7 +1124,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"6136f0f6-4808-421f-8960-c82a8032fa55\",\n \"jurisdiction\": \"vi\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"eae96496-f3d1-4e50-a01e-d9f0888ad726\",\n \"jurisdiction\": \"ak\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -1168,7 +1168,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"08-04\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2758-07-31\",\n \"dateOfUpdate\": \"2830-08-29\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"ut\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"mt\",\n \"wy\"\n ],\n \"providerId\": \"b4ede3dc-5846-4a0d-9201-4aed91a3cdfa\",\n \"type\": \"provider\",\n \"npi\": \"0416180297\",\n \"dateOfBirth\": \"2522-05-30\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"unknown\",\n \"ssnLastFour\": \"5918\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"05-15\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1354-11-24\",\n \"dateOfUpdate\": \"1146-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"il\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"sc\",\n \"in\"\n ],\n \"providerId\": \"0fb36c63-a643-465c-931b-12b9b490a005\",\n \"type\": \"provider\",\n \"npi\": \"1589523557\",\n \"dateOfBirth\": \"2563-12-02\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"pr\",\n \"ssnLastFour\": \"7998\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"02-15\",\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2496-09-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"ms\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"ky\",\n \"nj\"\n ],\n \"providerId\": \"a569b013-db6a-4742-b66d-2c0ef72354f5\",\n \"type\": \"provider\",\n \"npi\": \"9169059087\",\n \"dateOfBirth\": \"1725-12-30\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"az\",\n \"ssnLastFour\": \"0517\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"00-05\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1296-02-03\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"wv\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"nv\",\n \"ky\"\n ],\n \"providerId\": \"7db595fb-86a2-494f-bcc8-02c3187784eb\",\n \"type\": \"provider\",\n \"npi\": \"7462649169\",\n \"dateOfBirth\": \"1735-05-02\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ri\",\n \"ssnLastFour\": \"7347\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -1177,7 +1177,7 @@ "value": "application/json" } ], - "id": "549423ad-8e4e-42e6-a269-40e68d25255b", + "id": "fa8b34dd-e84e-4d47-96f6-0f257c7a5b6b", "name": "200 response", "originalRequest": { "body": { @@ -1188,7 +1188,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"6136f0f6-4808-421f-8960-c82a8032fa55\",\n \"jurisdiction\": \"vi\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"eae96496-f3d1-4e50-a01e-d9f0888ad726\",\n \"jurisdiction\": \"ak\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -1236,7 +1236,7 @@ "item": [ { "event": [], - "id": "4f9bda9a-fe01-4919-9d60-b281b8bf701d", + "id": "0e55a378-3d75-4f84-bac1-3fb688bf8b68", "name": "/v1/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1291,7 +1291,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"01-02\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"2154-11-02\",\n \"dateOfUpdate\": \"2104-08-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ok\",\n \"licenses\": [\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2825-07-31\",\n \"dateOfIssuance\": \"2000-12-07\",\n \"dateOfRenewal\": \"2674-07-30\",\n \"dateOfUpdate\": \"2435-09-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1805-04-11\",\n \"jurisdiction\": \"tx\",\n \"previous\": {\n \"dateOfExpiration\": \"1501-06-03\",\n \"dateOfIssuance\": \"1212-11-31\",\n \"dateOfRenewal\": \"1829-03-07\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5428549691\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1502-04-05\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+4481600167198\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0547502503\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1117-03-06\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1631-12-01\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2652-02-25\",\n \"phoneNumber\": \"+73039722088\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1895-11-03\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2984-07-05\",\n \"jurisdiction\": \"ca\",\n \"previous\": {\n \"dateOfExpiration\": \"1153-11-18\",\n \"dateOfIssuance\": \"1339-01-30\",\n \"dateOfRenewal\": \"2929-02-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4516097308\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2539-02-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+00423252\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9173380936\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1285-01-19\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1319-01-25\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1433-11-31\",\n \"phoneNumber\": \"+223839924\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1440-10-04\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"wi\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"37ee6863-6b41-48a7-b775-c54e81b99b1d\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1096-12-22\",\n \"dateOfUpdate\": \"2489-08-04\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"providerId\": \"47b221bd-0571-404a-a809-21ce1cc5b48e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1984-02-07\",\n \"dateOfUpdate\": \"1977-12-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"1b092c99-6b34-44ed-bc50-624472be234b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8344660809\",\n \"dateOfBirth\": \"1428-04-24\",\n \"ssnLastFour\": \"9275\",\n \"phoneNumber\": \"+862914303\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2280-10-07\",\n \"dateOfUpdate\": \"1531-10-11\",\n \"effectiveStartDate\": \"2671-10-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b5f69573-08c7-4c04-93fa-a898126ba6cc\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2769-09-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2179-11-31\",\n \"dateOfUpdate\": \"2605-12-29\",\n \"effectiveStartDate\": \"2811-09-09\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8e21a34e-b2d4-4f01-af21-51ac3e8aa5d8\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1876-09-27\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2484-11-06\",\n \"dateOfIssuance\": \"2211-02-18\",\n \"dateOfRenewal\": \"2332-08-06\",\n \"dateOfUpdate\": \"1945-10-13\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2827-11-02\",\n \"jurisdiction\": \"vi\",\n \"previous\": {\n \"dateOfExpiration\": \"1586-12-06\",\n \"dateOfIssuance\": \"2434-09-31\",\n \"dateOfRenewal\": \"1698-04-01\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8029916107\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2457-08-08\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+572834790400\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7167564830\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1886-04-01\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2329-05-14\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2349-10-03\",\n \"phoneNumber\": \"+917875436006687\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2204-11-31\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2174-05-31\",\n \"jurisdiction\": \"fl\",\n \"previous\": {\n \"dateOfExpiration\": \"1431-12-11\",\n \"dateOfIssuance\": \"2888-12-30\",\n \"dateOfRenewal\": \"1245-11-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6965680746\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2766-11-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+64811211786\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2319157496\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2034-10-30\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1319-09-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2907-08-20\",\n \"phoneNumber\": \"+958705938\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1178-12-13\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"middleName\": \"\",\n \"providerId\": \"c14be4f3-0363-49f5-b4a8-0ce2590aab82\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2207-03-21\",\n \"dateOfUpdate\": \"1304-08-03\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"bf1b4b3c-e9cf-4d3c-8ac3-60a1e9b7f197\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2190-10-03\",\n \"dateOfUpdate\": \"1696-11-06\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"providerId\": \"f9894d80-700a-4848-ba6d-23f37aa109cf\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"7989243429\",\n \"dateOfBirth\": \"1650-09-30\",\n \"ssnLastFour\": \"7179\",\n \"phoneNumber\": \"+23505233735\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2005-12-08\",\n \"dateOfUpdate\": \"1492-09-09\",\n \"effectiveStartDate\": \"1317-11-22\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4b722575-5cc8-4f49-aaa8-48b5459a3894\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1270-11-11\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1641-04-30\",\n \"dateOfUpdate\": \"1530-05-23\",\n \"effectiveStartDate\": \"2272-12-03\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"35a42eda-3ce7-402d-9112-a985ea67fb87\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1595-02-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1615-04-30\",\n \"dateOfUpload\": \"1224-12-31\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"95348a64-0e45-4101-95ae-b98b0005475b\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1233-10-14\",\n \"dateOfUpload\": \"2903-10-20\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"105eb690-6fce-4650-be97-168296d0d4d0\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"dc\",\n \"wy\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2523-09-31\",\n \"dateOfIssuance\": \"1926-05-27\",\n \"dateOfRenewal\": \"1608-11-30\",\n \"dateOfUpdate\": \"2793-11-31\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1404-12-30\",\n \"jurisdiction\": \"or\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1599-12-31\",\n \"dateOfIssuance\": \"2843-03-31\",\n \"dateOfRenewal\": \"1115-01-17\",\n \"dateOfUpdate\": \"2543-05-01\",\n \"licenseJurisdiction\": \"sc\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ms\",\n \"type\": \"privilege\",\n \"providerId\": \"890b5c10-fe97-463a-be4a-37e4374d8278\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"mn\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wa\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1174-12-31\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2534-10-18\",\n \"privilegeId\": \"\",\n \"providerId\": \"1ff3f039-ae34-4bb0-be85-f5729aed7fba\",\n \"dateOfRenewal\": \"2257-05-10\",\n \"dateOfUpdate\": \"1467-12-31\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1749-09-31\",\n \"jurisdiction\": \"ny\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1847-02-11\",\n \"dateOfIssuance\": \"2425-10-08\",\n \"dateOfRenewal\": \"2872-08-31\",\n \"dateOfUpdate\": \"2671-04-18\",\n \"licenseJurisdiction\": \"sd\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ky\",\n \"type\": \"privilege\",\n \"providerId\": \"24c41f5b-5363-444b-a127-fbf286dc9772\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"nv\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ct\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2046-12-05\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1503-11-15\",\n \"privilegeId\": \"\",\n \"providerId\": \"f1cb40c0-682e-4641-999a-f4d5c9096486\",\n \"dateOfRenewal\": \"2583-11-31\",\n \"dateOfUpdate\": \"2680-11-07\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"id\",\n \"licenseJurisdiction\": \"ny\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"aa251ae7-c0c2-4be7-b619-2c14f5cc5a0c\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1078-06-30\",\n \"dateOfUpdate\": \"1718-02-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"95b2a3e4-9bf4-41ab-a243-9e4b9cdfbba9\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2757-11-02\",\n \"dateOfUpdate\": \"2309-10-01\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"2f3dafbe-8ec7-4176-ba8c-eb6aea8616f1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1337-12-01\",\n \"dateOfUpdate\": \"1361-07-31\",\n \"effectiveStartDate\": \"2738-07-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"54696fdf-7347-48fa-9fc4-45927106c14e\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2202-05-13\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1217-05-08\",\n \"dateOfUpdate\": \"2667-09-02\",\n \"effectiveStartDate\": \"1580-03-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"fl\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"ad99d20b-5a86-4d8a-8831-94ec74f169dc\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2728-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2932-10-22\",\n \"dateOfIssuance\": \"1744-03-30\",\n \"dateOfRenewal\": \"1834-03-03\",\n \"dateOfUpdate\": \"2069-11-27\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1377-12-25\",\n \"jurisdiction\": \"ma\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2170-10-27\",\n \"dateOfIssuance\": \"1975-10-12\",\n \"dateOfRenewal\": \"1382-08-20\",\n \"dateOfUpdate\": \"2716-08-17\",\n \"licenseJurisdiction\": \"tx\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ak\",\n \"type\": \"privilege\",\n \"providerId\": \"bac9f437-6759-45a9-a357-4e8e59062df8\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ct\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"fl\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2467-06-02\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2476-01-04\",\n \"privilegeId\": \"\",\n \"providerId\": \"0ae226ca-e340-4af8-8cd3-7d6d46527078\",\n \"dateOfRenewal\": \"2810-05-21\",\n \"dateOfUpdate\": \"2411-10-11\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1390-10-28\",\n \"jurisdiction\": \"de\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2882-02-05\",\n \"dateOfIssuance\": \"1279-01-20\",\n \"dateOfRenewal\": \"2220-11-31\",\n \"dateOfUpdate\": \"2016-10-31\",\n \"licenseJurisdiction\": \"al\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"nj\",\n \"type\": \"privilege\",\n \"providerId\": \"51843ad9-89e6-41db-a24c-cc373e61551c\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"expiration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pa\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"la\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1807-08-24\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2286-09-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"044017cd-c945-4679-a26a-e0f3bf8d362c\",\n \"dateOfRenewal\": \"2219-05-24\",\n \"dateOfUpdate\": \"1832-10-05\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ky\",\n \"licenseJurisdiction\": \"ok\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"d2aabf6a-a1ea-4230-ada7-f41d2785c679\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1239-07-04\",\n \"dateOfUpdate\": \"2383-10-08\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"1424fde8-e2a8-4a06-b056-e738ba92f4d9\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1215-11-05\",\n \"dateOfUpdate\": \"1335-04-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"providerId\": \"2e9706be-6b29-4517-8ed7-1006d00f2f22\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2188-10-16\",\n \"dateOfUpdate\": \"1071-12-31\",\n \"effectiveStartDate\": \"2637-12-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e8f64c1c-18bb-4fbc-b001-7eba71a222aa\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2555-12-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1479-12-30\",\n \"dateOfUpdate\": \"1040-01-01\",\n \"effectiveStartDate\": \"2370-06-15\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1d70365a-74a7-4340-8ac4-52486faa7771\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1460-02-01\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"8abe5187-9b27-4f61-9e90-c61c1864f19a\",\n \"type\": \"provider\",\n \"npi\": \"3521472876\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2029-12-20\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"wv\",\n \"ssnLastFour\": \"1933\",\n \"licenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"13-08\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"2740-10-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ca\",\n \"licenses\": [\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1418-12-31\",\n \"dateOfIssuance\": \"2085-11-17\",\n \"dateOfRenewal\": \"1311-09-08\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"dc\",\n \"previous\": {\n \"dateOfExpiration\": \"1601-06-02\",\n \"dateOfIssuance\": \"2629-02-05\",\n \"dateOfRenewal\": \"1654-12-20\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9182700485\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1200-11-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+92643937755835\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7411986766\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1990-03-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2882-03-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2118-06-30\",\n \"phoneNumber\": \"+051995078739120\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2322-12-09\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"mt\",\n \"previous\": {\n \"dateOfExpiration\": \"2632-03-04\",\n \"dateOfIssuance\": \"1318-10-08\",\n \"dateOfRenewal\": \"1340-02-17\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0390938058\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1213-10-10\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+05461792036\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4862553081\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2504-10-13\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1829-11-06\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2949-12-30\",\n \"phoneNumber\": \"+120941010917607\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2176-11-15\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"va\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"middleName\": \"\",\n \"providerId\": \"05808075-7f81-4fe0-bd15-aaf4bae96313\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"80cc917e-0e45-498b-a01e-46dfaf9422ec\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"b59bcbf2-c163-4fb9-86c4-a0f3c3189ca1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8088263473\",\n \"dateOfBirth\": \"1123-10-31\",\n \"ssnLastFour\": \"1880\",\n \"phoneNumber\": \"+326285850838714\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1549-11-25\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1175-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ar\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"36649371-9214-4d9e-b541-5735d9ea708b\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1701-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1784-04-28\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1811-09-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3be367fd-7032-4eee-9057-f25158464542\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2886-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1849-11-04\",\n \"dateOfIssuance\": \"1727-03-31\",\n \"dateOfRenewal\": \"2147-12-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"pr\",\n \"previous\": {\n \"dateOfExpiration\": \"1023-02-22\",\n \"dateOfIssuance\": \"2532-12-02\",\n \"dateOfRenewal\": \"1053-10-27\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7397903163\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2428-07-24\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+917559203\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2743883980\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2839-10-07\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2744-09-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2259-09-05\",\n \"phoneNumber\": \"+58912316901398\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1600-08-03\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"co\",\n \"previous\": {\n \"dateOfExpiration\": \"2448-03-31\",\n \"dateOfIssuance\": \"1788-12-01\",\n \"dateOfRenewal\": \"1711-07-29\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8986979461\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2015-02-24\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+91875239944\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9116841702\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2433-05-25\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2566-01-15\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1161-01-31\",\n \"phoneNumber\": \"+36158878\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1548-09-16\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"de\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"3767aa19-bf41-474c-9138-44ed4758bfb7\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"pa\",\n \"licenseType\": \"\",\n \"providerId\": \"f839ba46-83e1-4214-a32b-6f059c1103c1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"providerId\": \"a0d710fd-c888-4f32-94d4-e53275a7ee1e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"9630005174\",\n \"dateOfBirth\": \"2103-11-22\",\n \"ssnLastFour\": \"2869\",\n \"phoneNumber\": \"+075553273143\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2441-11-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1685-08-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"296de178-c4df-49a2-b2e3-bbf85a1537d5\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1364-11-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1273-07-26\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2678-11-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4b00f3fa-ffe4-4347-b72b-93057bd51694\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2939-10-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"2834-05-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"00e4e114-ffbf-40dd-b352-1b8a53d7dd16\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"1808-05-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"75396ba5-e504-426a-a51f-a3baade8f5d2\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"al\",\n \"me\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2620-12-10\",\n \"dateOfIssuance\": \"2307-10-02\",\n \"dateOfRenewal\": \"1072-11-11\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ky\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1210-08-03\",\n \"dateOfIssuance\": \"2086-12-25\",\n \"dateOfRenewal\": \"1635-10-31\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"mo\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ne\",\n \"type\": \"privilege\",\n \"providerId\": \"c5529e93-5fd7-4f3e-bac4-ede0ec84b225\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"az\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"co\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2146-05-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1564-10-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"95bb8f53-92a6-4f95-a344-7486ed68e496\",\n \"dateOfRenewal\": \"1234-07-30\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wy\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2450-02-06\",\n \"dateOfIssuance\": \"1144-04-07\",\n \"dateOfRenewal\": \"2162-01-27\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"ok\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"pa\",\n \"type\": \"privilege\",\n \"providerId\": \"3f88efc2-04c8-498b-83c4-f62bff1f9d1c\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"nj\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ut\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1263-11-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1907-03-20\",\n \"privilegeId\": \"\",\n \"providerId\": \"1da0c1ab-df4a-4d76-a05d-3888ec8dd690\",\n \"dateOfRenewal\": \"2530-08-20\",\n \"dateOfUpdate\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"or\",\n \"licenseJurisdiction\": \"tn\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"f0860327-e2d4-4218-820b-07844da613e2\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ct\",\n \"licenseType\": \"\",\n \"providerId\": \"1eb95a72-28a1-43f2-8ab0-e7694549a465\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"bac7a7f8-5d68-4ed8-961c-fed4778fbc17\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1884-09-01\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1801-11-23\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a404af0a-1cd5-448e-8fb3-2f2d976e9d98\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1873-11-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1294-11-27\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2195-01-17\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"79998715-1d2d-424f-83f9-781152e5bfff\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2807-09-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1164-10-31\",\n \"dateOfIssuance\": \"2505-03-31\",\n \"dateOfRenewal\": \"1015-12-30\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wa\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1949-11-30\",\n \"dateOfIssuance\": \"2851-10-31\",\n \"dateOfRenewal\": \"2757-08-11\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"nj\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ok\",\n \"type\": \"privilege\",\n \"providerId\": \"af7cfee7-5063-48f2-80d2-5c8e4592d556\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ar\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"mn\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1626-04-10\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1514-11-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"e7176921-3038-403b-8da3-8005c8155a2c\",\n \"dateOfRenewal\": \"1787-03-21\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"nm\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1606-09-11\",\n \"dateOfIssuance\": \"2184-12-21\",\n \"dateOfRenewal\": \"2383-08-30\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"nv\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"al\",\n \"type\": \"privilege\",\n \"providerId\": \"a305b4a7-093d-44f5-bdf7-4d15c689a365\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ok\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ne\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2728-03-30\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1796-11-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"100d20d6-c557-4ea3-aea9-7c2c36ef9d1b\",\n \"dateOfRenewal\": \"1607-11-31\",\n \"dateOfUpdate\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"sc\",\n \"licenseJurisdiction\": \"ct\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"e4bab004-d0d1-44d3-bf59-b1b6021cca2a\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"providerId\": \"972a828c-9141-44d9-ac6b-921c12a14951\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ny\",\n \"licenseType\": \"\",\n \"providerId\": \"be1bb960-c9fc-4338-9192-7557ef4f145b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2953-11-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1450-07-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mi\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1ec2d6e7-8fc1-47e2-a06c-9dce079e5fe0\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1803-08-08\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1417-01-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2946-11-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"0555315c-4fb4-4800-9682-1769d0d58577\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2601-03-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"c6924611-02c0-4d24-b0a3-2162f676f0c6\",\n \"type\": \"provider\",\n \"npi\": \"7005556145\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2323-09-29\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ga\",\n \"ssnLastFour\": \"0968\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -1300,7 +1300,7 @@ "value": "application/json" } ], - "id": "ca2cb326-8bcf-496f-a7d5-bd4ccf1f0591", + "id": "36d25788-3b7d-4aff-835f-977136ddb6cf", "name": "200 response", "originalRequest": { "body": {}, @@ -1358,7 +1358,7 @@ "item": [ { "event": [], - "id": "4d4d4ae6-439e-4ed4-a79f-64bd93e69253", + "id": "778abe7d-3bd6-47b5-93cb-c2b04ed3720b", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1372,7 +1372,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"2357-04-21\",\n \"encumbranceType\": \"suspension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"2966-01-22\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "description": {}, "header": [ @@ -1461,7 +1461,7 @@ "value": "application/json" } ], - "id": "403c3288-1470-488f-b74f-0749bc13064c", + "id": "3e21bfa6-ca48-42e5-9d8a-f74959675680", "name": "200 response", "originalRequest": { "body": { @@ -1472,7 +1472,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"2357-04-21\",\n \"encumbranceType\": \"suspension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"2966-01-22\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "header": [ { @@ -1523,7 +1523,7 @@ "item": [ { "event": [], - "id": "52707ea1-5087-4d7b-af4f-02790951755c", + "id": "0f124494-b629-4601-b7b3-932a7d307595", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1537,7 +1537,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2487-12-06\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1375-10-30\"\n}" }, "description": {}, "header": [ @@ -1637,7 +1637,7 @@ "value": "application/json" } ], - "id": "f99bd608-0f6a-462d-89e0-b63727e9200d", + "id": "41e9777a-da42-4489-b70a-3870fdbf921b", "name": "200 response", "originalRequest": { "body": { @@ -1648,7 +1648,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2487-12-06\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1375-10-30\"\n}" }, "header": [ { @@ -1706,7 +1706,7 @@ "item": [ { "event": [], - "id": "20453776-5781-4794-9485-4fe167cc42ef", + "id": "78ac677d-d1d1-4b19-b30a-e8587bd216b9", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1809,7 +1809,7 @@ "value": "application/json" } ], - "id": "446331b8-f0ca-4e86-a0fc-29e659dcd33e", + "id": "45b7d3a6-3774-4544-a986-9910876c2909", "name": "200 response", "originalRequest": { "body": { @@ -1871,7 +1871,7 @@ "item": [ { "event": [], - "id": "cde3bbe2-6e2c-47d5-81fe-7ccdca0d0ff6", + "id": "5ccd5eb2-926c-4e2b-803e-8fc0941e1344", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1885,7 +1885,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2845-01-30\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"1911-02-08\",\n \"encumbranceType\": \"injunctive action\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "description": {}, "header": [ @@ -1985,7 +1985,7 @@ "value": "application/json" } ], - "id": "fa39f8f6-1b98-4adc-a594-bd6007b31591", + "id": "daaef93b-6a2f-4f27-802b-3e87dfb32825", "name": "200 response", "originalRequest": { "body": { @@ -1996,7 +1996,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2845-01-30\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"1911-02-08\",\n \"encumbranceType\": \"injunctive action\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "header": [ { @@ -2084,7 +2084,7 @@ "item": [ { "event": [], - "id": "2dcdfc78-5f0d-4fff-b46f-34c30514ee9c", + "id": "0688a816-445f-45e6-9f39-cac96d5dd4ea", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/deactivate", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2187,7 +2187,7 @@ "value": "application/json" } ], - "id": "83b6851a-3f2c-4f52-91de-d8c82edca0eb", + "id": "e53076b3-8d30-4e52-9748-e4358a8308f8", "name": "200 response", "originalRequest": { "body": { @@ -2252,7 +2252,7 @@ "item": [ { "event": [], - "id": "86ad476f-c738-48ee-9b4e-d4cb543a5f46", + "id": "f54580f1-349c-43b2-b889-a97cdc5061fd", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2266,7 +2266,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"2357-04-21\",\n \"encumbranceType\": \"suspension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"2966-01-22\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "description": {}, "header": [ @@ -2355,7 +2355,7 @@ "value": "application/json" } ], - "id": "e662fa53-d038-4f42-8e53-a90952018bb4", + "id": "f712d09c-56ea-44b1-a607-43f1c95e1a74", "name": "200 response", "originalRequest": { "body": { @@ -2366,7 +2366,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"2357-04-21\",\n \"encumbranceType\": \"suspension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"2966-01-22\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "header": [ { @@ -2417,7 +2417,7 @@ "item": [ { "event": [], - "id": "9a5d50d2-a980-4db9-9ec6-1e33fd073a98", + "id": "9d592a7f-d13f-47b0-9ab7-192f6d394130", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2431,7 +2431,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2487-12-06\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1375-10-30\"\n}" }, "description": {}, "header": [ @@ -2531,7 +2531,7 @@ "value": "application/json" } ], - "id": "80969d57-8214-424c-a3ad-b94083dcab06", + "id": "c4296e7c-0324-4c28-b843-907cf57eba0a", "name": "200 response", "originalRequest": { "body": { @@ -2542,7 +2542,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"2487-12-06\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1375-10-30\"\n}" }, "header": [ { @@ -2600,7 +2600,7 @@ "item": [ { "event": [], - "id": "cf9931cb-ec4c-4d34-9af5-53dddfd94698", + "id": "81e896ab-ac6c-438c-809f-5e8715106ab4", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2681,7 +2681,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"2530-10-09\",\n \"dateOfUpdate\": \"1693-03-31\",\n \"effectiveDate\": \"1260-11-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2291-10-30\",\n \"dateOfUpdate\": \"1104-10-30\",\n \"effectiveDate\": \"1943-03-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"va\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"61c5d582-0230-461d-84c5-cfed6b3d5e7d\"\n}", + "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1286-11-12\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1357-08-04\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"7fb7b7d6-5bc5-49cb-819b-59b10919270e\"\n}", "code": 200, "cookie": [], "header": [ @@ -2690,7 +2690,7 @@ "value": "application/json" } ], - "id": "31e11f50-dd3a-467f-981e-bcb6ffb54244", + "id": "7df6e17b-8e3e-4099-8f31-39696214f64e", "name": "200 response", "originalRequest": { "body": {}, @@ -2742,7 +2742,7 @@ "item": [ { "event": [], - "id": "e450eb67-2141-4dc3-a5f2-47c4ba57c154", + "id": "9f1841b3-2d6f-4c7d-8a0d-307de5a39335", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2845,7 +2845,7 @@ "value": "application/json" } ], - "id": "11e56107-86b7-420b-9803-d58d371257cb", + "id": "bd6cb3af-24cf-415c-b49e-b404f4b891f6", "name": "200 response", "originalRequest": { "body": { @@ -2907,7 +2907,7 @@ "item": [ { "event": [], - "id": "4f11a963-cc69-40c3-ba1a-2e90e487416e", + "id": "3e3b2c41-9f05-4a0f-85af-a0b0de453ec8", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2921,7 +2921,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2845-01-30\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"1911-02-08\",\n \"encumbranceType\": \"injunctive action\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "description": {}, "header": [ @@ -3021,7 +3021,7 @@ "value": "application/json" } ], - "id": "bb8417b4-1165-4d4b-9ae5-2138a8db1a85", + "id": "a68c0887-e040-4609-9e2a-68608e80cee5", "name": "200 response", "originalRequest": { "body": { @@ -3032,7 +3032,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2845-01-30\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"1911-02-08\",\n \"encumbranceType\": \"injunctive action\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "header": [ { @@ -3105,7 +3105,7 @@ "item": [ { "event": [], - "id": "468ef14b-c846-414b-9b4b-dee25f691f28", + "id": "180d9906-6433-4aa6-9264-fa9a4f3e4eef", "name": "/v1/compacts/:compact/providers/:providerId/ssn", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3161,7 +3161,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"ssn\": \"546-11-6841\"\n}", + "body": "{\n \"ssn\": \"415-45-7275\"\n}", "code": 200, "cookie": [], "header": [ @@ -3170,7 +3170,7 @@ "value": "application/json" } ], - "id": "28bd4f2f-8185-4934-976b-bbded66b1650", + "id": "e4ae939a-fa02-4f58-88c8-31fef8399a6b", "name": "200 response", "originalRequest": { "body": {}, @@ -3223,7 +3223,7 @@ "item": [ { "event": [], - "id": "9d7dbbae-e8ec-4c59-8fcb-a83012e4e129", + "id": "a59d9606-fdec-4545-b1c2-4086e4ec09d7", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3267,7 +3267,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n }\n ]\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n }\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -3285,7 +3285,7 @@ "value": "" } ], - "id": "c147c550-1c64-44db-b23b-5ea7b5b44b96", + "id": "8dd58e70-df65-43c2-9c8e-69d30cad4992", "name": "200 response", "originalRequest": { "body": {}, @@ -3324,7 +3324,7 @@ }, { "event": [], - "id": "d8a8f18a-e11e-4586-832f-6cd8dc048f6c", + "id": "c88b1e8d-b822-4a5f-8645-2627bf74aacd", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3338,7 +3338,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3381,7 +3381,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3399,7 +3399,7 @@ "value": "" } ], - "id": "fe288db9-8e35-4abe-858a-e190463b6196", + "id": "1c8b8035-c9c5-4a54-a92d-190a71711a20", "name": "200 response", "originalRequest": { "body": { @@ -3410,7 +3410,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3454,7 +3454,7 @@ "item": [ { "event": [], - "id": "06f3988d-6545-45f8-865f-f69b0fde527b", + "id": "36d9200a-8383-4e9b-b55c-cff832220ee2", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3509,7 +3509,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3527,7 +3527,7 @@ "value": "" } ], - "id": "c4ee66b9-b1cd-4834-abe4-9ff22a133af1", + "id": "162b212f-43e2-4b15-90ba-daf844557b11", "name": "200 response", "originalRequest": { "body": {}, @@ -3574,7 +3574,7 @@ "value": "application/json" } ], - "id": "a596ac1a-2594-4944-b7da-e4dbf3f5404d", + "id": "cb543f58-6b5f-41cc-a73e-200a9a89c740", "name": "404 response", "originalRequest": { "body": {}, @@ -3614,7 +3614,7 @@ }, { "event": [], - "id": "5885c06c-22e5-434e-848b-deb0b72c7d2c", + "id": "ebaa38d6-8a8b-4c18-ba15-eec2a42b04ef", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3678,7 +3678,7 @@ "value": "application/json" } ], - "id": "f94c677f-5066-4565-921f-84fb3e69b7f6", + "id": "9b9c3851-6767-4c05-a264-44943a4bd6b9", "name": "200 response", "originalRequest": { "body": {}, @@ -3725,7 +3725,7 @@ "value": "application/json" } ], - "id": "000ac993-2573-413b-a121-6965fa663ef7", + "id": "9b78dfdc-8305-4010-b66e-6a5186cc1122", "name": "404 response", "originalRequest": { "body": {}, @@ -3765,7 +3765,7 @@ }, { "event": [], - "id": "2c3ebfb1-a636-4d48-ac58-e88b458ad3e7", + "id": "791137af-22fd-4201-9ab4-771524a63020", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3779,7 +3779,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3833,7 +3833,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3851,7 +3851,7 @@ "value": "" } ], - "id": "81ca3c2b-11b7-46da-a58e-8f654efabbe6", + "id": "ce38dfa4-fe0a-4111-9fe8-aef4e0cfcb3f", "name": "200 response", "originalRequest": { "body": { @@ -3862,7 +3862,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3911,7 +3911,7 @@ "value": "application/json" } ], - "id": "dfdc8fbb-e60c-4c46-b64f-33c79bb3d284", + "id": "b575a2f7-bbb6-48e0-97c7-928953b4250e", "name": "404 response", "originalRequest": { "body": { @@ -3922,7 +3922,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3967,7 +3967,7 @@ "item": [ { "event": [], - "id": "bac63224-e0b5-4a48-87bb-03056ea9a0f6", + "id": "e2244523-8761-41ab-9ce2-886b734da5c6", "name": "/v1/compacts/:compact/staff-users/:userId/reinvite", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4032,7 +4032,7 @@ "value": "application/json" } ], - "id": "9a64ff8b-f67f-48bd-9d6d-0292ae79418b", + "id": "3028697c-c38a-47b9-9670-36f6afd0bb12", "name": "200 response", "originalRequest": { "body": {}, @@ -4080,7 +4080,7 @@ "value": "application/json" } ], - "id": "0e6afe62-049e-4292-87e6-5aa544032bd8", + "id": "9fe90762-8529-4f5b-b802-7db489c54b34", "name": "404 response", "originalRequest": { "body": {}, @@ -4145,7 +4145,7 @@ "item": [ { "event": [], - "id": "bd8c7cbc-be17-4e8b-84ab-04cb3cde05b3", + "id": "2e071fbb-b97c-4df3-ad5c-4c635ed48cd0", "name": "/v1/flags/:flagId/check", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4162,7 +4162,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\"\n }\n }\n}" }, "description": {}, "header": [ @@ -4214,7 +4214,7 @@ "value": "application/json" } ], - "id": "700b7ca0-803d-43e8-8f97-786d307f184d", + "id": "8134e67e-1d4d-448a-b6a0-00de9f74e7ef", "name": "200 response", "originalRequest": { "body": { @@ -4225,7 +4225,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\"\n }\n }\n}" }, "header": [ { @@ -4283,7 +4283,7 @@ "item": [ { "event": [], - "id": "c5f41ebb-ab03-41b3-9ac2-f802996b45e6", + "id": "fd1096eb-1202-419b-9436-dd0a97dc635b", "name": "/v1/provider-users/initiateRecovery", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4300,7 +4300,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"octp\",\n \"dob\": \"1783-04-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"licensed professional counselor\",\n \"partialSocial\": \"3632\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" + "raw": "{\n \"compact\": \"aslp\",\n \"dob\": \"1820-08-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"occupational therapy assistant\",\n \"partialSocial\": \"4918\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" }, "description": {}, "header": [ @@ -4340,7 +4340,7 @@ "value": "application/json" } ], - "id": "2618e3fa-c29e-4e16-884f-b9dbb44db686", + "id": "e2737d72-c0a5-45a7-bb8e-403d7b102841", "name": "200 response", "originalRequest": { "body": { @@ -4351,7 +4351,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"octp\",\n \"dob\": \"1783-04-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"licensed professional counselor\",\n \"partialSocial\": \"3632\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" + "raw": "{\n \"compact\": \"aslp\",\n \"dob\": \"1820-08-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"occupational therapy assistant\",\n \"partialSocial\": \"4918\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" }, "header": [ { @@ -4389,7 +4389,7 @@ "item": [ { "event": [], - "id": "4db92048-d41c-491c-910b-1f98c6d31a4f", + "id": "ef9d64a5-b00d-41a5-8073-9bf306d38421", "name": "/v1/provider-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4421,7 +4421,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"01-02\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"2154-11-02\",\n \"dateOfUpdate\": \"2104-08-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ok\",\n \"licenses\": [\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2825-07-31\",\n \"dateOfIssuance\": \"2000-12-07\",\n \"dateOfRenewal\": \"2674-07-30\",\n \"dateOfUpdate\": \"2435-09-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1805-04-11\",\n \"jurisdiction\": \"tx\",\n \"previous\": {\n \"dateOfExpiration\": \"1501-06-03\",\n \"dateOfIssuance\": \"1212-11-31\",\n \"dateOfRenewal\": \"1829-03-07\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5428549691\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1502-04-05\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+4481600167198\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0547502503\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1117-03-06\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1631-12-01\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2652-02-25\",\n \"phoneNumber\": \"+73039722088\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1895-11-03\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2984-07-05\",\n \"jurisdiction\": \"ca\",\n \"previous\": {\n \"dateOfExpiration\": \"1153-11-18\",\n \"dateOfIssuance\": \"1339-01-30\",\n \"dateOfRenewal\": \"2929-02-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4516097308\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2539-02-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+00423252\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9173380936\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1285-01-19\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1319-01-25\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1433-11-31\",\n \"phoneNumber\": \"+223839924\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1440-10-04\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"wi\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"37ee6863-6b41-48a7-b775-c54e81b99b1d\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1096-12-22\",\n \"dateOfUpdate\": \"2489-08-04\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"providerId\": \"47b221bd-0571-404a-a809-21ce1cc5b48e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1984-02-07\",\n \"dateOfUpdate\": \"1977-12-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"1b092c99-6b34-44ed-bc50-624472be234b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8344660809\",\n \"dateOfBirth\": \"1428-04-24\",\n \"ssnLastFour\": \"9275\",\n \"phoneNumber\": \"+862914303\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2280-10-07\",\n \"dateOfUpdate\": \"1531-10-11\",\n \"effectiveStartDate\": \"2671-10-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"b5f69573-08c7-4c04-93fa-a898126ba6cc\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2769-09-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2179-11-31\",\n \"dateOfUpdate\": \"2605-12-29\",\n \"effectiveStartDate\": \"2811-09-09\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"8e21a34e-b2d4-4f01-af21-51ac3e8aa5d8\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1876-09-27\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2484-11-06\",\n \"dateOfIssuance\": \"2211-02-18\",\n \"dateOfRenewal\": \"2332-08-06\",\n \"dateOfUpdate\": \"1945-10-13\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2827-11-02\",\n \"jurisdiction\": \"vi\",\n \"previous\": {\n \"dateOfExpiration\": \"1586-12-06\",\n \"dateOfIssuance\": \"2434-09-31\",\n \"dateOfRenewal\": \"1698-04-01\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8029916107\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2457-08-08\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+572834790400\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7167564830\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1886-04-01\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2329-05-14\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2349-10-03\",\n \"phoneNumber\": \"+917875436006687\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2204-11-31\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2174-05-31\",\n \"jurisdiction\": \"fl\",\n \"previous\": {\n \"dateOfExpiration\": \"1431-12-11\",\n \"dateOfIssuance\": \"2888-12-30\",\n \"dateOfRenewal\": \"1245-11-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6965680746\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2766-11-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+64811211786\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2319157496\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2034-10-30\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1319-09-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2907-08-20\",\n \"phoneNumber\": \"+958705938\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1178-12-13\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ks\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"middleName\": \"\",\n \"providerId\": \"c14be4f3-0363-49f5-b4a8-0ce2590aab82\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"2207-03-21\",\n \"dateOfUpdate\": \"1304-08-03\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"nv\",\n \"licenseType\": \"\",\n \"providerId\": \"bf1b4b3c-e9cf-4d3c-8ac3-60a1e9b7f197\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2190-10-03\",\n \"dateOfUpdate\": \"1696-11-06\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"providerId\": \"f9894d80-700a-4848-ba6d-23f37aa109cf\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"7989243429\",\n \"dateOfBirth\": \"1650-09-30\",\n \"ssnLastFour\": \"7179\",\n \"phoneNumber\": \"+23505233735\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2005-12-08\",\n \"dateOfUpdate\": \"1492-09-09\",\n \"effectiveStartDate\": \"1317-11-22\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4b722575-5cc8-4f49-aaa8-48b5459a3894\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1270-11-11\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1641-04-30\",\n \"dateOfUpdate\": \"1530-05-23\",\n \"effectiveStartDate\": \"2272-12-03\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"35a42eda-3ce7-402d-9112-a985ea67fb87\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1595-02-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1615-04-30\",\n \"dateOfUpload\": \"1224-12-31\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"95348a64-0e45-4101-95ae-b98b0005475b\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1233-10-14\",\n \"dateOfUpload\": \"2903-10-20\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"105eb690-6fce-4650-be97-168296d0d4d0\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"dc\",\n \"wy\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2523-09-31\",\n \"dateOfIssuance\": \"1926-05-27\",\n \"dateOfRenewal\": \"1608-11-30\",\n \"dateOfUpdate\": \"2793-11-31\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1404-12-30\",\n \"jurisdiction\": \"or\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1599-12-31\",\n \"dateOfIssuance\": \"2843-03-31\",\n \"dateOfRenewal\": \"1115-01-17\",\n \"dateOfUpdate\": \"2543-05-01\",\n \"licenseJurisdiction\": \"sc\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ms\",\n \"type\": \"privilege\",\n \"providerId\": \"890b5c10-fe97-463a-be4a-37e4374d8278\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"mn\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"wa\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1174-12-31\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2534-10-18\",\n \"privilegeId\": \"\",\n \"providerId\": \"1ff3f039-ae34-4bb0-be85-f5729aed7fba\",\n \"dateOfRenewal\": \"2257-05-10\",\n \"dateOfUpdate\": \"1467-12-31\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1749-09-31\",\n \"jurisdiction\": \"ny\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1847-02-11\",\n \"dateOfIssuance\": \"2425-10-08\",\n \"dateOfRenewal\": \"2872-08-31\",\n \"dateOfUpdate\": \"2671-04-18\",\n \"licenseJurisdiction\": \"sd\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ky\",\n \"type\": \"privilege\",\n \"providerId\": \"24c41f5b-5363-444b-a127-fbf286dc9772\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"nv\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ct\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2046-12-05\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1503-11-15\",\n \"privilegeId\": \"\",\n \"providerId\": \"f1cb40c0-682e-4641-999a-f4d5c9096486\",\n \"dateOfRenewal\": \"2583-11-31\",\n \"dateOfUpdate\": \"2680-11-07\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"id\",\n \"licenseJurisdiction\": \"ny\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"aa251ae7-c0c2-4be7-b619-2c14f5cc5a0c\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"1078-06-30\",\n \"dateOfUpdate\": \"1718-02-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"95b2a3e4-9bf4-41ab-a243-9e4b9cdfbba9\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"2757-11-02\",\n \"dateOfUpdate\": \"2309-10-01\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"2f3dafbe-8ec7-4176-ba8c-eb6aea8616f1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1337-12-01\",\n \"dateOfUpdate\": \"1361-07-31\",\n \"effectiveStartDate\": \"2738-07-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"54696fdf-7347-48fa-9fc4-45927106c14e\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2202-05-13\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1217-05-08\",\n \"dateOfUpdate\": \"2667-09-02\",\n \"effectiveStartDate\": \"1580-03-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"fl\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"ad99d20b-5a86-4d8a-8831-94ec74f169dc\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2728-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2932-10-22\",\n \"dateOfIssuance\": \"1744-03-30\",\n \"dateOfRenewal\": \"1834-03-03\",\n \"dateOfUpdate\": \"2069-11-27\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"1377-12-25\",\n \"jurisdiction\": \"ma\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2170-10-27\",\n \"dateOfIssuance\": \"1975-10-12\",\n \"dateOfRenewal\": \"1382-08-20\",\n \"dateOfUpdate\": \"2716-08-17\",\n \"licenseJurisdiction\": \"tx\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ak\",\n \"type\": \"privilege\",\n \"providerId\": \"bac9f437-6759-45a9-a357-4e8e59062df8\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ct\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"fl\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2467-06-02\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2476-01-04\",\n \"privilegeId\": \"\",\n \"providerId\": \"0ae226ca-e340-4af8-8cd3-7d6d46527078\",\n \"dateOfRenewal\": \"2810-05-21\",\n \"dateOfUpdate\": \"2411-10-11\",\n \"status\": \"inactive\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"1390-10-28\",\n \"jurisdiction\": \"de\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2882-02-05\",\n \"dateOfIssuance\": \"1279-01-20\",\n \"dateOfRenewal\": \"2220-11-31\",\n \"dateOfUpdate\": \"2016-10-31\",\n \"licenseJurisdiction\": \"al\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"nj\",\n \"type\": \"privilege\",\n \"providerId\": \"51843ad9-89e6-41db-a24c-cc373e61551c\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"expiration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"pa\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"la\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1807-08-24\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2286-09-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"044017cd-c945-4679-a26a-e0f3bf8d362c\",\n \"dateOfRenewal\": \"2219-05-24\",\n \"dateOfUpdate\": \"1832-10-05\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ky\",\n \"licenseJurisdiction\": \"ok\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"d2aabf6a-a1ea-4230-ada7-f41d2785c679\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"1239-07-04\",\n \"dateOfUpdate\": \"2383-10-08\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"providerId\": \"1424fde8-e2a8-4a06-b056-e738ba92f4d9\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"1215-11-05\",\n \"dateOfUpdate\": \"1335-04-30\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"providerId\": \"2e9706be-6b29-4517-8ed7-1006d00f2f22\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2188-10-16\",\n \"dateOfUpdate\": \"1071-12-31\",\n \"effectiveStartDate\": \"2637-12-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e8f64c1c-18bb-4fbc-b001-7eba71a222aa\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2555-12-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1479-12-30\",\n \"dateOfUpdate\": \"1040-01-01\",\n \"effectiveStartDate\": \"2370-06-15\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1d70365a-74a7-4340-8ac4-52486faa7771\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1460-02-01\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"8abe5187-9b27-4f61-9e90-c61c1864f19a\",\n \"type\": \"provider\",\n \"npi\": \"3521472876\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2029-12-20\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"wv\",\n \"ssnLastFour\": \"1933\",\n \"licenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"13-08\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"2740-10-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ca\",\n \"licenses\": [\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1418-12-31\",\n \"dateOfIssuance\": \"2085-11-17\",\n \"dateOfRenewal\": \"1311-09-08\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"dc\",\n \"previous\": {\n \"dateOfExpiration\": \"1601-06-02\",\n \"dateOfIssuance\": \"2629-02-05\",\n \"dateOfRenewal\": \"1654-12-20\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9182700485\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1200-11-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+92643937755835\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7411986766\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1990-03-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2882-03-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2118-06-30\",\n \"phoneNumber\": \"+051995078739120\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2322-12-09\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"mt\",\n \"previous\": {\n \"dateOfExpiration\": \"2632-03-04\",\n \"dateOfIssuance\": \"1318-10-08\",\n \"dateOfRenewal\": \"1340-02-17\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0390938058\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1213-10-10\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+05461792036\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4862553081\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2504-10-13\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1829-11-06\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2949-12-30\",\n \"phoneNumber\": \"+120941010917607\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2176-11-15\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"va\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"middleName\": \"\",\n \"providerId\": \"05808075-7f81-4fe0-bd15-aaf4bae96313\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"80cc917e-0e45-498b-a01e-46dfaf9422ec\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"b59bcbf2-c163-4fb9-86c4-a0f3c3189ca1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8088263473\",\n \"dateOfBirth\": \"1123-10-31\",\n \"ssnLastFour\": \"1880\",\n \"phoneNumber\": \"+326285850838714\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1549-11-25\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1175-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ar\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"36649371-9214-4d9e-b541-5735d9ea708b\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1701-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1784-04-28\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1811-09-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3be367fd-7032-4eee-9057-f25158464542\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2886-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1849-11-04\",\n \"dateOfIssuance\": \"1727-03-31\",\n \"dateOfRenewal\": \"2147-12-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"pr\",\n \"previous\": {\n \"dateOfExpiration\": \"1023-02-22\",\n \"dateOfIssuance\": \"2532-12-02\",\n \"dateOfRenewal\": \"1053-10-27\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7397903163\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2428-07-24\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+917559203\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2743883980\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2839-10-07\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2744-09-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2259-09-05\",\n \"phoneNumber\": \"+58912316901398\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1600-08-03\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"co\",\n \"previous\": {\n \"dateOfExpiration\": \"2448-03-31\",\n \"dateOfIssuance\": \"1788-12-01\",\n \"dateOfRenewal\": \"1711-07-29\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8986979461\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2015-02-24\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+91875239944\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9116841702\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2433-05-25\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2566-01-15\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1161-01-31\",\n \"phoneNumber\": \"+36158878\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1548-09-16\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"de\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"3767aa19-bf41-474c-9138-44ed4758bfb7\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"pa\",\n \"licenseType\": \"\",\n \"providerId\": \"f839ba46-83e1-4214-a32b-6f059c1103c1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"providerId\": \"a0d710fd-c888-4f32-94d4-e53275a7ee1e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"9630005174\",\n \"dateOfBirth\": \"2103-11-22\",\n \"ssnLastFour\": \"2869\",\n \"phoneNumber\": \"+075553273143\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2441-11-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1685-08-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"296de178-c4df-49a2-b2e3-bbf85a1537d5\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1364-11-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1273-07-26\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2678-11-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4b00f3fa-ffe4-4347-b72b-93057bd51694\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2939-10-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"2834-05-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"00e4e114-ffbf-40dd-b352-1b8a53d7dd16\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"1808-05-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"75396ba5-e504-426a-a51f-a3baade8f5d2\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"al\",\n \"me\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2620-12-10\",\n \"dateOfIssuance\": \"2307-10-02\",\n \"dateOfRenewal\": \"1072-11-11\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ky\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1210-08-03\",\n \"dateOfIssuance\": \"2086-12-25\",\n \"dateOfRenewal\": \"1635-10-31\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"mo\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ne\",\n \"type\": \"privilege\",\n \"providerId\": \"c5529e93-5fd7-4f3e-bac4-ede0ec84b225\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"az\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"co\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2146-05-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1564-10-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"95bb8f53-92a6-4f95-a344-7486ed68e496\",\n \"dateOfRenewal\": \"1234-07-30\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wy\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2450-02-06\",\n \"dateOfIssuance\": \"1144-04-07\",\n \"dateOfRenewal\": \"2162-01-27\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"ok\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"pa\",\n \"type\": \"privilege\",\n \"providerId\": \"3f88efc2-04c8-498b-83c4-f62bff1f9d1c\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"nj\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ut\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1263-11-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1907-03-20\",\n \"privilegeId\": \"\",\n \"providerId\": \"1da0c1ab-df4a-4d76-a05d-3888ec8dd690\",\n \"dateOfRenewal\": \"2530-08-20\",\n \"dateOfUpdate\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"or\",\n \"licenseJurisdiction\": \"tn\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"f0860327-e2d4-4218-820b-07844da613e2\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ct\",\n \"licenseType\": \"\",\n \"providerId\": \"1eb95a72-28a1-43f2-8ab0-e7694549a465\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"bac7a7f8-5d68-4ed8-961c-fed4778fbc17\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1884-09-01\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1801-11-23\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a404af0a-1cd5-448e-8fb3-2f2d976e9d98\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1873-11-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1294-11-27\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2195-01-17\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"79998715-1d2d-424f-83f9-781152e5bfff\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2807-09-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1164-10-31\",\n \"dateOfIssuance\": \"2505-03-31\",\n \"dateOfRenewal\": \"1015-12-30\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wa\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1949-11-30\",\n \"dateOfIssuance\": \"2851-10-31\",\n \"dateOfRenewal\": \"2757-08-11\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"nj\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ok\",\n \"type\": \"privilege\",\n \"providerId\": \"af7cfee7-5063-48f2-80d2-5c8e4592d556\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ar\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"mn\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1626-04-10\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1514-11-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"e7176921-3038-403b-8da3-8005c8155a2c\",\n \"dateOfRenewal\": \"1787-03-21\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"nm\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1606-09-11\",\n \"dateOfIssuance\": \"2184-12-21\",\n \"dateOfRenewal\": \"2383-08-30\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"nv\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"al\",\n \"type\": \"privilege\",\n \"providerId\": \"a305b4a7-093d-44f5-bdf7-4d15c689a365\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ok\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ne\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2728-03-30\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1796-11-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"100d20d6-c557-4ea3-aea9-7c2c36ef9d1b\",\n \"dateOfRenewal\": \"1607-11-31\",\n \"dateOfUpdate\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"sc\",\n \"licenseJurisdiction\": \"ct\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"e4bab004-d0d1-44d3-bf59-b1b6021cca2a\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"providerId\": \"972a828c-9141-44d9-ac6b-921c12a14951\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ny\",\n \"licenseType\": \"\",\n \"providerId\": \"be1bb960-c9fc-4338-9192-7557ef4f145b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2953-11-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1450-07-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mi\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1ec2d6e7-8fc1-47e2-a06c-9dce079e5fe0\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1803-08-08\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1417-01-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2946-11-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"0555315c-4fb4-4800-9682-1769d0d58577\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2601-03-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"c6924611-02c0-4d24-b0a3-2162f676f0c6\",\n \"type\": \"provider\",\n \"npi\": \"7005556145\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2323-09-29\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ga\",\n \"ssnLastFour\": \"0968\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -4430,7 +4430,7 @@ "value": "application/json" } ], - "id": "4b12bfec-3a1b-4576-9a13-54a88929e789", + "id": "f58dc51f-63d7-41b7-a52e-e56066b688de", "name": "200 response", "originalRequest": { "body": {}, @@ -4471,7 +4471,7 @@ "item": [ { "event": [], - "id": "caaf2c05-30ad-483f-86c6-b879c0a721f9", + "id": "d352b487-b7c4-4758-a7da-f53b35d4cd82", "name": "/v1/provider-users/me/email", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4526,7 +4526,7 @@ "value": "application/json" } ], - "id": "93b64f5d-f870-46fa-8ab5-d20f616a8f80", + "id": "d9f05380-e746-4dea-96a3-a20db5eec6bb", "name": "200 response", "originalRequest": { "body": { @@ -4581,7 +4581,7 @@ "item": [ { "event": [], - "id": "cdf02898-bb40-492d-914d-068562a6301d", + "id": "182fff22-f3ea-440b-87ef-913bc93a6d75", "name": "/v1/provider-users/me/email/verify", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4595,7 +4595,7 @@ "language": "json" } }, - "raw": "{\n \"verificationCode\": \"3579\"\n}" + "raw": "{\n \"verificationCode\": \"1411\"\n}" }, "description": {}, "header": [ @@ -4637,7 +4637,7 @@ "value": "application/json" } ], - "id": "30567f56-b0cd-433a-9b41-b78e93c544e3", + "id": "64eaecec-f63c-4062-bc73-eb706740e230", "name": "200 response", "originalRequest": { "body": { @@ -4648,7 +4648,7 @@ "language": "json" } }, - "raw": "{\n \"verificationCode\": \"3579\"\n}" + "raw": "{\n \"verificationCode\": \"1411\"\n}" }, "header": [ { @@ -4699,7 +4699,7 @@ "item": [ { "event": [], - "id": "feb063f0-de5d-4be6-a90b-75d4a5c0b297", + "id": "b440fb1a-4f50-4393-96c1-7f6f7d3d845c", "name": "/v1/provider-users/me/home-jurisdiction", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4713,7 +4713,7 @@ "language": "json" } }, - "raw": "{\n \"jurisdiction\": \"ky\"\n}" + "raw": "{\n \"jurisdiction\": \"tx\"\n}" }, "description": {}, "header": [ @@ -4754,7 +4754,7 @@ "value": "application/json" } ], - "id": "2d81fc27-6171-4a56-8aeb-d3176405a5a8", + "id": "9933842d-156a-409d-bb69-fb4895d93b48", "name": "200 response", "originalRequest": { "body": { @@ -4765,7 +4765,7 @@ "language": "json" } }, - "raw": "{\n \"jurisdiction\": \"ky\"\n}" + "raw": "{\n \"jurisdiction\": \"tx\"\n}" }, "header": [ { @@ -4824,7 +4824,7 @@ "item": [ { "event": [], - "id": "e5157e92-7aac-4a13-b427-fb3aa05b60f8", + "id": "f9aa112a-2f76-441e-998c-bb1e4173cbff", "name": "/v1/provider-users/me/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4882,7 +4882,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"2530-10-09\",\n \"dateOfUpdate\": \"1693-03-31\",\n \"effectiveDate\": \"1260-11-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2291-10-30\",\n \"dateOfUpdate\": \"1104-10-30\",\n \"effectiveDate\": \"1943-03-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"va\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"61c5d582-0230-461d-84c5-cfed6b3d5e7d\"\n}", + "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1286-11-12\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1357-08-04\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"7fb7b7d6-5bc5-49cb-819b-59b10919270e\"\n}", "code": 200, "cookie": [], "header": [ @@ -4891,7 +4891,7 @@ "value": "application/json" } ], - "id": "0d08e47b-addd-4e55-8c2e-b0767b5694a9", + "id": "9ba1a2d3-cd5c-4092-bda4-140665c77799", "name": "200 response", "originalRequest": { "body": {}, @@ -4952,7 +4952,7 @@ "item": [ { "event": [], - "id": "2af4ef4e-c2bf-41b6-8e33-fc118d836448", + "id": "16e0bd1c-e1b3-476b-9da4-a02d35ef261f", "name": "/v1/provider-users/me/military-affiliation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4998,7 +4998,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"affiliationType\": \"militaryMemberSpouse\",\n \"dateOfUpdate\": \"1068-11-30\",\n \"dateOfUpload\": \"2873-01-01\",\n \"documentUploadFields\": [\n {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n },\n {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n }\n ],\n \"status\": \"\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}", + "body": "{\n \"affiliationType\": \"militaryMember\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"2066-05-18\",\n \"documentUploadFields\": [\n {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n },\n \"url\": \"\"\n },\n {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n },\n \"url\": \"\"\n }\n ],\n \"status\": \"\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -5007,7 +5007,7 @@ "value": "application/json" } ], - "id": "584c3b01-7842-4f9a-8147-a563cd50aab3", + "id": "4f2dea70-4628-4c0d-afab-c6f3bdd5e0bc", "name": "200 response", "originalRequest": { "body": { @@ -5059,7 +5059,7 @@ }, { "event": [], - "id": "df516c6d-b450-4d5d-81ef-d8cdebbd5b96", + "id": "6c1eb812-17eb-4ff6-860e-3676f973b248", "name": "/v1/provider-users/me/military-affiliation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5114,7 +5114,7 @@ "value": "application/json" } ], - "id": "2d17c0cf-9035-4a78-975c-ec1a2152c7aa", + "id": "3431646e-8b34-401d-9077-76a0c7912a78", "name": "200 response", "originalRequest": { "body": { @@ -5175,7 +5175,7 @@ "item": [ { "event": [], - "id": "dc5a11c1-ffee-46b3-9a98-f5a24d7cf290", + "id": "99d23e3a-ef91-4750-9634-b1562cf546b6", "name": "/v1/provider-users/registration", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5192,7 +5192,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"\",\n \"dob\": \"2941-10-30\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" + "raw": "{\n \"compact\": \"\",\n \"dob\": \"2310-02-17\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" }, "description": {}, "header": [ @@ -5232,7 +5232,7 @@ "value": "application/json" } ], - "id": "3995057e-2366-438d-8e4a-bd1e1a8397f7", + "id": "264c18b6-922c-4538-a973-391dbfa64ce7", "name": "200 response", "originalRequest": { "body": { @@ -5243,7 +5243,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"\",\n \"dob\": \"2941-10-30\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" + "raw": "{\n \"compact\": \"\",\n \"dob\": \"2310-02-17\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" }, "header": [ { @@ -5281,7 +5281,7 @@ "item": [ { "event": [], - "id": "492f106a-87a2-4dcd-9b68-79dec8d2430a", + "id": "74c14299-fa42-4a78-86fe-229cd46bc733", "name": "/v1/provider-users/verifyRecovery", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5298,7 +5298,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"octp\",\n \"providerId\": \"0a4a1345-30cb-4f49-838f-49c097d4989c\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" + "raw": "{\n \"compact\": \"coun\",\n \"providerId\": \"88d333c4-ad53-48b9-83a9-835bf4192ab2\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" }, "description": {}, "header": [ @@ -5338,7 +5338,7 @@ "value": "application/json" } ], - "id": "147b8ed4-1100-4aec-9471-4ca26611d748", + "id": "145b3686-29c6-4d7f-b210-4fa16df96d33", "name": "200 response", "originalRequest": { "body": { @@ -5349,7 +5349,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"octp\",\n \"providerId\": \"0a4a1345-30cb-4f49-838f-49c097d4989c\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" + "raw": "{\n \"compact\": \"coun\",\n \"providerId\": \"88d333c4-ad53-48b9-83a9-835bf4192ab2\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" }, "header": [ { @@ -5399,7 +5399,7 @@ "item": [ { "event": [], - "id": "3995e65f-482f-4954-b9ae-97fcc4d55e59", + "id": "296414b7-8456-4ec8-ad73-e92f382c2547", "name": "/v1/public/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5456,7 +5456,7 @@ "value": "application/json" } ], - "id": "281de5bd-34fb-4d95-83e1-db3a2b47b0ac", + "id": "addb6945-efc9-4ef6-b683-a11bae71f7d6", "name": "200 response", "originalRequest": { "body": {}, @@ -5497,7 +5497,7 @@ "item": [ { "event": [], - "id": "612e723c-eb1f-49fd-a686-3a79b62755ab", + "id": "f9bdb227-6300-42f5-88a1-39b37115c66d", "name": "/v1/public/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5514,7 +5514,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"6136f0f6-4808-421f-8960-c82a8032fa55\",\n \"jurisdiction\": \"vi\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"eae96496-f3d1-4e50-a01e-d9f0888ad726\",\n \"jurisdiction\": \"ak\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -5559,7 +5559,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"octp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"md\",\n \"privilegeJurisdictions\": [\n \"wi\",\n \"ia\"\n ],\n \"providerId\": \"1838012b-65fa-4e9a-81cd-0317017f72f6\",\n \"type\": \"provider\",\n \"npi\": \"5747287621\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ks\",\n \"dateOfUpdate\": \"1211-12-30\"\n },\n {\n \"compact\": \"coun\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"nh\",\n \"privilegeJurisdictions\": [\n \"tn\",\n \"mi\"\n ],\n \"providerId\": \"a3d0b23c-87cd-470b-8045-8a1cbf336b9c\",\n \"type\": \"provider\",\n \"npi\": \"4657254106\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"tx\",\n \"dateOfUpdate\": \"2463-04-23\"\n }\n ],\n \"query\": {\n \"providerId\": \"bada7cf7-cc56-4344-8073-993098bf8d03\",\n \"jurisdiction\": \"il\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"descending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"octp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ms\",\n \"privilegeJurisdictions\": [\n \"nj\",\n \"nm\"\n ],\n \"providerId\": \"ac354e7c-cd7e-409c-8a4d-65a86c572e33\",\n \"type\": \"provider\",\n \"npi\": \"3517135718\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"wi\",\n \"dateOfUpdate\": \"\"\n },\n {\n \"compact\": \"octp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"mn\",\n \"privilegeJurisdictions\": [\n \"ak\",\n \"co\"\n ],\n \"providerId\": \"d91e948a-c276-4c19-b430-fa13ccaf32b8\",\n \"type\": \"provider\",\n \"npi\": \"0261363651\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"il\",\n \"dateOfUpdate\": \"\"\n }\n ],\n \"query\": {\n \"providerId\": \"cb89668b-63c0-4582-a553-94617e6d0097\",\n \"jurisdiction\": \"wa\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -5568,7 +5568,7 @@ "value": "application/json" } ], - "id": "94339fd0-8b57-466e-a4f8-e7efac900094", + "id": "2716aaa6-b137-4dd0-959f-4fe4edaa56ca", "name": "200 response", "originalRequest": { "body": { @@ -5579,7 +5579,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"6136f0f6-4808-421f-8960-c82a8032fa55\",\n \"jurisdiction\": \"vi\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"eae96496-f3d1-4e50-a01e-d9f0888ad726\",\n \"jurisdiction\": \"ak\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -5620,7 +5620,7 @@ "item": [ { "event": [], - "id": "11a358e7-ce5a-41d1-9537-a481469b5e12", + "id": "1d7b4cd3-9bc4-4ccb-a1e0-2cb76964f83a", "name": "/v1/public/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5679,7 +5679,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2224-08-22\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"id\",\n \"privilegeJurisdictions\": [\n \"in\",\n \"nh\"\n ],\n \"providerId\": \"12ab9ce3-8189-4adb-81c4-a3b3a504e961\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"2656-07-31\",\n \"dateOfIssuance\": \"1305-09-31\",\n \"dateOfRenewal\": \"1544-04-21\",\n \"dateOfUpdate\": \"2990-10-31\",\n \"jurisdiction\": \"nv\",\n \"licenseJurisdiction\": \"ia\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"fb0e75c5-f980-4516-b0d9-d1e95681c285\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"2888-12-02\",\n \"jurisdiction\": \"pr\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2575-10-15\",\n \"dateOfIssuance\": \"1814-08-09\",\n \"dateOfRenewal\": \"2468-05-15\",\n \"dateOfUpdate\": \"2383-12-12\",\n \"licenseJurisdiction\": \"ak\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"701befe1-a04f-4d92-af8b-d8d9e6c86b57\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1864-06-07\",\n \"licenseJurisdiction\": \"ny\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1978-09-26\",\n \"dateOfIssuance\": \"2178-10-31\",\n \"dateOfUpdate\": \"2422-05-14\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"2766-07-31\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2351-10-12\",\n \"dateOfIssuance\": \"1032-10-14\",\n \"dateOfRenewal\": \"2370-11-17\",\n \"dateOfUpdate\": \"1749-01-17\",\n \"licenseJurisdiction\": \"ct\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"0092eb5e-b8b3-42ce-873e-4eb5f565dd01\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2223-07-30\",\n \"licenseJurisdiction\": \"nj\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1830-12-30\",\n \"dateOfIssuance\": \"1692-11-01\",\n \"dateOfUpdate\": \"2346-10-30\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1386-10-11\",\n \"dateOfUpdate\": \"1266-10-02\",\n \"effectiveStartDate\": \"1270-10-30\",\n \"jurisdiction\": \"ok\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"f2127279-7c8e-409f-86f1-362158a3acb7\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2313-11-20\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2881-04-03\",\n \"dateOfUpdate\": \"1464-12-31\",\n \"effectiveStartDate\": \"2115-09-07\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"d441dfd3-ce8e-447e-8020-46f92301348f\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1534-10-31\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"aslp\",\n \"dateOfExpiration\": \"1376-12-30\",\n \"dateOfIssuance\": \"2464-03-25\",\n \"dateOfRenewal\": \"2114-01-31\",\n \"dateOfUpdate\": \"1702-06-07\",\n \"jurisdiction\": \"ok\",\n \"licenseJurisdiction\": \"ma\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"1836f8a0-1ed3-4f13-a145-4db42c04ce7d\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"2305-01-27\",\n \"jurisdiction\": \"md\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1798-10-05\",\n \"dateOfIssuance\": \"1751-04-22\",\n \"dateOfRenewal\": \"1479-12-30\",\n \"dateOfUpdate\": \"1948-02-14\",\n \"licenseJurisdiction\": \"pa\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"e897be14-d79c-4a19-8d18-47aa105a344e\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1412-07-23\",\n \"licenseJurisdiction\": \"ga\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1725-12-13\",\n \"dateOfIssuance\": \"1711-12-30\",\n \"dateOfUpdate\": \"1536-09-30\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"1737-12-31\",\n \"jurisdiction\": \"ia\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1962-12-16\",\n \"dateOfIssuance\": \"2300-06-17\",\n \"dateOfRenewal\": \"2369-11-07\",\n \"dateOfUpdate\": \"2736-10-03\",\n \"licenseJurisdiction\": \"ok\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"69d043d3-e711-4b7b-89ec-1b3e9d21336e\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"other\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1754-11-25\",\n \"licenseJurisdiction\": \"ca\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2293-06-31\",\n \"dateOfIssuance\": \"1260-07-24\",\n \"dateOfUpdate\": \"2689-11-04\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1066-03-12\",\n \"dateOfUpdate\": \"2000-11-30\",\n \"effectiveStartDate\": \"1064-02-31\",\n \"jurisdiction\": \"ks\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"2f02dca3-03d0-454e-bbc1-6a478dc7de88\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2880-08-01\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2185-08-25\",\n \"dateOfUpdate\": \"2724-03-15\",\n \"effectiveStartDate\": \"1098-08-04\",\n \"jurisdiction\": \"in\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"033fe707-e154-48a3-8f78-9abcf7f733a9\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2637-10-30\"\n }\n ]\n }\n ],\n \"npi\": \"9555934309\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"id\",\n \"middleName\": \"\"\n}", + "body": "{\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"nv\",\n \"privilegeJurisdictions\": [\n \"oh\",\n \"hi\"\n ],\n \"providerId\": \"04c0d954-8741-48cd-83bd-964b473bb841\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"2354-12-29\",\n \"dateOfIssuance\": \"1527-12-27\",\n \"dateOfRenewal\": \"1486-10-05\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseJurisdiction\": \"ky\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"4936e414-4edb-440e-bc47-55695b7e6c91\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ne\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1215-10-18\",\n \"dateOfIssuance\": \"2661-02-09\",\n \"dateOfRenewal\": \"1088-12-08\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"dc\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"83c395e8-92d8-4107-9a84-833ad1fce6a1\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1931-10-08\",\n \"licenseJurisdiction\": \"mt\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1269-11-16\",\n \"dateOfIssuance\": \"2386-04-22\",\n \"dateOfUpdate\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"tx\",\n \"licenseType\": \"occupational therapy assistant\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2467-01-31\",\n \"dateOfIssuance\": \"1078-11-31\",\n \"dateOfRenewal\": \"1241-11-30\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"oh\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"b6e89969-065e-4a37-ab14-94bdd6ae29ab\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2572-08-06\",\n \"licenseJurisdiction\": \"al\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1328-04-30\",\n \"dateOfIssuance\": \"1666-08-25\",\n \"dateOfUpdate\": \"\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1667-12-14\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2094-10-21\",\n \"jurisdiction\": \"ar\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a3b4dad1-49ef-4f0e-8f40-d9e73054fbbe\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1496-11-21\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2416-11-29\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2000-02-17\",\n \"jurisdiction\": \"ct\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"525d0039-ca65-4a85-9f6c-7f1500bcc021\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2453-01-07\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"1324-10-07\",\n \"dateOfIssuance\": \"1861-07-09\",\n \"dateOfRenewal\": \"1614-10-12\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"nc\",\n \"licenseJurisdiction\": \"wv\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"f7829923-b276-41b9-b4c6-4e8bf819217f\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ca\",\n \"licenseType\": \"audiologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2169-12-31\",\n \"dateOfIssuance\": \"2488-03-21\",\n \"dateOfRenewal\": \"1988-03-31\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"mn\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"9f401e88-be6f-491f-bbb7-16b5c5d664c1\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2275-03-24\",\n \"licenseJurisdiction\": \"ne\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2543-12-05\",\n \"dateOfIssuance\": \"2780-05-18\",\n \"dateOfUpdate\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ut\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2258-04-30\",\n \"dateOfIssuance\": \"2012-04-24\",\n \"dateOfRenewal\": \"2152-06-07\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"mt\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"5c0ef8d9-8699-4d2f-be7f-32eaad3e2857\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1906-11-26\",\n \"licenseJurisdiction\": \"az\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2107-04-07\",\n \"dateOfIssuance\": \"2939-09-19\",\n \"dateOfUpdate\": \"\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1820-01-04\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1749-11-02\",\n \"jurisdiction\": \"wv\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4fb50855-a5e2-4d68-a10a-c1351b4f259a\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1940-02-02\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1581-04-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1272-08-28\",\n \"jurisdiction\": \"ny\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"5829561d-3880-46e3-92a5-ac2ed16b57a5\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2744-09-30\"\n }\n ]\n }\n ],\n \"npi\": \"2886024112\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"vi\",\n \"middleName\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -5688,7 +5688,7 @@ "value": "application/json" } ], - "id": "c60dd54a-6ca3-4404-bdf8-a61354e90af7", + "id": "9a5fe0d0-21f5-4b99-a812-0742bc0cf19a", "name": "200 response", "originalRequest": { "body": {}, @@ -5736,7 +5736,7 @@ "item": [ { "event": [], - "id": "bc4c9c45-d07f-4917-9bee-eb5a13201fc2", + "id": "eb4341b2-434e-45bb-bee6-0d17629a640f", "name": "/v1/public/compacts/:compact/providers/:providerId/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5820,7 +5820,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"2530-10-09\",\n \"dateOfUpdate\": \"1693-03-31\",\n \"effectiveDate\": \"1260-11-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"2291-10-30\",\n \"dateOfUpdate\": \"1104-10-30\",\n \"effectiveDate\": \"1943-03-30\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"va\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"61c5d582-0230-461d-84c5-cfed6b3d5e7d\"\n}", + "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1286-11-12\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1357-08-04\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"7fb7b7d6-5bc5-49cb-819b-59b10919270e\"\n}", "code": 200, "cookie": [], "header": [ @@ -5829,7 +5829,7 @@ "value": "application/json" } ], - "id": "fd2f7037-0178-44f8-8d01-bd8b8d81f585", + "id": "60cb93b2-b757-43d1-8e01-a7aa8affc3b2", "name": "200 response", "originalRequest": { "body": {}, @@ -5903,7 +5903,7 @@ "item": [ { "event": [], - "id": "de736016-c62a-486d-812b-03b03fd71571", + "id": "8173c9a8-c017-40e2-b20e-89c7eb6efa01", "name": "/v1/purchases/privileges", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5917,7 +5917,7 @@ "language": "json" } }, - "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"328125517\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"17034952\"\n }\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"ak\",\n \"ks\"\n ]\n}" + "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"3\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"04667985\"\n }\n ],\n \"licenseType\": \"audiologist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"wi\",\n \"in\"\n ]\n}" }, "description": {}, "header": [ @@ -5957,7 +5957,7 @@ "value": "application/json" } ], - "id": "3978b5de-e3d5-43fa-adff-c24c972eec6b", + "id": "f22c485b-f732-4689-92a0-b9fc9a404de7", "name": "200 response", "originalRequest": { "body": { @@ -5968,7 +5968,7 @@ "language": "json" } }, - "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"328125517\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"17034952\"\n }\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"ak\",\n \"ks\"\n ]\n}" + "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"3\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"04667985\"\n }\n ],\n \"licenseType\": \"audiologist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"wi\",\n \"in\"\n ]\n}" }, "header": [ { @@ -6011,7 +6011,7 @@ "item": [ { "event": [], - "id": "f8bc4790-ff43-48cb-b0bc-ec9a6ccf9a0b", + "id": "7dce28d8-cd92-4406-9c61-d65caa85ba43", "name": "/v1/purchases/privileges/options", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6053,7 +6053,7 @@ "value": "application/json" } ], - "id": "34742561-411b-43f4-b95f-583d51cdd168", + "id": "4453c953-533b-4328-824a-2a38a31b500d", "name": "200 response", "originalRequest": { "body": {}, @@ -6107,7 +6107,7 @@ "item": [ { "event": [], - "id": "4d695c24-ec8d-4563-98d5-72f20ce485eb", + "id": "b228dd44-defc-4578-9f15-3d42315a62ad", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6139,7 +6139,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -6157,7 +6157,7 @@ "value": "" } ], - "id": "7d60d1d3-7dda-420b-a700-572ac98f748e", + "id": "249c5aad-8180-43bc-aa29-a858aa320fe8", "name": "200 response", "originalRequest": { "body": {}, @@ -6202,7 +6202,7 @@ "value": "application/json" } ], - "id": "fe8f5932-3039-475f-ba71-07978c848809", + "id": "a2f9f3e8-921e-484b-b8bc-c97e7ea47cfc", "name": "404 response", "originalRequest": { "body": {}, @@ -6240,7 +6240,7 @@ }, { "event": [], - "id": "b0a24012-067a-483d-9c7d-1f599ca6be11", + "id": "fc9dac50-f39d-4bff-9e9e-ebacc7519547", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6285,7 +6285,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -6303,7 +6303,7 @@ "value": "" } ], - "id": "d90b7a70-6e9e-43f0-a5b1-c6c38a2d687d", + "id": "b4a91250-1614-4596-b78b-ba22c2a9bef0", "name": "200 response", "originalRequest": { "body": { @@ -6361,7 +6361,7 @@ "value": "application/json" } ], - "id": "f5b3e3a7-6541-46d0-9750-732fcfb6f911", + "id": "a402d321-4de2-4440-bd71-f00c01220dcb", "name": "404 response", "originalRequest": { "body": { diff --git a/backend/compact-connect/docs/postman/postman-collection.json b/backend/compact-connect/docs/postman/postman-collection.json index e68cb4647..56a050310 100644 --- a/backend/compact-connect/docs/postman/postman-collection.json +++ b/backend/compact-connect/docs/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "a186affe-3e03-401e-ad71-71ec0790c866", + "_postman_id": "3571a230-4680-400f-baeb-e2ce6861a894", "description": { "content": "", "type": "text/plain" @@ -410,7 +410,7 @@ "item": [ { "event": [], - "id": "91e458b7-2019-4f71-afe4-36c51c42212e", + "id": "9a0df7b8-8d2d-4f65-8618-7951c4d60e6a", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses", "protocolProfileBehavior": { "disableBodyPruning": true @@ -424,7 +424,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2015-07-03\",\n \"dateOfExpiration\": \"2926-08-04\",\n \"dateOfIssuance\": \"1235-12-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"ssn\": \"442-95-4572\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1797700392\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+832617283834\",\n \"dateOfRenewal\": \"2973-09-05\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2693-08-05\",\n \"dateOfExpiration\": \"2596-11-30\",\n \"dateOfIssuance\": \"1407-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"900-70-9308\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5624774738\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+422989943153\",\n \"dateOfRenewal\": \"1830-05-25\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1635-04-07\",\n \"dateOfExpiration\": \"2365-08-04\",\n \"dateOfIssuance\": \"2535-11-02\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"ssn\": \"516-71-4118\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8157619352\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+411669509084\",\n \"dateOfRenewal\": \"1569-01-22\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1090-08-30\",\n \"dateOfExpiration\": \"2707-01-17\",\n \"dateOfIssuance\": \"1248-01-06\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"563-39-1789\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4640556947\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+30075668\",\n \"dateOfRenewal\": \"2105-01-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "description": {}, "header": [ @@ -488,7 +488,7 @@ "value": "application/json" } ], - "id": "32461a54-14c2-4233-a947-996d2396b076", + "id": "54f28dca-10e5-49e1-8d9d-1adc13e55aa3", "name": "200 response", "originalRequest": { "body": { @@ -499,7 +499,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2015-07-03\",\n \"dateOfExpiration\": \"2926-08-04\",\n \"dateOfIssuance\": \"1235-12-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"ssn\": \"442-95-4572\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1797700392\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+832617283834\",\n \"dateOfRenewal\": \"2973-09-05\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2693-08-05\",\n \"dateOfExpiration\": \"2596-11-30\",\n \"dateOfIssuance\": \"1407-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"900-70-9308\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5624774738\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+422989943153\",\n \"dateOfRenewal\": \"1830-05-25\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1635-04-07\",\n \"dateOfExpiration\": \"2365-08-04\",\n \"dateOfIssuance\": \"2535-11-02\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"ssn\": \"516-71-4118\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8157619352\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+411669509084\",\n \"dateOfRenewal\": \"1569-01-22\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1090-08-30\",\n \"dateOfExpiration\": \"2707-01-17\",\n \"dateOfIssuance\": \"1248-01-06\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"563-39-1789\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4640556947\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+30075668\",\n \"dateOfRenewal\": \"2105-01-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -540,7 +540,7 @@ }, { "_postman_previewlanguage": "json", - "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ],\n \"key_2\": [\n \"\",\n \"\"\n ]\n },\n \"key_1\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ]\n },\n \"key_2\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ]\n }\n }\n}", + "body": "{\n \"message\": \"\",\n \"errors\": {\n \"key_0\": {\n \"key_0\": [\n \"\",\n \"\"\n ],\n \"key_1\": [\n \"\",\n \"\"\n ]\n }\n }\n}", "code": 400, "cookie": [], "header": [ @@ -549,7 +549,7 @@ "value": "application/json" } ], - "id": "83666665-2080-4300-ab30-a599e6991dad", + "id": "a4047a00-f95d-442c-b847-c265520d113d", "name": "400 response", "originalRequest": { "body": { @@ -560,7 +560,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2015-07-03\",\n \"dateOfExpiration\": \"2926-08-04\",\n \"dateOfIssuance\": \"1235-12-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapist\",\n \"ssn\": \"442-95-4572\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"1797700392\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+832617283834\",\n \"dateOfRenewal\": \"2973-09-05\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2693-08-05\",\n \"dateOfExpiration\": \"2596-11-30\",\n \"dateOfIssuance\": \"1407-09-28\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"ssn\": \"900-70-9308\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"5624774738\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+422989943153\",\n \"dateOfRenewal\": \"1830-05-25\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1635-04-07\",\n \"dateOfExpiration\": \"2365-08-04\",\n \"dateOfIssuance\": \"2535-11-02\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"ssn\": \"516-71-4118\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8157619352\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+411669509084\",\n \"dateOfRenewal\": \"1569-01-22\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1090-08-30\",\n \"dateOfExpiration\": \"2707-01-17\",\n \"dateOfIssuance\": \"1248-01-06\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"563-39-1789\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4640556947\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+30075668\",\n \"dateOfRenewal\": \"2105-01-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -631,7 +631,7 @@ } } ], - "id": "bc02e8d1-e8f7-4313-af48-20f36d304907", + "id": "f36e5266-4c1b-4a6d-ae4a-6a681dadc41e", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -697,7 +697,7 @@ "value": "application/json" } ], - "id": "c44b8d78-6fb8-4903-a3dc-251fb4a6d1d4", + "id": "56b8e399-fd49-432b-8918-8373d75f1ebc", "name": "200 response", "originalRequest": { "body": {}, @@ -751,7 +751,7 @@ "item": [ { "event": [], - "id": "942c4a23-62fd-4496-bb73-e44c8a7bf132", + "id": "b325870b-ec61-40c4-9776-0721b3a6366e", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -765,7 +765,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"endDateTime\": \"1370-06-03T12:31:16Z\",\n \"startDateTime\": \"1650-07-22T23:34:09Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"endDateTime\": \"1120-11-25T20:58:29Z\",\n \"startDateTime\": \"1526-04-28T20:20:11Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}" }, "description": {}, "header": [ @@ -821,7 +821,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"03-07\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1677-07-05\",\n \"dateOfUpdate\": \"1174-10-03\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"de\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"nm\",\n \"ms\"\n ],\n \"providerId\": \"51d36f22-543b-45c6-a2b7-578deecf553b\",\n \"type\": \"provider\",\n \"npi\": \"0347934212\",\n \"dateOfBirth\": \"1297-09-07\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"9761\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"09-00\",\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2751-12-31\",\n \"dateOfUpdate\": \"1256-02-24\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"ma\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"pa\",\n \"il\"\n ],\n \"providerId\": \"a720c210-a2e8-49af-8ace-ba92e70b654c\",\n \"type\": \"provider\",\n \"npi\": \"8243759491\",\n \"dateOfBirth\": \"1009-03-03\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"0369\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"16-17\",\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2836-06-09\",\n \"dateOfUpdate\": \"1247-07-25\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"nd\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"ut\",\n \"mi\"\n ],\n \"providerId\": \"7949f998-a425-4314-8cfb-923824d72df7\",\n \"type\": \"provider\",\n \"npi\": \"5628588603\",\n \"dateOfBirth\": \"2933-05-18\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"3860\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"01-26\",\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1276-11-30\",\n \"dateOfUpdate\": \"2503-12-11\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"nc\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"ne\",\n \"ca\"\n ],\n \"providerId\": \"4b84c91f-83fa-4655-a88e-d6cc1b9eda65\",\n \"type\": \"provider\",\n \"npi\": \"9655842338\",\n \"dateOfBirth\": \"1763-02-18\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"4504\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -830,7 +830,7 @@ "value": "application/json" } ], - "id": "388de3d4-d138-4b93-803d-1c20b277890c", + "id": "fa67be96-7a81-4fbf-85eb-cf9837a2d3a2", "name": "200 response", "originalRequest": { "body": { @@ -841,7 +841,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"endDateTime\": \"1370-06-03T12:31:16Z\",\n \"startDateTime\": \"1650-07-22T23:34:09Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"endDateTime\": \"1120-11-25T20:58:29Z\",\n \"startDateTime\": \"1526-04-28T20:20:11Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}" }, "header": [ { @@ -891,7 +891,7 @@ "item": [ { "event": [], - "id": "3287d4c9-3fd1-4589-81f0-27a773b95fc4", + "id": "47a9dfac-fcd1-4fbb-a6c8-d4da3d174c5b", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -958,7 +958,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"privileges\": [\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2899-05-06\",\n \"dateOfIssuance\": \"1608-02-30\",\n \"dateOfRenewal\": \"1022-11-28\",\n \"dateOfUpdate\": \"2214-07-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"hi\",\n \"licenseJurisdiction\": \"ky\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"44525f26-3857-4280-a75c-a900ec028790\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"0861420316\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2419-10-31\",\n \"ssnLastFour\": \"0984\",\n \"phoneNumber\": \"+7319658149079\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1096-11-03\",\n \"dateOfIssuance\": \"2080-04-30\",\n \"dateOfRenewal\": \"2959-11-08\",\n \"dateOfUpdate\": \"2914-04-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseJurisdiction\": \"md\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"0bc86198-dfac-4107-8b67-f96e14a55a9d\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"8186342154\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2962-03-30\",\n \"ssnLastFour\": \"1222\",\n \"phoneNumber\": \"+630003948118566\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n ],\n \"providerUIUrl\": \"\"\n}", + "body": "{\n \"privileges\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1372-09-27\",\n \"dateOfIssuance\": \"2650-01-31\",\n \"dateOfRenewal\": \"2117-11-31\",\n \"dateOfUpdate\": \"1475-09-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseJurisdiction\": \"in\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"216361eb-adbc-402b-8066-4e534963870a\",\n \"status\": \"active\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"2756906983\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2676-01-06\",\n \"ssnLastFour\": \"3462\",\n \"phoneNumber\": \"+46030480739\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2073-11-30\",\n \"dateOfIssuance\": \"2209-12-03\",\n \"dateOfRenewal\": \"1868-05-30\",\n \"dateOfUpdate\": \"1045-10-29\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseJurisdiction\": \"mn\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"9a2df7c8-57ae-457d-a9ee-66b1dbd96046\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"7748811116\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"1080-02-08\",\n \"ssnLastFour\": \"1114\",\n \"phoneNumber\": \"+88477899480\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n ],\n \"providerUIUrl\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -967,7 +967,7 @@ "value": "application/json" } ], - "id": "e4258b9e-da5b-425f-832d-952fe753ffea", + "id": "12623830-9521-4644-8ce9-2b532f41605b", "name": "200 response", "originalRequest": { "body": {}, diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index 1385a0c33..0f3c0f471 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -1687,8 +1687,10 @@ def create_investigation(self, investigation: InvestigationData) -> None: 'TableName': self.config.provider_table.table_name, 'Key': { 'pk': {'S': f'{investigation.compact}#PROVIDER#{investigation.providerId}'}, - 'sk': {'S': f'{investigation.compact}#PROVIDER#{record_type}/' - f'{investigation.jurisdiction}/{investigation.licenseTypeAbbreviation}#'}, + 'sk': { + 'S': f'{investigation.compact}#PROVIDER#{record_type}/' + f'{investigation.jurisdiction}/{investigation.licenseTypeAbbreviation}#' + }, }, 'UpdateExpression': ( 'SET investigationStatus = :investigationStatus, dateOfUpdate = :dateOfUpdate' @@ -1745,9 +1747,7 @@ def close_investigation( # Query for the record (privilege or license) and all its investigations in a single query query_results = self.config.provider_table.query( KeyConditionExpression=Key('pk').eq(f'{compact}#PROVIDER#{provider_id}') - & Key('sk').begins_with( - f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#' - ) + & Key('sk').begins_with(f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#') )['Items'] # Separate the main record from investigation records diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py index d13bf5d8b..5728a23ca 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py @@ -260,9 +260,9 @@ def get_enriched_history_with_synthetic_updates_from_privilege( # We don't ever serve investigation updates via the API - they're only for internal change history tracking history_without_investigations = [ - update for update in history if update['updateType'] not in ( - UpdateCategory.INVESTIGATION, UpdateCategory.CLOSING_INVESTIGATION - ) + update + for update in history + if update['updateType'] not in (UpdateCategory.INVESTIGATION, UpdateCategory.CLOSING_INVESTIGATION) ] create_date_sorted_original_history = sorted(history_without_investigations, key=lambda x: x['createDate']) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py index bc3d660ee..24e60f73a 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py @@ -240,6 +240,6 @@ def validate_investigation_details_present_if_investigation_status_updated(self, Require investigationDetails whenever update type is investigation """ if data['updateType'] == UpdateCategory.INVESTIGATION and not data.get('investigationDetails'): - raise ValidationError({ - 'investigationDetails': ['This field is required when update was investigation type'] - }) + raise ValidationError( + {'investigationDetails': ['This field is required when update was investigation type']} + ) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py index 48c24d6fe..b7cf6dd95 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py @@ -267,9 +267,9 @@ def validate_investigation_details_present_if_investigation_status_updated(self, Require investigationDetails whenever update type is investigation """ if data['updateType'] == UpdateCategory.INVESTIGATION and not data.get('investigationDetails'): - raise ValidationError({ - 'investigationDetails': ['This field is required when update was investigation type'] - }) + raise ValidationError( + {'investigationDetails': ['This field is required when update was investigation type']} + ) @pre_dump def generate_compact_transaction_gsi_field(self, in_data, **kwargs): # noqa: ARG001 unused-argument diff --git a/backend/compact-connect/lambdas/python/common/requirements-dev.in b/backend/compact-connect/lambdas/python/common/requirements-dev.in index 03b06f84d..676fc10bc 100644 --- a/backend/compact-connect/lambdas/python/common/requirements-dev.in +++ b/backend/compact-connect/lambdas/python/common/requirements-dev.in @@ -1,4 +1,4 @@ moto[all]>=5.0.12, <6 boto3-stubs[full] -Faker>=28,<29 +Faker>=37, <38 cryptography>=46, <47 diff --git a/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py b/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py index c1b869999..4a68613dc 100644 --- a/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py +++ b/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py @@ -1,10 +1,9 @@ from uuid import UUID from cc_common.config import config, logger -from cc_common.data_model.provider_record_util import ProviderData, ProviderUserRecords -from cc_common.data_model.schema.data_event.api import ( - InvestigationEventDetailSchema, -) +from cc_common.data_model.provider_record_util import ProviderUserRecords +from cc_common.data_model.schema.data_event.api import InvestigationEventDetailSchema +from cc_common.data_model.schema.provider import ProviderData from cc_common.email_service_client import InvestigationNotificationTemplateVariables, ProviderNotificationMethod from cc_common.license_util import LicenseUtility from cc_common.utils import sqs_handler diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.in b/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.in index 804353503..1b04a07e0 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.in +++ b/backend/compact-connect/lambdas/python/provider-data-v1/requirements-dev.in @@ -1,2 +1,2 @@ moto[dynamodb, s3]>=5.0.12, <6 -Faker>=28,<29 +Faker>=37, <38 diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py index 934a547e4..02c33e63f 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py @@ -189,7 +189,7 @@ def test_privilege_investigation_handler(self, mock_publish_event): 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, 'investigationId': privilege['investigations'][0]['investigationId'], # Dynamic field } - ] + ], } self.assertDictFieldsMatch(expected_privilege, privilege) @@ -351,9 +351,7 @@ def test_license_investigation_handler(self, mock_publish_event): } )['Item'] - self.assertEqual( - InvestigationStatusEnum.UNDER_INVESTIGATION, updated_license_record['investigationStatus'] - ) + self.assertEqual(InvestigationStatusEnum.UNDER_INVESTIGATION, updated_license_record['investigationStatus']) # Verify that investigation objects are included in the API response api_event = self.test_data_generator.generate_test_api_event( @@ -392,7 +390,7 @@ def test_license_investigation_handler(self, mock_publish_event): 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, 'investigationId': investigation['investigationId'], # Dynamic field } - ] + ], } self.assertDictFieldsMatch(expected_license, license_obj) @@ -417,7 +415,6 @@ def test_license_investigation_handler(self, mock_publish_event): } self.assertEqual(expected_event_args, call_args) - def test_license_investigation_handler_returns_access_denied_if_compact_admin(self): """Verifying that only state admins are allowed to create license investigations""" from handlers.investigation import investigation_handler diff --git a/backend/compact-connect/lambdas/python/purchases/requirements-dev.in b/backend/compact-connect/lambdas/python/purchases/requirements-dev.in index e70e99fa0..3093094b6 100644 --- a/backend/compact-connect/lambdas/python/purchases/requirements-dev.in +++ b/backend/compact-connect/lambdas/python/purchases/requirements-dev.in @@ -5,4 +5,4 @@ coverage ruff pip-tools pip-audit -Faker>=28,<29 +Faker>=37, <38 diff --git a/backend/compact-connect/lambdas/python/staff-users/requirements-dev.in b/backend/compact-connect/lambdas/python/staff-users/requirements-dev.in index 0814db7f2..5d994613d 100644 --- a/backend/compact-connect/lambdas/python/staff-users/requirements-dev.in +++ b/backend/compact-connect/lambdas/python/staff-users/requirements-dev.in @@ -1,2 +1,2 @@ moto[dynamodb, s3, cognitoidp]>=5.0.15, <6 -Faker>=28,<29 +Faker>=37, <38 diff --git a/backend/compact-connect/requirements-dev.in b/backend/compact-connect/requirements-dev.in index b63c88c44..fc6f66734 100644 --- a/backend/compact-connect/requirements-dev.in +++ b/backend/compact-connect/requirements-dev.in @@ -4,4 +4,4 @@ coverage ruff pip-tools pip-audit -Faker>=28,<29 +Faker>=37, <38 diff --git a/backend/compact-connect/stacks/api_lambda_stack/provider_management.py b/backend/compact-connect/stacks/api_lambda_stack/provider_management.py index 4d5858545..8253981ed 100644 --- a/backend/compact-connect/stacks/api_lambda_stack/provider_management.py +++ b/backend/compact-connect/stacks/api_lambda_stack/provider_management.py @@ -31,7 +31,6 @@ def __init__( self.stack: Stack = Stack.of(scope) lambda_environment = { 'PROVIDER_TABLE_NAME': persistent_stack.provider_table.table_name, - 'STAFF_USERS_TABLE_NAME': persistent_stack.staff_users.user_table.table_name, 'EVENT_BUS_NAME': data_event_bus.event_bus_name, 'PROV_FAM_GIV_MID_INDEX_NAME': persistent_stack.provider_table.provider_fam_giv_mid_index_name, 'PROV_DATE_OF_UPDATE_INDEX_NAME': persistent_stack.provider_table.provider_date_of_update_index_name, @@ -84,7 +83,7 @@ def _create_provider_investigation_handler(self, lambda_environment: dict) -> Py { 'id': 'AwsSolutions-IAM5', 'reason': 'The actions in this policy are specifically what this lambda needs to read ' - 'and is scoped to one table and encryption key.', + 'and is scoped to tables and an event bus.', }, ], ) diff --git a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py index 0823f378c..87a059cfd 100644 --- a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py +++ b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py @@ -559,8 +559,7 @@ def post_provider_military_affiliation_response_model(self) -> Model: 'dateOfUpdate': JsonSchema( type=JsonSchemaType.STRING, description='The date the document was last updated', - format='date', - pattern=cc_api.YMD_FORMAT, + format='date-time', ), 'documentUploadFields': JsonSchema( type=JsonSchemaType.ARRAY, @@ -1029,8 +1028,7 @@ def _provider_detail_response_schema(self): 'licenseType': JsonSchema(type=JsonSchemaType.STRING, enum=self.stack.license_type_names), 'dateOfUpdate': JsonSchema( type=JsonSchemaType.STRING, - format='date', - pattern=cc_api.YMD_FORMAT, + format='date-time', ), 'licenseStatus': JsonSchema(type=JsonSchemaType.STRING, enum=['active', 'inactive']), 'compactEligibility': JsonSchema( @@ -1068,9 +1066,7 @@ def _provider_detail_response_schema(self): 'licenseType': JsonSchema( type=JsonSchemaType.STRING, enum=self.stack.license_type_names ), - 'dateOfUpdate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'previous': JsonSchema( type=JsonSchemaType.OBJECT, required=[ @@ -1162,9 +1158,7 @@ def _provider_detail_response_schema(self): 'effectiveLiftDate': JsonSchema( type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT ), - 'dateOfUpdate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'encumbranceType': JsonSchema(type=JsonSchemaType.STRING), # TODO - remove this after migrating to list field # noqa: FIX002 'clinicalPrivilegeActionCategory': JsonSchema(type=JsonSchemaType.STRING), @@ -1238,9 +1232,7 @@ def _provider_detail_response_schema(self): 'licenseType': JsonSchema( type=JsonSchemaType.STRING, enum=self.stack.license_type_names ), - 'dateOfUpdate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'previous': JsonSchema( type=JsonSchemaType.OBJECT, required=[ @@ -1312,9 +1304,7 @@ def _provider_detail_response_schema(self): 'effectiveLiftDate': JsonSchema( type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT ), - 'dateOfUpdate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'encumbranceType': JsonSchema(type=JsonSchemaType.STRING), # TODO - remove this after migrating to list field # noqa: FIX002 'clinicalPrivilegeActionCategory': JsonSchema(type=JsonSchemaType.STRING), @@ -1356,9 +1346,7 @@ def _provider_detail_response_schema(self): ], properties={ 'type': JsonSchema(type=JsonSchemaType.STRING, enum=['militaryAffiliation']), - 'dateOfUpdate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'providerId': JsonSchema(type=JsonSchemaType.STRING, pattern=cc_api.UUID4_FORMAT), 'compact': JsonSchema( type=JsonSchemaType.STRING, enum=self.stack.node.get_context('compacts') @@ -1495,8 +1483,8 @@ def _investigation_schema(self) -> JsonSchema: enum=self.stack.node.get_context('jurisdictions'), ), 'licenseType': JsonSchema(type=JsonSchemaType.STRING), - 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), - 'creationDate': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), + 'creationDate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'submittingUser': JsonSchema(type=JsonSchemaType.STRING), }, ) @@ -1575,7 +1563,7 @@ def _common_provider_properties(self) -> dict: max_length=100, ), 'currentHomeJurisdiction': self.current_home_jurisdiction_selection_field, - 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), } @property @@ -1588,7 +1576,7 @@ def _common_privilege_properties(self) -> dict: 'dateOfIssuance': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), 'dateOfRenewal': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), 'dateOfExpiration': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), - 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'compactTransactionId': JsonSchema(type=JsonSchemaType.STRING), 'privilegeId': JsonSchema(type=JsonSchemaType.STRING), 'licenseJurisdiction': JsonSchema( @@ -2362,15 +2350,11 @@ def privilege_history_response_model(self) -> Model: properties={ 'type': JsonSchema(type=JsonSchemaType.STRING, enum=['privilegeUpdate']), 'updateType': self._update_type_schema, - 'dateOfUpdate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'effectiveDate': JsonSchema( type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT ), - 'createDate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), + 'createDate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'note': JsonSchema(type=JsonSchemaType.STRING), }, ), @@ -2454,7 +2438,7 @@ def _public_privilege_response_schema(self): 'dateOfIssuance': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), 'dateOfRenewal': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), 'dateOfExpiration': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), - 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'privilegeId': JsonSchema(type=JsonSchemaType.STRING), 'administratorSetStatus': JsonSchema(type=JsonSchemaType.STRING, enum=['active', 'inactive']), 'status': JsonSchema(type=JsonSchemaType.STRING, enum=['active', 'inactive']), @@ -2483,9 +2467,7 @@ def _public_privilege_response_schema(self): enum=stack.node.get_context('jurisdictions'), ), 'licenseType': JsonSchema(type=JsonSchemaType.STRING, enum=self.stack.license_type_names), - 'dateOfUpdate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'previous': JsonSchema( type=JsonSchemaType.OBJECT, required=[ @@ -2510,9 +2492,7 @@ def _public_privilege_response_schema(self): 'dateOfRenewal': JsonSchema( type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT ), - 'dateOfUpdate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'licenseJurisdiction': JsonSchema( type=JsonSchemaType.STRING, enum=stack.node.get_context('jurisdictions'), @@ -2535,9 +2515,7 @@ def _public_privilege_response_schema(self): 'dateOfRenewal': JsonSchema( type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT ), - 'dateOfUpdate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), 'licenseJurisdiction': JsonSchema( type=JsonSchemaType.STRING, enum=stack.node.get_context('jurisdictions'), @@ -2585,9 +2563,7 @@ def _public_privilege_response_schema(self): 'effectiveLiftDate': JsonSchema( type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT ), - 'dateOfUpdate': JsonSchema( - type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT - ), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), }, ), ), @@ -2710,7 +2686,7 @@ def _common_public_provider_properties(self) -> dict: items=JsonSchema(type=JsonSchemaType.STRING, enum=stack.node.get_context('jurisdictions')), ), 'currentHomeJurisdiction': self.current_home_jurisdiction_selection_field, - 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date', pattern=cc_api.YMD_FORMAT), + 'dateOfUpdate': JsonSchema(type=JsonSchemaType.STRING, format='date-time'), } @property diff --git a/backend/compact-connect/tests/app/base.py b/backend/compact-connect/tests/app/base.py index bd47511a4..090710b8c 100644 --- a/backend/compact-connect/tests/app/base.py +++ b/backend/compact-connect/tests/app/base.py @@ -65,9 +65,23 @@ def setUpClass(cls): # pylint: disable=invalid-name """ We build the app once per TestCase, to save compute time in the test suite """ + cls._overwrite_snapshots = False + cls.set_overwrite_snapshots() + cls.context = cls.get_context() cls.app = _app_synthesizer.get_app(cls.context) + @classmethod + def set_overwrite_snapshots(cls): + """ + Allow environment variable to force snapshot comparisons to overwrite the snapshot + + ``` + OVERWRITE_SNAPSHOTS=true pytest tests + ``` + """ + cls._overwrite_snapshots = os.environ.get('OVERWRITE_SNAPSHOTS', 'false').lower() == 'true' + def test_no_compact_jurisdiction_name_clash(self): """ Because compact and jurisdiction abbreviations share space in access token scopes, we need to ensure that @@ -599,6 +613,9 @@ def compare_snapshot(self, actual: Mapping | list, snapshot_name: str, overwrite Compare the actual dictionary to the snapshot with the given name. If overwrite_snapshot is True, overwrite the snapshot with the actual data. """ + # Let class attribute force true + overwrite_snapshot = overwrite_snapshot or self._overwrite_snapshots + snapshot_path = os.path.join('tests', 'resources', 'snapshots', f'{snapshot_name}.json') if os.path.exists(snapshot_path): diff --git a/backend/compact-connect/tests/app/test_api/test_investigation_api.py b/backend/compact-connect/tests/app/test_api/test_investigation_api.py index 432de0575..367e45217 100644 --- a/backend/compact-connect/tests/app/test_api/test_investigation_api.py +++ b/backend/compact-connect/tests/app/test_api/test_investigation_api.py @@ -300,6 +300,7 @@ def test_synth_generates_post_privilege_investigation_endpoint(self): 'AuthorizerId': { 'Ref': api_stack.get_logical_id(api_stack.api.staff_users_authorizer.node.default_child), }, + 'ResourceId': {'Ref': self._get_privilege_investigation_resource_id(api_stack_template, api_stack)}, 'Integration': TestApi.generate_expected_integration_object_for_imported_lambda( api_lambda_stack, api_lambda_stack_template, @@ -338,6 +339,7 @@ def test_synth_generates_patch_privilege_investigation_endpoint(self): 'AuthorizerId': { 'Ref': api_stack.get_logical_id(api_stack.api.staff_users_authorizer.node.default_child), }, + 'ResourceId': {'Ref': self._get_privilege_investigation_id_resource_id(api_stack_template, api_stack)}, 'Integration': TestApi.generate_expected_integration_object_for_imported_lambda( api_lambda_stack, api_lambda_stack_template, @@ -387,6 +389,7 @@ def test_synth_generates_post_license_investigation_endpoint(self): 'AuthorizerId': { 'Ref': api_stack.get_logical_id(api_stack.api.staff_users_authorizer.node.default_child), }, + 'ResourceId': {'Ref': self._get_license_investigation_resource_id(api_stack_template, api_stack)}, 'Integration': TestApi.generate_expected_integration_object_for_imported_lambda( api_lambda_stack, api_lambda_stack_template, @@ -425,6 +428,7 @@ def test_synth_generates_patch_license_investigation_endpoint(self): 'AuthorizerId': { 'Ref': api_stack.get_logical_id(api_stack.api.staff_users_authorizer.node.default_child), }, + 'ResourceId': {'Ref': self._get_license_investigation_id_resource_id(api_stack_template, api_stack)}, 'Integration': TestApi.generate_expected_integration_object_for_imported_lambda( api_lambda_stack, api_lambda_stack_template, @@ -455,5 +459,5 @@ def test_synth_generates_patch_license_investigation_endpoint(self): self.compare_snapshot( patch_license_investigation_request_model['Schema'], 'PATCH_LICENSE_INVESTIGATION_REQUEST_SCHEMA', - overwrite_snapshot=True, + overwrite_snapshot=False, ) diff --git a/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json index 19706df61..c6b5091df 100644 --- a/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/GET_PROVIDER_RESPONSE_SCHEMA.json @@ -90,8 +90,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "licenseStatus": { @@ -228,8 +227,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "previous": { @@ -618,8 +616,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "encumbranceType": { @@ -743,13 +740,11 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "creationDate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "submittingUser": { @@ -1001,8 +996,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "previous": { @@ -1099,8 +1093,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "compactTransactionId": { @@ -1309,8 +1302,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "compactTransactionId": { @@ -1551,8 +1543,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "encumbranceType": { @@ -1676,13 +1667,11 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "creationDate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "submittingUser": { @@ -1803,8 +1792,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "compactTransactionId": { @@ -1938,8 +1926,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "providerId": { @@ -2288,8 +2275,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" } }, diff --git a/backend/compact-connect/tests/resources/snapshots/POST_PROVIDER_USERS_MILITARY_AFFILIATION_RESPONSE_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/POST_PROVIDER_USERS_MILITARY_AFFILIATION_RESPONSE_SCHEMA.json index 474bb1310..feaac7b03 100644 --- a/backend/compact-connect/tests/resources/snapshots/POST_PROVIDER_USERS_MILITARY_AFFILIATION_RESPONSE_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/POST_PROVIDER_USERS_MILITARY_AFFILIATION_RESPONSE_SCHEMA.json @@ -28,8 +28,7 @@ }, "dateOfUpdate": { "description": "The date the document was last updated", - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "documentUploadFields": { diff --git a/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json index 19706df61..c6b5091df 100644 --- a/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/PROVIDER_USER_RESPONSE_SCHEMA.json @@ -90,8 +90,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "licenseStatus": { @@ -228,8 +227,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "previous": { @@ -618,8 +616,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "encumbranceType": { @@ -743,13 +740,11 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "creationDate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "submittingUser": { @@ -1001,8 +996,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "previous": { @@ -1099,8 +1093,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "compactTransactionId": { @@ -1309,8 +1302,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "compactTransactionId": { @@ -1551,8 +1543,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "encumbranceType": { @@ -1676,13 +1667,11 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "creationDate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "submittingUser": { @@ -1803,8 +1792,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "compactTransactionId": { @@ -1938,8 +1926,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "providerId": { @@ -2288,8 +2275,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" } }, diff --git a/backend/compact-connect/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json index 6c00bffb3..0f81a4344 100644 --- a/backend/compact-connect/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/PUBLIC_GET_PROVIDER_RESPONSE_SCHEMA.json @@ -163,8 +163,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "privilegeId": { @@ -290,8 +289,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "previous": { @@ -319,8 +317,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "licenseJurisdiction": { @@ -421,8 +418,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" }, "licenseJurisdiction": { @@ -612,8 +608,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" } }, @@ -877,8 +872,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" } }, diff --git a/backend/compact-connect/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json index 20a265e9c..5d1776c06 100644 --- a/backend/compact-connect/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/PUBLIC_QUERY_PROVIDERS_RESPONSE_SCHEMA.json @@ -226,8 +226,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" } }, diff --git a/backend/compact-connect/tests/resources/snapshots/QUERY_PROVIDERS_RESPONSE_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/QUERY_PROVIDERS_RESPONSE_SCHEMA.json index 8f868dec5..0deae9cb6 100644 --- a/backend/compact-connect/tests/resources/snapshots/QUERY_PROVIDERS_RESPONSE_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/QUERY_PROVIDERS_RESPONSE_SCHEMA.json @@ -279,8 +279,7 @@ "type": "string" }, "dateOfUpdate": { - "format": "date", - "pattern": "^[12]{1}[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$", + "format": "date-time", "type": "string" } }, diff --git a/backend/compact-connect/tests/smoke/investigation_smoke_tests.py b/backend/compact-connect/tests/smoke/investigation_smoke_tests.py index 049df6248..e4fcd9b94 100755 --- a/backend/compact-connect/tests/smoke/investigation_smoke_tests.py +++ b/backend/compact-connect/tests/smoke/investigation_smoke_tests.py @@ -43,7 +43,7 @@ def clean_investigation_records(): dynamodb_table = get_provider_user_dynamodb_table() dynamodb_table.update_item( Key={'pk': record['pk'], 'sk': record['sk']}, - UpdateExpression='REMOVE investigationStatus, REMOVE encumbranceStatus', + UpdateExpression='REMOVE investigationStatus, encumbranceStatus', ) # Filter for investigation and encumbrance records From f833f29655c566d254f9362cc1e042b5af5180f7 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Sat, 25 Oct 2025 15:22:24 -0600 Subject: [PATCH 19/33] Remove unused var again --- .../lambdas/nodejs/lib/email/email-notification-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/compact-connect/lambdas/nodejs/lib/email/email-notification-service.ts b/backend/compact-connect/lambdas/nodejs/lib/email/email-notification-service.ts index 3bc0b6e89..625c2e21f 100644 --- a/backend/compact-connect/lambdas/nodejs/lib/email/email-notification-service.ts +++ b/backend/compact-connect/lambdas/nodejs/lib/email/email-notification-service.ts @@ -92,7 +92,7 @@ export class EmailNotificationService extends BaseEmailService { if (errorDetails.unsettledTransactionIds && errorDetails.unsettledTransactionIds.length > 0) { bodyText += `Unsettled Transaction IDs (older than 48 hours): ${errorDetails.unsettledTransactionIds.join(', ')}\n`; } - } catch (parseError) { + } catch { // If JSON parsing fails, include the raw message bodyText += `\n\nError Details: ${batchFailureErrorMessage}`; } From 66b8c708d07022fe10c7639bd9a6a1e29fa000a3 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 29 Oct 2025 09:16:46 -0600 Subject: [PATCH 20/33] Remove provider notifications, skip state notifs on encumbrance --- .../email-notification-service/lambda.ts | 76 ------- .../investigation-notification-service.ts | 168 --------------- ...investigation-notification-service.test.ts | 193 +----------------- .../data_model/schema/data_event/api.py | 2 + .../common/cc_common/email_service_client.py | 116 ----------- .../common/cc_common/event_bus_client.py | 6 + .../handlers/investigation_events.py | 56 ++--- .../function/test_investigation_events.py | 149 +++++++------- .../handlers/investigation.py | 2 + 9 files changed, 103 insertions(+), 665 deletions(-) diff --git a/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts b/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts index f18f7edbe..c8672c9da 100644 --- a/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts +++ b/backend/compact-connect/lambdas/nodejs/email-notification-service/lambda.ts @@ -367,25 +367,6 @@ export class Lambda implements LambdaInterface { event.templateVariables.recoveryToken ); break; - case 'licenseInvestigationProviderNotification': - if (!event.specificEmails?.length) { - throw new Error('No recipients found for license investigation provider notification email'); - } - if (!event.templateVariables?.providerFirstName - || !event.templateVariables?.providerLastName - || !event.templateVariables?.investigationJurisdiction - || !event.templateVariables?.licenseType) { - throw new Error('Missing required template variables for licenseInvestigationProviderNotification template.'); - } - await this.investigationService.sendLicenseInvestigationProviderNotificationEmail( - event.compact, - event.specificEmails, - event.templateVariables.providerFirstName, - event.templateVariables.providerLastName, - event.templateVariables.investigationJurisdiction, - event.templateVariables.licenseType - ); - break; case 'licenseInvestigationStateNotification': if (!event.jurisdiction) { throw new Error('No jurisdiction provided for license investigation state notification email'); @@ -407,25 +388,6 @@ export class Lambda implements LambdaInterface { event.templateVariables.licenseType ); break; - case 'licenseInvestigationClosedProviderNotification': - if (!event.specificEmails?.length) { - throw new Error('No recipients found for license investigation closed provider notification email'); - } - if (!event.templateVariables?.providerFirstName - || !event.templateVariables?.providerLastName - || !event.templateVariables?.investigationJurisdiction - || !event.templateVariables?.licenseType) { - throw new Error('Missing required template variables for licenseInvestigationClosedProviderNotification template.'); - } - await this.investigationService.sendLicenseInvestigationClosedProviderNotificationEmail( - event.compact, - event.specificEmails, - event.templateVariables.providerFirstName, - event.templateVariables.providerLastName, - event.templateVariables.investigationJurisdiction, - event.templateVariables.licenseType - ); - break; case 'licenseInvestigationClosedStateNotification': if (!event.jurisdiction) { throw new Error('No jurisdiction provided for license investigation closed state notification email'); @@ -447,25 +409,6 @@ export class Lambda implements LambdaInterface { event.templateVariables.licenseType ); break; - case 'privilegeInvestigationProviderNotification': - if (!event.specificEmails?.length) { - throw new Error('No recipients found for privilege investigation provider notification email'); - } - if (!event.templateVariables?.providerFirstName - || !event.templateVariables?.providerLastName - || !event.templateVariables?.investigationJurisdiction - || !event.templateVariables?.licenseType) { - throw new Error('Missing required template variables for privilegeInvestigationProviderNotification template.'); - } - await this.investigationService.sendPrivilegeInvestigationProviderNotificationEmail( - event.compact, - event.specificEmails, - event.templateVariables.providerFirstName, - event.templateVariables.providerLastName, - event.templateVariables.investigationJurisdiction, - event.templateVariables.licenseType - ); - break; case 'privilegeInvestigationStateNotification': if (!event.jurisdiction) { throw new Error('No jurisdiction provided for privilege investigation state notification email'); @@ -487,25 +430,6 @@ export class Lambda implements LambdaInterface { event.templateVariables.licenseType ); break; - case 'privilegeInvestigationClosedProviderNotification': - if (!event.specificEmails?.length) { - throw new Error('No recipients found for privilege investigation closed provider notification email'); - } - if (!event.templateVariables?.providerFirstName - || !event.templateVariables?.providerLastName - || !event.templateVariables?.investigationJurisdiction - || !event.templateVariables?.licenseType) { - throw new Error('Missing required template variables for privilegeInvestigationClosedProviderNotification template.'); - } - await this.investigationService.sendPrivilegeInvestigationClosedProviderNotificationEmail( - event.compact, - event.specificEmails, - event.templateVariables.providerFirstName, - event.templateVariables.providerLastName, - event.templateVariables.investigationJurisdiction, - event.templateVariables.licenseType - ); - break; case 'privilegeInvestigationClosedStateNotification': if (!event.jurisdiction) { throw new Error('No jurisdiction provided for privilege investigation closed state notification email'); diff --git a/backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts b/backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts index 8dbb61791..472624f3a 100644 --- a/backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts +++ b/backend/compact-connect/lambdas/nodejs/lib/email/investigation-notification-service.ts @@ -73,48 +73,6 @@ export class InvestigationNotificationService extends BaseEmailService { return { recipients, affectedJurisdictionConfig }; } - /** - * Sends a license investigation notification email to the provider - * @param compact - The compact name - * @param specificEmails - The provider's email address - * @param providerFirstName - The provider's first name - * @param providerLastName - The provider's last name - * @param jurisdiction - The jurisdiction where the license is under investigation - * @param licenseType - The license type that is under investigation - */ - public async sendLicenseInvestigationProviderNotificationEmail( - compact: string, - specificEmails: string[], - providerFirstName: string, - providerLastName: string, - investigationJurisdiction: string, - licenseType: string - ): Promise { - this.logger.info('Sending license investigation provider notification email', { compact: compact }); - - if (specificEmails.length === 0) { - throw new Error('No recipients specified for provider license investigation notification email'); - } - - const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( - compact, investigationJurisdiction - ); - - const report = this.getNewEmailTemplate(); - const subject = `Your ${licenseType} license in ${investigationJurisdictionConfig.jurisdictionName} is under investigation`; - const bodyText = `${providerFirstName} ${providerLastName},\n\n` + - `This message is to notify you that your *${licenseType}* license in ${investigationJurisdictionConfig.jurisdictionName} is under investigation. ` + - `Please contact the licensing board in ${investigationJurisdictionConfig.jurisdictionName} for more information about this investigation.`; - - this.insertHeader(report, subject); - this.insertBody(report, bodyText, 'center', true); - this.insertFooter(report); - - const htmlContent = this.renderTemplate(report); - - await this.sendEmail({ htmlContent, subject, recipients: specificEmails, errorMessage: 'Unable to send provider license investigation notification email' }); - } - /** * Sends a license investigation notification email to state authorities * @param compact - The compact name @@ -168,48 +126,6 @@ export class InvestigationNotificationService extends BaseEmailService { await this.sendEmail({ htmlContent, subject, recipients, errorMessage: 'Unable to send license investigation state notification email' }); } - /** - * Sends a license investigation closed notification email to the provider - * @param compact - The compact name - * @param specificEmails - The provider's email address - * @param providerFirstName - The provider's first name - * @param providerLastName - The provider's last name - * @param jurisdiction - The jurisdiction where the license investigation was closed - * @param licenseType - The license type that was under investigation - */ - public async sendLicenseInvestigationClosedProviderNotificationEmail( - compact: string, - specificEmails: string[], - providerFirstName: string, - providerLastName: string, - investigationJurisdiction: string, - licenseType: string - ): Promise { - this.logger.info('Sending license investigation closed provider notification email', { compact: compact }); - - if (specificEmails.length === 0) { - throw new Error('No recipients specified for provider license investigation closed notification email'); - } - - const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( - compact, investigationJurisdiction - ); - - const report = this.getNewEmailTemplate(); - const subject = `The investigation on your ${licenseType} license in ${investigationJurisdictionConfig.jurisdictionName} has been closed`; - const bodyText = `${providerFirstName} ${providerLastName},\n\n` + - `This message is to notify you that the investigation on your *${licenseType}* license in ${investigationJurisdictionConfig.jurisdictionName} has been closed. ` + - `Please contact the licensing board in ${investigationJurisdictionConfig.jurisdictionName} for more information about this investigation closure.`; - - this.insertHeader(report, subject); - this.insertBody(report, bodyText, 'center', true); - this.insertFooter(report); - - const htmlContent = this.renderTemplate(report); - - await this.sendEmail({ htmlContent, subject, recipients: specificEmails, errorMessage: 'Unable to send provider license investigation closed notification email' }); - } - /** * Sends a license investigation closed notification email to state authorities * @param compact - The compact name @@ -263,48 +179,6 @@ export class InvestigationNotificationService extends BaseEmailService { await this.sendEmail({ htmlContent, subject, recipients, errorMessage: 'Unable to send license investigation closed state notification email' }); } - /** - * Sends a privilege investigation notification email to the provider - * @param compact - The compact name - * @param specificEmails - The provider's email address - * @param providerFirstName - The provider's first name - * @param providerLastName - The provider's last name - * @param jurisdiction - The jurisdiction where the privilege is under investigation - * @param licenseType - The license type that is under investigation - */ - public async sendPrivilegeInvestigationProviderNotificationEmail( - compact: string, - specificEmails: string[], - providerFirstName: string, - providerLastName: string, - investigationJurisdiction: string, - licenseType: string - ): Promise { - this.logger.info('Sending privilege investigation provider notification email', { compact: compact }); - - if (specificEmails.length === 0) { - throw new Error('No recipients specified for provider privilege investigation notification email'); - } - - const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( - compact, investigationJurisdiction - ); - - const report = this.getNewEmailTemplate(); - const subject = `Your ${licenseType} privilege in ${investigationJurisdictionConfig.jurisdictionName} is under investigation`; - const bodyText = `${providerFirstName} ${providerLastName},\n\n` + - `This message is to notify you that your *${licenseType}* privilege in ${investigationJurisdictionConfig.jurisdictionName} is under investigation. ` + - `Please contact the licensing board in ${investigationJurisdictionConfig.jurisdictionName} for more information about this investigation.`; - - this.insertHeader(report, subject); - this.insertBody(report, bodyText, 'center', true); - this.insertFooter(report); - - const htmlContent = this.renderTemplate(report); - - await this.sendEmail({ htmlContent, subject, recipients: specificEmails, errorMessage: 'Unable to send provider privilege investigation notification email' }); - } - /** * Sends a privilege investigation notification email to state authorities * @param compact - The compact name @@ -358,48 +232,6 @@ export class InvestigationNotificationService extends BaseEmailService { await this.sendEmail({ htmlContent, subject, recipients, errorMessage: 'Unable to send privilege investigation state notification email' }); } - /** - * Sends a privilege investigation closed notification email to the provider - * @param compact - The compact name - * @param specificEmails - The provider's email address - * @param providerFirstName - The provider's first name - * @param providerLastName - The provider's last name - * @param jurisdiction - The jurisdiction where the privilege investigation was closed - * @param licenseType - The license type that was under investigation - */ - public async sendPrivilegeInvestigationClosedProviderNotificationEmail( - compact: string, - specificEmails: string[], - providerFirstName: string, - providerLastName: string, - investigationJurisdiction: string, - licenseType: string - ): Promise { - this.logger.info('Sending privilege investigation closed provider notification email', { compact: compact }); - - if (specificEmails.length === 0) { - throw new Error('No recipients specified for provider privilege investigation closed notification email'); - } - - const investigationJurisdictionConfig = await this.jurisdictionClient.getJurisdictionConfiguration( - compact, investigationJurisdiction - ); - - const report = this.getNewEmailTemplate(); - const subject = `The investigation on your ${licenseType} privilege in ${investigationJurisdictionConfig.jurisdictionName} has been closed`; - const bodyText = `${providerFirstName} ${providerLastName},\n\n` + - `This message is to notify you that the investigation on your *${licenseType}* privilege in ${investigationJurisdictionConfig.jurisdictionName} has been closed. ` + - `Please contact the licensing board in ${investigationJurisdictionConfig.jurisdictionName} for more information about this investigation closure.`; - - this.insertHeader(report, subject); - this.insertBody(report, bodyText, 'center', true); - this.insertFooter(report); - - const htmlContent = this.renderTemplate(report); - - await this.sendEmail({ htmlContent, subject, recipients: specificEmails, errorMessage: 'Unable to send provider privilege investigation closed notification email' }); - } - /** * Sends a privilege investigation closed notification email to state authorities * @param compact - The compact name diff --git a/backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts b/backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts index 8241a73d6..f28ef7d00 100644 --- a/backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts +++ b/backend/compact-connect/lambdas/nodejs/tests/lib/email/investigation-notification-service.test.ts @@ -116,53 +116,6 @@ describe('InvestigationNotificationService', () => { }); }); - describe('License Investigation Provider Notification', () => { - it('should send license investigation provider notification email', async () => { - await investigationService.sendLicenseInvestigationProviderNotificationEmail( - 'aslp', - ['provider@example.com'], - 'John', - 'Doe', - 'OH', - 'Audiologist' - ); - - expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { - Destination: { - ToAddresses: ['provider@example.com'] - }, - Content: { - Simple: { - Body: { - Html: { - Charset: 'UTF-8', - Data: expect.stringContaining('Your Audiologist license in Ohio is under investigation') - } - }, - Subject: { - Charset: 'UTF-8', - Data: 'Your Audiologist license in Ohio is under investigation' - } - } - }, - FromEmailAddress: 'Compact Connect ' - }); - }); - - it('should throw error when no recipients provided', async () => { - await expect( - investigationService.sendLicenseInvestigationProviderNotificationEmail( - 'aslp', - [], - 'John', - 'Doe', - 'OH', - 'Audiologist' - ) - ).rejects.toThrow('No recipients specified for provider license investigation notification email'); - }); - }); - describe('License Investigation State Notification', () => { it('should send license investigation state notification email', async () => { await investigationService.sendLicenseInvestigationStateNotificationEmail( @@ -215,53 +168,6 @@ describe('InvestigationNotificationService', () => { }); }); - describe('License Investigation Closed Provider Notification', () => { - it('should send license investigation closed provider notification email', async () => { - await investigationService.sendLicenseInvestigationClosedProviderNotificationEmail( - 'aslp', - ['provider@example.com'], - 'John', - 'Doe', - 'OH', - 'Audiologist' - ); - - expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { - Destination: { - ToAddresses: ['provider@example.com'] - }, - Content: { - Simple: { - Body: { - Html: { - Charset: 'UTF-8', - Data: expect.stringContaining('The investigation on your Audiologist license in Ohio has been closed') - } - }, - Subject: { - Charset: 'UTF-8', - Data: 'The investigation on your Audiologist license in Ohio has been closed' - } - } - }, - FromEmailAddress: 'Compact Connect ' - }); - }); - - it('should throw error when no recipients provided', async () => { - await expect( - investigationService.sendLicenseInvestigationClosedProviderNotificationEmail( - 'aslp', - [], - 'John', - 'Doe', - 'OH', - 'Audiologist' - ) - ).rejects.toThrow('No recipients specified for provider license investigation closed notification email'); - }); - }); - describe('License Investigation Closed State Notification', () => { it('should send license investigation closed state notification email', async () => { await investigationService.sendLicenseInvestigationClosedStateNotificationEmail( @@ -297,53 +203,6 @@ describe('InvestigationNotificationService', () => { }); }); - describe('Privilege Investigation Provider Notification', () => { - it('should send privilege investigation provider notification email', async () => { - await investigationService.sendPrivilegeInvestigationProviderNotificationEmail( - 'aslp', - ['provider@example.com'], - 'John', - 'Doe', - 'OH', - 'Audiologist' - ); - - expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { - Destination: { - ToAddresses: ['provider@example.com'] - }, - Content: { - Simple: { - Body: { - Html: { - Charset: 'UTF-8', - Data: expect.stringContaining('Your Audiologist privilege in Ohio is under investigation') - } - }, - Subject: { - Charset: 'UTF-8', - Data: 'Your Audiologist privilege in Ohio is under investigation' - } - } - }, - FromEmailAddress: 'Compact Connect ' - }); - }); - - it('should throw error when no recipients provided', async () => { - await expect( - investigationService.sendPrivilegeInvestigationProviderNotificationEmail( - 'aslp', - [], - 'John', - 'Doe', - 'OH', - 'Audiologist' - ) - ).rejects.toThrow('No recipients specified for provider privilege investigation notification email'); - }); - }); - describe('Privilege Investigation State Notification', () => { it('should send privilege investigation state notification email', async () => { await investigationService.sendPrivilegeInvestigationStateNotificationEmail( @@ -379,53 +238,6 @@ describe('InvestigationNotificationService', () => { }); }); - describe('Privilege Investigation Closed Provider Notification', () => { - it('should send privilege investigation closed provider notification email', async () => { - await investigationService.sendPrivilegeInvestigationClosedProviderNotificationEmail( - 'aslp', - ['provider@example.com'], - 'John', - 'Doe', - 'OH', - 'Audiologist' - ); - - expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { - Destination: { - ToAddresses: ['provider@example.com'] - }, - Content: { - Simple: { - Body: { - Html: { - Charset: 'UTF-8', - Data: expect.stringContaining('The investigation on your Audiologist privilege in Ohio has been closed') - } - }, - Subject: { - Charset: 'UTF-8', - Data: 'The investigation on your Audiologist privilege in Ohio has been closed' - } - } - }, - FromEmailAddress: 'Compact Connect ' - }); - }); - - it('should throw error when no recipients provided', async () => { - await expect( - investigationService.sendPrivilegeInvestigationClosedProviderNotificationEmail( - 'aslp', - [], - 'John', - 'Doe', - 'OH', - 'Audiologist' - ) - ).rejects.toThrow('No recipients specified for provider privilege investigation closed notification email'); - }); - }); - describe('Privilege Investigation Closed State Notification', () => { it('should send privilege investigation closed state notification email', async () => { await investigationService.sendPrivilegeInvestigationClosedStateNotificationEmail( @@ -466,11 +278,12 @@ describe('InvestigationNotificationService', () => { mockSESClient.on(SendEmailCommand).rejects(new Error('SES service error')); await expect( - investigationService.sendLicenseInvestigationProviderNotificationEmail( + investigationService.sendLicenseInvestigationStateNotificationEmail( 'aslp', - ['provider@example.com'], + 'OH', 'John', 'Doe', + 'provider-123', 'OH', 'Audiologist' ) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py index 5de6d0f36..6549399e7 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/data_event/api.py @@ -59,6 +59,8 @@ class InvestigationEventDetailSchema(DataEventDetailBaseSchema): investigationId = UUID(required=True, allow_none=False) licenseTypeAbbreviation = String(required=True, allow_none=False) investigationAgainst = String(required=True, allow_none=False) + # Only present for investigationClosed events with encumbrance + adverseActionId = UUID(required=False, allow_none=False) class LicenseDeactivationDetailSchema(DataEventDetailBaseSchema): diff --git a/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py b/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py index 221bbca82..8213afcaf 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py @@ -621,35 +621,6 @@ def send_provider_account_recovery_confirmation_email( return self._invoke_lambda(payload) - def send_license_investigation_provider_notification_email( - self, - *, - compact: str, - provider_email: str, - template_variables: InvestigationNotificationTemplateVariables, - ) -> dict[str, str]: - """ - Send a license investigation notification email to a provider. - - :param compact: Compact name - :param provider_email: Email address of the provider - :param template_variables: Template variables for the email - :return: Response from the email notification service - """ - payload = { - 'compact': compact, - 'template': 'licenseInvestigationProviderNotification', - 'recipientType': 'SPECIFIC', - 'specificEmails': [provider_email], - 'templateVariables': { - 'providerFirstName': template_variables.provider_first_name, - 'providerLastName': template_variables.provider_last_name, - 'investigationJurisdiction': template_variables.investigation_jurisdiction, - 'licenseType': template_variables.license_type, - }, - } - return self._invoke_lambda(payload) - def send_license_investigation_state_notification_email( self, *, @@ -683,35 +654,6 @@ def send_license_investigation_state_notification_email( } return self._invoke_lambda(payload) - def send_license_investigation_closed_provider_notification_email( - self, - *, - compact: str, - provider_email: str, - template_variables: InvestigationNotificationTemplateVariables, - ) -> dict[str, str]: - """ - Send a license investigation closed notification email to a provider. - - :param compact: Compact name - :param provider_email: Email address of the provider - :param template_variables: Template variables for the email - :return: Response from the email notification service - """ - payload = { - 'compact': compact, - 'template': 'licenseInvestigationClosedProviderNotification', - 'recipientType': 'SPECIFIC', - 'specificEmails': [provider_email], - 'templateVariables': { - 'providerFirstName': template_variables.provider_first_name, - 'providerLastName': template_variables.provider_last_name, - 'investigationJurisdiction': template_variables.investigation_jurisdiction, - 'licenseType': template_variables.license_type, - }, - } - return self._invoke_lambda(payload) - def send_license_investigation_closed_state_notification_email( self, *, @@ -745,35 +687,6 @@ def send_license_investigation_closed_state_notification_email( } return self._invoke_lambda(payload) - def send_privilege_investigation_provider_notification_email( - self, - *, - compact: str, - provider_email: str, - template_variables: InvestigationNotificationTemplateVariables, - ) -> dict[str, str]: - """ - Send a privilege investigation notification email to a provider. - - :param compact: Compact name - :param provider_email: Email address of the provider - :param template_variables: Template variables for the email - :return: Response from the email notification service - """ - payload = { - 'compact': compact, - 'template': 'privilegeInvestigationProviderNotification', - 'recipientType': 'SPECIFIC', - 'specificEmails': [provider_email], - 'templateVariables': { - 'providerFirstName': template_variables.provider_first_name, - 'providerLastName': template_variables.provider_last_name, - 'investigationJurisdiction': template_variables.investigation_jurisdiction, - 'licenseType': template_variables.license_type, - }, - } - return self._invoke_lambda(payload) - def send_privilege_investigation_state_notification_email( self, *, @@ -807,35 +720,6 @@ def send_privilege_investigation_state_notification_email( } return self._invoke_lambda(payload) - def send_privilege_investigation_closed_provider_notification_email( - self, - *, - compact: str, - provider_email: str, - template_variables: InvestigationNotificationTemplateVariables, - ) -> dict[str, str]: - """ - Send a privilege investigation closed notification email to a provider. - - :param compact: Compact name - :param provider_email: Email address of the provider - :param template_variables: Template variables for the email - :return: Response from the email notification service - """ - payload = { - 'compact': compact, - 'template': 'privilegeInvestigationClosedProviderNotification', - 'recipientType': 'SPECIFIC', - 'specificEmails': [provider_email], - 'templateVariables': { - 'providerFirstName': template_variables.provider_first_name, - 'providerLastName': template_variables.provider_last_name, - 'investigationJurisdiction': template_variables.investigation_jurisdiction, - 'licenseType': template_variables.license_type, - }, - } - return self._invoke_lambda(payload) - def send_privilege_investigation_closed_state_notification_email( self, *, diff --git a/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py b/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py index b4fbe6490..88ae6307d 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/event_bus_client.py @@ -394,6 +394,7 @@ def publish_investigation_closed_event( close_date: datetime, investigation_against: InvestigationAgainstEnum, investigation_id: UUID, + adverse_action_id: UUID | None = None, event_batch_writer: EventBatchWriter | None = None, ): """ @@ -407,6 +408,7 @@ def publish_investigation_closed_event( :param close_date: The datetime when the investigation record was closed :param investigation_against: The type of record being investigated (privilege or license) :param investigation_id: The id of the investigation closed + :param adverse_action_id: Optional adverse action ID if an encumbrance resulted from the investigation :param event_batch_writer: Optional EventBatchWriter for efficient batch publishing """ event_detail = { @@ -419,6 +421,10 @@ def publish_investigation_closed_event( 'eventTime': close_date, } + # Include adverseActionId if an encumbrance resulted from the investigation + if adverse_action_id is not None: + event_detail['adverseActionId'] = adverse_action_id + investigation_detail_schema = InvestigationEventDetailSchema() deserialized_detail = investigation_detail_schema.dump(event_detail) diff --git a/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py b/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py index 4a68613dc..18c63089f 100644 --- a/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py +++ b/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py @@ -208,17 +208,8 @@ def license_investigation_notification_listener(message: dict): # Get provider records to gather notification targets and provider information provider_records, provider_record = _get_provider_records(compact, provider_id) - # Provider Notification - _send_provider_notification( - config.email_service_client.send_license_investigation_provider_notification_email, - 'license investigation', - provider_record=provider_record, - compact=compact, - investigation_jurisdiction=jurisdiction, - license_type=license_type_name, - ) - # State Notifications + # Note: We do NOT send notifications to providers for investigations # Send notification to the state where the license is under investigation _send_primary_state_notification( config.email_service_client.send_license_investigation_state_notification_email, @@ -273,23 +264,20 @@ def license_investigation_closed_notification_listener(message: dict): ): logger.info('Processing license investigation closed event') + # If an encumbrance resulted from the investigation, we will let the encumbrance notification suffice. + # This is determined by the presence of an 'adverseActionId' in the event detail. + if detail.get('adverseActionId'): + logger.info('Investigation closed with an encumbrance, skipping investigation closed notifications.') + return + # Get license type name from abbreviation (lookup once at the top) license_type_name = _get_license_type_name(compact, license_type_abbreviation) # Get provider records to gather notification targets and provider information provider_records, provider_record = _get_provider_records(compact, provider_id) - # Provider Notification - _send_provider_notification( - config.email_service_client.send_license_investigation_closed_provider_notification_email, - 'license investigation closed', - provider_record=provider_record, - compact=compact, - investigation_jurisdiction=jurisdiction, - license_type=license_type_name, - ) - # State Notifications + # Note: We do NOT send notifications to providers for investigations # Send notification to the state where the license investigation was closed _send_primary_state_notification( config.email_service_client.send_license_investigation_closed_state_notification_email, @@ -350,17 +338,8 @@ def privilege_investigation_notification_listener(message: dict): # Get provider records to gather notification targets and provider information provider_records, provider_record = _get_provider_records(compact, provider_id) - # Provider Notification - _send_provider_notification( - config.email_service_client.send_privilege_investigation_provider_notification_email, - 'privilege investigation', - provider_record=provider_record, - compact=compact, - investigation_jurisdiction=jurisdiction, - license_type=license_type_name, - ) - # State Notifications + # Note: We do NOT send notifications to providers for investigations # Send notification to the state where the privilege is under investigation _send_primary_state_notification( config.email_service_client.send_privilege_investigation_state_notification_email, @@ -415,23 +394,20 @@ def privilege_investigation_closed_notification_listener(message: dict): ): logger.info('Processing privilege investigation closed event') + # If an encumbrance resulted from the investigation, we will let the encumbrance notification suffice. + # This is determined by the presence of an 'adverseActionId' in the event detail. + if detail.get('adverseActionId'): + logger.info('Investigation closed with an encumbrance, skipping investigation closed notifications.') + return + # Get license type name from abbreviation (lookup once at the top) license_type_name = _get_license_type_name(compact, license_type_abbreviation) # Get provider records to gather notification targets and provider information provider_records, provider_record = _get_provider_records(compact, provider_id) - # Provider Notification - _send_provider_notification( - config.email_service_client.send_privilege_investigation_closed_provider_notification_email, - 'privilege investigation closed', - provider_record=provider_record, - compact=compact, - investigation_jurisdiction=jurisdiction, - license_type=license_type_name, - ) - # State Notifications + # Note: We do NOT send notifications to providers for investigations # Send notification to the state where the privilege investigation was closed _send_primary_state_notification( config.email_service_client.send_privilege_investigation_closed_state_notification_email, diff --git a/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py b/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py index 5444354be..07ddbdb72 100644 --- a/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py +++ b/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py @@ -94,9 +94,8 @@ def _create_sqs_event(self, message): return {'Records': [{'messageId': '123', 'body': json.dumps(message)}]} @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_state_notification_email') - @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_provider_notification_email') def test_license_investigation_listener_processes_event_with_registered_provider( - self, mock_provider_email, mock_state_email + self, mock_state_email ): """Test that license investigation listener processes events for registered providers.""" from cc_common.email_service_client import InvestigationNotificationTemplateVariables @@ -133,20 +132,8 @@ def test_license_investigation_listener_processes_event_with_registered_provider # Should succeed with no batch failures self.assertEqual({'batchItemFailures': []}, result) - # Verify provider notification - mock_provider_email.assert_called_once_with( - compact=DEFAULT_COMPACT, - provider_email='provider@example.com', - template_variables=InvestigationNotificationTemplateVariables( - provider_first_name='Björk', - provider_last_name='Guðmundsdóttir', - investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, - license_type='speech-language pathologist', - provider_id=None, - ), - ) - # Verify state notifications (investigation state + other states with active licenses/privileges) + # Note: We do NOT send provider notifications for investigations expected_template_variables_oh = InvestigationNotificationTemplateVariables( provider_first_name='Björk', provider_last_name='Guðmundsdóttir', @@ -200,9 +187,8 @@ def test_license_investigation_listener_processes_event_with_registered_provider self.assertEqual(expected_state_calls_sorted, actual_state_calls_sorted) @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_state_notification_email') - @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_provider_notification_email') def test_license_investigation_listener_processes_event_with_unregistered_provider( - self, mock_provider_email, mock_state_email + self, mock_state_email ): """ Test that license investigation listener handles unregistered providers. @@ -228,10 +214,8 @@ def test_license_investigation_listener_processes_event_with_unregistered_provid # Should succeed with no batch failures self.assertEqual({'batchItemFailures': []}, result) - # Verify no provider notification was sent - mock_provider_email.assert_not_called() - # Verify state notification was still sent + # Note: We do NOT send provider notifications for investigations mock_state_email.assert_called_once_with( compact=DEFAULT_COMPACT, jurisdiction=DEFAULT_LICENSE_JURISDICTION, @@ -247,11 +231,8 @@ def test_license_investigation_listener_processes_event_with_unregistered_provid @patch( 'cc_common.email_service_client.EmailServiceClient.send_license_investigation_closed_state_notification_email' ) - @patch( - 'cc_common.email_service_client.EmailServiceClient.send_license_investigation_closed_provider_notification_email' - ) def test_license_investigation_closed_listener_processes_event_with_registered_provider( - self, mock_provider_email, mock_state_email + self, mock_state_email ): """Test that license investigation closed listener processes events for registered providers.""" from cc_common.email_service_client import InvestigationNotificationTemplateVariables @@ -288,20 +269,8 @@ def test_license_investigation_closed_listener_processes_event_with_registered_p # Should succeed with no batch failures self.assertEqual({'batchItemFailures': []}, result) - # Verify provider notification - mock_provider_email.assert_called_once_with( - compact=DEFAULT_COMPACT, - provider_email='provider@example.com', - template_variables=InvestigationNotificationTemplateVariables( - provider_first_name='Björk', - provider_last_name='Guðmundsdóttir', - investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, - license_type='speech-language pathologist', - provider_id=None, - ), - ) - # Verify state notifications (investigation state + other states with active licenses/privileges) + # Note: We do NOT send provider notifications for investigations expected_template_variables_oh = InvestigationNotificationTemplateVariables( provider_first_name='Björk', provider_last_name='Guðmundsdóttir', @@ -355,9 +324,8 @@ def test_license_investigation_closed_listener_processes_event_with_registered_p self.assertEqual(expected_state_calls_sorted, actual_state_calls_sorted) @patch('cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_state_notification_email') - @patch('cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_provider_notification_email') def test_privilege_investigation_listener_processes_event_with_registered_provider( - self, mock_provider_email, mock_state_email + self, mock_state_email ): """Test that privilege investigation listener processes events for registered providers.""" from cc_common.email_service_client import InvestigationNotificationTemplateVariables @@ -394,20 +362,8 @@ def test_privilege_investigation_listener_processes_event_with_registered_provid # Should succeed with no batch failures self.assertEqual({'batchItemFailures': []}, result) - # Verify provider notification - mock_provider_email.assert_called_once_with( - compact=DEFAULT_COMPACT, - provider_email='provider@example.com', - template_variables=InvestigationNotificationTemplateVariables( - provider_first_name='Björk', - provider_last_name='Guðmundsdóttir', - investigation_jurisdiction=DEFAULT_PRIVILEGE_JURISDICTION, - license_type='speech-language pathologist', - provider_id=None, - ), - ) - # Verify state notifications (investigation state + other states with active licenses/privileges) + # Note: We do NOT send provider notifications for investigations expected_template_variables_ne = InvestigationNotificationTemplateVariables( provider_first_name='Björk', provider_last_name='Guðmundsdóttir', @@ -463,11 +419,8 @@ def test_privilege_investigation_listener_processes_event_with_registered_provid @patch( 'cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_closed_state_notification_email' ) - @patch( - 'cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_closed_provider_notification_email' - ) def test_privilege_investigation_closed_listener_processes_event_with_registered_provider( - self, mock_provider_email, mock_state_email + self, mock_state_email ): """Test that privilege investigation closed listener processes events for registered providers.""" from cc_common.email_service_client import InvestigationNotificationTemplateVariables @@ -504,20 +457,8 @@ def test_privilege_investigation_closed_listener_processes_event_with_registered # Should succeed with no batch failures self.assertEqual({'batchItemFailures': []}, result) - # Verify provider notification - mock_provider_email.assert_called_once_with( - compact=DEFAULT_COMPACT, - provider_email='provider@example.com', - template_variables=InvestigationNotificationTemplateVariables( - provider_first_name='Björk', - provider_last_name='Guðmundsdóttir', - investigation_jurisdiction=DEFAULT_PRIVILEGE_JURISDICTION, - license_type='speech-language pathologist', - provider_id=None, - ), - ) - # Verify state notifications (investigation state + other states with active licenses/privileges) + # Note: We do NOT send provider notifications for investigations expected_template_variables_ne = InvestigationNotificationTemplateVariables( provider_first_name='Björk', provider_last_name='Guðmundsdóttir', @@ -598,8 +539,8 @@ def test_privilege_investigation_listener_handles_missing_provider_records(self) # Should return batch item failure for the message self.assertEqual(result['batchItemFailures'][0]['itemIdentifier'], '123') - @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_provider_notification_email') - def test_license_investigation_listener_handles_email_service_failure(self, mock_provider_email): + @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_state_notification_email') + def test_license_investigation_listener_handles_email_service_failure(self, mock_state_email): """Test that license investigation listener handles email service failures gracefully.""" from handlers.investigation_events import license_investigation_notification_listener @@ -610,7 +551,7 @@ def test_license_investigation_listener_handles_email_service_failure(self, mock self.test_data_generator.put_default_license_record_in_provider_table() # Make the email service raise an exception - mock_provider_email.side_effect = Exception('Email service failure') + mock_state_email.side_effect = Exception('Email service failure') message = self._generate_license_investigation_message() event = self._create_sqs_event(message) @@ -621,8 +562,8 @@ def test_license_investigation_listener_handles_email_service_failure(self, mock # Should return batch item failure for the message self.assertEqual(result['batchItemFailures'][0]['itemIdentifier'], '123') - @patch('cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_provider_notification_email') - def test_privilege_investigation_listener_handles_email_service_failure(self, mock_provider_email): + @patch('cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_state_notification_email') + def test_privilege_investigation_listener_handles_email_service_failure(self, mock_state_email): """Test that privilege investigation listener handles email service failures gracefully.""" from handlers.investigation_events import privilege_investigation_notification_listener @@ -633,7 +574,7 @@ def test_privilege_investigation_listener_handles_email_service_failure(self, mo self.test_data_generator.put_default_privilege_record_in_provider_table() # Make the email service raise an exception - mock_provider_email.side_effect = Exception('Email service failure') + mock_state_email.side_effect = Exception('Email service failure') message = self._generate_privilege_investigation_message() event = self._create_sqs_event(message) @@ -643,3 +584,61 @@ def test_privilege_investigation_listener_handles_email_service_failure(self, mo # Should return batch item failure for the message self.assertEqual(result['batchItemFailures'][0]['itemIdentifier'], '123') + + @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_closed_state_notification_email') + def test_license_investigation_closed_listener_skips_notifications_when_encumbrance_exists(self, mock_state_email): + """ + Test that license investigation closed listener does NOT send notifications when adverseActionId is present. + When an investigation closes with an encumbrance, we rely on the encumbrance notification instead. + """ + from handlers.investigation_events import license_investigation_closed_notification_listener + + # Set up test data with registered provider + self.test_data_generator.put_default_provider_record_in_provider_table( + value_overrides={'compactConnectRegisteredEmailAddress': 'provider@example.com'} + ) + self.test_data_generator.put_default_license_record_in_provider_table() + + # Create message with adverseActionId (indicating an encumbrance was created) + message = self._generate_license_investigation_closed_message() + message['detail']['adverseActionId'] = str(uuid4()) + event = self._create_sqs_event(message) + + # Execute the handler + result = license_investigation_closed_notification_listener(event, self.mock_context) + + # Should succeed with no batch failures + self.assertEqual({'batchItemFailures': []}, result) + + # Verify NO notifications were sent (encumbrance notification will handle it) + mock_state_email.assert_not_called() + + @patch('cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_closed_state_notification_email') + def test_privilege_investigation_closed_listener_skips_notifications_when_encumbrance_exists( + self, mock_state_email + ): + """ + Test that privilege investigation closed listener does NOT send notifications when adverseActionId is present. + When an investigation closes with an encumbrance, we rely on the encumbrance notification instead. + """ + from handlers.investigation_events import privilege_investigation_closed_notification_listener + + # Set up test data with registered provider + self.test_data_generator.put_default_provider_record_in_provider_table( + value_overrides={'compactConnectRegisteredEmailAddress': 'provider@example.com'} + ) + self.test_data_generator.put_default_privilege_record_in_provider_table() + + # Create message with adverseActionId (indicating an encumbrance was created) + message = self._generate_privilege_investigation_closed_message() + message['detail']['adverseActionId'] = str(uuid4()) + event = self._create_sqs_event(message) + + # Execute the handler + result = privilege_investigation_closed_notification_listener(event, self.mock_context) + + # Should succeed with no batch failures + self.assertEqual({'batchItemFailures': []}, result) + + # Verify NO notifications were sent (encumbrance notification will handle it) + mock_state_email.assert_not_called() diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py index e8536431b..347f2b691 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py @@ -220,6 +220,7 @@ def handle_privilege_investigation_close(event: dict) -> dict: close_date=now, investigation_against=InvestigationAgainstEnum.PRIVILEGE, investigation_id=investigation_id, + adverse_action_id=resulting_encumbrance_id, ) return {'message': 'OK'} @@ -280,6 +281,7 @@ def handle_license_investigation_close(event: dict) -> dict: close_date=now, investigation_against=InvestigationAgainstEnum.LICENSE, investigation_id=investigation_id, + adverse_action_id=resulting_encumbrance_id, ) return {'message': 'OK'} From b78d039b1a00de1315faf65d4babbb0157f86ca4 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 29 Oct 2025 09:25:10 -0600 Subject: [PATCH 21/33] Remove more deprecated provider notification tests --- .../tests/email-notification-service.test.ts | 270 ------------------ 1 file changed, 270 deletions(-) diff --git a/backend/compact-connect/lambdas/nodejs/tests/email-notification-service.test.ts b/backend/compact-connect/lambdas/nodejs/tests/email-notification-service.test.ts index eb736dbfa..83d3e7ab9 100644 --- a/backend/compact-connect/lambdas/nodejs/tests/email-notification-service.test.ts +++ b/backend/compact-connect/lambdas/nodejs/tests/email-notification-service.test.ts @@ -1503,72 +1503,6 @@ describe('EmailNotificationServiceLambda', () => { }); }); - describe('License Investigation Provider Notification', () => { - const SAMPLE_LICENSE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT: EmailNotificationEvent = { - template: 'licenseInvestigationProviderNotification', - recipientType: 'SPECIFIC', - compact: 'aslp', - specificEmails: ['provider@example.com'], - templateVariables: { - providerFirstName: 'John', - providerLastName: 'Doe', - investigationJurisdiction: 'OH', - licenseType: 'Audiologist' - } - }; - - it('should successfully send license investigation provider notification email', async () => { - const response = await lambda.handler(SAMPLE_LICENSE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, {} as any); - - expect(response).toEqual({ - message: 'Email message sent' - }); - - expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { - Destination: { - ToAddresses: ['provider@example.com'] - }, - Content: { - Simple: { - Body: { - Html: { - Charset: 'UTF-8', - Data: expect.stringContaining('') - } - }, - Subject: { - Charset: 'UTF-8', - Data: 'Your Audiologist license in Ohio is under investigation' - } - } - }, - FromEmailAddress: 'Compact Connect ' - }); - }); - - it('should throw error when no recipients found', async () => { - const eventWithNoRecipients: EmailNotificationEvent = { - ...SAMPLE_LICENSE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, - specificEmails: [] - }; - - await expect(lambda.handler(eventWithNoRecipients, {} as any)) - .rejects - .toThrow('No recipients found for license investigation provider notification email'); - }); - - it('should throw error when required template variables are missing', async () => { - const eventWithMissingVariables: EmailNotificationEvent = { - ...SAMPLE_LICENSE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, - templateVariables: {} - }; - - await expect(lambda.handler(eventWithMissingVariables, {} as any)) - .rejects - .toThrow('Missing required template variables for licenseInvestigationProviderNotification template.'); - }); - }); - describe('License Investigation State Notification', () => { const SAMPLE_LICENSE_INVESTIGATION_STATE_NOTIFICATION_EVENT: EmailNotificationEvent = { template: 'licenseInvestigationStateNotification', @@ -1659,74 +1593,6 @@ describe('EmailNotificationServiceLambda', () => { }); }); - describe('License Investigation Closed Provider Notification', () => { - const SAMPLE_LICENSE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT: EmailNotificationEvent = { - template: 'licenseInvestigationClosedProviderNotification', - recipientType: 'SPECIFIC', - compact: 'aslp', - specificEmails: ['provider@example.com'], - templateVariables: { - providerFirstName: 'John', - providerLastName: 'Doe', - investigationJurisdiction: 'OH', - licenseType: 'Audiologist' - } - }; - - it('should successfully send license investigation closed provider notification email', async () => { - const response = await lambda.handler( - SAMPLE_LICENSE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, {} as any - ); - - expect(response).toEqual({ - message: 'Email message sent' - }); - - expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { - Destination: { - ToAddresses: ['provider@example.com'] - }, - Content: { - Simple: { - Body: { - Html: { - Charset: 'UTF-8', - Data: expect.stringContaining('') - } - }, - Subject: { - Charset: 'UTF-8', - Data: 'The investigation on your Audiologist license in Ohio has been closed' - } - } - }, - FromEmailAddress: 'Compact Connect ' - }); - }); - - it('should throw error when no recipients found', async () => { - const eventWithNoRecipients: EmailNotificationEvent = { - ...SAMPLE_LICENSE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, - specificEmails: [] - }; - - await expect(lambda.handler(eventWithNoRecipients, {} as any)) - .rejects - .toThrow('No recipients found for license investigation closed provider notification email'); - }); - - it('should throw error when required template variables are missing', async () => { - const eventWithMissingVariables: EmailNotificationEvent = { - ...SAMPLE_LICENSE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, - templateVariables: {} - }; - - await expect(lambda.handler(eventWithMissingVariables, {} as any)) - .rejects - .toThrow('Missing required template variables for licenseInvestigationClosedProviderNotification template.'); - }); - }); - describe('License Investigation Closed State Notification', () => { const SAMPLE_LICENSE_INVESTIGATION_CLOSED_STATE_NOTIFICATION_EVENT: EmailNotificationEvent = { template: 'licenseInvestigationClosedStateNotification', @@ -1819,74 +1685,6 @@ describe('EmailNotificationServiceLambda', () => { }); }); - describe('Privilege Investigation Provider Notification', () => { - const SAMPLE_PRIVILEGE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT: EmailNotificationEvent = { - template: 'privilegeInvestigationProviderNotification', - recipientType: 'SPECIFIC', - compact: 'aslp', - specificEmails: ['provider@example.com'], - templateVariables: { - providerFirstName: 'John', - providerLastName: 'Doe', - investigationJurisdiction: 'OH', - licenseType: 'Audiologist' - } - }; - - it('should successfully send privilege investigation provider notification email', async () => { - const response = await lambda.handler( - SAMPLE_PRIVILEGE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, {} as any - ); - - expect(response).toEqual({ - message: 'Email message sent' - }); - - expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { - Destination: { - ToAddresses: ['provider@example.com'] - }, - Content: { - Simple: { - Body: { - Html: { - Charset: 'UTF-8', - Data: expect.stringContaining('') - } - }, - Subject: { - Charset: 'UTF-8', - Data: 'Your Audiologist privilege in Ohio is under investigation' - } - } - }, - FromEmailAddress: 'Compact Connect ' - }); - }); - - it('should throw error when no recipients found', async () => { - const eventWithNoRecipients: EmailNotificationEvent = { - ...SAMPLE_PRIVILEGE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, - specificEmails: [] - }; - - await expect(lambda.handler(eventWithNoRecipients, {} as any)) - .rejects - .toThrow('No recipients found for privilege investigation provider notification email'); - }); - - it('should throw error when required template variables are missing', async () => { - const eventWithMissingVariables: EmailNotificationEvent = { - ...SAMPLE_PRIVILEGE_INVESTIGATION_PROVIDER_NOTIFICATION_EVENT, - templateVariables: {} - }; - - await expect(lambda.handler(eventWithMissingVariables, {} as any)) - .rejects - .toThrow('Missing required template variables for privilegeInvestigationProviderNotification template.'); - }); - }); - describe('Privilege Investigation State Notification', () => { const SAMPLE_PRIVILEGE_INVESTIGATION_STATE_NOTIFICATION_EVENT: EmailNotificationEvent = { template: 'privilegeInvestigationStateNotification', @@ -1977,74 +1775,6 @@ describe('EmailNotificationServiceLambda', () => { }); }); - describe('Privilege Investigation Closed Provider Notification', () => { - const SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT: EmailNotificationEvent = { - template: 'privilegeInvestigationClosedProviderNotification', - recipientType: 'SPECIFIC', - compact: 'aslp', - specificEmails: ['provider@example.com'], - templateVariables: { - providerFirstName: 'John', - providerLastName: 'Doe', - investigationJurisdiction: 'OH', - licenseType: 'Audiologist' - } - }; - - it('should successfully send privilege investigation closed provider notification email', async () => { - const response = await lambda.handler( - SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, {} as any - ); - - expect(response).toEqual({ - message: 'Email message sent' - }); - - expect(mockSESClient).toHaveReceivedCommandWith(SendEmailCommand, { - Destination: { - ToAddresses: ['provider@example.com'] - }, - Content: { - Simple: { - Body: { - Html: { - Charset: 'UTF-8', - Data: expect.stringContaining('') - } - }, - Subject: { - Charset: 'UTF-8', - Data: 'The investigation on your Audiologist privilege in Ohio has been closed' - } - } - }, - FromEmailAddress: 'Compact Connect ' - }); - }); - - it('should throw error when no recipients found', async () => { - const eventWithNoRecipients: EmailNotificationEvent = { - ...SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, - specificEmails: [] - }; - - await expect(lambda.handler(eventWithNoRecipients, {} as any)) - .rejects - .toThrow('No recipients found for privilege investigation closed provider notification email'); - }); - - it('should throw error when required template variables are missing', async () => { - const eventWithMissingVariables: EmailNotificationEvent = { - ...SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_PROVIDER_NOTIFICATION_EVENT, - templateVariables: {} - }; - - await expect(lambda.handler(eventWithMissingVariables, {} as any)) - .rejects - .toThrow('Missing required template variables for privilegeInvestigationClosedProviderNotification template.'); - }); - }); - describe('Privilege Investigation Closed State Notification', () => { const SAMPLE_PRIVILEGE_INVESTIGATION_CLOSED_STATE_NOTIFICATION_EVENT: EmailNotificationEvent = { template: 'privilegeInvestigationClosedStateNotification', From af7b98222f8657374d17b62edd8fce7152a35d0d Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Mon, 3 Nov 2025 10:27:46 -0700 Subject: [PATCH 22/33] Deserialize UUIDs from path params, quick PR feedback --- .../cc_common/data_model/data_client.py | 133 +++++++++--------- .../data_model/schema/investigation/record.py | 15 +- .../data_model/schema/license/record.py | 13 +- .../data_model/schema/privilege/record.py | 11 +- .../lambdas/python/common/cc_common/utils.py | 7 + .../common/tests/function/test_data_client.py | 54 +++---- .../provider-data-v1/handlers/encumbrance.py | 30 ++-- .../handlers/investigation.py | 26 ++-- .../test_handlers/test_encumbrance.py | 13 +- .../test_handlers/test_investigation.py | 4 +- 10 files changed, 148 insertions(+), 158 deletions(-) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index 0f3c0f471..8fc819d32 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -2,7 +2,7 @@ from datetime import date, datetime from datetime import time as dtime from urllib.parse import quote -from uuid import uuid4 +from uuid import UUID, uuid4 from aws_lambda_powertools.metrics import MetricUnit from boto3.dynamodb.conditions import Attr, Key @@ -177,7 +177,7 @@ def get_provider_user_records( self, *, compact: str, - provider_id: str, + provider_id: UUID, consistent_read: bool = True, ) -> ProviderUserRecords: logger.info('Getting provider') @@ -341,10 +341,6 @@ def _generate_privilege_record( if original_privilege: # Copy over the original issuance date and privilege id date_of_issuance = original_privilege.dateOfIssuance - # TODO: This privilege number copy-over approach has a gap in it, in the event that a # noqa: FIX002 - # provider's license type changes. In that event, the privilege id will have the original - # license type abbreviation in it, not the new one. - # This gap should be closed as part of https://github.com/csg-org/CompactConnect/issues/443. privilege_id = original_privilege.privilegeId else: date_of_issuance = current_datetime @@ -597,7 +593,7 @@ def _rollback_privilege_transactions( } } ) - elif item.get('type') == 'privilege': + elif item.get('type') == ProviderRecordType.PRIVILEGE: # For privilege records, check if it was an update or new creation original_privilege = existing_privileges_by_jurisdiction.get(item['jurisdiction']) if original_privilege: @@ -738,7 +734,7 @@ def create_military_affiliation( logger.info('Creating military affiliation') latest_military_affiliation_record = { - 'type': 'militaryAffiliation', + 'type': ProviderRecordType.MILITARY_AFFILIATION, 'affiliationType': affiliation_type.value, 'fileNames': file_names, 'compact': compact, @@ -918,7 +914,7 @@ def process_registration_values( # Create provider update record to show registration event and fields that were updated provider_update_record = ProviderUpdateData.create_new( { - 'type': 'providerUpdate', + 'type': ProviderRecordType.PROVIDER_UPDATE, 'updateType': UpdateCategory.REGISTRATION, 'providerId': matched_license_record.providerId, 'compact': matched_license_record.compact, @@ -1055,7 +1051,7 @@ def deactivate_privilege( # Use the schema to generate the update record with proper pk/sk privilege_update_record = PrivilegeUpdateRecordSchema().dump( { - 'type': 'privilegeUpdate', + 'type': ProviderRecordType.PRIVILEGE_UPDATE, 'updateType': 'deactivation', 'providerId': provider_id, 'compact': compact, @@ -1227,13 +1223,13 @@ def _validate_license_type_abbreviation(self, compact: str, license_type_abbrevi return LicenseUtility.get_license_type_by_abbreviation(compact, license_type_abbreviation).name def _find_and_validate_adverse_action( - self, adverse_action_records: list[AdverseActionData], adverse_action_id: str + self, adverse_action_records: list[AdverseActionData], adverse_action_id: UUID ) -> AdverseActionData: """ Find and validate an adverse action record from a list of records. :param list[AdverseActionData] adverse_action_records: List of adverse action records to search - :param str adverse_action_id: The ID of the adverse action to find + :param UUID adverse_action_id: The ID of the adverse action to find :return: The found adverse action record :raises CCNotFoundException: If the adverse action record is not found :raises CCInvalidRequestException: If the encumbrance has already been lifted @@ -1241,7 +1237,7 @@ def _find_and_validate_adverse_action( # Find the specific adverse action record to lift target_adverse_action: AdverseActionData | None = None for adverse_action in adverse_action_records: - if str(adverse_action.adverseActionId) == adverse_action_id: + if adverse_action.adverseActionId == adverse_action_id: target_adverse_action = adverse_action break @@ -1255,19 +1251,19 @@ def _find_and_validate_adverse_action( return target_adverse_action def _get_unlifted_adverse_actions( - self, adverse_action_records: list[AdverseActionData], target_adverse_action_id: str + self, adverse_action_records: list[AdverseActionData], target_adverse_action_id: UUID ) -> list[AdverseActionData]: """ Get all unlifted adverse actions excluding the target adverse action. :param list[AdverseActionData] adverse_action_records: List of adverse action records - :param str target_adverse_action_id: The ID of the target adverse action being lifted + :param UUID target_adverse_action_id: The ID of the target adverse action being lifted :return: List of unlifted adverse actions excluding the target one """ return [ aa for aa in adverse_action_records - if aa.effectiveLiftDate is None and str(aa.adverseActionId) != target_adverse_action_id + if aa.effectiveLiftDate is None and aa.adverseActionId != target_adverse_action_id ] def _generate_provider_encumbered_status_update_item_if_not_already_encumbered( @@ -1455,7 +1451,7 @@ def encumber_privilege(self, adverse_action: AdverseActionData) -> None: # Use the schema to generate the update record with proper pk/sk privilege_update_record = PrivilegeUpdateData.create_new( { - 'type': 'privilegeUpdate', + 'type': ProviderRecordType.PRIVILEGE_UPDATE, 'updateType': UpdateCategory.ENCUMBRANCE, 'providerId': adverse_action.providerId, 'compact': adverse_action.compact, @@ -1649,11 +1645,11 @@ def create_investigation(self, investigation: InvestigationData) -> None: if investigation.investigationAgainst == InvestigationAgainstEnum.PRIVILEGE: record_data = PrivilegeData.from_database_record(record) update_data_type = PrivilegeUpdateData - update_type = 'privilegeUpdate' + update_type = ProviderRecordType.PRIVILEGE_UPDATE else: record_data = LicenseData.from_database_record(record) update_data_type = LicenseUpdateData - update_type = 'licenseUpdate' + update_type = ProviderRecordType.LICENSE_UPDATE investigation_details = { 'investigationId': investigation.investigationId, @@ -1711,14 +1707,14 @@ def create_investigation(self, investigation: InvestigationData) -> None: def close_investigation( self, compact: str, - provider_id: str, + provider_id: UUID, jurisdiction: str, license_type_abbreviation: str, - investigation_id: str, + investigation_id: UUID, closing_user: str, close_date: datetime, investigation_against: InvestigationAgainstEnum, - resulting_encumbrance_id: str = None, + resulting_encumbrance_id: UUID = None, ) -> None: """ Closes an investigation by updating the investigation record. @@ -1745,46 +1741,45 @@ def close_investigation( record_type = investigation_against.value # Query for the record (privilege or license) and all its investigations in a single query - query_results = self.config.provider_table.query( - KeyConditionExpression=Key('pk').eq(f'{compact}#PROVIDER#{provider_id}') - & Key('sk').begins_with(f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#') - )['Items'] + provider_records = self.get_provider_user_records( + compact=compact, provider_id=provider_id, consistent_read=True + ) # Separate the main record from investigation records - record = None - investigation_records = [] - record_sk = f'{compact}#PROVIDER#{record_type}/{jurisdiction}/{license_type_abbreviation}#' + if investigation_against == InvestigationAgainstEnum.LICENSE: + record = provider_records.get_specific_license_record(jurisdiction, license_type_abbreviation) + if not record: + message = f'{record_type.title()} not found for jurisdiction' + logger.info(message) + raise CCNotFoundException(f'{record_type.title()} not found for jurisdiction {jurisdiction}') + + update_data_type = LicenseUpdateData + update_type = ProviderRecordType.LICENSE_UPDATE + # Count open investigations (those without closeDate), excluding the one we're closing + open_investigations = provider_records.get_investigation_records_for_license( + jurisdiction, license_type_abbreviation, + lambda inv: inv.closeDate is None and inv.investigationId != investigation_id + ) + else: + record = provider_records.get_specific_privilege_record(jurisdiction, license_type_abbreviation) + if not record: + message = f'{record_type.title()} not found for jurisdiction' + logger.info(message) + raise CCNotFoundException(f'{record_type.title()} not found for jurisdiction {jurisdiction}') - for item in query_results: - if item['sk'] == record_sk: - record = item - elif '#INVESTIGATION#' in item['sk']: - investigation_records.append(item) + update_data_type = PrivilegeUpdateData + update_type = ProviderRecordType.PRIVILEGE_UPDATE + # Count open investigations (those without closeDate), excluding the one we're closing + open_investigations = provider_records.get_investigation_records_for_privilege( + jurisdiction, license_type_abbreviation, + lambda inv: inv.closeDate is None and inv.investigationId != investigation_id + ) if not record: message = f'{record_type.title()} not found for jurisdiction' logger.info(message) raise CCNotFoundException(f'{record_type.title()} not found for jurisdiction {jurisdiction}') - if investigation_against == InvestigationAgainstEnum.PRIVILEGE: - record_data = PrivilegeData.from_database_record(record) - update_data_type = PrivilegeUpdateData - update_type = 'privilegeUpdate' - else: - record_data = LicenseData.from_database_record(record) - update_data_type = LicenseUpdateData - update_type = 'licenseUpdate' - - # Get license type from the record for the update record - license_type = record_data.licenseType - - # Count open investigations (those without closeDate), excluding the one we're closing - open_investigations = [ - inv - for inv in investigation_records - if 'closeDate' not in inv and inv.get('investigationId') != investigation_id - ] - # Determine if this is the last open investigation is_last_open_investigation = len(open_investigations) == 0 @@ -1835,8 +1830,8 @@ def close_investigation( 'jurisdiction': jurisdiction, 'createDate': close_date, 'effectiveDate': close_date, - 'licenseType': license_type, - 'previous': record_data.to_dict(), + 'licenseType': record.licenseType, + 'previous': record.to_dict(), 'updatedValues': {}, 'removedValues': ['investigationStatus'], } @@ -1883,10 +1878,10 @@ def close_investigation( def lift_privilege_encumbrance( self, compact: str, - provider_id: str, + provider_id: UUID, jurisdiction: str, license_type_abbreviation: str, - adverse_action_id: str, + adverse_action_id: UUID, effective_lift_date: date, lifting_user: str, ) -> None: @@ -1995,7 +1990,7 @@ def lift_privilege_encumbrance( # Create privilege update record privilege_update_record = PrivilegeUpdateData.create_new( { - 'type': 'privilegeUpdate', + 'type': ProviderRecordType.PRIVILEGE_UPDATE, 'updateType': UpdateCategory.LIFTING_ENCUMBRANCE, 'providerId': provider_id, 'compact': compact, @@ -2031,7 +2026,7 @@ def lift_license_encumbrance( provider_id: str, jurisdiction: str, license_type_abbreviation: str, - adverse_action_id: str, + adverse_action_id: UUID, effective_lift_date: date, lifting_user: str, ) -> None: @@ -2043,7 +2038,7 @@ def lift_license_encumbrance( :param str provider_id: The provider ID :param str jurisdiction: The jurisdiction :param str license_type_abbreviation: The license type abbreviation - :param str adverse_action_id: The adverse action ID to lift + :param UUID adverse_action_id: The adverse action ID to lift :param date effective_lift_date: The effective date when the encumbrance is lifted :param str lifting_user: The cognito sub of the user lifting the encumbrance :raises CCNotFoundException: If the adverse action record is not found @@ -2513,7 +2508,7 @@ def _get_provider_record_transaction_items_for_jurisdiction_with_no_known_licens # Create the provider update record provider_update_record = ProviderUpdateData.create_new( { - 'type': 'providerUpdate', + 'type': ProviderRecordType.PROVIDER_UPDATE, 'updateType': UpdateCategory.HOME_JURISDICTION_CHANGE, 'providerId': provider_id, 'compact': compact, @@ -2597,7 +2592,7 @@ def _get_privilege_deactivation_transaction_items_for_jurisdiction_change( # Create update record privilege_update_record = PrivilegeUpdateData.create_new( { - 'type': 'privilegeUpdate', + 'type': ProviderRecordType.PRIVILEGE_UPDATE, 'updateType': UpdateCategory.HOME_JURISDICTION_CHANGE, 'providerId': provider_id, 'compact': compact, @@ -2673,7 +2668,7 @@ def _get_provider_record_transaction_items_for_jurisdiction_change_with_license( # Create the provider update record provider_update_record = ProviderUpdateData.create_new( { - 'type': 'providerUpdate', + 'type': ProviderRecordType.PROVIDER_UPDATE, 'updateType': UpdateCategory.HOME_JURISDICTION_CHANGE, 'providerId': provider_id, 'compact': compact, @@ -2817,7 +2812,7 @@ def _get_privilege_update_transaction_items_for_jurisdiction_change( # Create update record privilege_update_record = PrivilegeUpdateData.create_new( { - 'type': 'privilegeUpdate', + 'type': ProviderRecordType.PRIVILEGE_UPDATE, 'updateType': UpdateCategory.HOME_JURISDICTION_CHANGE, 'providerId': provider_id, 'compact': compact, @@ -2975,7 +2970,7 @@ def encumber_home_jurisdiction_license_privileges( # Create privilege update record privilege_update_record = PrivilegeUpdateData.create_new( { - 'type': 'privilegeUpdate', + 'type': ProviderRecordType.PRIVILEGE_UPDATE, 'updateType': UpdateCategory.ENCUMBRANCE, 'providerId': provider_id, 'compact': compact, @@ -3008,7 +3003,7 @@ def encumber_home_jurisdiction_license_privileges( # Create privilege update record privilege_update_record = PrivilegeUpdateData.create_new( { - 'type': 'privilegeUpdate', + 'type': ProviderRecordType.PRIVILEGE_UPDATE, 'updateType': UpdateCategory.ENCUMBRANCE, 'providerId': provider_id, 'compact': compact, @@ -3130,7 +3125,7 @@ def lift_home_jurisdiction_license_privilege_encumbrances( # Create privilege update record using the latest effective lift date privilege_update_record = PrivilegeUpdateData.create_new( { - 'type': 'privilegeUpdate', + 'type': ProviderRecordType.PRIVILEGE_UPDATE, 'updateType': UpdateCategory.LIFTING_ENCUMBRANCE, 'providerId': provider_id, 'compact': compact, @@ -3221,7 +3216,7 @@ def deactivate_license_privileges( # Create privilege update record privilege_update_record = PrivilegeUpdateData.create_new( { - 'type': 'privilegeUpdate', + 'type': ProviderRecordType.PRIVILEGE_UPDATE, 'updateType': UpdateCategory.LICENSE_DEACTIVATION, 'providerId': provider_id, 'compact': compact, @@ -3366,7 +3361,7 @@ def complete_provider_email_update( # Create provider update record to track the email change provider_update_record = ProviderUpdateData.create_new( { - 'type': 'providerUpdate', + 'type': ProviderRecordType.PROVIDER_UPDATE, 'updateType': UpdateCategory.EMAIL_CHANGE, 'providerId': provider_id, 'compact': compact, diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py index fc477e2d5..ee057782a 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/record.py @@ -1,9 +1,10 @@ # ruff: noqa: N801, N815 invalid-name -from marshmallow import ValidationError, pre_dump +from marshmallow import Schema, ValidationError, pre_dump from marshmallow.fields import UUID, DateTime, String from cc_common.config import config from cc_common.data_model.schema.base_record import BaseRecordSchema +from cc_common.data_model.schema.common import ValidatesLicenseTypeMixin from cc_common.data_model.schema.fields import ( Compact, InvestigationAgainstField, @@ -12,7 +13,7 @@ @BaseRecordSchema.register_schema('investigation') -class InvestigationRecordSchema(BaseRecordSchema): +class InvestigationRecordSchema(BaseRecordSchema, ValidatesLicenseTypeMixin): """ Schema for investigation records in the provider data table @@ -53,3 +54,13 @@ def generate_pk_sk(self, in_data, **_kwargs): f'{in_data["compact"]}#PROVIDER#{in_data["investigationAgainst"]}/{in_data["jurisdiction"]}/{license_type_abbr}#INVESTIGATION#{in_data["investigationId"]}' ) return in_data + + +class InvestigationDetailsSchema(Schema): + """ + Schema for tracking details about an investigation. + """ + + investigationId = UUID(required=True, allow_none=False) + # present if update is created by upstream license investigation + licenseJurisdiction = Jurisdiction(required=False, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py index 24e60f73a..9af6ea97e 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/record.py @@ -2,7 +2,7 @@ from datetime import date from urllib.parse import quote -from marshmallow import Schema, ValidationError, post_dump, post_load, pre_dump, pre_load, validates_schema +from marshmallow import ValidationError, post_dump, post_load, pre_dump, pre_load, validates_schema from marshmallow.fields import UUID, Date, DateTime, Email, List, Nested, String from marshmallow.validate import Length @@ -29,19 +29,10 @@ NationalProviderIdentifier, UpdateType, ) +from cc_common.data_model.schema.investigation.record import InvestigationDetailsSchema from cc_common.data_model.schema.license.common import LicenseCommonSchema -class InvestigationDetailsSchema(Schema): - """ - Schema for tracking details about an investigation. - """ - - investigationId = UUID(required=True, allow_none=False) - # present if update is created by upstream license investigation - licenseJurisdiction = Jurisdiction(required=False, allow_none=False) - - @BaseRecordSchema.register_schema('license') class LicenseRecordSchema(BaseRecordSchema, LicenseCommonSchema): """ diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py index b7cf6dd95..fdc918357 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/record.py @@ -26,6 +26,7 @@ PrivilegeEncumberedStatusField, UpdateType, ) +from cc_common.data_model.schema.investigation.record import InvestigationDetailsSchema class AttestationVersionRecordSchema(Schema): @@ -66,16 +67,6 @@ class EncumbranceDetailsSchema(Schema): clinicalPrivilegeActionCategory = ClinicalPrivilegeActionCategoryField(required=False, allow_none=False) -class InvestigationDetailsSchema(Schema): - """ - Schema for tracking details about an investigation. - """ - - investigationId = UUID(required=True, allow_none=False) - # present if update is created by upstream license investigation - licenseJurisdiction = Jurisdiction(required=False, allow_none=False) - - @BaseRecordSchema.register_schema('privilege') class PrivilegeRecordSchema(BaseRecordSchema, ValidatesLicenseTypeMixin): """ diff --git a/backend/compact-connect/lambdas/python/common/cc_common/utils.py b/backend/compact-connect/lambdas/python/common/cc_common/utils.py index 5503e058b..6693299e4 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/utils.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/utils.py @@ -911,3 +911,10 @@ def verify_password(hashed_password: str, password: str) -> bool: except Exception as e: logger.error('Failed to verify password', error=str(e)) raise CCInternalException('Failed to verify password') from e + + +def to_uuid(uuid: str, on_error: str) -> UUID: + try: + return UUID(uuid) + except ValueError as e: + raise CCInvalidRequestException(on_error) from e diff --git a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py index 925425072..8e600fcf2 100644 --- a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py +++ b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py @@ -1,7 +1,7 @@ import json from datetime import UTC, date, datetime from unittest.mock import patch -from uuid import uuid4 +from uuid import UUID, uuid4 from boto3.dynamodb.conditions import Key from cc_common.exceptions import CCAwsServiceException, CCInvalidRequestException @@ -65,10 +65,10 @@ def test_get_provider_garbage_in_db(self): for item in resp['items']: self.assertNotIn('something_unexpected', item) - def _load_provider_data(self) -> str: + def _load_provider_data(self) -> UUID: with open('tests/resources/dynamo/provider.json') as f: provider_record = json.load(f) - provider_id = provider_record['providerId'] + provider_id = UUID(provider_record['providerId']) provider_record['privilegeJurisdictions'] = set(provider_record['privilegeJurisdictions']) self._provider_table.put_item(Item=provider_record) @@ -729,7 +729,7 @@ def test_deactivate_privilege_updates_record(self): 'pk': f'aslp#PROVIDER#{provider_id}', 'sk': 'aslp#PROVIDER#privilege/ne/aud#', 'type': 'privilege', - 'providerId': provider_id, + 'providerId': str(provider_id), 'compact': 'aslp', 'licenseJurisdiction': 'oh', 'licenseType': 'audiologist', @@ -773,7 +773,7 @@ def test_deactivate_privilege_updates_record(self): 'pk': f'aslp#PROVIDER#{provider_id}', 'sk': 'aslp#PROVIDER#privilege/ne/aud#', 'type': 'privilege', - 'providerId': provider_id, + 'providerId': str(provider_id), 'compact': 'aslp', 'licenseJurisdiction': 'oh', 'licenseType': 'audiologist', @@ -794,7 +794,7 @@ def test_deactivate_privilege_updates_record(self): 'sk': 'aslp#PROVIDER#privilege/ne/aud#UPDATE#1731110399/aac682a76e1182a641a1b40dd606ae51', 'type': 'privilegeUpdate', 'updateType': 'deactivation', - 'providerId': provider_id, + 'providerId': str(provider_id), 'compact': 'aslp', 'compactTransactionIdGSIPK': 'COMPACT#aslp#TX#1234567890#', 'jurisdiction': 'ne', @@ -870,7 +870,7 @@ def test_deactivate_privilege_on_inactive_privilege_raises_exception(self): 'pk': f'aslp#PROVIDER#{provider_id}', 'sk': 'aslp#PROVIDER#privilege/ne/aud#', 'type': 'privilege', - 'providerId': provider_id, + 'providerId': str(provider_id), 'compact': 'aslp', 'jurisdiction': 'ne', 'licenseJurisdiction': 'oh', @@ -892,7 +892,7 @@ def test_deactivate_privilege_on_inactive_privilege_raises_exception(self): 'sk': 'aslp#PROVIDER#privilege/ne/aud#UPDATE#1731110399/483bebc6cb3fd6b517f8ce9ad706c518', 'type': 'privilegeUpdate', 'updateType': 'renewal', - 'providerId': provider_id, + 'providerId': str(provider_id), 'compact': 'aslp', 'compactTransactionIdGSIPK': 'COMPACT#aslp#TX#1234567890#', 'jurisdiction': 'ne', @@ -1071,7 +1071,7 @@ def test_create_privilege_investigation_success(self): 'sk': f'aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#{investigation.investigationId}', 'type': 'investigation', 'compact': 'aslp', - 'providerId': provider_id, + 'providerId': str(provider_id), 'jurisdiction': 'ne', 'licenseType': 'speech-language pathologist', 'investigationAgainst': 'privilege', @@ -1110,7 +1110,7 @@ def test_create_privilege_investigation_success(self): 'type': 'privilegeUpdate', 'updateType': 'investigation', 'compact': 'aslp', - 'providerId': provider_id, + 'providerId': str(provider_id), 'jurisdiction': 'ne', 'licenseType': 'speech-language pathologist', 'createDate': investigation.creationDate.isoformat(), @@ -1182,7 +1182,7 @@ def test_create_license_investigation_success(self): 'sk': f'aslp#PROVIDER#license/oh/slp#INVESTIGATION#{investigation.investigationId}', 'type': 'investigation', 'compact': 'aslp', - 'providerId': provider_id, + 'providerId': str(provider_id), 'jurisdiction': 'oh', 'licenseType': 'speech-language pathologist', 'investigationAgainst': 'license', @@ -1220,7 +1220,7 @@ def test_create_license_investigation_success(self): 'type': 'licenseUpdate', 'updateType': 'investigation', 'compact': 'aslp', - 'providerId': provider_id, + 'providerId': str(provider_id), 'jurisdiction': 'oh', 'licenseType': 'speech-language pathologist', 'createDate': investigation.creationDate.isoformat(), @@ -1341,7 +1341,7 @@ def test_close_privilege_investigation_success(self): 'investigationAgainst': 'privilege', 'submittingUser': str(uuid4()), 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), - 'investigationId': str(uuid4()), + 'investigationId': uuid4(), } ) @@ -1354,7 +1354,7 @@ def test_close_privilege_investigation_success(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - investigation_id=str(investigation.investigationId), + investigation_id=investigation.investigationId, closing_user=closing_user, close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.PRIVILEGE, @@ -1375,7 +1375,7 @@ def test_close_privilege_investigation_success(self): 'sk': f'aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#{investigation.investigationId}', 'type': 'investigation', 'compact': 'aslp', - 'providerId': provider_id, + 'providerId': str(provider_id), 'jurisdiction': 'ne', 'licenseType': 'speech-language pathologist', 'investigationAgainst': 'privilege', @@ -1424,7 +1424,7 @@ def test_close_privilege_investigation_success(self): 'type': 'privilegeUpdate', 'updateType': 'closingInvestigation', 'compact': 'aslp', - 'providerId': provider_id, + 'providerId': str(provider_id), 'jurisdiction': 'ne', 'licenseType': 'speech-language pathologist', 'createDate': investigation.creationDate.isoformat(), @@ -1489,7 +1489,7 @@ def test_close_license_investigation_success(self): provider_id=provider_id, jurisdiction='oh', license_type_abbreviation='slp', - investigation_id=str(investigation.investigationId), + investigation_id=investigation.investigationId, closing_user=closing_user, close_date=close_date, investigation_against=InvestigationAgainstEnum.LICENSE, @@ -1510,7 +1510,7 @@ def test_close_license_investigation_success(self): 'sk': f'aslp#PROVIDER#license/oh/slp#INVESTIGATION#{investigation.investigationId}', 'type': 'investigation', 'compact': 'aslp', - 'providerId': provider_id, + 'providerId': str(provider_id), 'jurisdiction': 'oh', 'licenseType': 'speech-language pathologist', 'investigationAgainst': 'license', @@ -1559,7 +1559,7 @@ def test_close_license_investigation_success(self): 'type': 'licenseUpdate', 'updateType': 'closingInvestigation', 'compact': 'aslp', - 'providerId': provider_id, + 'providerId': str(provider_id), 'jurisdiction': 'oh', 'licenseType': 'speech-language pathologist', 'createDate': investigation.creationDate.isoformat(), @@ -1789,7 +1789,7 @@ def test_close_privilege_investigation_with_encumbrance(self): # Now close the investigation with encumbrance creation closing_user = str(uuid4()) - resulting_encumbrance_id = str(uuid4()) + resulting_encumbrance_id = uuid4() close_date = datetime.fromisoformat('2024-11-08T23:59:59+00:00') client.close_investigation( @@ -1797,7 +1797,7 @@ def test_close_privilege_investigation_with_encumbrance(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - investigation_id=str(investigation.investigationId), + investigation_id=investigation.investigationId, closing_user=closing_user, close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.PRIVILEGE, @@ -1819,7 +1819,7 @@ def test_close_privilege_investigation_with_encumbrance(self): 'sk': f'aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#{investigation.investigationId}', 'type': 'investigation', 'compact': 'aslp', - 'providerId': provider_id, + 'providerId': str(provider_id), 'jurisdiction': 'ne', 'licenseType': 'speech-language pathologist', 'investigationAgainst': 'privilege', @@ -1828,7 +1828,7 @@ def test_close_privilege_investigation_with_encumbrance(self): 'creationDate': investigation.creationDate.isoformat(), 'closeDate': close_date.isoformat(), 'closingUser': closing_user, - 'resultingEncumbranceId': resulting_encumbrance_id, + 'resultingEncumbranceId': str(resulting_encumbrance_id), } # Pop dynamic fields that we don't want to assert on investigation_record.pop('dateOfUpdate') @@ -1865,7 +1865,7 @@ def test_close_license_investigation_with_encumbrance(self): # Now close the investigation with encumbrance creation closing_user = str(uuid4()) - resulting_encumbrance_id = str(uuid4()) + resulting_encumbrance_id = uuid4() close_date = datetime.fromisoformat('2024-11-08T23:59:59+00:00') client.close_investigation( @@ -1873,7 +1873,7 @@ def test_close_license_investigation_with_encumbrance(self): provider_id=provider_id, jurisdiction='oh', license_type_abbreviation='slp', - investigation_id=str(investigation.investigationId), + investigation_id=investigation.investigationId, closing_user=closing_user, close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.LICENSE, @@ -1895,7 +1895,7 @@ def test_close_license_investigation_with_encumbrance(self): 'sk': f'aslp#PROVIDER#license/oh/slp#INVESTIGATION#{investigation.investigationId}', 'type': 'investigation', 'compact': 'aslp', - 'providerId': provider_id, + 'providerId': str(provider_id), 'jurisdiction': 'oh', 'licenseType': 'speech-language pathologist', 'investigationAgainst': 'license', @@ -1904,7 +1904,7 @@ def test_close_license_investigation_with_encumbrance(self): 'creationDate': investigation.creationDate.isoformat(), 'closeDate': close_date.isoformat(), 'closingUser': closing_user, - 'resultingEncumbranceId': resulting_encumbrance_id, + 'resultingEncumbranceId': str(resulting_encumbrance_id), } # Pop dynamic fields that we don't want to assert on investigation_record.pop('dateOfUpdate') diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py index c9d642460..7b80ef28c 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py @@ -1,5 +1,5 @@ import json -from uuid import uuid4 +from uuid import UUID, uuid4 from aws_lambda_powertools.utilities.typing import LambdaContext from cc_common.config import config, logger @@ -16,7 +16,7 @@ ) from cc_common.exceptions import CCInvalidRequestException from cc_common.license_util import LicenseUtility -from cc_common.utils import api_handler, authorize_state_level_only_action +from cc_common.utils import api_handler, authorize_state_level_only_action, to_uuid from marshmallow import ValidationError PRIVILEGE_ENCUMBRANCE_ENDPOINT_RESOURCE = ( @@ -68,7 +68,7 @@ def _get_submitting_user_id(event: dict) -> str: def _generate_adverse_action_for_record_type( compact: str, - provider_id: str, + provider_id: UUID, jurisdiction: str, license_type_abbr: str, submitting_user: str, @@ -130,11 +130,11 @@ def _generate_adverse_action_for_record_type( def _create_privilege_encumbrance_internal( compact: str, jurisdiction: str, - provider_id: str, + provider_id: UUID, license_type_abbr: str, submitting_user: str, adverse_action_post_body: dict, -) -> str: +) -> UUID: """Internal handler for creating privilege encumbrances that returns the adverse action ID""" logger.info('Processing adverse action updates for privilege record') adverse_action = _generate_adverse_action_for_record_type( @@ -158,7 +158,7 @@ def _create_privilege_encumbrance_internal( effective_date=adverse_action.effectiveStartDate, ) - return str(adverse_action.adverseActionId) + return adverse_action.adverseActionId def handle_privilege_encumbrance(event: dict) -> dict: @@ -166,7 +166,7 @@ def handle_privilege_encumbrance(event: dict) -> dict: # Parse event parameters compact = event['pathParameters']['compact'] jurisdiction = event['pathParameters']['jurisdiction'] - provider_id = event['pathParameters']['providerId'] + provider_id = to_uuid(event['pathParameters']['providerId'], 'Invalid providerId provided') license_type_abbr = event['pathParameters']['licenseType'].lower() submitting_user = _get_submitting_user_id(event) adverse_action_post_body = _load_adverse_action_post_body(event) @@ -185,11 +185,11 @@ def handle_privilege_encumbrance(event: dict) -> dict: def _create_license_encumbrance_internal( compact: str, jurisdiction: str, - provider_id: str, + provider_id: UUID, license_type_abbr: str, submitting_user: str, adverse_action_post_body: dict, -) -> str: +) -> UUID: """Internal handler for creating license encumbrances that returns the adverse action ID""" logger.info('Processing adverse action updates for license record') adverse_action = _generate_adverse_action_for_record_type( @@ -214,7 +214,7 @@ def _create_license_encumbrance_internal( effective_date=adverse_action.effectiveStartDate, ) - return str(adverse_action.adverseActionId) + return adverse_action.adverseActionId def handle_license_encumbrance(event: dict) -> dict: @@ -222,7 +222,7 @@ def handle_license_encumbrance(event: dict) -> dict: # Parse event parameters compact = event['pathParameters']['compact'] jurisdiction = event['pathParameters']['jurisdiction'] - provider_id = event['pathParameters']['providerId'] + provider_id = to_uuid(event['pathParameters']['providerId'], 'Invalid providerId provided') license_type_abbr = event['pathParameters']['licenseType'].lower() submitting_user = _get_submitting_user_id(event) adverse_action_post_body = _load_adverse_action_post_body(event) @@ -248,10 +248,10 @@ def handle_privilege_encumbrance_lifting(event: dict) -> dict: # Extract path parameters compact = event['pathParameters']['compact'] - provider_id = event['pathParameters']['providerId'] + provider_id = to_uuid(event['pathParameters']['providerId'], 'Invalid providerId provided') jurisdiction = event['pathParameters']['jurisdiction'] license_type_abbreviation = event['pathParameters']['licenseType'].lower() - encumbrance_id = event['pathParameters']['encumbranceId'] + encumbrance_id = to_uuid(event['pathParameters']['encumbranceId'], 'Invalid encumbranceId provided') # Parse and validate request body body = json.loads(event['body']) @@ -300,10 +300,10 @@ def handle_license_encumbrance_lifting(event: dict) -> dict: # Extract path parameters compact = event['pathParameters']['compact'] - provider_id = event['pathParameters']['providerId'] + provider_id = to_uuid(event['pathParameters']['providerId'], 'Invalid providerId provided') jurisdiction = event['pathParameters']['jurisdiction'] license_type_abbreviation = event['pathParameters']['licenseType'].lower() - encumbrance_id = event['pathParameters']['encumbranceId'] + encumbrance_id = to_uuid(event['pathParameters']['encumbranceId'], 'Invalid encumbranceId provided') # Parse and validate request body body = json.loads(event['body']) diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py index 347f2b691..9b3a7f4bb 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/investigation.py @@ -13,7 +13,7 @@ ) from cc_common.exceptions import CCInvalidRequestException from cc_common.license_util import LicenseUtility -from cc_common.utils import api_handler, authorize_state_level_only_action +from cc_common.utils import api_handler, authorize_state_level_only_action, to_uuid from marshmallow import ValidationError from .encumbrance import _create_license_encumbrance_internal, _create_privilege_encumbrance_internal @@ -68,7 +68,7 @@ def _load_investigation_patch_body(event: dict) -> dict: def _generate_investigation_for_record_type( compact: str, jurisdiction: str, - provider_id: str, + provider_id: UUID, license_type_abbr: str, investigation_against_record_type: InvestigationAgainstEnum, cognito_sub: str, @@ -101,7 +101,7 @@ def handle_privilege_investigation(event: dict) -> dict: # Parse event parameters compact = event['pathParameters']['compact'] jurisdiction = event['pathParameters']['jurisdiction'] - provider_id = event['pathParameters']['providerId'] + provider_id = to_uuid(event['pathParameters']['providerId'], 'Invalid providerId provided') license_type_abbr = event['pathParameters']['licenseType'].lower() cognito_sub = event['requestContext']['authorizer']['claims']['sub'] @@ -136,7 +136,7 @@ def handle_license_investigation(event: dict) -> dict: # Parse event parameters compact = event['pathParameters']['compact'] jurisdiction = event['pathParameters']['jurisdiction'] - provider_id = event['pathParameters']['providerId'] + provider_id = to_uuid(event['pathParameters']['providerId'], 'Invalid providerId provided') license_type_abbr = event['pathParameters']['licenseType'].lower() cognito_sub = event['requestContext']['authorizer']['claims']['sub'] @@ -171,12 +171,9 @@ def handle_privilege_investigation_close(event: dict) -> dict: # Parse event parameters compact = event['pathParameters']['compact'] jurisdiction = event['pathParameters']['jurisdiction'] - provider_id = event['pathParameters']['providerId'] + provider_id = to_uuid(event['pathParameters']['providerId'], 'Invalid providerId provided') license_type_abbr = event['pathParameters']['licenseType'].lower() - try: - investigation_id = UUID(event['pathParameters']['investigationId']) - except ValueError as e: - raise CCInvalidRequestException('Invalid investigationId provided') from e + investigation_id = to_uuid(event['pathParameters']['investigationId'], 'Invalid investigationId provided') cognito_sub = event['requestContext']['authorizer']['claims']['sub'] investigation_patch_body = _load_investigation_patch_body(event) @@ -203,7 +200,7 @@ def handle_privilege_investigation_close(event: dict) -> dict: provider_id=provider_id, jurisdiction=jurisdiction, license_type_abbreviation=license_type_abbr, - investigation_id=str(investigation_id), + investigation_id=investigation_id, closing_user=cognito_sub, close_date=now, investigation_against=InvestigationAgainstEnum.PRIVILEGE, @@ -231,12 +228,9 @@ def handle_license_investigation_close(event: dict) -> dict: # Parse event parameters compact = event['pathParameters']['compact'] jurisdiction = event['pathParameters']['jurisdiction'] - provider_id = event['pathParameters']['providerId'] + provider_id = to_uuid(event['pathParameters']['providerId'], 'Invalid providerId provided') license_type_abbr = event['pathParameters']['licenseType'].lower() - try: - investigation_id = UUID(event['pathParameters']['investigationId']) - except ValueError as e: - raise CCInvalidRequestException('Invalid investigationId provided') from e + investigation_id = to_uuid(event['pathParameters']['investigationId'], 'Invalid investigationId provided') cognito_sub = event['requestContext']['authorizer']['claims']['sub'] investigation_patch_body = _load_investigation_patch_body(event) @@ -264,7 +258,7 @@ def handle_license_investigation_close(event: dict) -> dict: provider_id=provider_id, jurisdiction=jurisdiction, license_type_abbreviation=license_type_abbr, - investigation_id=str(investigation_id), + investigation_id=investigation_id, closing_user=cognito_sub, close_date=now, investigation_against=InvestigationAgainstEnum.LICENSE, diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_encumbrance.py b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_encumbrance.py index 911bfc774..ed11c68ea 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_encumbrance.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_encumbrance.py @@ -1,6 +1,7 @@ import json from datetime import UTC, date, datetime, timedelta from unittest.mock import MagicMock, patch +from uuid import uuid4 from boto3.dynamodb.conditions import Key from cc_common.exceptions import CCInternalException @@ -71,7 +72,7 @@ def _when_testing_privilege_encumbrance(self, body_overrides: dict | None = None 'resource': PRIVILEGE_ENCUMBRANCE_ENDPOINT_RESOURCE, 'pathParameters': { 'compact': test_privilege_record.compact, - 'providerId': test_privilege_record.providerId, + 'providerId': str(test_privilege_record.providerId), 'jurisdiction': test_privilege_record.jurisdiction, 'licenseType': self.test_data_generator.get_license_type_abbr_for_license_type( compact=test_privilege_record.compact, license_type=test_privilege_record.licenseType @@ -446,7 +447,7 @@ def _when_testing_valid_license_encumbrance(self, body_overrides: dict | None = 'resource': LICENSE_ENCUMBRANCE_ENDPOINT_RESOURCE, 'pathParameters': { 'compact': test_license_record.compact, - 'providerId': test_license_record.providerId, + 'providerId': str(test_license_record.providerId), 'jurisdiction': test_license_record.jurisdiction, 'licenseType': self.test_data_generator.get_license_type_abbr_for_license_type( compact=test_license_record.compact, license_type=test_license_record.licenseType @@ -805,9 +806,9 @@ def test_should_raise_cc_not_found_exception_if_adverse_action_not_found(self): privilege_record, _ = self._setup_privilege_with_adverse_action() - # Use a non-existent adverse action ID + # Use a non-existent adverse action ID (valid UUID format that doesn't exist) event = self._generate_lift_encumbrance_event( - privilege_record, type('MockAdverseAction', (), {'adverseActionId': 'non-existent-id'})() + privilege_record, type('MockAdverseAction', (), {'adverseActionId': str(uuid4())})() ) response = encumbrance_handler(event, self.mock_context) @@ -1170,9 +1171,9 @@ def test_should_raise_cc_not_found_exception_if_adverse_action_not_found(self): license_record, _ = self._setup_license_with_adverse_action() - # Use a non-existent adverse action ID + # Use a non-existent adverse action ID (valid UUID format that doesn't exist) event = self._generate_lift_encumbrance_event( - license_record, type('MockAdverseAction', (), {'adverseActionId': 'non-existent-id'})() + license_record, type('MockAdverseAction', (), {'adverseActionId': str(uuid4())})() ) response = encumbrance_handler(event, self.mock_context) diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py index 02c33e63f..955e986e5 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py @@ -518,7 +518,7 @@ def _when_testing_privilege_investigation_close(self, body_overrides: dict | Non 'providerId': str(test_privilege_record.providerId), 'jurisdiction': test_privilege_record.jurisdiction, 'licenseType': test_privilege_record.licenseTypeAbbreviation, - 'investigationId': investigation_id, + 'investigationId': str(investigation_id), }, 'body': json.dumps(test_body), }, @@ -738,7 +738,7 @@ def _when_testing_license_investigation_close(self, body_overrides: dict | None 'providerId': str(test_license_record.providerId), 'jurisdiction': test_license_record.jurisdiction, 'licenseType': test_license_record.licenseTypeAbbreviation, - 'investigationId': investigation_id, + 'investigationId': str(investigation_id), }, 'body': json.dumps(test_body), }, From 609d69c85ef50927dacbc792634704e2eb5769ad Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Mon, 3 Nov 2025 15:13:56 -0700 Subject: [PATCH 23/33] Remove pk, sk calculation from DataClient investigation methods --- .github/workflows/check-compact-connect.yml | 2 +- .../cc_common/data_model/data_client.py | 110 +++++++++++------- .../schema/investigation/__init__.py | 46 ++++++++ .../common/tests/function/test_data_client.py | 28 +++-- .../test_schema/test_investigation.py | 13 ++- 5 files changed, 140 insertions(+), 59 deletions(-) diff --git a/.github/workflows/check-compact-connect.yml b/.github/workflows/check-compact-connect.yml index 7902ac5a4..764da64bf 100644 --- a/.github/workflows/check-compact-connect.yml +++ b/.github/workflows/check-compact-connect.yml @@ -103,7 +103,7 @@ jobs: run: "pip install -r backend/compact-connect/requirements-dev.txt" - name: Install all Python dependencies - run: "cd backend/compact-connect; bin/sync_deps.sh" + run: "cd backend/compact-connect; pip install -U 'pip<25.3'; bin/sync_deps.sh" - name: Test backend run: "cd backend/compact-connect; bin/run_tests.sh -l all -no" diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index 8fc819d32..3416b99c8 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -1627,29 +1627,39 @@ def create_investigation(self, investigation: InvestigationData) -> None: ): # Get the record (privilege or license) record_type = investigation.investigationAgainst - try: - record = self.config.provider_table.get_item( - Key={ - 'pk': f'{investigation.compact}#PROVIDER#{investigation.providerId}', - 'sk': f'{investigation.compact}#PROVIDER#{record_type}/' - f'{investigation.jurisdiction}/{investigation.licenseTypeAbbreviation}#', - }, - )['Item'] - except KeyError as e: - message = f'{record_type.title()} not found for jurisdiction' - logger.info(message) - raise CCNotFoundException( - f'{record_type.title()} not found for jurisdiction {investigation.jurisdiction}' - ) from e - if investigation.investigationAgainst == InvestigationAgainstEnum.PRIVILEGE: - record_data = PrivilegeData.from_database_record(record) - update_data_type = PrivilegeUpdateData - update_type = ProviderRecordType.PRIVILEGE_UPDATE - else: - record_data = LicenseData.from_database_record(record) + # Query for the record (privilege or license) and all its investigations in a single query + provider_records = self.get_provider_user_records( + compact=investigation.compact, provider_id=investigation.providerId, consistent_read=True + ) + + # Separate the main record from investigation records + if investigation.investigationAgainst == InvestigationAgainstEnum.LICENSE: + record = provider_records.get_specific_license_record( + investigation.jurisdiction, investigation.licenseTypeAbbreviation + ) + if not record: + message = f'{record_type.title()} not found for jurisdiction' + logger.info(message) + raise CCNotFoundException( + f'{record_type.title()} not found for jurisdiction {investigation.jurisdiction}' + ) + update_data_type = LicenseUpdateData update_type = ProviderRecordType.LICENSE_UPDATE + else: + record = provider_records.get_specific_privilege_record( + investigation.jurisdiction, investigation.licenseTypeAbbreviation + ) + if not record: + message = f'{record_type.title()} not found for jurisdiction' + logger.info(message) + raise CCNotFoundException( + f'{record_type.title()} not found for jurisdiction {investigation.jurisdiction}' + ) + + update_data_type = PrivilegeUpdateData + update_type = ProviderRecordType.PRIVILEGE_UPDATE investigation_details = { 'investigationId': investigation.investigationId, @@ -1666,7 +1676,7 @@ def create_investigation(self, investigation: InvestigationData) -> None: 'createDate': investigation.creationDate, 'effectiveDate': investigation.creationDate, 'licenseType': investigation.licenseType, - 'previous': record_data.to_dict(), + 'previous': record.to_dict(), 'updatedValues': { 'investigationStatus': InvestigationStatusEnum.UNDER_INVESTIGATION, }, @@ -1675,6 +1685,7 @@ def create_investigation(self, investigation: InvestigationData) -> None: ) # Prepare the transaction items + serialized_record = record.serialize_to_database_record() transaction_items = [ self._generate_put_transaction_item(investigation.serialize_to_database_record()), self._generate_put_transaction_item(update_record.serialize_to_database_record()), @@ -1682,11 +1693,8 @@ def create_investigation(self, investigation: InvestigationData) -> None: 'Update': { 'TableName': self.config.provider_table.table_name, 'Key': { - 'pk': {'S': f'{investigation.compact}#PROVIDER#{investigation.providerId}'}, - 'sk': { - 'S': f'{investigation.compact}#PROVIDER#{record_type}/' - f'{investigation.jurisdiction}/{investigation.licenseTypeAbbreviation}#' - }, + 'pk': {'S': serialized_record['pk']}, + 'sk': {'S': serialized_record['sk']}, }, 'UpdateExpression': ( 'SET investigationStatus = :investigationStatus, dateOfUpdate = :dateOfUpdate' @@ -1757,8 +1765,18 @@ def close_investigation( update_type = ProviderRecordType.LICENSE_UPDATE # Count open investigations (those without closeDate), excluding the one we're closing open_investigations = provider_records.get_investigation_records_for_license( - jurisdiction, license_type_abbreviation, - lambda inv: inv.closeDate is None and inv.investigationId != investigation_id + jurisdiction, + license_type_abbreviation, + lambda inv: inv.closeDate is None and inv.investigationId != investigation_id, + ) + investigation = next( + ( + inv + for inv in provider_records.get_investigation_records_for_license( + jurisdiction, license_type_abbreviation, lambda inv: inv.investigationId == investigation_id + ) + ), + None, ) else: record = provider_records.get_specific_privilege_record(jurisdiction, license_type_abbreviation) @@ -1771,14 +1789,22 @@ def close_investigation( update_type = ProviderRecordType.PRIVILEGE_UPDATE # Count open investigations (those without closeDate), excluding the one we're closing open_investigations = provider_records.get_investigation_records_for_privilege( - jurisdiction, license_type_abbreviation, - lambda inv: inv.closeDate is None and inv.investigationId != investigation_id + jurisdiction, + license_type_abbreviation, + lambda inv: inv.closeDate is None and inv.investigationId != investigation_id, + ) + investigation = next( + ( + inv + for inv in provider_records.get_investigation_records_for_privilege( + jurisdiction, license_type_abbreviation, lambda inv: inv.investigationId == investigation_id + ) + ), + None, ) - if not record: - message = f'{record_type.title()} not found for jurisdiction' - logger.info(message) - raise CCNotFoundException(f'{record_type.title()} not found for jurisdiction {jurisdiction}') + if investigation is None: + raise CCNotFoundException('Investigation not found') # Determine if this is the last open investigation is_last_open_investigation = len(open_investigations) == 0 @@ -1805,11 +1831,8 @@ def close_investigation( 'Update': { 'TableName': self.config.provider_table.table_name, 'Key': { - 'pk': {'S': f'{compact}#PROVIDER#{provider_id}'}, - 'sk': { - 'S': f'{compact}#PROVIDER#{record_type}/{jurisdiction}/' - f'{license_type_abbreviation}#INVESTIGATION#{investigation_id}' - }, + 'pk': {'S': investigation.pk}, + 'sk': {'S': investigation.sk}, }, 'UpdateExpression': investigation_update_expression, 'ConditionExpression': 'attribute_exists(pk) AND attribute_not_exists(closeDate)', @@ -1837,18 +1860,17 @@ def close_investigation( } ) + serialized_record = record.serialize_to_database_record() transaction_items.extend( [ self._generate_put_transaction_item(update_record.serialize_to_database_record()), + # Remove investigationStatus from the license/privilege record { 'Update': { 'TableName': self.config.provider_table.table_name, 'Key': { - 'pk': {'S': f'{compact}#PROVIDER#{provider_id}'}, - 'sk': { - 'S': f'{compact}#PROVIDER#{record_type}/{jurisdiction}/' - f'{license_type_abbreviation}#' - }, + 'pk': {'S': serialized_record['pk']}, + 'sk': {'S': serialized_record['sk']}, }, 'UpdateExpression': 'REMOVE investigationStatus SET dateOfUpdate = :dateOfUpdate', 'ConditionExpression': 'attribute_exists(pk)', diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py index da119c89b..90c933ff1 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/investigation/__init__.py @@ -21,6 +21,52 @@ class InvestigationData(CCDataClass): # Can use setters to set field data _requires_data_at_construction = False + @staticmethod + def generate_pk(compact: str, provider_id: UUID): + return f'{compact}#PROVIDER#{provider_id}' + + @staticmethod + def generate_sk( + compact: str, + investigation_against: InvestigationAgainstEnum, + jurisdiction: str, + license_type_abbr: str, + investigation_id: UUID, + ): + return ( + f'{compact}#PROVIDER#{investigation_against}/{jurisdiction}/{license_type_abbr}#' + f'INVESTIGATION#{investigation_id}' + ) + + @property + def pk(self): + if self.compact is None: + raise ValueError('Cannot calculate pk if compact is not set') + if self.providerId is None: + raise ValueError('Cannot calculate pk if providerId is not set') + + return self.generate_pk(self.compact, self.providerId) + + @property + def sk(self): + if self.compact is None: + raise ValueError('Cannot calculate sk if compact is not set') + if self.investigationAgainst is None: + raise ValueError('Cannot calculate sk if investigationAgainst is not set') + if self.jurisdiction is None: + raise ValueError('Cannot calculate sk if jurisdiction is not set') + if self.licenseTypeAbbreviation is None: + raise ValueError('Cannot calculate sk if licenseType is not set') + if self.investigationId is None: + raise ValueError('Cannot calculate sk if investigationId is not set') + return self.generate_sk( + compact=self.compact, + investigation_against=self.investigationAgainst, + jurisdiction=self.jurisdiction, + license_type_abbr=self.licenseTypeAbbreviation, + investigation_id=self.investigationId, + ) + @property def compact(self) -> str: return self._data['compact'] diff --git a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py index 8e600fcf2..07e52b21e 100644 --- a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py +++ b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py @@ -1267,14 +1267,17 @@ def test_create_privilege_investigation_privilege_not_found(self): from cc_common.data_model.schema.investigation import InvestigationData from cc_common.exceptions import CCNotFoundException + # Load test data, privilege in Nebraska, license in Ohio + provider_id = self._load_provider_data() + client = DataClient(self.config) - # Create investigation data for non-existent privilege + # Create investigation data for non-existent privilege (no privilege in Ohio) investigation = InvestigationData.create_new( { - 'providerId': str(uuid4()), + 'providerId': str(provider_id), 'compact': 'aslp', - 'jurisdiction': 'ne', + 'jurisdiction': 'oh', 'licenseTypeAbbreviation': 'slp', 'licenseType': 'speech-language pathologist', 'investigationAgainst': 'privilege', @@ -1296,14 +1299,17 @@ def test_create_license_investigation_license_not_found(self): from cc_common.data_model.schema.investigation import InvestigationData from cc_common.exceptions import CCNotFoundException + # Load test data, privilege in Nebraska, license in Ohio + provider_id = self._load_provider_data() + client = DataClient(self.config) - # Create investigation data for non-existent license + # Create investigation data for non-existent license (no license in Nebraska) investigation = InvestigationData.create_new( { - 'providerId': str(uuid4()), + 'providerId': str(provider_id), 'compact': 'aslp', - 'jurisdiction': 'oh', + 'jurisdiction': 'ne', 'licenseTypeAbbreviation': 'slp', 'licenseType': 'speech-language pathologist', 'investigationAgainst': 'license', @@ -1685,7 +1691,7 @@ def test_close_privilege_investigation_already_closed(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - investigation_id=str(investigation.investigationId), + investigation_id=investigation.investigationId, closing_user=closing_user, close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.PRIVILEGE, @@ -1696,7 +1702,7 @@ def test_close_privilege_investigation_already_closed(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - investigation_id=str(investigation.investigationId), + investigation_id=investigation.investigationId, closing_user=closing_user, close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.PRIVILEGE, @@ -1727,7 +1733,7 @@ def test_close_license_investigation_already_closed(self): 'investigationAgainst': 'license', 'submittingUser': str(uuid4()), 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), - 'investigationId': str(uuid4()), + 'investigationId': uuid4(), } ) @@ -1740,7 +1746,7 @@ def test_close_license_investigation_already_closed(self): provider_id=provider_id, jurisdiction='oh', license_type_abbreviation='slp', - investigation_id=str(investigation.investigationId), + investigation_id=investigation.investigationId, closing_user=closing_user, close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.LICENSE, @@ -1751,7 +1757,7 @@ def test_close_license_investigation_already_closed(self): provider_id=provider_id, jurisdiction='oh', license_type_abbreviation='slp', - investigation_id=str(investigation.investigationId), + investigation_id=investigation.investigationId, closing_user=closing_user, close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.LICENSE, diff --git a/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py index 7107791e5..4278fd206 100644 --- a/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py +++ b/backend/compact-connect/lambdas/python/common/tests/unit/test_data_model/test_schema/test_investigation.py @@ -97,7 +97,10 @@ def test_investigation_data_class_getters_return_expected_values(self): def test_investigation_data_class_outputs_expected_database_object(self): # check final snapshot of expected data - investigation_data = self.test_data_generator.generate_default_investigation().serialize_to_database_record() + investigation = self.test_data_generator.generate_default_investigation() + investigation_data = investigation.serialize_to_database_record() + pk = 'aslp#PROVIDER#89a6377e-c3a5-40e5-bca5-317ec854c570' + sk = 'aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#98765432-9876-9876-9876-987654321098' # Pop dynamic field investigation_data.pop('dateOfUpdate') @@ -109,15 +112,19 @@ def test_investigation_data_class_outputs_expected_database_object(self): 'creationDate': '2024-11-08T23:59:59+00:00', 'jurisdiction': 'ne', 'licenseType': 'speech-language pathologist', - 'pk': 'aslp#PROVIDER#89a6377e-c3a5-40e5-bca5-317ec854c570', + 'pk': pk, 'providerId': '89a6377e-c3a5-40e5-bca5-317ec854c570', - 'sk': 'aslp#PROVIDER#privilege/ne/slp#INVESTIGATION#98765432-9876-9876-9876-987654321098', + 'sk': sk, 'submittingUser': '12a6377e-c3a5-40e5-bca5-317ec854c556', 'type': 'investigation', }, investigation_data, ) + # Properties should be consistent with db record + self.assertEqual(pk, investigation.pk) + self.assertEqual(sk, investigation.sk) + class TestInvestigationPatchRequestSchema(TstLambdas): def test_validate_patch(self): From 321318fc2038a8f894951bd69384e16eb1f37e75 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Tue, 4 Nov 2025 16:57:43 -0700 Subject: [PATCH 24/33] Test approach refactor, PR feedback --- .../cc_common/data_model/data_client.py | 1 + .../data_model/provider_record_util.py | 22 +- .../data_model/schema/license/__init__.py | 4 + .../data_model/schema/privilege/__init__.py | 4 + .../common/cc_common/feature_flag_client.py | 2 +- .../lambdas/python/common/cc_common/utils.py | 1 + .../common/common_test/test_data_generator.py | 6 - .../common/tests/function/test_data_client.py | 14 +- .../handlers/investigation_events.py | 65 +- .../function/test_investigation_events.py | 28 +- .../provider-data-v1/handlers/bulk_upload.py | 10 +- .../provider-data-v1/handlers/encumbrance.py | 2 +- .../tests/function/__init__.py | 2 +- .../test_handlers/test_investigation.py | 649 ++++++++---------- 14 files changed, 343 insertions(+), 467 deletions(-) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index f9ab810dc..77b02aada 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -1699,6 +1699,7 @@ def create_investigation(self, investigation: InvestigationData) -> None: 'UpdateExpression': ( 'SET investigationStatus = :investigationStatus, dateOfUpdate = :dateOfUpdate' ), + 'ConditionExpression': 'attribute_exists(pk)', 'ExpressionAttributeValues': { ':investigationStatus': {'S': InvestigationStatusEnum.UNDER_INVESTIGATION}, ':dateOfUpdate': {'S': investigation.creationDate.isoformat()}, diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py index e15f4744a..6cf5b5c72 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/provider_record_util.py @@ -619,9 +619,16 @@ def get_investigation_records_for_privilege( privilege_jurisdiction: str, privilege_license_type_abbreviation: str, filter_condition: Callable[[InvestigationData], bool] | None = None, + include_closed: bool = False, ) -> list[InvestigationData]: """ Get all investigation records for a given privilege. + + :param privilege_jurisdiction: The jurisdiction of the privilege + :param privilege_license_type_abbreviation: The license type abbreviation + :param filter_condition: Optional filter function to apply to records + :param include_closed: If True, include closed investigations; otherwise only return active ones + :returns: List of investigation records matching the criteria """ return [ record @@ -629,7 +636,9 @@ def get_investigation_records_for_privilege( if record.investigationAgainst == 'privilege' and record.jurisdiction == privilege_jurisdiction and record.licenseTypeAbbreviation == privilege_license_type_abbreviation - and record.closeDate is None # Only return active investigations + and ( + include_closed or record.closeDate is None + ) # Only return active investigations unless include_closed is True and (filter_condition is None or filter_condition(record)) ] @@ -638,9 +647,16 @@ def get_investigation_records_for_license( license_jurisdiction: str, license_type_abbreviation: str, filter_condition: Callable[[InvestigationData], bool] | None = None, + include_closed: bool = False, ) -> list[InvestigationData]: """ Get all investigation records for a given license. + + :param license_jurisdiction: The jurisdiction of the license + :param license_type_abbreviation: The license type abbreviation + :param filter_condition: Optional filter function to apply to records + :param include_closed: If True, include closed investigations; otherwise only return active ones + :returns: List of investigation records matching the criteria """ return [ record @@ -648,7 +664,9 @@ def get_investigation_records_for_license( if record.investigationAgainst == 'license' and record.jurisdiction == license_jurisdiction and record.licenseTypeAbbreviation == license_type_abbreviation - and record.closeDate is None # Only return active investigations + and ( + include_closed or record.closeDate is None + ) # Only return active investigations unless include_closed is True and (filter_condition is None or filter_condition(record)) ] diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/__init__.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/__init__.py index 32e71ee7b..5672fd071 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/__init__.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/__init__.py @@ -136,6 +136,10 @@ def compactEligibility(self) -> str: def encumberedStatus(self) -> str | None: return self._data.get('encumberedStatus') + @property + def investigationStatus(self) -> str | None: + return self._data.get('investigationStatus') + class LicenseUpdateData(CCDataClass): """ diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/__init__.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/__init__.py index b08c2ed81..5425958fd 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/__init__.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/__init__.py @@ -80,6 +80,10 @@ def homeJurisdictionChangeStatus(self) -> str | None: def licenseDeactivatedStatus(self) -> str | None: return self._data.get('licenseDeactivatedStatus') + @property + def investigationStatus(self) -> str | None: + return self._data.get('investigationStatus') + @property def status(self) -> str: """ diff --git a/backend/compact-connect/lambdas/python/common/cc_common/feature_flag_client.py b/backend/compact-connect/lambdas/python/common/cc_common/feature_flag_client.py index 0b9bcaa21..2d4264fd9 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/feature_flag_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/feature_flag_client.py @@ -79,7 +79,7 @@ def is_feature_enabled( ): """ try: - logger.info("checking status of feature flag", flag_name=flag_name) + logger.info('checking status of feature flag', flag_name=flag_name) api_base_url = _get_api_base_url() endpoint_url = f'{api_base_url}/v1/flags/{flag_name}/check' diff --git a/backend/compact-connect/lambdas/python/common/cc_common/utils.py b/backend/compact-connect/lambdas/python/common/cc_common/utils.py index fc63dd13c..6693299e4 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/utils.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/utils.py @@ -850,6 +850,7 @@ def _get_recaptcha_secret() -> str: raise CCInternalException('Failed to load reCAPTCHA secret') from e return _RECAPTCHA_SECRET + def verify_recaptcha(token: str) -> bool: """Verify the reCAPTCHA token with Google's API.""" diff --git a/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py b/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py index 41ee823ca..fd2e36e83 100644 --- a/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py +++ b/backend/compact-connect/lambdas/python/common/common_test/test_data_generator.py @@ -154,12 +154,6 @@ def generate_default_adverse_action(value_overrides: dict | None = None) -> Adve @staticmethod def generate_default_investigation(value_overrides: dict | None = None) -> InvestigationData: """Generate a default investigation""" - from common_test.test_constants import ( - DEFAULT_INVESTIGATION_AGAINST_PRIVILEGE, - DEFAULT_INVESTIGATION_ID, - DEFAULT_INVESTIGATION_START_DATE, - ) - default_investigation = { 'providerId': DEFAULT_PROVIDER_ID, 'compact': DEFAULT_COMPACT, diff --git a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py index 07e52b21e..e21638808 100644 --- a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py +++ b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py @@ -1076,7 +1076,7 @@ def test_create_privilege_investigation_success(self): 'licenseType': 'speech-language pathologist', 'investigationAgainst': 'privilege', 'investigationId': str(investigation.investigationId), - 'submittingUser': str(investigation.submittingUser), + 'submittingUser': investigation.submittingUser, 'creationDate': investigation.creationDate.isoformat(), } # Pop dynamic fields that we don't want to assert on @@ -1621,7 +1621,7 @@ def test_close_privilege_investigation_not_found(self): provider_id=provider_id, jurisdiction='ne', license_type_abbreviation='slp', - investigation_id=str(uuid4()), + investigation_id=uuid4(), closing_user=str(uuid4()), close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.PRIVILEGE, @@ -1647,7 +1647,7 @@ def test_close_license_investigation_not_found(self): provider_id=provider_id, jurisdiction='oh', license_type_abbreviation='slp', - investigation_id=str(uuid4()), + investigation_id=uuid4(), closing_user=str(uuid4()), close_date=datetime.fromisoformat('2024-11-08T23:59:59+00:00'), investigation_against=InvestigationAgainstEnum.LICENSE, @@ -1678,7 +1678,7 @@ def test_close_privilege_investigation_already_closed(self): 'investigationAgainst': 'privilege', 'submittingUser': str(uuid4()), 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), - 'investigationId': str(uuid4()), + 'investigationId': uuid4(), } ) @@ -1711,7 +1711,7 @@ def test_close_privilege_investigation_already_closed(self): self.assertIn('Investigation not found', str(context.exception)) def test_close_license_investigation_already_closed(self): - """Test closing privilege investigation when investigation was already closed""" + """Test closing license investigation when investigation was already closed""" from cc_common.data_model.data_client import DataClient from cc_common.data_model.schema.common import InvestigationAgainstEnum from cc_common.data_model.schema.investigation import InvestigationData @@ -1787,7 +1787,7 @@ def test_close_privilege_investigation_with_encumbrance(self): 'investigationAgainst': 'privilege', 'submittingUser': str(uuid4()), 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), - 'investigationId': str(uuid4()), + 'investigationId': uuid4(), } ) @@ -1863,7 +1863,7 @@ def test_close_license_investigation_with_encumbrance(self): 'investigationAgainst': 'license', 'submittingUser': str(uuid4()), 'creationDate': datetime.fromisoformat('2024-11-08T23:59:59+00:00'), - 'investigationId': str(uuid4()), + 'investigationId': uuid4(), } ) diff --git a/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py b/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py index 18c63089f..e8e55c940 100644 --- a/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py +++ b/backend/compact-connect/lambdas/python/data-events/handlers/investigation_events.py @@ -1,23 +1,21 @@ +from typing import Any, Protocol from uuid import UUID from cc_common.config import config, logger from cc_common.data_model.provider_record_util import ProviderUserRecords from cc_common.data_model.schema.data_event.api import InvestigationEventDetailSchema from cc_common.data_model.schema.provider import ProviderData -from cc_common.email_service_client import InvestigationNotificationTemplateVariables, ProviderNotificationMethod +from cc_common.email_service_client import InvestigationNotificationTemplateVariables from cc_common.license_util import LicenseUtility from cc_common.utils import sqs_handler -def _get_license_type_name(compact: str, license_type_abbreviation: str) -> str: - """ - Get the license type name from abbreviation. +class JurisdictionNotificationMethod(Protocol): + """Protocol for Jurisdiction investigation notification methods.""" - :param compact: The compact identifier - :param license_type_abbreviation: The license type abbreviation - :return: The license type name - """ - return LicenseUtility.get_license_type_by_abbreviation(compact, license_type_abbreviation).name + def __call__( + self, *, compact: str, jurisdiction: str, template_variables: InvestigationNotificationTemplateVariables + ) -> dict[str, Any]: ... def _get_provider_records(compact: str, provider_id: str) -> tuple[ProviderUserRecords, ProviderData]: @@ -41,45 +39,8 @@ def _get_provider_records(compact: str, provider_id: str) -> tuple[ProviderUserR raise -def _send_provider_notification( - notification_method: ProviderNotificationMethod, - notification_type: str, - *, - provider_record: ProviderData, - compact: str, - **notification_kwargs, -) -> None: - """ - Send notification to provider if they are registered. - - :param provider_record: The provider record - :param notification_method: The email service method to call - :param notification_type: Type of notification for logging - :param compact: The compact identifier - :param notification_kwargs: Additional arguments for the notification method - """ - provider_email = provider_record.compactConnectRegisteredEmailAddress - if provider_email: - logger.info(f'Sending {notification_type} notification to provider', provider_email=provider_email) - try: - notification_method( - compact=compact, - provider_email=provider_email, - template_variables=InvestigationNotificationTemplateVariables( - provider_first_name=provider_record.givenName, - provider_last_name=provider_record.familyName, - **notification_kwargs, - ), - ) - except Exception as e: - logger.error('Failed to send provider notification', exception=str(e)) - raise - else: - logger.info('Provider not registered in system, skipping provider notification') - - def _send_primary_state_notification( - notification_method: ProviderNotificationMethod, + notification_method: JurisdictionNotificationMethod, notification_type: str, *, provider_record: ProviderData, @@ -114,7 +75,7 @@ def _send_primary_state_notification( def _send_additional_state_notifications( - notification_method: ProviderNotificationMethod, + notification_method: JurisdictionNotificationMethod, notification_type: str, *, provider_records: ProviderUserRecords, @@ -203,7 +164,7 @@ def license_investigation_notification_listener(message: dict): logger.info('Processing license investigation event') # Get license type name from abbreviation (lookup once at the top) - license_type_name = _get_license_type_name(compact, license_type_abbreviation) + license_type_name = LicenseUtility.get_license_type_by_abbreviation(compact, license_type_abbreviation).name # Get provider records to gather notification targets and provider information provider_records, provider_record = _get_provider_records(compact, provider_id) @@ -271,7 +232,7 @@ def license_investigation_closed_notification_listener(message: dict): return # Get license type name from abbreviation (lookup once at the top) - license_type_name = _get_license_type_name(compact, license_type_abbreviation) + license_type_name = LicenseUtility.get_license_type_by_abbreviation(compact, license_type_abbreviation).name # Get provider records to gather notification targets and provider information provider_records, provider_record = _get_provider_records(compact, provider_id) @@ -333,7 +294,7 @@ def privilege_investigation_notification_listener(message: dict): logger.info('Processing privilege investigation event') # Get license type name from abbreviation (lookup once at the top) - license_type_name = _get_license_type_name(compact, license_type_abbreviation) + license_type_name = LicenseUtility.get_license_type_by_abbreviation(compact, license_type_abbreviation).name # Get provider records to gather notification targets and provider information provider_records, provider_record = _get_provider_records(compact, provider_id) @@ -401,7 +362,7 @@ def privilege_investigation_closed_notification_listener(message: dict): return # Get license type name from abbreviation (lookup once at the top) - license_type_name = _get_license_type_name(compact, license_type_abbreviation) + license_type_name = LicenseUtility.get_license_type_by_abbreviation(compact, license_type_abbreviation).name # Get provider records to gather notification targets and provider information provider_records, provider_record = _get_provider_records(compact, provider_id) diff --git a/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py b/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py index 07ddbdb72..bb177d48b 100644 --- a/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py +++ b/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py @@ -94,9 +94,7 @@ def _create_sqs_event(self, message): return {'Records': [{'messageId': '123', 'body': json.dumps(message)}]} @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_state_notification_email') - def test_license_investigation_listener_processes_event_with_registered_provider( - self, mock_state_email - ): + def test_license_investigation_listener_processes_event_with_registered_provider(self, mock_state_email): """Test that license investigation listener processes events for registered providers.""" from cc_common.email_service_client import InvestigationNotificationTemplateVariables from handlers.investigation_events import license_investigation_notification_listener @@ -187,9 +185,7 @@ def test_license_investigation_listener_processes_event_with_registered_provider self.assertEqual(expected_state_calls_sorted, actual_state_calls_sorted) @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_state_notification_email') - def test_license_investigation_listener_processes_event_with_unregistered_provider( - self, mock_state_email - ): + def test_license_investigation_listener_processes_event_with_unregistered_provider(self, mock_state_email): """ Test that license investigation listener handles unregistered providers. @@ -231,9 +227,7 @@ def test_license_investigation_listener_processes_event_with_unregistered_provid @patch( 'cc_common.email_service_client.EmailServiceClient.send_license_investigation_closed_state_notification_email' ) - def test_license_investigation_closed_listener_processes_event_with_registered_provider( - self, mock_state_email - ): + def test_license_investigation_closed_listener_processes_event_with_registered_provider(self, mock_state_email): """Test that license investigation closed listener processes events for registered providers.""" from cc_common.email_service_client import InvestigationNotificationTemplateVariables from handlers.investigation_events import license_investigation_closed_notification_listener @@ -324,9 +318,7 @@ def test_license_investigation_closed_listener_processes_event_with_registered_p self.assertEqual(expected_state_calls_sorted, actual_state_calls_sorted) @patch('cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_state_notification_email') - def test_privilege_investigation_listener_processes_event_with_registered_provider( - self, mock_state_email - ): + def test_privilege_investigation_listener_processes_event_with_registered_provider(self, mock_state_email): """Test that privilege investigation listener processes events for registered providers.""" from cc_common.email_service_client import InvestigationNotificationTemplateVariables from handlers.investigation_events import privilege_investigation_notification_listener @@ -419,9 +411,7 @@ def test_privilege_investigation_listener_processes_event_with_registered_provid @patch( 'cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_closed_state_notification_email' ) - def test_privilege_investigation_closed_listener_processes_event_with_registered_provider( - self, mock_state_email - ): + def test_privilege_investigation_closed_listener_processes_event_with_registered_provider(self, mock_state_email): """Test that privilege investigation closed listener processes events for registered providers.""" from cc_common.email_service_client import InvestigationNotificationTemplateVariables from handlers.investigation_events import privilege_investigation_closed_notification_listener @@ -585,7 +575,9 @@ def test_privilege_investigation_listener_handles_email_service_failure(self, mo # Should return batch item failure for the message self.assertEqual(result['batchItemFailures'][0]['itemIdentifier'], '123') - @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_closed_state_notification_email') + @patch( + 'cc_common.email_service_client.EmailServiceClient.send_license_investigation_closed_state_notification_email' + ) def test_license_investigation_closed_listener_skips_notifications_when_encumbrance_exists(self, mock_state_email): """ Test that license investigation closed listener does NOT send notifications when adverseActionId is present. @@ -613,7 +605,9 @@ def test_license_investigation_closed_listener_skips_notifications_when_encumbra # Verify NO notifications were sent (encumbrance notification will handle it) mock_state_email.assert_not_called() - @patch('cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_closed_state_notification_email') + @patch( + 'cc_common.email_service_client.EmailServiceClient.send_privilege_investigation_closed_state_notification_email' + ) def test_privilege_investigation_closed_listener_skips_notifications_when_encumbrance_exists( self, mock_state_email ): diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/bulk_upload.py b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/bulk_upload.py index 9aff60105..7c518bac3 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/bulk_upload.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/bulk_upload.py @@ -163,11 +163,11 @@ def process_bulk_upload_file( if duplicate_ssn_check_flag_enabled: matched_ssn_index = ssns_in_file_upload.get(license_ssn) if matched_ssn_index: - raise ValidationError( - message=f'Duplicate License SSN detected. SSN matches with record ' - f'{matched_ssn_index}. Every record must have a unique SSN within the same ' - f'file.' - ) + raise ValidationError( + message=f'Duplicate License SSN detected. SSN matches with record ' + f'{matched_ssn_index}. Every record must have a unique SSN within the same ' + f'file.' + ) ssns_in_file_upload.update({license_ssn: i + 1}) except TypeError as e: # This will be raised, if `raw_license` includes compact and/or jurisdiction fields diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py index caffad9d4..ced4bcc95 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/handlers/encumbrance.py @@ -103,7 +103,7 @@ def _generate_adverse_action_for_record_type( from cc_common.feature_flag_client import FeatureFlagEnum, is_feature_enabled if is_feature_enabled(FeatureFlagEnum.ENCUMBRANCE_MULTI_CATEGORY_FLAG): - if 'clinicalPrivilegeActionCategory' in adverse_action_request: + if 'clinicalPrivilegeActionCategory' in adverse_action_post_body: # replicate data to both the deprecated and new fields adverse_action.clinicalPrivilegeActionCategory = ClinicalPrivilegeActionCategory( adverse_action_post_body['clinicalPrivilegeActionCategory'] diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/__init__.py b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/__init__.py index fac7ad579..fe0ac38f7 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/__init__.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/__init__.py @@ -22,7 +22,7 @@ class TstFunction(TstLambdas): """Base class to set up Moto mocking and create mock AWS resources for functional testing""" - def assertDictFieldsMatch(self, expected: dict, actual: dict): # noqa: N802 emulating TestCase style here + def assertDictPartialMatch(self, expected: dict, actual: dict): # noqa: N802 emulating TestCase style here for key, value in expected.items(): try: self.assertEqual(value, actual[key], f'Expected {key}: {value} but got {key}: {actual[key]}') diff --git a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py index 955e986e5..347361ac0 100644 --- a/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py +++ b/backend/compact-connect/lambdas/python/provider-data-v1/tests/function/test_handlers/test_investigation.py @@ -1,8 +1,8 @@ import json from datetime import datetime from unittest.mock import patch +from uuid import UUID -from boto3.dynamodb.conditions import Key from common_test.test_constants import ( DEFAULT_AA_SUBMITTING_USER_ID, DEFAULT_DATE_OF_UPDATE_TIMESTAMP, @@ -53,23 +53,12 @@ class TestPostPrivilegeInvestigation(TstFunction): def _load_privilege_data(self): """Load privilege test data from JSON file""" - import json - from decimal import Decimal # Load provider record first (needed for encumbrance creation) - with open('../common/tests/resources/dynamo/provider.json') as f: - provider_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=provider_record) - - # Load privilege record - with open('../common/tests/resources/dynamo/privilege.json') as f: - privilege_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=privilege_record) - - # Return the privilege data as a data class - from cc_common.data_model.schema.privilege import PrivilegeData - - return PrivilegeData.from_database_record(privilege_record) + self.test_data_generator.put_default_provider_record_in_provider_table() + privilege = self.test_data_generator.generate_default_privilege() + self.test_data_generator.store_record_in_provider_table(privilege.serialize_to_database_record()) + return privilege def _when_testing_privilege_investigation(self): test_privilege_record = self._load_privilege_data() @@ -110,48 +99,36 @@ def test_privilege_investigation_handler(self, mock_publish_event): ) # Verify that the investigation record was added to the provider data table - # Perform a query to list all investigations for the provider using the starts_with key condition - investigation_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#INVESTIGATION' - ), + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_privilege_record.compact, + provider_id=test_privilege_record.providerId, ) - self.assertEqual(1, len(investigation_records['Items'])) - item = investigation_records['Items'][0] + investigation_records = provider_user_records.get_investigation_records_for_privilege( + privilege_jurisdiction=test_privilege_record.jurisdiction, + privilege_license_type_abbreviation=test_privilege_record.licenseTypeAbbreviation, + ) + self.assertEqual(1, len(investigation_records)) + investigation = investigation_records[0] # Verify the investigation record fields expected_investigation = { 'type': 'investigation', 'compact': test_privilege_record.compact, - 'providerId': str(test_privilege_record.providerId), + 'providerId': test_privilege_record.providerId, 'jurisdiction': test_privilege_record.jurisdiction, 'licenseType': test_privilege_record.licenseType, 'investigationAgainst': 'privilege', - 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, - 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'pk': test_privilege_record.serialize_to_database_record()['pk'], - 'sk': ( - f'{test_privilege_record.compact}#PROVIDER#privilege/' - f'{test_privilege_record.jurisdiction}/slp#INVESTIGATION#{item["investigationId"]}' - ), - 'investigationId': item['investigationId'], + 'submittingUser': UUID(DEFAULT_AA_SUBMITTING_USER_ID), + 'creationDate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), + 'dateOfUpdate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), + 'investigationId': investigation.investigationId, } - self.assertEqual(expected_investigation, item) + self.assertEqual(expected_investigation, investigation.to_dict()) # Verify that the privilege record was updated to be under investigation - updated_privilege_record = self._provider_table.get_item( - Key={ - 'pk': test_privilege_record.serialize_to_database_record()['pk'], - 'sk': test_privilege_record.serialize_to_database_record()['sk'], - } - )['Item'] + updated_privilege_record = provider_user_records.get_privilege_records()[0] - self.assertEqual( - InvestigationStatusEnum.UNDER_INVESTIGATION.value, updated_privilege_record['investigationStatus'] - ) + self.assertEqual(InvestigationStatusEnum.UNDER_INVESTIGATION, updated_privilege_record.investigationStatus) # Verify that investigation objects are included in the API response api_event = self.test_data_generator.generate_test_api_event( @@ -192,7 +169,7 @@ def test_privilege_investigation_handler(self, mock_publish_event): ], } - self.assertDictFieldsMatch(expected_privilege, privilege) + self.assertDictPartialMatch(expected_privilege, privilege) # Verify event was published with correct details mock_publish_event.assert_called_once() @@ -251,23 +228,12 @@ class TestPostLicenseInvestigation(TstFunction): def _load_license_data(self): """Load license test data from JSON file""" - import json - from decimal import Decimal # Load provider record first (needed for encumbrance creation) - with open('../common/tests/resources/dynamo/provider.json') as f: - provider_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=provider_record) - - # Load license record - with open('../common/tests/resources/dynamo/license.json') as f: - license_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=license_record) - - # Return the license data as a data class - from cc_common.data_model.schema.license import LicenseData - - return LicenseData.from_database_record(license_record) + self.test_data_generator.put_default_provider_record_in_provider_table() + license_data = self.test_data_generator.generate_default_license() + self.test_data_generator.store_record_in_provider_table(license_data.serialize_to_database_record()) + return license_data def _when_testing_valid_license_investigation(self, body_overrides: dict | None = None): test_license_record = self._load_license_data() @@ -313,45 +279,36 @@ def test_license_investigation_handler(self, mock_publish_event): # Verify that the investigation record was added to the provider data table # Perform a query to list all investigations for the provider using the starts_with key condition - investigation_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#INVESTIGATION' - ), + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_license_record.compact, + provider_id=test_license_record.providerId, + ) + investigation_records = provider_user_records.get_investigation_records_for_license( + license_jurisdiction=test_license_record.jurisdiction, + license_type_abbreviation=test_license_record.licenseTypeAbbreviation, ) - self.assertEqual(1, len(investigation_records['Items'])) - item = investigation_records['Items'][0] + self.assertEqual(1, len(investigation_records)) + investigation = investigation_records[0] # Verify the investigation record fields expected_investigation = { 'type': 'investigation', 'compact': test_license_record.compact, - 'providerId': str(test_license_record.providerId), + 'providerId': test_license_record.providerId, 'jurisdiction': test_license_record.jurisdiction, 'licenseType': test_license_record.licenseType, 'investigationAgainst': 'license', - 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, - 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'pk': test_license_record.serialize_to_database_record()['pk'], - 'sk': ( - f'{test_license_record.compact}#PROVIDER#license/' - f'{test_license_record.jurisdiction}/slp#INVESTIGATION#{item["investigationId"]}' - ), - 'investigationId': item['investigationId'], + 'submittingUser': UUID(DEFAULT_AA_SUBMITTING_USER_ID), + 'creationDate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), + 'dateOfUpdate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), + 'investigationId': investigation.investigationId, } - self.assertEqual(expected_investigation, item) + self.assertEqual(expected_investigation, investigation.to_dict()) # Verify that the license record was updated to be under investigation - updated_license_record = self._provider_table.get_item( - Key={ - 'pk': test_license_record.serialize_to_database_record()['pk'], - 'sk': test_license_record.serialize_to_database_record()['sk'], - } - )['Item'] + updated_license_record = provider_user_records.get_license_records()[0] - self.assertEqual(InvestigationStatusEnum.UNDER_INVESTIGATION, updated_license_record['investigationStatus']) + self.assertEqual(InvestigationStatusEnum.UNDER_INVESTIGATION, updated_license_record.investigationStatus) # Verify that investigation objects are included in the API response api_event = self.test_data_generator.generate_test_api_event( @@ -393,7 +350,7 @@ def test_license_investigation_handler(self, mock_publish_event): ], } - self.assertDictFieldsMatch(expected_license, license_obj) + self.assertDictPartialMatch(expected_license, license_obj) # Verify event was published with correct details mock_publish_event.assert_called_once() @@ -451,24 +408,12 @@ class TestPatchPrivilegeInvestigationClose(TstFunction): """Test suite for privilege investigation close endpoints.""" def _load_privilege_data(self): - """Load privilege test data from JSON file""" - import json - from decimal import Decimal - + """Load privilege test data using test data generator""" # Load provider record first (needed for encumbrance creation) - with open('../common/tests/resources/dynamo/provider.json') as f: - provider_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=provider_record) - - # Load privilege record - with open('../common/tests/resources/dynamo/privilege.json') as f: - privilege_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=privilege_record) - - # Return the privilege data as a data class - from cc_common.data_model.schema.privilege import PrivilegeData - - return PrivilegeData.from_database_record(privilege_record) + self.test_data_generator.put_default_provider_record_in_provider_table() + privilege = self.test_data_generator.generate_default_privilege() + self.test_data_generator.store_record_in_provider_table(privilege.serialize_to_database_record()) + return privilege def _when_testing_privilege_investigation_close(self, body_overrides: dict | None = None): test_privilege_record = self._load_privilege_data() @@ -496,15 +441,17 @@ def _when_testing_privilege_investigation_close(self, body_overrides: dict | Non investigation_handler(create_event, self.mock_context) - # Get the investigation ID from the database - investigation_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#INVESTIGATION' - ), + # Get the investigation ID using the data client + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_privilege_record.compact, + provider_id=test_privilege_record.providerId, ) - investigation_id = investigation_records['Items'][0]['investigationId'] + investigation_records = provider_user_records.get_investigation_records_for_privilege( + privilege_jurisdiction=test_privilege_record.jurisdiction, + privilege_license_type_abbreviation=test_privilege_record.licenseTypeAbbreviation, + ) + self.assertEqual(1, len(investigation_records)) + investigation_id = investigation_records[0].investigationId # Now create the close event test_event = self.test_data_generator.generate_test_api_event( @@ -543,47 +490,41 @@ def test_privilege_investigation_close_handler(self, mock_publish_event): ) # Verify that the investigation record was updated - investigation_record = self._provider_table.get_item( - Key={ - 'pk': test_privilege_record.serialize_to_database_record()['pk'], - 'sk': ( - f'{test_privilege_record.compact}#PROVIDER#privilege/' - f'{test_privilege_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' - ), - } - )['Item'] + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_privilege_record.compact, + provider_id=test_privilege_record.providerId, + ) + # Get all investigation records (including closed ones) + all_investigations = provider_user_records.get_investigation_records_for_privilege( + privilege_jurisdiction=test_privilege_record.jurisdiction, + privilege_license_type_abbreviation=test_privilege_record.licenseTypeAbbreviation, + filter_condition=lambda inv: inv.investigationId == investigation_id, + include_closed=True, + ) + self.assertEqual(1, len(all_investigations)) + investigation = all_investigations[0] expected_investigation = { - 'pk': test_privilege_record.serialize_to_database_record()['pk'], - 'sk': ( - f'{test_privilege_record.compact}#PROVIDER#privilege/' - f'{test_privilege_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' - ), 'type': 'investigation', 'compact': test_privilege_record.compact, - 'providerId': str(test_privilege_record.providerId), + 'providerId': test_privilege_record.providerId, 'jurisdiction': test_privilege_record.jurisdiction, 'licenseType': test_privilege_record.licenseType, 'investigationAgainst': 'privilege', 'investigationId': investigation_id, - 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, - 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'closeDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'closingUser': DEFAULT_AA_SUBMITTING_USER_ID, - 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'submittingUser': UUID(DEFAULT_AA_SUBMITTING_USER_ID), + 'creationDate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), + 'closeDate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), + 'closingUser': UUID(DEFAULT_AA_SUBMITTING_USER_ID), + 'dateOfUpdate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), } - self.assertEqual(expected_investigation, investigation_record) + self.assertEqual(expected_investigation, investigation.to_dict()) # Verify that the privilege record no longer has investigation status - updated_privilege_record = self._provider_table.get_item( - Key={ - 'pk': test_privilege_record.serialize_to_database_record()['pk'], - 'sk': test_privilege_record.serialize_to_database_record()['sk'], - } - )['Item'] + updated_privilege_record = provider_user_records.get_privilege_records()[0] - self.assertNotIn('investigationStatus', updated_privilege_record) + self.assertIsNone(updated_privilege_record.investigationStatus) # Verify that investigation objects are removed from the API response api_event = self.test_data_generator.generate_test_api_event( @@ -642,27 +583,27 @@ def test_privilege_investigation_close_with_encumbrance_creates_encumbrance(self self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) # Verify that an encumbrance was created - encumbrance_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#ADVERSE_ACTION' - ), + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_privilege_record.compact, + provider_id=test_privilege_record.providerId, ) - self.assertEqual(1, len(encumbrance_records['Items'])) + encumbrance_records = provider_user_records.get_adverse_action_records_for_privilege( + privilege_jurisdiction=test_privilege_record.jurisdiction, + privilege_license_type_abbreviation=test_privilege_record.licenseTypeAbbreviation, + ) + self.assertEqual(1, len(encumbrance_records)) # Verify that the investigation record has the resulting encumbrance ID - investigation_record = self._provider_table.get_item( - Key={ - 'pk': test_privilege_record.serialize_to_database_record()['pk'], - 'sk': ( - f'{test_privilege_record.compact}#PROVIDER#privilege/' - f'{test_privilege_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' - ), - } - )['Item'] + all_investigations = provider_user_records.get_investigation_records_for_privilege( + privilege_jurisdiction=test_privilege_record.jurisdiction, + privilege_license_type_abbreviation=test_privilege_record.licenseTypeAbbreviation, + filter_condition=lambda inv: inv.investigationId == investigation_id, + include_closed=True, + ) + self.assertEqual(1, len(all_investigations)) + investigation = all_investigations[0] - self.assertIn('resultingEncumbranceId', investigation_record) + self.assertIsNotNone(investigation.resultingEncumbranceId) @mock_aws @@ -671,24 +612,12 @@ class TestPatchLicenseInvestigationClose(TstFunction): """Test suite for license investigation close endpoints.""" def _load_license_data(self): - """Load license test data from JSON file""" - import json - from decimal import Decimal - + """Load license test data using test data generator""" # Load provider record first (needed for encumbrance creation) - with open('../common/tests/resources/dynamo/provider.json') as f: - provider_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=provider_record) - - # Load license record - with open('../common/tests/resources/dynamo/license.json') as f: - license_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=license_record) - - # Return the license data as a data class - from cc_common.data_model.schema.license import LicenseData - - return LicenseData.from_database_record(license_record) + self.test_data_generator.put_default_provider_record_in_provider_table() + license_data = self.test_data_generator.generate_default_license() + self.test_data_generator.store_record_in_provider_table(license_data.serialize_to_database_record()) + return license_data def _when_testing_license_investigation_close(self, body_overrides: dict | None = None): test_license_record = self._load_license_data() @@ -716,15 +645,17 @@ def _when_testing_license_investigation_close(self, body_overrides: dict | None investigation_handler(create_event, self.mock_context) - # Get the investigation ID from the database - investigation_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#INVESTIGATION' - ), + # Get the investigation ID using the data client + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_license_record.compact, + provider_id=test_license_record.providerId, + ) + investigation_records = provider_user_records.get_investigation_records_for_license( + license_jurisdiction=test_license_record.jurisdiction, + license_type_abbreviation=test_license_record.licenseTypeAbbreviation, ) - investigation_id = investigation_records['Items'][0]['investigationId'] + self.assertEqual(1, len(investigation_records)) + investigation_id = investigation_records[0].investigationId # Now create the close event test_event = self.test_data_generator.generate_test_api_event( @@ -763,47 +694,41 @@ def test_license_investigation_close_handler(self, mock_publish_event): ) # Verify that the investigation record was updated - investigation_record = self._provider_table.get_item( - Key={ - 'pk': test_license_record.serialize_to_database_record()['pk'], - 'sk': ( - f'{test_license_record.compact}#PROVIDER#license/' - f'{test_license_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' - ), - } - )['Item'] + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_license_record.compact, + provider_id=test_license_record.providerId, + ) + # Get all investigation records (including closed ones) + all_investigations = provider_user_records.get_investigation_records_for_license( + license_jurisdiction=test_license_record.jurisdiction, + license_type_abbreviation=test_license_record.licenseTypeAbbreviation, + filter_condition=lambda inv: inv.investigationId == investigation_id, + include_closed=True, + ) + self.assertEqual(1, len(all_investigations)) + investigation = all_investigations[0] expected_investigation = { - 'pk': test_license_record.serialize_to_database_record()['pk'], - 'sk': ( - f'{test_license_record.compact}#PROVIDER#license/' - f'{test_license_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' - ), 'type': 'investigation', 'compact': test_license_record.compact, - 'providerId': str(test_license_record.providerId), + 'providerId': test_license_record.providerId, 'jurisdiction': test_license_record.jurisdiction, 'licenseType': test_license_record.licenseType, 'investigationAgainst': 'license', 'investigationId': investigation_id, - 'submittingUser': DEFAULT_AA_SUBMITTING_USER_ID, - 'creationDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'closeDate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, - 'closingUser': DEFAULT_AA_SUBMITTING_USER_ID, - 'dateOfUpdate': DEFAULT_DATE_OF_UPDATE_TIMESTAMP, + 'submittingUser': UUID(DEFAULT_AA_SUBMITTING_USER_ID), + 'creationDate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), + 'closeDate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), + 'closingUser': UUID(DEFAULT_AA_SUBMITTING_USER_ID), + 'dateOfUpdate': datetime.fromisoformat(DEFAULT_DATE_OF_UPDATE_TIMESTAMP), } - self.assertEqual(expected_investigation, investigation_record) + self.assertEqual(expected_investigation, investigation.to_dict()) # Verify that the license record no longer has investigation status - updated_license_record = self._provider_table.get_item( - Key={ - 'pk': test_license_record.serialize_to_database_record()['pk'], - 'sk': test_license_record.serialize_to_database_record()['sk'], - } - )['Item'] + updated_license_record = provider_user_records.get_license_records()[0] - self.assertNotIn('investigationStatus', updated_license_record) + self.assertIsNone(updated_license_record.investigationStatus) # Verify that investigation objects are removed from the API response api_event = self.test_data_generator.generate_test_api_event( @@ -862,27 +787,27 @@ def test_license_investigation_close_with_encumbrance_creates_encumbrance(self): self.assertEqual(200, response['statusCode'], msg=json.loads(response['body'])) # Verify that an encumbrance was created - encumbrance_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#ADVERSE_ACTION' - ), + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_license_record.compact, + provider_id=test_license_record.providerId, + ) + encumbrance_records = provider_user_records.get_adverse_action_records_for_license( + license_jurisdiction=test_license_record.jurisdiction, + license_type_abbreviation=test_license_record.licenseTypeAbbreviation, ) - self.assertEqual(1, len(encumbrance_records['Items'])) + self.assertEqual(1, len(encumbrance_records)) # Verify that the investigation record has the resulting encumbrance ID - investigation_record = self._provider_table.get_item( - Key={ - 'pk': test_license_record.serialize_to_database_record()['pk'], - 'sk': ( - f'{test_license_record.compact}#PROVIDER#license/' - f'{test_license_record.jurisdiction}/slp#INVESTIGATION#{investigation_id}' - ), - } - )['Item'] + all_investigations = provider_user_records.get_investigation_records_for_license( + license_jurisdiction=test_license_record.jurisdiction, + license_type_abbreviation=test_license_record.licenseTypeAbbreviation, + filter_condition=lambda inv: inv.investigationId == investigation_id, + include_closed=True, + ) + self.assertEqual(1, len(all_investigations)) + investigation = all_investigations[0] - self.assertIn('resultingEncumbranceId', investigation_record) + self.assertIsNotNone(investigation.resultingEncumbranceId) @mock_aws @@ -891,24 +816,12 @@ class TestMultipleSimultaneousPrivilegeInvestigations(TstFunction): """Test suite for multiple simultaneous privilege investigations.""" def _load_privilege_data(self): - """Load privilege test data from JSON file""" - import json - from decimal import Decimal - + """Load privilege test data using test data generator""" # Load provider record first - with open('../common/tests/resources/dynamo/provider.json') as f: - provider_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=provider_record) - - # Load privilege record - with open('../common/tests/resources/dynamo/privilege.json') as f: - privilege_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=privilege_record) - - # Return the privilege data as a data class - from cc_common.data_model.schema.privilege import PrivilegeData - - return PrivilegeData.from_database_record(privilege_record) + self.test_data_generator.put_default_provider_record_in_provider_table() + privilege = self.test_data_generator.generate_default_privilege() + self.test_data_generator.store_record_in_provider_table(privilege.serialize_to_database_record()) + return privilege @patch('cc_common.event_bus_client.EventBusClient._publish_event') def test_closing_one_of_multiple_investigations_maintains_investigation_status(self, mock_publish_event): @@ -939,14 +852,16 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s self.assertEqual(200, response['statusCode']) # Get the first investigation ID - investigation_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#INVESTIGATION' - ), + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_privilege_record.compact, + provider_id=test_privilege_record.providerId, ) - first_investigation_id = investigation_records['Items'][0]['investigationId'] + investigation_records = provider_user_records.get_investigation_records_for_privilege( + privilege_jurisdiction=test_privilege_record.jurisdiction, + privilege_license_type_abbreviation=test_privilege_record.licenseTypeAbbreviation, + ) + self.assertEqual(1, len(investigation_records)) + first_investigation_id = investigation_records[0].investigationId # Create second investigation second_investigation_event = self.test_data_generator.generate_test_api_event( @@ -968,18 +883,17 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s self.assertEqual(200, response['statusCode']) # Get the second investigation ID - investigation_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#INVESTIGATION' - ), - ) - self.assertEqual(2, len(investigation_records['Items'])) + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_privilege_record.compact, + provider_id=test_privilege_record.providerId, + ) + investigation_records = provider_user_records.get_investigation_records_for_privilege( + privilege_jurisdiction=test_privilege_record.jurisdiction, + privilege_license_type_abbreviation=test_privilege_record.licenseTypeAbbreviation, + ) + self.assertEqual(2, len(investigation_records)) second_investigation_id = [ - item['investigationId'] - for item in investigation_records['Items'] - if item['investigationId'] != first_investigation_id + inv.investigationId for inv in investigation_records if inv.investigationId != first_investigation_id ][0] # Close the second investigation @@ -994,7 +908,7 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s 'providerId': str(test_privilege_record.providerId), 'jurisdiction': test_privilege_record.jurisdiction, 'licenseType': test_privilege_record.licenseTypeAbbreviation, - 'investigationId': second_investigation_id, + 'investigationId': str(second_investigation_id), }, 'body': json.dumps({}), }, @@ -1004,16 +918,15 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s self.assertEqual(200, response['statusCode']) # Verify that the privilege record still shows under investigation - updated_privilege_record = self._provider_table.get_item( - Key={ - 'pk': test_privilege_record.serialize_to_database_record()['pk'], - 'sk': test_privilege_record.serialize_to_database_record()['sk'], - } - )['Item'] + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_privilege_record.compact, + provider_id=test_privilege_record.providerId, + ) + updated_privilege_record = provider_user_records.get_privilege_records()[0] self.assertEqual( - InvestigationStatusEnum.UNDER_INVESTIGATION.value, - updated_privilege_record['investigationStatus'], + InvestigationStatusEnum.UNDER_INVESTIGATION, + updated_privilege_record.investigationStatus, ) # Verify that one investigation is still visible in the API response @@ -1036,25 +949,25 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s privilege = provider_data['privileges'][0] self.assertEqual(1, len(privilege['investigations'])) - self.assertEqual(first_investigation_id, privilege['investigations'][0]['investigationId']) + self.assertEqual(str(first_investigation_id), privilege['investigations'][0]['investigationId']) - # Verify that there are two INVESTIGATION update records in the DB - update_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#UPDATE#' - ), - )['Items'] + # Verify that there are two INVESTIGATION update records + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_privilege_record.compact, + provider_id=test_privilege_record.providerId, + ) + update_records = provider_user_records.get_update_records_for_privilege( + jurisdiction=test_privilege_record.jurisdiction, license_type=test_privilege_record.licenseType + ) investigation_update_records = [ - record for record in update_records if record['updateType'] == UpdateCategory.INVESTIGATION + record for record in update_records if record.updateType == UpdateCategory.INVESTIGATION ] self.assertEqual(2, len(investigation_update_records)) # Verify that there are no CLOSING_INVESTIGATION update records closing_update_records = [ - record for record in update_records if record['updateType'] == UpdateCategory.CLOSING_INVESTIGATION + record for record in update_records if record.updateType == UpdateCategory.CLOSING_INVESTIGATION ] self.assertEqual(0, len(closing_update_records)) @@ -1076,7 +989,7 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s 'providerId': str(test_privilege_record.providerId), 'jurisdiction': test_privilege_record.jurisdiction, 'licenseType': test_privilege_record.licenseTypeAbbreviation, - 'investigationId': first_investigation_id, + 'investigationId': str(first_investigation_id), }, 'body': json.dumps({}), }, @@ -1086,14 +999,13 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s self.assertEqual(200, response['statusCode']) # Verify that the privilege record no longer has investigation status - updated_privilege_record = self._provider_table.get_item( - Key={ - 'pk': test_privilege_record.serialize_to_database_record()['pk'], - 'sk': test_privilege_record.serialize_to_database_record()['sk'], - } - )['Item'] + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_privilege_record.compact, + provider_id=test_privilege_record.providerId, + ) + updated_privilege_record = provider_user_records.get_privilege_records()[0] - self.assertNotIn('investigationStatus', updated_privilege_record) + self.assertIsNone(updated_privilege_record.investigationStatus) # Verify that there are no investigations visible in the API response api_response = get_provider(api_event, self.mock_context) @@ -1104,23 +1016,23 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s self.assertEqual(0, len(privilege['investigations'])) - # Verify that there are still two INVESTIGATION update records in the DB - update_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_privilege_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_privilege_record.compact}#PROVIDER#privilege/{test_privilege_record.jurisdiction}/slp#UPDATE#' - ), - )['Items'] + # Verify that there are still two INVESTIGATION update records + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_privilege_record.compact, + provider_id=test_privilege_record.providerId, + ) + update_records = provider_user_records.get_update_records_for_privilege( + jurisdiction=test_privilege_record.jurisdiction, license_type=test_privilege_record.licenseType + ) investigation_update_records = [ - record for record in update_records if record['updateType'] == UpdateCategory.INVESTIGATION + record for record in update_records if record.updateType == UpdateCategory.INVESTIGATION ] self.assertEqual(2, len(investigation_update_records)) - # Verify that there is one CLOSING_INVESTIGATION update record in the DB + # Verify that there is one CLOSING_INVESTIGATION update record closing_update_records = [ - record for record in update_records if record['updateType'] == UpdateCategory.CLOSING_INVESTIGATION + record for record in update_records if record.updateType == UpdateCategory.CLOSING_INVESTIGATION ] self.assertEqual(1, len(closing_update_records)) @@ -1137,24 +1049,12 @@ class TestMultipleSimultaneousLicenseInvestigations(TstFunction): """Test suite for multiple simultaneous license investigations.""" def _load_license_data(self): - """Load license test data from JSON file""" - import json - from decimal import Decimal - + """Load license test data using test data generator""" # Load provider record first - with open('../common/tests/resources/dynamo/provider.json') as f: - provider_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=provider_record) - - # Load license record - with open('../common/tests/resources/dynamo/license.json') as f: - license_record = json.load(f, parse_float=Decimal) - self._provider_table.put_item(Item=license_record) - - # Return the license data as a data class - from cc_common.data_model.schema.license import LicenseData - - return LicenseData.from_database_record(license_record) + self.test_data_generator.put_default_provider_record_in_provider_table() + license_data = self.test_data_generator.generate_default_license() + self.test_data_generator.store_record_in_provider_table(license_data.serialize_to_database_record()) + return license_data @patch('cc_common.event_bus_client.EventBusClient._publish_event') def test_closing_one_of_multiple_investigations_maintains_investigation_status(self, mock_publish_event): @@ -1185,14 +1085,16 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s self.assertEqual(200, response['statusCode']) # Get the first investigation ID - investigation_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#INVESTIGATION' - ), + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_license_record.compact, + provider_id=test_license_record.providerId, + ) + investigation_records = provider_user_records.get_investigation_records_for_license( + license_jurisdiction=test_license_record.jurisdiction, + license_type_abbreviation=test_license_record.licenseTypeAbbreviation, ) - first_investigation_id = investigation_records['Items'][0]['investigationId'] + self.assertEqual(1, len(investigation_records)) + first_investigation_id = investigation_records[0].investigationId # Create second investigation second_investigation_event = self.test_data_generator.generate_test_api_event( @@ -1214,18 +1116,17 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s self.assertEqual(200, response['statusCode']) # Get the second investigation ID - investigation_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#INVESTIGATION' - ), - ) - self.assertEqual(2, len(investigation_records['Items'])) + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_license_record.compact, + provider_id=test_license_record.providerId, + ) + investigation_records = provider_user_records.get_investigation_records_for_license( + license_jurisdiction=test_license_record.jurisdiction, + license_type_abbreviation=test_license_record.licenseTypeAbbreviation, + ) + self.assertEqual(2, len(investigation_records)) second_investigation_id = [ - item['investigationId'] - for item in investigation_records['Items'] - if item['investigationId'] != first_investigation_id + inv.investigationId for inv in investigation_records if inv.investigationId != first_investigation_id ][0] # Close the second investigation @@ -1240,7 +1141,7 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s 'providerId': str(test_license_record.providerId), 'jurisdiction': test_license_record.jurisdiction, 'licenseType': test_license_record.licenseTypeAbbreviation, - 'investigationId': second_investigation_id, + 'investigationId': str(second_investigation_id), }, 'body': json.dumps({}), }, @@ -1250,16 +1151,15 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s self.assertEqual(200, response['statusCode']) # Verify that the license record still shows under investigation - updated_license_record = self._provider_table.get_item( - Key={ - 'pk': test_license_record.serialize_to_database_record()['pk'], - 'sk': test_license_record.serialize_to_database_record()['sk'], - } - )['Item'] + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_license_record.compact, + provider_id=test_license_record.providerId, + ) + updated_license_record = provider_user_records.get_license_records()[0] self.assertEqual( InvestigationStatusEnum.UNDER_INVESTIGATION, - updated_license_record['investigationStatus'], + updated_license_record.investigationStatus, ) # Verify that one investigation is still visible in the API response @@ -1282,25 +1182,25 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s license_obj = provider_data['licenses'][0] self.assertEqual(1, len(license_obj['investigations'])) - self.assertEqual(first_investigation_id, license_obj['investigations'][0]['investigationId']) + self.assertEqual(str(first_investigation_id), license_obj['investigations'][0]['investigationId']) - # Verify that there are two INVESTIGATION update records in the DB - update_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#UPDATE#' - ), - )['Items'] + # Verify that there are two INVESTIGATION update records + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_license_record.compact, + provider_id=test_license_record.providerId, + ) + update_records = provider_user_records.get_update_records_for_license( + jurisdiction=test_license_record.jurisdiction, license_type=test_license_record.licenseType + ) investigation_update_records = [ - record for record in update_records if record['updateType'] == UpdateCategory.INVESTIGATION + record for record in update_records if record.updateType == UpdateCategory.INVESTIGATION ] self.assertEqual(2, len(investigation_update_records)) # Verify that there are no CLOSING_INVESTIGATION update records closing_update_records = [ - record for record in update_records if record['updateType'] == UpdateCategory.CLOSING_INVESTIGATION + record for record in update_records if record.updateType == UpdateCategory.CLOSING_INVESTIGATION ] self.assertEqual(0, len(closing_update_records)) @@ -1322,7 +1222,7 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s 'providerId': str(test_license_record.providerId), 'jurisdiction': test_license_record.jurisdiction, 'licenseType': test_license_record.licenseTypeAbbreviation, - 'investigationId': first_investigation_id, + 'investigationId': str(first_investigation_id), }, 'body': json.dumps({}), }, @@ -1332,14 +1232,13 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s self.assertEqual(200, response['statusCode']) # Verify that the license record no longer has investigation status - updated_license_record = self._provider_table.get_item( - Key={ - 'pk': test_license_record.serialize_to_database_record()['pk'], - 'sk': test_license_record.serialize_to_database_record()['sk'], - } - )['Item'] + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_license_record.compact, + provider_id=test_license_record.providerId, + ) + updated_license_record = provider_user_records.get_license_records()[0] - self.assertNotIn('investigationStatus', updated_license_record) + self.assertIsNone(updated_license_record.investigationStatus) # Verify that there are no investigations visible in the API response api_response = get_provider(api_event, self.mock_context) @@ -1350,23 +1249,23 @@ def test_closing_one_of_multiple_investigations_maintains_investigation_status(s self.assertEqual(0, len(license_obj['investigations'])) - # Verify that there are still two INVESTIGATION update records in the DB - update_records = self._provider_table.query( - Select='ALL_ATTRIBUTES', - KeyConditionExpression=Key('pk').eq(test_license_record.serialize_to_database_record()['pk']) - & Key('sk').begins_with( - f'{test_license_record.compact}#PROVIDER#license/{test_license_record.jurisdiction}/slp#UPDATE#' - ), - )['Items'] + # Verify that there are still two INVESTIGATION update records + provider_user_records = self.config.data_client.get_provider_user_records( + compact=test_license_record.compact, + provider_id=test_license_record.providerId, + ) + update_records = provider_user_records.get_update_records_for_license( + jurisdiction=test_license_record.jurisdiction, license_type=test_license_record.licenseType + ) investigation_update_records = [ - record for record in update_records if record['updateType'] == UpdateCategory.INVESTIGATION + record for record in update_records if record.updateType == UpdateCategory.INVESTIGATION ] self.assertEqual(2, len(investigation_update_records)) - # Verify that there is one CLOSING_INVESTIGATION update record in the DB + # Verify that there is one CLOSING_INVESTIGATION update record closing_update_records = [ - record for record in update_records if record['updateType'] == UpdateCategory.CLOSING_INVESTIGATION + record for record in update_records if record.updateType == UpdateCategory.CLOSING_INVESTIGATION ] self.assertEqual(1, len(closing_update_records)) From 36e6c85698de2c2e9a4d9679b88a815f5c289b7c Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 5 Nov 2025 11:40:24 -0700 Subject: [PATCH 25/33] Add context vars for AppStack --- backend/compact-connect-ui-app/cdk.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/compact-connect-ui-app/cdk.json b/backend/compact-connect-ui-app/cdk.json index aa3a63520..eb0afd114 100644 --- a/backend/compact-connect-ui-app/cdk.json +++ b/backend/compact-connect-ui-app/cdk.json @@ -19,6 +19,19 @@ "project": "compact-connect", "service": "ui-app" }, + "jurisdictions": [ + "al", "ak", "az", "ar", "ca", "co", "ct", "de", "dc", "fl", + "ga", "hi", "id", "il", "in", "ia", "ks", "ky", "la", "me", + "md", "ma", "mi", "mn", "ms", "mo", "mt", "ne", "nv", "nh", + "nj", "nm", "ny", "nc", "nd", "oh", "ok", "or", "pa", "pr", + "ri", "sc", "sd", "tn", "tx", "ut", "vt", "va", "vi", "wa", + "wv", "wi", "wy" + ], + "compacts": [ + "aslp", + "octp", + "coun" + ], "@aws-cdk/aws-lambda:recognizeLayerVersion": true, "@aws-cdk/core:checkSecretUsage": true, "@aws-cdk/core:target-partitions": [ From 93e04bda2e8282ce208b06fc400074958728fb4c Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 5 Nov 2025 11:44:37 -0700 Subject: [PATCH 26/33] Downgrade pip for cc-ui --- .github/workflows/check-compact-connect-ui-app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-compact-connect-ui-app.yml b/.github/workflows/check-compact-connect-ui-app.yml index 6cb7e62e9..aaa478073 100644 --- a/.github/workflows/check-compact-connect-ui-app.yml +++ b/.github/workflows/check-compact-connect-ui-app.yml @@ -103,7 +103,7 @@ jobs: run: "pip install -r backend/compact-connect-ui-app/requirements-dev.txt" - name: Install all Python dependencies - run: "cd backend/compact-connect-ui-app; bin/sync_deps.sh" + run: "cd backend/compact-connect; pip install -U 'pip<25.3'; bin/sync_deps.sh" - name: Test backend run: "cd backend/compact-connect-ui-app; bin/run_tests.sh -l all -no" From 23066164aa2519f35d8e4c0754c7ce8391986820 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 5 Nov 2025 13:03:34 -0700 Subject: [PATCH 27/33] Small fixes --- backend/compact-connect-ui-app/cdk.json | 13 +++++++++++++ .../common/tests/function/test_data_client.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/backend/compact-connect-ui-app/cdk.json b/backend/compact-connect-ui-app/cdk.json index eb0afd114..e272e7b0f 100644 --- a/backend/compact-connect-ui-app/cdk.json +++ b/backend/compact-connect-ui-app/cdk.json @@ -27,6 +27,19 @@ "ri", "sc", "sd", "tn", "tx", "ut", "vt", "va", "vi", "wa", "wv", "wi", "wy" ], + "license_types": { + "aslp": [ + {"name": "audiologist", "abbreviation": "aud"}, + {"name": "speech-language pathologist", "abbreviation": "slp"} + ], + "octp": [ + {"name": "occupational therapist", "abbreviation": "ot"}, + {"name": "occupational therapy assistant", "abbreviation": "ota"} + ], + "coun": [ + {"name": "licensed professional counselor", "abbreviation": "lpc"} + ] + }, "compacts": [ "aslp", "octp", diff --git a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py index e21638808..1599702ce 100644 --- a/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py +++ b/backend/compact-connect/lambdas/python/common/tests/function/test_data_client.py @@ -1076,7 +1076,7 @@ def test_create_privilege_investigation_success(self): 'licenseType': 'speech-language pathologist', 'investigationAgainst': 'privilege', 'investigationId': str(investigation.investigationId), - 'submittingUser': investigation.submittingUser, + 'submittingUser': str(investigation.submittingUser), 'creationDate': investigation.creationDate.isoformat(), } # Pop dynamic fields that we don't want to assert on From e6fd068b2b94382e0902f515d72ca6314e4eb73e Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 5 Nov 2025 21:49:14 -0700 Subject: [PATCH 28/33] PR review tweaks --- .../lambdas/python/common/cc_common/data_model/data_client.py | 4 ++-- .../compact-connect/lambdas/python/common/cc_common/utils.py | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index 77b02aada..b8e5e48f3 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -1768,7 +1768,7 @@ def close_investigation( open_investigations = provider_records.get_investigation_records_for_license( jurisdiction, license_type_abbreviation, - lambda inv: inv.closeDate is None and inv.investigationId != investigation_id, + filter_condition=lambda inv: inv.closeDate is None and inv.investigationId != investigation_id, ) investigation = next( ( @@ -1792,7 +1792,7 @@ def close_investigation( open_investigations = provider_records.get_investigation_records_for_privilege( jurisdiction, license_type_abbreviation, - lambda inv: inv.closeDate is None and inv.investigationId != investigation_id, + filter_condition=lambda inv: inv.closeDate is None and inv.investigationId != investigation_id, ) investigation = next( ( diff --git a/backend/compact-connect/lambdas/python/common/cc_common/utils.py b/backend/compact-connect/lambdas/python/common/cc_common/utils.py index 6693299e4..3ef6e40f8 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/utils.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/utils.py @@ -914,6 +914,9 @@ def verify_password(hashed_password: str, password: str) -> bool: def to_uuid(uuid: str, on_error: str) -> UUID: + """ + Parse a str to a UUID, raising CCInvalidRequestException if invalid. + """ try: return UUID(uuid) except ValueError as e: From 0f976a930feced3e08ab2a648d3b523d46b9e495 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 5 Nov 2025 21:58:39 -0700 Subject: [PATCH 29/33] More PR review tweaks --- .../python/common/cc_common/data_model/data_client.py | 2 +- .../lambdas/python/common/cc_common/utils.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index b8e5e48f3..ea73286c2 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -2046,7 +2046,7 @@ def lift_privilege_encumbrance( def lift_license_encumbrance( self, compact: str, - provider_id: str, + provider_id: UUID, jurisdiction: str, license_type_abbreviation: str, adverse_action_id: UUID, diff --git a/backend/compact-connect/lambdas/python/common/cc_common/utils.py b/backend/compact-connect/lambdas/python/common/cc_common/utils.py index 3ef6e40f8..31278927d 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/utils.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/utils.py @@ -916,6 +916,15 @@ def verify_password(hashed_password: str, password: str) -> bool: def to_uuid(uuid: str, on_error: str) -> UUID: """ Parse a str to a UUID, raising CCInvalidRequestException if invalid. + + This should be used for all UUID path parameters to validate and normalize + input before processing, preventing malformed UUIDs from causing unexpected + errors deeper in the application. + + :param str uuid: The string representation of a UUID to parse + :param str on_error: Custom error message to include in the exception + :return: A validated UUID object + :raises CCInvalidRequestException: If the string is not a valid UUID """ try: return UUID(uuid) From 73ba4ed3e02774bf6e4cb6e3ebc5bd3c78c56d92 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Wed, 5 Nov 2025 22:10:39 -0700 Subject: [PATCH 30/33] Use more filter_condition kwargs --- .../python/common/cc_common/data_model/data_client.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index ea73286c2..9f75b2207 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -1774,7 +1774,9 @@ def close_investigation( ( inv for inv in provider_records.get_investigation_records_for_license( - jurisdiction, license_type_abbreviation, lambda inv: inv.investigationId == investigation_id + jurisdiction, + license_type_abbreviation, + filter_condition=lambda inv: inv.investigationId == investigation_id ) ), None, @@ -1798,7 +1800,9 @@ def close_investigation( ( inv for inv in provider_records.get_investigation_records_for_privilege( - jurisdiction, license_type_abbreviation, lambda inv: inv.investigationId == investigation_id + jurisdiction, + license_type_abbreviation, + filter_condition=lambda inv: inv.investigationId == investigation_id ) ), None, From 55148a068c37049fb02cd5983078e6b64867c6f5 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Fri, 7 Nov 2025 23:00:22 -0700 Subject: [PATCH 31/33] PR feedback --- .../cc_common/data_model/data_client.py | 6 +-- .../cc_common/data_model/schema/fields.py | 8 +++- .../data_model/schema/privilege/api.py | 11 ++++- .../common/cc_common/email_service_client.py | 2 +- .../function/test_investigation_events.py | 40 ------------------- 5 files changed, 19 insertions(+), 48 deletions(-) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py index 9f75b2207..4cb052a8e 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py @@ -1768,7 +1768,7 @@ def close_investigation( open_investigations = provider_records.get_investigation_records_for_license( jurisdiction, license_type_abbreviation, - filter_condition=lambda inv: inv.closeDate is None and inv.investigationId != investigation_id, + filter_condition=lambda inv: inv.investigationId != investigation_id, ) investigation = next( ( @@ -1776,7 +1776,7 @@ def close_investigation( for inv in provider_records.get_investigation_records_for_license( jurisdiction, license_type_abbreviation, - filter_condition=lambda inv: inv.investigationId == investigation_id + filter_condition=lambda inv: inv.investigationId == investigation_id, ) ), None, @@ -1802,7 +1802,7 @@ def close_investigation( for inv in provider_records.get_investigation_records_for_privilege( jurisdiction, license_type_abbreviation, - filter_condition=lambda inv: inv.investigationId == investigation_id + filter_condition=lambda inv: inv.investigationId == investigation_id, ) ), None, diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/fields.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/fields.py index c6b1df85d..eb4675bfa 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/fields.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/fields.py @@ -1,5 +1,5 @@ from marshmallow.fields import Decimal, List, String -from marshmallow.validate import OneOf, Range, Regexp +from marshmallow.validate import OneOf, Range, Regexp, Validator from cc_common.config import config from cc_common.data_model.schema.common import ( @@ -69,7 +69,11 @@ def __init__(self, *args, **kwargs): class UpdateType(String): def __init__(self, *args, **kwargs): - super().__init__(*args, validate=OneOf([entry.value for entry in UpdateCategory]), **kwargs) + # Merge any provided validators with our new desired one + validate = kwargs.pop('validate', []) + if isinstance(validate, Validator): + validate = [validate] + super().__init__(*args, validate=[OneOf([entry.value for entry in UpdateCategory]), *validate], **kwargs) class LicenseEncumberedStatusField(String): diff --git a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py index 259cd97c2..659faa3a6 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/api.py @@ -1,13 +1,14 @@ # ruff: noqa: N801, N815, ARG002 invalid-name unused-argument from marshmallow import Schema from marshmallow.fields import List, Nested, Raw, String -from marshmallow.validate import Length +from marshmallow.validate import ContainsNoneOf, Length from cc_common.data_model.schema.adverse_action.api import ( AdverseActionGeneralResponseSchema, AdverseActionPublicResponseSchema, ) from cc_common.data_model.schema.base_record import ForgivingSchema +from cc_common.data_model.schema.common import UpdateCategory from cc_common.data_model.schema.fields import ( ActiveInactive, Compact, @@ -166,7 +167,13 @@ class PrivilegeHistoryEventResponseSchema(ForgivingSchema): """ type = String(required=True, allow_none=False) - updateType = UpdateType(required=True, allow_none=False) + # We specifically prohibit returning investigation updates as a backup protection from accidental + # disclosure via the API + updateType = UpdateType( + required=True, + allow_none=False, + validate=ContainsNoneOf((UpdateCategory.INVESTIGATION, UpdateCategory.CLOSING_INVESTIGATION)), + ) dateOfUpdate = Raw(required=True, allow_none=False) effectiveDate = Raw(required=True, allow_none=False) createDate = Raw(required=True, allow_none=False) diff --git a/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py b/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py index 8213afcaf..8c8edc6d9 100644 --- a/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py +++ b/backend/compact-connect/lambdas/python/common/cc_common/email_service_client.py @@ -34,7 +34,7 @@ class InvestigationNotificationTemplateVariables: provider_last_name: str investigation_jurisdiction: str license_type: str - provider_id: UUID | None = None + provider_id: UUID class ProviderNotificationMethod(Protocol): diff --git a/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py b/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py index bb177d48b..526f111b2 100644 --- a/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py +++ b/backend/compact-connect/lambdas/python/data-events/tests/function/test_investigation_events.py @@ -184,46 +184,6 @@ def test_license_investigation_listener_processes_event_with_registered_provider self.assertEqual(expected_state_calls_sorted, actual_state_calls_sorted) - @patch('cc_common.email_service_client.EmailServiceClient.send_license_investigation_state_notification_email') - def test_license_investigation_listener_processes_event_with_unregistered_provider(self, mock_state_email): - """ - Test that license investigation listener handles unregistered providers. - - Note: An unregistered provider holding a license should not be possible in our system. - This test is just stressing the limits of our investigation logic, to make sure it handles it gracefully. - """ - from cc_common.email_service_client import InvestigationNotificationTemplateVariables - from handlers.investigation_events import license_investigation_notification_listener - - # Set up test data with unregistered provider (no email) - self.test_data_generator.put_default_provider_record_in_provider_table(is_registered=False) - - # Add the license that is under investigation - self.test_data_generator.put_default_license_record_in_provider_table() - - message = self._generate_license_investigation_message() - event = self._create_sqs_event(message) - - # Execute the handler - result = license_investigation_notification_listener(event, self.mock_context) - - # Should succeed with no batch failures - self.assertEqual({'batchItemFailures': []}, result) - - # Verify state notification was still sent - # Note: We do NOT send provider notifications for investigations - mock_state_email.assert_called_once_with( - compact=DEFAULT_COMPACT, - jurisdiction=DEFAULT_LICENSE_JURISDICTION, - template_variables=InvestigationNotificationTemplateVariables( - provider_first_name='Björk', - provider_last_name='Guðmundsdóttir', - investigation_jurisdiction=DEFAULT_LICENSE_JURISDICTION, - license_type='speech-language pathologist', - provider_id=UUID(DEFAULT_PROVIDER_ID), - ), - ) - @patch( 'cc_common.email_service_client.EmailServiceClient.send_license_investigation_closed_state_notification_email' ) From 28d0b0ecc15649375c8c77acf5ede94dd6648808 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Mon, 10 Nov 2025 13:09:44 -0700 Subject: [PATCH 32/33] Add `action: close` PATCH body field --- .../docs/api-specification/latest-oas30.json | 55 --- .../api-specification/latest-oas30.json | 164 ++++--- .../internal/postman/postman-collection.json | 410 +++++++++++------- .../docs/postman/postman-collection.json | 34 +- .../stacks/api_stack/v1_api/api_model.py | 4 + ..._LICENSE_INVESTIGATION_REQUEST_SCHEMA.json | 9 + ...RIVILEGE_INVESTIGATION_REQUEST_SCHEMA.json | 9 + .../tests/smoke/investigation_smoke_tests.py | 9 +- 8 files changed, 411 insertions(+), 283 deletions(-) diff --git a/backend/compact-connect/docs/api-specification/latest-oas30.json b/backend/compact-connect/docs/api-specification/latest-oas30.json index f5e64b53a..b1996174f 100644 --- a/backend/compact-connect/docs/api-specification/latest-oas30.json +++ b/backend/compact-connect/docs/api-specification/latest-oas30.json @@ -10,61 +10,6 @@ } ], "paths": { - "/v1/public/jurisdictions/live": { - "get": { - "summary": "Get live jurisdictions", - "description": "Returns all jurisdictions that are live (enabled for operations) across all compacts or for a specific compact if the optional compact query parameter is provided.", - "parameters": [ - { - "name": "compact", - "in": "query", - "required": false, - "description": "Optional compact abbreviation to filter results. If not provided, returns data for all compacts. If an invalid compact is provided, returns a 400 error.", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "200 response - Returns a dictionary with compact abbreviations as keys and arrays of live jurisdiction postal abbreviations as values", - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } - }, - "example": { - "aslp": ["co", "ne", "wy"], - "octp": ["ak", "ky"] - } - } - } - } - }, - "400": { - "description": "400 response - Invalid compact abbreviation provided", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Invalid request query param: invalid_compact" - } - } - } - } - } - } - } - } - }, "/v1/compacts/{compact}/jurisdictions/{jurisdiction}/licenses": { "post": { "parameters": [ diff --git a/backend/compact-connect/docs/internal/api-specification/latest-oas30.json b/backend/compact-connect/docs/internal/api-specification/latest-oas30.json index 37687cd97..8abe15b1f 100644 --- a/backend/compact-connect/docs/internal/api-specification/latest-oas30.json +++ b/backend/compact-connect/docs/internal/api-specification/latest-oas30.json @@ -2,7 +2,7 @@ "openapi": "3.0.1", "info": { "title": "LicenseApi", - "version": "2025-10-25T20:22:36Z" + "version": "2025-11-10T18:53:58Z" }, "servers": [ { @@ -10,61 +10,6 @@ } ], "paths": { - "/v1/public/jurisdictions/live": { - "get": { - "summary": "Get live jurisdictions", - "description": "Returns all jurisdictions that are live (enabled for operations) across all compacts or for a specific compact if the optional compact query parameter is provided.", - "parameters": [ - { - "name": "compact", - "in": "query", - "required": false, - "description": "Optional compact abbreviation to filter results. If not provided, returns data for all compacts. If an invalid compact is provided, returns a 400 error.", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "200 response - Returns a dictionary with compact abbreviations as keys and arrays of live jurisdiction postal abbreviations as values", - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } - }, - "example": { - "aslp": ["co", "ne", "wy"], - "octp": ["ak", "ky"] - } - } - } - } - }, - "400": { - "description": "400 response - Invalid compact abbreviation provided", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string", - "example": "Invalid request query param: invalid_compact" - } - } - } - } - } - } - } - } - }, "/v1/compacts/{compact}": { "get": { "parameters": [ @@ -2855,6 +2800,31 @@ } } }, + "/v1/public/jurisdictions/live": { + "get": { + "parameters": [ + { + "name": "compact", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SandboLicenZdwYMaXuEYs6" + } + } + } + } + } + } + }, "/v1/purchases/privileges": { "post": { "parameters": [ @@ -3046,8 +3016,17 @@ "additionalProperties": false }, "SandboLicenvJ6cvnUE8Wwa": { + "required": [ + "action" + ], "type": "object", "properties": { + "action": { + "type": "string", + "enum": [ + "close" + ] + }, "encumbrance": { "required": [ "encumbranceEffectiveDate", @@ -5421,8 +5400,17 @@ "additionalProperties": false }, "SandboLicenmwNUQ4l5yt99": { + "required": [ + "action" + ], "type": "object", "properties": { + "action": { + "type": "string", + "enum": [ + "close" + ] + }, "encumbrance": { "required": [ "encumbranceEffectiveDate", @@ -5978,6 +5966,70 @@ }, "additionalProperties": false }, + "SandboLicenZdwYMaXuEYs6": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "al", + "ak", + "az", + "ar", + "ca", + "co", + "ct", + "de", + "dc", + "fl", + "ga", + "hi", + "id", + "il", + "in", + "ia", + "ks", + "ky", + "la", + "me", + "md", + "ma", + "mi", + "mn", + "ms", + "mo", + "mt", + "ne", + "nv", + "nh", + "nj", + "nm", + "ny", + "nc", + "nd", + "oh", + "ok", + "or", + "pa", + "pr", + "ri", + "sc", + "sd", + "tn", + "tx", + "ut", + "vt", + "va", + "vi", + "wa", + "wv", + "wi", + "wy" + ] + } + } + }, "SandboLiceng72nqBB23bmL": { "required": [ "transactionId" diff --git a/backend/compact-connect/docs/internal/postman/postman-collection.json b/backend/compact-connect/docs/internal/postman/postman-collection.json index 95d30af5f..5c35dd33a 100644 --- a/backend/compact-connect/docs/internal/postman/postman-collection.json +++ b/backend/compact-connect/docs/internal/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "179bef81-c814-4f39-b68f-25eae581d972", + "_postman_id": "7cb454e4-7ab1-426a-9dda-b7b0ed228704", "description": { "content": "", "type": "text/plain" @@ -401,7 +401,7 @@ "item": [ { "event": [], - "id": "09f8047e-7146-4010-9338-bf44e22fa398", + "id": "c1b1d849-13b2-4f67-baac-6234dcd7b77c", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -444,7 +444,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"nv\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"mn\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}", + "body": "{\n \"compactAbbr\": \"\",\n \"compactAdverseActionsNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactName\": \"\",\n \"compactOperationsTeamEmails\": [\n \"\",\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\",\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"wa\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"va\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}", "code": 200, "cookie": [], "header": [ @@ -453,7 +453,7 @@ "value": "application/json" } ], - "id": "b8fb575d-d1c3-41b2-b124-b648d65ad31b", + "id": "3cd40a5c-9778-49c5-ac94-0a9bc9d477c5", "name": "200 response", "originalRequest": { "body": {}, @@ -491,7 +491,7 @@ }, { "event": [], - "id": "641f8416-56ba-44a0-9207-1197b3da2a97", + "id": "3568af2c-3a8b-4a0a-992a-f90b1f5b6685", "name": "/v1/compacts/:compact", "protocolProfileBehavior": { "disableBodyPruning": true @@ -505,7 +505,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"mo\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ca\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ar\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"sd\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" }, "description": {}, "header": [ @@ -556,7 +556,7 @@ "value": "application/json" } ], - "id": "03c1416d-2792-4aba-9863-fe7209e488ca", + "id": "f50a3dc3-9641-4ae0-8050-d33c19c7970e", "name": "200 response", "originalRequest": { "body": { @@ -567,7 +567,7 @@ "language": "json" } }, - "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"mo\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ca\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" + "raw": "{\n \"compactAdverseActionsNotificationEmails\": [\n \"\"\n ],\n \"compactCommissionFee\": {\n \"feeAmount\": \"\",\n \"feeType\": \"FLAT_RATE\"\n },\n \"compactOperationsTeamEmails\": [\n \"\"\n ],\n \"compactSummaryReportNotificationEmails\": [\n \"\"\n ],\n \"configuredStates\": [\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"ar\"\n },\n {\n \"isLive\": \"\",\n \"postalAbbreviation\": \"sd\"\n }\n ],\n \"licenseeRegistrationEnabled\": \"\",\n \"transactionFeeConfiguration\": {\n \"licenseeCharges\": {\n \"active\": \"\",\n \"chargeAmount\": \"\",\n \"chargeType\": \"FLAT_FEE_PER_PRIVILEGE\"\n }\n }\n}" }, "header": [ { @@ -613,7 +613,7 @@ "item": [ { "event": [], - "id": "7a448112-dad4-4ba6-a801-942fdbe6476c", + "id": "e1d7d1b3-0caa-44e1-aab8-0b0d9520f54d", "name": "/v1/compacts/:compact/attestations/:attestationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -677,7 +677,7 @@ "value": "application/json" } ], - "id": "e0c50bfb-3cc6-4456-8552-cc21fa2af822", + "id": "c61b5da2-6143-456f-80ba-71cd6300bbcd", "name": "200 response", "originalRequest": { "body": {}, @@ -729,7 +729,7 @@ "item": [ { "event": [], - "id": "a9744b04-3c2c-4946-9bcb-8194b8ce0587", + "id": "784d7a36-d743-4499-83a8-9a35635bd4f7", "name": "/v1/compacts/:compact/credentials/payment-processor", "protocolProfileBehavior": { "disableBodyPruning": true @@ -796,7 +796,7 @@ "value": "application/json" } ], - "id": "93d49395-5f6c-4552-b31d-3f7b78de1c37", + "id": "49cc093e-9b56-4bef-9ade-555b3398672b", "name": "200 response", "originalRequest": { "body": { @@ -858,7 +858,7 @@ "item": [ { "event": [], - "id": "faa6af95-bfe4-4393-8332-e975ef36745f", + "id": "edd82d48-8d82-4b01-9b7a-248727deabee", "name": "/v1/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -911,7 +911,7 @@ "value": "application/json" } ], - "id": "f95d772c-225e-46bf-9061-7d230c4a8b7d", + "id": "a16b33dd-17fe-4be5-91da-8bbc43fbe565", "name": "200 response", "originalRequest": { "body": {}, @@ -984,7 +984,7 @@ } } ], - "id": "3ac54f0c-08a7-4d46-a0b7-8c6aba13b4fc", + "id": "19fef01d-8597-415b-80d2-16cc5c6b328f", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1050,7 +1050,7 @@ "value": "application/json" } ], - "id": "69efbf1b-9470-4a0b-b01a-874e84e9defe", + "id": "02ec708c-bdb8-4064-b7fd-37a790997853", "name": "200 response", "originalRequest": { "body": {}, @@ -1110,7 +1110,7 @@ "item": [ { "event": [], - "id": "2013b8a1-3e93-4ded-b00e-a3cf38aa1265", + "id": "2974d272-c532-41ce-91cc-90f24da34f00", "name": "/v1/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1124,7 +1124,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"eae96496-f3d1-4e50-a01e-d9f0888ad726\",\n \"jurisdiction\": \"ak\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"36fe3faf-ce25-4c63-b5f3-abb953a85e3f\",\n \"jurisdiction\": \"nm\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}" }, "description": {}, "header": [ @@ -1168,7 +1168,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"02-15\",\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2496-09-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"ms\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"ky\",\n \"nj\"\n ],\n \"providerId\": \"a569b013-db6a-4742-b66d-2c0ef72354f5\",\n \"type\": \"provider\",\n \"npi\": \"9169059087\",\n \"dateOfBirth\": \"1725-12-30\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"az\",\n \"ssnLastFour\": \"0517\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"00-05\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1296-02-03\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"wv\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"nv\",\n \"ky\"\n ],\n \"providerId\": \"7db595fb-86a2-494f-bcc8-02c3187784eb\",\n \"type\": \"provider\",\n \"npi\": \"7462649169\",\n \"dateOfBirth\": \"1735-05-02\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ri\",\n \"ssnLastFour\": \"7347\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"06-08\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2228-11-24\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"sd\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"in\",\n \"vi\"\n ],\n \"providerId\": \"20e8b0b3-84c6-4d64-b855-6b97fa2b5ef2\",\n \"type\": \"provider\",\n \"npi\": \"0740262699\",\n \"dateOfBirth\": \"1644-12-06\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"oh\",\n \"ssnLastFour\": \"2699\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"04-35\",\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1568-12-26\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"hi\",\n \"licenseStatus\": \"inactive\",\n \"privilegeJurisdictions\": [\n \"ct\",\n \"ri\"\n ],\n \"providerId\": \"b7479a54-1456-45d2-bf17-09867f597430\",\n \"type\": \"provider\",\n \"npi\": \"5726477063\",\n \"dateOfBirth\": \"2412-08-06\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"oh\",\n \"ssnLastFour\": \"9449\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -1177,7 +1177,7 @@ "value": "application/json" } ], - "id": "fa8b34dd-e84e-4d47-96f6-0f257c7a5b6b", + "id": "3c87e5d0-6363-4641-8a9a-681c6a5e6f21", "name": "200 response", "originalRequest": { "body": { @@ -1188,7 +1188,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"eae96496-f3d1-4e50-a01e-d9f0888ad726\",\n \"jurisdiction\": \"ak\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"36fe3faf-ce25-4c63-b5f3-abb953a85e3f\",\n \"jurisdiction\": \"nm\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}" }, "header": [ { @@ -1236,7 +1236,7 @@ "item": [ { "event": [], - "id": "0e55a378-3d75-4f84-bac1-3fb688bf8b68", + "id": "afbfff17-6d80-4e06-bd96-42ab7d331349", "name": "/v1/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1291,7 +1291,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"13-08\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"2740-10-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ca\",\n \"licenses\": [\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1418-12-31\",\n \"dateOfIssuance\": \"2085-11-17\",\n \"dateOfRenewal\": \"1311-09-08\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"dc\",\n \"previous\": {\n \"dateOfExpiration\": \"1601-06-02\",\n \"dateOfIssuance\": \"2629-02-05\",\n \"dateOfRenewal\": \"1654-12-20\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9182700485\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1200-11-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+92643937755835\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7411986766\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1990-03-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2882-03-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2118-06-30\",\n \"phoneNumber\": \"+051995078739120\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2322-12-09\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"mt\",\n \"previous\": {\n \"dateOfExpiration\": \"2632-03-04\",\n \"dateOfIssuance\": \"1318-10-08\",\n \"dateOfRenewal\": \"1340-02-17\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0390938058\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1213-10-10\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+05461792036\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4862553081\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2504-10-13\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1829-11-06\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2949-12-30\",\n \"phoneNumber\": \"+120941010917607\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2176-11-15\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"va\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"middleName\": \"\",\n \"providerId\": \"05808075-7f81-4fe0-bd15-aaf4bae96313\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"80cc917e-0e45-498b-a01e-46dfaf9422ec\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"b59bcbf2-c163-4fb9-86c4-a0f3c3189ca1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8088263473\",\n \"dateOfBirth\": \"1123-10-31\",\n \"ssnLastFour\": \"1880\",\n \"phoneNumber\": \"+326285850838714\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1549-11-25\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1175-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ar\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"36649371-9214-4d9e-b541-5735d9ea708b\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1701-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1784-04-28\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1811-09-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3be367fd-7032-4eee-9057-f25158464542\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2886-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1849-11-04\",\n \"dateOfIssuance\": \"1727-03-31\",\n \"dateOfRenewal\": \"2147-12-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"pr\",\n \"previous\": {\n \"dateOfExpiration\": \"1023-02-22\",\n \"dateOfIssuance\": \"2532-12-02\",\n \"dateOfRenewal\": \"1053-10-27\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7397903163\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2428-07-24\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+917559203\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2743883980\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2839-10-07\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2744-09-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2259-09-05\",\n \"phoneNumber\": \"+58912316901398\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1600-08-03\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"co\",\n \"previous\": {\n \"dateOfExpiration\": \"2448-03-31\",\n \"dateOfIssuance\": \"1788-12-01\",\n \"dateOfRenewal\": \"1711-07-29\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8986979461\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2015-02-24\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+91875239944\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9116841702\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2433-05-25\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2566-01-15\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1161-01-31\",\n \"phoneNumber\": \"+36158878\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1548-09-16\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"de\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"3767aa19-bf41-474c-9138-44ed4758bfb7\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"pa\",\n \"licenseType\": \"\",\n \"providerId\": \"f839ba46-83e1-4214-a32b-6f059c1103c1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"providerId\": \"a0d710fd-c888-4f32-94d4-e53275a7ee1e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"9630005174\",\n \"dateOfBirth\": \"2103-11-22\",\n \"ssnLastFour\": \"2869\",\n \"phoneNumber\": \"+075553273143\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2441-11-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1685-08-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"296de178-c4df-49a2-b2e3-bbf85a1537d5\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1364-11-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1273-07-26\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2678-11-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4b00f3fa-ffe4-4347-b72b-93057bd51694\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2939-10-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"2834-05-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"00e4e114-ffbf-40dd-b352-1b8a53d7dd16\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"1808-05-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"75396ba5-e504-426a-a51f-a3baade8f5d2\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"al\",\n \"me\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2620-12-10\",\n \"dateOfIssuance\": \"2307-10-02\",\n \"dateOfRenewal\": \"1072-11-11\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ky\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1210-08-03\",\n \"dateOfIssuance\": \"2086-12-25\",\n \"dateOfRenewal\": \"1635-10-31\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"mo\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ne\",\n \"type\": \"privilege\",\n \"providerId\": \"c5529e93-5fd7-4f3e-bac4-ede0ec84b225\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"az\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"co\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2146-05-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1564-10-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"95bb8f53-92a6-4f95-a344-7486ed68e496\",\n \"dateOfRenewal\": \"1234-07-30\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wy\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2450-02-06\",\n \"dateOfIssuance\": \"1144-04-07\",\n \"dateOfRenewal\": \"2162-01-27\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"ok\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"pa\",\n \"type\": \"privilege\",\n \"providerId\": \"3f88efc2-04c8-498b-83c4-f62bff1f9d1c\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"nj\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ut\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1263-11-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1907-03-20\",\n \"privilegeId\": \"\",\n \"providerId\": \"1da0c1ab-df4a-4d76-a05d-3888ec8dd690\",\n \"dateOfRenewal\": \"2530-08-20\",\n \"dateOfUpdate\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"or\",\n \"licenseJurisdiction\": \"tn\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"f0860327-e2d4-4218-820b-07844da613e2\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ct\",\n \"licenseType\": \"\",\n \"providerId\": \"1eb95a72-28a1-43f2-8ab0-e7694549a465\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"bac7a7f8-5d68-4ed8-961c-fed4778fbc17\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1884-09-01\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1801-11-23\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a404af0a-1cd5-448e-8fb3-2f2d976e9d98\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1873-11-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1294-11-27\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2195-01-17\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"79998715-1d2d-424f-83f9-781152e5bfff\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2807-09-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1164-10-31\",\n \"dateOfIssuance\": \"2505-03-31\",\n \"dateOfRenewal\": \"1015-12-30\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wa\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1949-11-30\",\n \"dateOfIssuance\": \"2851-10-31\",\n \"dateOfRenewal\": \"2757-08-11\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"nj\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ok\",\n \"type\": \"privilege\",\n \"providerId\": \"af7cfee7-5063-48f2-80d2-5c8e4592d556\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ar\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"mn\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1626-04-10\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1514-11-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"e7176921-3038-403b-8da3-8005c8155a2c\",\n \"dateOfRenewal\": \"1787-03-21\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"nm\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1606-09-11\",\n \"dateOfIssuance\": \"2184-12-21\",\n \"dateOfRenewal\": \"2383-08-30\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"nv\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"al\",\n \"type\": \"privilege\",\n \"providerId\": \"a305b4a7-093d-44f5-bdf7-4d15c689a365\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ok\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ne\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2728-03-30\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1796-11-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"100d20d6-c557-4ea3-aea9-7c2c36ef9d1b\",\n \"dateOfRenewal\": \"1607-11-31\",\n \"dateOfUpdate\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"sc\",\n \"licenseJurisdiction\": \"ct\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"e4bab004-d0d1-44d3-bf59-b1b6021cca2a\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"providerId\": \"972a828c-9141-44d9-ac6b-921c12a14951\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ny\",\n \"licenseType\": \"\",\n \"providerId\": \"be1bb960-c9fc-4338-9192-7557ef4f145b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2953-11-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1450-07-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mi\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1ec2d6e7-8fc1-47e2-a06c-9dce079e5fe0\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1803-08-08\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1417-01-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2946-11-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"0555315c-4fb4-4800-9682-1769d0d58577\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2601-03-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"c6924611-02c0-4d24-b0a3-2162f676f0c6\",\n \"type\": \"provider\",\n \"npi\": \"7005556145\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2323-09-29\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ga\",\n \"ssnLastFour\": \"0968\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"08-15\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"2385-12-29\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"nc\",\n \"licenses\": [\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2936-05-05\",\n \"dateOfIssuance\": \"2254-10-17\",\n \"dateOfRenewal\": \"2835-10-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"md\",\n \"previous\": {\n \"dateOfExpiration\": \"1800-04-06\",\n \"dateOfIssuance\": \"2972-08-07\",\n \"dateOfRenewal\": \"2438-09-14\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6466950304\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2691-05-23\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+855527173535\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8394405807\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1842-07-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2300-08-05\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2863-08-03\",\n \"phoneNumber\": \"+3528187300\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2856-05-08\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"mt\",\n \"previous\": {\n \"dateOfExpiration\": \"1918-10-05\",\n \"dateOfIssuance\": \"1476-12-15\",\n \"dateOfRenewal\": \"1145-11-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0596273100\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1028-12-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+9136425909\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2808925314\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1326-05-06\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2399-06-25\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2473-11-30\",\n \"phoneNumber\": \"+1013464869\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2257-10-20\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"hi\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"middleName\": \"\",\n \"providerId\": \"9b0bf21b-92f8-41d9-9df4-eaabd84adeee\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ut\",\n \"licenseType\": \"\",\n \"providerId\": \"ad1db718-9d5c-4842-8b45-9b34ee4e0cca\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"\",\n \"providerId\": \"844db6f5-44af-4fc9-9221-3015ed96cbef\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"2619765297\",\n \"dateOfBirth\": \"1768-09-08\",\n \"ssnLastFour\": \"4600\",\n \"phoneNumber\": \"+59112126684\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1777-09-23\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2708-03-02\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"aeca0267-7733-48d0-a71c-d884e4754f14\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2396-01-09\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2958-05-22\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2261-06-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"ba21be91-43db-4c7a-98de-607d32eb34b6\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1185-12-14\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1169-12-27\",\n \"dateOfIssuance\": \"2302-07-11\",\n \"dateOfRenewal\": \"1624-03-08\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"hi\",\n \"previous\": {\n \"dateOfExpiration\": \"2804-01-30\",\n \"dateOfIssuance\": \"1778-03-30\",\n \"dateOfRenewal\": \"1452-12-01\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8839374275\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2408-12-29\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+25666997428056\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3527141483\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1539-11-04\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2033-10-28\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2946-02-27\",\n \"phoneNumber\": \"+11739899598\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1036-10-30\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"dc\",\n \"previous\": {\n \"dateOfExpiration\": \"2132-01-04\",\n \"dateOfIssuance\": \"2948-11-30\",\n \"dateOfRenewal\": \"1580-10-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3443777389\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2208-08-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+69171972\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2199245845\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2289-12-31\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2595-12-09\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2635-11-09\",\n \"phoneNumber\": \"+538742548588950\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1656-08-16\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ky\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"481ba68e-ab28-427f-befb-fba6bf3b3bae\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"providerId\": \"f1c029aa-dae1-4ce3-a43c-1bf2320b7642\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wv\",\n \"licenseType\": \"\",\n \"providerId\": \"8c92261b-fea9-470a-8fe8-dcaca7ca8697\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"1690493112\",\n \"dateOfBirth\": \"1751-01-02\",\n \"ssnLastFour\": \"8079\",\n \"phoneNumber\": \"+106891529\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1394-05-20\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1355-11-25\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"6146bf62-a9f2-4c96-9d67-8c32cf05de02\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1150-11-05\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2103-02-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2104-10-21\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"bd5c9993-b19c-49a9-a241-6b67768bb1a5\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1567-09-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"2814-11-05\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"a6dad0d8-c0c7-4274-9d1f-a530a54209d2\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"2214-04-11\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"ca2d993d-8064-4a9a-9db0-f22f39e37118\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"az\",\n \"ga\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"coun\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1994-11-05\",\n \"dateOfIssuance\": \"2425-09-15\",\n \"dateOfRenewal\": \"1310-11-08\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ms\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2993-03-27\",\n \"dateOfIssuance\": \"2072-10-31\",\n \"dateOfRenewal\": \"2114-11-25\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"mn\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"md\",\n \"type\": \"privilege\",\n \"providerId\": \"4d5725cf-ad64-45fe-b60c-2224209edc4a\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"mn\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"la\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1994-03-26\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1228-07-13\",\n \"privilegeId\": \"\",\n \"providerId\": \"38f48d47-72b6-4acd-9e61-da8cd93b2ad3\",\n \"dateOfRenewal\": \"2374-01-04\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ak\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2781-12-27\",\n \"dateOfIssuance\": \"1187-05-12\",\n \"dateOfRenewal\": \"2763-09-21\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"de\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"mo\",\n \"type\": \"privilege\",\n \"providerId\": \"a821d267-5653-49bd-97a2-bfc59170f24c\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"in\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"id\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1819-11-12\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2038-12-26\",\n \"privilegeId\": \"\",\n \"providerId\": \"ad9f72d8-19d3-4b8e-b7b7-618dfe5e9e58\",\n \"dateOfRenewal\": \"1113-11-05\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n }\n ],\n \"jurisdiction\": \"wa\",\n \"licenseJurisdiction\": \"vt\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"90bc19aa-772d-44ad-9cd6-3983304f2328\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mi\",\n \"licenseType\": \"\",\n \"providerId\": \"2dc8351a-6416-47e7-9b6e-2a34491c71c7\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"\",\n \"providerId\": \"fe1216ae-9c2c-4b40-8c29-1d6b42028e71\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1061-12-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1895-11-19\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"pr\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"2712681d-bded-4d93-905c-69072cc9ad3e\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2321-10-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1298-05-03\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2743-07-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"or\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"c166bbe2-1f54-44d6-87ec-baf461c0b04e\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2562-12-05\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"coun\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1763-12-31\",\n \"dateOfIssuance\": \"1282-02-31\",\n \"dateOfRenewal\": \"1775-03-02\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"me\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1299-03-12\",\n \"dateOfIssuance\": \"2556-09-24\",\n \"dateOfRenewal\": \"2525-12-31\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"nc\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"sc\",\n \"type\": \"privilege\",\n \"providerId\": \"fcee0893-045b-4e62-993b-2e1a0d5b9a6a\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"or\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"oh\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2189-04-21\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2561-09-02\",\n \"privilegeId\": \"\",\n \"providerId\": \"0e368060-5ad8-4526-a4d4-b3bb0ae375ee\",\n \"dateOfRenewal\": \"1197-12-28\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"nc\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2675-12-14\",\n \"dateOfIssuance\": \"2405-08-11\",\n \"dateOfRenewal\": \"2288-09-14\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"az\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"hi\",\n \"type\": \"privilege\",\n \"providerId\": \"b442dc00-b160-49c2-9e00-adc648fe8e78\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"md\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ms\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1632-10-06\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2989-04-09\",\n \"privilegeId\": \"\",\n \"providerId\": \"f3981490-3938-4976-b957-7123142c46de\",\n \"dateOfRenewal\": \"1356-01-30\",\n \"dateOfUpdate\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ky\",\n \"licenseJurisdiction\": \"fl\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"11ec1f36-39ef-411d-9ed6-0218a17bde45\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"f78a6f18-b3bd-4937-9a6c-b48d88245048\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"bf956261-d85b-4589-9cdb-446467415ef6\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1572-08-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1663-10-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"edea6027-5ae7-4c1f-a412-a29bed40d673\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1688-10-12\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1780-08-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2812-12-13\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"f488d06a-d37c-4736-ba3a-c9d02cead4fa\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2996-12-11\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"9b5458d5-9c52-41cd-b3b1-95f5c4affc2c\",\n \"type\": \"provider\",\n \"npi\": \"2535279913\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1940-02-02\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"in\",\n \"ssnLastFour\": \"5671\",\n \"licenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -1300,7 +1300,7 @@ "value": "application/json" } ], - "id": "36d25788-3b7d-4aff-835f-977136ddb6cf", + "id": "b7cc6c87-9d25-473b-81fd-e94664497fc3", "name": "200 response", "originalRequest": { "body": {}, @@ -1358,7 +1358,7 @@ "item": [ { "event": [], - "id": "778abe7d-3bd6-47b5-93cb-c2b04ed3720b", + "id": "c8eaee6b-941a-4ba6-b5c2-86650cb9d0c7", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1372,7 +1372,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"2966-01-22\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"1213-12-01\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "description": {}, "header": [ @@ -1461,7 +1461,7 @@ "value": "application/json" } ], - "id": "3e21bfa6-ca48-42e5-9d8a-f74959675680", + "id": "1d4911ea-8ff0-4972-89ec-1328421603d7", "name": "200 response", "originalRequest": { "body": { @@ -1472,7 +1472,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"2966-01-22\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"1213-12-01\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "header": [ { @@ -1523,7 +1523,7 @@ "item": [ { "event": [], - "id": "0f124494-b629-4601-b7b3-932a7d307595", + "id": "9cd0e9d6-8c28-4bd0-a03c-e498f58bd8d3", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1537,7 +1537,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1375-10-30\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1104-03-15\"\n}" }, "description": {}, "header": [ @@ -1637,7 +1637,7 @@ "value": "application/json" } ], - "id": "41e9777a-da42-4489-b70a-3870fdbf921b", + "id": "83eea677-31cb-483b-a142-c5017facf781", "name": "200 response", "originalRequest": { "body": { @@ -1648,7 +1648,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1375-10-30\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1104-03-15\"\n}" }, "header": [ { @@ -1706,7 +1706,7 @@ "item": [ { "event": [], - "id": "78ac677d-d1d1-4b19-b30a-e8587bd216b9", + "id": "95b5f3e9-5d82-4af1-9975-01b3fc520a7e", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1809,7 +1809,7 @@ "value": "application/json" } ], - "id": "45b7d3a6-3774-4544-a986-9910876c2909", + "id": "c0b8a977-b11c-4ea6-9e30-cc2d9343e62a", "name": "200 response", "originalRequest": { "body": { @@ -1871,7 +1871,7 @@ "item": [ { "event": [], - "id": "5ccd5eb2-926c-4e2b-803e-8fc0941e1344", + "id": "bde6e1f5-2b85-42d4-9af4-b096c2990722", "name": "/v1/compacts/:compact/providers/:providerId/licenses/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -1885,7 +1885,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"1911-02-08\",\n \"encumbranceType\": \"injunctive action\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2673-09-10\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "description": {}, "header": [ @@ -1985,7 +1985,7 @@ "value": "application/json" } ], - "id": "daaef93b-6a2f-4f27-802b-3e87dfb32825", + "id": "6eb0f49a-cccf-469c-a8a6-8a4939443611", "name": "200 response", "originalRequest": { "body": { @@ -1996,7 +1996,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"1911-02-08\",\n \"encumbranceType\": \"injunctive action\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2673-09-10\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "header": [ { @@ -2084,7 +2084,7 @@ "item": [ { "event": [], - "id": "0688a816-445f-45e6-9f39-cac96d5dd4ea", + "id": "d74f25ec-cfee-4d03-b1f8-d3822c2be6dd", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/deactivate", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2187,7 +2187,7 @@ "value": "application/json" } ], - "id": "e53076b3-8d30-4e52-9748-e4358a8308f8", + "id": "cff5ab64-b4a4-4921-8f90-2e694131358f", "name": "200 response", "originalRequest": { "body": { @@ -2252,7 +2252,7 @@ "item": [ { "event": [], - "id": "f54580f1-349c-43b2-b889-a97cdc5061fd", + "id": "37217a24-2f76-4243-8b84-2864dcff6606", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2266,7 +2266,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"2966-01-22\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"1213-12-01\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "description": {}, "header": [ @@ -2355,7 +2355,7 @@ "value": "application/json" } ], - "id": "f712d09c-56ea-44b1-a607-43f1c95e1a74", + "id": "2d0a8450-d518-4f25-adab-9d9c30782586", "name": "200 response", "originalRequest": { "body": { @@ -2366,7 +2366,7 @@ "language": "json" } }, - "raw": "{\n \"encumbranceEffectiveDate\": \"2966-01-22\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" + "raw": "{\n \"encumbranceEffectiveDate\": \"1213-12-01\",\n \"encumbranceType\": \"modification of previous action-extension\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n}" }, "header": [ { @@ -2417,7 +2417,7 @@ "item": [ { "event": [], - "id": "9d592a7f-d13f-47b0-9ab7-192f6d394130", + "id": "76f8edac-8274-4279-9db7-0ff6e00edb27", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/encumbrance/:encumbranceId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2431,7 +2431,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1375-10-30\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1104-03-15\"\n}" }, "description": {}, "header": [ @@ -2531,7 +2531,7 @@ "value": "application/json" } ], - "id": "c4296e7c-0324-4c28-b843-907cf57eba0a", + "id": "16981b5d-ab36-4364-9f2c-a0ec8435e010", "name": "200 response", "originalRequest": { "body": { @@ -2542,7 +2542,7 @@ "language": "json" } }, - "raw": "{\n \"effectiveLiftDate\": \"1375-10-30\"\n}" + "raw": "{\n \"effectiveLiftDate\": \"1104-03-15\"\n}" }, "header": [ { @@ -2600,7 +2600,7 @@ "item": [ { "event": [], - "id": "81e896ab-ac6c-438c-809f-5e8715106ab4", + "id": "a3a9a8fc-e963-444d-ad98-28bbd589e0ff", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2681,7 +2681,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1286-11-12\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1357-08-04\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"7fb7b7d6-5bc5-49cb-819b-59b10919270e\"\n}", + "body": "{\n \"compact\": \"octp\",\n \"events\": [\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1230-11-04\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"2425-11-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"in\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"d89a7efe-5041-4146-96a6-3f76cf1296f6\"\n}", "code": 200, "cookie": [], "header": [ @@ -2690,7 +2690,7 @@ "value": "application/json" } ], - "id": "7df6e17b-8e3e-4099-8f31-39696214f64e", + "id": "f4fa57e2-59fc-4d08-9064-9c463bdf3623", "name": "200 response", "originalRequest": { "body": {}, @@ -2742,7 +2742,7 @@ "item": [ { "event": [], - "id": "9f1841b3-2d6f-4c7d-8a0d-307de5a39335", + "id": "de5fed5f-96c8-4f50-ad5c-db3229e0be7d", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2845,7 +2845,7 @@ "value": "application/json" } ], - "id": "bd6cb3af-24cf-415c-b49e-b404f4b891f6", + "id": "48143152-8047-4218-9dc4-9ffe347769fc", "name": "200 response", "originalRequest": { "body": { @@ -2907,7 +2907,7 @@ "item": [ { "event": [], - "id": "3e3b2c41-9f05-4a0f-85af-a0b0de453ec8", + "id": "ed605afe-0ca3-4ee9-9ec9-6f76a41f2824", "name": "/v1/compacts/:compact/providers/:providerId/privileges/jurisdiction/:jurisdiction/licenseType/:licenseType/investigation/:investigationId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -2921,7 +2921,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"1911-02-08\",\n \"encumbranceType\": \"injunctive action\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2673-09-10\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "description": {}, "header": [ @@ -3021,7 +3021,7 @@ "value": "application/json" } ], - "id": "a68c0887-e040-4609-9e2a-68608e80cee5", + "id": "3d3b31c8-15e4-4652-9ced-ff23024a7cd0", "name": "200 response", "originalRequest": { "body": { @@ -3032,7 +3032,7 @@ "language": "json" } }, - "raw": "{\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"1911-02-08\",\n \"encumbranceType\": \"injunctive action\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" + "raw": "{\n \"action\": \"close\",\n \"encumbrance\": {\n \"encumbranceEffectiveDate\": \"2673-09-10\",\n \"encumbranceType\": \"public reprimand\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"clinicalPrivilegeActionCategory\": \"\"\n }\n}" }, "header": [ { @@ -3105,7 +3105,7 @@ "item": [ { "event": [], - "id": "180d9906-6433-4aa6-9264-fa9a4f3e4eef", + "id": "d369e9fc-9a44-4e34-9f10-f4b7d700268b", "name": "/v1/compacts/:compact/providers/:providerId/ssn", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3161,7 +3161,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"ssn\": \"415-45-7275\"\n}", + "body": "{\n \"ssn\": \"227-14-4166\"\n}", "code": 200, "cookie": [], "header": [ @@ -3170,7 +3170,7 @@ "value": "application/json" } ], - "id": "e4ae939a-fa02-4f58-88c8-31fef8399a6b", + "id": "e4d02317-6458-4453-901b-b355ecea038e", "name": "200 response", "originalRequest": { "body": {}, @@ -3223,7 +3223,7 @@ "item": [ { "event": [], - "id": "a59d9606-fdec-4545-b1c2-4086e4ec09d7", + "id": "c631e2a7-bf4c-49da-8ebe-44c63db91758", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3267,7 +3267,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n }\n ]\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"users\": [\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"inactive\",\n \"userId\": \"\"\n },\n {\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n }\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -3285,7 +3285,7 @@ "value": "" } ], - "id": "8dd58e70-df65-43c2-9c8e-69d30cad4992", + "id": "f82015f7-677a-410b-b0fa-a0b2a610cd86", "name": "200 response", "originalRequest": { "body": {}, @@ -3324,7 +3324,7 @@ }, { "event": [], - "id": "c88b1e8d-b822-4a5f-8645-2627bf74aacd", + "id": "29d97a42-4046-4876-8a17-84064d3ddd00", "name": "/v1/compacts/:compact/staff-users", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3338,7 +3338,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3381,7 +3381,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3399,7 +3399,7 @@ "value": "" } ], - "id": "1c8b8035-c9c5-4a54-a92d-190a71711a20", + "id": "f6195ee8-b64e-4893-a4a6-6d3a6dc4a12f", "name": "200 response", "originalRequest": { "body": { @@ -3410,7 +3410,7 @@ "language": "json" } }, - "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3454,7 +3454,7 @@ "item": [ { "event": [], - "id": "36d9200a-8383-4e9b-b55c-cff832220ee2", + "id": "b2755dc9-d52a-4cff-a777-90f4b620047d", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3509,7 +3509,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3527,7 +3527,7 @@ "value": "" } ], - "id": "162b212f-43e2-4b15-90ba-daf844557b11", + "id": "ff17dff0-146d-45cb-a8da-d8ae414cb769", "name": "200 response", "originalRequest": { "body": {}, @@ -3574,7 +3574,7 @@ "value": "application/json" } ], - "id": "cb543f58-6b5f-41cc-a73e-200a9a89c740", + "id": "33b13941-da68-4139-b292-78d80a65e7dc", "name": "404 response", "originalRequest": { "body": {}, @@ -3614,7 +3614,7 @@ }, { "event": [], - "id": "ebaa38d6-8a8b-4c18-ba15-eec2a42b04ef", + "id": "1b4f0101-5b64-45c0-80c4-a1cd49535c02", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3678,7 +3678,7 @@ "value": "application/json" } ], - "id": "9b9c3851-6767-4c05-a264-44943a4bd6b9", + "id": "ecd839cc-ba61-4083-95bd-aa680c301748", "name": "200 response", "originalRequest": { "body": {}, @@ -3725,7 +3725,7 @@ "value": "application/json" } ], - "id": "9b78dfdc-8305-4010-b66e-6a5186cc1122", + "id": "65646a0b-ca6d-4a2d-8126-cd2f25299dc8", "name": "404 response", "originalRequest": { "body": {}, @@ -3765,7 +3765,7 @@ }, { "event": [], - "id": "791137af-22fd-4201-9ab4-771524a63020", + "id": "cbf95d6f-f5b2-4583-8610-e41700a748d6", "name": "/v1/compacts/:compact/staff-users/:userId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -3779,7 +3779,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "description": {}, "header": [ @@ -3833,7 +3833,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -3851,7 +3851,7 @@ "value": "" } ], - "id": "ce38dfa4-fe0a-4111-9fe8-aef4e0cfcb3f", + "id": "b9442f93-4e9e-43c8-aa18-4306a45625ea", "name": "200 response", "originalRequest": { "body": { @@ -3862,7 +3862,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3911,7 +3911,7 @@ "value": "application/json" } ], - "id": "b575a2f7-bbb6-48e0-97c7-928953b4250e", + "id": "858ab0b2-7cba-4745-b11d-d0e2a111cae5", "name": "404 response", "originalRequest": { "body": { @@ -3922,7 +3922,7 @@ "language": "json" } }, - "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" + "raw": "{\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n }\n}" }, "header": [ { @@ -3967,7 +3967,7 @@ "item": [ { "event": [], - "id": "e2244523-8761-41ab-9ce2-886b734da5c6", + "id": "997abfd5-71da-47e6-acc9-f610c951a189", "name": "/v1/compacts/:compact/staff-users/:userId/reinvite", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4032,7 +4032,7 @@ "value": "application/json" } ], - "id": "3028697c-c38a-47b9-9670-36f6afd0bb12", + "id": "aa1266af-7d68-42d7-bec9-d0eb27d1e8e9", "name": "200 response", "originalRequest": { "body": {}, @@ -4080,7 +4080,7 @@ "value": "application/json" } ], - "id": "9fe90762-8529-4f5b-b802-7db489c54b34", + "id": "ea46b05f-ab59-4d7a-bfe5-439fc806a761", "name": "404 response", "originalRequest": { "body": {}, @@ -4145,7 +4145,7 @@ "item": [ { "event": [], - "id": "2e071fbb-b97c-4df3-ad5c-4c635ed48cd0", + "id": "4297e674-e814-426c-abf4-ca1c66004bde", "name": "/v1/flags/:flagId/check", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4162,7 +4162,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n }\n }\n}" }, "description": {}, "header": [ @@ -4214,7 +4214,7 @@ "value": "application/json" } ], - "id": "8134e67e-1d4d-448a-b6a0-00de9f74e7ef", + "id": "f6caa750-5414-4442-a2fa-0ef078eef64a", "name": "200 response", "originalRequest": { "body": { @@ -4225,7 +4225,7 @@ "language": "json" } }, - "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\"\n }\n }\n}" + "raw": "{\n \"context\": {\n \"userId\": \"\",\n \"customAttributes\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n }\n }\n}" }, "header": [ { @@ -4283,7 +4283,7 @@ "item": [ { "event": [], - "id": "fd1096eb-1202-419b-9436-dd0a97dc635b", + "id": "e21d0d72-bd18-47cc-8b5b-33b4352dc8b7", "name": "/v1/provider-users/initiateRecovery", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4300,7 +4300,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"aslp\",\n \"dob\": \"1820-08-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"occupational therapy assistant\",\n \"partialSocial\": \"4918\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" + "raw": "{\n \"compact\": \"octp\",\n \"dob\": \"1928-01-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"occupational therapy assistant\",\n \"partialSocial\": \"4620\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" }, "description": {}, "header": [ @@ -4340,7 +4340,7 @@ "value": "application/json" } ], - "id": "e2737d72-c0a5-45a7-bb8e-403d7b102841", + "id": "aab9dc02-e8ff-4f4a-8dcf-8c53a2d3588d", "name": "200 response", "originalRequest": { "body": { @@ -4351,7 +4351,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"aslp\",\n \"dob\": \"1820-08-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"occupational therapy assistant\",\n \"partialSocial\": \"4918\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" + "raw": "{\n \"compact\": \"octp\",\n \"dob\": \"1928-01-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"occupational therapy assistant\",\n \"partialSocial\": \"4620\",\n \"password\": \"\",\n \"recaptchaToken\": \"\",\n \"username\": \"\"\n}" }, "header": [ { @@ -4389,7 +4389,7 @@ "item": [ { "event": [], - "id": "ef9d64a5-b00d-41a5-8073-9bf306d38421", + "id": "a764b1b7-b990-4ab1-8ed1-dd8e23abb02c", "name": "/v1/provider-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4421,7 +4421,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"birthMonthDay\": \"13-08\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"2740-10-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ca\",\n \"licenses\": [\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1418-12-31\",\n \"dateOfIssuance\": \"2085-11-17\",\n \"dateOfRenewal\": \"1311-09-08\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"dc\",\n \"previous\": {\n \"dateOfExpiration\": \"1601-06-02\",\n \"dateOfIssuance\": \"2629-02-05\",\n \"dateOfRenewal\": \"1654-12-20\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9182700485\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1200-11-31\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+92643937755835\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"other\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7411986766\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1990-03-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2882-03-31\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2118-06-30\",\n \"phoneNumber\": \"+051995078739120\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2322-12-09\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"mt\",\n \"previous\": {\n \"dateOfExpiration\": \"2632-03-04\",\n \"dateOfIssuance\": \"1318-10-08\",\n \"dateOfRenewal\": \"1340-02-17\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0390938058\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1213-10-10\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+05461792036\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"emailChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"audiologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4862553081\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2504-10-13\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"1829-11-06\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2949-12-30\",\n \"phoneNumber\": \"+120941010917607\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2176-11-15\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"va\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapy assistant\",\n \"middleName\": \"\",\n \"providerId\": \"05808075-7f81-4fe0-bd15-aaf4bae96313\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"80cc917e-0e45-498b-a01e-46dfaf9422ec\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"b59bcbf2-c163-4fb9-86c4-a0f3c3189ca1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"8088263473\",\n \"dateOfBirth\": \"1123-10-31\",\n \"ssnLastFour\": \"1880\",\n \"phoneNumber\": \"+326285850838714\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1549-11-25\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1175-12-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ar\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"36649371-9214-4d9e-b541-5735d9ea708b\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1701-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1784-04-28\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1811-09-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"de\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"3be367fd-7032-4eee-9057-f25158464542\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2886-11-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1849-11-04\",\n \"dateOfIssuance\": \"1727-03-31\",\n \"dateOfRenewal\": \"2147-12-31\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"pr\",\n \"previous\": {\n \"dateOfExpiration\": \"1023-02-22\",\n \"dateOfIssuance\": \"2532-12-02\",\n \"dateOfRenewal\": \"1053-10-27\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7397903163\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2428-07-24\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+917559203\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"renewal\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2743883980\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2839-10-07\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2744-09-30\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2259-09-05\",\n \"phoneNumber\": \"+58912316901398\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1600-08-03\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"co\",\n \"previous\": {\n \"dateOfExpiration\": \"2448-03-31\",\n \"dateOfIssuance\": \"1788-12-01\",\n \"dateOfRenewal\": \"1711-07-29\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8986979461\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2015-02-24\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+91875239944\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"9116841702\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2433-05-25\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2566-01-15\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"1161-01-31\",\n \"phoneNumber\": \"+36158878\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1548-09-16\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"de\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"middleName\": \"\",\n \"providerId\": \"3767aa19-bf41-474c-9138-44ed4758bfb7\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"pa\",\n \"licenseType\": \"\",\n \"providerId\": \"f839ba46-83e1-4214-a32b-6f059c1103c1\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ak\",\n \"licenseType\": \"\",\n \"providerId\": \"a0d710fd-c888-4f32-94d4-e53275a7ee1e\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"9630005174\",\n \"dateOfBirth\": \"2103-11-22\",\n \"ssnLastFour\": \"2869\",\n \"phoneNumber\": \"+075553273143\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2441-11-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1685-08-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nc\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"296de178-c4df-49a2-b2e3-bbf85a1537d5\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1364-11-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1273-07-26\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2678-11-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4b00f3fa-ffe4-4347-b72b-93057bd51694\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2939-10-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"2834-05-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"00e4e114-ffbf-40dd-b352-1b8a53d7dd16\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"1808-05-30\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"75396ba5-e504-426a-a51f-a3baade8f5d2\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"al\",\n \"me\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2620-12-10\",\n \"dateOfIssuance\": \"2307-10-02\",\n \"dateOfRenewal\": \"1072-11-11\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ky\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1210-08-03\",\n \"dateOfIssuance\": \"2086-12-25\",\n \"dateOfRenewal\": \"1635-10-31\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"mo\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ne\",\n \"type\": \"privilege\",\n \"providerId\": \"c5529e93-5fd7-4f3e-bac4-ede0ec84b225\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"az\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"co\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2146-05-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1564-10-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"95bb8f53-92a6-4f95-a344-7486ed68e496\",\n \"dateOfRenewal\": \"1234-07-30\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wy\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2450-02-06\",\n \"dateOfIssuance\": \"1144-04-07\",\n \"dateOfRenewal\": \"2162-01-27\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"ok\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"pa\",\n \"type\": \"privilege\",\n \"providerId\": \"3f88efc2-04c8-498b-83c4-f62bff1f9d1c\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"nj\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ut\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1263-11-31\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1907-03-20\",\n \"privilegeId\": \"\",\n \"providerId\": \"1da0c1ab-df4a-4d76-a05d-3888ec8dd690\",\n \"dateOfRenewal\": \"2530-08-20\",\n \"dateOfUpdate\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"or\",\n \"licenseJurisdiction\": \"tn\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"f0860327-e2d4-4218-820b-07844da613e2\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ct\",\n \"licenseType\": \"\",\n \"providerId\": \"1eb95a72-28a1-43f2-8ab0-e7694549a465\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"\",\n \"providerId\": \"bac7a7f8-5d68-4ed8-961c-fed4778fbc17\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1884-09-01\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1801-11-23\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ga\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a404af0a-1cd5-448e-8fb3-2f2d976e9d98\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1873-11-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1294-11-27\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2195-01-17\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"79998715-1d2d-424f-83f9-781152e5bfff\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2807-09-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"aslp\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1164-10-31\",\n \"dateOfIssuance\": \"2505-03-31\",\n \"dateOfRenewal\": \"1015-12-30\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"wa\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1949-11-30\",\n \"dateOfIssuance\": \"2851-10-31\",\n \"dateOfRenewal\": \"2757-08-11\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"nj\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"ok\",\n \"type\": \"privilege\",\n \"providerId\": \"af7cfee7-5063-48f2-80d2-5c8e4592d556\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"issuance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ar\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"mn\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1626-04-10\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1514-11-30\",\n \"privilegeId\": \"\",\n \"providerId\": \"e7176921-3038-403b-8da3-8005c8155a2c\",\n \"dateOfRenewal\": \"1787-03-21\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"nm\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1606-09-11\",\n \"dateOfIssuance\": \"2184-12-21\",\n \"dateOfRenewal\": \"2383-08-30\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"nv\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"al\",\n \"type\": \"privilege\",\n \"providerId\": \"a305b4a7-093d-44f5-bdf7-4d15c689a365\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"ok\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"ne\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2728-03-30\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1796-11-31\",\n \"privilegeId\": \"\",\n \"providerId\": \"100d20d6-c557-4ea3-aea9-7c2c36ef9d1b\",\n \"dateOfRenewal\": \"1607-11-31\",\n \"dateOfUpdate\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"sc\",\n \"licenseJurisdiction\": \"ct\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"e4bab004-d0d1-44d3-bf59-b1b6021cca2a\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"id\",\n \"licenseType\": \"\",\n \"providerId\": \"972a828c-9141-44d9-ac6b-921c12a14951\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ny\",\n \"licenseType\": \"\",\n \"providerId\": \"be1bb960-c9fc-4338-9192-7557ef4f145b\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2953-11-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1450-07-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mi\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"1ec2d6e7-8fc1-47e2-a06c-9dce079e5fe0\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1803-08-08\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1417-01-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2946-11-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"0555315c-4fb4-4800-9682-1769d0d58577\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2601-03-07\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"c6924611-02c0-4d24-b0a3-2162f676f0c6\",\n \"type\": \"provider\",\n \"npi\": \"7005556145\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2323-09-29\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ga\",\n \"ssnLastFour\": \"0968\",\n \"licenseStatus\": \"active\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", + "body": "{\n \"birthMonthDay\": \"08-15\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"2385-12-29\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"nc\",\n \"licenses\": [\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2936-05-05\",\n \"dateOfIssuance\": \"2254-10-17\",\n \"dateOfRenewal\": \"2835-10-30\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"md\",\n \"previous\": {\n \"dateOfExpiration\": \"1800-04-06\",\n \"dateOfIssuance\": \"2972-08-07\",\n \"dateOfRenewal\": \"2438-09-14\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6466950304\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2691-05-23\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+855527173535\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8394405807\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1842-07-31\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2300-08-05\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2863-08-03\",\n \"phoneNumber\": \"+3528187300\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2856-05-08\",\n \"licenseStatus\": \"inactive\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"mt\",\n \"previous\": {\n \"dateOfExpiration\": \"1918-10-05\",\n \"dateOfIssuance\": \"1476-12-15\",\n \"dateOfRenewal\": \"1145-11-31\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"0596273100\",\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1028-12-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+9136425909\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2808925314\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1326-05-06\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2399-06-25\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2473-11-30\",\n \"phoneNumber\": \"+1013464869\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"2257-10-20\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"hi\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"middleName\": \"\",\n \"providerId\": \"9b0bf21b-92f8-41d9-9df4-eaabd84adeee\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ut\",\n \"licenseType\": \"\",\n \"providerId\": \"ad1db718-9d5c-4842-8b45-9b34ee4e0cca\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"octp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseType\": \"\",\n \"providerId\": \"844db6f5-44af-4fc9-9221-3015ed96cbef\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"2619765297\",\n \"dateOfBirth\": \"1768-09-08\",\n \"ssnLastFour\": \"4600\",\n \"phoneNumber\": \"+59112126684\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1777-09-23\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2708-03-02\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"aeca0267-7733-48d0-a71c-d884e4754f14\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2396-01-09\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"2958-05-22\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2261-06-31\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"ba21be91-43db-4c7a-98de-607d32eb34b6\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1185-12-14\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1169-12-27\",\n \"dateOfIssuance\": \"2302-07-11\",\n \"dateOfRenewal\": \"1624-03-08\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"hi\",\n \"previous\": {\n \"dateOfExpiration\": \"2804-01-30\",\n \"dateOfIssuance\": \"1778-03-30\",\n \"dateOfRenewal\": \"1452-12-01\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8839374275\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2408-12-29\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+25666997428056\",\n \"licenseStatus\": \"inactive\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3527141483\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1539-11-04\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2033-10-28\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2946-02-27\",\n \"phoneNumber\": \"+11739899598\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1036-10-30\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"dc\",\n \"previous\": {\n \"dateOfExpiration\": \"2132-01-04\",\n \"dateOfIssuance\": \"2948-11-30\",\n \"dateOfRenewal\": \"1580-10-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"middleName\": \"\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"3443777389\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"2208-08-30\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+69171972\",\n \"licenseStatus\": \"active\",\n \"licenseNumber\": \"\",\n \"licenseStatusName\": \"\"\n },\n \"type\": \"licenseUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"homeAddressStreet2\": \"\",\n \"npi\": \"2199245845\",\n \"homeAddressPostalCode\": \"\",\n \"givenName\": \"\",\n \"homeAddressStreet1\": \"\",\n \"compactEligibility\": \"eligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"2289-12-31\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"dateOfIssuance\": \"2595-12-09\",\n \"emailAddress\": \"\",\n \"dateOfExpiration\": \"2635-11-09\",\n \"phoneNumber\": \"+538742548588950\",\n \"homeAddressState\": \"\",\n \"dateOfRenewal\": \"1656-08-16\",\n \"licenseStatus\": \"active\",\n \"familyName\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n }\n ],\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"jurisdiction\": \"ky\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"occupational therapist\",\n \"middleName\": \"\",\n \"providerId\": \"481ba68e-ab28-427f-befb-fba6bf3b3bae\",\n \"type\": \"license-home\",\n \"homeAddressStreet2\": \"\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wa\",\n \"licenseType\": \"\",\n \"providerId\": \"f1c029aa-dae1-4ce3-a43c-1bf2320b7642\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"wv\",\n \"licenseType\": \"\",\n \"providerId\": \"8c92261b-fea9-470a-8fe8-dcaca7ca8697\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"licenseNumber\": \"\",\n \"investigationStatus\": \"underInvestigation\",\n \"npi\": \"1690493112\",\n \"dateOfBirth\": \"1751-01-02\",\n \"ssnLastFour\": \"8079\",\n \"phoneNumber\": \"+106891529\",\n \"licenseStatusName\": \"\",\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1394-05-20\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1355-11-25\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"mn\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"6146bf62-a9f2-4c96-9d67-8c32cf05de02\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1150-11-05\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2103-02-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2104-10-21\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"bd5c9993-b19c-49a9-a241-6b67768bb1a5\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1567-09-31\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"militaryAffiliations\": [\n {\n \"affiliationType\": \"militaryMember\",\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"2814-11-05\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"a6dad0d8-c0c7-4274-9d1f-a530a54209d2\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n },\n {\n \"affiliationType\": \"militaryMemberSpouse\",\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"2214-04-11\",\n \"fileNames\": [\n \"\",\n \"\"\n ],\n \"providerId\": \"ca2d993d-8064-4a9a-9db0-f22f39e37118\",\n \"status\": \"active\",\n \"type\": \"militaryAffiliation\",\n \"downloadLinks\": [\n {\n \"fileName\": \"\",\n \"url\": \"\"\n },\n {\n \"fileName\": \"\",\n \"url\": \"\"\n }\n ]\n }\n ],\n \"privilegeJurisdictions\": [\n \"az\",\n \"ga\"\n ],\n \"privileges\": [\n {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"coun\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1994-11-05\",\n \"dateOfIssuance\": \"2425-09-15\",\n \"dateOfRenewal\": \"1310-11-08\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ms\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2993-03-27\",\n \"dateOfIssuance\": \"2072-10-31\",\n \"dateOfRenewal\": \"2114-11-25\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"mn\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"md\",\n \"type\": \"privilege\",\n \"providerId\": \"4d5725cf-ad64-45fe-b60c-2224209edc4a\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"speech-language pathologist\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"mn\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"la\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1994-03-26\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1228-07-13\",\n \"privilegeId\": \"\",\n \"providerId\": \"38f48d47-72b6-4acd-9e61-da8cd93b2ad3\",\n \"dateOfRenewal\": \"2374-01-04\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ak\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2781-12-27\",\n \"dateOfIssuance\": \"1187-05-12\",\n \"dateOfRenewal\": \"2763-09-21\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"de\",\n \"privilegeId\": \"\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"mo\",\n \"type\": \"privilege\",\n \"providerId\": \"a821d267-5653-49bd-97a2-bfc59170f24c\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"in\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"id\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1819-11-12\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2038-12-26\",\n \"privilegeId\": \"\",\n \"providerId\": \"ad9f72d8-19d3-4b8e-b7b7-618dfe5e9e58\",\n \"dateOfRenewal\": \"1113-11-05\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n }\n ],\n \"jurisdiction\": \"wa\",\n \"licenseJurisdiction\": \"vt\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"90bc19aa-772d-44ad-9cd6-3983304f2328\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"mi\",\n \"licenseType\": \"\",\n \"providerId\": \"2dc8351a-6416-47e7-9b6e-2a34491c71c7\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"\",\n \"providerId\": \"fe1216ae-9c2c-4b40-8c29-1d6b42028e71\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1061-12-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1895-11-19\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"pr\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"2712681d-bded-4d93-905c-69072cc9ad3e\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2321-10-30\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1298-05-03\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2743-07-01\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"or\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"c166bbe2-1f54-44d6-87ec-baf461c0b04e\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2562-12-05\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compact\": \"coun\",\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1763-12-31\",\n \"dateOfIssuance\": \"1282-02-31\",\n \"dateOfRenewal\": \"1775-03-02\",\n \"dateOfUpdate\": \"\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"me\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"1299-03-12\",\n \"dateOfIssuance\": \"2556-09-24\",\n \"dateOfRenewal\": \"2525-12-31\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"nc\",\n \"privilegeId\": \"\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"sc\",\n \"type\": \"privilege\",\n \"providerId\": \"fcee0893-045b-4e62-993b-2e1a0d5b9a6a\",\n \"status\": \"active\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"licensed professional counselor\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"or\",\n \"compact\": \"octp\",\n \"jurisdiction\": \"oh\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"2189-04-21\",\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2561-09-02\",\n \"privilegeId\": \"\",\n \"providerId\": \"0e368060-5ad8-4526-a4d4-b3bb0ae375ee\",\n \"dateOfRenewal\": \"1197-12-28\",\n \"dateOfUpdate\": \"\",\n \"status\": \"active\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"nc\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"compactTransactionId\": \"\",\n \"dateOfExpiration\": \"2675-12-14\",\n \"dateOfIssuance\": \"2405-08-11\",\n \"dateOfRenewal\": \"2288-09-14\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"az\",\n \"privilegeId\": \"\",\n \"compact\": \"coun\",\n \"jurisdiction\": \"hi\",\n \"type\": \"privilege\",\n \"providerId\": \"b442dc00-b160-49c2-9e00-adc648fe8e78\",\n \"status\": \"inactive\"\n },\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"removedValues\": [\n \"\",\n \"\"\n ],\n \"licenseType\": \"occupational therapy assistant\",\n \"updatedValues\": {\n \"licenseJurisdiction\": \"md\",\n \"compact\": \"aslp\",\n \"jurisdiction\": \"ms\",\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"\"\n }\n ],\n \"type\": \"privilege\",\n \"compactTransactionId\": \"\",\n \"dateOfIssuance\": \"1632-10-06\",\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2989-04-09\",\n \"privilegeId\": \"\",\n \"providerId\": \"f3981490-3938-4976-b957-7123142c46de\",\n \"dateOfRenewal\": \"1356-01-30\",\n \"dateOfUpdate\": \"\",\n \"status\": \"inactive\"\n }\n }\n ],\n \"jurisdiction\": \"ky\",\n \"licenseJurisdiction\": \"fl\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"11ec1f36-39ef-411d-9ed6-0218a17bde45\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"investigationStatus\": \"underInvestigation\",\n \"investigations\": [\n {\n \"compact\": \"aslp\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"va\",\n \"licenseType\": \"\",\n \"providerId\": \"f78a6f18-b3bd-4937-9a6c-b48d88245048\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n },\n {\n \"compact\": \"coun\",\n \"creationDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"investigationId\": \"\",\n \"jurisdiction\": \"oh\",\n \"licenseType\": \"\",\n \"providerId\": \"bf956261-d85b-4589-9cdb-446467415ef6\",\n \"submittingUser\": \"\",\n \"type\": \"investigation\"\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"1572-08-30\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1663-10-30\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"nd\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"edea6027-5ae7-4c1f-a412-a29bed40d673\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"1688-10-12\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1780-08-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2812-12-13\",\n \"encumbranceType\": \"\",\n \"jurisdiction\": \"al\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"f488d06a-d37c-4736-ba3a-c9d02cead4fa\",\n \"type\": \"adverseAction\",\n \"clinicalPrivilegeActionCategories\": [\n \"\",\n \"\"\n ],\n \"effectiveLiftDate\": \"2996-12-11\",\n \"clinicalPrivilegeActionCategory\": \"\",\n \"liftingUser\": \"\"\n }\n ]\n }\n ],\n \"providerId\": \"9b5458d5-9c52-41cd-b3b1-95f5c4affc2c\",\n \"type\": \"provider\",\n \"npi\": \"2535279913\",\n \"compactEligibility\": \"ineligible\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1940-02-02\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"in\",\n \"ssnLastFour\": \"5671\",\n \"licenseStatus\": \"inactive\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -4430,7 +4430,7 @@ "value": "application/json" } ], - "id": "f58dc51f-63d7-41b7-a52e-e56066b688de", + "id": "2e29babb-949f-4960-b5cd-e641b2923e21", "name": "200 response", "originalRequest": { "body": {}, @@ -4471,7 +4471,7 @@ "item": [ { "event": [], - "id": "d352b487-b7c4-4758-a7da-f53b35d4cd82", + "id": "154faaa4-1c24-44e2-869e-f2862cca561c", "name": "/v1/provider-users/me/email", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4526,7 +4526,7 @@ "value": "application/json" } ], - "id": "d9f05380-e746-4dea-96a3-a20db5eec6bb", + "id": "334aee2c-a6ef-48a3-acf9-695813214900", "name": "200 response", "originalRequest": { "body": { @@ -4581,7 +4581,7 @@ "item": [ { "event": [], - "id": "182fff22-f3ea-440b-87ef-913bc93a6d75", + "id": "1a449848-b642-4d2b-91f3-bce7b7f8f0f8", "name": "/v1/provider-users/me/email/verify", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4595,7 +4595,7 @@ "language": "json" } }, - "raw": "{\n \"verificationCode\": \"1411\"\n}" + "raw": "{\n \"verificationCode\": \"6671\"\n}" }, "description": {}, "header": [ @@ -4637,7 +4637,7 @@ "value": "application/json" } ], - "id": "64eaecec-f63c-4062-bc73-eb706740e230", + "id": "63d859da-d627-49e6-84b5-0f85687795b4", "name": "200 response", "originalRequest": { "body": { @@ -4648,7 +4648,7 @@ "language": "json" } }, - "raw": "{\n \"verificationCode\": \"1411\"\n}" + "raw": "{\n \"verificationCode\": \"6671\"\n}" }, "header": [ { @@ -4699,7 +4699,7 @@ "item": [ { "event": [], - "id": "b440fb1a-4f50-4393-96c1-7f6f7d3d845c", + "id": "0e3cf433-7bf5-4222-a18c-e7370b5b0af6", "name": "/v1/provider-users/me/home-jurisdiction", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4713,7 +4713,7 @@ "language": "json" } }, - "raw": "{\n \"jurisdiction\": \"tx\"\n}" + "raw": "{\n \"jurisdiction\": \"ia\"\n}" }, "description": {}, "header": [ @@ -4754,7 +4754,7 @@ "value": "application/json" } ], - "id": "9933842d-156a-409d-bb69-fb4895d93b48", + "id": "b3a68e61-c492-42b9-a62d-d2c3ffe4caac", "name": "200 response", "originalRequest": { "body": { @@ -4765,7 +4765,7 @@ "language": "json" } }, - "raw": "{\n \"jurisdiction\": \"tx\"\n}" + "raw": "{\n \"jurisdiction\": \"ia\"\n}" }, "header": [ { @@ -4824,7 +4824,7 @@ "item": [ { "event": [], - "id": "f9aa112a-2f76-441e-998c-bb1e4173cbff", + "id": "a5573123-c770-472d-aea9-e0fdc266d466", "name": "/v1/provider-users/me/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4882,7 +4882,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1286-11-12\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1357-08-04\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"7fb7b7d6-5bc5-49cb-819b-59b10919270e\"\n}", + "body": "{\n \"compact\": \"octp\",\n \"events\": [\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1230-11-04\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"2425-11-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"in\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"d89a7efe-5041-4146-96a6-3f76cf1296f6\"\n}", "code": 200, "cookie": [], "header": [ @@ -4891,7 +4891,7 @@ "value": "application/json" } ], - "id": "9ba1a2d3-cd5c-4092-bda4-140665c77799", + "id": "f187e63c-a81d-4da7-88fb-af6a9b178320", "name": "200 response", "originalRequest": { "body": {}, @@ -4952,7 +4952,7 @@ "item": [ { "event": [], - "id": "16e0bd1c-e1b3-476b-9da4-a02d35ef261f", + "id": "257b92af-e83f-4677-9b8f-8bf35a995060", "name": "/v1/provider-users/me/military-affiliation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -4966,7 +4966,7 @@ "language": "json" } }, - "raw": "{\n \"affiliationType\": \"militaryMember\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}" + "raw": "{\n \"affiliationType\": \"militaryMemberSpouse\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}" }, "description": {}, "header": [ @@ -4998,7 +4998,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"affiliationType\": \"militaryMember\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"2066-05-18\",\n \"documentUploadFields\": [\n {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n },\n \"url\": \"\"\n },\n {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\"\n },\n \"url\": \"\"\n }\n ],\n \"status\": \"\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}", + "body": "{\n \"affiliationType\": \"militaryMemberSpouse\",\n \"dateOfUpdate\": \"\",\n \"dateOfUpload\": \"1541-01-20\",\n \"documentUploadFields\": [\n {\n \"fields\": {\n \"key_0\": \"\",\n \"key_1\": \"\",\n \"key_2\": \"\"\n },\n \"url\": \"\"\n },\n {\n \"fields\": {\n \"key_0\": \"\"\n },\n \"url\": \"\"\n }\n ],\n \"status\": \"\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}", "code": 200, "cookie": [], "header": [ @@ -5007,7 +5007,7 @@ "value": "application/json" } ], - "id": "4f2dea70-4628-4c0d-afab-c6f3bdd5e0bc", + "id": "dd95b21d-fb30-4eb7-8368-9074c44dff0b", "name": "200 response", "originalRequest": { "body": { @@ -5018,7 +5018,7 @@ "language": "json" } }, - "raw": "{\n \"affiliationType\": \"militaryMember\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}" + "raw": "{\n \"affiliationType\": \"militaryMemberSpouse\",\n \"fileNames\": [\n \"\",\n \"\"\n ]\n}" }, "header": [ { @@ -5059,7 +5059,7 @@ }, { "event": [], - "id": "6c1eb812-17eb-4ff6-860e-3676f973b248", + "id": "e6755b3d-9e1c-4153-872d-fd3529b1237e", "name": "/v1/provider-users/me/military-affiliation", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5114,7 +5114,7 @@ "value": "application/json" } ], - "id": "3431646e-8b34-401d-9077-76a0c7912a78", + "id": "00c89a32-e0f2-4a3f-97f2-9539bc3e468c", "name": "200 response", "originalRequest": { "body": { @@ -5175,7 +5175,7 @@ "item": [ { "event": [], - "id": "99d23e3a-ef91-4750-9634-b1562cf546b6", + "id": "7a395ce2-3d57-4e53-8f28-bbafb685d43e", "name": "/v1/provider-users/registration", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5192,7 +5192,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"\",\n \"dob\": \"2310-02-17\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" + "raw": "{\n \"compact\": \"\",\n \"dob\": \"2895-11-06\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" }, "description": {}, "header": [ @@ -5232,7 +5232,7 @@ "value": "application/json" } ], - "id": "264c18b6-922c-4538-a973-391dbfa64ce7", + "id": "148da7ca-0bc4-4cde-9d70-d6ebf187f8f2", "name": "200 response", "originalRequest": { "body": { @@ -5243,7 +5243,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"\",\n \"dob\": \"2310-02-17\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ri\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" + "raw": "{\n \"compact\": \"\",\n \"dob\": \"2895-11-06\",\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"speech-language pathologist\",\n \"partialSocial\": \"\",\n \"token\": \"\"\n}" }, "header": [ { @@ -5281,7 +5281,7 @@ "item": [ { "event": [], - "id": "74c14299-fa42-4a78-86fe-229cd46bc733", + "id": "1ae7f606-a7b2-40f3-a0ac-cfe256c74a18", "name": "/v1/provider-users/verifyRecovery", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5298,7 +5298,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"coun\",\n \"providerId\": \"88d333c4-ad53-48b9-83a9-835bf4192ab2\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" + "raw": "{\n \"compact\": \"octp\",\n \"providerId\": \"4ea47a54-7e2f-4daf-972c-3ccb4e0769d5\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" }, "description": {}, "header": [ @@ -5338,7 +5338,7 @@ "value": "application/json" } ], - "id": "145b3686-29c6-4d7f-b210-4fa16df96d33", + "id": "19213d8a-2ffe-4638-9219-38ed3bf87dd8", "name": "200 response", "originalRequest": { "body": { @@ -5349,7 +5349,7 @@ "language": "json" } }, - "raw": "{\n \"compact\": \"coun\",\n \"providerId\": \"88d333c4-ad53-48b9-83a9-835bf4192ab2\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" + "raw": "{\n \"compact\": \"octp\",\n \"providerId\": \"4ea47a54-7e2f-4daf-972c-3ccb4e0769d5\",\n \"recaptchaToken\": \"\",\n \"recoveryToken\": \"\"\n}" }, "header": [ { @@ -5399,7 +5399,7 @@ "item": [ { "event": [], - "id": "296414b7-8456-4ec8-ad73-e92f382c2547", + "id": "a59f2d74-1c6e-4a97-8738-97cb1be17b72", "name": "/v1/public/compacts/:compact/jurisdictions", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5456,7 +5456,7 @@ "value": "application/json" } ], - "id": "addb6945-efc9-4ef6-b683-a11bae71f7d6", + "id": "72e88f34-ee26-44ac-a566-c164190a4b7e", "name": "200 response", "originalRequest": { "body": {}, @@ -5497,7 +5497,7 @@ "item": [ { "event": [], - "id": "f9bdb227-6300-42f5-88a1-39b37115c66d", + "id": "41c7aac2-b45e-459d-a159-1c6fd4ae71b5", "name": "/v1/public/compacts/:compact/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5514,7 +5514,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"eae96496-f3d1-4e50-a01e-d9f0888ad726\",\n \"jurisdiction\": \"ak\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"36fe3faf-ce25-4c63-b5f3-abb953a85e3f\",\n \"jurisdiction\": \"nm\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}" }, "description": {}, "header": [ @@ -5559,7 +5559,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"octp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ms\",\n \"privilegeJurisdictions\": [\n \"nj\",\n \"nm\"\n ],\n \"providerId\": \"ac354e7c-cd7e-409c-8a4d-65a86c572e33\",\n \"type\": \"provider\",\n \"npi\": \"3517135718\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"wi\",\n \"dateOfUpdate\": \"\"\n },\n {\n \"compact\": \"octp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"mn\",\n \"privilegeJurisdictions\": [\n \"ak\",\n \"co\"\n ],\n \"providerId\": \"d91e948a-c276-4c19-b430-fa13ccaf32b8\",\n \"type\": \"provider\",\n \"npi\": \"0261363651\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"il\",\n \"dateOfUpdate\": \"\"\n }\n ],\n \"query\": {\n \"providerId\": \"cb89668b-63c0-4582-a553-94617e6d0097\",\n \"jurisdiction\": \"wa\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"compact\": \"aslp\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"vi\",\n \"privilegeJurisdictions\": [\n \"la\",\n \"ga\"\n ],\n \"providerId\": \"2e8a387a-728c-4578-8f51-75b06d14524f\",\n \"type\": \"provider\",\n \"npi\": \"7333815991\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"tn\",\n \"dateOfUpdate\": \"\"\n },\n {\n \"compact\": \"coun\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"ny\",\n \"privilegeJurisdictions\": [\n \"nc\",\n \"in\"\n ],\n \"providerId\": \"f06facba-de4b-4655-b9bb-174711a35f80\",\n \"type\": \"provider\",\n \"npi\": \"3402315844\",\n \"middleName\": \"\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"ks\",\n \"dateOfUpdate\": \"\"\n }\n ],\n \"query\": {\n \"providerId\": \"c3e96162-5b8f-403a-bc61-06f2eb9664e6\",\n \"jurisdiction\": \"ct\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"sorting\": {\n \"key\": \"dateOfUpdate\",\n \"direction\": \"ascending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -5568,7 +5568,7 @@ "value": "application/json" } ], - "id": "2716aaa6-b137-4dd0-959f-4fe4edaa56ca", + "id": "8997fc38-2c70-4bc4-a3bc-ebe512fd7df8", "name": "200 response", "originalRequest": { "body": { @@ -5579,7 +5579,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"providerId\": \"eae96496-f3d1-4e50-a01e-d9f0888ad726\",\n \"jurisdiction\": \"ak\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"ascending\"\n }\n}" + "raw": "{\n \"query\": {\n \"providerId\": \"36fe3faf-ce25-4c63-b5f3-abb953a85e3f\",\n \"jurisdiction\": \"nm\",\n \"givenName\": \"\",\n \"familyName\": \"\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"key\": \"familyName\",\n \"direction\": \"descending\"\n }\n}" }, "header": [ { @@ -5620,7 +5620,7 @@ "item": [ { "event": [], - "id": "1d7b4cd3-9bc4-4ccb-a1e0-2cb76964f83a", + "id": "591e37e5-f41b-43f7-ab3b-275447a86d24", "name": "/v1/public/compacts/:compact/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5679,7 +5679,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"nv\",\n \"privilegeJurisdictions\": [\n \"oh\",\n \"hi\"\n ],\n \"providerId\": \"04c0d954-8741-48cd-83bd-964b473bb841\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"2354-12-29\",\n \"dateOfIssuance\": \"1527-12-27\",\n \"dateOfRenewal\": \"1486-10-05\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"vt\",\n \"licenseJurisdiction\": \"ky\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"4936e414-4edb-440e-bc47-55695b7e6c91\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ne\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1215-10-18\",\n \"dateOfIssuance\": \"2661-02-09\",\n \"dateOfRenewal\": \"1088-12-08\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"dc\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"83c395e8-92d8-4107-9a84-833ad1fce6a1\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"renewal\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1931-10-08\",\n \"licenseJurisdiction\": \"mt\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1269-11-16\",\n \"dateOfIssuance\": \"2386-04-22\",\n \"dateOfUpdate\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"tx\",\n \"licenseType\": \"occupational therapy assistant\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2467-01-31\",\n \"dateOfIssuance\": \"1078-11-31\",\n \"dateOfRenewal\": \"1241-11-30\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"oh\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"b6e89969-065e-4a37-ab14-94bdd6ae29ab\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2572-08-06\",\n \"licenseJurisdiction\": \"al\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1328-04-30\",\n \"dateOfIssuance\": \"1666-08-25\",\n \"dateOfUpdate\": \"\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1667-12-14\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2094-10-21\",\n \"jurisdiction\": \"ar\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"a3b4dad1-49ef-4f0e-8f40-d9e73054fbbe\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1496-11-21\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2416-11-29\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2000-02-17\",\n \"jurisdiction\": \"ct\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"525d0039-ca65-4a85-9f6c-7f1500bcc021\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2453-01-07\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"1324-10-07\",\n \"dateOfIssuance\": \"1861-07-09\",\n \"dateOfRenewal\": \"1614-10-12\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"nc\",\n \"licenseJurisdiction\": \"wv\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"f7829923-b276-41b9-b4c6-4e8bf819217f\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ca\",\n \"licenseType\": \"audiologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2169-12-31\",\n \"dateOfIssuance\": \"2488-03-21\",\n \"dateOfRenewal\": \"1988-03-31\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"mn\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"9f401e88-be6f-491f-bbb7-16b5c5d664c1\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"deactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2275-03-24\",\n \"licenseJurisdiction\": \"ne\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2543-12-05\",\n \"dateOfIssuance\": \"2780-05-18\",\n \"dateOfUpdate\": \"\"\n }\n },\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ut\",\n \"licenseType\": \"speech-language pathologist\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2258-04-30\",\n \"dateOfIssuance\": \"2012-04-24\",\n \"dateOfRenewal\": \"2152-06-07\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"mt\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"5c0ef8d9-8699-4d2f-be7f-32eaad3e2857\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"lifting_encumbrance\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1906-11-26\",\n \"licenseJurisdiction\": \"az\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2107-04-07\",\n \"dateOfIssuance\": \"2939-09-19\",\n \"dateOfUpdate\": \"\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1820-01-04\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1749-11-02\",\n \"jurisdiction\": \"wv\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4fb50855-a5e2-4d68-a10a-c1351b4f259a\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1940-02-02\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"1581-04-11\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1272-08-28\",\n \"jurisdiction\": \"ny\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"5829561d-3880-46e3-92a5-ac2ed16b57a5\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2744-09-30\"\n }\n ]\n }\n ],\n \"npi\": \"2886024112\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"vi\",\n \"middleName\": \"\"\n}", + "body": "{\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"licenseJurisdiction\": \"al\",\n \"privilegeJurisdictions\": [\n \"ct\",\n \"nc\"\n ],\n \"providerId\": \"b8e9a88a-6649-48c9-9c4d-39a0256d5dde\",\n \"type\": \"provider\",\n \"privileges\": [\n {\n \"administratorSetStatus\": \"inactive\",\n \"compact\": \"octp\",\n \"dateOfExpiration\": \"1986-10-20\",\n \"dateOfIssuance\": \"1662-10-30\",\n \"dateOfRenewal\": \"2946-10-06\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"az\",\n \"licenseJurisdiction\": \"ct\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"3b950d69-722f-4c6a-8d96-f988b8a8fad0\",\n \"status\": \"inactive\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"coun\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ct\",\n \"licenseType\": \"licensed professional counselor\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2147-05-30\",\n \"dateOfIssuance\": \"1588-06-19\",\n \"dateOfRenewal\": \"2566-04-30\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"ny\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"02e716d2-a904-4f81-8c22-8bfdebb4bec2\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"licenseDeactivation\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"2930-09-23\",\n \"licenseJurisdiction\": \"nm\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2362-09-15\",\n \"dateOfIssuance\": \"2685-12-30\",\n \"dateOfUpdate\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"ky\",\n \"licenseType\": \"occupational therapy assistant\",\n \"previous\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1953-10-07\",\n \"dateOfIssuance\": \"2767-07-04\",\n \"dateOfRenewal\": \"1924-05-31\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"dc\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"9867acc2-b67e-43fa-addd-4432e61d6be9\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1648-11-14\",\n \"licenseJurisdiction\": \"la\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"2787-03-16\",\n \"dateOfIssuance\": \"2519-09-24\",\n \"dateOfUpdate\": \"\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1625-10-31\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1012-11-28\",\n \"jurisdiction\": \"nm\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"e06b09b2-88aa-421c-83e3-22297d0f8de4\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2114-10-03\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"octp\",\n \"creationDate\": \"2560-11-14\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1129-02-10\",\n \"jurisdiction\": \"ut\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"ba43fcc4-1327-4e36-a033-7380ee054b98\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2025-05-08\"\n }\n ]\n },\n {\n \"administratorSetStatus\": \"active\",\n \"compact\": \"coun\",\n \"dateOfExpiration\": \"1991-06-30\",\n \"dateOfIssuance\": \"1735-11-23\",\n \"dateOfRenewal\": \"1886-12-22\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"sd\",\n \"licenseJurisdiction\": \"in\",\n \"licenseType\": \"audiologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"1cf5fc6f-c5d3-4324-ba23-b164fc54ee2c\",\n \"status\": \"active\",\n \"type\": \"privilege\",\n \"history\": [\n {\n \"compact\": \"octp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"sc\",\n \"licenseType\": \"occupational therapist\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"2252-07-16\",\n \"dateOfIssuance\": \"2133-12-30\",\n \"dateOfRenewal\": \"1267-10-14\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"tn\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"348f1664-5e02-42d7-a17f-0e493a567cf2\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1846-02-17\",\n \"licenseJurisdiction\": \"nh\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1052-04-04\",\n \"dateOfIssuance\": \"1717-10-30\",\n \"dateOfUpdate\": \"\"\n }\n },\n {\n \"compact\": \"aslp\",\n \"dateOfUpdate\": \"\",\n \"jurisdiction\": \"tn\",\n \"licenseType\": \"occupational therapist\",\n \"previous\": {\n \"administratorSetStatus\": \"inactive\",\n \"dateOfExpiration\": \"1435-11-01\",\n \"dateOfIssuance\": \"1058-12-02\",\n \"dateOfRenewal\": \"1021-07-10\",\n \"dateOfUpdate\": \"\",\n \"licenseJurisdiction\": \"ak\",\n \"privilegeId\": \"\"\n },\n \"providerId\": \"863e4569-58f7-4fa4-a7c7-2e97779e1cd9\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"updatedValues\": {\n \"administratorSetStatus\": \"active\",\n \"dateOfExpiration\": \"1516-11-31\",\n \"licenseJurisdiction\": \"de\",\n \"privilegeId\": \"\",\n \"dateOfRenewal\": \"1017-09-30\",\n \"dateOfIssuance\": \"2217-12-20\",\n \"dateOfUpdate\": \"\"\n }\n }\n ],\n \"adverseActions\": [\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"aslp\",\n \"creationDate\": \"1258-11-25\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"2168-12-30\",\n \"jurisdiction\": \"il\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"4487cfc6-97ad-46d7-a942-433ce98423bc\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"1268-09-30\"\n },\n {\n \"actionAgainst\": \"\",\n \"adverseActionId\": \"\",\n \"compact\": \"coun\",\n \"creationDate\": \"2019-04-04\",\n \"dateOfUpdate\": \"\",\n \"effectiveStartDate\": \"1250-06-30\",\n \"jurisdiction\": \"mt\",\n \"licenseType\": \"\",\n \"licenseTypeAbbreviation\": \"\",\n \"providerId\": \"9ca3a75b-ca10-47db-8884-b9f1df71ae62\",\n \"type\": \"adverseAction\",\n \"effectiveLiftDate\": \"2878-11-30\"\n }\n ]\n }\n ],\n \"npi\": \"1820740143\",\n \"suffix\": \"\",\n \"currentHomeJurisdiction\": \"pr\",\n \"middleName\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -5688,7 +5688,7 @@ "value": "application/json" } ], - "id": "9a5fe0d0-21f5-4b99-a812-0742bc0cf19a", + "id": "78220f24-ba91-48b4-bca6-26cc84183cd3", "name": "200 response", "originalRequest": { "body": {}, @@ -5736,7 +5736,7 @@ "item": [ { "event": [], - "id": "eb4341b2-434e-45bb-bee6-0d17629a640f", + "id": "fd716311-dce7-4a37-979f-304a141f0b43", "name": "/v1/public/compacts/:compact/providers/:providerId/jurisdiction/:jurisdiction/licenseType/:licenseType/history", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5820,7 +5820,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"compact\": \"coun\",\n \"events\": [\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1286-11-12\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"emailChange\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1357-08-04\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"homeJurisdictionChange\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"ms\",\n \"licenseType\": \"occupational therapist\",\n \"privilegeId\": \"\",\n \"providerId\": \"7fb7b7d6-5bc5-49cb-819b-59b10919270e\"\n}", + "body": "{\n \"compact\": \"octp\",\n \"events\": [\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"1230-11-04\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n },\n {\n \"createDate\": \"\",\n \"dateOfUpdate\": \"\",\n \"effectiveDate\": \"2425-11-31\",\n \"type\": \"privilegeUpdate\",\n \"updateType\": \"registration\",\n \"note\": \"\"\n }\n ],\n \"jurisdiction\": \"in\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"d89a7efe-5041-4146-96a6-3f76cf1296f6\"\n}", "code": 200, "cookie": [], "header": [ @@ -5829,7 +5829,7 @@ "value": "application/json" } ], - "id": "60cb93b2-b757-43d1-8e01-a7aa8affc3b2", + "id": "231c170a-79c9-4426-9ab8-9a76fb6dbd78", "name": "200 response", "originalRequest": { "body": {}, @@ -5891,6 +5891,114 @@ } ], "name": "compacts" + }, + { + "description": "", + "item": [ + { + "description": "", + "item": [ + { + "event": [], + "id": "52dc84cd-5caa-447f-a9c6-0f67edb88947", + "name": "/v1/public/jurisdictions/live", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "noauth" + }, + "body": {}, + "description": {}, + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "method": "GET", + "name": "/v1/public/jurisdictions/live", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "public", + "jurisdictions", + "live" + ], + "query": [ + { + "description": { + "content": "", + "type": "text/plain" + }, + "disabled": false, + "key": "compact", + "value": "" + } + ], + "variable": [] + } + }, + "response": [ + { + "_postman_previewlanguage": "json", + "body": "{\n \"key_0\": [\n \"ut\",\n \"wv\"\n ]\n}", + "code": 200, + "cookie": [], + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "id": "c7228003-70c9-4263-8f12-b132ff502951", + "name": "200 response", + "originalRequest": { + "body": {}, + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "method": "GET", + "url": { + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "public", + "jurisdictions", + "live" + ], + "query": [ + { + "description": { + "content": "", + "type": "text/plain" + }, + "disabled": false, + "key": "compact", + "value": "" + } + ], + "variable": [] + } + }, + "status": "OK" + } + ] + } + ], + "name": "live" + } + ], + "name": "jurisdictions" } ], "name": "public" @@ -5903,7 +6011,7 @@ "item": [ { "event": [], - "id": "8173c9a8-c017-40e2-b20e-89c7eb6efa01", + "id": "77058b43-efa8-4c30-bba6-f9d1edf387db", "name": "/v1/purchases/privileges", "protocolProfileBehavior": { "disableBodyPruning": true @@ -5917,7 +6025,7 @@ "language": "json" } }, - "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"3\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"04667985\"\n }\n ],\n \"licenseType\": \"audiologist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"wi\",\n \"in\"\n ]\n}" + "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"978179715\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"96663263\"\n }\n ],\n \"licenseType\": \"occupational therapist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"vt\",\n \"mt\"\n ]\n}" }, "description": {}, "header": [ @@ -5957,7 +6065,7 @@ "value": "application/json" } ], - "id": "f22c485b-f732-4689-92a0-b9fc9a404de7", + "id": "6d02f8ec-d2a0-43e6-a831-016fadbf70fc", "name": "200 response", "originalRequest": { "body": { @@ -5968,7 +6076,7 @@ "language": "json" } }, - "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"3\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"04667985\"\n }\n ],\n \"licenseType\": \"audiologist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"wi\",\n \"in\"\n ]\n}" + "raw": "{\n \"attestations\": [\n {\n \"attestationId\": \"\",\n \"version\": \"978179715\"\n },\n {\n \"attestationId\": \"\",\n \"version\": \"96663263\"\n }\n ],\n \"licenseType\": \"occupational therapist\",\n \"orderInformation\": {\n \"opaqueData\": {\n \"dataDescriptor\": \"\",\n \"dataValue\": \"\"\n }\n },\n \"selectedJurisdictions\": [\n \"vt\",\n \"mt\"\n ]\n}" }, "header": [ { @@ -6011,7 +6119,7 @@ "item": [ { "event": [], - "id": "7dce28d8-cd92-4406-9c61-d65caa85ba43", + "id": "44420427-e1a1-4f6a-8c55-c446bd397150", "name": "/v1/purchases/privileges/options", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6053,7 +6161,7 @@ "value": "application/json" } ], - "id": "4453c953-533b-4328-824a-2a38a31b500d", + "id": "0211181c-f18a-4ee5-974a-3ffd066af744", "name": "200 response", "originalRequest": { "body": {}, @@ -6107,7 +6215,7 @@ "item": [ { "event": [], - "id": "b228dd44-defc-4578-9f15-3d42315a62ad", + "id": "eaef01d3-0498-4681-8a8b-8f61c1fa42bb", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6139,7 +6247,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -6157,7 +6265,7 @@ "value": "" } ], - "id": "249c5aad-8180-43bc-aa29-a858aa320fe8", + "id": "50509350-3bf2-4d40-9a12-ca779d159cd6", "name": "200 response", "originalRequest": { "body": {}, @@ -6202,7 +6310,7 @@ "value": "application/json" } ], - "id": "a2f9f3e8-921e-484b-b8bc-c97e7ea47cfc", + "id": "3d2c2a65-b4d5-4c77-aadc-794c9e50f644", "name": "404 response", "originalRequest": { "body": {}, @@ -6240,7 +6348,7 @@ }, { "event": [], - "id": "fc9dac50-f39d-4bff-9e9e-ebacc7519547", + "id": "0c887909-602d-46f4-9d1c-b55d4c08c53e", "name": "/v1/staff-users/me", "protocolProfileBehavior": { "disableBodyPruning": true @@ -6285,7 +6393,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", + "body": "{\n \"attributes\": {\n \"email\": \"\",\n \"familyName\": \"\",\n \"givenName\": \"\"\n },\n \"permissions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_2\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n },\n \"key_1\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n },\n \"key_3\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"readSSN\": \"\"\n },\n \"jurisdictions\": {\n \"key_0\": {\n \"actions\": {\n \"readPrivate\": \"\",\n \"admin\": \"\",\n \"write\": \"\",\n \"readSSN\": \"\"\n }\n }\n }\n }\n },\n \"status\": \"active\",\n \"userId\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -6303,7 +6411,7 @@ "value": "" } ], - "id": "b4a91250-1614-4596-b78b-ba22c2a9bef0", + "id": "fec1dfd7-6449-47c0-a6b6-d0757a6f4f48", "name": "200 response", "originalRequest": { "body": { @@ -6361,7 +6469,7 @@ "value": "application/json" } ], - "id": "a402d321-4de2-4440-bd71-f00c01220dcb", + "id": "f6663f03-5203-4ec2-a071-fd93d1b627aa", "name": "404 response", "originalRequest": { "body": { diff --git a/backend/compact-connect/docs/postman/postman-collection.json b/backend/compact-connect/docs/postman/postman-collection.json index 56a050310..90ab6b2f7 100644 --- a/backend/compact-connect/docs/postman/postman-collection.json +++ b/backend/compact-connect/docs/postman/postman-collection.json @@ -10,7 +10,7 @@ "type": "bearer" }, "info": { - "_postman_id": "3571a230-4680-400f-baeb-e2ce6861a894", + "_postman_id": "2dd3c79b-7848-4980-8615-72b6b4c2b4b7", "description": { "content": "", "type": "text/plain" @@ -410,7 +410,7 @@ "item": [ { "event": [], - "id": "9a0df7b8-8d2d-4f65-8618-7951c4d60e6a", + "id": "e4992458-08cd-4c8b-acbf-59af7b7e3a75", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses", "protocolProfileBehavior": { "disableBodyPruning": true @@ -424,7 +424,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1635-04-07\",\n \"dateOfExpiration\": \"2365-08-04\",\n \"dateOfIssuance\": \"2535-11-02\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"ssn\": \"516-71-4118\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8157619352\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+411669509084\",\n \"dateOfRenewal\": \"1569-01-22\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1090-08-30\",\n \"dateOfExpiration\": \"2707-01-17\",\n \"dateOfIssuance\": \"1248-01-06\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"563-39-1789\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4640556947\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+30075668\",\n \"dateOfRenewal\": \"2105-01-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1607-11-17\",\n \"dateOfExpiration\": \"2885-05-26\",\n \"dateOfIssuance\": \"1146-03-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"151-51-8414\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7741340530\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+3849258700\",\n \"dateOfRenewal\": \"2882-02-09\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1479-12-06\",\n \"dateOfExpiration\": \"1919-12-10\",\n \"dateOfIssuance\": \"1300-04-29\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"971-92-2380\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6327468598\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+925079022127\",\n \"dateOfRenewal\": \"1269-03-19\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "description": {}, "header": [ @@ -488,7 +488,7 @@ "value": "application/json" } ], - "id": "54f28dca-10e5-49e1-8d9d-1adc13e55aa3", + "id": "a4a13d96-78a0-4ab6-8fb1-af82a1d3c500", "name": "200 response", "originalRequest": { "body": { @@ -499,7 +499,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1635-04-07\",\n \"dateOfExpiration\": \"2365-08-04\",\n \"dateOfIssuance\": \"2535-11-02\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"ssn\": \"516-71-4118\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8157619352\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+411669509084\",\n \"dateOfRenewal\": \"1569-01-22\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1090-08-30\",\n \"dateOfExpiration\": \"2707-01-17\",\n \"dateOfIssuance\": \"1248-01-06\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"563-39-1789\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4640556947\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+30075668\",\n \"dateOfRenewal\": \"2105-01-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1607-11-17\",\n \"dateOfExpiration\": \"2885-05-26\",\n \"dateOfIssuance\": \"1146-03-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"151-51-8414\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7741340530\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+3849258700\",\n \"dateOfRenewal\": \"2882-02-09\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1479-12-06\",\n \"dateOfExpiration\": \"1919-12-10\",\n \"dateOfIssuance\": \"1300-04-29\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"971-92-2380\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6327468598\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+925079022127\",\n \"dateOfRenewal\": \"1269-03-19\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -549,7 +549,7 @@ "value": "application/json" } ], - "id": "a4047a00-f95d-442c-b847-c265520d113d", + "id": "a367f319-890c-4b07-82e6-f0159f7909a8", "name": "400 response", "originalRequest": { "body": { @@ -560,7 +560,7 @@ "language": "json" } }, - "raw": "[\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1635-04-07\",\n \"dateOfExpiration\": \"2365-08-04\",\n \"dateOfIssuance\": \"2535-11-02\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"speech-language pathologist\",\n \"ssn\": \"516-71-4118\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"8157619352\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+411669509084\",\n \"dateOfRenewal\": \"1569-01-22\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1090-08-30\",\n \"dateOfExpiration\": \"2707-01-17\",\n \"dateOfIssuance\": \"1248-01-06\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"563-39-1789\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"4640556947\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+30075668\",\n \"dateOfRenewal\": \"2105-01-31\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" + "raw": "[\n {\n \"compactEligibility\": \"ineligible\",\n \"dateOfBirth\": \"1607-11-17\",\n \"dateOfExpiration\": \"2885-05-26\",\n \"dateOfIssuance\": \"1146-03-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"151-51-8414\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"7741340530\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+3849258700\",\n \"dateOfRenewal\": \"2882-02-09\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compactEligibility\": \"eligible\",\n \"dateOfBirth\": \"1479-12-06\",\n \"dateOfExpiration\": \"1919-12-10\",\n \"dateOfIssuance\": \"1300-04-29\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"homeAddressCity\": \"\",\n \"homeAddressPostalCode\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressStreet1\": \"\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"licensed professional counselor\",\n \"ssn\": \"971-92-2380\",\n \"homeAddressStreet2\": \"\",\n \"npi\": \"6327468598\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"phoneNumber\": \"+925079022127\",\n \"dateOfRenewal\": \"1269-03-19\",\n \"licenseNumber\": \"\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n]" }, "header": [ { @@ -631,7 +631,7 @@ } } ], - "id": "f36e5266-4c1b-4a6d-ae4a-6a681dadc41e", + "id": "17440cb5-a8c9-4e7b-8660-6588d8a9d001", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/licenses/bulk-upload", "protocolProfileBehavior": { "disableBodyPruning": true @@ -697,7 +697,7 @@ "value": "application/json" } ], - "id": "56b8e399-fd49-432b-8918-8373d75f1ebc", + "id": "1e851c00-2aab-4ab4-9e5a-0a2a05bc1bf7", "name": "200 response", "originalRequest": { "body": {}, @@ -751,7 +751,7 @@ "item": [ { "event": [], - "id": "b325870b-ec61-40c4-9776-0721b3a6366e", + "id": "7aff71f6-348b-440e-8fbc-bae6dff7732b", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/providers/query", "protocolProfileBehavior": { "disableBodyPruning": true @@ -765,7 +765,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"endDateTime\": \"1120-11-25T20:58:29Z\",\n \"startDateTime\": \"1526-04-28T20:20:11Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"endDateTime\": \"2768-12-31T21:50:21Z\",\n \"startDateTime\": \"1344-03-17T23:04:37Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" }, "description": {}, "header": [ @@ -821,7 +821,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"16-17\",\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2836-06-09\",\n \"dateOfUpdate\": \"1247-07-25\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"nd\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"ut\",\n \"mi\"\n ],\n \"providerId\": \"7949f998-a425-4314-8cfb-923824d72df7\",\n \"type\": \"provider\",\n \"npi\": \"5628588603\",\n \"dateOfBirth\": \"2933-05-18\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"3860\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"01-26\",\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1276-11-30\",\n \"dateOfUpdate\": \"2503-12-11\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"active\",\n \"licenseJurisdiction\": \"nc\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"ne\",\n \"ca\"\n ],\n \"providerId\": \"4b84c91f-83fa-4655-a88e-d6cc1b9eda65\",\n \"type\": \"provider\",\n \"npi\": \"9655842338\",\n \"dateOfBirth\": \"1763-02-18\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"4504\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}", + "body": "{\n \"pagination\": {\n \"prevLastKey\": {},\n \"lastKey\": {},\n \"pageSize\": \"\"\n },\n \"providers\": [\n {\n \"birthMonthDay\": \"05-36\",\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1378-07-14\",\n \"dateOfUpdate\": \"1918-09-24\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"ineligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"nh\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"nd\",\n \"ma\"\n ],\n \"providerId\": \"1e754c66-bcb7-48d9-8b0b-12a108fb94fd\",\n \"type\": \"provider\",\n \"npi\": \"8783122207\",\n \"dateOfBirth\": \"2750-12-30\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"5085\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n },\n {\n \"birthMonthDay\": \"19-02\",\n \"compact\": \"coun\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"1439-02-11\",\n \"dateOfUpdate\": \"1062-09-25\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdictionUploadedCompactEligibility\": \"eligible\",\n \"jurisdictionUploadedLicenseStatus\": \"inactive\",\n \"licenseJurisdiction\": \"mi\",\n \"licenseStatus\": \"active\",\n \"privilegeJurisdictions\": [\n \"sd\",\n \"ky\"\n ],\n \"providerId\": \"379ed99f-db30-41b5-88e3-369a153f1716\",\n \"type\": \"provider\",\n \"npi\": \"0274556733\",\n \"dateOfBirth\": \"1391-10-06\",\n \"suffix\": \"\",\n \"ssnLastFour\": \"8798\",\n \"middleName\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\"\n }\n ],\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}", "code": 200, "cookie": [], "header": [ @@ -830,7 +830,7 @@ "value": "application/json" } ], - "id": "fa67be96-7a81-4fbf-85eb-cf9837a2d3a2", + "id": "614232ac-e418-4618-a5c8-acaf9aeef875", "name": "200 response", "originalRequest": { "body": { @@ -841,7 +841,7 @@ "language": "json" } }, - "raw": "{\n \"query\": {\n \"endDateTime\": \"1120-11-25T20:58:29Z\",\n \"startDateTime\": \"1526-04-28T20:20:11Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"descending\"\n }\n}" + "raw": "{\n \"query\": {\n \"endDateTime\": \"2768-12-31T21:50:21Z\",\n \"startDateTime\": \"1344-03-17T23:04:37Z\"\n },\n \"pagination\": {\n \"lastKey\": \"\",\n \"pageSize\": \"\"\n },\n \"sorting\": {\n \"direction\": \"ascending\"\n }\n}" }, "header": [ { @@ -891,7 +891,7 @@ "item": [ { "event": [], - "id": "47a9dfac-fcd1-4fbb-a6c8-d4da3d174c5b", + "id": "a454e304-f168-451f-8def-24a377fa6f44", "name": "/v1/compacts/:compact/jurisdictions/:jurisdiction/providers/:providerId", "protocolProfileBehavior": { "disableBodyPruning": true @@ -958,7 +958,7 @@ "response": [ { "_postman_previewlanguage": "json", - "body": "{\n \"privileges\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1372-09-27\",\n \"dateOfIssuance\": \"2650-01-31\",\n \"dateOfRenewal\": \"2117-11-31\",\n \"dateOfUpdate\": \"1475-09-04\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"wy\",\n \"licenseJurisdiction\": \"in\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"216361eb-adbc-402b-8066-4e534963870a\",\n \"status\": \"active\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"2756906983\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"2676-01-06\",\n \"ssnLastFour\": \"3462\",\n \"phoneNumber\": \"+46030480739\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compact\": \"coun\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"2073-11-30\",\n \"dateOfIssuance\": \"2209-12-03\",\n \"dateOfRenewal\": \"1868-05-30\",\n \"dateOfUpdate\": \"1045-10-29\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ms\",\n \"licenseJurisdiction\": \"mn\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"occupational therapy assistant\",\n \"privilegeId\": \"\",\n \"providerId\": \"9a2df7c8-57ae-457d-a9ee-66b1dbd96046\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"7748811116\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"1080-02-08\",\n \"ssnLastFour\": \"1114\",\n \"phoneNumber\": \"+88477899480\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n ],\n \"providerUIUrl\": \"\"\n}", + "body": "{\n \"privileges\": [\n {\n \"compact\": \"aslp\",\n \"compactEligibility\": \"eligible\",\n \"dateOfExpiration\": \"1744-10-04\",\n \"dateOfIssuance\": \"2547-11-19\",\n \"dateOfRenewal\": \"2433-11-03\",\n \"dateOfUpdate\": \"1383-11-12\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ct\",\n \"licenseJurisdiction\": \"nj\",\n \"licenseStatus\": \"inactive\",\n \"licenseType\": \"licensed professional counselor\",\n \"privilegeId\": \"\",\n \"providerId\": \"339453dd-5ddf-4592-bf48-0491ee1dd127\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"1692585889\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"1741-11-30\",\n \"ssnLastFour\": \"6801\",\n \"phoneNumber\": \"+7617633940581\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n },\n {\n \"compact\": \"octp\",\n \"compactEligibility\": \"ineligible\",\n \"dateOfExpiration\": \"2460-10-30\",\n \"dateOfIssuance\": \"2105-02-30\",\n \"dateOfRenewal\": \"1126-02-27\",\n \"dateOfUpdate\": \"2918-08-30\",\n \"familyName\": \"\",\n \"givenName\": \"\",\n \"jurisdiction\": \"ct\",\n \"licenseJurisdiction\": \"ca\",\n \"licenseStatus\": \"active\",\n \"licenseType\": \"speech-language pathologist\",\n \"privilegeId\": \"\",\n \"providerId\": \"e943dcb6-630b-4510-bba5-e6fb1bf7b688\",\n \"status\": \"inactive\",\n \"type\": \"statePrivilege\",\n \"homeAddressStreet2\": \"\",\n \"homeAddressStreet1\": \"\",\n \"suffix\": \"\",\n \"emailAddress\": \"\",\n \"homeAddressState\": \"\",\n \"homeAddressCity\": \"\",\n \"licenseNumber\": \"\",\n \"compactConnectRegisteredEmailAddress\": \"\",\n \"npi\": \"3740829736\",\n \"homeAddressPostalCode\": \"\",\n \"dateOfBirth\": \"1879-06-31\",\n \"ssnLastFour\": \"8866\",\n \"phoneNumber\": \"+59156261550\",\n \"middleName\": \"\",\n \"licenseStatusName\": \"\"\n }\n ],\n \"providerUIUrl\": \"\"\n}", "code": 200, "cookie": [], "header": [ @@ -967,7 +967,7 @@ "value": "application/json" } ], - "id": "12623830-9521-4644-8ce9-2b532f41605b", + "id": "1ad41a6a-7de7-4bcc-8979-407410439cf2", "name": "200 response", "originalRequest": { "body": {}, diff --git a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py index 57e901412..eba2dc143 100644 --- a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py +++ b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py @@ -2862,7 +2862,9 @@ def patch_privilege_investigation_request_model(self) -> Model: description='Patch privilege investigation request model', schema=JsonSchema( type=JsonSchemaType.OBJECT, + required=['action'], properties={ + 'action': JsonSchema(type=JsonSchemaType.STRING, enum=['close']), 'encumbrance': self._encumbrance_request_schema, }, ), @@ -2880,7 +2882,9 @@ def patch_license_investigation_request_model(self) -> Model: description='Patch license investigation request model', schema=JsonSchema( type=JsonSchemaType.OBJECT, + required=['action'], properties={ + 'action': JsonSchema(type=JsonSchemaType.STRING, enum=['close']), 'encumbrance': self._encumbrance_request_schema, }, ), diff --git a/backend/compact-connect/tests/resources/snapshots/PATCH_LICENSE_INVESTIGATION_REQUEST_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/PATCH_LICENSE_INVESTIGATION_REQUEST_SCHEMA.json index 2a01092b4..2bf548c90 100644 --- a/backend/compact-connect/tests/resources/snapshots/PATCH_LICENSE_INVESTIGATION_REQUEST_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/PATCH_LICENSE_INVESTIGATION_REQUEST_SCHEMA.json @@ -1,5 +1,11 @@ { "properties": { + "action": { + "enum": [ + "close" + ], + "type": "string" + }, "encumbrance": { "additionalProperties": false, "description": "Encumbrance data to create", @@ -50,6 +56,9 @@ "type": "object" } }, + "required": [ + "action" + ], "type": "object", "$schema": "http://json-schema.org/draft-04/schema#" } diff --git a/backend/compact-connect/tests/resources/snapshots/PATCH_PRIVILEGE_INVESTIGATION_REQUEST_SCHEMA.json b/backend/compact-connect/tests/resources/snapshots/PATCH_PRIVILEGE_INVESTIGATION_REQUEST_SCHEMA.json index 2a01092b4..2bf548c90 100644 --- a/backend/compact-connect/tests/resources/snapshots/PATCH_PRIVILEGE_INVESTIGATION_REQUEST_SCHEMA.json +++ b/backend/compact-connect/tests/resources/snapshots/PATCH_PRIVILEGE_INVESTIGATION_REQUEST_SCHEMA.json @@ -1,5 +1,11 @@ { "properties": { + "action": { + "enum": [ + "close" + ], + "type": "string" + }, "encumbrance": { "additionalProperties": false, "description": "Encumbrance data to create", @@ -50,6 +56,9 @@ "type": "object" } }, + "required": [ + "action" + ], "type": "object", "$schema": "http://json-schema.org/draft-04/schema#" } diff --git a/backend/compact-connect/tests/smoke/investigation_smoke_tests.py b/backend/compact-connect/tests/smoke/investigation_smoke_tests.py index e4fcd9b94..347699287 100755 --- a/backend/compact-connect/tests/smoke/investigation_smoke_tests.py +++ b/backend/compact-connect/tests/smoke/investigation_smoke_tests.py @@ -311,11 +311,11 @@ def test_close_privilege_investigation(auth_headers): investigation_id = _verify_investigation_exists('privilege', jurisdiction, license_type) - # Close investigation (empty JSON body) + # Close investigation (no encumbrance) response = requests.patch( f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/privileges/jurisdiction/{jurisdiction}' f'/licenseType/{license_type_abbreviation}/investigation/{investigation_id}', - json={}, + json={'action': 'close'}, headers=auth_headers, timeout=30, ) @@ -346,12 +346,12 @@ def test_close_license_investigation(auth_headers): investigation_id = _verify_investigation_exists('license', jurisdiction, license_type) - # Close investigation (empty JSON body) + # Close investigation (no encumbrance) response = requests.patch( f'{config.api_base_url}/v1/compacts/{compact}/providers/{provider_id}/licenses/jurisdiction/{jurisdiction}' f'/licenseType/{license_type_abbreviation}/investigation/{investigation_id}', headers=auth_headers, - json={}, + json={'action': 'close'}, timeout=30, ) @@ -392,6 +392,7 @@ def test_close_privilege_investigation_with_encumbrance(auth_headers): # Close investigation with encumbrance close_data = { + 'action': 'close', 'encumbrance': { 'encumbranceEffectiveDate': '2024-01-15', 'encumbranceType': 'fine', From 17e3afc248dcb0f99636981230b99a8223ea7bc3 Mon Sep 17 00:00:00 2001 From: Justin Frahm Date: Mon, 10 Nov 2025 14:56:38 -0700 Subject: [PATCH 33/33] Use `api.add_model()` instead of `Model()` --- .../stacks/api_stack/v1_api/api_model.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py index eba2dc143..a774757a9 100644 --- a/backend/compact-connect/stacks/api_stack/v1_api/api_model.py +++ b/backend/compact-connect/stacks/api_stack/v1_api/api_model.py @@ -2823,10 +2823,8 @@ def check_feature_flag_response_model(self) -> Model: def post_privilege_investigation_request_model(self) -> Model: """POST privilege investigation request model""" if not hasattr(self.api, '_v1_post_privilege_investigation_request_model'): - self.api._v1_post_privilege_investigation_request_model = Model( - self.api, + self.api._v1_post_privilege_investigation_request_model = self.api.add_model( 'V1PostPrivilegeInvestigationRequestModel', - rest_api=self.api, description='Post privilege investigation request model', schema=JsonSchema( type=JsonSchemaType.OBJECT, @@ -2839,10 +2837,8 @@ def post_privilege_investigation_request_model(self) -> Model: def post_license_investigation_request_model(self) -> Model: """POST license investigation request model""" if not hasattr(self.api, '_v1_post_license_investigation_request_model'): - self.api._v1_post_license_investigation_request_model = Model( - self.api, + self.api._v1_post_license_investigation_request_model = self.api.add_model( 'V1PostLicenseInvestigationRequestModel', - rest_api=self.api, description='Post license investigation request model', schema=JsonSchema( type=JsonSchemaType.OBJECT, @@ -2855,10 +2851,8 @@ def post_license_investigation_request_model(self) -> Model: def patch_privilege_investigation_request_model(self) -> Model: """PATCH privilege investigation request model""" if not hasattr(self.api, '_v1_patch_privilege_investigation_request_model'): - self.api._v1_patch_privilege_investigation_request_model = Model( - self.api, + self.api._v1_patch_privilege_investigation_request_model = self.api.add_model( 'V1PatchPrivilegeInvestigationRequestModel', - rest_api=self.api, description='Patch privilege investigation request model', schema=JsonSchema( type=JsonSchemaType.OBJECT, @@ -2875,10 +2869,8 @@ def patch_privilege_investigation_request_model(self) -> Model: def patch_license_investigation_request_model(self) -> Model: """PATCH license investigation request model""" if not hasattr(self.api, '_v1_patch_license_investigation_request_model'): - self.api._v1_patch_license_investigation_request_model = Model( - self.api, + self.api._v1_patch_license_investigation_request_model = self.api.add_model( 'V1PatchLicenseInvestigationRequestModel', - rest_api=self.api, description='Patch license investigation request model', schema=JsonSchema( type=JsonSchemaType.OBJECT,