Merge branch 'dev' into feature/lanes_and_roles

This commit is contained in:
Aaron Louie 2020-07-16 14:00:53 -04:00
commit d67105332f
20 changed files with 564 additions and 461 deletions

36
Pipfile.lock generated
View File

@ -319,10 +319,11 @@
},
"flask-sqlalchemy": {
"hashes": [
"sha256:0b656fbf87c5f24109d859bafa791d29751fabbda2302b606881ae5485b557a5",
"sha256:fcfe6df52cd2ed8a63008ca36b86a51fa7a4b70cef1c39e5625f722fca32308e"
"sha256:05b31d2034dd3f2a685cbbae4cfc4ed906b2a733cff7964ada450fd5e462b84e",
"sha256:bfc7150eaf809b1c283879302f04c42791136060c6eeb12c0c6674fb1291fae5"
],
"version": "==2.4.3"
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==2.4.4"
},
"future": {
"hashes": [
@ -411,8 +412,12 @@
},
"ldap3": {
"hashes": [
"sha256:17f04298b70bf7ecaa5db8a7d8622b5a962ef7fc2b245b2eea705ac1c24338c0",
"sha256:81df4ac8b6df10fb1f05b17c18d0cb8c4c344d5a03083c382824960ed959cf5b"
"sha256:298769ab0232b3a3efa1e84881096c24526fe37911c83a11285f222fe4975efd",
"sha256:81df4ac8b6df10fb1f05b17c18d0cb8c4c344d5a03083c382824960ed959cf5b",
"sha256:53aaae5bf14f3827c69600ddf4d61b88f49c055bb93060e9702c5bafd206c744",
"sha256:4fd2db72d0412cc16ee86be01332095e86e361329c3579b314231eb2e56c7871",
"sha256:52ab557b3c4908db4a90bea16731aa714b1b54e039b54fd4c4b83994c6c48c0c",
"sha256:17f04298b70bf7ecaa5db8a7d8622b5a962ef7fc2b245b2eea705ac1c24338c0"
],
"index": "pypi",
"version": "==2.7"
@ -641,8 +646,19 @@
},
"pyasn1": {
"hashes": [
"sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7",
"sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576",
"sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8",
"sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86",
"sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba",
"sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00",
"sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2",
"sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf",
"sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359",
"sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d",
"sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"
"sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3",
"sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776",
"sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12"
],
"version": "==0.4.8"
},
@ -697,9 +713,11 @@
},
"python-editor": {
"hashes": [
"sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d",
"sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8",
"sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b",
"sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8"
"sha256:c3da2053dbab6b29c94e43c486ff67206eafbe7eb52dbec7390b5e2fb05aac77",
"sha256:ea87e17f6ec459e780e4221f295411462e0d0810858e055fc514684350a2f522",
"sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d"
],
"version": "==1.0.4"
},
@ -882,7 +900,7 @@
"spiffworkflow": {
"editable": true,
"git": "https://github.com/sartography/SpiffWorkflow.git",
"ref": "bf9fdcd51846126e0acc8eeccad1a16c8b8330ce"
"ref": "c72ced41e323aa69fcb6f7708e1869e98add716d"
},
"sqlalchemy": {
"hashes": [

View File

@ -30,7 +30,7 @@ SQLALCHEMY_DATABASE_URI = environ.get(
default="postgresql://%s:%s@%s:%s/%s" % (DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME)
)
TOKEN_AUTH_TTL_HOURS = float(environ.get('TOKEN_AUTH_TTL_HOURS', default=24))
TOKEN_AUTH_SECRET_KEY = environ.get('TOKEN_AUTH_SECRET_KEY', default="Shhhh!!! This is secret! And better darn well not show up in prod.")
SECRET_KEY = environ.get('SECRET_KEY', default="Shhhh!!! This is secret! And better darn well not show up in prod.")
FRONTEND_AUTH_CALLBACK = environ.get('FRONTEND_AUTH_CALLBACK', default="http://localhost:4200/session")
SWAGGER_AUTH_KEY = environ.get('SWAGGER_AUTH_KEY', default="SWAGGER")

View File

@ -5,7 +5,7 @@ basedir = os.path.abspath(os.path.dirname(__file__))
NAME = "CR Connect Workflow"
TESTING = True
TOKEN_AUTH_SECRET_KEY = "Shhhh!!! This is secret! And better darn well not show up in prod."
SECRET_KEY = "Shhhh!!! This is secret! And better darn well not show up in prod."
# This is here, for when we are running the E2E Tests in the frontend code bases.
# which will set the TESTING envronment to true, causing this to execute, but we need

View File

@ -33,15 +33,36 @@ class NavigationItem(object):
class Task(object):
##########################################################################
# Custom properties and validations defined in Camunda form fields #
##########################################################################
# Repeating form section
PROP_OPTIONS_REPEAT = "repeat"
PROP_OPTIONS_FILE = "spreadsheet.name"
PROP_OPTIONS_VALUE_COLUMN = "spreadsheet.value.column"
PROP_OPTIONS_LABEL_COL = "spreadsheet.label.column"
# Read-only field
PROP_OPTIONS_READ_ONLY = "read_only"
# LDAP lookup
PROP_LDAP_LOOKUP = "ldap.lookup"
VALIDATION_REQUIRED = "required"
# Autocomplete field
FIELD_TYPE_AUTO_COMPLETE = "autocomplete"
# Required field
VALIDATION_REQUIRED = "required"
# Enum field options values pulled from a spreadsheet
PROP_OPTIONS_FILE_NAME = "spreadsheet.name"
PROP_OPTIONS_FILE_VALUE_COLUMN = "spreadsheet.value.column"
PROP_OPTIONS_FILE_LABEL_COLUMN = "spreadsheet.label.column"
# Enum field options values pulled from task data
PROP_OPTIONS_DATA_NAME = "data.name"
PROP_OPTIONS_DATA_VALUE_COLUMN = "data.value.column"
PROP_OPTIONS_DATA_LABEL_COLUMN = "data.label.column"
##########################################################################
def __init__(self, id, name, title, type, state, lane, form, documentation, data,
multi_instance_type, multi_instance_count, multi_instance_index,

View File

@ -144,7 +144,6 @@ class LookupFileModel(db.Model):
"""Gives us a quick way to tell what kind of lookup is set on a form field.
Connected to the file data model, so that if a new version of the same file is
created, we can update the listing."""
#fixme: What happens if they change the file associated with a lookup field?
__tablename__ = 'lookup_file'
id = db.Column(db.Integer, primary_key=True)
workflow_spec_id = db.Column(db.String)

View File

@ -35,7 +35,7 @@ class UserModel(db.Model):
}
return jwt.encode(
payload,
app.config.get('TOKEN_AUTH_SECRET_KEY'),
app.config.get('SECRET_KEY'),
algorithm='HS256',
)
@ -47,7 +47,7 @@ class UserModel(db.Model):
:return: integer|string
"""
try:
payload = jwt.decode(auth_token, app.config.get('TOKEN_AUTH_SECRET_KEY'), algorithms='HS256')
payload = jwt.decode(auth_token, app.config.get('SECRET_KEY'), algorithms='HS256')
return payload
except jwt.ExpiredSignatureError:
raise ApiError('token_expired', 'The Authentication token you provided expired and must be renewed.')

View File

@ -192,7 +192,7 @@ Returns information specific to the protocol.
"workflow_spec_id": "irb_api_details",
},
'protocol': {
id: 0,
'id': 0,
}
}
}

View File

@ -4,7 +4,7 @@ from collections import OrderedDict
import pandas as pd
from pandas import ExcelFile, np
from sqlalchemy import func, desc
from sqlalchemy import desc
from sqlalchemy.sql.functions import GenericFunction
from crc import db
@ -76,11 +76,12 @@ class LookupService(object):
@staticmethod
def create_lookup_model(workflow_model, field_id):
"""
This is all really expensive, but should happen just once (per file change).
Checks to see if the options are provided in a separate lookup table associated with the
workflow, and if so, assures that data exists in the database, and return a model than can be used
to locate that data.
Returns: an array of LookupData, suitable for returning to the api.
This is all really expensive, but should happen just once (per file change).
Checks to see if the options are provided in a separate lookup table associated with the workflow, and if so,
assures that data exists in the database, and return a model than can be used to locate that data.
Returns: an array of LookupData, suitable for returning to the API.
"""
processor = WorkflowProcessor(workflow_model) # VERY expensive, Ludicrous for lookup / type ahead
spiff_task, field = processor.find_task_and_field_by_field_id(field_id)
@ -92,21 +93,21 @@ class LookupService(object):
for model in existing_models: # Do it one at a time to cause the required cascade of deletes.
db.session.delete(model)
if field.has_property(Task.PROP_OPTIONS_FILE):
if not field.has_property(Task.PROP_OPTIONS_VALUE_COLUMN) or \
not field.has_property(Task.PROP_OPTIONS_LABEL_COL):
raise ApiError.from_task("invalid_emum",
# Use the contents of a file to populate enum field options
if field.has_property(Task.PROP_OPTIONS_FILE_NAME):
if not (field.has_property(Task.PROP_OPTIONS_FILE_VALUE_COLUMN) or
field.has_property(Task.PROP_OPTIONS_FILE_LABEL_COLUMN)):
raise ApiError.from_task("invalid_enum",
"For enumerations based on an xls file, you must include 3 properties: %s, "
"%s, and %s" % (Task.PROP_OPTIONS_FILE,
Task.PROP_OPTIONS_VALUE_COLUMN,
Task.PROP_OPTIONS_LABEL_COL),
"%s, and %s" % (Task.PROP_OPTIONS_FILE_NAME,
Task.PROP_OPTIONS_FILE_VALUE_COLUMN,
Task.PROP_OPTIONS_FILE_LABEL_COLUMN),
task=spiff_task)
# Get the file data from the File Service
file_name = field.get_property(Task.PROP_OPTIONS_FILE)
value_column = field.get_property(Task.PROP_OPTIONS_VALUE_COLUMN)
label_column = field.get_property(Task.PROP_OPTIONS_LABEL_COL)
file_name = field.get_property(Task.PROP_OPTIONS_FILE_NAME)
value_column = field.get_property(Task.PROP_OPTIONS_FILE_VALUE_COLUMN)
label_column = field.get_property(Task.PROP_OPTIONS_FILE_LABEL_COLUMN)
latest_files = FileService.get_spec_data_files(workflow_spec_id=workflow_model.workflow_spec_id,
workflow_id=workflow_model.id,
name=file_name)
@ -118,14 +119,15 @@ class LookupService(object):
lookup_model = LookupService.build_lookup_table(data_model, value_column, label_column,
workflow_model.workflow_spec_id, field_id)
# Use the results of an LDAP request to populate enum field options
elif field.has_property(Task.PROP_LDAP_LOOKUP):
lookup_model = LookupFileModel(workflow_spec_id=workflow_model.workflow_spec_id,
field_id=field_id,
is_ldap=True)
else:
raise ApiError("unknown_lookup_option",
"Lookup supports using spreadsheet options or ldap options, and neither "
"was provided.")
"Lookup supports using spreadsheet or LDAP options, "
"and neither of those was provided.")
db.session.add(lookup_model)
db.session.commit()
return lookup_model
@ -140,11 +142,11 @@ class LookupService(object):
df = xls.parse(xls.sheet_names[0]) # Currently we only look at the fist sheet.
df = pd.DataFrame(df).replace({np.nan: None})
if value_column not in df:
raise ApiError("invalid_emum",
raise ApiError("invalid_enum",
"The file %s does not contain a column named % s" % (data_model.file_model.name,
value_column))
if label_column not in df:
raise ApiError("invalid_emum",
raise ApiError("invalid_enum",
"The file %s does not contain a column named % s" % (data_model.file_model.name,
label_column))
@ -211,3 +213,4 @@ class LookupService(object):
"data": user
})
return user_list

View File

@ -167,7 +167,10 @@ class WorkflowProcessor(object):
bpmn_workflow = BpmnWorkflow(spec, script_engine=self._script_engine)
bpmn_workflow.data[WorkflowProcessor.STUDY_ID_KEY] = workflow_model.study_id
bpmn_workflow.data[WorkflowProcessor.VALIDATION_PROCESS_KEY] = validate_only
bpmn_workflow.do_engine_steps()
try:
bpmn_workflow.do_engine_steps()
except WorkflowException as we:
raise ApiError.from_task_spec("error_loading_workflow", str(we), we.sender)
return bpmn_workflow
def save(self):
@ -308,7 +311,10 @@ class WorkflowProcessor(object):
new_spec = WorkflowProcessor.get_spec(self.spec_data_files, self.workflow_spec_id)
new_bpmn_workflow = BpmnWorkflow(new_spec, script_engine=self._script_engine)
new_bpmn_workflow.data = self.bpmn_workflow.data
new_bpmn_workflow.do_engine_steps()
try:
new_bpmn_workflow.do_engine_steps()
except WorkflowException as we:
raise ApiError.from_task_spec("hard_reset_engine_steps_error", str(we), we.sender)
self.bpmn_workflow = new_bpmn_workflow
def get_status(self):

View File

@ -7,9 +7,11 @@ import random
import jinja2
from SpiffWorkflow import Task as SpiffTask, WorkflowException
from SpiffWorkflow.bpmn.specs.EndEvent import EndEvent
from SpiffWorkflow.bpmn.specs.ManualTask import ManualTask
from SpiffWorkflow.bpmn.specs.MultiInstanceTask import MultiInstanceTask
from SpiffWorkflow.bpmn.specs.ScriptTask import ScriptTask
from SpiffWorkflow.bpmn.specs.StartEvent import StartEvent
from SpiffWorkflow.bpmn.specs.UserTask import UserTask
from SpiffWorkflow.dmn.specs.BusinessRuleTask import BusinessRuleTask
from SpiffWorkflow.specs import CancelTask, StartTask
@ -104,7 +106,7 @@ class WorkflowService(object):
f" a unique user id.", task)
task_api = WorkflowService.spiff_task_to_api_task(
task,
add_docs_and_forms=True) # Assure we try to process the documenation, and raise those errors.
add_docs_and_forms=True) # Assure we try to process the documentation, and raise those errors.
WorkflowService.populate_form_with_random_data(task, task_api, required_only)
processor.complete_task(task)
except WorkflowException as we:
@ -290,20 +292,14 @@ class WorkflowService(object):
def spiff_task_to_api_task(spiff_task, add_docs_and_forms=False):
task_type = spiff_task.task_spec.__class__.__name__
if isinstance(spiff_task.task_spec, UserTask):
task_type = "UserTask"
elif isinstance(spiff_task.task_spec, ManualTask):
task_type = "ManualTask"
elif isinstance(spiff_task.task_spec, BusinessRuleTask):
task_type = "BusinessRuleTask"
elif isinstance(spiff_task.task_spec, CancelTask):
task_type = "CancelTask"
elif isinstance(spiff_task.task_spec, ScriptTask):
task_type = "ScriptTask"
elif isinstance(spiff_task.task_spec, StartTask):
task_type = "StartTask"
else:
task_type = "NoneTask"
task_types = [UserTask, ManualTask, BusinessRuleTask, CancelTask, ScriptTask, StartTask, EndEvent, StartEvent]
for t in task_types:
if isinstance(spiff_task.task_spec, t):
task_type = t.__name__
break
else:
task_type = "NoneTask"
info = spiff_task.task_info()
if info["is_looping"]:
@ -417,16 +413,39 @@ class WorkflowService(object):
# If this is an auto-complete field, do not populate options, a lookup will happen later.
if field.type == Task.FIELD_TYPE_AUTO_COMPLETE:
pass
elif field.has_property(Task.PROP_OPTIONS_FILE):
elif field.has_property(Task.PROP_OPTIONS_FILE_NAME):
lookup_model = LookupService.get_lookup_model(spiff_task, field)
data = db.session.query(LookupDataModel).filter(LookupDataModel.lookup_file_model == lookup_model).all()
if not hasattr(field, 'options'):
field.options = []
for d in data:
field.options.append({"id": d.value, "name": d.label, "data": d.data})
elif field.has_property(Task.PROP_OPTIONS_DATA_NAME):
field.options = WorkflowService.get_options_from_task_data(spiff_task, field)
return field
@staticmethod
def get_options_from_task_data(spiff_task, field):
if not (field.has_property(Task.PROP_OPTIONS_DATA_VALUE_COLUMN) or
field.has_property(Task.PROP_OPTIONS_DATA_LABEL_COLUMN)):
raise ApiError.from_task("invalid_enum",
f"For enumerations based on task data, you must include 3 properties: "
f"{Task.PROP_OPTIONS_DATA_NAME}, {Task.PROP_OPTIONS_DATA_VALUE_COLUMN}, "
f"{Task.PROP_OPTIONS_DATA_LABEL_COLUMN}", task=spiff_task)
prop = field.get_property(Task.PROP_OPTIONS_DATA_NAME)
if prop not in spiff_task.data:
raise ApiError.from_task("invalid_enum", f"For enumerations based on task data, task data must have "
f"a property called {prop}", task=spiff_task)
# Get the enum options from the task data
data_model = spiff_task.data[prop]
value_column = field.get_property(Task.PROP_OPTIONS_DATA_VALUE_COLUMN)
label_column = field.get_property(Task.PROP_OPTIONS_DATA_LABEL_COLUMN)
items = data_model.items() if isinstance(data_model, dict) else data_model
options = []
for item in items:
options.append({"id": item[value_column], "name": item[label_column], "data": item})
return options
@staticmethod
def update_task_assignments(processor):
"""For every upcoming user task, log a task action
@ -519,7 +538,7 @@ class WorkflowService(object):
@staticmethod
def extract_form_data(latest_data, task):
"""Removes data from latest_data that would be added by the child task or any of it's children."""
"""Removes data from latest_data that would be added by the child task or any of its children."""
data = {}
if hasattr(task.task_spec, 'form'):

Binary file not shown.

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1wv9t3c" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.3">
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1wv9t3c" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.5.0">
<bpmn:process id="Process_19ej1y2" name="Data Securty Plan" isExecutable="true">
<bpmn:startEvent id="StartEvent_1co48s3">
<bpmn:outgoing>SequenceFlow_100w7co</bpmn:outgoing>
@ -10,45 +10,27 @@
<camunda:formData>
<camunda:formField id="HIPAA_Ids" label="HIPAA Identifiers" type="enum">
<camunda:properties>
<camunda:property id="group" value="hipaa" />
<camunda:property id="repeat" value="hipaa" />
<camunda:property id="spreadsheet.name" value="HIPAA_Ids.xls" />
<camunda:property id="spreadsheet.value.column" value="Value" />
<camunda:property id="spreadsheet.label.column" value="Label" />
<camunda:property id="repeat_button_label" value="Add HIPAA Id" />
</camunda:properties>
<camunda:validation>
<camunda:constraint name="required" config="true" />
</camunda:validation>
<camunda:value id="HIPAA_Ids0" name="No HIPAA identifiers will be recorded as part of this research" />
<camunda:value id="HIPAA_Ids1" name="1. Name - Highly Sensitive Data " />
<camunda:value id="HIPAA_Ids2a" name="2a. Postal address includes street and/or PO Box, and town or city, state, and zip code - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids2b" name="2b. Postal address that includes only town or city, state, and/or zip code - Moderately Sensitive Data" />
<camunda:value id="HIPAA_Ids3" name="3. All date elements (except year) for dates related to an individual, e.g. service date" />
<camunda:value id="HIPAA_Ids4" name="4. Telephone numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids5" name="5. Fax numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids6" name="6. Electronic mail addresses - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids7" name="7. Social Security number - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids8" name="8. Medical Record number - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids9" name="9. Health plan beneficiary numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids10" name="10. Account numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids11" name="11. Certificate/license numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids12" name="12. Vehicle identifiers and serial numbers, including license plate numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids13" name="13. Device identifiers and serial numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids14" name="14. Web Universal Resource Locators (URLs) - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids15" name="15. Internet Protocol (IP) address numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids16" name="16. Biometric identifiers, including finger and voice prints - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids17" name="17. Full face photographic images and any comparable images - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids18" name="18. Other unique number, characteristic, code related to an individual, e.g. initials" />
</camunda:formField>
<camunda:formField id="HIPPA_IdsDataQualifiers" label="Check each that apply:" type="enum">
<camunda:formField id="HIPAA_IdsDataQualifiers" label="Check each that apply:" type="enum">
<camunda:properties>
<camunda:property id="enum_type" value="checkbox" />
<camunda:property id="group" value="hipaa" />
<camunda:property id="repeat" value="hipaa" />
<camunda:property id="hide_expression" value="console.log(&#39;this&#39;, this) || model.HIPAA_Ids === &#39;HIPAA_Ids0&#39;" />
<camunda:property id="hide_expression" value="model.HIPAA_Ids === &#39;HIPAA_Ids0&#39;" />
</camunda:properties>
<camunda:validation>
<camunda:constraint name="required" config="!(model.HIPAA_Ids === &#39;HIPAA_Ids0&#39;) || model.HIPAA_Ids == null" />
</camunda:validation>
<camunda:value id="OrigSource" name="Original source data collection (receive, collect, or record at UVa)" />
<camunda:value id="ShortTerm" name="Store long term at UVa" />
<camunda:value id="LongTerm" name="Store long term at UVa" />
<camunda:value id="SendTransOutside" name="Send or transmit outside of UVA" />
</camunda:formField>
</camunda:formData>
@ -162,28 +144,10 @@
<camunda:properties>
<camunda:property id="enum_type" value="checkbox" />
<camunda:property id="help" value="You may locate the server/drive name and path by taking the following steps:\n\n- Windows: Click your “computer icon”, right click on the Drive icon (e.g., F). Then click on ”properties”. The server/drive name and path will appear at the very top of the box.\n- If you need additional assistance, contact your department computer support or system administrator for assistance." />
<camunda:property id="spreadsheet.name" value="HIPAA_Ids.xls" />
<camunda:property id="spreadsheet.value.column" value="Value" />
<camunda:property id="spreadsheet.label.column" value="Label" />
</camunda:properties>
<camunda:value id="domatlas" name="domatlas.eservices.virginia.edu" />
<camunda:value id="dom-titan" name="dom-titan.eservices.virginia.edu" />
<camunda:value id="elson1" name="elson1.studenthealth.virginia.edu" />
<camunda:value id="es3" name="es3.eservices.virginia.edu" />
<camunda:value id="gcrcserver" name="gcrcserver.itc.virginia.edu" />
<camunda:value id="hscs-ss7" name="\\hscs-ss7" />
<camunda:value id="hscs-ss8" name="\\hscs-ss8" />
<camunda:value id="hscs-ss9" name="\\hscs-ss9" />
<camunda:value id="hscs-ss10" name="\\hscs-ss10" />
<camunda:value id="hscs-ss11" name="\\hscs-ss11" />
<camunda:value id="hscs-ss12" name="\\hscs-ss12" />
<camunda:value id="hscs-ss13" name="\\hscs-ss13" />
<camunda:value id="hscs-share1" name="\\hscs-share1\" />
<camunda:value id="hscs-share2" name="\\hscs-share2\" />
<camunda:value id="hscs-share3" name="\\hscs-share3\" />
<camunda:value id="radshare" name="\\radshare\" />
<camunda:value id="upgusers" name="upgusers.hscs.virginia.edu" />
<camunda:value id="Ivy" name="Ivy Secure Computing Platform/ Ivy Secure Cloud/Ivy Cloud" />
<camunda:value id="SECURE" name="School of Nursing SECURE NET" />
<camunda:value id="DropBoxSookasa" name="UVa HIT DropBox/Sookasa" />
<camunda:value id="Qualtrics" name=" UVa Qualtrics HSD survey tool: https://virginiahsd.co1.qualtrics.com/ControlPanel/" />
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
@ -202,31 +166,14 @@
<camunda:property id="hide_expression" value="!(model.CollStorUVaLocWebCloud)" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="CollStorUVaLocWebCloudHIPPA" label="Check all HIPAA Identifiers stored on a web based server, cloud server, and/or any non-centrally managed UVA server." type="enum">
<camunda:formField id="CollStorUVaLocWebCloudHIPAAIds" label="Check all HIPAA Identifiers stored on a web based server, cloud server, and/or any non-centrally managed UVA server." type="enum">
<camunda:properties>
<camunda:property id="enum_type" value="checkbox" />
<camunda:property id="hide_expression" value="!(model.CollStorUVaLocWebCloud)" />
<camunda:property id="spreadsheet.name" value="HIPAA_Ids.xls" />
<camunda:property id="spreadsheet.value.column" value="Value" />
<camunda:property id="spreadsheet.label.column" value="Label" />
</camunda:properties>
<camunda:value id="HIPAA_Ids0" name="No HIPAA identifiers will be recorded as part of this research" />
<camunda:value id="HIPAA_Ids1" name="1. Name - Highly Sensitive Data " />
<camunda:value id="HIPAA_Ids2a" name="2a. Postal address includes street and/or PO Box, and town or city, state, and zip code - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids2b" name="2b. Postal address that includes only town or city, state, and/or zip code - Moderately Sensitive Data" />
<camunda:value id="HIPAA_Ids3" name="3. All date elements (except year) for dates related to an individual, e.g. service date" />
<camunda:value id="HIPAA_Ids4" name="4. Telephone numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids5" name="5. Fax numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids6" name="6. Electronic mail addresses - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids7" name="7. Social Security number - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids8" name="8. Medical Record number - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids9" name="9. Health plan beneficiary numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids10" name="10. Account numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids11" name="11. Certificate/license numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids12" name="12. Vehicle identifiers and serial numbers, including license plate numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids13" name="13. Device identifiers and serial numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids14" name="14. Web Universal Resource Locators (URLs) - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids15" name="15. Internet Protocol (IP) address numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids16" name="16. Biometric identifiers, including finger and voice prints - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids17" name="17. Full face photographic images and any comparable images - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids18" name="18. Other unique number, characteristic, code related to an individual, e.g. initials" />
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
@ -253,9 +200,8 @@
<bpmn:documentation>Answer the questions for each of the Individual Use Devices that you use to collect or store your data onto your individual use device during the course of your research. Do not select these items if they are only to be used to connect elsewhere (to the items you identified in Electronic Medical Record, UVA approved eCRF or clinical trials management system, UVA servers &amp; websites, and Web-based server, cloud server, or any non-centrally managed server):</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="IUD_IndividualUseDevices" label="Individual use devices:" type="enum">
<camunda:formField id="IUD" label="Individual use devices:" type="enum">
<camunda:properties>
<camunda:property id="group" value="devices" />
<camunda:property id="repeat" value="devices" />
</camunda:properties>
<camunda:validation>
@ -276,95 +222,75 @@
<camunda:value id="FitnessTrackers" name="Fitness Trackers" />
<camunda:value id="Other" name="Other" />
</camunda:formField>
<camunda:formField id="IUD_IndividualUseDevicesOther" label="Since you selected &#34;Other&#34; above, please identify the device type:" type="textarea">
<camunda:formField id="IUD_Other" label="Since you selected &#34;Other&#34; above, please identify the device type:" type="textarea">
<camunda:properties>
<camunda:property id="rows" value="5" />
<camunda:property id="group" value="devices" />
<camunda:property id="repeat" value="devices" />
<camunda:property id="hide_expression" value="model.IUD_IndividualUseDevices !== &#39;Other&#39;" />
<camunda:property id="hide_expression" value="model.IUD !== &#39;Other&#39;" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="IUD_IndividualUseDevicesProcess" label="Please describe your process for collecting, storing and/or transmitting data on the Individual Use Devices you selected in earlier steps (phones, flash drives, CDs, etc.):" type="textarea">
<camunda:formField id="IUD_Process" label="Please describe your process for collecting, storing and/or transmitting data on the Individual Use Devices you selected in earlier steps (phones, flash drives, CDs, etc.):" type="textarea">
<camunda:properties>
<camunda:property id="rows" value="5" />
<camunda:property id="group" value="devices" />
<camunda:property id="repeat" value="devices" />
<camunda:property id="hide_expression" value="model.IUD_IndividualUseDevices == &#39;None&#39;" />
<camunda:property id="hide_expression" value="model.IUD_Devices == &#39;None&#39;" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="IUD_IndividualUseDevicesHIPPA_Ids" label="Check the HIPAA Identifiers stored with the data on this device (e.g. such as full-face picture or video):" type="enum">
<camunda:formField id="IUD_HIPPA_Ids" label="Check the HIPAA Identifiers stored with the data on this device (e.g. such as full-face picture or video):" type="enum">
<camunda:properties>
<camunda:property id="enum_type" value="checkbox" />
<camunda:property id="group" value="devices" />
<camunda:property id="repeat" value="devices" />
<camunda:property id="hide_expression" value="model.IUD_IndividualUseDevices == &#39;None&#39;" />
<camunda:property id="hide_expression" value="model.IUD == &#39;None&#39;" />
<camunda:property id="spreadsheet.name" value="HIPAA_Ids.xls" />
<camunda:property id="spreadsheet.value.column" value="Value" />
<camunda:property id="spreadsheet.label.column" value="Label" />
</camunda:properties>
<camunda:value id="HIPAA_Ids0" name="No HIPAA identifiers will be recorded as part of this research" />
<camunda:value id="HIPAA_Ids1" name="1. Name - Highly Sensitive Data " />
<camunda:value id="HIPAA_Ids2a" name="2a. Postal address includes street and/or PO Box, and town or city, state, and zip code - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids2b" name="2b. Postal address that includes only town or city, state, and/or zip code - Moderately Sensitive Data" />
<camunda:value id="HIPAA_Ids3" name="3. All date elements (except year) for dates related to an individual, e.g. service date" />
<camunda:value id="HIPAA_Ids4" name="4. Telephone numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids5" name="5. Fax numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids6" name="6. Electronic mail addresses - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids7" name="7. Social Security number - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids8" name="8. Medical Record number - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids9" name="9. Health plan beneficiary numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids10" name="10. Account numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids11" name="11. Certificate/license numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids12" name="12. Vehicle identifiers and serial numbers, including license plate numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids13" name="13. Device identifiers and serial numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids14" name="14. Web Universal Resource Locators (URLs) - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids15" name="15. Internet Protocol (IP) address numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids16" name="16. Biometric identifiers, including finger and voice prints - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids17" name="17. Full face photographic images and any comparable images - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids18" name="18. Other unique number, characteristic, code related to an individual, e.g. initials" />
</camunda:formField>
<camunda:formField id="IUD_IndividualUseDevicesBackups" label="Describe any backups made of the data stored on the device. Please include the location &#38; method of data transfer:" type="textarea">
<camunda:formField id="IUD_Backups" label="Describe any backups made of the data stored on the device. Please include the location &#38; method of data transfer:" type="textarea">
<camunda:properties>
<camunda:property id="rows" value="5" />
<camunda:property id="group" value="devices" />
<camunda:property id="repeat" value="devices" />
<camunda:property id="hide_expression" value="model.IUD_IndividualUseDevices == &#39;None&#39;" />
<camunda:property id="hide_expression" value="model.IUD == &#39;None&#39;" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="IUD_IndividualUseDevicesDelete" label="After the information is transferred elsewhere, will you securely delete all the data from this device?" type="boolean">
<camunda:formField id="IUD_HowLong" label="How long will the data remain on the individual-use device before being transferred?" type="textarea">
<camunda:properties>
<camunda:property id="group" value="devices" />
<camunda:property id="rows" value="5" />
<camunda:property id="repeat" value="devices" />
<camunda:property id="hide_expression" value="model.IUD_IndividualUseDevices == &#39;None&#39;" />
<camunda:property id="hide_expression" value="model.IUD == &#39;None&#39;" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="IUD_IndividualUseDevicesAccessYes" label="If yes, describe:" type="textarea">
<camunda:formField id="IUD_DeleteData" label="After the information is transferred elsewhere, will you securely delete all the data from this device?" type="boolean">
<camunda:properties>
<camunda:property id="repeat" value="devices" />
<camunda:property id="hide_expression" value="model.IUD == &#39;None&#39;" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="IUD_Access" label="Will anyone other than the study team or sponsor/CRO have access to data on this device?" type="boolean">
<camunda:properties>
<camunda:property id="repeat" value="devices" />
<camunda:property id="hide_expression" value="model.IUD == &#39;None&#39;" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="IUD_AccessYes" label="If yes, describe:" type="textarea">
<camunda:properties>
<camunda:property id="group" value="devices" />
<camunda:property id="repeat" value="devices" />
<camunda:property id="rows" value="5" />
<camunda:property id="hide_expression" value="!(model.IUD_IndividualUseDevicesDelete) || model.IUD_IndividualUseDevicesDelete == null || model.IUD_IndividualUseDevices == &#39;None&#39;" />
<camunda:property id="hide_expression" value="model.IUD === &#39;None&#39; || !model.IUD_Access" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="IUD_IndividualUseDevicesAccess" label="Will anyone other than the study team or sponsor/CRO have access to data on this device?" type="textarea">
<camunda:formField id="IUD_Alternatives" label="Other storage alternatives that were considered and the reasons they are unworkable:" type="textarea">
<camunda:properties>
<camunda:property id="group" value="devices" />
<camunda:property id="repeat" value="devices" />
<camunda:property id="rows" value="5" />
<camunda:property id="hide_expression" value="model.IUD_IndividualUseDevices == &#39;None&#39;" />
<camunda:property id="hide_expression" value="model.IUD == &#39;None&#39;" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="IUD_IndividualUseDevicesAlternatives" label="Other storage alternatives that were considered and the reasons they are unworkable:" type="textarea">
<camunda:formField id="IUD_Justification" label="The justification for storage of these data on this individual use device is:" type="textarea">
<camunda:properties>
<camunda:property id="group" value="devices" />
<camunda:property id="repeat" value="devices" />
<camunda:property id="rows" value="5" />
<camunda:property id="hide_expression" value="model.IUD_IndividualUseDevices == &#39;None&#39;" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="IUD_IndividualUseDevicesJustification" label="The justification for storage of these data on this individual use device is:" type="textarea">
<camunda:properties>
<camunda:property id="group" value="devices" />
<camunda:property id="repeat" value="devices" />
<camunda:property id="rows" value="5" />
<camunda:property id="hide_expression" value="model.IUD_IndividualUseDevices == &#39;None&#39;" />
<camunda:property id="hide_expression" value="model.IUD == &#39;None&#39;" />
</camunda:properties>
</camunda:formField>
</camunda:formData>
@ -372,7 +298,7 @@
<bpmn:incoming>SequenceFlow_0nc6lcs</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_0gp2pjm</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="SequenceFlow_0gp2pjm" sourceRef="Task_EnterIndividualUseDevices" targetRef="Activity_1qbfs1w" />
<bpmn:sequenceFlow id="SequenceFlow_0gp2pjm" sourceRef="Task_EnterIndividualUseDevices" targetRef="Task_EnterOutsideUVA" />
<bpmn:sequenceFlow id="SequenceFlow_0mgwas4" sourceRef="Task_EnterOutsideUVA" targetRef="ExclusiveGateway_0pi0c2d" />
<bpmn:sequenceFlow id="SequenceFlow_1i8e52t" sourceRef="ExclusiveGateway_0x3t2vl" targetRef="Task_EnterEmailMethods" />
<bpmn:userTask id="Task_EnterOutsideUVA" name="Enter Outside of UVA" camunda:formKey="EnterOutsideUVa">
@ -389,7 +315,7 @@ Indicate all the possible formats in which you will transmit your data outside o
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_0cpwkms</bpmn:incoming>
<bpmn:incoming>SequenceFlow_0gp2pjm</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_0mgwas4</bpmn:outgoing>
</bpmn:userTask>
<bpmn:userTask id="Task_EnterEmailMethods" name="Enter Email Methods" camunda:formKey="EnterEmailMethods">
@ -415,7 +341,6 @@ Indicate all the possible formats in which you will transmit your data outside o
<camunda:formField id="EnterDataManagementWebwsiteServerDriveAck" label="I acknowledge that ANY electronic individual use devices used to connect to any servers/websites listed below are supported by UVA Health System IT." type="boolean">
<camunda:properties>
<camunda:property id="help" value="[Definition of electronic individual user devices](https://security.virginia.edu/individual%E2%80%93use-electronic-devices)" />
<camunda:property id="group" value="DataSentSponsorCRO" />
<camunda:property id="repeat" value="DataSentSponsorCRO" />
</camunda:properties>
<camunda:validation>
@ -424,48 +349,27 @@ Indicate all the possible formats in which you will transmit your data outside o
</camunda:formField>
<camunda:formField id="EnterDataManagementHIPAA_Ids" label="HIPAA Identifiers" type="enum">
<camunda:properties>
<camunda:property id="group" value="DataSentSponsorCRO" />
<camunda:property id="repeat" value="DataSentSponsorCRO" />
<camunda:property id="spreadsheet.name" value="HIPAA_Ids.xls" />
<camunda:property id="spreadsheet.value.column" value="Value" />
<camunda:property id="spreadsheet.label.column" value="Label" />
</camunda:properties>
<camunda:validation>
<camunda:constraint name="required" config="true" />
</camunda:validation>
<camunda:value id="HIPAA_Ids0" name="No HIPAA identifiers will be recorded as part of this research" />
<camunda:value id="HIPAA_Ids1" name="1. Name - Highly Sensitive Data " />
<camunda:value id="HIPAA_Ids2a" name="2a. Postal address includes street and/or PO Box, and town or city, state, and zip code - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids2b" name="2b. Postal address that includes only town or city, state, and/or zip code - Moderately Sensitive Data" />
<camunda:value id="HIPAA_Ids3" name="3. All date elements (except year) for dates related to an individual, e.g. service date" />
<camunda:value id="HIPAA_Ids4" name="4. Telephone numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids5" name="5. Fax numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids6" name="6. Electronic mail addresses - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids7" name="7. Social Security number - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids8" name="8. Medical Record number - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids9" name="9. Health plan beneficiary numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids10" name="10. Account numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids11" name="11. Certificate/license numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids12" name="12. Vehicle identifiers and serial numbers, including license plate numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids13" name="13. Device identifiers and serial numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids14" name="14. Web Universal Resource Locators (URLs) - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids15" name="15. Internet Protocol (IP) address numbers - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids16" name="16. Biometric identifiers, including finger and voice prints - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids17" name="17. Full face photographic images and any comparable images - Highly Sensitive Data" />
<camunda:value id="HIPAA_Ids18" name="18. Other unique number, characteristic, code related to an individual, e.g. initials" />
</camunda:formField>
<camunda:formField id="EnterDataManagementSharingContract" label="If sharing data with anyone outside of UVA, do you confirm that you will obtain a contract with them via the School of Medicine Office of Grants and Contracts (OGC) or the Office of Sponsored Programs (OSP)?" type="boolean">
<camunda:properties>
<camunda:property id="group" value="DataSentSponsorCRO" />
<camunda:property id="repeat" value="DataSentSponsorCRO" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="EnterDataManagementWebsiteServerDriveEncrypted" label="Data will be sent and stored in an encrypted fashion (e.g. will only be shared and via Secure FX, Secure FTP, HTTPS, PGP) and the server/drive is configured to store data regulated by HIPAA" type="boolean">
<camunda:properties>
<camunda:property id="group" value="DataSentSponsorCRO" />
<camunda:property id="repeat" value="DataSentSponsorCRO" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="EnterDataManagementWebsiteServerDriveURL" label="Name (URL) of website (e.g. https://remote.sponsor.com/project name)" type="textarea">
<camunda:properties>
<camunda:property id="group" value="DataSentSponsorCRO" />
<camunda:property id="repeat" value="DataSentSponsorCRO" />
</camunda:properties>
</camunda:formField>
@ -498,7 +402,7 @@ Indicate all the possible formats in which you will transmit your data outside o
</camunda:formField>
<camunda:formField id="DataTransmissionMethodEncrypted" label="Individual Use Devices" type="enum">
<camunda:properties>
<camunda:property id="enum_type" value="checkbox" />
<camunda:property id="enum_type" value="radio" />
<camunda:property id="markdown_description" value="**Note:** Examples of individual use devices: CD, thumb drive, etc." />
</camunda:properties>
<camunda:value id="Yes" name="Yes, individual use devices will be shipped using a trackable method with data encrypted and password to the encrypted data transmitted separately" />
@ -506,7 +410,7 @@ Indicate all the possible formats in which you will transmit your data outside o
</camunda:formField>
<camunda:formField id="DataTransmissionMethodFaxed" label="Faxed" type="enum">
<camunda:properties>
<camunda:property id="enum_type" value="checkbox" />
<camunda:property id="enum_type" value="radio" />
<camunda:property id="markdown_description" value="**Note:** By checking this option, you are also confirming you will verify FAX numbers before faxing and use FAX cover sheet with a confidentiality statement." />
</camunda:properties>
<camunda:value id="Yes" name="Yes, data wile be faxed to a receiving machine in a restricted-access location with the intended recipient is clearly indicated, alerted to the pending transmission and available to pick up immediately." />
@ -518,6 +422,7 @@ Indicate all the possible formats in which you will transmit your data outside o
<bpmn:outgoing>SequenceFlow_0lere0k</bpmn:outgoing>
</bpmn:userTask>
<bpmn:endEvent id="EndEvent_151cj59">
<bpmn:documentation>Done message</bpmn:documentation>
<bpmn:incoming>SequenceFlow_16kyite</bpmn:incoming>
</bpmn:endEvent>
<bpmn:exclusiveGateway id="ExclusiveGateway_0pi0c2d" name="Outside of UVa?">
@ -568,7 +473,10 @@ Process: The Study Team will answer the questions in this section to create the
How to The Data Security Plan is auto-generated based on your answers on this Step. You can save your information here and check the outcomes on the Data Security Plan Upload Step at any time.
Submit the step only when you are ready. After you "Submit" the step, the information will not be available for editing.</bpmn:documentation>
Submit the step only when you are ready. After you "Submit" the step, the information will not be available for editing.
# test</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="FormField_23d42bc" label="asdg" type="boolean" />
@ -623,339 +531,222 @@ Indicate all the possible formats in which you will collect or receive your orig
<bpmn:incoming>SequenceFlow_0blyor8</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_1oq4w2h</bpmn:outgoing>
</bpmn:manualTask>
<bpmn:task id="Activity_1qbfs1w" name="Enter Device&#10;Details">
<bpmn:incoming>SequenceFlow_0gp2pjm</bpmn:incoming>
<bpmn:outgoing>Flow_0cpwkms</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics />
</bpmn:task>
<bpmn:sequenceFlow id="Flow_0cpwkms" sourceRef="Activity_1qbfs1w" targetRef="Task_EnterOutsideUVA" />
<bpmn:textAnnotation id="TextAnnotation_190dbhy">
<bpmn:text>&gt; Instructions
o Hippa Instructions
o Hippa Indentifiers
o Vuew Definitions and Instructions
o Paper Documents
o Emailed to UVA Personnel
o EMC (EPIC)
o UVA Approvled eCRF
o UVA Servers
o Web or Cloud Server
o Individual Use Devices
o Device Details
0 Outside of UVA
o Outside of UVA?
     o Yes 
           o Email Methods
           o Data Management
           o Transmission Method
           o Generate DSP 
    o No
           o Generate DSP</bpmn:text>
</bpmn:textAnnotation>
<bpmn:association id="Association_1nrg5es" sourceRef="Task_0q6ir2l" targetRef="TextAnnotation_190dbhy" />
<bpmn:textAnnotation id="TextAnnotation_0l6dohi">
<bpmn:text>*  Instructions
* Hippa Instructions
* Hippa Indentifiers
o Vuew Definitions and Instructions
&gt;&gt; Paper Documents
&gt; Emailed to UVA Personnel
&gt; EMC (EPIC)
&gt; UVA Approvled eCRF
&gt; UVA Servers
&gt; Web or Cloud Server
o Individual Use Devices
o Device Details
o Outside of UVA
o Outside of UVA?
     o Yes 
           o Email Methods
           o Data Management
           o Transmission Method
           o Generate DSP 
    o No
           o Generate DSP</bpmn:text>
</bpmn:textAnnotation>
<bpmn:association id="Association_0ykpfju" sourceRef="Task_EnterPaperDocuments" targetRef="TextAnnotation_0l6dohi" />
<bpmn:textAnnotation id="TextAnnotation_0tpe506">
<bpmn:text>* Instructions
* Hippa Instructions
* Hippa Indentifiers
* View Definitions and Instructions
* Paper Documents (Parallel creates spaces)
* Emailed to UVA Personnel
* EMC (EPIC)
* UVA Approvled eCRF
* UVA Servers
* Web or Cloud Server
* Individual Use Devices
o Device Details (MultiInstance Indents, Parallel creates spaces))
&gt; Desktop
&gt;&gt; Laptop
&gt; Cell Phone
&gt; Other
o Outside of UVA
o Outside of UVA?
     o Yes 
           o Email Methods
           o Data Management
           o Transmission Method
           o Generate DSP 
    o No
           o Generate DSP</bpmn:text>
</bpmn:textAnnotation>
<bpmn:association id="Association_01x19xx" sourceRef="Activity_1qbfs1w" targetRef="TextAnnotation_0tpe506" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_19ej1y2">
<bpmndi:BPMNShape id="TextAnnotation_0l6dohi_di" bpmnElement="TextAnnotation_0l6dohi">
<dc:Bounds x="1200" y="80" width="283.5273279352227" height="309.04183535762485" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="TextAnnotation_190dbhy_di" bpmnElement="TextAnnotation_190dbhy">
<dc:Bounds x="190" y="150" width="237.9175101214575" height="309.04183535762485" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="TextAnnotation_0tpe506_di" bpmnElement="TextAnnotation_0tpe506">
<dc:Bounds x="1240" y="820" width="370" height="442" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_16kyite_di" bpmnElement="SequenceFlow_16kyite">
<di:waypoint x="2240" y="660" />
<di:waypoint x="2322" y="660" />
<di:waypoint x="2240" y="390" />
<di:waypoint x="2322" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0t6xl9i_di" bpmnElement="SequenceFlow_0t6xl9i">
<di:waypoint x="1620" y="685" />
<di:waypoint x="1620" y="910" />
<di:waypoint x="2190" y="910" />
<di:waypoint x="2190" y="700" />
<di:waypoint x="1620" y="415" />
<di:waypoint x="1620" y="640" />
<di:waypoint x="2190" y="640" />
<di:waypoint x="2190" y="430" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0k2r83n_di" bpmnElement="SequenceFlow_0k2r83n">
<di:waypoint x="2075" y="660" />
<di:waypoint x="2140" y="660" />
<di:waypoint x="2075" y="390" />
<di:waypoint x="2140" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0blyor8_di" bpmnElement="SequenceFlow_0blyor8">
<di:waypoint x="665" y="660" />
<di:waypoint x="717" y="660" />
<di:waypoint x="660" y="390" />
<di:waypoint x="717" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0jyty9m_di" bpmnElement="SequenceFlow_0jyty9m">
<di:waypoint x="498" y="660" />
<di:waypoint x="565" y="660" />
<di:waypoint x="498" y="390" />
<di:waypoint x="560" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0m2op9s_di" bpmnElement="SequenceFlow_0m2op9s">
<di:waypoint x="351" y="660" />
<di:waypoint x="398" y="660" />
<di:waypoint x="351" y="390" />
<di:waypoint x="398" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1oq4w2h_di" bpmnElement="SequenceFlow_1oq4w2h">
<di:waypoint x="817" y="660" />
<di:waypoint x="875" y="660" />
<di:waypoint x="817" y="390" />
<di:waypoint x="875" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_100w7co_di" bpmnElement="SequenceFlow_100w7co">
<di:waypoint x="191" y="660" />
<di:waypoint x="251" y="660" />
<di:waypoint x="178" y="390" />
<di:waypoint x="251" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_01hl869_di" bpmnElement="SequenceFlow_01hl869">
<di:waypoint x="1645" y="660" />
<di:waypoint x="1725" y="660" />
<di:waypoint x="1645" y="390" />
<di:waypoint x="1725" y="390" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1676" y="642" width="19" height="14" />
<dc:Bounds x="1677" y="372" width="18" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0lere0k_di" bpmnElement="SequenceFlow_0lere0k">
<di:waypoint x="1950" y="800" />
<di:waypoint x="2050" y="800" />
<di:waypoint x="2050" y="685" />
<di:waypoint x="1950" y="530" />
<di:waypoint x="2050" y="530" />
<di:waypoint x="2050" y="415" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0uewki3_di" bpmnElement="SequenceFlow_0uewki3">
<di:waypoint x="1950" y="520" />
<di:waypoint x="2050" y="520" />
<di:waypoint x="2050" y="635" />
<di:waypoint x="1950" y="250" />
<di:waypoint x="2050" y="250" />
<di:waypoint x="2050" y="365" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_08rwbhm_di" bpmnElement="SequenceFlow_08rwbhm">
<di:waypoint x="1950" y="660" />
<di:waypoint x="2025" y="660" />
<di:waypoint x="1950" y="390" />
<di:waypoint x="2025" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1mnmo6p_di" bpmnElement="SequenceFlow_1mnmo6p">
<di:waypoint x="1750" y="685" />
<di:waypoint x="1750" y="800" />
<di:waypoint x="1850" y="800" />
<di:waypoint x="1750" y="415" />
<di:waypoint x="1750" y="530" />
<di:waypoint x="1850" y="530" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_12bv2i4_di" bpmnElement="SequenceFlow_12bv2i4">
<di:waypoint x="1775" y="660" />
<di:waypoint x="1850" y="660" />
<di:waypoint x="1775" y="390" />
<di:waypoint x="1850" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1i8e52t_di" bpmnElement="SequenceFlow_1i8e52t">
<di:waypoint x="1750" y="635" />
<di:waypoint x="1750" y="520" />
<di:waypoint x="1850" y="520" />
<di:waypoint x="1750" y="365" />
<di:waypoint x="1750" y="250" />
<di:waypoint x="1850" y="250" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0mgwas4_di" bpmnElement="SequenceFlow_0mgwas4">
<di:waypoint x="1570" y="660" />
<di:waypoint x="1595" y="660" />
<di:waypoint x="1530" y="390" />
<di:waypoint x="1595" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0gp2pjm_di" bpmnElement="SequenceFlow_0gp2pjm">
<di:waypoint x="1300" y="660" />
<di:waypoint x="1330" y="660" />
<di:waypoint x="1360" y="390" />
<di:waypoint x="1430" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0nc6lcs_di" bpmnElement="SequenceFlow_0nc6lcs">
<di:waypoint x="1185" y="660" />
<di:waypoint x="1200" y="660" />
<di:waypoint x="1185" y="390" />
<di:waypoint x="1260" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_10fsxk4_di" bpmnElement="SequenceFlow_10fsxk4">
<di:waypoint x="1080" y="910" />
<di:waypoint x="1160" y="910" />
<di:waypoint x="1160" y="685" />
<di:waypoint x="1080" y="640" />
<di:waypoint x="1160" y="640" />
<di:waypoint x="1160" y="415" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1xp62py_di" bpmnElement="SequenceFlow_1xp62py">
<di:waypoint x="1080" y="810" />
<di:waypoint x="1160" y="810" />
<di:waypoint x="1160" y="685" />
<di:waypoint x="1080" y="540" />
<di:waypoint x="1160" y="540" />
<di:waypoint x="1160" y="415" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1agmshr_di" bpmnElement="SequenceFlow_1agmshr">
<di:waypoint x="1080" y="710" />
<di:waypoint x="1160" y="710" />
<di:waypoint x="1160" y="685" />
<di:waypoint x="1080" y="440" />
<di:waypoint x="1160" y="440" />
<di:waypoint x="1160" y="415" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_12cos7w_di" bpmnElement="SequenceFlow_12cos7w">
<di:waypoint x="1080" y="490" />
<di:waypoint x="1160" y="490" />
<di:waypoint x="1160" y="635" />
<di:waypoint x="1080" y="220" />
<di:waypoint x="1160" y="220" />
<di:waypoint x="1160" y="365" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1q6gf6w_di" bpmnElement="SequenceFlow_1q6gf6w">
<di:waypoint x="1080" y="390" />
<di:waypoint x="1160" y="390" />
<di:waypoint x="1160" y="635" />
<di:waypoint x="1080" y="120" />
<di:waypoint x="1160" y="120" />
<di:waypoint x="1160" y="365" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0z10m1d_di" bpmnElement="SequenceFlow_0z10m1d">
<di:waypoint x="1080" y="590" />
<di:waypoint x="1160" y="590" />
<di:waypoint x="1160" y="635" />
<di:waypoint x="1080" y="320" />
<di:waypoint x="1160" y="320" />
<di:waypoint x="1160" y="365" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0obqjjx_di" bpmnElement="SequenceFlow_0obqjjx">
<di:waypoint x="900" y="685" />
<di:waypoint x="900" y="910" />
<di:waypoint x="980" y="910" />
<di:waypoint x="900" y="415" />
<di:waypoint x="900" y="640" />
<di:waypoint x="980" y="640" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0ng3fm8_di" bpmnElement="SequenceFlow_0ng3fm8">
<di:waypoint x="900" y="685" />
<di:waypoint x="900" y="810" />
<di:waypoint x="980" y="810" />
<di:waypoint x="900" y="415" />
<di:waypoint x="900" y="540" />
<di:waypoint x="980" y="540" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0pw57x9_di" bpmnElement="SequenceFlow_0pw57x9">
<di:waypoint x="900" y="685" />
<di:waypoint x="900" y="710" />
<di:waypoint x="980" y="710" />
<di:waypoint x="900" y="415" />
<di:waypoint x="900" y="440" />
<di:waypoint x="980" y="440" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_10g92nf_di" bpmnElement="SequenceFlow_10g92nf">
<di:waypoint x="900" y="635" />
<di:waypoint x="900" y="590" />
<di:waypoint x="980" y="590" />
<di:waypoint x="900" y="365" />
<di:waypoint x="900" y="320" />
<di:waypoint x="980" y="320" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_084dyht_di" bpmnElement="SequenceFlow_084dyht">
<di:waypoint x="900" y="635" />
<di:waypoint x="900" y="490" />
<di:waypoint x="980" y="490" />
<di:waypoint x="900" y="365" />
<di:waypoint x="900" y="220" />
<di:waypoint x="980" y="220" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1i6ac9a_di" bpmnElement="SequenceFlow_1i6ac9a">
<di:waypoint x="900" y="635" />
<di:waypoint x="900" y="390" />
<di:waypoint x="980" y="390" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0cpwkms_di" bpmnElement="Flow_0cpwkms">
<di:waypoint x="1430" y="660" />
<di:waypoint x="1470" y="660" />
<di:waypoint x="900" y="365" />
<di:waypoint x="900" y="120" />
<di:waypoint x="980" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="StartEvent_1co48s3_di" bpmnElement="StartEvent_1co48s3">
<dc:Bounds x="155" y="642" width="36" height="36" />
<dc:Bounds x="142" y="372" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_16imtaa_di" bpmnElement="Task_EnterHIPAAIdentifiers">
<dc:Bounds x="565" y="620" width="100" height="80" />
<dc:Bounds x="560" y="350" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ParallelGateway_03qblyb_di" bpmnElement="ExclusiveGateway_0b16kmf">
<dc:Bounds x="875" y="635" width="50" height="50" />
<dc:Bounds x="875" y="365" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_1wsga3m_di" bpmnElement="Task_EnterPaperDocuments">
<dc:Bounds x="980" y="350" width="100" height="80" />
<dc:Bounds x="980" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_0o1xjub_di" bpmnElement="Task_EnterEmailedUVAPersonnel">
<dc:Bounds x="980" y="450" width="100" height="80" />
<dc:Bounds x="980" y="180" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_1gnbchf_di" bpmnElement="Task_EnterEMR">
<dc:Bounds x="980" y="550" width="100" height="80" />
<dc:Bounds x="980" y="280" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_0a4bj92_di" bpmnElement="Task_EnterUVAApprovedECRF">
<dc:Bounds x="980" y="670" width="100" height="80" />
<dc:Bounds x="980" y="400" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_1f2b80a_di" bpmnElement="Task_EnterUVaServersWebsites">
<dc:Bounds x="980" y="500" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_0n3jbd7_di" bpmnElement="Task_EnterWebCloudServer">
<dc:Bounds x="980" y="600" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ParallelGateway_0zl5t7b_di" bpmnElement="ExclusiveGateway_06kvl84">
<dc:Bounds x="1135" y="635" width="50" height="50" />
<dc:Bounds x="1135" y="365" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_0q8o038_di" bpmnElement="Task_EnterIndividualUseDevices">
<dc:Bounds x="1260" y="350" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_10x8kgc_di" bpmnElement="Task_EnterOutsideUVA">
<dc:Bounds x="1430" y="350" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_1x8azom_di" bpmnElement="Task_EnterEmailMethods">
<dc:Bounds x="1850" y="480" width="100" height="80" />
<dc:Bounds x="1850" y="210" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_1r640re_di" bpmnElement="Task_EnterDataManagement">
<dc:Bounds x="1850" y="620" width="100" height="80" />
<dc:Bounds x="1850" y="350" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ParallelGateway_0cignbh_di" bpmnElement="ExclusiveGateway_1lpm3pa">
<dc:Bounds x="2025" y="635" width="50" height="50" />
<dc:Bounds x="2025" y="365" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_0ns9m8t_di" bpmnElement="Task_EnterTransmissionMethod">
<dc:Bounds x="1850" y="760" width="100" height="80" />
<dc:Bounds x="1850" y="490" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="EndEvent_151cj59_di" bpmnElement="EndEvent_151cj59">
<dc:Bounds x="2322" y="642" width="36" height="36" />
<dc:Bounds x="2322" y="372" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ExclusiveGateway_0pi0c2d_di" bpmnElement="ExclusiveGateway_0pi0c2d" isMarkerVisible="true">
<dc:Bounds x="1595" y="635" width="50" height="50" />
<dc:Bounds x="1595" y="365" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1580" y="611" width="80" height="14" />
<dc:Bounds x="1580" y="341" width="80" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ParallelGateway_1284xgu_di" bpmnElement="ExclusiveGateway_0x3t2vl">
<dc:Bounds x="1725" y="635" width="50" height="50" />
<dc:Bounds x="1725" y="365" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ScriptTask_1616pnb_di" bpmnElement="Task_1ypw8ge">
<dc:Bounds x="2140" y="620" width="100" height="80" />
<dc:Bounds x="2140" y="350" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1l6rjbr_di" bpmnElement="Task_0q6ir2l">
<dc:Bounds x="251" y="620" width="100" height="80" />
<dc:Bounds x="251" y="350" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_11u7de2_di" bpmnElement="Task_0uotpzg">
<dc:Bounds x="398" y="620" width="100" height="80" />
<dc:Bounds x="398" y="350" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0nfmn0k_di" bpmnElement="Task_196zozc">
<dc:Bounds x="717" y="620" width="100" height="80" />
<dc:Bounds x="717" y="350" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_0q8o038_di" bpmnElement="Task_EnterIndividualUseDevices">
<dc:Bounds x="1200" y="620" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_10x8kgc_di" bpmnElement="Task_EnterOutsideUVA">
<dc:Bounds x="1470" y="620" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1qbfs1w_di" bpmnElement="Activity_1qbfs1w">
<dc:Bounds x="1330" y="620" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_1f2b80a_di" bpmnElement="Task_EnterUVaServersWebsites">
<dc:Bounds x="980" y="770" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_0n3jbd7_di" bpmnElement="Task_EnterWebCloudServer">
<dc:Bounds x="980" y="870" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Association_0ykpfju_di" bpmnElement="Association_0ykpfju">
<di:waypoint x="1080" y="365" />
<di:waypoint x="1200" y="306" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Association_1nrg5es_di" bpmnElement="Association_1nrg5es">
<di:waypoint x="302" y="620" />
<di:waypoint x="306" y="459" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Association_01x19xx_di" bpmnElement="Association_01x19xx">
<di:waypoint x="1385" y="700" />
<di:waypoint x="1399" y="820" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

View File

@ -10,27 +10,38 @@
<bpmn:script>StudyInfo investigators</bpmn:script>
</bpmn:scriptTask>
<bpmn:endEvent id="EndEvent_1qor16n">
<bpmn:documentation>## The following information was gathered:
{% for type, investigator in StudyInfo.investigators.items() %}
### {{investigator.label}}: {{investigator.display_name}}
* Edit Acess? {{investigator.edit_access}}
* Send Emails? {{investigator.emails}}
{% if investigator.label == "Primary Investigator" %}
* Experience: {{investigator.experience}}
{% endif %}
{% endfor %}</bpmn:documentation>
<bpmn:incoming>Flow_1mplloa</bpmn:incoming>
</bpmn:endEvent>
<bpmn:userTask id="Activity_EditOtherPersonnel" name="Supplement Personnel" camunda:formKey="Access &#38; Notifications">
<bpmn:userTask id="Activity_EditOtherPersonnel" name="Update Personnel" camunda:formKey="Access &#38; Notifications">
<bpmn:documentation>### Please provide supplemental information for:
#### Investigator : {{investigator.display_name}}
##### Role: {{investigator.type_full}}
#### {{investigator.display_name}}
##### Title: {{investigator.title}}
##### Department: {{investigator.department}}
##### Affiliation: {{investigator.affiliation}}</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="EditAccess" label="Should have Study Team editing access in the system?" type="boolean" defaultValue="false" />
<camunda:formField id="AutomatedEmailNotification" label="Should receive automated email notifications?" type="boolean" defaultValue="false" />
<camunda:formField id="PI_Experience" label="Investigator&#39;s Experience" type="textarea">
<camunda:formField id="investigator.edit_access" label="Should have Study Team editing access in the system?" type="boolean" defaultValue="false" />
<camunda:formField id="investigator.emails" label="Should receive automated email notifications?" type="boolean" defaultValue="false" />
<camunda:formField id="investigator.experience" label="Investigator&#39;s Experience" type="textarea">
<camunda:properties>
<camunda:property id="rows" value="5" />
<camunda:property id="hide_expression" value="model.investigator.type_full !== &#34;Primary Investigator&#34;" />
<camunda:property id="hide_expression" value="model.investigator.label !== &#34;Primary Investigator&#34;" />
</camunda:properties>
</camunda:formField>
</camunda:formData>
<camunda:properties>
<camunda:property name="display_name" value="investigator.label" />
</camunda:properties>
</bpmn:extensionElements>
<bpmn:incoming>Flow_1dcsioh</bpmn:incoming>
<bpmn:outgoing>Flow_1mplloa</bpmn:outgoing>
@ -43,28 +54,28 @@
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_01143nb">
<bpmndi:BPMNEdge id="Flow_1dcsioh_di" bpmnElement="Flow_1dcsioh">
<di:waypoint x="370" y="120" />
<di:waypoint x="450" y="120" />
<di:waypoint x="480" y="120" />
<di:waypoint x="540" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1mplloa_di" bpmnElement="Flow_1mplloa">
<di:waypoint x="550" y="120" />
<di:waypoint x="642" y="120" />
<di:waypoint x="640" y="120" />
<di:waypoint x="722" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0kcrx5l_di" bpmnElement="Flow_0kcrx5l">
<di:waypoint x="188" y="120" />
<di:waypoint x="270" y="120" />
<di:waypoint x="308" y="120" />
<di:waypoint x="380" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="152" y="102" width="36" height="36" />
<dc:Bounds x="272" y="102" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ScriptTask_0h49cmf_di" bpmnElement="ScriptTask_LoadPersonnel">
<dc:Bounds x="270" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="EndEvent_1qor16n_di" bpmnElement="EndEvent_1qor16n">
<dc:Bounds x="642" y="102" width="36" height="36" />
<dc:Bounds x="380" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0d622qi_di" bpmnElement="Activity_EditOtherPersonnel">
<dc:Bounds x="450" y="80" width="100" height="80" />
<dc:Bounds x="540" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="EndEvent_1qor16n_di" bpmnElement="EndEvent_1qor16n">
<dc:Bounds x="722" y="102" width="36" height="36" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/DMN/20151101/dmn.xsd" xmlns:biodi="http://bpmn.io/schema/dmn/biodi/1.0" id="Definitions_1hao5sb" name="DRD" namespace="http://camunda.org/schema/1.0/dmn" exporter="Camunda Modeler" exporterVersion="3.7.3">
<decision id="bad_dmn" name="Decision 1">
<extensionElements>
<biodi:bounds x="150" y="150" width="180" height="80" />
</extensionElements>
<decisionTable id="decisionTable_1">
<input id="input_1" label="num_presents">
<inputExpression id="inputExpression_1" typeRef="long">
<text>1</text>
</inputExpression>
</input>
<output id="output_1" label="My Message" name="message" typeRef="integer" />
<rule id="DecisionRule_0gl355z">
<description></description>
<inputEntry id="UnaryTests_06x22gk">
<text>0</text>
</inputEntry>
<outputEntry id="LiteralExpression_0yuxzxi">
<text>0</text>
</outputEntry>
</rule>
<rule id="DecisionRule_1s6l5b6">
<description>'one' can't be evaluated, it must be quoted</description>
<inputEntry id="UnaryTests_1oyo6k0">
<text>1</text>
</inputEntry>
<outputEntry id="LiteralExpression_09t5r62">
<text>one</text>
</outputEntry>
</rule>
<rule id="DecisionRule_1dvd34d">
<inputEntry id="UnaryTests_1k557bj">
<text>2</text>
</inputEntry>
<outputEntry id="LiteralExpression_1n1eo23">
<text>2</text>
</outputEntry>
</rule>
<rule id="DecisionRule_0tqqjg9">
<inputEntry id="UnaryTests_0dnd50d">
<text>&gt; 2</text>
</inputEntry>
<outputEntry id="LiteralExpression_0fk5uhh">
<text>3</text>
</outputEntry>
</rule>
</decisionTable>
</decision>
</definitions>

View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1elv5t1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.3">
<bpmn:process id="Process_15vbyda" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>SequenceFlow_1ma1wxb</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="SequenceFlow_1ma1wxb" sourceRef="StartEvent_1" targetRef="Task_0sgafty" />
<bpmn:businessRuleTask id="Task_0sgafty" name="A bad DMN" camunda:decisionRef="bad_dmn">
<bpmn:incoming>SequenceFlow_1ma1wxb</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_0grui6f</bpmn:outgoing>
</bpmn:businessRuleTask>
<bpmn:endEvent id="EndEvent_0tsqkyu">
<bpmn:documentation># Great Work!
Based on the information you provided (Ginger left {{num_presents}}, we recommend the following statement be provided to Ginger:
## {{message}}
We hope you both have an excellent day!</bpmn:documentation>
<bpmn:incoming>SequenceFlow_0grui6f</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="SequenceFlow_0grui6f" sourceRef="Task_0sgafty" targetRef="EndEvent_0tsqkyu" />
<bpmn:textAnnotation id="TextAnnotation_0oajoz7">
<bpmn:text>This DMN isn't provided enough information to execute</bpmn:text>
</bpmn:textAnnotation>
<bpmn:association id="Association_1raak4y" sourceRef="Task_0sgafty" targetRef="TextAnnotation_0oajoz7" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_15vbyda">
<bpmndi:BPMNShape id="TextAnnotation_0oajoz7_di" bpmnElement="TextAnnotation_0oajoz7">
<dc:Bounds x="400" y="80" width="100" height="82" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="SequenceFlow_0grui6f_di" bpmnElement="SequenceFlow_0grui6f">
<di:waypoint x="370" y="237" />
<di:waypoint x="432" y="237" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1ma1wxb_di" bpmnElement="SequenceFlow_1ma1wxb">
<di:waypoint x="215" y="237" />
<di:waypoint x="270" y="237" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="219" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BusinessRuleTask_10c5wgr_di" bpmnElement="Task_0sgafty">
<dc:Bounds x="270" y="197" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="EndEvent_0tsqkyu_di" bpmnElement="EndEvent_0tsqkyu">
<dc:Bounds x="432" y="219" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Association_1raak4y_di" bpmnElement="Association_1raak4y">
<di:waypoint x="364" y="198" />
<di:waypoint x="404" y="162" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

View File

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1v1rp1q" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.0.0">
<bpmn:process id="Process_1vu5nxl" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>SequenceFlow_0lvudp8</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="SequenceFlow_0lvudp8" sourceRef="StartEvent_1" targetRef="Activity_0oa736e" />
<bpmn:endEvent id="EndEvent_0q4qzl9">
<bpmn:incoming>SequenceFlow_02vev7n</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="SequenceFlow_02vev7n" sourceRef="Task_14svgcu" targetRef="EndEvent_0q4qzl9" />
<bpmn:userTask id="Task_14svgcu" name="Enum Lookup Form" camunda:formKey="EnumForm">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="guest_of_honor" label="Who is the guest of honor?" type="enum">
<camunda:properties>
<camunda:property id="data.name" value="invitees" />
<camunda:property id="data.value.column" value="secret_id" />
<camunda:property id="data.label.column" value="display_name" />
</camunda:properties>
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_1yet4a9</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_02vev7n</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_1yet4a9" sourceRef="Activity_0oa736e" targetRef="Task_14svgcu" />
<bpmn:userTask id="Activity_0oa736e" name="Who do you want to invite to your tea party?" camunda:formKey="task_1_form">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="first_name" label="What is their first name?" type="string">
<camunda:properties>
<camunda:property id="repeat" value="invitees" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="last_name" label="What is their last name?" type="string">
<camunda:properties>
<camunda:property id="repeat" value="invitees" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="age" label="How old are they?" type="long">
<camunda:properties>
<camunda:property id="repeat" value="invitees" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="likes_pie" label="Do they like pie?" type="boolean">
<camunda:properties>
<camunda:property id="repeat" value="invitees" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="num_lumps" label="How many lumps of sugar in their tea?" type="long">
<camunda:properties>
<camunda:property id="repeat" value="invitees" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="secret_id" label="What is their secret identity?" type="string">
<camunda:properties>
<camunda:property id="repeat" value="invitees" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="display_name" label="What&#39;s their nickname?" type="string">
<camunda:properties>
<camunda:property id="repeat" value="invitees" />
</camunda:properties>
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>SequenceFlow_0lvudp8</bpmn:incoming>
<bpmn:outgoing>Flow_1yet4a9</bpmn:outgoing>
</bpmn:userTask>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1vu5nxl">
<bpmndi:BPMNEdge id="SequenceFlow_02vev7n_di" bpmnElement="SequenceFlow_02vev7n">
<di:waypoint x="500" y="117" />
<di:waypoint x="542" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0lvudp8_di" bpmnElement="SequenceFlow_0lvudp8">
<di:waypoint x="215" y="117" />
<di:waypoint x="250" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1yet4a9_di" bpmnElement="Flow_1yet4a9">
<di:waypoint x="350" y="117" />
<di:waypoint x="400" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0k8rwp9_di" bpmnElement="Activity_0oa736e">
<dc:Bounds x="250" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_18ly1yq_di" bpmnElement="Task_14svgcu">
<dc:Bounds x="400" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="EndEvent_0q4qzl9_di" bpmnElement="EndEvent_0q4qzl9">
<dc:Bounds x="542" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

View File

@ -333,6 +333,31 @@ class TestTasksApi(BaseTest):
self.assert_options_populated(results, ['CUSTOMER_NUMBER', 'CUSTOMER_NAME', 'CUSTOMER_CLASS_MEANING'])
self.assertIsInstance(results[0]['data'], dict)
def test_enum_from_task_data(self):
self.load_example_data()
workflow = self.create_workflow('enum_options_from_task_data')
# get the first form in the two form workflow.
workflow_api = self.get_workflow_api(workflow)
task = workflow_api.next_task
workflow_api = self.complete_form(workflow, task, {'invitees': [
{'first_name': 'Alistair', 'last_name': 'Aardvark', 'age': 43, 'likes_pie': True, 'num_lumps': 21, 'secret_id': 'Antimony', 'display_name': 'Professor Alistair A. Aardvark'},
{'first_name': 'Berthilda', 'last_name': 'Binturong', 'age': 12, 'likes_pie': False, 'num_lumps': 34, 'secret_id': 'Beryllium', 'display_name': 'Dr. Berthilda B. Binturong'},
{'first_name': 'Chesterfield', 'last_name': 'Capybara', 'age': 32, 'likes_pie': True, 'num_lumps': 1, 'secret_id': 'Cadmium', 'display_name': 'The Honorable C. C. Capybara'},
]})
task = workflow_api.next_task
field_id = task.form['fields'][0]['id']
options = task.form['fields'][0]['options']
self.assertEqual(3, len(options))
option_id = options[0]['id']
self.assertEqual('Professor Alistair A. Aardvark', options[0]['name'])
self.assertEqual('Dr. Berthilda B. Binturong', options[1]['name'])
self.assertEqual('The Honorable C. C. Capybara', options[2]['name'])
self.assertEqual('Alistair', options[0]['data']['first_name'])
self.assertEqual('Berthilda', options[1]['data']['first_name'])
self.assertEqual('Chesterfield', options[2]['data']['first_name'])
def test_lookup_endpoint_for_task_ldap_field_lookup(self):
self.load_example_data()
workflow = self.create_workflow('ldap_lookup')

View File

@ -9,6 +9,7 @@ from example_data import ExampleDataLoader
from crc import db
from crc.models.task_event import TaskEventModel
from crc.models.api_models import Task
from crc.api.common import ApiError
class TestWorkflowService(BaseTest):
@ -130,4 +131,7 @@ class TestWorkflowService(BaseTest):
# The first task should be empty, with all the data removed.
self.assertEqual({}, task_logs[0].form_data)
def test_dmn_evaluation_errors_in_oncomplete_raise_api_errors_during_validation(self):
workflow_spec_model = self.load_test_spec("decision_table_invalid")
with self.assertRaises(ApiError):
WorkflowService.test_spec(workflow_spec_model.id)

View File

@ -92,7 +92,7 @@ class TestWorkflowSpecValidation(BaseTest):
self.load_example_data()
errors = self.validate_workflow("invalid_script")
self.assertEqual(2, len(errors))
self.assertEqual("workflow_validation_exception", errors[0]['code'])
self.assertEqual("error_loading_workflow", errors[0]['code'])
self.assertTrue("NoSuchScript" in errors[0]['message'])
self.assertEqual("Invalid_Script_Task", errors[0]['task_id'])
self.assertEqual("An Invalid Script Reference", errors[0]['task_name'])