Skip to content

Commit c7c003b

Browse files
Setting license and privilege encumbrance status
1 parent 87b230b commit c7c003b

File tree

6 files changed

+160
-46
lines changed

6 files changed

+160
-46
lines changed

backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py

Lines changed: 97 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@
1313
from cc_common.data_model.schema import PrivilegeRecordSchema
1414
from cc_common.data_model.schema.adverse_action import AdverseActionData
1515
from cc_common.data_model.schema.base_record import SSNIndexRecordSchema
16-
from cc_common.data_model.schema.common import ActiveInactiveStatus, CompactEligibilityStatus, UpdateCategory
16+
from cc_common.data_model.schema.common import (
17+
ActiveInactiveStatus,
18+
LicenseEncumberedStatusEnum,
19+
PrivilegeEncumberedStatusEnum,
20+
UpdateCategory,
21+
)
1722
from cc_common.data_model.schema.home_jurisdiction.record import ProviderHomeJurisdictionSelectionRecordSchema
1823
from cc_common.data_model.schema.license import LicenseData, LicenseUpdateData
1924
from cc_common.data_model.schema.military_affiliation.common import (
@@ -23,6 +28,7 @@
2328
from cc_common.data_model.schema.military_affiliation.record import MilitaryAffiliationRecordSchema
2429
from cc_common.data_model.schema.privilege import PrivilegeData, PrivilegeUpdateData
2530
from cc_common.data_model.schema.privilege.record import PrivilegeUpdateRecordSchema
31+
from cc_common.data_model.schema.provider import ProviderData
2632
from cc_common.exceptions import (
2733
CCAwsServiceException,
2834
CCInternalException,
@@ -921,10 +927,10 @@ def deactivate_privilege(
921927

922928
return privilege_record
923929

924-
def _generate_set_administrator_set_status_item(
930+
def _generate_set_privilege_encumbered_status_item(
925931
self,
926932
privilege_data: PrivilegeData,
927-
status_to_set: ActiveInactiveStatus,
933+
privilege_encumbered_status: PrivilegeEncumberedStatusEnum,
928934
):
929935
privilege_data_record = privilege_data.serialize_to_database_record()
930936
return {
@@ -934,18 +940,18 @@ def _generate_set_administrator_set_status_item(
934940
'pk': {'S': privilege_data_record['pk']},
935941
'sk': {'S': privilege_data_record['sk']},
936942
},
937-
'UpdateExpression': 'SET administratorSetStatus = :status, dateOfUpdate = :dateOfUpdate',
943+
'UpdateExpression': 'SET encumberedStatus = :status, dateOfUpdate = :dateOfUpdate',
938944
'ExpressionAttributeValues': {
939-
':status': {'S': status_to_set},
945+
':status': {'S': privilege_encumbered_status},
940946
':dateOfUpdate': {'S': self.config.current_standard_datetime.isoformat()},
941947
},
942948
},
943949
}
944950

945-
def _generate_set_license_compact_eligibility_status_item(
951+
def _generate_set_license_encumbered_status_item(
946952
self,
947953
license_data: LicenseData,
948-
compact_eligibility_status: CompactEligibilityStatus,
954+
license_encumbered_status: LicenseEncumberedStatusEnum,
949955
):
950956
license_data_record = license_data.serialize_to_database_record()
951957
return {
@@ -955,9 +961,31 @@ def _generate_set_license_compact_eligibility_status_item(
955961
'pk': {'S': license_data_record['pk']},
956962
'sk': {'S': license_data_record['sk']},
957963
},
958-
'UpdateExpression': 'SET compactEligibility = :status, dateOfUpdate = :dateOfUpdate',
964+
'UpdateExpression': 'SET encumberedStatus = :status, dateOfUpdate = :dateOfUpdate',
959965
'ExpressionAttributeValues': {
960-
':status': {'S': compact_eligibility_status},
966+
':status': {'S': license_encumbered_status},
967+
':dateOfUpdate': {'S': self.config.current_standard_datetime.isoformat()},
968+
},
969+
},
970+
}
971+
972+
def _generate_set_provider_encumbered_status_item(
973+
self,
974+
provider_data: ProviderData,
975+
# licenses and providers share the same encumbered status enum
976+
provider_encumbered_status: LicenseEncumberedStatusEnum,
977+
):
978+
provider_data_record = provider_data.serialize_to_database_record()
979+
return {
980+
'Update': {
981+
'TableName': self.config.provider_table.name,
982+
'Key': {
983+
'pk': {'S': provider_data_record['pk']},
984+
'sk': {'S': provider_data_record['sk']},
985+
},
986+
'UpdateExpression': 'SET encumberedStatus = :status, dateOfUpdate = :dateOfUpdate',
987+
'ExpressionAttributeValues': {
988+
':status': {'S': provider_encumbered_status},
961989
':dateOfUpdate': {'S': self.config.current_standard_datetime.isoformat()},
962990
},
963991
},
@@ -1003,14 +1031,14 @@ def encumber_privilege(self, adverse_action: AdverseActionData) -> None:
10031031

10041032
privilege_data = PrivilegeData.from_database_record(privilege_record)
10051033

1006-
need_to_set_privilege_to_inactive = True
1007-
# If already inactive, do nothing
1008-
if privilege_data.administratorSetStatus == ActiveInactiveStatus.INACTIVE:
1009-
logger.info('Privilege already inactive. Not updating "administratorSetStatus" field')
1010-
need_to_set_privilege_to_inactive = False
1034+
need_to_set_privilege_to_encumbered = True
1035+
# If already encumbered, do nothing
1036+
if privilege_data.encumberedStatus == PrivilegeEncumberedStatusEnum.ENCUMBERED:
1037+
logger.info('Privilege already encumbered. Not updating "encumberedStatus" field')
1038+
need_to_set_privilege_to_encumbered = False
10111039
else:
10121040
logger.info(
1013-
'Privilege is currently active. Setting privilege into an inactive state as part of update.'
1041+
'Privilege is currently active. Setting privilege into an encumbered state as part of update.'
10141042
)
10151043

10161044
# Create the update record
@@ -1028,9 +1056,9 @@ def encumber_privilege(self, adverse_action: AdverseActionData) -> None:
10281056
**privilege_data.to_dict(),
10291057
},
10301058
'updatedValues': {
1031-
'administratorSetStatus': ActiveInactiveStatus.INACTIVE,
1059+
'encumberedStatus': PrivilegeEncumberedStatusEnum.ENCUMBERED,
10321060
}
1033-
if need_to_set_privilege_to_inactive
1061+
if need_to_set_privilege_to_encumbered
10341062
else {},
10351063
}
10361064
).serialize_to_database_record()
@@ -1046,12 +1074,12 @@ def encumber_privilege(self, adverse_action: AdverseActionData) -> None:
10461074
self._generate_put_transaction_item(adverse_action.serialize_to_database_record()),
10471075
]
10481076

1049-
if need_to_set_privilege_to_inactive:
1050-
# Set the privilege record's administratorSetStatus to inactive and update the dateOfUpdate
1077+
if need_to_set_privilege_to_encumbered:
1078+
# Set the privilege record's encumberedStatus to encumbered and update the dateOfUpdate
10511079
transact_items.append(
1052-
self._generate_set_administrator_set_status_item(
1080+
self._generate_set_privilege_encumbered_status_item(
10531081
privilege_data=privilege_data,
1054-
status_to_set=ActiveInactiveStatus.INACTIVE,
1082+
privilege_encumbered_status=PrivilegeEncumberedStatusEnum.ENCUMBERED,
10551083
)
10561084
)
10571085
self.config.dynamodb_client.transact_write_items(
@@ -1092,14 +1120,40 @@ def encumber_license(self, adverse_action: AdverseActionData) -> None:
10921120

10931121
license_data = LicenseData.from_database_record(license_record)
10941122

1095-
need_to_set_license_to_ineligible = True
1096-
# If already ineligible, do nothing
1097-
if license_data.compactEligibility == CompactEligibilityStatus.INELIGIBLE:
1098-
logger.info('License already ineligible. Not updating license compact eligibility status')
1099-
need_to_set_license_to_ineligible = False
1123+
need_to_set_license_to_encumbered = True
1124+
# If already encumbered, do nothing
1125+
if license_data.encumberedStatus == LicenseEncumberedStatusEnum.ENCUMBERED:
1126+
logger.info('License already encumbered. Not updating license compact eligibility status')
1127+
need_to_set_license_to_encumbered = False
11001128
else:
11011129
logger.info(
1102-
'License is currently eligible. Setting license into an ineligible state as part of update.'
1130+
'License is currently unencumbered. Setting license into an encumbered state as part of update.'
1131+
)
1132+
1133+
# in the case of a license encumbrance, we need to update the provider record to encumbered
1134+
# as well as the license record to denote that the provider is encumbered as a result of the license
1135+
# encumbrance
1136+
try:
1137+
provider_record = self.config.provider_table.get_item(
1138+
Key={
1139+
'pk': f'{adverse_action.compact}#PROVIDER#{adverse_action.providerId}',
1140+
'sk': f'{adverse_action.compact}#PROVIDER',
1141+
},
1142+
)['Item']
1143+
except KeyError as e:
1144+
message = 'Provider not found'
1145+
logger.info(message)
1146+
raise CCNotFoundException(message) from e
1147+
1148+
provider_data = ProviderData.from_database_record(provider_record)
1149+
1150+
need_to_set_provider_to_encumbered = True
1151+
if provider_data.encumberedStatus == LicenseEncumberedStatusEnum.ENCUMBERED:
1152+
logger.info('Provider already encumbered. Not updating provider encumbered status')
1153+
need_to_set_provider_to_encumbered = False
1154+
else:
1155+
logger.info(
1156+
'Provider is currently unencumbered. Setting provider into an encumbered state as part of update.'
11031157
)
11041158

11051159
# Create the update record
@@ -1117,9 +1171,9 @@ def encumber_license(self, adverse_action: AdverseActionData) -> None:
11171171
**license_data.to_dict(),
11181172
},
11191173
'updatedValues': {
1120-
'compactEligibility': CompactEligibilityStatus.INELIGIBLE,
1174+
'encumberedStatus': LicenseEncumberedStatusEnum.ENCUMBERED,
11211175
}
1122-
if need_to_set_license_to_ineligible
1176+
if need_to_set_license_to_encumbered
11231177
else {},
11241178
}
11251179
).serialize_to_database_record()
@@ -1134,14 +1188,24 @@ def encumber_license(self, adverse_action: AdverseActionData) -> None:
11341188
self._generate_put_transaction_item(adverse_action.serialize_to_database_record()),
11351189
]
11361190

1137-
if need_to_set_license_to_ineligible:
1138-
# Set the license record's compactEligibility to ineligible and update the dateOfUpdate
1191+
if need_to_set_license_to_encumbered:
1192+
# Set the license record's encumberedStatus to encumbered
11391193
transact_items.append(
1140-
self._generate_set_license_compact_eligibility_status_item(
1194+
self._generate_set_license_encumbered_status_item(
11411195
license_data=license_data,
1142-
compact_eligibility_status=CompactEligibilityStatus.INELIGIBLE,
1196+
license_encumbered_status=LicenseEncumberedStatusEnum.ENCUMBERED,
1197+
)
1198+
)
1199+
1200+
if need_to_set_provider_to_encumbered:
1201+
# Set the provider record's encumberedStatus to encumbered
1202+
transact_items.append(
1203+
self._generate_set_provider_encumbered_status_item(
1204+
provider_data=provider_data,
1205+
provider_encumbered_status=LicenseEncumberedStatusEnum.ENCUMBERED,
11431206
)
11441207
)
1208+
11451209
self.config.dynamodb_client.transact_write_items(
11461210
TransactItems=transact_items,
11471211
)

backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/license/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,10 @@ def jurisdictionUploadedCompactEligibility(self) -> str:
129129
def compactEligibility(self) -> str:
130130
return self._data['compactEligibility']
131131

132+
@property
133+
def encumberedStatus(self) -> str | None:
134+
return self._data.get('encumberedStatus')
135+
132136

133137
class LicenseUpdateData(CCDataClass):
134138
"""

backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/privilege/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,14 @@ def administratorSetStatus(self, value: ActiveInactiveStatus) -> None:
118118
# since the schema loads this value as a string.
119119
self._data['administratorSetStatus'] = value.value if isinstance(value, ActiveInactiveStatus) else value
120120

121+
@property
122+
def encumberedStatus(self) -> str | None:
123+
return self._data.get('encumberedStatus')
124+
125+
@encumberedStatus.setter
126+
def encumberedStatus(self, value: str) -> None:
127+
self._data['encumberedStatus'] = value
128+
121129
@property
122130
def status(self) -> str:
123131
"""

backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/provider/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,7 @@ def birthMonthDay(self) -> str | None:
125125
@property
126126
def privilegeJurisdictions(self) -> set[str]:
127127
return self._data.get('privilegeJurisdictions', set())
128+
129+
@property
130+
def encumberedStatus(self) -> str | None:
131+
return self._data.get('encumberedStatus')

backend/compact-connect/lambdas/python/common/cc_common/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ def authorized(event: dict, context: LambdaContext):
226226
return fn(event, context)
227227

228228
return authorized
229-
229+
230230

231231
class authorize_state_level_only_action: # noqa: N801 invalid-name
232232
"""Authorize endpoint by matching path parameter compact to the expected scope limited to state level

0 commit comments

Comments
 (0)