Deployment Documentation

Deployment Documentation

  • Architecture
  • Services
  • Deployment

›Deployment

Deployment

  • Application Summary
  • Backend Deployment
  • Frontend Deployment
  • Database Deployment
  • IDP Integration Configuration
  • Terraform Deployment

Backend Deployment Guide

The guide describes how to retrieve zipped Docker containers. It also contains a sample docker-compose.yml that illustrates how to deploy the containers.

Retrieve Docker Images from ECR

Log in to an EC2 instance that has Docker uninstalled and run the following command to have access to the containers in ECR.

aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 226477880271.dkr.ecr.us-west-2.amazonaws.com

Alternatively, you can use Amazon ECR Credential Helper to log in to ECR. This approach is necessary if you want to pull the images from an AWS account that's not in the same account as the ECR repositories.

Run pull-from-ecr.sh to pull the containers from ECR and zip them. Set TAG to the version you need. The zipped files will be distributed to the client to be deployed on-premise. Note that zipping the containers takes a long time (about 30 minutes), so be patient and don't exit the script prematurely.

Deploy Containers

We have a sample docker-compose.yml that shows the dependencies between containers and how to configure them. It is meant as an example that will be modified by clients to suit their needs.

You will notice there are some containers named <service-name>-postgres and <service-name>-db-migrations. Postgres containers run the database for the given service whereas db-migrations containers run database migrations. The service container in the sample file is configured so it doesn't start before both containers complete their run.

Post-Deployment Instructions

  • Update and run seed-case-api-db.sql to populate initial data for the case_api service.
  • Update and run seed-mock-data.sh to populate mock Vocalink data.
  • Update and run create-sample-workflow.sh to create a sample workflow to route messages.
  • Update and run seed-default-config.sh to set default configuration.

pull-from-ecrsh

#!/bin/sh
TAG=develop

# pull the images from ecr
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-submit-trace-request:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-trace-service:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-update-cases:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-update-cases-db:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-attach-network-image:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-audit-service:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-audit-service-db:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-case-api:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-case-api-db:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-config-service:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-config-service-db:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-create-case-service:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-dashboard-service:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-dashboard-service-db:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-dispatcher:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-event-routing:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-event-routing-db:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-jobscheduler-service:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-jobscheduler-service-db:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-link-cases-service:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-metrics-server:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-metrics-service:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-metrics-service-db:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-purge-service:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-mock-vlapi:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-route-validation:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-vocalink-proxy:$TAG
docker pull 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-vocalink-proxy-db:$TAG
docker pull 490470643515.dkr.ecr.us-west-2.amazonaws.com/user-admin-service:$TAG
docker pull 490470643515.dkr.ecr.us-west-2.amazonaws.com/user-admin-service-db:$TAG

# zip the images
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-submit-trace-request:$TAG| gzip > aml-submit-trace-request.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-trace-service:$TAG | gzip > aml-trace-service.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-update-cases:$TAG | gzip > aml-update-cases.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-update-cases-db:$TAG | gzip > aml-update-case-db.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-attach-network-image:$TAG| gzip > cms-attach-network-image.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-audit-service:$TAG | gzip > cms-audit-service.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-audit-service-db:$TAG | gzip > cms-audit-service-db.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-case-api:$TAG | gzip > cms-case-api.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-case-api-db:$TAG | gzip > cms-case-api-db.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-config-service:$TAG | gzip > cms-config-service.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-config-service-db:$TAG | gzip > cms-config-service-db.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-create-case-service:$TAG | gzip > cms-create-case-service.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-dashboard-service:$TAG | gzip > cms-dashboard-service.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-dashboard-service-db:$TAG | gzip > cms-dashboard-service-db.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-dispatcher:$TAG | gzip > cms-dispatcher.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-event-routing:$TAG | gzip > cms-event-routing.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-event-routing-db:$TAG | gzip > cms-event-routing-db.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-jobscheduler-service:$TAG | gzip > cms-jobscheduler-service.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-jobscheduler-service-db:$TAG | gzip > cms-jobscheduler-service-db.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-link-cases-service:$TAG | gzip > cms-link-cases-service.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-metrics-server:$TAG | gzip > cms-metrics-server.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-metrics-service:$TAG | gzip > cms-metrics-service.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-metrics-service-db:$TAG | gzip > cms-metrics-service-db.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-purge-service:$TAG | gzip > cms-purge-service.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-mock-vlapi:$TAG | gzip > cms-mock-vlapi.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-route-validation:$TAG | gzip > cms-route-validation.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-vocalink-proxy:$TAG | gzip > cms-vocalink-proxy.tar.gz
docker save 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-vocalink-proxy-db:$TAG | gzip > cms-vocalink-proxy-db.tar.gz
docker save 490470643515.dkr.ecr.us-west-2.amazonaws.com/user-admin-service:$TAG | gzip > user-admin-service.tar.gz
docker save 490470643515.dkr.ecr.us-west-2.amazonaws.com/user-admin-service-db:$TAG | gzip > user-admin-service-db.tar.gz

docker-compose.yml

version: "3.4"

services:
  rabbitmq:
    image: rabbitmq:3.8.4-management
    hostname: rabbitmq
    volumes:
      - rabbitmq:/var/lib/rabbitmq
    ports:
      - "15672:15672"
      - "5672:5672"
    restart: always
  
  redis:
    image: redis:6.0.10-alpine
    hostname: redis
    ports:
      - "6379:6379"
    restart: always

  cms-case-api:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-case-api:develop
    ports:
      - "8001:8080"
    expose:
      - 8081
    environment:
      PGUSER:         postgres
      PGPASSWORD:     postgres
      PGHOST:         cms-case-api-postgres
      PGDATABASE:     cms_case_api
      PGPORT:         5432
      RABBIT_HOST:    rabbitmq
      RABBIT_PORT:    5672
      ENV:            develop
    depends_on:
      - rabbitmq
      - cms-case-api-postgres
      - cms-case-api-db-migrations
  cms-case-api-postgres:
    image: postgres:11-alpine
    hostname: cms-case-api-postgres
    volumes:
      # seed the database with seed-case-api-db.sql after it starts
      - cms-case-api:/var/lib/postgresql/data
    expose:
      - 5001
    ports:
      - "5001:5432"
    restart: always
    environment:
      POSTGRES_DB:       cms_case_api
      POSTGRES_USER:     postgres 
      POSTGRES_PASSWORD: postgres
  cms-case-api-db-migrations:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-case-api-db:develop
    environment:
      PGUSER:     postgres
      PGPASSWORD: postgres
      PGHOST:     cms-case-api-postgres
      PGDATABASE: cms_case_api
      PGPORT:     5432
    depends_on:
      - cms-case-api-postgres

  aml-trace-service:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-trace-service:develop
    hostname: aml-trace-service
    restart: always
    expose:
      - 8002
    ports:
      - "8002:8080"
    environment:
      REDIS_URL:      redis://redis:6379
      RABBITMQ_HOST:  rabbitmq
      RABBITMQ_PORT:  5672
    depends_on:
      - rabbitmq
      - redis
  
  cms-config-service:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-config-service:develop
    hostname: cms-config-service
    restart: always
    environment:
      # set ENV_TYPE to "develop" to load database values from environment variables
      ENV_TYPE:         develop
      DB_CONNECTION:    jdbc:postgresql://cms-config-service-postgres:5432/cms_config_service
      DB_USER:          postgres
      DB_PWD:           postgres
    expose:
      - 8003
    ports:
      - "8003:8080"
    depends_on:
      - cms-config-service-postgres
      - cms-config-service-db-migrations
  cms-config-service-postgres:
    image: postgres:11-alpine
    hostname: cms-config-service-postgres
    volumes:
      - cms-config-service:/var/lib/postgresql/data
    restart: always
    expose:
      - 5002 
    ports:
      - "5002:5432"
    environment:
      POSTGRES_DB:       cms_config_service
      POSTGRES_USER:     postgres
      POSTGRES_PASSWORD: postgres
  cms-config-service-db-migrations:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-config-service-db:develop
    environment:
      FLYWAY_URL:        jdbc:postgresql://cms-config-service-postgres:5432/cms_config_service
      FLYWAY_USER:       postgres
      FLYWAY_PASSWORD:   postgres
    depends_on:
      - cms-config-service-postgres
  
  cms-vocalink-proxy:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-vocalink-proxy:develop
    hostname: cms-vocalink-proxy
    restart: always
    expose:
      - 8004
    ports:
      - "8004:8080"
    environment:
      VOCALINK_API_HOST:            http://cms-mock-vlapi:8080
      CMS_CASE_API_HOST:            http://cms-case-api:8080
      CMS_CONFIG_SERVICE_API_HOST:  http://cms-config-service:8080
      ROUTE_PREFIX:                 vocalink
      PGUSER:                       postgres
      PGPASSWORD:                   postgres
      PGHOST:                       cms-vocalink-proxy-postgres
      PGDATABASE:                   vocalink_proxy
      PGPORT:                       5432
    depends_on:
      - cms-vocalink-proxy-postgres
      - cms-vocalink-proxy-db-migrations
      - cms-mock-vlapi
      - cms-case-api
  cms-vocalink-proxy-postgres:
    image: postgres:11-alpine
    hostname: cms-vocalink-proxy-postgres
    volumes:
      - cms-vocalink-proxy:/var/lib/postgresql/data
    restart: always
    environment:
      POSTGRES_DB:       cms_vocalink_proxy
      POSTGRES_USER:     postgres 
      POSTGRES_PASSWORD: postgres
  cms-vocalink-proxy-db-migrations:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-vocalink-proxy-db:develop
    environment:
      PGUSER:     postgres
      PGPASSWORD: postgres
      PGHOST:     cms-case-api-postgres
      PGDATABASE: cms_case_api
      PGPORT:     5432
    depends_on:
      - cms-vocalink-proxy-postgres

  cms-route-validation:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-route-validation:develop
    hostname: cms-route-validation
    expose:
      - 8005
    ports:
      - "8005:8080"
    environment:
      RABBIT_HOST:        rabbitmq
      RABBIT_PORT:        5672
      RABBIT_MANAGE_PORT: 15672
      CMS_CASE_API_URL:   http://cms-case-api:8080
    depends_on:
      - rabbitmq
      - cms-case-api
  
  cms-event-routing:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-event-routing:develop
    hostname: cms-event-routing
    expose:
      - 8006
    ports:
      - "8006:8080"
    environment:
      DB_DATABASE:            cms_event_routing
      DB_URL:                 cms-event-routing-postgres
      DB_USER:                postgres
      DB_PWD:                 postgres
      DB_PORT:                5432
      VALIDATION_SERVICE_URL: http://cms-route-validation:8080/v1/validate
    depends_on:
      - cms-route-validation
      - cms-event-routing-postgres
      - cms-event-routing-db-migrations
  cms-event-routing-postgres:
    image: postgres:11-alpine
    hostname: cms-event-routing-postgres
    volumes:
      - cms-event-routing:/var/lib/postgresql/data
    restart: always
    expose:
      - 5003
    ports:
      - "5003:5432"
    environment:
      POSTGRES_DB:       cms_event_routing
      POSTGRES_USER:     postgres 
      POSTGRES_PASSWORD: postgres
  cms-event-routing-db-migrations:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-event-routing-db:develop
    environment:
      DB_DATABASE: cms_event_routing
      DB_URL:      cms-event-routing-postgres
      DB_USER:     postgres
      DB_PWD:      postgres
      DB_PORT:     5432
    depends_on:
      - cms-event-routing-postgres
  
  cms-dispatcher:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-dispatcher:develop
    hostname: cms-dispatcher
    expose:
      - 8007
    ports:
      - "8007:8080"
    environment:
      # set ENV_TYPE to "develop" to load database values from environment variables
      ENV_TYPE:                       develop
      RABBIT_HOST:                    rabbitmq
      RABBIT_PORT:                    5672
      EVENT_ROUTING_SERVICE_ENDPOINT: http://cms-event-routing:8080
      CASE_API_SERVICE_ENDPOINT:      http://cms-case-api:8080
    depends_on:
      - cms-event-routing
      - cms-case-api
  
  aml-submit-trace-request:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-submit-trace-request:develop
    hostname: aml-submit-trace-request
    expose:
      - 8008
    ports:
      - "8008:8080"
    environment:
      RABBITMQ_HOST:          rabbitmq
      RABBITMQ_PORT:          5672
      CASE_API_URL:           http://cms-case-api:8080
      VOCALINK_API_HOST:      http://cms-vocalink-proxy:8080/v1/vocalink
      AML_TRACE_SERVICE_HOST: http://aml-trace-service:8080
    depends_on:
      - rabbitmq
      - cms-case-api
      - cms-vocalink-proxy
      - aml-trace-service
  
  cms-create-case-service:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-create-case-service:develop
    hostname: cms-create-case-service
    expose:
      - 8009
    ports:
      - "8009:8080"
    environment:
      RABBIT_HOST:  rabbitmq
      RABBIT_PORT:  5672
      CASE_API_URL: http://cms-case-api:8080
    depends_on:
      - rabbitmq
      - cms-case-api
  
  cms-attach-network-image:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-attach-network-image:develop
    hostname: cms-attach-network-image
    expose:
      - 8010
    ports:
      - "8010:8080"
    environment:
      RABBITMQ_HOST:          rabbitmq
      RABBITMQ_PORT:          5672
      RABBITMQ_EXCHANGE_NAME: cms-attach-network-image
      RABBITMQ_QUEUE_NAME:    cms-attach-network-image
      CMS_CASE_API_HOST:      http://cms-case-api:8080
    depends_on:
      - rabbitmq
      - cms-case-api
  
  cms-jobscheduler-service:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-jobscheduler-service:develop
    hostname: cms-jobscheduler-service
    expose:
      - 8011
    ports:
      - "8011:8080"
    environment:
      RABBITMQ_HOST:  rabbitmq
      RABBITMQ_PORT:  5672
      PGDATABASE:     cms_jobscheduler
      PGUSER:         postgres
      PGPASSWORD:     postgres
      PGPORT:         5432
      PGHOST:         cms-jobscheduler-service-postgres
    depends_on:
      - rabbitmq
      - cms-jobscheduler-service-postgres
      - cms-jobscheduler-service-db-migrations
  cms-jobscheduler-service-postgres:
    image: postgres:11-alpine
    hostname: cms-jobscheduler-service-postgres
    volumes:
      - cms-jobscheduler-service:/var/lib/postgresql/data
    restart: always
    expose:
      - 5004
    ports:
      - "5004:5432"
    environment:
      POSTGRES_DB:       cms_jobscheduler
      POSTGRES_USER:     postgres 
      POSTGRES_PASSWORD: postgres
  cms-jobscheduler-service-db-migrations:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-jobscheduler-service-db:develop
    environment:
      PGDATABASE: cms_jobscheduler
      PGHOST:     cms-jobscheduler-service-postgres
      PGUSER:     postgres
      PGPASSWORD: postgres
      PGPORT:     5432
    depends_on:
      - cms-jobscheduler-service-postgres
  
  aml-update-cases:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-update-cases:develop
    hostname: aml-update-cases
    expose:
      - 8012
    ports:
      - "8012:8080"
    environment:
      RABBITMQ_HOST:          rabbitmq
      RABBITMQ_PORT:          5672
      RABBITMQ_EXCHANGE_NAME: aml-update-cases
      RABBITMQ_QUEUE_NAME:    aml-update-cases
      VOCALINK_API_HOST:      http://cms-vocalink-proxy:8080/v1/vocalink
      CMS_CASE_API_HOST:      http://cms-case-api:8080
      PGUSER:                 postgres
      PGPASSWORD:             postgres
      PGHOST:                 aml-update-cases-postgres
      PGDATABASE:             aml_update_cases
      PGPORT:                 5432
    depends_on:
      - rabbitmq
      - cms-case-api
      - aml-update-cases-postgres
      - aml-update-cases-db-migrations
  aml-update-cases-postgres:
    image: postgres:11-alpine
    hostname: aml-update-cases-postgres
    volumes:
      - aml-update-cases:/var/lib/postgresql/data
    restart: always
    expose:
      - 5005
    ports:
      - "5005:5432"
    environment:
      POSTGRES_DB:       aml_update_cases
      POSTGRES_USER:     postgres 
      POSTGRES_PASSWORD: postgres
  aml-update-cases-db-migrations:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/aml-update-cases-db:develop
    environment:
      PGDATABASE: aml_update_cases
      PGHOST:     aml-update-cases-postgres
      PGUSER:     postgres
      PGPASSWORD: postgres
      PGPORT:     5432
    depends_on:
      - aml-update-cases-postgres
  
  cms-link-cases-service:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-link-cases-service:develop
    hostname: cms-link-cases-service
    expose:
      - 8013
    ports:
      - "8013:8080"
    environment:
      RABBIT_HOST:  rabbitmq
      RABBIT_PORT:  5672
      CASE_API_URL: http://cms-case-api:8080
      PGUSER:       postgres
      PGPASSWORD:   postgres
      PGHOST:       cms-case-api-postgres
      PGDATABASE:   cms_case_api
    depends_on:
      - rabbitmq
      - cms-case-api
  
  cms-dashboard-service:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-dashboard-service:develop
    hostname: cms-dashboard-service
    expose:
      - 8014
    ports:
      - "8014:8080"
    environment:
      PGDATABASE: cms_dashboards
      PGUSER:     postgres
      PGPASSWORD: postgres
      PGPORT:     5432
      PGHOST:     cms-dashboard-service-postgres
    depends_on:
      - cms-dashboard-service-postgres
      - cms-dashboard-service-db-migrations
  cms-dashboard-service-postgres:
    image: postgres:11-alpine
    hostname: cms-dashboard-service-postgres
    volumes:
      - cms-dashboard-service:/var/lib/postgresql/data
    restart: always
    expose:
      - 5006
    ports:
      - "5006:5432"
    environment:
      POSTGRES_DB:       cms_dashboards
      POSTGRES_USER:     postgres 
      POSTGRES_PASSWORD: postgres
  cms-dashboard-service-db-migrations:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-dashboard-service-db:develop
    environment:
      PGDATABASE: cms_dashboards
      PGHOST:     cms-dashboard-service-postgres
      PGUSER:     postgres
      PGPASSWORD: postgres
      PGPORT:     5432
    depends_on:
      - cms-dashboard-service-postgres
  
  cms-audit-service:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-audit-service:develop
    hostname: cms-audit-service
    expose:
      - 8015
    ports:
      - "8015:8080"
    environment:
      # set ENV_TYPE to "develop" to load database values from environment variables
      ENV_TYPE:       develop
      DB_CONNECTION:  jdbc:postgresql://cms-audit-service-postgres:5432/cms_audit_service
      DB_USER:        postgres
      DB_PWD:         postgres
    depends_on:
      - cms-audit-service-postgres
      - cms-audit-service-db-migrations
  cms-audit-service-postgres:
    image: postgres:11-alpine
    hostname: cms-audit-service-postgres
    volumes:
      - cms-audit-service:/var/lib/postgresql/data
    restart: always
    expose:
      - 5007 
    ports:
      - "5007:5432"
    environment:
      POSTGRES_DB:       cms_audit_service
      POSTGRES_USER:     postgres
      POSTGRES_PASSWORD: postgres
  cms-audit-service-db-migrations:
    image:               226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-audit-service-db:develop
    environment:
      FLYWAY_URL:        jdbc:postgresql://cms-audit-service-postgres:5432/cms_audit_service
      FLYWAY_USER:       postgres
      FLYWAY_PASSWORD:   postgres
    depends_on:
      - cms-audit-service-postgres
  
  cms-metrics-service:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-metrics-service:develop
    hostname: cms-metrics-service
    expose:
      - 8016
    ports:
      - "8016:8080"
    environment:
      PGUSER:       postgres
      PGPASSWORD:   postgres
      PGHOST:       cms-metrics-service-postgres
      PGDATABASE:   cms_metrics
      PGPORT:       5432
      RABBIT_HOST:  rabbitmq
      RABBIT_PORT:  5672
    depends_on:
      - rabbitmq
      - cms-metrics-service-postgres
      - cms-metrics-service-db-migrations
  cms-metrics-service-postgres:
    image: postgres:11-alpine
    hostname: cms-metrics-service-postgres
    volumes:
      - cms-metrics-service:/var/lib/postgresql/data
    restart: always
    expose:
      - 5008
    ports:
      - "5008:5432"
    environment:
      POSTGRES_DB:       cms_metrics
      POSTGRES_USER:     postgres
      POSTGRES_PASSWORD: postgres
  cms-metrics-service-db-migrations:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-metrics-service-db:develop
    environment:
      PGUSER:       postgres
      PGPASSWORD:   postgres
      PGHOST:       cms-metrics-service-postgres
      PGDATABASE:   cms_metrics
      PGPORT:       5432
    depends_on:
      - cms-metrics-service-postgres
  
  # Note that one of the dashlets generates connection refused errors.
  # The error is caused by the fact that the service depends on the config server which takes a little while to start up.
  # This is an issue with the dashlet that doesn't retry API calls after a failed request.  It should be fixed in the dashlet not in the deployment.
  cms-metrics-server:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-metrics-server:develop
    hostname: cms-metrics-server
    expose:
      - 8017
    ports:
      - "8017:8080"
    environment:
      CUBEJS_DB_HOST:         cms-case-api-postgres
      CUBEJS_DB_NAME:         cms_case_api
      CUBEJS_DB_USER:         postgres
      CUBEJS_DB_PASS:         postgres
      CUBEJS_METRICSDB_HOST:  cms-metrics-service-postgres
      CUBEJS_METRICSDB_NAME:  cms_metrics
      CUBEJS_METRICSDB_USER:  postgres 
      CUBEJS_METRICSDB_PASS:  postgres
      CUBEJS_METRICSDB_PORT:  5432
      CUBEJS_API_SECRET:      abcdefg
      CUBEJS_DB_TYPE:         postgres
      PORT:                   8080
      CONFIG_API_HOST:        cms-config-service
      CONFIG_API_PORT:        8080
      CLIENT_INFO_ENDPOINT:   http://cms-vocalink-proxy:8080/v1/client-info
    depends_on:
      - cms-metrics-service
      - cms-case-api
  
  user-admin-service:
    image: 490470643515.dkr.ecr.us-west-2.amazonaws.com/user-admin-service:develop
    hostname: user-admin-service
    expose:
      - 8018
    ports:
      - "8018:8080"
    environment:
      DB_USER:  postgres
      DB_PWD:   postgres
      DB_URL:   jdbc:postgresql://user-admin-service-postgres:5432/user_admin_service
    depends_on:
      - user-admin-service-postgres
      - user-admin-service-db-migrations
  user-admin-service-postgres:
    image: postgres:11-alpine
    hostname: user-admin-service-postgres
    volumes:
      - user-admin-service:/var/lib/postgresql/data
    restart: always
    expose:
      - 5009
    ports:
      - "5009:5432"
    environment:
      POSTGRES_DB:       user_admin_service
      POSTGRES_USER:     postgres
      POSTGRES_PASSWORD: postgres
  user-admin-service-db-migrations:
    image: 490470643515.dkr.ecr.us-west-2.amazonaws.com/user-admin-service-db:develop
    environment:
      FLYWAY_URL:        jdbc:postgresql://user-admin-service-postgres:5432/user_admin_service
      FLYWAY_USER:       postgres
      FLYWAY_PASSWORD:   postgres
    depends_on:
      - user-admin-service-postgres
  
  cms-purge-service:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-purge-service:develop
    hostname: cms-purge-service
    expose:
      - 8019
    ports:
      - "8019:8080"
    environment:
      PGUSER:       postgres
      PGPASSWORD:   postgres
      PGHOST:       cms-case-api
      PGDATABASE:   cms_case_api
      PGPORT:       5432
      RABBIT_HOST:  rabbitmq
      RABBIT_PORT:  5672
 
  cms-mock-vlapi:
    image: 226477880271.dkr.ecr.us-west-2.amazonaws.com/cms-mock-vlapi:develop
    hostname: cms-mock-vlapi
    restart: always
    expose:
      - 8101
    ports:
      - "8101:8080"
    environment:
      CONFIG_API_HOST:  cms-config-service
      CONFIG_API_PORT:  8080
    depends_on:
      - cms-config-service
 
volumes:
  rabbitmq:
  cms-case-api:
  cms-config-service:
  cms-vocalink-proxy:
  cms-event-routing:
  cms-jobscheduler-service:
  aml-update-cases:
  cms-dashboard-service:
  cms-audit-service:
  cms-metrics-service:
  user-admin-service:

seed-case-api-db.sql

-- case_type
insert into case_type(name, tenant_key) values('aml', 'MASTERCARD');
insert into case_type(name, tenant_key) values('fraud', 'MASTERCARD');

-- case_status
insert into case_status(name, tenant_key, case_type_name, sort_order) values('alert', 'MASTERCARD', 'aml', 0);
insert into case_status(name, tenant_key, case_type_name, sort_order) values('open', 'MASTERCARD', 'aml', 1);
insert into case_status(name, tenant_key, case_type_name, sort_order) values('pending', 'MASTERCARD', 'aml', 20);
insert into case_status(name, tenant_key, case_type_name, sort_order) values('review', 'MASTERCARD', 'aml', 30);
insert into case_status(name, tenant_key, case_type_name, sort_order) values('dismissed', 'MASTERCARD', 'aml', 50);
insert into case_status(name, tenant_key, case_type_name, sort_order) values('closed', 'MASTERCARD', 'aml', 99);
insert into case_status(name, tenant_key, case_type_name, sort_order) values('alert', 'MASTERCARD', 'fraud', 0);
insert into case_status(name, tenant_key, case_type_name, sort_order) values('open', 'MASTERCARD', 'fraud', 1);
insert into case_status(name, tenant_key, case_type_name, sort_order) values('pending', 'MASTERCARD', 'fraud', 20);
insert into case_status(name, tenant_key, case_type_name, sort_order) values('review', 'MASTERCARD', 'fraud', 30);
insert into case_status(name, tenant_key, case_type_name, sort_order) values('dismissed', 'MASTERCARD', 'fraud', 50);
insert into case_status(name, tenant_key, case_type_name, sort_order) values('closed', 'MASTERCARD', 'fraud', 99);

-- task_status
insert into task_status(name) values('Pending');
insert into task_status(name) values('Complete');

-- task_priority
insert into task_priority(name, sort_order) values('Critical', 15);
insert into task_priority(name, sort_order) values('High', 10);
insert into task_priority(name, sort_order) values('Medium', 5);
insert into task_priority(name, sort_order) values('Low', 0);

-- case_priority
insert into case_priority(name, sort_order) values('Critical', 15);
insert into case_priority(name, sort_order) values('High', 10);
insert into case_priority(name, sort_order) values('Medium', 5);
insert into case_priority(name, sort_order) values('Low', 0);

-- case_resolution
insert into case_resolution(name, case_type_name, is_abnormal, tenant_key) values('not fraudulent', 'fraud', false, 'MASTERCARD');
insert into case_resolution(name, case_type_name, is_abnormal, tenant_key) values('stolen card', 'fraud', true, 'MASTERCARD');
insert into case_resolution(name, case_type_name, is_abnormal, tenant_key) values('counterfeit card', 'fraud', true, 'MASTERCARD');
insert into case_resolution(name, case_type_name, is_abnormal, tenant_key) values('fraudulent card application', 'fraud', true, 'MASTERCARD');
insert into case_resolution(name, case_type_name, is_abnormal, tenant_key) values('counterfeit merchant terminal', 'fraud', true, 'MASTERCARD');
insert into case_resolution(name, case_type_name, is_abnormal, tenant_key) values('not fraudulent', 'aml', false, 'MASTERCARD');
insert into case_resolution(name, case_type_name, is_abnormal, tenant_key) values('laundered money', 'aml', true, 'MASTERCARD');

seed-mock-data.sh

#!/bin/sh
curl -vX POST http://<HOST:PORT>/modules/mockdata --header "Content-Type: application/json" --header "USERID: system" --header "ROLES: CMS_CONFIG_ADMIN" --header "TENANTKEY: MASTERCARD" -d @<mock_data_file.json>

Mock Data

{
    "networkAlerts": [{
      "id": 1,
      "time": "2020-04-10T08:46:46.687Z",
      "length": 488,
      "vizURL": "http://rachel6.com",
      "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
      "totalValue": 987549,
      "elapsedTime": "P2Y195DT82H38M",
      "generations": 3,
      "sourceTxnID": "9a8c0764-a769-43c2-bdc3-e2e05fb0a61e",
      "sourceValue": 496209,
      "decisionDate": "2020-02-16T20:08:33.493Z",
      "accountAlerts": [
        {
          "id": "e68008e6-7fe3-4590-a9ab-b3adc3b919ae",
          "name": "Alberto Schaden",
          "time": "2020-08-01T13:06:44.431Z",
          "accountID": "KW37GYNQ981D1V6E14691028146639",
          "dwellTime": "P3Y50DT72H28M",
          "muleScore": 0.15,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "generation": 1,
          "owningBank": "EE200243108008808782",
          "generations": [
            10,
            2,
            3,
            4,
            7
          ],
          "numNetworks": 10,
          "endpointFlag": 49299849,
          "parentAlertID": "129f06d4-1185-4be8-b18e-7a8e28216c5e",
          "networkAlertID": 1,
          "receivesSalary": true,
          "firstAppearance": "2020-01-03T08:59:01.213Z",
          "totalValueInbound": 618865,
          "mostRecentFeedback": "actionedMule",
          "totalValueOutbound": 5702,
          "firstTransactionTime": "2020-11-30T16:15:36.665Z",
          "mostRecentAppearance": "2020-05-21T10:54:53.375Z",
          "numConfirmedNetworks": 62,
          "numScheduledMandates": 97,
          "sourceTransactionValue": 764049,
          "numInboundRelationships": 65,
          "numOutboundRelationships": 72,
          "mostRecentTransactionTime": "2020-07-04T05:59:10.407Z",
          "totalSuspiciousValueInbound": 841908,
          "totalSuspiciousValueOutbound": 808865
        },
        {
          "id": "11c2cb86-c00d-4db5-a3d8-6364129fd1f9",
          "name": "Jeffrey Ankunding",
          "time": "2020-08-15T06:08:36.617Z",
          "accountID": "HR0747300610090390052",
          "dwellTime": "P5Y157DT84H14M",
          "muleScore": 0.06,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "generation": 5,
          "owningBank": "LB4140090237861801548H341114",
          "generations": [
            2,
            3,
            6,
            8,
            9
          ],
          "numNetworks": 37,
          "endpointFlag": 72700913,
          "parentAlertID": "0a6b03ab-9cd1-456e-888d-3f6f74fded02",
          "networkAlertID": 1,
          "receivesSalary": true,
          "firstAppearance": "2020-05-10T11:30:08.196Z",
          "totalValueInbound": 864847,
          "mostRecentFeedback": "actionedMule",
          "totalValueOutbound": 205588,
          "firstTransactionTime": "2020-11-30T07:37:36.612Z",
          "mostRecentAppearance": "2020-09-25T08:15:54.111Z",
          "numConfirmedNetworks": 58,
          "numScheduledMandates": 46,
          "sourceTransactionValue": 741032,
          "numInboundRelationships": 3,
          "numOutboundRelationships": 22,
          "mostRecentTransactionTime": "2020-06-12T19:59:57.629Z",
          "totalSuspiciousValueInbound": 122041,
          "totalSuspiciousValueOutbound": 546993
        },
        {
          "id": "98808e2d-768a-46e4-b2ac-7f27cbd05b2f",
          "name": "Rachel Hyatt",
          "time": "2020-06-28T00:35:24.506Z",
          "accountID": "MR3246906800050807308608045",
          "dwellTime": "P4Y2DT217H16M",
          "muleScore": 0.25,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "generation": 9,
          "owningBank": "RS56095884011588969888",
          "generations": [
            6,
            3,
            1,
            7,
            7,
            10,
            5,
            6
          ],
          "numNetworks": 9,
          "endpointFlag": 31227203,
          "parentAlertID": "c39dc5fe-e072-4ec8-8dc3-49c7969b126f",
          "networkAlertID": 1,
          "receivesSalary": true,
          "firstAppearance": "2020-07-22T19:24:19.204Z",
          "totalValueInbound": 733300,
          "mostRecentFeedback": "actionedMule",
          "totalValueOutbound": 194579,
          "firstTransactionTime": "2020-11-30T09:09:37.469Z",
          "mostRecentAppearance": "2020-11-18T05:20:29.508Z",
          "numConfirmedNetworks": 89,
          "numScheduledMandates": 7,
          "sourceTransactionValue": 862754,
          "numInboundRelationships": 49,
          "numOutboundRelationships": 89,
          "mostRecentTransactionTime": "2020-06-06T11:14:01.347Z",
          "totalSuspiciousValueInbound": 882571,
          "totalSuspiciousValueOutbound": 194931
        },
        {
          "id": "1ee19cd3-4800-4d46-8221-aaba018c59c4",
          "name": "Caleb Cruickshank Jr.",
          "time": "2020-10-04T03:15:51.738Z",
          "accountID": "LV87CVTS17756597K46O8",
          "dwellTime": "P300DT50H50M",
          "muleScore": 0.37,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "generation": 6,
          "owningBank": "IS540914750091106030006261",
          "generations": [
            1,
            1
          ],
          "numNetworks": 20,
          "endpointFlag": 5753651,
          "parentAlertID": "798b79b3-a1c4-4c99-aa54-b24b202df63f",
          "networkAlertID": 1,
          "receivesSalary": false,
          "firstAppearance": "2020-10-05T19:00:18.462Z",
          "totalValueInbound": 489724,
          "mostRecentFeedback": "confirmedLegitimate",
          "totalValueOutbound": 238945,
          "firstTransactionTime": "2020-11-30T17:42:43.526Z",
          "mostRecentAppearance": "2020-04-20T16:13:26.753Z",
          "numConfirmedNetworks": 50,
          "numScheduledMandates": 31,
          "sourceTransactionValue": 537272,
          "numInboundRelationships": 30,
          "numOutboundRelationships": 95,
          "mostRecentTransactionTime": "2020-02-25T22:21:55.539Z",
          "totalSuspiciousValueInbound": 63084,
          "totalSuspiciousValueOutbound": 360106
        }
      ],
      "meanDwellTime": "P5Y220DT107H16M",
      "meanMuleScore": 0.77,
      "numLegitimate": 33,
      "parentAlertID": "9ff67102-f8a7-4bc0-9783-420430cbf4ca",
      "sourceTxnType": "romanceScam",
      "uniqueAccounts": 4,
      "medianDwellTime": "P152DT254H18M",
      "numActionedMules": 69,
      "transactionAlerts": [
        {
          "id": "00c35db1-206a-46f9-aefa-3a4243a16fc4",
          "time": "2020-01-26T20:36:10.255Z",
          "txnID": "0d071a81-3923-40f9-b9e7-260551c71531",
          "value": 797863,
          "destID": "MR3246906800050807308608045",
          "avScore": 36,
          "service": "fraud",
          "txnTime": "2020-01-06T09:35:11.362Z",
          "currency": "USD",
          "sourceID": "LV87CVTS17756597K46O8",
          "dwellTime": "P4Y259DT240H17M",
          "muleScore": 0.63,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "ROYCAT2",
          "generation": 5,
          "directDebit": true,
          "decisionDate": "2020-05-21T02:11:45.619Z",
          "destBankName": "Royal Bank Of Canada",
          "sourceBankID": "BOFMCAT2",
          "parentAlertID": "1e89a942-99aa-4a52-9b9a-be35f4fff4c6",
          "destinationAge": "P4Y83DT163H16M",
          "networkAlertID": 1,
          "receivesSalary": true,
          "sourceBankName": "Bank Of Montreal",
          "relationshipAge": "P3Y31DT120H22M",
          "sourceTraceType": "fraud",
          "newRelationships": 42,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.13,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 47
        },
        {
          "id": "3bdf3f28-b5c3-4b7d-bfc3-f5f5e1299c25",
          "time": "2020-04-18T10:07:07.942Z",
          "txnID": "d8a4aed6-3d34-4ff6-aabf-a5d31d032847",
          "value": 342645,
          "destID": "KW37GYNQ981D1V6E14691028146639",
          "avScore": 12,
          "service": "fraud",
          "txnTime": "2020-05-20T00:25:19.844Z",
          "currency": "USD",
          "sourceID": "HR0747300610090390052",
          "dwellTime": "P2Y212DT266H",
          "muleScore": 0.23,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "NOSCAT",
          "generation": 2,
          "directDebit": true,
          "decisionDate": "2020-08-07T07:18:04.106Z",
          "destBankName": "The Bank Of Nova Scotia",
          "sourceBankID": "NOSCAT",
          "parentAlertID": "0c76b463-b654-425e-9949-fb65eca90dd4",
          "destinationAge": "P36DT270H48M",
          "networkAlertID": 1,
          "receivesSalary": false,
          "sourceBankName": "The Bank Of Nova Scotia",
          "relationshipAge": "P3Y104DT179H43M",
          "sourceTraceType": "fraud",
          "newRelationships": 47,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.88,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 81
        },
        {
          "id": "95824ed0-d9f6-4004-b841-72f9bc8d4d74",
          "time": "2020-02-05T11:42:02.113Z",
          "txnID": "154ad20c-6e59-4ce4-a59d-c3af7e019431",
          "value": 392083,
          "destID": "MR3246906800050807308608045",
          "avScore": 24,
          "service": "fraud",
          "txnTime": "2020-05-01T17:01:24.441Z",
          "currency": "CAD",
          "sourceID": "HR0747300610090390052",
          "dwellTime": "P5Y294DT53M",
          "muleScore": 0.11,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "NOSCAT",
          "generation": 4,
          "directDebit": false,
          "decisionDate": "2020-07-19T22:23:29.704Z",
          "destBankName": "The Bank Of Nova Scotia",
          "sourceBankID": "ROYCAT2",
          "parentAlertID": "c130564e-9554-422f-b05f-884f4bc1f563",
          "destinationAge": "P5Y271DT217H59M",
          "networkAlertID": 1,
          "receivesSalary": false,
          "sourceBankName": "Royal Bank Of Canada",
          "relationshipAge": "P3Y354DT38H34M",
          "sourceTraceType": "fraud",
          "newRelationships": 82,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.79,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 13
        },
        {
          "id": "bf593f6c-ae49-4430-bd82-f4e37aed886c",
          "time": "2019-12-03T13:43:47.918Z",
          "txnID": "1448656b-cfff-42a8-bc23-6a4bc4c5d34b",
          "value": 630400,
          "destID": "SI49027582801362046",
          "avScore": 70,
          "service": "fraud",
          "txnTime": "2020-10-09T19:23:36.366Z",
          "currency": "AUD",
          "sourceID": "SI49027582801362046",
          "dwellTime": "P3Y356DT124H46M",
          "muleScore": 0.42,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "NOSCAT",
          "generation": 9,
          "directDebit": true,
          "decisionDate": "2020-06-03T17:59:44.533Z",
          "destBankName": "The Bank Of Nova Scotia",
          "sourceBankID": "ROYCAT2",
          "parentAlertID": "24637f8c-5ef0-4029-a289-582a64826855",
          "destinationAge": "P105DT185H44M",
          "networkAlertID": 1,
          "receivesSalary": false,
          "sourceBankName": "Royal Bank Of Canada",
          "relationshipAge": "P4Y136DT133H12M",
          "sourceTraceType": "fraud",
          "newRelationships": 40,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.17,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 81
        },
        {
          "id": "5b5ace37-f213-4a42-926b-60629fcdaebe",
          "time": "2020-03-16T10:30:39.998Z",
          "txnID": "802181a5-0566-4074-a7bc-ac6deefc1cb3",
          "value": 202657,
          "destID": "MR3246906800050807308608045",
          "avScore": 86,
          "service": "fraud",
          "txnTime": "2020-03-09T14:05:56.246Z",
          "currency": "AUD",
          "sourceID": "KW37GYNQ981D1V6E14691028146639",
          "dwellTime": "P3Y329DT204H55M",
          "muleScore": 0.4,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "ROYCAT2",
          "generation": 8,
          "directDebit": true,
          "decisionDate": "2020-10-27T13:03:53.053Z",
          "destBankName": "Royal Bank Of Canada",
          "sourceBankID": "ROYCAT2",
          "parentAlertID": "d9e07556-97c4-4ab7-8031-1b2062ec149e",
          "destinationAge": "P3Y334DT209H14M",
          "networkAlertID": 1,
          "receivesSalary": true,
          "sourceBankName": "Royal Bank Of Canada",
          "relationshipAge": "P4Y308DT105H49M",
          "sourceTraceType": "fraud",
          "newRelationships": 13,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.39,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 71
        },
        {
          "id": "778d135e-f684-41c5-a8ef-957c1f901ccc",
          "time": "2020-06-04T10:41:41.136Z",
          "txnID": "54a13833-9fa6-4a12-80b1-466a0daa2f08",
          "value": 308299,
          "destID": "NL89LJAO5087406868",
          "avScore": 31,
          "service": "fraud",
          "txnTime": "2020-08-02T13:51:30.480Z",
          "currency": "USD",
          "sourceID": "MR3246906800050807308608045",
          "dwellTime": "P191DT172H25M",
          "muleScore": 0.06,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "BOFMCAT2",
          "generation": 8,
          "directDebit": true,
          "decisionDate": "2020-06-02T08:33:48.111Z",
          "destBankName": "Bank Of Montreal",
          "sourceBankID": "HSBC",
          "parentAlertID": "8f6e996e-0f6a-4d4b-ac66-dd901cb98214",
          "destinationAge": "P26DT205H5M",
          "networkAlertID": 1,
          "receivesSalary": false,
          "sourceBankName": "HSBC Canada",
          "relationshipAge": "P98DT281H17M",
          "sourceTraceType": "fraud",
          "newRelationships": 42,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.79,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 71
        },
        {
          "id": "3014ffbf-fc20-49b0-9a92-346dcfe686a2",
          "time": "2020-10-25T06:18:59.768Z",
          "txnID": "6ba0f698-9dfc-4211-be09-dcef7e40e20f",
          "value": 853217,
          "destID": "HR0747300610090390052",
          "avScore": 67,
          "service": "fraud",
          "txnTime": "2020-07-25T15:54:19.905Z",
          "currency": "AUD",
          "sourceID": "KW37GYNQ981D1V6E14691028146639",
          "dwellTime": "P2Y9DT345H51M",
          "muleScore": 0.96,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "HSBC",
          "generation": 10,
          "directDebit": true,
          "decisionDate": "2020-11-20T12:45:26.734Z",
          "destBankName": "HSBC Canada",
          "sourceBankID": "NOSCAT",
          "parentAlertID": "5d1fade8-1437-4f18-ad43-740b51db5136",
          "destinationAge": "P4Y302DT119H4M",
          "networkAlertID": 1,
          "receivesSalary": false,
          "sourceBankName": "The Bank Of Nova Scotia",
          "relationshipAge": "P4Y191DT137H49M",
          "sourceTraceType": "fraud",
          "newRelationships": 69,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.93,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 19
        }
      ],
      "mostRecentFeedback": "actionedMule",
      "numNotInvestigated": 11
    },
    {
      "id": 2,
      "time": "2020-06-20T01:58:38.411Z",
      "length": 4,
      "vizURL": "http://emmitt.info",
      "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
      "totalValue": 972417,
      "elapsedTime": "P4Y162DT88H59M",
      "generations": 1,
      "sourceTxnID": "1e408fb5-eaa7-4b43-a8aa-f4adbe79421d",
      "sourceValue": 68862,
      "decisionDate": "2020-07-02T13:50:03.165Z",
      "accountAlerts": [
        {
          "id": "27802dbd-7a80-4428-a616-7173bbd5d841",
          "name": "David Kemmer",
          "time": "2020-04-30T03:10:14.933Z",
          "accountID": "XK553287001010532847",
          "dwellTime": "P124DT204H46M",
          "muleScore": 0.34,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "generation": 7,
          "owningBank": "BE73309002001902",
          "generations": [
            3
          ],
          "numNetworks": 6,
          "endpointFlag": 82723072,
          "parentAlertID": "66240725-6aad-4942-bca3-2295ff2be35f",
          "networkAlertID": 2,
          "receivesSalary": true,
          "firstAppearance": "2020-04-17T13:15:06.102Z",
          "totalValueInbound": 42576,
          "mostRecentFeedback": "actionedMule",
          "totalValueOutbound": 346858,
          "firstTransactionTime": "2020-11-30T12:21:17.908Z",
          "mostRecentAppearance": "2020-11-03T21:06:24.063Z",
          "numConfirmedNetworks": 77,
          "numScheduledMandates": 100,
          "sourceTransactionValue": 859024,
          "numInboundRelationships": 13,
          "numOutboundRelationships": 25,
          "mostRecentTransactionTime": "2020-10-18T17:06:01.208Z",
          "totalSuspiciousValueInbound": 375862,
          "totalSuspiciousValueOutbound": 739183
        },
        {
          "id": "a9cf702e-9b6b-454c-a5a7-f2b3e9d3bec9",
          "name": "Jerome Hettinger",
          "time": "2020-11-30T00:59:47.002Z",
          "accountID": "BG25BZPU7833194199P922",
          "dwellTime": "P3Y354DT216H33M",
          "muleScore": 0.96,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "generation": 8,
          "owningBank": "DE71090130157006020374",
          "generations": [
            3,
            6,
            9,
            2,
            8,
            10
          ],
          "numNetworks": 15,
          "endpointFlag": 80596873,
          "parentAlertID": "e9800e0d-d6ee-4570-b68d-3566379aa075",
          "networkAlertID": 2,
          "receivesSalary": false,
          "firstAppearance": "2020-02-07T01:50:38.769Z",
          "totalValueInbound": 756031,
          "mostRecentFeedback": "confirmedLegitimate",
          "totalValueOutbound": 987482,
          "firstTransactionTime": "2020-11-30T08:25:04.486Z",
          "mostRecentAppearance": "2020-10-16T20:27:03.737Z",
          "numConfirmedNetworks": 92,
          "numScheduledMandates": 5,
          "sourceTransactionValue": 752569,
          "numInboundRelationships": 13,
          "numOutboundRelationships": 59,
          "mostRecentTransactionTime": "2020-07-31T21:12:31.696Z",
          "totalSuspiciousValueInbound": 669256,
          "totalSuspiciousValueOutbound": 285662
        },
        {
          "id": "1b9364e4-6c38-4dfd-a4e2-7310a0d23425",
          "name": "Mrs. Alison Wolf",
          "time": "2020-03-20T03:20:40.605Z",
          "accountID": "MD952135AI41186030592L73",
          "dwellTime": "P3Y162DT213H31M",
          "muleScore": 0.79,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "generation": 10,
          "owningBank": "AL02648004258016548450160416",
          "generations": [
            2
          ],
          "numNetworks": 33,
          "endpointFlag": 12602348,
          "parentAlertID": "dab2e2bf-e64c-43c7-a758-db2bdc3adff2",
          "networkAlertID": 2,
          "receivesSalary": true,
          "firstAppearance": "2020-02-07T14:36:53.240Z",
          "totalValueInbound": 154873,
          "mostRecentFeedback": "actionedMule",
          "totalValueOutbound": 702775,
          "firstTransactionTime": "2020-11-30T11:38:58.185Z",
          "mostRecentAppearance": "2019-12-25T03:59:35.558Z",
          "numConfirmedNetworks": 91,
          "numScheduledMandates": 45,
          "sourceTransactionValue": 158997,
          "numInboundRelationships": 98,
          "numOutboundRelationships": 8,
          "mostRecentTransactionTime": "2020-03-26T14:48:10.906Z",
          "totalSuspiciousValueInbound": 753755,
          "totalSuspiciousValueOutbound": 212131
        },
        {
          "id": "08f11b3c-03fb-4788-8b12-bc5cf1d8ca08",
          "name": "Lola Hudson",
          "time": "2019-12-27T01:02:03.732Z",
          "accountID": "ME06116003807930780020",
          "dwellTime": "P2Y110DT101H24M",
          "muleScore": 0.28,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "generation": 8,
          "owningBank": "XK720018006708502472",
          "generations": [
            2,
            3,
            2,
            9
          ],
          "numNetworks": 14,
          "endpointFlag": 81182264,
          "parentAlertID": "91765732-05bf-457e-9ecb-fa5a69759d7c",
          "networkAlertID": 2,
          "receivesSalary": false,
          "firstAppearance": "2020-03-31T18:50:53.796Z",
          "totalValueInbound": 722312,
          "mostRecentFeedback": "confirmedLegitimate",
          "totalValueOutbound": 19633,
          "firstTransactionTime": "2020-11-30T01:30:29.389Z",
          "mostRecentAppearance": "2020-10-01T13:07:34.969Z",
          "numConfirmedNetworks": 93,
          "numScheduledMandates": 80,
          "sourceTransactionValue": 523447,
          "numInboundRelationships": 46,
          "numOutboundRelationships": 38,
          "mostRecentTransactionTime": "2019-12-23T16:17:32.666Z",
          "totalSuspiciousValueInbound": 798100,
          "totalSuspiciousValueOutbound": 780178
        }
      ],
      "meanDwellTime": "P1Y312DT357H17M",
      "meanMuleScore": 0.97,
      "numLegitimate": 9,
      "parentAlertID": "47ce8fb0-11b1-4f4d-a8f8-7c4977118435",
      "sourceTxnType": "impersonationScam",
      "uniqueAccounts": 4,
      "medianDwellTime": "P3Y104DT318H24M",
      "numActionedMules": 19,
      "transactionAlerts": [
        {
          "id": "f238fe3c-a871-4a4a-a39c-77e026d78036",
          "time": "2020-09-12T05:48:40.626Z",
          "txnID": "a02e08b0-af63-4640-92d1-b78d0c432809",
          "value": 684519,
          "destID": "MD952135AI41186030592L73",
          "avScore": 61,
          "service": "fraud",
          "txnTime": "2020-02-16T07:30:15.598Z",
          "currency": "CAD",
          "sourceID": "ME06116003807930780020",
          "dwellTime": "P3Y100DT238H27M",
          "muleScore": 0.65,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "ROYCAT2",
          "generation": 1,
          "directDebit": true,
          "decisionDate": "2020-01-07T22:30:01.780Z",
          "destBankName": "Royal Bank Of Canada",
          "sourceBankID": "CITI",
          "parentAlertID": "5b278757-26da-4373-8ae4-dafd03730dd4",
          "destinationAge": "P243DT209H18M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "Citibank Canada",
          "relationshipAge": "P2Y342DT121H54M",
          "sourceTraceType": "fraud",
          "newRelationships": 17,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.96,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 14
        },
        {
          "id": "dfaedb24-16fa-4847-9b19-72c86475c0f9",
          "time": "2020-10-12T07:15:55.437Z",
          "txnID": "b96464d0-7361-43f3-ae90-0ab6b8e5ecf8",
          "value": 408591,
          "destID": "XK553287001010532847",
          "avScore": 7,
          "service": "fraud",
          "txnTime": "2020-06-11T19:43:40.517Z",
          "currency": "NZD",
          "sourceID": "BG25BZPU7833194199P922",
          "dwellTime": "P4Y73DT372H19M",
          "muleScore": 0.68,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "CITI",
          "generation": 10,
          "directDebit": true,
          "decisionDate": "2019-12-19T20:52:47.761Z",
          "destBankName": "Citibank Canada",
          "sourceBankID": "BOFMCAT2",
          "parentAlertID": "fb7b5849-8107-44bb-ac19-71fd4c23a849",
          "destinationAge": "P358DT136H3M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "Bank Of Montreal",
          "relationshipAge": "P4Y270DT201H56M",
          "sourceTraceType": "fraud",
          "newRelationships": 50,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.06,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 39
        },
        {
          "id": "22b98a0d-e4a5-4a56-af1b-1fa342107b42",
          "time": "2020-01-13T04:55:12.092Z",
          "txnID": "e43dd213-e138-4e76-beb4-50914cc1733b",
          "value": 512938,
          "destID": "ME06116003807930780020",
          "avScore": 46,
          "service": "fraud",
          "txnTime": "2020-09-22T21:58:59.808Z",
          "currency": "NZD",
          "sourceID": "SI59005632008001855",
          "dwellTime": "P2Y331DT228H24M",
          "muleScore": 0.81,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "NOSCAT",
          "generation": 9,
          "directDebit": false,
          "decisionDate": "2020-08-10T11:00:25.141Z",
          "destBankName": "The Bank Of Nova Scotia",
          "sourceBankID": "HSBC",
          "parentAlertID": "c832109c-ef6d-4473-81e9-ed97a656e4ea",
          "destinationAge": "P5Y28DT224H3M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "HSBC Canada",
          "relationshipAge": "P2Y123DT161H24M",
          "sourceTraceType": "fraud",
          "newRelationships": 95,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.72,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 46
        },
        {
          "id": "e29f0c60-1f1c-4b14-9139-149f4eb5ab73",
          "time": "2020-09-19T19:32:02.109Z",
          "txnID": "87d587d1-2e01-46b7-9ee5-5e2ccf858bfa",
          "value": 85202,
          "destID": "BG25BZPU7833194199P922",
          "avScore": 67,
          "service": "fraud",
          "txnTime": "2020-03-26T19:51:05.364Z",
          "currency": "NZD",
          "sourceID": "MD952135AI41186030592L73",
          "dwellTime": "P5Y261DT243H27M",
          "muleScore": 0.13,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "NOSCAT",
          "generation": 3,
          "directDebit": false,
          "decisionDate": "2020-01-24T05:32:24.905Z",
          "destBankName": "The Bank Of Nova Scotia",
          "sourceBankID": "CITI",
          "parentAlertID": "509c7f00-2752-461e-9042-c97d0bb9749f",
          "destinationAge": "P3Y84DT106H2M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "Citibank Canada",
          "relationshipAge": "P4Y130DT97H1M",
          "sourceTraceType": "fraud",
          "newRelationships": 26,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.9,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 30
        },
        {
          "id": "244881da-0345-4466-a924-4df0fc53f178",
          "time": "2020-09-28T01:40:16.079Z",
          "txnID": "a362fa81-e8af-4a79-a56a-95a464159b04",
          "value": 235662,
          "destID": "SI59005632008001855",
          "avScore": 97,
          "service": "fraud",
          "txnTime": "2020-08-20T04:42:02.437Z",
          "currency": "NZD",
          "sourceID": "BG25BZPU7833194199P922",
          "dwellTime": "P1Y162DT179H55M",
          "muleScore": 0.96,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "HSBC",
          "generation": 9,
          "directDebit": true,
          "decisionDate": "2020-04-21T07:56:09.268Z",
          "destBankName": "HSBC Canada",
          "sourceBankID": "CITI",
          "parentAlertID": "f7c2402d-c060-4955-8015-99268db0cbf1",
          "destinationAge": "P2Y219DT12H42M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "Citibank Canada",
          "relationshipAge": "P2Y128DT12H24M",
          "sourceTraceType": "fraud",
          "newRelationships": 12,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.06,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 41
        },
        {
          "id": "e647dd32-25ef-4f7b-91b8-88c9c23103f3",
          "time": "2020-03-19T15:25:14.661Z",
          "txnID": "04b36f44-7645-4ddf-bfb5-944eebe7a441",
          "value": 75443,
          "destID": "AT425663710087610847",
          "avScore": 37,
          "service": "fraud",
          "txnTime": "2020-10-03T18:33:38.042Z",
          "currency": "USD",
          "sourceID": "BG25BZPU7833194199P922",
          "dwellTime": "P4Y66DT243H30M",
          "muleScore": 0.76,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "BOFMCAT2",
          "generation": 1,
          "directDebit": true,
          "decisionDate": "2020-06-22T13:57:39.566Z",
          "destBankName": "Bank Of Montreal",
          "sourceBankID": "NOSCAT",
          "parentAlertID": "500051c8-a28f-4217-a725-3b22346e64b7",
          "destinationAge": "P1Y108DT237H23M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "The Bank Of Nova Scotia",
          "relationshipAge": "P5Y110DT89H45M",
          "sourceTraceType": "fraud",
          "newRelationships": 61,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.55,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 64
        },
        {
          "id": "8eb43fb0-4d19-4efc-8ada-08ad59ad3394",
          "time": "2020-02-14T21:49:38.711Z",
          "txnID": "cc020662-12a9-447c-a3d1-c704fd356816",
          "value": 722286,
          "destID": "ES2665034049906065903367",
          "avScore": 38,
          "service": "fraud",
          "txnTime": "2020-08-11T12:00:45.701Z",
          "currency": "CAD",
          "sourceID": "ME06116003807930780020",
          "dwellTime": "P4Y112DT251H19M",
          "muleScore": 0.53,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "HSBC",
          "generation": 4,
          "directDebit": false,
          "decisionDate": "2020-03-21T22:06:19.066Z",
          "destBankName": "HSBC Canada",
          "sourceBankID": "CITI",
          "parentAlertID": "023cfa11-9b73-4bca-a4ef-17a74fe1cb66",
          "destinationAge": "P3Y205DT199H16M",
          "networkAlertID": 2,
          "receivesSalary": true,
          "sourceBankName": "Citibank Canada",
          "relationshipAge": "P3Y63DT110H5M",
          "sourceTraceType": "fraud",
          "newRelationships": 7,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.48,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 94
        },
        {
          "id": "817d514c-78a9-4736-9b62-c176f729f4da",
          "time": "2020-03-10T05:31:03.355Z",
          "txnID": "fad94d99-8537-41b0-a51a-8d05b9edb610",
          "value": 915238,
          "destID": "ME06116003807930780020",
          "avScore": 61,
          "service": "fraud",
          "txnTime": "2020-07-09T10:04:40.708Z",
          "currency": "USD",
          "sourceID": "SI59005632008001855",
          "dwellTime": "P337DT387H9M",
          "muleScore": 0.68,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "BOFMCAT2",
          "generation": 4,
          "directDebit": true,
          "decisionDate": "2020-06-02T06:36:02.673Z",
          "destBankName": "Bank Of Montreal",
          "sourceBankID": "HSBC",
          "parentAlertID": "5b8256ae-39d2-4eb2-bbde-0829af13b2f1",
          "destinationAge": "P3Y320DT236H50M",
          "networkAlertID": 2,
          "receivesSalary": true,
          "sourceBankName": "HSBC Canada",
          "relationshipAge": "P1Y344DT3H50M",
          "sourceTraceType": "fraud",
          "newRelationships": 5,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.42,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 7
        }
      ],
      "mostRecentFeedback": "actionedMule",
      "numNotInvestigated": 77
    }],
    "traceRequests": [{
      "id": 1,
      "time": "2020-04-10T08:46:46.687Z",
      "length": 488,
      "vizURL": "http://rachel6.com",
      "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
      "totalValue": 987549,
      "elapsedTime": "P2Y195DT82H38M",
      "generations": 3,
      "sourceTxnID": "9a8c0764-a769-43c2-bdc3-e2e05fb0a61e",
      "sourceValue": 496209,
      "decisionDate": "2020-02-16T20:08:33.493Z",
      "accountAlerts": [
        {
          "id": "e68008e6-7fe3-4590-a9ab-b3adc3b919ae",
          "name": "Alberto Schaden",
          "time": "2020-08-01T13:06:44.431Z",
          "accountID": "KW37GYNQ981D1V6E14691028146639",
          "dwellTime": "P3Y50DT72H28M",
          "muleScore": 0.15,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "generation": 1,
          "owningBank": "EE200243108008808782",
          "generations": [
            10,
            2,
            3,
            4,
            7
          ],
          "numNetworks": 10,
          "endpointFlag": 49299849,
          "parentAlertID": "129f06d4-1185-4be8-b18e-7a8e28216c5e",
          "networkAlertID": 1,
          "receivesSalary": true,
          "firstAppearance": "2020-01-03T08:59:01.213Z",
          "totalValueInbound": 618865,
          "mostRecentFeedback": "actionedMule",
          "totalValueOutbound": 5702,
          "firstTransactionTime": "2020-11-30T16:15:36.665Z",
          "mostRecentAppearance": "2020-05-21T10:54:53.375Z",
          "numConfirmedNetworks": 62,
          "numScheduledMandates": 97,
          "sourceTransactionValue": 764049,
          "numInboundRelationships": 65,
          "numOutboundRelationships": 72,
          "mostRecentTransactionTime": "2020-07-04T05:59:10.407Z",
          "totalSuspiciousValueInbound": 841908,
          "totalSuspiciousValueOutbound": 808865
        },
        {
          "id": "11c2cb86-c00d-4db5-a3d8-6364129fd1f9",
          "name": "Jeffrey Ankunding",
          "time": "2020-08-15T06:08:36.617Z",
          "accountID": "HR0747300610090390052",
          "dwellTime": "P5Y157DT84H14M",
          "muleScore": 0.06,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "generation": 5,
          "owningBank": "LB4140090237861801548H341114",
          "generations": [
            2,
            3,
            6,
            8,
            9
          ],
          "numNetworks": 37,
          "endpointFlag": 72700913,
          "parentAlertID": "0a6b03ab-9cd1-456e-888d-3f6f74fded02",
          "networkAlertID": 1,
          "receivesSalary": true,
          "firstAppearance": "2020-05-10T11:30:08.196Z",
          "totalValueInbound": 864847,
          "mostRecentFeedback": "actionedMule",
          "totalValueOutbound": 205588,
          "firstTransactionTime": "2020-11-30T07:37:36.612Z",
          "mostRecentAppearance": "2020-09-25T08:15:54.111Z",
          "numConfirmedNetworks": 58,
          "numScheduledMandates": 46,
          "sourceTransactionValue": 741032,
          "numInboundRelationships": 3,
          "numOutboundRelationships": 22,
          "mostRecentTransactionTime": "2020-06-12T19:59:57.629Z",
          "totalSuspiciousValueInbound": 122041,
          "totalSuspiciousValueOutbound": 546993
        },
        {
          "id": "98808e2d-768a-46e4-b2ac-7f27cbd05b2f",
          "name": "Rachel Hyatt",
          "time": "2020-06-28T00:35:24.506Z",
          "accountID": "MR3246906800050807308608045",
          "dwellTime": "P4Y2DT217H16M",
          "muleScore": 0.25,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "generation": 9,
          "owningBank": "RS56095884011588969888",
          "generations": [
            6,
            3,
            1,
            7,
            7,
            10,
            5,
            6
          ],
          "numNetworks": 9,
          "endpointFlag": 31227203,
          "parentAlertID": "c39dc5fe-e072-4ec8-8dc3-49c7969b126f",
          "networkAlertID": 1,
          "receivesSalary": true,
          "firstAppearance": "2020-07-22T19:24:19.204Z",
          "totalValueInbound": 733300,
          "mostRecentFeedback": "actionedMule",
          "totalValueOutbound": 194579,
          "firstTransactionTime": "2020-11-30T09:09:37.469Z",
          "mostRecentAppearance": "2020-11-18T05:20:29.508Z",
          "numConfirmedNetworks": 89,
          "numScheduledMandates": 7,
          "sourceTransactionValue": 862754,
          "numInboundRelationships": 49,
          "numOutboundRelationships": 89,
          "mostRecentTransactionTime": "2020-06-06T11:14:01.347Z",
          "totalSuspiciousValueInbound": 882571,
          "totalSuspiciousValueOutbound": 194931
        },
        {
          "id": "1ee19cd3-4800-4d46-8221-aaba018c59c4",
          "name": "Caleb Cruickshank Jr.",
          "time": "2020-10-04T03:15:51.738Z",
          "accountID": "LV87CVTS17756597K46O8",
          "dwellTime": "P300DT50H50M",
          "muleScore": 0.37,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "generation": 6,
          "owningBank": "IS540914750091106030006261",
          "generations": [
            1,
            1
          ],
          "numNetworks": 20,
          "endpointFlag": 5753651,
          "parentAlertID": "798b79b3-a1c4-4c99-aa54-b24b202df63f",
          "networkAlertID": 1,
          "receivesSalary": false,
          "firstAppearance": "2020-10-05T19:00:18.462Z",
          "totalValueInbound": 489724,
          "mostRecentFeedback": "confirmedLegitimate",
          "totalValueOutbound": 238945,
          "firstTransactionTime": "2020-11-30T17:42:43.526Z",
          "mostRecentAppearance": "2020-04-20T16:13:26.753Z",
          "numConfirmedNetworks": 50,
          "numScheduledMandates": 31,
          "sourceTransactionValue": 537272,
          "numInboundRelationships": 30,
          "numOutboundRelationships": 95,
          "mostRecentTransactionTime": "2020-02-25T22:21:55.539Z",
          "totalSuspiciousValueInbound": 63084,
          "totalSuspiciousValueOutbound": 360106
        }
      ],
      "meanDwellTime": "P5Y220DT107H16M",
      "meanMuleScore": 0.77,
      "numLegitimate": 33,
      "parentAlertID": "9ff67102-f8a7-4bc0-9783-420430cbf4ca",
      "sourceTxnType": "romanceScam",
      "uniqueAccounts": 4,
      "medianDwellTime": "P152DT254H18M",
      "numActionedMules": 69,
      "transactionAlerts": [
        {
          "id": "00c35db1-206a-46f9-aefa-3a4243a16fc4",
          "time": "2020-01-26T20:36:10.255Z",
          "txnID": "0d071a81-3923-40f9-b9e7-260551c71531",
          "value": 797863,
          "destID": "MR3246906800050807308608045",
          "avScore": 36,
          "service": "fraud",
          "txnTime": "2020-01-06T09:35:11.362Z",
          "currency": "USD",
          "sourceID": "LV87CVTS17756597K46O8",
          "dwellTime": "P4Y259DT240H17M",
          "muleScore": 0.63,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "ROYCAT2",
          "generation": 5,
          "directDebit": true,
          "decisionDate": "2020-05-21T02:11:45.619Z",
          "destBankName": "Royal Bank Of Canada",
          "sourceBankID": "BOFMCAT2",
          "parentAlertID": "1e89a942-99aa-4a52-9b9a-be35f4fff4c6",
          "destinationAge": "P4Y83DT163H16M",
          "networkAlertID": 1,
          "receivesSalary": true,
          "sourceBankName": "Bank Of Montreal",
          "relationshipAge": "P3Y31DT120H22M",
          "sourceTraceType": "fraud",
          "newRelationships": 42,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.13,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 47
        },
        {
          "id": "3bdf3f28-b5c3-4b7d-bfc3-f5f5e1299c25",
          "time": "2020-04-18T10:07:07.942Z",
          "txnID": "d8a4aed6-3d34-4ff6-aabf-a5d31d032847",
          "value": 342645,
          "destID": "KW37GYNQ981D1V6E14691028146639",
          "avScore": 12,
          "service": "fraud",
          "txnTime": "2020-05-20T00:25:19.844Z",
          "currency": "USD",
          "sourceID": "HR0747300610090390052",
          "dwellTime": "P2Y212DT266H",
          "muleScore": 0.23,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "NOSCAT",
          "generation": 2,
          "directDebit": true,
          "decisionDate": "2020-08-07T07:18:04.106Z",
          "destBankName": "The Bank Of Nova Scotia",
          "sourceBankID": "NOSCAT",
          "parentAlertID": "0c76b463-b654-425e-9949-fb65eca90dd4",
          "destinationAge": "P36DT270H48M",
          "networkAlertID": 1,
          "receivesSalary": false,
          "sourceBankName": "The Bank Of Nova Scotia",
          "relationshipAge": "P3Y104DT179H43M",
          "sourceTraceType": "fraud",
          "newRelationships": 47,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.88,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 81
        },
        {
          "id": "95824ed0-d9f6-4004-b841-72f9bc8d4d74",
          "time": "2020-02-05T11:42:02.113Z",
          "txnID": "154ad20c-6e59-4ce4-a59d-c3af7e019431",
          "value": 392083,
          "destID": "MR3246906800050807308608045",
          "avScore": 24,
          "service": "fraud",
          "txnTime": "2020-05-01T17:01:24.441Z",
          "currency": "CAD",
          "sourceID": "HR0747300610090390052",
          "dwellTime": "P5Y294DT53M",
          "muleScore": 0.11,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "NOSCAT",
          "generation": 4,
          "directDebit": false,
          "decisionDate": "2020-07-19T22:23:29.704Z",
          "destBankName": "The Bank Of Nova Scotia",
          "sourceBankID": "ROYCAT2",
          "parentAlertID": "c130564e-9554-422f-b05f-884f4bc1f563",
          "destinationAge": "P5Y271DT217H59M",
          "networkAlertID": 1,
          "receivesSalary": false,
          "sourceBankName": "Royal Bank Of Canada",
          "relationshipAge": "P3Y354DT38H34M",
          "sourceTraceType": "fraud",
          "newRelationships": 82,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.79,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 13
        },
        {
          "id": "bf593f6c-ae49-4430-bd82-f4e37aed886c",
          "time": "2019-12-03T13:43:47.918Z",
          "txnID": "1448656b-cfff-42a8-bc23-6a4bc4c5d34b",
          "value": 630400,
          "destID": "SI49027582801362046",
          "avScore": 70,
          "service": "fraud",
          "txnTime": "2020-10-09T19:23:36.366Z",
          "currency": "AUD",
          "sourceID": "SI49027582801362046",
          "dwellTime": "P3Y356DT124H46M",
          "muleScore": 0.42,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "NOSCAT",
          "generation": 9,
          "directDebit": true,
          "decisionDate": "2020-06-03T17:59:44.533Z",
          "destBankName": "The Bank Of Nova Scotia",
          "sourceBankID": "ROYCAT2",
          "parentAlertID": "24637f8c-5ef0-4029-a289-582a64826855",
          "destinationAge": "P105DT185H44M",
          "networkAlertID": 1,
          "receivesSalary": false,
          "sourceBankName": "Royal Bank Of Canada",
          "relationshipAge": "P4Y136DT133H12M",
          "sourceTraceType": "fraud",
          "newRelationships": 40,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.17,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 81
        },
        {
          "id": "5b5ace37-f213-4a42-926b-60629fcdaebe",
          "time": "2020-03-16T10:30:39.998Z",
          "txnID": "802181a5-0566-4074-a7bc-ac6deefc1cb3",
          "value": 202657,
          "destID": "MR3246906800050807308608045",
          "avScore": 86,
          "service": "fraud",
          "txnTime": "2020-03-09T14:05:56.246Z",
          "currency": "AUD",
          "sourceID": "KW37GYNQ981D1V6E14691028146639",
          "dwellTime": "P3Y329DT204H55M",
          "muleScore": 0.4,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "ROYCAT2",
          "generation": 8,
          "directDebit": true,
          "decisionDate": "2020-10-27T13:03:53.053Z",
          "destBankName": "Royal Bank Of Canada",
          "sourceBankID": "ROYCAT2",
          "parentAlertID": "d9e07556-97c4-4ab7-8031-1b2062ec149e",
          "destinationAge": "P3Y334DT209H14M",
          "networkAlertID": 1,
          "receivesSalary": true,
          "sourceBankName": "Royal Bank Of Canada",
          "relationshipAge": "P4Y308DT105H49M",
          "sourceTraceType": "fraud",
          "newRelationships": 13,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.39,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 71
        },
        {
          "id": "778d135e-f684-41c5-a8ef-957c1f901ccc",
          "time": "2020-06-04T10:41:41.136Z",
          "txnID": "54a13833-9fa6-4a12-80b1-466a0daa2f08",
          "value": 308299,
          "destID": "NL89LJAO5087406868",
          "avScore": 31,
          "service": "fraud",
          "txnTime": "2020-08-02T13:51:30.480Z",
          "currency": "USD",
          "sourceID": "MR3246906800050807308608045",
          "dwellTime": "P191DT172H25M",
          "muleScore": 0.06,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "BOFMCAT2",
          "generation": 8,
          "directDebit": true,
          "decisionDate": "2020-06-02T08:33:48.111Z",
          "destBankName": "Bank Of Montreal",
          "sourceBankID": "HSBC",
          "parentAlertID": "8f6e996e-0f6a-4d4b-ac66-dd901cb98214",
          "destinationAge": "P26DT205H5M",
          "networkAlertID": 1,
          "receivesSalary": false,
          "sourceBankName": "HSBC Canada",
          "relationshipAge": "P98DT281H17M",
          "sourceTraceType": "fraud",
          "newRelationships": 42,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.79,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 71
        },
        {
          "id": "3014ffbf-fc20-49b0-9a92-346dcfe686a2",
          "time": "2020-10-25T06:18:59.768Z",
          "txnID": "6ba0f698-9dfc-4211-be09-dcef7e40e20f",
          "value": 853217,
          "destID": "HR0747300610090390052",
          "avScore": 67,
          "service": "fraud",
          "txnTime": "2020-07-25T15:54:19.905Z",
          "currency": "AUD",
          "sourceID": "KW37GYNQ981D1V6E14691028146639",
          "dwellTime": "P2Y9DT345H51M",
          "muleScore": 0.96,
          "networkID": "b350f2f6-acfb-4cfb-98ae-b448779e0eda",
          "remitInfo": "fraud",
          "destBankID": "HSBC",
          "generation": 10,
          "directDebit": true,
          "decisionDate": "2020-11-20T12:45:26.734Z",
          "destBankName": "HSBC Canada",
          "sourceBankID": "NOSCAT",
          "parentAlertID": "5d1fade8-1437-4f18-ad43-740b51db5136",
          "destinationAge": "P4Y302DT119H4M",
          "networkAlertID": 1,
          "receivesSalary": false,
          "sourceBankName": "The Bank Of Nova Scotia",
          "relationshipAge": "P4Y191DT137H49M",
          "sourceTraceType": "fraud",
          "newRelationships": 69,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.93,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 19
        }
      ],
      "mostRecentFeedback": "actionedMule",
      "numNotInvestigated": 11
    },
    {
      "id": 2,
      "time": "2020-06-20T01:58:38.411Z",
      "length": 4,
      "vizURL": "http://emmitt.info",
      "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
      "totalValue": 972417,
      "elapsedTime": "P4Y162DT88H59M",
      "generations": 1,
      "sourceTxnID": "1e408fb5-eaa7-4b43-a8aa-f4adbe79421d",
      "sourceValue": 68862,
      "decisionDate": "2020-07-02T13:50:03.165Z",
      "accountAlerts": [
        {
          "id": "27802dbd-7a80-4428-a616-7173bbd5d841",
          "name": "David Kemmer",
          "time": "2020-04-30T03:10:14.933Z",
          "accountID": "XK553287001010532847",
          "dwellTime": "P124DT204H46M",
          "muleScore": 0.34,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "generation": 7,
          "owningBank": "BE73309002001902",
          "generations": [
            3
          ],
          "numNetworks": 6,
          "endpointFlag": 82723072,
          "parentAlertID": "66240725-6aad-4942-bca3-2295ff2be35f",
          "networkAlertID": 2,
          "receivesSalary": true,
          "firstAppearance": "2020-04-17T13:15:06.102Z",
          "totalValueInbound": 42576,
          "mostRecentFeedback": "actionedMule",
          "totalValueOutbound": 346858,
          "firstTransactionTime": "2020-11-30T12:21:17.908Z",
          "mostRecentAppearance": "2020-11-03T21:06:24.063Z",
          "numConfirmedNetworks": 77,
          "numScheduledMandates": 100,
          "sourceTransactionValue": 859024,
          "numInboundRelationships": 13,
          "numOutboundRelationships": 25,
          "mostRecentTransactionTime": "2020-10-18T17:06:01.208Z",
          "totalSuspiciousValueInbound": 375862,
          "totalSuspiciousValueOutbound": 739183
        },
        {
          "id": "a9cf702e-9b6b-454c-a5a7-f2b3e9d3bec9",
          "name": "Jerome Hettinger",
          "time": "2020-11-30T00:59:47.002Z",
          "accountID": "BG25BZPU7833194199P922",
          "dwellTime": "P3Y354DT216H33M",
          "muleScore": 0.96,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "generation": 8,
          "owningBank": "DE71090130157006020374",
          "generations": [
            3,
            6,
            9,
            2,
            8,
            10
          ],
          "numNetworks": 15,
          "endpointFlag": 80596873,
          "parentAlertID": "e9800e0d-d6ee-4570-b68d-3566379aa075",
          "networkAlertID": 2,
          "receivesSalary": false,
          "firstAppearance": "2020-02-07T01:50:38.769Z",
          "totalValueInbound": 756031,
          "mostRecentFeedback": "confirmedLegitimate",
          "totalValueOutbound": 987482,
          "firstTransactionTime": "2020-11-30T08:25:04.486Z",
          "mostRecentAppearance": "2020-10-16T20:27:03.737Z",
          "numConfirmedNetworks": 92,
          "numScheduledMandates": 5,
          "sourceTransactionValue": 752569,
          "numInboundRelationships": 13,
          "numOutboundRelationships": 59,
          "mostRecentTransactionTime": "2020-07-31T21:12:31.696Z",
          "totalSuspiciousValueInbound": 669256,
          "totalSuspiciousValueOutbound": 285662
        },
        {
          "id": "1b9364e4-6c38-4dfd-a4e2-7310a0d23425",
          "name": "Mrs. Alison Wolf",
          "time": "2020-03-20T03:20:40.605Z",
          "accountID": "MD952135AI41186030592L73",
          "dwellTime": "P3Y162DT213H31M",
          "muleScore": 0.79,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "generation": 10,
          "owningBank": "AL02648004258016548450160416",
          "generations": [
            2
          ],
          "numNetworks": 33,
          "endpointFlag": 12602348,
          "parentAlertID": "dab2e2bf-e64c-43c7-a758-db2bdc3adff2",
          "networkAlertID": 2,
          "receivesSalary": true,
          "firstAppearance": "2020-02-07T14:36:53.240Z",
          "totalValueInbound": 154873,
          "mostRecentFeedback": "actionedMule",
          "totalValueOutbound": 702775,
          "firstTransactionTime": "2020-11-30T11:38:58.185Z",
          "mostRecentAppearance": "2019-12-25T03:59:35.558Z",
          "numConfirmedNetworks": 91,
          "numScheduledMandates": 45,
          "sourceTransactionValue": 158997,
          "numInboundRelationships": 98,
          "numOutboundRelationships": 8,
          "mostRecentTransactionTime": "2020-03-26T14:48:10.906Z",
          "totalSuspiciousValueInbound": 753755,
          "totalSuspiciousValueOutbound": 212131
        },
        {
          "id": "08f11b3c-03fb-4788-8b12-bc5cf1d8ca08",
          "name": "Lola Hudson",
          "time": "2019-12-27T01:02:03.732Z",
          "accountID": "ME06116003807930780020",
          "dwellTime": "P2Y110DT101H24M",
          "muleScore": 0.28,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "generation": 8,
          "owningBank": "XK720018006708502472",
          "generations": [
            2,
            3,
            2,
            9
          ],
          "numNetworks": 14,
          "endpointFlag": 81182264,
          "parentAlertID": "91765732-05bf-457e-9ecb-fa5a69759d7c",
          "networkAlertID": 2,
          "receivesSalary": false,
          "firstAppearance": "2020-03-31T18:50:53.796Z",
          "totalValueInbound": 722312,
          "mostRecentFeedback": "confirmedLegitimate",
          "totalValueOutbound": 19633,
          "firstTransactionTime": "2020-11-30T01:30:29.389Z",
          "mostRecentAppearance": "2020-10-01T13:07:34.969Z",
          "numConfirmedNetworks": 93,
          "numScheduledMandates": 80,
          "sourceTransactionValue": 523447,
          "numInboundRelationships": 46,
          "numOutboundRelationships": 38,
          "mostRecentTransactionTime": "2019-12-23T16:17:32.666Z",
          "totalSuspiciousValueInbound": 798100,
          "totalSuspiciousValueOutbound": 780178
        }
      ],
      "meanDwellTime": "P1Y312DT357H17M",
      "meanMuleScore": 0.97,
      "numLegitimate": 9,
      "parentAlertID": "47ce8fb0-11b1-4f4d-a8f8-7c4977118435",
      "sourceTxnType": "impersonationScam",
      "uniqueAccounts": 4,
      "medianDwellTime": "P3Y104DT318H24M",
      "numActionedMules": 19,
      "transactionAlerts": [
        {
          "id": "f238fe3c-a871-4a4a-a39c-77e026d78036",
          "time": "2020-09-12T05:48:40.626Z",
          "txnID": "a02e08b0-af63-4640-92d1-b78d0c432809",
          "value": 684519,
          "destID": "MD952135AI41186030592L73",
          "avScore": 61,
          "service": "fraud",
          "txnTime": "2020-02-16T07:30:15.598Z",
          "currency": "CAD",
          "sourceID": "ME06116003807930780020",
          "dwellTime": "P3Y100DT238H27M",
          "muleScore": 0.65,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "ROYCAT2",
          "generation": 1,
          "directDebit": true,
          "decisionDate": "2020-01-07T22:30:01.780Z",
          "destBankName": "Royal Bank Of Canada",
          "sourceBankID": "CITI",
          "parentAlertID": "5b278757-26da-4373-8ae4-dafd03730dd4",
          "destinationAge": "P243DT209H18M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "Citibank Canada",
          "relationshipAge": "P2Y342DT121H54M",
          "sourceTraceType": "fraud",
          "newRelationships": 17,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.96,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 14
        },
        {
          "id": "dfaedb24-16fa-4847-9b19-72c86475c0f9",
          "time": "2020-10-12T07:15:55.437Z",
          "txnID": "b96464d0-7361-43f3-ae90-0ab6b8e5ecf8",
          "value": 408591,
          "destID": "XK553287001010532847",
          "avScore": 7,
          "service": "fraud",
          "txnTime": "2020-06-11T19:43:40.517Z",
          "currency": "NZD",
          "sourceID": "BG25BZPU7833194199P922",
          "dwellTime": "P4Y73DT372H19M",
          "muleScore": 0.68,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "CITI",
          "generation": 10,
          "directDebit": true,
          "decisionDate": "2019-12-19T20:52:47.761Z",
          "destBankName": "Citibank Canada",
          "sourceBankID": "BOFMCAT2",
          "parentAlertID": "fb7b5849-8107-44bb-ac19-71fd4c23a849",
          "destinationAge": "P358DT136H3M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "Bank Of Montreal",
          "relationshipAge": "P4Y270DT201H56M",
          "sourceTraceType": "fraud",
          "newRelationships": 50,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.06,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 39
        },
        {
          "id": "22b98a0d-e4a5-4a56-af1b-1fa342107b42",
          "time": "2020-01-13T04:55:12.092Z",
          "txnID": "e43dd213-e138-4e76-beb4-50914cc1733b",
          "value": 512938,
          "destID": "ME06116003807930780020",
          "avScore": 46,
          "service": "fraud",
          "txnTime": "2020-09-22T21:58:59.808Z",
          "currency": "NZD",
          "sourceID": "SI59005632008001855",
          "dwellTime": "P2Y331DT228H24M",
          "muleScore": 0.81,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "NOSCAT",
          "generation": 9,
          "directDebit": false,
          "decisionDate": "2020-08-10T11:00:25.141Z",
          "destBankName": "The Bank Of Nova Scotia",
          "sourceBankID": "HSBC",
          "parentAlertID": "c832109c-ef6d-4473-81e9-ed97a656e4ea",
          "destinationAge": "P5Y28DT224H3M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "HSBC Canada",
          "relationshipAge": "P2Y123DT161H24M",
          "sourceTraceType": "fraud",
          "newRelationships": 95,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.72,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 46
        },
        {
          "id": "e29f0c60-1f1c-4b14-9139-149f4eb5ab73",
          "time": "2020-09-19T19:32:02.109Z",
          "txnID": "87d587d1-2e01-46b7-9ee5-5e2ccf858bfa",
          "value": 85202,
          "destID": "BG25BZPU7833194199P922",
          "avScore": 67,
          "service": "fraud",
          "txnTime": "2020-03-26T19:51:05.364Z",
          "currency": "NZD",
          "sourceID": "MD952135AI41186030592L73",
          "dwellTime": "P5Y261DT243H27M",
          "muleScore": 0.13,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "NOSCAT",
          "generation": 3,
          "directDebit": false,
          "decisionDate": "2020-01-24T05:32:24.905Z",
          "destBankName": "The Bank Of Nova Scotia",
          "sourceBankID": "CITI",
          "parentAlertID": "509c7f00-2752-461e-9042-c97d0bb9749f",
          "destinationAge": "P3Y84DT106H2M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "Citibank Canada",
          "relationshipAge": "P4Y130DT97H1M",
          "sourceTraceType": "fraud",
          "newRelationships": 26,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.9,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 30
        },
        {
          "id": "244881da-0345-4466-a924-4df0fc53f178",
          "time": "2020-09-28T01:40:16.079Z",
          "txnID": "a362fa81-e8af-4a79-a56a-95a464159b04",
          "value": 235662,
          "destID": "SI59005632008001855",
          "avScore": 97,
          "service": "fraud",
          "txnTime": "2020-08-20T04:42:02.437Z",
          "currency": "NZD",
          "sourceID": "BG25BZPU7833194199P922",
          "dwellTime": "P1Y162DT179H55M",
          "muleScore": 0.96,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "HSBC",
          "generation": 9,
          "directDebit": true,
          "decisionDate": "2020-04-21T07:56:09.268Z",
          "destBankName": "HSBC Canada",
          "sourceBankID": "CITI",
          "parentAlertID": "f7c2402d-c060-4955-8015-99268db0cbf1",
          "destinationAge": "P2Y219DT12H42M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "Citibank Canada",
          "relationshipAge": "P2Y128DT12H24M",
          "sourceTraceType": "fraud",
          "newRelationships": 12,
          "mostRecentFeedback": "confirmedLegitimate",
          "neighbourhoodOverlap": 0.06,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": true,
          "destinationReceiveValues": 41
        },
        {
          "id": "e647dd32-25ef-4f7b-91b8-88c9c23103f3",
          "time": "2020-03-19T15:25:14.661Z",
          "txnID": "04b36f44-7645-4ddf-bfb5-944eebe7a441",
          "value": 75443,
          "destID": "AT425663710087610847",
          "avScore": 37,
          "service": "fraud",
          "txnTime": "2020-10-03T18:33:38.042Z",
          "currency": "USD",
          "sourceID": "BG25BZPU7833194199P922",
          "dwellTime": "P4Y66DT243H30M",
          "muleScore": 0.76,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "BOFMCAT2",
          "generation": 1,
          "directDebit": true,
          "decisionDate": "2020-06-22T13:57:39.566Z",
          "destBankName": "Bank Of Montreal",
          "sourceBankID": "NOSCAT",
          "parentAlertID": "500051c8-a28f-4217-a725-3b22346e64b7",
          "destinationAge": "P1Y108DT237H23M",
          "networkAlertID": 2,
          "receivesSalary": false,
          "sourceBankName": "The Bank Of Nova Scotia",
          "relationshipAge": "P5Y110DT89H45M",
          "sourceTraceType": "fraud",
          "newRelationships": 61,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.55,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 64
        },
        {
          "id": "8eb43fb0-4d19-4efc-8ada-08ad59ad3394",
          "time": "2020-02-14T21:49:38.711Z",
          "txnID": "cc020662-12a9-447c-a3d1-c704fd356816",
          "value": 722286,
          "destID": "ES2665034049906065903367",
          "avScore": 38,
          "service": "fraud",
          "txnTime": "2020-08-11T12:00:45.701Z",
          "currency": "CAD",
          "sourceID": "ME06116003807930780020",
          "dwellTime": "P4Y112DT251H19M",
          "muleScore": 0.53,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "HSBC",
          "generation": 4,
          "directDebit": false,
          "decisionDate": "2020-03-21T22:06:19.066Z",
          "destBankName": "HSBC Canada",
          "sourceBankID": "CITI",
          "parentAlertID": "023cfa11-9b73-4bca-a4ef-17a74fe1cb66",
          "destinationAge": "P3Y205DT199H16M",
          "networkAlertID": 2,
          "receivesSalary": true,
          "sourceBankName": "Citibank Canada",
          "relationshipAge": "P3Y63DT110H5M",
          "sourceTraceType": "fraud",
          "newRelationships": 7,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.48,
          "destinationIsBusiness": true,
          "destinationAccountStatus": "confirmedLegitimate",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 94
        },
        {
          "id": "817d514c-78a9-4736-9b62-c176f729f4da",
          "time": "2020-03-10T05:31:03.355Z",
          "txnID": "fad94d99-8537-41b0-a51a-8d05b9edb610",
          "value": 915238,
          "destID": "ME06116003807930780020",
          "avScore": 61,
          "service": "fraud",
          "txnTime": "2020-07-09T10:04:40.708Z",
          "currency": "USD",
          "sourceID": "SI59005632008001855",
          "dwellTime": "P337DT387H9M",
          "muleScore": 0.68,
          "networkID": "07156c5f-735f-4afc-b7bd-04d647c2154e",
          "remitInfo": "fraud",
          "destBankID": "BOFMCAT2",
          "generation": 4,
          "directDebit": true,
          "decisionDate": "2020-06-02T06:36:02.673Z",
          "destBankName": "Bank Of Montreal",
          "sourceBankID": "HSBC",
          "parentAlertID": "5b8256ae-39d2-4eb2-bbde-0829af13b2f1",
          "destinationAge": "P3Y320DT236H50M",
          "networkAlertID": 2,
          "receivesSalary": true,
          "sourceBankName": "HSBC Canada",
          "relationshipAge": "P1Y344DT3H50M",
          "sourceTraceType": "fraud",
          "newRelationships": 5,
          "mostRecentFeedback": "actionedMule",
          "neighbourhoodOverlap": 0.42,
          "destinationIsBusiness": false,
          "destinationAccountStatus": "actionedMule",
          "destinationNetworkStatus": false,
          "destinationReceiveValues": 7
        }
      ],
      "mostRecentFeedback": "actionedMule",
      "numNotInvestigated": 77
    }]
}

create-sample-workflow.sh

#!/bin/sh
curl -vX POST http://<HOST:PORT>/v1/workflows --header "Content-Type: application/json" --header "USERID: system" --header "ROLES: CMS_CONFIG_ADMIN" --header "TENANTKEY: MASTERCARD" -d @<workflow_filename.json>

Sample Workflow

{
    "tenantKey": "MASTERCARD",
    "caseType": "aml",
    "description": "Basic CORE case workflow",
    "logTopic": "test-log",
    "errorTopic": "test-error",
    "transitions": [
        {
            "onState": "alert",
            "routes": [
                {
                    "actions": [
                        {
                            "actionName": "create-case",
                            "actionType": "user",
                            "resultStates": [
                                "open",
                                "closed",
                                "pending",
                                "review"
                            ]
                        }
                    ],
                    "description": "User action on alert",
                    "messageType": "state-transition"
                }
            ]
        },
        {
            "onState": "closed",
            "routes": [
                {
                    "actions": [
                        {
                            "actionName": "reopen-case",
                            "actionType": "user",
                            "resultStates": [
                                "open"
                            ]
                        }
                    ],
                    "description": "User action on closed case",
                    "messageType": "state-transition"
                }
            ]
        },
        {
            "onState": "in",
            "routes": [
                {
                    "actions": [
                        {
                            "state": "alert",
                            "actionName": "create-case",
                            "actionType": "service",
                            "resultStates": [
                                "alert"
                            ]
                        }
                    ],
                    "description": "User action on transaction",
                    "messageType": "state-transition"
                },
                {
                    "actions": [
                        {
                            "actionName": "submit-trace-request",
                            "actionType": "service"
                        }
                    ],
                    "description": "submit trace request",
                    "messageType": "submit-trace-request"
                },
                {
                    "actions": [
                        {
                            "state": "open",
                            "caseType": "aml",
                            "priority": "Medium",
                            "tenantKey": "MASTERCARD",
                            "actionName": "create-case",
                            "actionType": "service",
                            "resultStates": [
                                "open"
                            ]
                        }
                    ],
                    "conditions": [
                        {
                            "op": "gt",
                            "left": "properties.meanMuleScore",
                            "right": 0.1,
                            "conditionType": "message"
                        }
                    ],
                    "description": "create case based on the trace response",
                    "messageType": "process-trace-response"
                },
                {
                    "actions": [
                        {
                            "state": "dismissed",
                            "caseType": "aml",
                            "priority": "Medium",
                            "tenantKey": "MASTERCARD",
                            "actionName": "create-case",
                            "actionType": "service",
                            "resultStates": [
                                "dismissed"
                            ]
                        }
                    ],
                    "conditions": [
                        {
                            "op": "le",
                            "left": "properties.meanMuleScore",
                            "right": 0.1,
                            "conditionType": "message"
                        }
                    ],
                    "description": "create case with status of dismissed based on the trace response",
                    "messageType": "process-trace-response"
                },
                {
                    "actions": [
                        {
                            "state": "open",
                            "caseType": "aml",
                            "priority": "Medium",
                            "tenantKey": "MASTERCARD",
                            "actionName": "create-case",
                            "actionType": "service",
                            "resultStates": [
                                "open"
                            ]
                        }
                    ],
                    "conditions": [
                        {
                            "op": "gt",
                            "left": "properties.meanMuleScore",
                            "right": 0.3,
                            "conditionType": "message"
                        }
                    ],
                    "description": "create case based on the network alert",
                    "messageType": "process-alert-response"
                },
                {
                    "actions": [
                        {
                            "state": "dismissed",
                            "caseType": "aml",
                            "priority": "Medium",
                            "tenantKey": "MASTERCARD",
                            "actionName": "create-case",
                            "actionType": "service",
                            "resultStates": [
                                "dismissed"
                            ]
                        }
                    ],
                    "conditions": [
                        {
                            "op": "le",
                            "left": "properties.meanMuleScore",
                            "right": 0.3,
                            "conditionType": "message"
                        }
                    ],
                    "description": "create case with status of dismissed based on the network alert",
                    "messageType": "process-alert-response"
                }
            ]
        },
        {
            "onState": "open",
            "routes": [
                {
                    "actions": [
                        {
                            "actionName": "link-cases",
                            "actionType": "service",
                            "linkCasesQuery": "case_status_name:[\"open\",\"pending\",\"review\"];tenant_key:<--$.tenantKey-->;case_type_name:<--$.caseTypeName-->;(event.prop.destID:<--$.seedEvent.eventJson.destID-->|event.prop.destID:<--$.seedEvent.eventJson.sourceID-->|event.prop.sourceID:<--$.seedEvent.eventJson.sourceID-->|event.prop.sourceID:<--$.seedEvent.eventJson.destID-->|event.prop.destID:[<--$.attachedEvents[*].eventJson.destID-->]|event.prop.destID:[<--$.attachedEvents[*].eventJson.sourceID-->]|event.prop.sourceID:[<--$.attachedEvents[*].eventJson.destID-->]|event.prop.sourceID:[<--$.attachedEvents[*].eventJson.sourceID-->])"
                        },
                        {
                            "actionName": "cms-attach-network-image",
                            "actionType": "service"
                        }
                    ],
                    "description": "Link case and download dispersion network image when case opened",
                    "messageType": "state-transition"
                }
            ]
        },
        {
            "onState": "pending",
            "routes": [
                {
                    "actions": [
                        {
                            "actionName": "change-status",
                            "actionType": "user",
                            "resultStates": [
                                "review",
                                "closed"
                            ]
                        },
                        {
                            "actionName": "link-cases",
                            "actionType": "service",
                            "linkCasesQuery": "case_status_name:[\"open\",\"pending\",\"review\"];tenant_key:<--$.tenantKey-->;case_type_name:<--$.caseTypeName-->;(prop.parentAlertID:<--$.properties.parentAlertID-->|prop.sourceTxnID:<--$.properties.sourceTxnID-->)"
                        },
                        {
                            "actionName": "cms-attach-network-image",
                            "actionType": "service"
                        }
                    ],
                    "description": "Link case and download dispersion network image when case pending",
                    "messageType": "state-transition"
                }
            ]
        },
        {
            "onState": "review",
            "routes": [
                {
                    "actions": [
                        {
                            "actionName": "change-status",
                            "actionType": "user",
                            "resultStates": [
                                "pending",
                                "closed",
                                "dismissed"
                            ]
                        }
                    ],
                    "description": "User action on case",
                    "messageType": "state-transition"
                }
            ]
        }
    ]
}

seed-default-config.sh

#!/bin/bash
curl -vX POST http://<HOST:PORT>/modules/default --header "Content-Type: application/json" --header "USERID: system" --header "ROLES: CMS_CONFIG_ADMIN" --header "TENANTKEY: MASTERCARD" -d @<config_filename.json>

Sample Configuration

{
    "alerts": {
        "table": {
            "defaultSort": [
                {
                    "id": "id",
                    "desc": true
                }
            ],
            "quickFilters": [
                {}
            ],
            "visibleColumns": [
                {
                    "key": "alertId",
                    "accessor": "id"
                },
                {
                    "key": "merchant",
                    "accessor": "seedEvent.eventJson.merchant"
                },
                {
                    "key": "caseTypeName",
                    "title": "Source Trace Type",
                    "accessor": "caseTypeName"
                },
                {
                    "key": "meanMuleScore",
                    "accessor": "properties.meanMuleScore"
                },
                {
                    "key": "alertTransDate",
                    "title": "Source Txn Date",
                    "accessor": "seedEvent.eventJson.transDate"
                },
                {
                    "key": "sourceValue",
                    "title": "Source Value",
                    "accessor": "properties.sourceValue"
                },
                {
                    "key": "networkValue",
                    "accessor": "properties.totalValue"
                },
                {
                    "key": "elapsedTime",
                    "accessor": "properties.elapsedTime"
                },
                {
                    "key": "generations",
                    "title": "Gens",
                    "accessor": "properties.generations"
                },
                {
                    "key": "networkID",
                    "accessor": "seedEvent.eventJson.networkID"
                }
            ]
        }
    },
    "shared": {
        "_accountIDToUse": "eventJson.accountID",
        "_apiValueMapping": {
            "feedback": {
                "title": "Feedback",
                "options": {
                    "": "Needs Feedback",
                    "actionedMule": "Actioned Mule",
                    "confirmedLegitimate": "Confirmed Legitimate"
                },
                "defaultText": "Add Feedback",
                "valuePresentText": "Provided"
            },
            "assessment": {
                "title": "Assessment",
                "options": {
                    "": "Not Resolved",
                    "fraudulent": "Fraudulent",
                    "notFraudulent": "Not Fraud"
                },
                "defaultText": "Not Resolved",
                "valuePresentText": "Resolved"
            },
            "accountAlert": {
                "title": "Account"
            },
            "transactionAlert": {
                "title": "Transaction"
            }
        },
        "_transactionIDToUse": "eventJson.txnID"
    },
    "mainNav": {
        "availableTabs": [
            {
                "route": "/cms/dashboard",
                "displayName": "Dashboard"
            },
            {
                "route": "/cms/core/cases",
                "displayName": "Cases"
            },
            {
                "route": "/cms/core/alerts",
                "displayName": "Alerts"
            },
            {
                "route": "/cms/aml",
                "displayName": "Trace Request"
            }
        ]
    },
    "caseTypes": [
        {
            "key": "aml",
            "title": "AML test"
        },
        {
            "key": "fraud",
            "title": "FRAUD"
        }
    ],
    "dashboard": {
        "availableDashlets": [
            {
                "label": "Summary Tile",
                "width": 2,
                "height": 2,
                "minWidth": 2,
                "minHeight": 2,
                "tooltip": "Display a total count for a selection and create a shortcut link",
                "description": "Display the total count for your summary type selection and create a shortcut link.",
                "chartType": "summary",
                "dashletId": "summaryTiles",
                "dashletType": "General Dashlets"
            },
            {
                "label": "Average Time To Close Cases",
                "width": 4,
                "height": 2,
                "tooltip": "Display the average time to close cases over a time frame",
                "description": "Display the average time to close all cases or build a chart showing the average time to close cases by the priority level set at the time the case closed.",
                "minWidth": 4,
                "chartType": "barHorizontal",
                "dashletId": "avgTimeToClose",
                "dashletType": "General Dashlets"
            },
            {
                "label": "Mule Score Distribution",
                "width": 6,
                "height": 4,
                "tooltip": "Chart showing the distribution of mule scores",
                "description": "Build a chart showing the distribution of mule scores over time.",
                "minWidth": 6,
                "chartType": "bar",
                "dashletId": "muleScoreDistribution",
                "dashletType": "AML Dashlets"
            },
            {
                "label": "Average Alert Statistics",
                "width": 4,
                "height": 3,
                "tooltip": "Display statistics for account and transaction alerts",
                "description": "Display average mule score, confirmed networks, and dwell time statistics for account and transaction alerts over a time frame.",
                "minWidth": 4,
                "chartType": "statistics",
                "dashletId": "avgAlertStatistics",
                "dashletType": "AML Dashlets"
            },
            {
                "label": "Case Age By Status",
                "width": 5,
                "height": 3,
                "tooltip": "Build a chart showing the number of your cases in a time frame for each of the selected statuses.",
                "minWidth": 5,
                "minHeight": 3,
                "chartType": "bar",
                "dashletId": "caseAgeByStatus",
                "dashletType": "General Dashlets"
            }
        ],
        "dashletDictionary": {
            "caseAgeByStatus": {
                "enableTitleBar": true,
                "singleQuery": {
                    "measures": [
                        "CaseAgeByStatus.count"
                    ],
                    "dimensions": [
                        "CaseAgeByStatus.caseStatusName"
                    ],
                    "filters": [
                        {
                            "values": [
                                "closed",
                                "open"
                            ],
                            "operator": "equals",
                            "dimension": "CaseAgeByStatus.caseStatusName"
                        },
                        {
                            "dimension": "CaseAgeByStatus.caseTypeName",
                            "operator": "equals",
                            "values": []
                        }
                    ],
                    "timeDimensions": [
                        {
                            "dimension": "CaseAgeByStatus.createdAt",
                            "compareDateRange": [],
                            "granularity": null
                        }
                    ],
                    "order": {
                        "CaseAgeByStatus.caseStatusName": "asc"
                    }
                },
                "settingsFields": [
                    {
                        "label": "Case Type",
                        "options": [
                            {
                                "label": "aml",
                                "value": "aml"
                            }
                        ],
                        "fieldName": "caseType",
                        "fieldType": "select",
                        "filterDimension": [
                            "CaseAgeByStatus.caseTypeName"
                        ]
                    },
                    {
                        "label": "Title",
                        "fieldName": "title",
                        "fieldType": "input"
                    },
                    {
                        "label": "Time Range (max 3)",
                        "fieldName": "timeRange",
                        "fieldType": "dateRanges",
                        "options": "dateRangesUnits",
                        "compareDateRange": true,
                        "timeDimension": "CaseAgeByStatus.createdAt"
                    },
                    {
                        "label": "Case Status",
                        "fieldName": "caseStatuses",
                        "fieldType": "serverSideSelect",
                        "apiEndpoint": "case-statuses",
                        "filterDimension": [
                            "CaseAgeByStatus.caseStatusName"
                        ]
                    }
                ]
            },
            "avgAlertStatistics": {
                "enableTitleBar": true,
                "enableTimeFrameSelector": true,
                "settingsFields": [
                    {
                        "label": "Title",
                        "fieldName": "title",
                        "fieldType": "input"
                    },
                    {
                        "label": "Default time frame",
                        "options": "timeFrames",
                        "fieldName": "defaultTimeFrame",
                        "fieldType": "select",
                        "timeDimension": [
                            "AvgAlertStats.createdAt"
                        ]
                    }
                ],
                "singleQuery": {
                    "measures": [
                        "AvgAlertStats.avgAMAccountMuleScore",
                        "AvgAlertStats.avgAMAccountConfirmedNetworks",
                        "AvgAlertStats.avgAMTransactionMuleScore",
                        "AvgAlertStats.avgAMTransactionConfirmedNetworks",
                        "AvgAlertStats.avgAMAccountDwellTime",
                        "AvgAlertStats.avgAMTransactionDwellTime",
                        "AvgAlertStats.avgLegitAccountMuleScore",
                        "AvgAlertStats.avgLegitAccountConfirmedNetworks",
                        "AvgAlertStats.avgLegitTransactionMuleScore",
                        "AvgAlertStats.avgLegitTransactionConfirmedNetworks",
                        "AvgAlertStats.avgLegitTransactionDwellTime",
                        "AvgAlertStats.avgLegitAccountDwellTime"
                    ],
                    "timeDimensions": [
                        {
                            "dimension": "AvgAlertStats.createdAt"
                        }
                    ],
                    "order": {},
                    "dimensions": [],
                    "filters": []
                }
            },
            "muleScoreDistribution": {
                "drillDownChartBucketSize": 0.02,
                "enableTitleBar": true,
                "enableTimeFrameSelector": true,
                "singleQuery": {
                    "measures": [
                        "MuleScoreDistribution.count"
                    ],
                    "timeDimensions": [
                        {
                            "dimension": "MuleScoreDistribution.createdAt"
                        }
                    ],
                    "order": {
                        "MuleScoreDistribution.muleScoreTier": "desc"
                    },
                    "dimensions": [
                        "MuleScoreDistribution.muleScoreTier"
                    ],
                    "filters": []
                },
                "settingsFields": [
                    {
                        "label": "Title",
                        "fieldName": "title",
                        "fieldType": "input"
                    },
                    {
                        "label": "Default time frame",
                        "options": "timeFrames",
                        "fieldName": "defaultTimeFrame",
                        "fieldType": "select",
                        "timeDimension": [
                            "MuleScoreDistribution.createdAt"
                        ]
                    }
                ]
            },
            "summaryTiles": {
                "queries": {
                    "newCases": {
                        "order": {},
                        "filters": [
                            {
                                "values": [],
                                "operator": "equals",
                                "dimension": "NewCases.caseType"
                            },
                            {
                                "values": [
                                    "$currentTenant"
                                ],
                                "operator": "equals",
                                "dimension": "NewCases.tenant"
                            }
                        ],
                        "measures": [
                            "NewCases.count"
                        ],
                        "timeDimensions": []
                    },
                    "openCases": {
                        "order": {},
                        "filters": [
                            {
                                "values": [],
                                "operator": "equals",
                                "dimension": "CmsCase.caseTypeName"
                            },
                            {
                                "values": [
                                    "closed",
                                    "alert",
                                    "dismissed"
                                ],
                                "operator": "notEquals",
                                "dimension": "CmsCase.caseStatusName"
                            },
                            {
                                "values": [
                                    "$currentUser"
                                ],
                                "operator": "equals",
                                "dimension": "CmsCase.assignee"
                            }
                        ],
                        "measures": [
                            "CmsCase.count"
                        ],
                        "timeDimensions": []
                    },
                    "updatedCases": {
                        "order": {},
                        "filters": [
                            {
                                "values": [],
                                "operator": "equals",
                                "dimension": "UpdatedCases.caseType"
                            },
                            {
                                "values": [
                                    "$currentUser"
                                ],
                                "operator": "equals",
                                "dimension": "UpdatedCases.assignee"
                            }
                        ],
                        "measures": [
                            "UpdatedCases.count"
                        ],
                        "timeDimensions": []
                    }
                },
                "settingsFields": [
                    {
                        "label": "Case Type",
                        "options": [
                            {
                                "label": "aml",
                                "value": "aml"
                            },
                            {
                                "label": "fraud",
                                "value": "fraud"
                            }
                        ],
                        "fieldName": "caseType",
                        "fieldType": "select",
                        "filterDimension": [
                            "CmsCase.caseTypeName",
                            "NewCases.caseType",
                            "UpdatedCases.caseType"
                        ]
                    },
                    {
                        "label": "Summary Type",
                        "options": [
                            {
                                "label": "My Open Cases",
                                "value": "openCases"
                            },
                            {
                                "label": "New Cases",
                                "value": "newCases"
                            },
                            {
                                "label": "My Updated Cases",
                                "value": "updatedCases"
                            }
                        ],
                        "fieldName": "queryType",
                        "fieldType": "select"
                    },
                    {
                        "label": "Title",
                        "fieldName": "title",
                        "fieldType": "input"
                    }
                ]
            },
            "avgTimeToClose": {
                "singleQuery": {
                    "order": {
                        "ClosedCases.priority_sort": "desc"
                    },
                    "filters": [
                        {
                            "values": [
                                "aml"
                            ],
                            "operator": "equals",
                            "dimension": "ClosedCases.caseType"
                        }
                    ],
                    "measures": [
                        "ClosedCases.averageTime"
                    ],
                    "dimensions": [
                        "ClosedCases.priority",
                        "ClosedCases.priority_sort"
                    ],
                    "timeDimensions": [
                        {
                            "dimension": "ClosedCases.closed"
                        }
                    ]
                },
                "enableTitleBar": true,
                "settingsFields": [
                    {
                        "label": "Case Type",
                        "options": [
                            {
                                "label": "aml",
                                "value": "aml"
                            },
                            {
                                "label": "fraud",
                                "value": "fraud"
                            }
                        ],
                        "fieldName": "caseType",
                        "fieldType": "select",
                        "filterDimension": [
                            "ClosedCases.caseType"
                        ]
                    },
                    {
                        "label": "Title",
                        "fieldName": "title",
                        "fieldType": "input"
                    },
                    {
                        "label": "Default time frame",
                        "options": "timeFrames",
                        "fieldName": "defaultTimeFrame",
                        "fieldType": "select",
                        "timeDimension": [
                            "ClosedCases.closed"
                        ]
                    }
                ],
                "enableTimeFrameSelector": true
            }
        },
        "commonFieldOptions": {
            "timeFrames": [
                {
                    "label": "Past week",
                    "value": "from 6 days ago to now"
                },
                {
                    "label": "Past 2 weeks",
                    "value": "from 13 days ago to now"
                },
                {
                    "label": "Past 30 days",
                    "value": "from 29 days ago to now"
                },
                {
                    "label": "Past 3 months",
                    "value": "from 89 days ago to now"
                },
                {
                    "label": "Past 6 months",
                    "value": "from 179 days ago to now"
                },
                {
                    "label": "Past year",
                    "value": "from 364 days ago to now"
                },
                {
                    "label": "Past 18 months",
                    "value": "from 540 days ago to now"
                }
            ],
            "dateRangesUnits": [
                {
                    "label": "Days",
                    "value": "days"
                },
                {
                    "label": "Weeks",
                    "value": "weeks"
                },
                {
                    "label": "Months",
                    "value": "months"
                },
                {
                    "label": "Years",
                    "value": "years"
                }
            ]
        }
    },
    "mapValues": {
        "users": {
            "mapTo": "userMappedId",
            "fields": [
                "assignee",
                "closedBy",
                "createdBy",
                "createdBy",
                "modifiedBy",
                "closedAssignee",
                "changedBy"
            ]
        }
    },
    "apiOptions": {
        "feedback": [
            {
                "title": "Needs Feedback",
                "apiValue": ""
            },
            {
                "title": "Confirmed Legitimate",
                "apiValue": "confirmedLegitimate"
            },
            {
                "title": "Actioned Mule",
                "apiValue": "actionedMule"
            }
        ]
    },
    "navigation": {},
    "traceRequest": {
        "traceRequestUpload": {
            "columns": [
                {
                    "key": "transactionId",
                    "title": "Transaction Id",
                    "fieldType": "string",
                    "acceptableHeaders": [
                        "txnId",
                        "test",
                        "transactionId",
                        "abc"
                    ]
                },
                {
                    "key": "traceType",
                    "title": "Trace Type",
                    "fieldType": "string",
                    "acceptableHeaders": [
                        "testing",
                        "traceType",
                        "Fraud",
                        "Scam",
                        "Other"
                    ]
                }
            ],
            "maxFileSize": 10000000,
            "fileTypeOptions": "csv, xls, xlsx"
        }
    },
    "caseManagement": {
        "caseList": {
            "openCases": {
                "table": {
                    "defaultSort": [
                        {
                            "id": "attributes.meanMuleScore",
                            "desc": true
                        }
                    ],
                    "quickFilters": [
                        {
                            "id": "Unassigned",
                            "options": {
                                "conditional": "eq",
                                "fieldToMatch": "assignee",
                                "valueToMatch": null
                            }
                        },
                        {
                            "id": "Assigned",
                            "options": {
                                "conditional": "neq",
                                "fieldToMatch": "assignee",
                                "valueToMatch": null
                            }
                        },
                        {
                            "id": "My Cases",
                            "options": {
                                "isDefault": true,
                                "conditional": "eq",
                                "fieldToMatch": "_original.assignee",
                                "valueToMatch": "currentUser"
                            }
                        }
                    ],
                    "defaultGroupBy": [
                        "id"
                    ],
                    "visibleColumns": [
                        {
                            "key": "lifeCycle",
                            "accessor": "attributes.lifeCycle",
                            "notFilterable": true
                        },
                        {
                            "key": "caseId",
                            "accessor": "id",
                            "visual": "link",
                            "visualOptions": {
                                "to": "/cases/$0"
                            }
                        },
                        {
                            "key": "amount",
                            "accessor": "seedEvent.eventJson.transAmount"
                        },
                        "createdAt",
                        "caseStatusName",
                        {
                            "key": "meanMuleScore",
                            "accessor": "properties.meanMuleScore"
                        },
                        {
                            "key": "transDate",
                            "title": "Source Trx Date",
                            "accessor": "seedEvent.eventJson.transDate"
                        },
                        {
                            "key": "sourceValue",
                            "accessor": "properties.sourceValue"
                        },
                        {
                            "key": "networkValue",
                            "accessor": "properties.totalValue"
                        },
                        {
                            "key": "elapsedTime",
                            "accessor": "attributes.elapsedTime"
                        },
                        {
                            "key": "dwellTime",
                            "accessor": "attributes.dwellTime"
                        },
                        {
                            "key": "generations",
                            "title": "Gens",
                            "accessor": "attributes.generations"
                        },
                        {
                            "key": "sourceTraceType",
                            "accessor": "caseTypeName"
                        },
                        "assignee",
                        {
                            "key": "netw",
                            "accessor": "netw"
                        }
                    ]
                }
            },
            "closedCases": {
                "table": {
                    "defaultSort": [
                        {
                            "id": "modifiedAt",
                            "desc": true
                        }
                    ],
                    "quickFilters": [
                        {
                            "id": "Last 30 Days",
                            "options": {
                                "dataType": "date",
                                "conditional": "gt",
                                "fieldToMatch": "modifiedAt",
                                "valueToMatch": -30
                            }
                        },
                        {
                            "id": "Last 90 Days",
                            "options": {
                                "dataType": "date",
                                "conditional": "gt",
                                "fieldToMatch": "modifiedAt",
                                "valueToMatch": -90
                            }
                        },
                        {
                            "id": "My Cases",
                            "options": {
                                "isDefault": true,
                                "conditional": "eq",
                                "fieldToMatch": "_original.assignee",
                                "valueToMatch": "currentUser"
                            }
                        }
                    ],
                    "visibleColumns": [
                        {
                            "key": "lifeCycle",
                            "accessor": "attributes.lifeCycle",
                            "notFilterable": true
                        },
                        {
                            "key": "caseId",
                            "accessor": "id"
                        },
                        "modifiedBy",
                        "modifiedAt",
                        {
                            "key": "meanMuleScore",
                            "accessor": "attributes.meanMuleScore"
                        },
                        {
                            "key": "sourceTraceType",
                            "accessor": "caseTypeName"
                        },
                        {
                            "key": "transDate",
                            "title": "Source Trx Date",
                            "accessor": "seedEvent.eventJson.transDate"
                        },
                        {
                            "key": "networkValue",
                            "accessor": "properties.totalValue"
                        },
                        {
                            "key": "sourceValue",
                            "accessor": "attributes.sourceValue"
                        },
                        {
                            "key": "elapsedTime",
                            "accessor": "attributes.elapsedTime"
                        },
                        {
                            "key": "generations",
                            "title": "Gens",
                            "accessor": "attributes.generations"
                        },
                        {
                            "key": "closedAssignee",
                            "accessor": "assignee"
                        },
                        {
                            "key": "netw",
                            "accessor": "netw"
                        },
                        {
                            "title": "Case Priority",
                            "visual": "priority",
                            "accessor": "casePriorityName",
                            "dataType": "text"
                        }
                    ]
                }
            }
        },
        "caseName": {
            "plural": "Cases",
            "singular": "Case"
        },
        "alertName": {
            "plural": "Alerts",
            "singular": "Alert"
        },
        "caseDetails": {
            "aml": {
                "tabs": [
                    {
                        "title": "Investigate",
                        "component": "investigate"
                    },
                    {
                        "title": "Case Activity",
                        "component": "activity"
                    },
                    {
                        "title": "Attached Files",
                        "component": "attachments"
                    }
                ],
                "summary": {
                    "orientation": "vertical",
                    "visibleColumns": [
                        {
                            "key": "networkCreationTime",
                            "accessor": "seedEvent.createdAt"
                        },
                        {
                            "key": "meanMuleScore",
                            "accessor": "properties.meanMuleScore"
                        },
                        {
                            "key": "sourceValue",
                            "accessor": "properties.sourceValue"
                        },
                        {
                            "key": "sourceTxnType",
                            "accessor": "properties.sourceTxnType"
                        },
                        {
                            "key": "networkValue",
                            "accessor": "properties.totalValue"
                        },
                        {
                            "key": "generations",
                            "accessor": "properties.generations"
                        },
                        {
                            "key": "elapsedTime",
                            "accessor": "properties.elapsedTime"
                        }
                    ]
                },
                "caseTitle": {
                    "prefix": "Case ID:",
                    "accessor": "id"
                },
                "taskNames": [
                    "Analyze dispersion network",
                    "Investigate own bank's suspicious account and transaction alerts",
                    "Investigate related cases",
                    "Submit feedback"
                ],
                "linkedCases": {
                    "table": {
                        "visibleColumns": [
                            {
                                "key": "caseId",
                                "accessor": "caseId"
                            },
                            {
                                "title": "Case Priority",
                                "visual": "priority",
                                "accessor": "casePriorityName",
                                "dataType": "text"
                            },
                            {
                                "key": "createdAt",
                                "title": "Case Created",
                                "visual": "date",
                                "accessor": "createdAt",
                                "dataType": "date"
                            },
                            {
                                "title": "Last Modified",
                                "visual": "date",
                                "accessor": "modifiedAt",
                                "dataType": "date"
                            },
                            {
                                "key": "caseStatusName",
                                "accessor": "caseStatusName"
                            },
                            {
                                "key": "caseResolutionName",
                                "accessor": "caseResolutionName"
                            },
                            "assignee",
                            {
                                "key": "accounts",
                                "title": "Account ID",
                                "accessor": "accounts",
                                "dataType": "text"
                            }
                        ]
                    },
                    "keyMap": {
                        "accounts": [
                            "destID",
                            "sourceID"
                        ]
                    },
                    "linkOn": "accounts",
                    "splitView": {
                        "summary": {
                            "visibleColumns": [
                                {
                                    "title": "Case Created",
                                    "visual": "date",
                                    "accessor": "createdAt"
                                },
                                {
                                    "title": "Status",
                                    "accessor": "caseStatusName"
                                },
                                {
                                    "title": "Case Modified",
                                    "visual": "date",
                                    "accessor": "modifiedAt"
                                },
                                {
                                    "title": "Assignee",
                                    "accessor": "assignee"
                                }
                            ]
                        },
                        "additionalDetails": {
                            "type": "accounts",
                            "additionalInfo": {
                                "visibleColumns": [
                                    "txnTime",
                                    {
                                        "title": "Transaction ID",
                                        "accessor": "id",
                                        "truncate": true
                                    },
                                    "value",
                                    "generation",
                                    "muleScore",
                                    "feedback"
                                ]
                            },
                            "visibleColumns": [
                                "muleScore",
                                "generation"
                            ]
                        }
                    },
                    "defaultGroupBy": [
                        "accounts"
                    ]
                },
                "statusNames": [
                    "pending",
                    "review"
                ],
                "accountDetails": {
                    "event": [
                        "sourceBankID",
                        "destBankID",
                        "sourceBankName",
                        "destBankName",
                        "sourceID",
                        "destID",
                        "mostRecentFeedback",
                        "decisionDate"
                    ],
                    "operation": "arrayIncludes",
                    "dataToRender": [
                        {
                            "fieldToMatch": "_event.sourceID",
                            "defaultColumns": [
                                {
                                    "title": "Source Acct ID",
                                    "accessor": "_event.sourceID",
                                    "truncate": true
                                },
                                {
                                    "key": "sourceBankName",
                                    "accessor": "_event.sourceBankName"
                                },
                                {
                                    "key": "sourceBankID",
                                    "accessor": "_event.sourceBankID"
                                },
                                "muleScore",
                                "dwellTime"
                            ],
                            "conditionalColumns": {
                                "operation": "arrayIncludes",
                                "fieldToMatch": "_user.bankIds",
                                "valueToMatch": "_event.sourceBankID",
                                "matchedColumns": [
                                    "myFeedback",
                                    "priorFeedback",
                                    "name",
                                    "networkAlertID",
                                    "networkGenerations",
                                    "numNetworks"
                                ]
                            }
                        },
                        {
                            "fieldToMatch": "_event.destID",
                            "defaultColumns": [
                                {
                                    "title": "Dest Acct ID",
                                    "accessor": "_event.destID",
                                    "truncate": true
                                },
                                {
                                    "key": "destBankName",
                                    "accessor": "_event.destBankName"
                                },
                                {
                                    "key": "destBankID",
                                    "accessor": "_event.destBankID"
                                }
                            ],
                            "conditionalColumns": {
                                "operation": "arrayIncludes",
                                "fieldToMatch": "_user.bankIds",
                                "valueToMatch": "_event.destBankID",
                                "matchedColumns": [
                                    "myFeedback",
                                    "priorFeedback",
                                    "name",
                                    "dwellTime",
                                    "muleScore",
                                    "networkAlertID",
                                    "networkGenerations",
                                    "numNetworks"
                                ]
                            }
                        }
                    ],
                    "valueToMatch": "eventJson.accountID",
                    "fieldsToMatch": [
                        "_event.sourceID",
                        "_event.destID"
                    ],
                    "showLinkedMsg": true,
                    "attachedEventType": "account"
                },
                "linkedCasesSort": {
                    "defaultSort": [
                        {
                            "id": "id",
                            "desc": false
                        }
                    ]
                },
                "transactionSort": {
                    "defaultSort": [
                        {
                            "id": "transDate",
                            "desc": true
                        }
                    ]
                },
                "closeRequirements": {
                    "task": {
                        "plural": {
                            "prefix": " complete ",
                            "postfix": " required tasks"
                        },
                        "singular": {
                            "prefix": " complete ",
                            "postfix": " required task"
                        }
                    },
                    "feedback": {
                        "plural": {
                            "prefix": "provide feedback for "
                        },
                        "singular": {
                            "prefix": "provide feedback for "
                        },
                        "eventProperty": "eventAttributes.feedback.feedback",
                        "eventTypesToCheck": [
                            {
                                "type": "transaction",
                                "plural": "transactions",
                                "singular": "transaction"
                            },
                            {
                                "type": "account",
                                "plural": "accounts",
                                "singular": "account"
                            }
                        ]
                    },
                    "feedbackAccounts": true,
                    "feedbackTransactions": true
                },
                "dispersionNetwork": {
                    "summary": [
                        {
                            "key": "networkID",
                            "accessor": "properties.networkID"
                        },
                        {
                            "key": "lastAlertAdded",
                            "accessor": "properties.time"
                        },
                        {
                            "key": "meanDwellTime",
                            "accessor": "properties.meanDwellTime"
                        },
                        {
                            "key": "uniqueAccounts",
                            "accessor": "properties.uniqueAccounts"
                        },
                        {
                            "key": "numConfirmedMules",
                            "accessor": "properties.numConfirmedMules"
                        },
                        {
                            "key": "sourceTxnID",
                            "accessor": "properties.foo"
                        },
                        {
                            "key": "length",
                            "accessor": "properties.length"
                        },
                        {
                            "key": "medianDwellTime",
                            "accessor": "properties.medianDwellTime"
                        },
                        {
                            "key": "numNotInvestigated",
                            "accessor": "properties.numNotInvestigated"
                        },
                        {
                            "key": "numLegitimate",
                            "accessor": "properties.numLegitimate"
                        }
                    ]
                },
                "investigateSubtabs": [
                    {
                        "key": "transactions",
                        "title": "Trace Transactions"
                    },
                    "linkedCases"
                ],
                "transactionColumns": {
                    "fields": [
                        "destBankID",
                        "sourceBankID",
                        "mostRecentFeedback",
                        "decisionDate"
                    ],
                    "visibleColumns": [
                        {
                            "key": "networkID",
                            "accessor": "networkID"
                        },
                        "networkAlertID",
                        {
                            "key": "accountAlertID",
                            "accessor": "id"
                        },
                        "txnID",
                        "transDate",
                        "generation",
                        "value",
                        {
                            "key": "muleScore",
                            "title": "Mule Score",
                            "accessor": "muleScore"
                        },
                        "sourceID",
                        "destID",
                        "dwellTime",
                        "sourceBankName",
                        "destBankName",
                        "remitInfo",
                        "feedback"
                    ]
                },
                "transactionDetails": {
                    "summary": {
                        "show": [
                            "myFeedback",
                            "priorFeedback",
                            "txnID"
                        ],
                        "fields": [
                            "mostRecentFeedback",
                            "decisionDate"
                        ]
                    },
                    "showAccounts": true,
                    "splitViewHeaderTitle": "Transaction Details",
                    "showAdditionalDetails": false
                },
                "transactionTableTitle": "Traced Transactions",
                "transactionQuickFilters": {
                    "myBank": {
                        "logic": "",
                        "title": "My Bank"
                    }
                },
                "linkedCasesSplitViewContent": {
                    "visibleFields": [
                        {
                            "title": "Status",
                            "accessor": "caseStatusName"
                        },
                        {
                            "title": "Case Created",
                            "visual": "date",
                            "accessor": "createdAt"
                        },
                        {
                            "title": "Case Modified",
                            "visual": "date",
                            "accessor": "modifiedAt"
                        },
                        {
                            "title": "Assignee",
                            "accessor": "assignee"
                        }
                    ]
                },
                "transactionTableQuickFilters": [
                    {
                        "id": "My Bank",
                        "options": {
                            "conditional": "arrayIncludes",
                            "fieldToMatch": [
                                "destBankID",
                                "sourceBankID"
                            ],
                            "valueToMatch": "myBankId"
                        }
                    },
                    {
                        "id": "Needs Feedback",
                        "options": {
                            "conditional": "eq",
                            "fieldToMatch": "feedback",
                            "valueToMatch": "_apiValueMapping.feedback.defaultText"
                        }
                    }
                ],
                "transactionTableDataOverrides": [
                    "destBankName",
                    "sourceBankName"
                ],
                "linkedCasesSplitViewAdditionalDetails": {}
            },
            "fraud": {
                "summary": {
                    "orientation": "horizontal",
                    "visibleColumns": [
                        "caseTypeName",
                        {
                            "key": "createdAt",
                            "accessor": "seedEvent.createdAt"
                        },
                        {
                            "key": "meanMuleScore",
                            "accessor": "properties.meanMuleScore"
                        },
                        {
                            "key": "customer",
                            "accessor": "seedEvent.eventJson.customer"
                        },
                        {
                            "key": "amount",
                            "accessor": "seedEvent.eventJson.transAmount"
                        },
                        "modifiedAt",
                        {
                            "key": "elapsedTime",
                            "accessor": "properties.elapsedTime"
                        }
                    ]
                },
                "caseTitle": {
                    "prefix": "Case:",
                    "accessor": "id"
                },
                "taskNames": [
                    "Contact Customer",
                    "Search Merchant Transactions"
                ],
                "linkedCases": {
                    "table": {
                        "visibleColumns": [
                            {
                                "key": "caseId",
                                "accessor": "id"
                            },
                            {
                                "title": "Priority",
                                "visual": "priority",
                                "accessor": "casePriorityName",
                                "dataType": "string"
                            },
                            {
                                "key": "createdAt",
                                "accessor": "seedEvent.createdAt",
                                "dataType": "datetime"
                            },
                            "assignee"
                        ]
                    },
                    "keyMap": {},
                    "linkOn": "",
                    "splitView": {
                        "summary": {
                            "visibleColumns": [
                                {
                                    "title": "Case Created",
                                    "visual": "date",
                                    "accessor": "createdAt"
                                },
                                {
                                    "title": "Status",
                                    "accessor": "caseStatusName"
                                },
                                {
                                    "title": "Case Modified",
                                    "visual": "date",
                                    "accessor": "modifiedAt"
                                },
                                {
                                    "title": "Assignee",
                                    "accessor": "assignee"
                                }
                            ]
                        },
                        "additionalDetails": {
                            "type": "moreInfo",
                            "title": "Information for Commonality",
                            "visibleColumns": [
                                {
                                    "title": "Status",
                                    "accessor": "caseStatusName"
                                },
                                {
                                    "title": "Case Created",
                                    "visual": "date",
                                    "accessor": "createdAt"
                                },
                                {
                                    "title": "Case Modified",
                                    "visual": "date",
                                    "accessor": "modifiedAt"
                                },
                                {
                                    "title": "Assignee",
                                    "accessor": "assignee"
                                }
                            ]
                        }
                    },
                    "defaultGroupBy": []
                },
                "statusNames": [
                    "in process",
                    "waiting for documents"
                ],
                "linkedCasesSort": {
                    "defaultSort": [
                        {
                            "id": "id",
                            "desc": true
                        },
                        {
                            "id": "seedEvent.createdAt",
                            "desc": false
                        }
                    ]
                },
                "transactionSort": {
                    "defaultSort": [
                        {
                            "id": "transId",
                            "desc": false
                        },
                        {
                            "id": "score",
                            "desc": true
                        }
                    ]
                },
                "closeRequirements": {
                    "task": {
                        "plural": {
                            "prefix": " complete ",
                            "postfix": " required tasks"
                        },
                        "singular": {
                            "prefix": " complete ",
                            "postfix": " required task"
                        }
                    },
                    "assessment": {
                        "plural": {
                            "prefix": "assess"
                        },
                        "singular": {
                            "prefix": "assess "
                        },
                        "eventProperty": "eventAttributes.assessment.assessment",
                        "eventTypesToCheck": [
                            {
                                "type": "transaction",
                                "plural": "assessments",
                                "singular": "assessment"
                            }
                        ]
                    },
                    "assessmentTransactions": true
                },
                "investigateSubtabs": [
                    {
                        "key": "transactions",
                        "title": "TRANSACTIONS"
                    },
                    "linkedCases"
                ],
                "linkedCasesColumns": {
                    "visibleColumns": [
                        {
                            "key": "caseId",
                            "accessor": "id"
                        },
                        {
                            "title": "Priority",
                            "visual": "priority",
                            "accessor": "casePriorityName",
                            "dataType": "string"
                        },
                        {
                            "key": "createdAt",
                            "accessor": "seedEvent.createdAt",
                            "dataType": "datetime"
                        },
                        "assignee"
                    ]
                },
                "transactionColumns": {
                    "fields": [
                        "destBankID",
                        "sourceBankID"
                    ],
                    "visibleColumns": [
                        "sourceID",
                        "score",
                        "destID",
                        "dwellTime",
                        "sourceBankName",
                        "destBankName",
                        "assessment"
                    ]
                },
                "transactionDetails": {
                    "summary": {
                        "show": [
                            "transDate",
                            {
                                "key": "merchant",
                                "title": "Test Merchant Title"
                            },
                            {
                                "key": "customer",
                                "title": "customer"
                            },
                            "transAmount"
                        ]
                    },
                    "showAccounts": true,
                    "showAdditionalDetails": true
                },
                "transactionTableTitle": "Transactions",
                "transactionQuickFilters": {
                    "myBank": {
                        "logic": "",
                        "title": "My Bank"
                    }
                },
                "linkedCasesSplitViewContent": {
                    "visibleFields": [
                        {
                            "title": "Status",
                            "accessor": "caseStatusName"
                        },
                        {
                            "title": "Case Created",
                            "visual": "date",
                            "accessor": "createdAt"
                        },
                        {
                            "title": "Case Modified",
                            "visual": "date",
                            "accessor": "modifiedAt"
                        },
                        {
                            "title": "Assignee",
                            "accessor": "assignee"
                        }
                    ]
                },
                "transactionTableQuickFilters": [
                    {
                        "id": "Needs Assessment",
                        "options": {
                            "conditional": "eq",
                            "fieldToMatch": "assessment",
                            "valueToMatch": "_apiValueMapping.assessment.defaultText"
                        }
                    }
                ],
                "linkedCasesSplitViewAdditionalDetails": {
                    "title": "Information for Commonality",
                    "visibleFields": [
                        {
                            "title": "Status",
                            "accessor": "caseStatusName"
                        },
                        {
                            "title": "Case Created",
                            "visual": "date",
                            "accessor": "createdAt"
                        },
                        {
                            "title": "Case Modified",
                            "visual": "date",
                            "accessor": "modifiedAt"
                        },
                        {
                            "title": "Assignee",
                            "accessor": "assignee"
                        }
                    ]
                }
            }
        },
        "columnDictionary": {
            "netw": {
                "title": "Network ID",
                "accessor": "netw",
                "dataType": "number"
            },
            "score": {
                "title": "Mule Score",
                "visual": "progressbar",
                "accessor": "score",
                "dataType": "number",
                "visualOptions": {
                    "midRangeMax": 0.8,
                    "midRangeMin": 0.2
                }
            },
            "txnID": {
                "title": "Tran #",
                "accessor": "txnID",
                "truncate": true
            },
            "value": {
                "title": "Amount (NZD)",
                "visual": "currency",
                "accessor": "value",
                "dataType": "number"
            },
            "amount": {
                "title": "Amount",
                "visual": "currency",
                "accessor": "amount",
                "dataType": "number"
            },
            "caseId": {
                "title": "Case ID",
                "dataType": "number"
            },
            "destID": {
                "title": "Dest Account",
                "dataType": "text",
                "truncate": true
            },
            "length": {
                "title": "Length",
                "dataType": "number"
            },
            "status": {
                "title": "Status"
            },
            "alertId": {
                "title": "Alert ID",
                "dataType": "number"
            },
            "transId": {
                "title": "Tran #",
                "accessor": "txnID",
                "truncate": true
            },
            "txnTime": {
                "title": "Transaction Time",
                "visual": "datetime",
                "dataType": "datetime"
            },
            "assignee": {
                "title": "Assigned To",
                "dataType": "username",
                "maxWidth": 220
            },
            "caseType": {
                "title": "Case Type"
            },
            "closedBy": {
                "title": "Closed By",
                "dataType": "username",
                "maxWidth": 220
            },
            "customer": {
                "title": "Customer"
            },
            "feedback": {
                "title": "Overall Feedback",
                "visual": "feedback",
                "accessor": "feedback",
                "dataType": "text",
                "maxWidth": 135,
                "minWidth": 135,
                "visualOptions": {
                    "options": [
                        {
                            "key": "txnID",
                            "date": "decisionDate",
                            "label": "Feedback",
                            "title": "Transaction ID",
                            "options": [
                                "",
                                "actionedMule",
                                "confirmedLegitimate"
                            ],
                            "alertType": "transactionAlert",
                            "alwaysInclude": true,
                            "feedbackSearchKey": "txnID",
                            "selectedOptionKey": "feedback",
                            "selectedOptionConfig": {
                                "title": "eventAttributes.feedback.selectedTitle",
                                "value": "eventAttributes.feedback.feedback"
                            }
                        },
                        {
                            "key": "sourceID",
                            "date": "decisionDate",
                            "label": "Feedback",
                            "title": "Source Account",
                            "options": [
                                "",
                                "actionedMule",
                                "confirmedLegitimate"
                            ],
                            "alertType": "accountAlert",
                            "contextKey": "sourceBankID",
                            "feedbackSearchKey": "accountID",
                            "selectedOptionConfig": {
                                "title": "eventAttributes.feedback.selectedTitle",
                                "value": "eventAttributes.feedback.feedback"
                            }
                        },
                        {
                            "key": "destID",
                            "date": "decisionDate",
                            "label": "Feedback",
                            "title": "Destination Account",
                            "options": [
                                "",
                                "actionedMule",
                                "confirmedLegitimate"
                            ],
                            "alertType": "accountAlert",
                            "contextKey": "destBankID",
                            "feedbackSearchKey": "accountID",
                            "selectedOptionConfig": {
                                "title": "eventAttributes.feedback.selectedTitle",
                                "value": "eventAttributes.feedback.feedback"
                            }
                        }
                    ],
                    "targetAccessor": [
                        "destBankID",
                        "sourceBankID"
                    ],
                    "contextAccessor": "user.bankIds",
                    "apiValueMappingKey": "_apiValueMapping.feedback.options",
                    "readOnlyValueToMatch": "closed",
                    "readOnlyContextAccessor": "case.caseStatusName"
                },
                "stickyPosition": "right",
                "unstickWhenExpanded": true
            },
            "merchant": {
                "title": "Merchant",
                "dataType": "text"
            },
            "sourceID": {
                "title": "Source Account",
                "accessor": "sourceID",
                "dataType": "text",
                "maxWidth": 200,
                "minWidth": 200,
                "truncate": true
            },
            "accountID": {
                "title": "Account ID",
                "dataType": "text",
                "truncate": true
            },
            "changedBy": {
                "title": "Changed By",
                "dataType": "username",
                "maxWidth": 220
            },
            "createdAt": {
                "title": "Date Created",
                "visual": "datetime",
                "dataType": "datetime"
            },
            "createdBy": {
                "title": "Created By",
                "dataType": "username",
                "maxWidth": 220
            },
            "dwellTime": {
                "title": "Dwell Time",
                "visual": "duration",
                "accessor": "dwellTime",
                "dataType": "duration",
                "maxWidth": 150,
                "minWidth": 150,
                "visualOptions": {
                    "midRangeMax": "PT14H11M",
                    "midRangeMin": "PT34M"
                }
            },
            "lifeCycle": {
                "title": "New",
                "visual": "lifecycle",
                "maxWidth": 88,
                "minWidth": 88
            },
            "modelName": {
                "title": "Model Name"
            },
            "muleScore": {
                "title": "Mule Score",
                "visual": "progressbar",
                "dataType": "number",
                "visualOptions": {
                    "midRangeMax": 0.8,
                    "midRangeMin": 0.2
                }
            },
            "networkID": {
                "title": "Network ID",
                "dataType": "text",
                "truncate": true
            },
            "remitInfo": {
                "title": "Reference"
            },
            "transDate": {
                "title": "Transaction Date",
                "visual": "datetime",
                "accessor": "transDate",
                "dataType": "datetime",
                "maxWidth": 180,
                "minWidth": 180
            },
            "assessment": {
                "title": "Assessment",
                "visual": "assessment",
                "accessor": "assessment",
                "dataType": "text",
                "maxWidth": 150,
                "minWidth": 150,
                "visualOptions": {
                    "options": [
                        {
                            "key": "eventID",
                            "label": "Assessment",
                            "title": "Transaction #",
                            "options": [
                                "",
                                "notFraudulent",
                                "fraudulent"
                            ],
                            "alertType": "transactionAlert",
                            "alwaysInclude": true,
                            "selectedOptionConfig": {
                                "title": "eventAttributes.assessment.selectedTitle",
                                "value": "eventAttributes.assessment.assessment"
                            }
                        }
                    ],
                    "apiValueMappingKey": "_apiValueMapping.assessment.options",
                    "readOnlyValueToMatch": "closed",
                    "readOnlyContextAccessor": "case.caseStatusName"
                },
                "stickyPosition": "right",
                "unstickWhenExpanded": true
            },
            "confidence": {
                "title": "Confidence"
            },
            "destBankID": {
                "title": "Dest Bank ID",
                "truncate": true
            },
            "generation": {
                "title": "Gen",
                "visual": "number",
                "dataType": "number"
            },
            "modifiedAt": {
                "title": "Date Closed",
                "visual": "datetime",
                "dataType": "datetime"
            },
            "modifiedBy": {
                "title": "Closed By",
                "dataType": "username"
            },
            "myFeedback": {
                "title": "My Feedback",
                "visual": "concatString",
                "maxWidth": 200,
                "minWidth": 200,
                "visualOptions": {
                    "concatChar": " on ",
                    "concatPaths": [
                        "eventAttributes.feedback.feedback",
                        {
                            "path": "eventAttributes.feedback.decisionDate",
                            "type": "date"
                        }
                    ],
                    "concatFallback": "Needs Feedback",
                    "apiValueMappingKey": "_apiValueMapping.feedback.options",
                    "renderTwoDashesIfColumnNull": "feedback"
                }
            },
            "prediction": {
                "title": "Prediction"
            },
            "totalValue": {
                "title": "Total Network Value",
                "visual": "number"
            },
            "elapsedTime": {
                "title": "Elapsed Time",
                "visual": "duration",
                "dataType": "duration",
                "maxWidth": 150,
                "minWidth": 150,
                "visualOptions": {
                    "midRangeMax": "P9DT10H44M",
                    "midRangeMin": "P1DT1H7M"
                }
            },
            "generations": {
                "title": "Network Generations",
                "dataType": "number",
                "maxWidth": 70,
                "minWidth": 70
            },
            "linkedCases": {
                "title": "Linked Cases"
            },
            "sourceTxnID": {
                "title": "Source Trx ID"
            },
            "sourceValue": {
                "title": "Src Value (NZD)",
                "visual": "currency",
                "dataType": "number",
                "visualOptions": {
                    "conversionRate": 0.1
                }
            },
            "transAmount": {
                "title": "Amount (NZD)",
                "visual": "currency",
                "dataType": "number",
                "visualOptions": {
                    "conversionRate": 0.1
                }
            },
            "caseTypeName": {
                "title": "Case Type",
                "dataType": "text"
            },
            "destBankName": {
                "title": "Dest Bank",
                "dataType": "text",
                "truncate": true,
                "visualOptions": {
                    "boldMapping": {
                        "valueToMatch": "destBankID",
                        "contextAccessor": "_context.user.bankIds"
                    }
                }
            },
            "networkValue": {
                "title": "Network Value (NZD)",
                "visual": "currency",
                "dataType": "number",
                "visualOptions": {
                    "conversionRate": 0.01
                }
            },
            "sourceBankID": {
                "title": "Source Bank ID",
                "dataType": "text",
                "truncate": true
            },
            "meanDwellTime": {
                "title": "Mean Dwell Time",
                "visual": "duration",
                "dataType": "duration",
                "maxWidth": 150,
                "minWidth": 150
            },
            "meanMuleScore": {
                "title": "Mean Mule Score",
                "visual": "progressbar",
                "dataType": "number",
                "visualOptions": {
                    "midRangeMax": 0.7,
                    "midRangeMin": 0.4
                }
            },
            "networkLength": {
                "title": "Network Length"
            },
            "numLegitimate": {
                "title": "Confirmed Legitimate"
            },
            "priorFeedback": {
                "title": "Prior Feedback",
                "visual": "concatString",
                "maxWidth": 200,
                "minWidth": 200,
                "visualOptions": {
                    "concatChar": " on ",
                    "concatPaths": [
                        "mostRecentFeedback",
                        {
                            "path": "decisionDate",
                            "type": "date"
                        }
                    ],
                    "targetAccessor": [
                        "destBankID",
                        "sourceBankID"
                    ],
                    "contextAccessor": "_user.bankIds",
                    "apiValueMappingKey": "_apiValueMapping.feedback.options"
                }
            },
            "sourceTxnType": {
                "title": "Source Trace Type"
            },
            "accountAlertID": {
                "title": "Account Alert ID",
                "dataType": "text",
                "truncate": true
            },
            "alertTransDate": {
                "title": "Transaction Date",
                "visual": "datetime",
                "dataType": "datetime"
            },
            "caseStatusName": {
                "title": "Case Status",
                "dataType": "text"
            },
            "closedAssignee": {
                "title": "Last Assigned To",
                "dataType": "username"
            },
            "lastAlertAdded": {
                "title": "Last Alert",
                "visual": "datetime"
            },
            "networkAlertID": {
                "title": "Network Alert ID",
                "dataType": "text",
                "truncate": true
            },
            "sourceBankName": {
                "title": "Source Bank",
                "visualOptions": {
                    "boldMapping": {
                        "valueToMatch": "sourceBankID",
                        "contextAccessor": "_context.user.bankIds"
                    }
                }
            },
            "traceRequested": {
                "title": "Trace Rqsted"
            },
            "uniqueAccounts": {
                "title": "Unique Accounts in Ntwk"
            },
            "medianDwellTime": {
                "title": "Median Dwell Time",
                "visual": "duration",
                "dataType": "duration",
                "maxWidth": 150,
                "minWidth": 150
            },
            "sourceTraceType": {
                "title": "Source Trace Type",
                "visual": "casetype",
                "dataType": "text"
            },
            "alertTransAmount": {
                "title": "Transaction Amount"
            },
            "numConfirmedMules": {
                "title": "Confirmed Mule"
            },
            "caseResolutionName": {
                "title": "Resolution"
            },
            "numNotInvestigated": {
                "title": "Not Investigated"
            },
            "networkCreationTime": {
                "title": "Network Creation Time",
                "visual": "datetime"
            }
        },
        "visualDictionary": {
            "date": {
                "format": "yyyy/MMM/dd"
            },
            "number": {
                "fixed": 2,
                "decimals": true,
                "thousandSeparators": true
            },
            "currency": {
                "fixed": 2,
                "decimals": true,
                "conversionRate": 0.1
            },
            "datetime": {
                "format": "MM/dd/yyyy hh:mm:ss"
            }
        }
    }
}
← Application SummaryFrontend Deployment →
  • Retrieve Docker Images from ECR
  • Deploy Containers
  • Post-Deployment Instructions
  • pull-from-ecrsh
  • docker-compose.yml
  • seed-case-api-db.sql
  • seed-mock-data.sh
    • Mock Data
  • create-sample-workflow.sh
    • Sample Workflow
  • seed-default-config.sh
    • Sample Configuration
Deployment Documentation
Docs
Getting Started (or other categories)Guides (or other categories)API Reference (or other categories)
Copyright © 2023 Brighterion