You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ju...@apache.org on 2019/11/22 13:07:24 UTC

[fineract-cn-docker-compose] branch master updated (ecb02ef -> c1abb59)

This is an automated email from the ASF dual-hosted git repository.

juhan pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git.


    from ecb02ef  Merge pull request #15 from aasaru/typo_fixes
     new e3efc96  updated tests
     new 2966e86  improve readme
     new c1abb59  Merge pull request #16 from aasaru/call_postman_scripts_from_integration_test

The 44 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 README.md                                          |    6 +
 integration_test.sh                                |   11 +-
 ...Initial-Requests_PART1.postman_collection.json} | 3797 ++++----------------
 3 files changed, 754 insertions(+), 3060 deletions(-)
 copy postman_scripts/{Fineract-Cn-Initial-Requests.postman_collection.json => Fineract-CN-Initial-Requests_PART1.postman_collection.json} (57%)


[fineract-cn-docker-compose] 21/44: Update README and docker-compose scripts for docker swarm deployment

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit ecad80845258463b5842779e3ac6e28637ece440
Author: Anh3h <co...@gmail.com>
AuthorDate: Tue Oct 1 17:42:48 2019 -0400

    Update README and docker-compose scripts for docker swarm deployment
---
 README.md                         |  4 +-
 docker-compose.yml                | 78 ++++++++++++++++++++++++++++++++++++++-
 external_tools/docker-compose.yml | 16 ++++++--
 3 files changed, 92 insertions(+), 6 deletions(-)

diff --git a/README.md b/README.md
index 847739e..775501d 100644
--- a/README.md
+++ b/README.md
@@ -98,7 +98,7 @@ The first request will retrieve a token. The response should look like this, wit
 ```
 
 If you don't get a token there is something wrong with your setup. The token is necessary for authentication in other requests thus be sure that this steps works.
-Important: Be sure to execute the requests in the right order! 
+Important: Be sure to execute the requests in the right order!
 The outcome is often stored in variables - check the Tests section of the requests.
 
 Use the Postman Runner to import accounts in step 08.1.
@@ -168,6 +168,8 @@ docker volume rm external_tools_postgres-volume
 docker-compose up
 ```
 
+## Note:
+**These scripts are ideal for a docker swarm deployment environment. If you are to deploy Fineract CN using Docker swarm you will have remove the network configuration from the docker-compose script and implement a load balancer (using docker swarm) that reflects the network configuratioin you just removed from the compose file.**
 
 ## TODO
 
diff --git a/docker-compose.yml b/docker-compose.yml
index a1e4bb5..750907e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -26,7 +26,7 @@ services:
     deploy:
       replicas: 1
       restart_policy:
-        condition: any
+        condition: on-failure
         delay: 10s
         max_attempts: 3
     networks:
@@ -54,7 +54,7 @@ services:
     deploy:
       replicas: 1
       restart_policy:
-        condition: any
+        condition: on-failure
         delay: 10s
         max_attempts: 3
     networks:
@@ -82,6 +82,8 @@ services:
       replicas: 1
       restart_policy:
         condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -104,6 +106,12 @@ services:
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
       system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
       system.privateKey.modulus: ${PRIVATE_KEY_MODULUS}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -124,6 +132,12 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -144,6 +158,12 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -166,6 +186,12 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -186,6 +212,12 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -206,6 +238,12 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -226,6 +264,12 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -246,6 +290,12 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -266,6 +316,12 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -286,6 +342,12 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -306,6 +368,12 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
@@ -315,6 +383,12 @@ services:
     image: apache/fineract-cn-fims-web-app:latest
     ports:
       - "8888:8888"
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     networks:
       external_tools_default:
       fineract:
diff --git a/external_tools/docker-compose.yml b/external_tools/docker-compose.yml
index 010666d..67e2579 100644
--- a/external_tools/docker-compose.yml
+++ b/external_tools/docker-compose.yml
@@ -16,7 +16,7 @@ services:
     deploy:
       replicas: 1
       restart_policy:
-        condition: any
+        condition: on-failure
         delay: 10s
         max_attempts: 3
 
@@ -32,7 +32,7 @@ services:
     deploy:
       replicas: 1
       restart_policy:
-        condition: any
+        condition: on-failure
         delay: 10s
         max_attempts: 3
 
@@ -48,6 +48,16 @@ services:
       POSTGRES_PASSWORD: postgres
     ports:
       - "5432:5432"
+    healthcheck:
+      test: ["CMD-SHELL", "pg_isready -U postgres"]
+      interval: 1m
+      retries: 5
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 10s
+        max_attempts: 3
     volumes:
       - postgres-volume:/var/lib/postgresql/data
 
@@ -63,7 +73,7 @@ services:
     deploy:
       replicas: 1
       restart_policy:
-        condition: any
+        condition: on-failure
         delay: 10s
         max_attempts: 3
     volumes:


[fineract-cn-docker-compose] 14/44: FINCN-176 switch to apache image

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 455dcaad20d8bb07f9f009ed8a7cd3a0158a4897
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Sat Sep 14 08:03:14 2019 +0300

    FINCN-176 switch to apache image
---
 docker-compose.yml | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index 5750bcf..6726371 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -286,8 +286,7 @@ services:
         ipv4_address: ${GROUP_IP}
 
   notifications-ms:
-    #image: apache/fineract-cn-notifications:latest # TODO uncomment after https://github.com/apache/fineract-cn-notifications/pull/18 has been merged
-    image: aasaru/fineract-cn-notifications:latest # remove after uncommenting
+    image: apache/fineract-cn-notifications:latest
     ports:
      - "2033:2033"
     environment:


[fineract-cn-docker-compose] 36/44: Encode password, fix typo error and add missing env variable

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 4d8bdb2ab4a3ed23ebe25c429f044e128274ff7e
Author: Anh3h <co...@gmail.com>
AuthorDate: Tue Oct 29 14:49:28 2019 +0000

    Encode password, fix typo error and add missing env variable
---
 bash_scripts/provision.sh | 17 ++++++++++-------
 docker-compose.yml        |  2 +-
 env_variables             |  1 +
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/bash_scripts/provision.sh b/bash_scripts/provision.sh
index b179054..04c06bc 100755
--- a/bash_scripts/provision.sh
+++ b/bash_scripts/provision.sh
@@ -283,11 +283,12 @@ create-tenant ${TENANT} "${TENANT}" "All in one Demo Server" ${TENANT}
 assign-identity-ms ${TENANT}
 login ${TENANT} "antony" $ADMIN_PASSWORD
 create-scheduler-role ${TENANT}
-create-user ${TENANT} "antony" "imhotep" "p4ssw0rd" "scheduler"
-login ${TENANT} "imhotep" "p4ssw0rd"
-update-password ${TENANT} "imhotep" "p4ssw0rd"
+# Base64Encode(p4ssw0rd) = cDRzc3cwcmQ=
+create-user ${TENANT} "antony" "imhotep" "cDRzc3cwcmQ=" "scheduler"
+login ${TENANT} "imhotep" "cDRzc3cwcmQ="
+update-password ${TENANT} "imhotep" "cDRzc3cwcmQ="
 provision-app ${TENANT} $RHYTHM_MS_NAME
-login ${TENANT} "imhotep" "p4ssw0rd"
+login ${TENANT} "imhotep" "cDRzc3cwcmQ="
 # Rhythm is not available at the moment
 # set-application-permission-enabled-for-user ${TENANT} $RHYTHM_MS_NAME "identity__v1__app_self" "imhotep"
 provision-app ${TENANT} $OFFICE_MS_NAME
@@ -305,7 +306,9 @@ provision-app ${TENANT} $GROUP_MS_NAME
 provision-app ${TENANT} $NOTIFICATIONS_MS_NAME
 login ${TENANT} "antony" $ADMIN_PASSWORD
 create-org-admin-role ${TENANT}
-create-user ${TENANT} "antony" "operator" "init1@l23" "orgadmin"
-login ${TENANT} "operator" "init1@l"
+# Base64Encode(init1@l23) = aW5pdDFAbDIz
+create-user ${TENANT} "antony" "operator" "aW5pdDFAbDIz" "orgadmin"
+login ${TENANT} "operator" "aW5pdDFAbDIz"
+update-password ${TENANT} "operator" "aW5pdDFAbDIz"
 
-echo "COMPLETED PROVISIONING PROCESS."
\ No newline at end of file
+echo "COMPLETED PROVISIONING PROCESS."
diff --git a/docker-compose.yml b/docker-compose.yml
index c8493da..a17083d 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -549,7 +549,7 @@ services:
         ipv4_address: ${GROUP_IP}
 
   notifications-ms:
-    image: apache/fineract-cn-notifications:latestC
+    image: apache/fineract-cn-notifications:latest
     ports:
       - "2033:2033"
     environment:
diff --git a/env_variables b/env_variables
index 1ab0b3e..b3ebbb6 100644
--- a/env_variables
+++ b/env_variables
@@ -14,6 +14,7 @@ POSTGRESQL_USER=postgres
 RIBBON_EUREKA_SERVER=eureka:9090
 SCHEDULER_USER_NAME=imhotep
 SYSTEM_INITIAL_CLIENT_ID=service-runner
+SERVER_MAX_HTTP_HEADER_SIZE=16384
 
 PROVISIONER_IP=172.16.238.20
 IDENTITY_IP=172.16.238.21


[fineract-cn-docker-compose] 18/44: update Postman provisioning scripts

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 96753fbec198eb632f38a81d9057857c7b51862a
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Mon Sep 23 17:15:37 2019 +0300

    update Postman provisioning scripts
---
 README.md                                          |   19 +-
 docker-compose.yml                                 |    9 +-
 ...act-Cn-Initial-Requests.postman_collection.json | 2992 +++++++++++++++++++-
 ...tial-Setup-Environment.postman_environment.json |   40 +-
 postman_scripts/accounts_with_type.csv             |   85 +
 5 files changed, 3069 insertions(+), 76 deletions(-)

diff --git a/README.md b/README.md
index f049eb4..29e6d5f 100644
--- a/README.md
+++ b/README.md
@@ -39,20 +39,20 @@ First only start provisioner-ms by running following in project root:
 ```
 docker-compose up provisioner-ms 
 ```
-after it has started (and created table seshat to postgres) stop it.
+after it has started (and created table seshat to Postgre database) you can start rest of the services.
 This is just to make sure provisioner gets to create the database the other services require.
 
 ### Choose the services you want to run
 In the docker-compose.yml (that resides in project root) there are more than 10 services defined.
 Running all services together consumes a lot of memory. So you can start a subset of services.
 
-For example you could start the following micro services and an fims-web-app:
+For example you could start the following additional micro services and an fims-web-app:
 ```
-docker-compose up provisioner-ms identity-ms office-ms customer-ms accounting-ms fims-web-app
+docker-compose up rhythm-ms identity-ms customer-ms accounting-ms deposit-ms portfolio-ms fims-web-app
 ```
 
 If you want you can add other micro services (listed in docker-compose.yml) to the list.
-For example you could also start `deposit-account-management-ms`
+
 
 # Provision
 
@@ -83,12 +83,11 @@ The first request will retrieve a token. The response should look like this, wit
 ```
 
 If you don't get a token there is something wrong with your setup. The token is necessary for authentication in other requests thus be sure that this steps works.
+Important: Be sure to execute the requests in the right order! 
+The outcome is often stored in variables - check the Tests section of the requests.
 
-Important: Be sure to execute the requests in the right order! If you execute the requests that gives you the initial password (request "03.2 Create Identity Service for Tenant") twice you will not be able to retrieve the initial password again (due to the implementation of the identity service).
-If that happens the variable antonyUserPassword is empty (undefined) and you will not be able to sign in antony and change his password (03.3, 03.4).
-
-6. If you didn't start the micro service deposit-account-management-ms with docker-compose then
-you can assign deposits app to tenant (in step 07.1 and 07.2) but these services won't work.
+Use the Postman Runner to import accounts in step 08.1.
+Use the accounts_with_type.csv file found in postman_scripts and [follow the instructions](https://learning.getpostman.com/docs/postman/collection_runs/working_with_data_files/).
 
 
 #### Debugging help
@@ -132,7 +131,7 @@ If you want to use the same Postman scripts when running micro services locally
 127.0.0.1 customer-ms
 127.0.0.1 accounting-ms
 127.0.0.1 portfolio-ms
-127.0.0.1 deposit-account-management-ms
+127.0.0.1 deposit-ms
 127.0.0.1 teller-ms
 127.0.0.1 reporting-ms
 127.0.0.1 cheques-ms
diff --git a/docker-compose.yml b/docker-compose.yml
index 2f7acaf..a1e4bb5 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -65,6 +65,8 @@ services:
   # TODO this image has error: https://issues.apache.org/jira/browse/FINCN-177
   rhythm-ms:
     image: apache/fineract-cn-rhythm:latest
+    ports:
+      - "2022:2022"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
@@ -75,6 +77,7 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+      rhythm.beatCheckRate: 600000
     deploy:
       replicas: 1
       restart_policy:
@@ -155,8 +158,11 @@ services:
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      custom.postgresql.host: ${POSTGRESQL_HOST}
+      custom.postgresql.user: ${POSTGRESQL_USER}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -165,7 +171,7 @@ services:
       fineract:
         ipv4_address: ${PORTFOLIO_IP}
 
-  deposit-account-management-ms:
+  deposit-ms:
     image: apache/fineract-cn-deposit-account-management:latest
     ports:
       - "2027:2027"
@@ -314,7 +320,6 @@ services:
       fineract:
         ipv4_address: ${FIMS_WEB_APP_IP}
 
-
 networks:
   external_tools_default:
     external:
diff --git a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
index 02895ba..ef7e4af 100644
--- a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
+++ b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
@@ -1,7 +1,7 @@
 {
 	"info": {
-		"_postman_id": "16b8ce24-0311-498b-b248-b91ddcc14b08",
-		"name": "Fineract-Initial-Requests",
+		"_postman_id": "781014cc-6b5e-4104-8d81-b53725e17036",
+		"name": "Fineract-CN-Initial-Requests",
 		"description": "Collection to initialize tenant",
 		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
 	},
@@ -68,6 +68,19 @@
 		},
 		{
 			"name": "02. Create first tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "0b18908b-f2d4-4ce4-a8ad-3d1c0652a1bc",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -81,12 +94,19 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"identifier\": \"{{tenantIdentifier}}\",\n\t\"name\": \"Playground\",\n\t\"description\": \"Sample tenant for demonstrating Fineract-CN functionality\",\n\t\"cassandraConnectionInfo\": {\n\t\t\"clusterName\": \"Datacenter1\",\n\t\t\"contactPoints\": \"cassandra:9042\",\n\t\t\"keyspace\": \"playground\",\n\t\t\"replicationType\": \"Simple\",\n\t\t\"replicas\": \"1\"\n\t},\n\t\"databaseConnectionInfo\": {\n\t\t\"driverClass\": \"org.postgresql.Driver\",\n\t\t\"databaseNa [...]
+					"raw": "{\n\t\"identifier\": \"{{tenantIdentifier}}\",\n\t\"name\": \"Playground\",\n\t\"description\": \"Sample tenant for demonstrating Fineract-CN functionality\",\n\t\"cassandraConnectionInfo\": {\n\t\t\"clusterName\": \"Datacenter1\",\n\t\t\"contactPoints\": \"cassandra:9042\",\n\t\t\"keyspace\": \"playground\",\n\t\t\"replicationType\": \"Simple\",\n\t\t\"replicas\": \"1\"\n\t},\n\t\"databaseConnectionInfo\": {\n\t\t\"driverClass\": \"org.postgresql.Driver\",\n\t\t\"databaseNa [...]
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants",
@@ -105,6 +125,19 @@
 		},
 		{
 			"name": "03.1 Create identity-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "fb7299ef-04d4-4869-a25b-d1b523098c6d",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -118,7 +151,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -129,7 +164,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"identity-v1\",\n\t\"description\": \"Identity Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://identity-ms:2021/identity/v1\"\n}"
+					"raw": "{\n\t\"name\": \"identity-v1\",\n\t\"description\": \"Identity Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{identityUrl}}/identity/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -147,7 +187,7 @@
 			"response": []
 		},
 		{
-			"name": "03.2 Assign Identity Manager for Tenant",
+			"name": "03.2 Assign Identity Manager for Tenant and obtain Tenant Admin (user antony) Password",
 			"event": [
 				{
 					"listen": "test",
@@ -179,7 +219,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -188,7 +230,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"identity-v1\"\n}"
+					"raw": "{\n\t\"name\": \"identity-v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/identityservice",
@@ -208,7 +255,7 @@
 			"response": []
 		},
 		{
-			"name": "03.3 Login Antony",
+			"name": "03.3 Login SuperAdmin (Antony)",
 			"event": [
 				{
 					"listen": "test",
@@ -277,7 +324,7 @@
 				{
 					"listen": "test",
 					"script": {
-						"type": "text/javascript",
+						"id": "4a97cc02-4f7f-4a0d-b805-5ec4af08f7b0",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							"",
@@ -285,7 +332,8 @@
 							"",
 							"",
 							""
-						]
+						],
+						"type": "text/javascript"
 					}
 				}
 			],
@@ -302,7 +350,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -311,7 +361,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"password\": \"dGVzdA==\"\n}"
+					"raw": "{\n\t\"password\": \"dGVzdA==\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{identityUrl}}/identity/v1/users/antony/password",
@@ -336,7 +391,7 @@
 				{
 					"listen": "test",
 					"script": {
-						"type": "text/javascript",
+						"id": "b3b88517-d738-461b-ba9a-f57e872dfcb2",
 						"exec": [
 							"tests[\"Status code is 200\"] = responseCode.code === 200;",
 							"",
@@ -345,7 +400,8 @@
 							"",
 							"",
 							""
-						]
+						],
+						"type": "text/javascript"
 					}
 				}
 			],
@@ -396,6 +452,19 @@
 		},
 		{
 			"name": "03.6 Assign Identity for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "66378bb5-bb0e-4374-8d4f-67c56b78eea5",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "PUT",
 				"header": [
@@ -438,7 +507,18 @@
 			"response": []
 		},
 		{
-			"name": "04.1 Create office-v1 application",
+			"name": "ONLY CREATE AND ADD apps you have started",
+			"request": {
+				"method": "OPTIONS",
+				"header": [],
+				"url": {
+					"raw": ""
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.000 Create rhythm-v1 application",
 			"request": {
 				"method": "POST",
 				"header": [
@@ -452,7 +532,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -461,7 +543,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"office-v1\",\n\t\"description\": \"Office Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://office-ms:2023/office/v1\"\n}"
+					"raw": "{\n\t\"name\": \"rhythm-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://rhythym-ms:2022/rhythm/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -479,7 +566,7 @@
 			"response": []
 		},
 		{
-			"name": "04.2 Assign Office for Tenant",
+			"name": "04.001 Assign rhythm-v1 for Tenant",
 			"request": {
 				"method": "PUT",
 				"header": [
@@ -493,7 +580,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -502,7 +591,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"office-v1\"\n\t}\n]"
+					"raw": "[\n\t{\n\t\t\"name\": \"rhythm-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
@@ -522,7 +616,20 @@
 			"response": []
 		},
 		{
-			"name": "05.1 Create customer-v1 application",
+			"name": "04.010 Create office-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "bc3eeb3d-961c-449b-87b9-99606d0511b3",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -545,7 +652,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"customer-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://customer-ms:2024/customer/v1\"\n}"
+					"raw": "{\n\t\"name\": \"office-v1\",\n\t\"description\": \"Office Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://office-ms:2023/office/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -563,7 +670,20 @@
 			"response": []
 		},
 		{
-			"name": "05.2 Assign customer for Tenant",
+			"name": "04.011 Assign office-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "7f3f5ba7-5b63-4a44-b491-12e0436c1056",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "PUT",
 				"header": [
@@ -577,7 +697,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -586,7 +708,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"customer-v1\"\n\t}\n]"
+					"raw": "[\n\t{\n\t\t\"name\": \"office-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
@@ -606,7 +733,20 @@
 			"response": []
 		},
 		{
-			"name": "06.1 Create accounting-v1 application",
+			"name": "04.020 Create customer-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "8adf52e4-af8a-49c8-86fc-c3174e637283",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -629,7 +769,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"accounting-v1\",\n\t\"description\": \"Accounting Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://accounting-ms:2025/accounting/v1\"\n}"
+					"raw": "{\n\t\"name\": \"customer-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{customerUrl}}/customer/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -647,7 +787,20 @@
 			"response": []
 		},
 		{
-			"name": "06.2 Assign accounting for Tenant",
+			"name": "04.021 Assign customer-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "d5f166cb-0a4d-44e2-ab41-fde67c2d1af7",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "PUT",
 				"header": [
@@ -661,7 +814,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -670,7 +825,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"accounting-v1\"\n\t}\n]"
+					"raw": "[\n\t{\n\t\t\"name\": \"customer-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
@@ -690,7 +850,20 @@
 			"response": []
 		},
 		{
-			"name": "07.1 Create deposit-v1 application",
+			"name": "04.030 Create accounting-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "6a24d7f4-0056-42e6-8d20-c7d3bd3dfd09",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -713,7 +886,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"deposit-v1\",\n\t\"description\": \"Deposit Management Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://deposit-account-management-ms:2027/deposit/v1\"\n}"
+					"raw": "{\n\t\"name\": \"accounting-v1\",\n\t\"description\": \"Accounting Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{accountingUrl}}/accounting/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -731,7 +904,20 @@
 			"response": []
 		},
 		{
-			"name": "07.2 Assign deposits for Tenant",
+			"name": "04.031 Assign accounting-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "af1b9ac1-c66c-4353-b59b-ec3e1bea864c",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "PUT",
 				"header": [
@@ -745,7 +931,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -754,7 +942,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"deposit-v1\"\n\t}\n]"
+					"raw": "[\n\t{\n\t\t\"name\": \"accounting-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
@@ -774,12 +967,12 @@
 			"response": []
 		},
 		{
-			"name": "08.1 Create Admin Role for tenant \"playground\"",
+			"name": "04.040 Create portfolio-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
+						"id": "3efb77f8-9bc7-4835-87e8-b4ebfb7abd11",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -792,53 +985,136 @@
 				"method": "POST",
 				"header": [
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{antonyUser}}"
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"portfolio-v1\",\n\t\"description\": \"Portfolio\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://portfolio-ms:2026/portfolio/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.041 Assign portfolio-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "ef7b5c59-1623-4183-8196-b76e30922713",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
 						"key": "Authorization",
-						"value": "{{antonyToken}}"
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\"identifier\":\"administrator\",\"permissions\":[{\"permittableEndpointGroupIdentifier\":\"identity__v1__roles\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"identity__v1__self\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"office__v1__employees\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"customer__v1__task\",\"al [...]
+					"raw": "[\n\t{\n\t\t\"name\": \"portfolio-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/roles",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"roles"
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "08.2 Create Admin User",
+			"name": "04.050 Create deposit-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "870693ae-6f50-4b8e-9920-fa45e184f732",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
-						"value": "{{antonyToken}}"
+						"value": "{{rootUserToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{antonyUser}}"
+						"value": "{{rootUser}}"
 					},
 					{
 						"key": "Content-Type",
@@ -851,22 +1127,2620 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"identifier\": \"mifos\",\n\t\"role\": \"administrator\",\n\t\"password\": \"cGFzc3dvcmQ=\"\n}"
+					"raw": "{\n\t\"name\": \"deposit-v1\",\n\t\"description\": \"Deposit Management Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{depositUrl}}/deposit/v1\"\n}"
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/users",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"users"
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.051 Assign deposits for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "8b4e42c3-5a2f-437d-8f2c-55a6d398f601",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"deposit-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.060 Create teller-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "0dbc31fb-0e82-492a-aab8-f30e1fdad5a5",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"teller-v1\",\n\t\"description\": \"Teller\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://teller-ms:2028/teller/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.061 Assign teller-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "99d87103-9033-4dc9-aaef-b82aef6f8e3a",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"teller-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.070 Create reporting-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "b92b9efb-afcb-4c12-b3af-0b8ca07aaef0",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"reporting-v1\",\n\t\"description\": \"Reporting\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://reporting-ms:2029/reporting/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.071 Assign reporting-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "c0c31e05-7498-46c9-8063-7987327fa1fa",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"reporting-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.080 Create cheques-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "c91e5040-28c4-4a87-9132-85c420c78efe",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"cheques-v1\",\n\t\"description\": \"Cheques\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://cheques-ms:2030/cheques/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.081 Assign cheques-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "e696bb1f-9582-4861-9009-2b9ede155c3b",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"cheques-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.090 Create payroll-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "f2eb7045-4dae-4ad7-9a0c-fddc35d21436",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"payroll-v1\",\n\t\"description\": \"Payroll\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://payroll-ms:2031/payroll/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.091 Assign payroll-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "1a0f8ef5-a7a1-47d4-b83c-92a7b7e4ffcb",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"payroll-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.100 Create group-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "b533921d-e3f5-45f0-b035-f1d6395b4703",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"group-v1\",\n\t\"description\": \"Group\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://group-ms:2032/group/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.101 Assign group-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "32caff55-23cb-498a-b17c-0444894662ad",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"group-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.110 Create notifications-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "cfd7c51f-0aac-4b9b-9048-c3ca60672ba0",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"notifications-v1\",\n\t\"description\": \"Notifications\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://notifications-ms:2033/notification/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.111 Assign notifications-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "f755efce-b652-48f8-aefb-4cee875df904",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"notifications-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.999 List tenant applications (Only returning one is a bug?)",
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.1 Create Admin Role for tenant \"playground\"",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\"identifier\":\"administrator\",\"permissions\":[{\"permittableEndpointGroupIdentifier\":\"identity__v1__roles\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"identity__v1__self\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"office__v1__employees\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"customer__v1__task\",\"al [...]
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/roles",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"roles"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.2 Create Admin User mifos",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"identifier\": \"mifos\",\n\t\"role\": \"administrator\",\n\t\"password\": \"{{adminUserPassword}}\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.3 Log in with old password ('password')",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "d86648d2-e737-4eb5-9999-f0cb5f2557f7",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"adminUserToken\", jsonData.accessToken);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"identifier\": \"mifos\",\n\t\"role\": \"administrator\",\n\t\"password\": \"cGFzc3dvcmQ=\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=mifos&password={{adminUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "mifos"
+						},
+						{
+							"key": "password",
+							"value": "{{adminUserPassword}}",
+							"description": "Initial password"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.4 Change Admin user password (required on first login)",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "af5b9059-bf36-4715-acc2-25d272552590",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}",
+						"type": "text"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"password\": \"{{adminUserPassword}}\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users/mifos/password",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users",
+						"mifos",
+						"password"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.5 ADMIN LOGIN",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "af5b9059-bf36-4715-acc2-25d272552590",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"adminUserToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=mifos&password={{adminUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "mifos"
+						},
+						{
+							"key": "password",
+							"value": "{{adminUserPassword}}"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.1 Create Scheduler role for tenant playground",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"identifier\": \"scheduler\",\n  \"permissions\": [\n    {\n      \"permittableEndpointGroupIdentifier\": \"identity__v1__app_self\",\n      \"allowedOperations\": [\n        \"CHANGE\"\n      ]\n    },\n    {\n      \"permittableEndpointGroupIdentifier\": \"portfolio__v1__khepri\",\n      \"allowedOperations\": [\n        \"CHANGE\"\n      ]\n    }\n  ]\n}\n",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/roles",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"roles"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.2 Create Scheduler user imhotep with password '26500BC'",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "7d03384e-a570-48b4-a2f9-8f305dee9098",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"identifier\": \"imhotep\",\n\t\"role\": \"scheduler\",\n\t\"password\": \"MjY1MDBCQw==\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.3 Login Scheduler user imhotep",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"schedulerUserToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=imhotep&password=MjY1MDBCQw==",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "imhotep"
+						},
+						{
+							"key": "password",
+							"value": "MjY1MDBCQw=="
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.4 Change imhotep user password to '26500BC'",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "af5b9059-bf36-4715-acc2-25d272552590",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{schedulerUserToken}}",
+						"type": "text"
+					},
+					{
+						"key": "User",
+						"value": "imhotep",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"password\": \"MjY1MDBCQw==\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users/imhotep/password",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users",
+						"imhotep",
+						"password"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.5 Loginuser imhotep (who has scheduler role)",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"schedulerUserToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=imhotep&password=MjY1MDBCQw==",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "imhotep"
+						},
+						{
+							"key": "password",
+							"value": "MjY1MDBCQw=="
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "Q1: WHY 06.6 and 06.7 FAIL?",
+			"request": {
+				"method": "DELETE",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": ""
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.5 enable permission identity__v1__app_self for imhotep",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "User",
+						"value": "imhotep",
+						"type": "text"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{schedulerUserToken}}",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "true",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/applications/rhythm-v1/permissions/identity__v1__app_self/users/imhotep/enabled",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"applications",
+						"rhythm-v1",
+						"permissions",
+						"identity__v1__app_self",
+						"users",
+						"imhotep",
+						"enabled"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.6 enable permission portfolio__v1__khepri for user imhotep",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "User",
+						"value": "imhotep",
+						"type": "text"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{schedulerUserToken}}",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "true",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/applications/rhythm-v1/permissions/portfolio__v1__khepri/users/imhotep/enabled",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"applications",
+						"rhythm-v1",
+						"permissions",
+						"portfolio__v1__khepri",
+						"users",
+						"imhotep",
+						"enabled"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.1 Create INCOME ledgers",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"description\": null,\n  \"type\": \"REVENUE\",\n  \"identifier\": \"1000\",\n  \"name\": \"Income\",\n  \"subLedgers\": [\n    {\n      \"description\": null,\n      \"type\": \"REVENUE\",\n      \"identifier\": \"1100\",\n      \"name\": \"Income from Loans\",\n      \"subLedgers\": [],\n      \"showAccountsInChart\": true\n    },\n    {\n      \"description\": null,\n      \"type\": \"REVENUE\",\n      \"identifier\": \"1200\",\n      \"name\": \"Investment Income\" [...]
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/ledgers",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"ledgers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.2 Create EXPENSE Ledgers",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"description\": null,\n  \"type\": \"EXPENSE\",\n  \"identifier\": \"2000\",\n  \"name\": \"Expenses\",\n  \"showAccountsInChart\": true,\n  \"subLedgers\": [\n    {\"description\": null, \"type\": \"EXPENSE\", \"identifier\": \"2100\",  \"name\": \"Employee Compensation\", \"subLedgers\": [], \"showAccountsInChart\": true },\n    {\"description\": null, \"type\": \"EXPENSE\", \"identifier\": \"2200\",  \"name\": \"Employee Benefits\", \"subLedgers\": [], \"showAccount [...]
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/ledgers",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"ledgers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.3 Create ASSETS ledgers",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"description\": null,\n  \"type\": \"ASSET\",\n  \"identifier\": \"7000\",\n  \"name\": \"Assets\",\n  \"showAccountsInChart\": true,\n  \"subLedgers\": [\n    {\n      \"description\": null,\n      \"type\": \"ASSET\",\n      \"identifier\": \"7010\",\n      \"name\": \"Loans to Members\",\n      \"subLedgers\": [],\n      \"showAccountsInChart\": true\n    },\n    {\n      \"description\": null,\n      \"type\": \"ASSET\",\n      \"identifier\": \"7020\",\n      \"na [...]
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/ledgers",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"ledgers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.4 Create LIABILITY ledgers",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"description\": null,\n  \"type\": \"LIABILITY\",\n  \"identifier\": \"8000\",\n  \"name\": \"Accounts Payable\",\n  \"showAccountsInChart\": true,\n  \"subLedgers\": [\n    {\n      \"description\": null,\n      \"type\": \"LIABILITY\",\n      \"identifier\": \"8100\",\n      \"name\": \"Accounts Payable\",\n      \"subLedgers\": [],\n      \"showAccountsInChart\": true\n    },\n    {\n      \"description\": null,\n      \"type\": \"LIABILITY\",\n      \"identifier\": [...]
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/ledgers",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"ledgers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.5 Create EQUITY ledgers",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"description\": null,\n  \"type\": \"EQUITY\",\n  \"identifier\": \"9000\",\n  \"name\": \"Equity\",\n  \"showAccountsInChart\": true,\n  \"subLedgers\": [\n    {\n      \"description\": null,\n      \"type\": \"EQUITY\",\n      \"identifier\": \"9100\",\n      \"name\": \"Member Savings\",\n      \"subLedgers\": [],\n      \"showAccountsInChart\": true\n    },\n    {\n      \"description\": null,\n      \"type\": \"EQUITY\",\n      \"identifier\": \"9300\",\n      \"n [...]
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/ledgers",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"ledgers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "NB! Readme has instructions how to run next step",
+			"request": {
+				"method": "OPTIONS",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": ""
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "08.1 Create accounts (user Runner and import accounts_with_type.csv)",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "eef05538-e99a-4715-9ee2-1620a4ec4adc",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}",
+						"type": "text"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}",
+						"type": "text"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n    \"balance\": \"200\",\n    \"identifier\": \"{{identifier}}\",\n    \"ledger\": \"{{parentIdentifier}}\",\n    \"name\": \"{{name}}\",\n    \"type\": \"{{type}}\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/accounts",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"accounts"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "09.1 Create member1",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "4e26fc95-4fad-4972-ac80-528581c28fcc",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n            \"identifier\": \"member1\",\n            \"type\": \"PERSON\",\n            \"givenName\": \"First Name\",\n            \"middleName\": null,\n            \"surname\": \"LastnameMember1\",\n            \"dateOfBirth\": {\n                \"year\": 1922,\n                \"month\": 2,\n                \"day\": 22\n            },\n            \"address\": {\n            \t\"street\": \"ABC Street\",\n            \t\"region\": \"Nord\",\n            \t\"city\":  [...]
+				},
+				"url": {
+					"raw": "http://{{customerUrl}}/customer/v1/customers",
+					"protocol": "http",
+					"host": [
+						"{{customerUrl}}"
+					],
+					"path": [
+						"customer",
+						"v1",
+						"customers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "09.2 Activate member1",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "abfdbef2-9b97-44db-94e2-0f30adb65173",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"action\": \"ACTIVATE\"\n}"
+				},
+				"url": {
+					"raw": "http://{{customerUrl}}/customer/v1/customers/member1/commands",
+					"protocol": "http",
+					"host": [
+						"{{customerUrl}}"
+					],
+					"path": [
+						"customer",
+						"v1",
+						"customers",
+						"member1",
+						"commands"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "09.2 Create customer10",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "d572df48-1555-41c8-839e-fa7e9dc0afcc",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n            \"identifier\": \"customer10\",\n            \"type\": \"PERSON\",\n            \"givenName\": \"First Name\",\n            \"middleName\": null,\n            \"surname\": \"LastnameCustomer10\",\n            \"dateOfBirth\": {\n                \"year\": 1922,\n                \"month\": 2,\n                \"day\": 22\n            },\n            \"address\": {\n            \t\"street\": \"ABC Street\",\n            \t\"region\": \"Nord\",\n            \t\"ci [...]
+				},
+				"url": {
+					"raw": "http://{{customerUrl}}/customer/v1/customers",
+					"protocol": "http",
+					"host": [
+						"{{customerUrl}}"
+					],
+					"path": [
+						"customer",
+						"v1",
+						"customers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "09.3 Activate customer10",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "afa41cb7-93c9-46d8-8c60-471ae8642097",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"action\": \"ACTIVATE\"\n}"
+				},
+				"url": {
+					"raw": "http://{{customerUrl}}/customer/v1/customers/customer10/commands",
+					"protocol": "http",
+					"host": [
+						"{{customerUrl}}"
+					],
+					"path": [
+						"customer",
+						"v1",
+						"customers",
+						"customer10",
+						"commands"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "10.1 Create savingsProduct001",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "854f50a3-980b-4450-b8a0-c1333d3beeac",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"identifier\": \"savingsProduct001\",\n  \"type\": \"SAVINGS\",\n  \"name\": \"Savings Product 1\",\n  \"description\": null,\n  \"minimumBalance\": 1,\n  \"interest\": 0.01,\n  \"flexible\": true,\n  \"term\": {\n    \"period\": \"1\",\n    \"timeUnit\": \"YEAR\",\n    \"interestPayable\": \"MATURITY\"\n  },\n  \"currency\": {\n    \"code\": \"EUR\",\n    \"name\": \"Euro\",\n    \"sign\": \"€\",\n    \"scale\": 2\n  },\n  \"charges\": [],\n  \"expenseAccountIdentifie [...]
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/definitions",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"definitions"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "10.2 Activate savingsProduct001",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "c0ed6c3d-07f1-48e1-b9e6-f0423ae0c5e4",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"action\": \"ACTIVATE\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/definitions/savingsProduct001/commands",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"definitions",
+						"savingsProduct001",
+						"commands"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "10.3 Create Checking product",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "35f0c037-cbfc-4ffc-b6c7-9c9846cc4018",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"identifier\": \"checkingProduct110\",\n  \"type\": \"CHECKING\",\n  \"name\": \"checking Product 110\",\n  \"description\": null,\n  \"minimumBalance\": 0,\n  \"interest\": 0,\n  \"flexible\": true,\n  \"term\": {\n    \"period\": \"2\",\n    \"timeUnit\": \"YEAR\",\n    \"interestPayable\": \"ANNUALLY\"\n  },\n  \"currency\": {\n    \"code\": \"EUR\",\n    \"name\": \"Euro\",\n    \"sign\": \"€\",\n    \"scale\": 2\n  },\n  \"charges\": [],\n  \"expenseAccountIdentif [...]
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/definitions",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"definitions"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "10.4 Activate checkingProduct110",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "9023188b-2b14-4403-aa1f-fc324dc26b9b",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"action\": \"ACTIVATE\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/definitions/checkingProduct110/commands",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"definitions",
+						"checkingProduct110",
+						"commands"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "Q2: WHY customer is twice in next?",
+			"request": {
+				"method": "DELETE",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": ""
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "11.1 Assign savingsProduct001 to customer10",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"productIdentifier\": \"savingsProduct001\",\n  \"beneficiaries\": [\n    \"customer10\"\n  ],\n  \"customerIdentifier\": \"customer10\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "11.2. Get customer products",
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances?customer=customer10",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances"
+					],
+					"query": [
+						{
+							"key": "customer",
+							"value": "customer10"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "11.3 Get customer address",
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://localhost:8888/api/customer/v1/customers/customer10/identifications",
+					"protocol": "http",
+					"host": [
+						"localhost"
+					],
+					"port": "8888",
+					"path": [
+						"api",
+						"customer",
+						"v1",
+						"customers",
+						"customer10",
+						"identifications"
 					]
 				}
 			},
 			"response": []
 		}
-	]
-}
+	],
+	"protocolProfileBehavior": {}
+}
\ No newline at end of file
diff --git a/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json b/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
index ee13692..6428a72 100644
--- a/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
+++ b/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
@@ -1,5 +1,5 @@
 {
-	"id": "91c46e16-2e81-441f-af81-349ca02d2052",
+	"id": "e6c732a9-157e-4ad6-a1f3-559ff36441c9",
 	"name": "Fineract-Cn-Initial-Setup-Environment",
 	"values": [
 		{
@@ -29,7 +29,7 @@
 		},
 		{
 			"key": "rootUserToken",
-			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJhdWQiOiJwcm92aXNpb25lci12MSIsInN1YiI6IndlcGVtbmVmcmV0IiwiL2ZpbmNuLmFwYWNoZS5vcmcvcyI6IjIwMTktMDktMDRUMDZfNDNfNTIiLCIvZmluY24uYXBhY2hlLm9yZy9jIjoiUk9MRV9BRE1JTiIsImlzcyI6InN5c3RlbSIsImlhdCI6MTU2NzY5MDcxOSwiZXhwIjoxNTY3Njk0MzE5fQ.mG4Hs3IkU0_lHzazEidYU3EbVoHxmVhF3mBKWsnsLktE4PUnFjkfkP201RLypUzUTFTR4jp8ytDryOZQi-Cqku1BeRv8zQihJNFNL5khpmLnDKmelffE4BmM6t3wPsXSLke9orTL6HQEgNELcR03UhihGp_JvPYVQ5uzcSKcv1uG5U0IDZdKMAfvCdeu7uS5mV_H6tHnPjChbGcfPdB6wtk-4d7O [...]
+			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJhdWQiOiJwcm92aXNpb25lci12MSIsInN1YiI6IndlcGVtbmVmcmV0IiwiL2ZpbmNuLmFwYWNoZS5vcmcvcyI6IjIwMTktMDktMTlUMTZfNTRfNTYiLCIvZmluY24uYXBhY2hlLm9yZy9jIjoiUk9MRV9BRE1JTiIsImlzcyI6InN5c3RlbSIsImlhdCI6MTU2OTI0NDMwNiwiZXhwIjoxNTY5MjQ3OTA2fQ.I6o8sv9ArXzr2u_-u0F53DeWpXBSAgLpQLrIF6Cumg4-lJtXyyqwiP34rBLDfj7PCeQSYLy59RR_o4j_isL0FhZZbTM97gZiNts6DY0Q7cuitLyDANYiHra4jhjzA85NH8lp_BDNVhRj2CsrcWXEciztiBzGy9dPS_AOts7ftQarOKilwZSw1KUZOIoMeYLbNk5tXELmREzTVGR8s_kEENdveWub [...]
 			"enabled": true
 		},
 		{
@@ -39,7 +39,7 @@
 		},
 		{
 			"key": "antonyToken",
-			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJhbnRvbnkiLCIvZmluY24uYXBhY2hlLm9yZy9zIjoiMjAxOS0wOS0wNVQxM18zOV80NiIsIi9maW5jbi5hcGFjaGUub3JnL2MiOiJ7XCJ0b2tlblBlcm1pc3Npb25zXCI6W3tcInBhdGhcIjpcImlkZW50aXR5LXYxL3VzZXJzL3t1c2VyaWRlbnRpZmllcn0vcGFzc3dvcmRcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiQ0hBTkdFXCIsXCJSRUFEXCIsXCJERUxFVEVcIl19LHtcInBhdGhcIjpcImlkZW50aXR5LXYxL3JvbGVzLypcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiQ0hBTkdFXCIsXCJSRUFEXCIsXCJERUxFVEVcIl19LHtcInBhdGhcIjpcImlkZW50aXR5LXYxL3VzZXJ [...]
+			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJhbnRvbnkiLCIvZmluY24uYXBhY2hlLm9yZy9zIjoiMjAxOS0wOS0yM1QxM18xMl8wOSIsIi9maW5jbi5hcGFjaGUub3JnL2MiOiJ7XCJ0b2tlblBlcm1pc3Npb25zXCI6W3tcInBhdGhcIjpcImlkZW50aXR5LXYxL3VzZXJzL3t1c2VyaWRlbnRpZmllcn0vcGVybWlzc2lvbnNcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiUkVBRFwiXX0se1wicGF0aFwiOlwiaWRlbnRpdHktdjEvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbmlkZW50aWZpZXJ9L3Blcm1pc3Npb25zXCIsXCJhbGxvd2VkT3BlcmF0aW9uc1wiOltcIlJFQURcIixcIkRFTEVURVwiLFwiQ0hBTkdFXCJdfSx7XCJwYXR [...]
 			"enabled": true
 		},
 		{
@@ -76,9 +76,39 @@
 			"key": "antonyUserPassword",
 			"value": "dGVzdA==",
 			"enabled": true
+		},
+		{
+			"key": "adminUserPassword",
+			"value": "cGFzc3dvcmQ=",
+			"enabled": true
+		},
+		{
+			"key": "adminUserToken",
+			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJtaWZvcyIsIi9maW5jbi5hcGFjaGUub3JnL3MiOiIyMDE5LTA5LTIzVDEzXzEyXzA5IiwiL2ZpbmNuLmFwYWNoZS5vcmcvYyI6IntcInRva2VuUGVybWlzc2lvbnNcIjpbe1wicGF0aFwiOlwiaWRlbnRpdHktdjEvdXNlcnMve3VzZXJpZGVudGlmaWVyfS9wZXJtaXNzaW9uc1wiLFwiYWxsb3dlZE9wZXJhdGlvbnNcIjpbXCJSRUFEXCJdfSx7XCJwYXRoXCI6XCJjdXN0b21lci12MS90YXNrc1wiLFwiYWxsb3dlZE9wZXJhdGlvbnNcIjpbXCJSRUFEXCIsXCJDSEFOR0VcIl19LHtcInBhdGhcIjpcImRlcG9zaXQtdjEvZGVmaW5pdGlvbnMvKi9pbnN0YW5jZXNcIixcImFsbG93ZWRPcGV [...]
+			"enabled": true
+		},
+		{
+			"key": "adminUser",
+			"value": "mifos",
+			"enabled": true
+		},
+		{
+			"key": "depositUrl",
+			"value": "deposit-ms:2027",
+			"enabled": true
+		},
+		{
+			"key": "customerUrl",
+			"value": "customer-ms:2024",
+			"enabled": true
+		},
+		{
+			"key": "schedulerUserToken",
+			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJpbWhvdGVwIiwiL2ZpbmNuLmFwYWNoZS5vcmcvcyI6IjIwMTktMDktMjNUMTNfMTJfMDkiLCIvZmluY24uYXBhY2hlLm9yZy9jIjoie1widG9rZW5QZXJtaXNzaW9uc1wiOlt7XCJwYXRoXCI6XCJpZGVudGl0eS12MS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uaWRlbnRpZmllcn0vcGVybWlzc2lvbnNcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiQ0hBTkdFXCJdfSx7XCJwYXRoXCI6XCJpZGVudGl0eS12MS91c2Vycy97dXNlcmlkZW50aWZpZXJ9L3Blcm1pc3Npb25zXCIsXCJhbGxvd2VkT3BlcmF0aW9uc1wiOltcIlJFQURcIl19LHtcInBhdGhcIjpcInBvcnRmb2xpby12MS9 [...]
+			"enabled": true
 		}
 	],
 	"_postman_variable_scope": "environment",
-	"_postman_exported_at": "2019-09-05T13:50:13.901Z",
-	"_postman_exported_using": "Postman/7.5.0"
+	"_postman_exported_at": "2019-09-23T14:12:43.724Z",
+	"_postman_exported_using": "Postman/7.7.3"
 }
diff --git a/postman_scripts/accounts_with_type.csv b/postman_scripts/accounts_with_type.csv
new file mode 100644
index 0000000..1f2924b
--- /dev/null
+++ b/postman_scripts/accounts_with_type.csv
@@ -0,0 +1,85 @@
+parentIdentifier,identifier,name,type
+1100,1101,"Interest on Business Loans",REVENUE
+1100,1102,"Interest on Agriculture Loans",REVENUE
+1100,1103,"Interest on Consumer Loans",REVENUE
+1100,1104,"Interest on Savings Secured",REVENUE
+1100,1105,"Interest on Other Member Loans",REVENUE
+1100,1120,"Interest on Lines of Credit",REVENUE
+1100,1121,"Interest on Credit Cards",REVENUE
+1100,1140,"Interest on Real Estate Loans",REVENUE
+1100,1190,"Interest Refunds",REVENUE
+1200,1210,"Income from Government Investments",REVENUE
+1200,1220,"Income from Govenment Agency Securities",REVENUE
+1200,1230,"Income from Savings/Deposits/Certificates",REVENUE
+1200,1290,"Income from Other Investments",REVENUE
+1300,1310,"Loan Origination Fees",REVENUE
+1300,1311,"Loan Late Payment Fee",REVENUE
+1300,1312,"Processing Fee",REVENUE
+1300,1313,"Disbursement Fee",REVENUE
+1300,1320,"Loan Refinance Fee",REVENUE
+1300,1390,"Other Loan Fee",REVENUE
+2800,2820,"Collection Expenses",EXPENSE
+2800,2830,"Recording Fees—Chattel Lien Insurance",EXPENSE
+2800,2840,"Credit Reports",EXPENSE
+2800,2850,"Refunds—Real Estate Service Charges",EXPENSE
+2800,2860,"Credit Card Program Expenses",EXPENSE
+2800,2870,"Service Fees on Loans Purchased",EXPENSE
+2800,2890,"Other Loan Servicing Expenses",EXPENSE
+3000,3010,"Provision for Loan Losses—Consumer Loans",EXPENSE
+3000,3020,"Provision for Loan Losses—Lines of Credit",EXPENSE
+3000,3030,"Provision for Loan Losses—Real Estate Loans",EXPENSE
+3000,3040,"Provision for Loan Losses—Other Loans",EXPENSE
+3000,3090,"Other Provision for Losses",EXPENSE
+3100,3110,"Saving Insurance",EXPENSE
+3100,3120,"Life Savings Insurance",EXPENSE
+3100,3130,"Borrowers' Insurance",EXPENSE
+3100,3190,"Other Members' Insurance",EXPENSE
+3800,3801,"Share Dividend",EXPENSE
+3800,3810,"Regular Saving Interest",EXPENSE
+3800,3820,"Checking Interest",EXPENSE
+3800,3830,"Club Account Interest",EXPENSE
+3800,3840,"Saving Certificate Interest",EXPENSE
+3800,3890,"Other Interest Expense",EXPENSE
+7000,7011,"Commercial Loans",ASSET
+7000,7012,"Agriculture Loans",ASSET
+7000,7013,"Consumer Loans",ASSET
+7000,7014,"Other Member Loans",ASSET
+7000,7015,"Home Equity Loans",ASSET
+7000,7021,"Lines of Credit to Members—Credit Cards",ASSET
+7000,7022,"Lines of Credit—Cash Advances in Process",ASSET
+7000,7023,"Net Origination Fees (Costs)—Lines of Credit",ASSET
+7000,7024,"Net Commitment Fees (Costs)—Lines of Credit",ASSET
+7000,7031,"Net Origination Fees (Costs)",ASSET
+7000,7070,"Loans—Collateral in Process of Liquidation",ASSET
+7310,7310.1,"Bank account one general",ASSET
+7310,7310.2,"Bank account one Pending Disbursal",ASSET
+7310,7311.1,"Bank account two general",ASSET
+7310,7311.2,"Bank account two Pending Disbursal",ASSET
+7300,7312,"Petty Cash",ASSET
+7300,7351,"Vault Cash",ASSET
+7300,7352,"Teller One",ASSET
+7300,7353,"Teller Two",ASSET
+7300,7354,"Teller Three",ASSET
+7800,7810,"Accrued Interest on Loans",ASSET
+7800,7820,"Accrued Income on Investments",ASSET
+7800,7830,"Accrued Credit Card Income",ASSET
+7800,7840,"Accrued Late Fee Income",ASSET
+7800,7890,"Other Accrued Income",ASSET
+8200,8201,"Dividends Payable on Shares",LIABILITY
+8200,8202,"Interest Payable on Savings",LIABILITY
+8200,8203,"Interest Payable on Club Accounts",LIABILITY
+8200,8207,"Interest Payable on Other Accounts",LIABILITY
+8400,8410,"VAT Taxes payable",LIABILITY
+8400,8420,"Withholding taxes payable",LIABILITY
+8400,8490,"Other Taxes Payable",LIABILITY
+8500,8530,"Loans Payable",LIABILITY
+8500,8540,"Accrued Dividends Payable",LIABILITY
+8500,8550,"Accrued Interest Payable",LIABILITY
+8500,8590,"Other Accrued Expenses",LIABILITY
+9000,9010,"Share Account",EQUITY
+9000,9020,"Savings",EQUITY
+9000,9030,"Club Accounts",EQUITY
+9000,9040,"Other Savings",EQUITY
+9300,9310,"Regular Reserves",EQUITY
+9300,9320,"Special Reserve for Losses",EQUITY
+9300,9330,"Other Reserves",EQUITY


[fineract-cn-docker-compose] 12/44: Merge pull request #4 from aasaru/anh3h_master

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit a5ed548f37e127ea2de311f6d39c1730e9977459
Merge: fb8b48b eeebf2a
Author: Awasum Yannick <aw...@apache.org>
AuthorDate: Fri Sep 13 11:18:59 2019 +0100

    Merge pull request #4 from aasaru/anh3h_master
    
    FINCN-165: Enhance Fineract CN startup script. make it work with mac and linux.

 README.md                                          | 139 +++-
 docker-compose.yml                                 | 123 ++-
 env_variables                                      |  15 +
 external_tools/docker-compose.yml                  |   6 +
 ...act-Cn-Initial-Requests.postman_collection.json | 872 +++++++++++++++++++++
 ...tial-Setup-Environment.postman_environment.json |  84 ++
 start-up.sh                                        |  26 +
 7 files changed, 1243 insertions(+), 22 deletions(-)


[fineract-cn-docker-compose] 25/44: Merge remote-tracking branch 'upstream/master' into fix_typos_in_postman_scripts

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit bc6420128c32b557f96c06c7f125b7446fb0125d
Merge: 610e8c5 0aab6f8
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Oct 2 15:29:04 2019 +0300

    Merge remote-tracking branch 'upstream/master' into fix_typos_in_postman_scripts

 README.md | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --cc README.md
index c4b3cfd,775501d..35a75c6
--- a/README.md
+++ b/README.md
@@@ -169,12 -168,12 +172,13 @@@ docker volume rm external_tools_postgre
  docker-compose up
  ```
  
- ### Automating Postman scripts
+ ## Note:
+ **These scripts are ideal for a docker swarm deployment environment. If you are to deploy Fineract CN using Docker swarm you will have remove the network configuration from the docker-compose script and implement a load balancer (using docker swarm) that reflects the network configuratioin you just removed from the compose file.**
  
 -## TODO
++### Automating Postman scripts
 +You can use [Newman](https://learning.getpostman.com/docs/postman/collection_runs/command_line_integration_with_newman/) to run Postman scripts from command line.
  
- 
 -- Provision the web services using a script
 +## TODO
  - Adjust scripts for Kubernetes
  
  There are some scripts in [https://github.com/openMF/fineract-cn-containers](https://github.com/openMF/fineract-cn-containers)


[fineract-cn-docker-compose] 13/44: FINCN-176 fix cheques image name

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 71f4eb873df6e6863bb5b8809ef0adba7e24e3b0
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Fri Sep 13 21:48:56 2019 +0300

    FINCN-176 fix cheques image name
---
 docker-compose.yml | 53 +++++++++++++++++++++++++++--------------------------
 1 file changed, 27 insertions(+), 26 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index 7b4dfd9..5750bcf 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -35,7 +35,7 @@ services:
         ipv4_address: ${PROVISIONER_IP}
 
   identity-ms:
-    image: apache/fineract-cn-identity:0.0.1-M.1 # TODO replace with latest
+    image: apache/fineract-cn-identity:latest
     ports:
       - "2021:2021"
     environment:
@@ -62,28 +62,27 @@ services:
       fineract:
         ipv4_address: ${IDENTITY_IP}
 
-  # TODO HAS ERRORS:
-#  rhythm-ms:
-#    image: apache/fineract-cn-rhythm:latest
-#    environment:
-#      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
-#      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
-#      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-#      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
-#      postgresql.host: ${POSTGRESQL_HOST}
-#      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
-#      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
-#      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
-#      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
-#    deploy:
-#      replicas: 1
-#      restart_policy:
-#        condition: on-failure
-#    networks:
-#      external_tools_default:
-#      fineract:
-#          ipv4_address: ${RHYTHM_IP}
-
+  # TODO this image has error: https://issues.apache.org/jira/browse/FINCN-177
+  rhythm-ms:
+    image: apache/fineract-cn-rhythm:latest
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+    networks:
+      external_tools_default:
+      fineract:
+          ipv4_address: ${RHYTHM_IP}
 
   office-ms:
     image: apache/fineract-cn-office:latest
@@ -227,7 +226,7 @@ services:
         ipv4_address: ${REPORTING_IP}
 
   cheques-ms:
-    image: apache/fineract-cn-reporting:latest
+    image: apache/fineract-cn-cheques:latest
     ports:
       - "2030:2030"
     environment:
@@ -287,7 +286,8 @@ services:
         ipv4_address: ${GROUP_IP}
 
   notifications-ms:
-    image: aasaru/fineract-cn-notifications:latest # TODO switch to apache repo
+    #image: apache/fineract-cn-notifications:latest # TODO uncomment after https://github.com/apache/fineract-cn-notifications/pull/18 has been merged
+    image: aasaru/fineract-cn-notifications:latest # remove after uncommenting
     ports:
      - "2033:2033"
     environment:
@@ -307,7 +307,8 @@ services:
         ipv4_address: ${NOTIFICATIONS_IP}
 
   fims-web-app:
-    image: aasaru/fineract-cn-fims-web-app:latest # TODO switch to apache repo
+    #image: apache/fineract-cn-fims-web-app:latest # uncomment after https://github.com/apache/fineract-cn-fims-web-app/pull/20 has been merged
+    image: aasaru/fineract-cn-fims-web-app:latest # temporary
     ports:
       - "8888:8888"
     networks:


[fineract-cn-docker-compose] 04/44: Merge pull request #1 from aasaru/perepare_docker_compose

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit fb8b48b92b80b69f4dddc90b19bc90538e049fee
Merge: 990b13c 0493f93
Author: Courage Angeh <co...@gmail.com>
AuthorDate: Thu Sep 5 01:01:42 2019 -0400

    Merge pull request #1 from aasaru/perepare_docker_compose
    
    FINCN-165 Perepare docker compose scripts using official images

 .gitignore                                   |   1 +
 HEADER                                       |  16 ++
 LICENSE                                      | 201 +++++++++++++++++++++++
 NOTICE.txt                                   |   5 +
 README.md                                    |  48 +++++-
 docker-compose.yml                           | 230 +++++++++++++++++++++++++++
 env_variables                                |  15 ++
 external_tools/docker-compose.yml            |  71 +++++++++
 external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar | Bin 0 -> 65395 bytes
 9 files changed, 584 insertions(+), 3 deletions(-)


[fineract-cn-docker-compose] 44/44: Merge pull request #16 from aasaru/call_postman_scripts_from_integration_test

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit c1abb5954a7cbdc3de62021e4c603938511fe603
Merge: ecb02ef 2966e86
Author: aasaru <aa...@gmail.com>
AuthorDate: Fri Nov 22 15:07:15 2019 +0200

    Merge pull request #16 from aasaru/call_postman_scripts_from_integration_test
    
    Call postman scripts from integration test

 README.md                                          |    6 +
 integration_test.sh                                |   11 +-
 ...-Initial-Requests_PART1.postman_collection.json | 2693 ++++++++++++++++++++
 3 files changed, 2709 insertions(+), 1 deletion(-)


[fineract-cn-docker-compose] 02/44: FINCN-165 based on https://github.com/openMF/fineract-cn-containers create docker-compose files that use official Apache Docker images

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit a1d97145ecf12d94406b3ba6c8668e01803018d2
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Sep 4 15:27:13 2019 +0300

    FINCN-165 based on https://github.com/openMF/fineract-cn-containers create docker-compose files that use official Apache Docker images
---
 .gitignore                                   |   1 +
 HEADER                                       |  16 ++
 LICENSE                                      | 201 +++++++++++++++++++++++
 NOTICE.txt                                   |   5 +
 README.md                                    |  48 +++++-
 docker-compose.yml                           | 230 +++++++++++++++++++++++++++
 env_variables                                |  15 ++
 external_tools/docker-compose.yml            |  71 +++++++++
 external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar | Bin 0 -> 65395 bytes
 9 files changed, 584 insertions(+), 3 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4c49bd7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.env
diff --git a/HEADER b/HEADER
new file mode 100644
index 0000000..90705e0
--- /dev/null
+++ b/HEADER
@@ -0,0 +1,16 @@
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..100d215
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source identifier, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object identifier, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source identifier control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..4709188
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,5 @@
+Apache Fineract CN Docker Compose scripts
+Copyright [2017-2018] The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.md b/README.md
index db8df2b..0473442 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,49 @@
-# Fineract CN Docker Compose
-This project contains Docker Compose Scripts for running Fineract CN especially in Development.
+# Fineract CN Docker-Compose scripts
+
 
 ## Requirements
 - Docker
-- Docker Compose
+- Docker-compose
+
+## Perquisites
+
+### Generate .env file with RSA keys
+`java -cp external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env`
+
+This library is taken from [fineract-cn-lang](https://github.com/apache/fineract-cn-lang#generate-and-print-rsa-keys).
+If needed you can pull a fresh copy of it:
+
+`wget https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/lang/0.1.0-BUILD-SNAPSHOT/lang-0.1.0-BUILD-SNAPSHOT.jar lang-0.1.0-BUILD-SNAPSHOT.jar`
+
+### Add other environment variables to the end of the .env file
+`cat env_variables >> .env`
+
+If you run some service from localhost then you need to change the host parameter to 'localhost' of that service in .env file.
+
+## Procedure
+
+### Start external tools (database, cassandra, etc)
+```
+cd external-tools
+docker-compose up
+```
+
+### Choose the services you want to run
+In the docker-compose.yml (that resides in project root) comment out the services  you don't want to run.
+Running all services together consumes a lot of memory.
+
+
+### Start micro services
+
+In project root directory run:
+```
+docker-compose up
+```
+
+## TODO
+
+- Provision the web services
+- Adjust scripts for Kubernetes
 
+There are some scripts in [https://github.com/openMF/fineract-cn-containers](https://github.com/openMF/fineract-cn-containers)
+that have been developed in the past for this purpose.
diff --git a/docker-compose.yml b/docker-compose.yml
index e69de29..7ae1011 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -0,0 +1,230 @@
+version: '3'
+services:
+  provisioner-ms:
+    image: apache/fineract-cn-provisioner:latest
+    ports:
+      - "2020:2020"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cluster.pwd: ${CASSANDRA_CLUSTER_PASSWORD}
+      cassandra.cluster.user: ${CASSANDRA_CLUSTER_USER}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      custom.postgresql.host: ${POSTGRESQL_HOST}
+      custom.postgresql.user: ${POSTGRESQL_USER}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.initialclientid: ${SYSTEM_INITIAL_CLIENT_ID}
+      system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
+      system.privateKey.modulus: ${PRIVATE_KEY_MODULUS}
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: any
+        delay: 10s
+        max_attempts: 3
+    networks:
+      - external_tools_default
+
+  identity-ms:
+    image: apache/fineract-cn-identity:0.0.1-M.1 # TODO replace with latest
+    ports:
+      - "2021:2021"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cluster.pwd: ${CASSANDRA_CLUSTER_PASSWORD}
+      cassandra.cluster.user: ${CASSANDRA_CLUSTER_USER}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: any
+        delay: 10s
+        max_attempts: 3
+    networks:
+      - external_tools_default
+
+# HAS ERRORS:
+#  rhythm-ms:
+#    image: apache/fineract-cn-rhythm:latest
+#    environment:
+#      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+#      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+#      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+#      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+#      postgresql.host: ${POSTGRESQL_HOST}
+#      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+#      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+#      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+#      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+#    deploy:
+#      replicas: 1
+#      restart_policy:
+#        condition: on-failure
+#    networks:
+#      - external_tools_default
+
+
+  office-ms:
+    image: apache/fineract-cn-office:latest
+    ports:
+      - "2023:2023"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+      system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
+      system.privateKey.modulus: ${PRIVATE_KEY_MODULUS}
+    networks:
+      - external_tools_default
+
+  customer-ms:
+    image: apache/fineract-cn-customer:latest
+    ports:
+      - "2024:2024"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  ledger-ms:
+    ports:
+      - "2025:2025"
+    image: apache/fineract-cn-accounting:latest
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  portfolio-ms:
+    image: apache/fineract-cn-portfolio:latest
+    ports:
+      - "2026:2026"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  deposit-account-management-ms:
+    image: apache/fineract-cn-deposit-account-management:latest
+    ports:
+      - "2027:2027"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  teller-ms:
+    image: apache/fineract-cn-teller:latest
+    ports:
+      - "2028:2028"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  reporting-ms:
+    image: apache/fineract-cn-reporting:latest
+    ports:
+      - "2029:2029"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  payroll-ms:
+    image: apache/fineract-cn-payroll:latest
+    ports:
+      - "2031:2031"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+networks:
+  external_tools_default:
+    external:
+      name: external_tools_default
diff --git a/env_variables b/env_variables
new file mode 100644
index 0000000..16cc9ae
--- /dev/null
+++ b/env_variables
@@ -0,0 +1,15 @@
+ACTIVEMQ_BROKER_URL=tcp://activemq:61616
+CASSANDRA_CLUSTER_NAME=Datacenter1
+CASSANDRA_CLUSTER_PASSWORD=password
+CASSANDRA_CLUSTER_USER=cassandra
+CASSANDRA_CONTACT_POINTS=cassandra:9042
+EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE=http://localhost:8761/eureka
+EUREKA_INSTANCE_HOSTNAME=eureka
+MARIADB_HOST=mariadb
+MARIADB_PASSWORD=mysql
+MARIADB_USER=root
+POSTGRESQL_HOST=postgres
+POSTGRESQL_PORT=5432
+POSTGRESQL_USER=postgres
+RIBBON_EUREKA_SERVER=eureka:9090
+SYSTEM_INITIAL_CLIENT_ID=service-runner
diff --git a/external_tools/docker-compose.yml b/external_tools/docker-compose.yml
new file mode 100644
index 0000000..1f30a07
--- /dev/null
+++ b/external_tools/docker-compose.yml
@@ -0,0 +1,71 @@
+version: "3"
+services:
+  activemq:
+    image: rmohr/activemq:5.14.5
+    container_name: activemq
+    ports:
+      - "61616:61616"
+      - "8161:8161"
+    environment:
+      ACTIVEMQ_CONFIG_MINMEMORY: 512
+      ACTIVEMQ_CONFIG_MAXMEMORY: 1024
+    healthcheck:
+      test: curl -u admin:admin -s http://localhost:8161/admin || exit 1
+      interval: 1m
+      retries: 5
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: any
+        delay: 10s
+        max_attempts: 3
+
+  eureka:
+    image: anh3h/eureka-server:latest
+    container_name: eureka
+    ports:
+      - "8761:8761"
+    healthcheck:
+      test: curl -f http://localhost:8761 || exit 1
+      interval: 1m
+      retries: 5
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: any
+        delay: 10s
+        max_attempts: 3
+
+  postgres:
+    image: postgres:11
+    container_name: postgres
+    environment:
+      POSTGRES_USER: postgres
+      POSTGRES_PASSWORD: postgres
+    ports:
+      - "5432:5432"
+    volumes:
+      - postgres-volume:/var/lib/postgresql/data
+
+  cassandra:
+    image: cassandra:latest
+    container_name: cassandra
+    ports:
+      - "9042:9042"
+    healthcheck:
+      test: cqlsh ping -h localhost
+      interval: 1m
+      retries: 5
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: any
+        delay: 10s
+        max_attempts: 3
+    volumes:
+      - cassandra-volume:/var/lib/cassandra
+
+volumes:
+  cassandra-volume:
+  postgres-volume:
+
diff --git a/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar b/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar
new file mode 100644
index 0000000..42251a5
Binary files /dev/null and b/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar differ


[fineract-cn-docker-compose] 07/44: Add Fineract CN start-up script

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit a5e833a9568d497f3c0b77e03d0038b995d65dc3
Author: Anh3h <co...@gmail.com>
AuthorDate: Thu Sep 5 21:23:12 2019 -0400

    Add Fineract CN start-up script
---
 .gitignore                                   |   1 +
 README.md                                    |   5 +-
 docker-compose.yml                           |  73 +++++++++++++++++++++++----
 external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar | Bin 65395 -> 0 bytes
 start-up.sh                                  |  29 +++++++++++
 5 files changed, 96 insertions(+), 12 deletions(-)

diff --git a/.gitignore b/.gitignore
index 4c49bd7..d028ce2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
 .env
+*.jar
\ No newline at end of file
diff --git a/README.md b/README.md
index d212b5c..2c38ea2 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 # Fineract CN Docker-Compose scripts
-This project contains Docker Compose Scripts for running Fineract CN especially in Development.	
+This project contains Docker Compose Scripts for running Fineract CN especially in Development.
 
 ## Requirements
 - Docker
@@ -7,6 +7,9 @@ This project contains Docker Compose Scripts for running Fineract CN especially
 
 ## Perquisites
 
+### Start-up Fineract CN microservices using bash script
+ `bash start-up.sh`
+
 ### Generate .env file with RSA keys
 `java -cp external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env`
 
diff --git a/docker-compose.yml b/docker-compose.yml
index 7ae1011..af2648c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -30,7 +30,8 @@ services:
         delay: 10s
         max_attempts: 3
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.6
 
   identity-ms:
     image: apache/fineract-cn-identity:0.0.1-M.1 # TODO replace with latest
@@ -56,7 +57,8 @@ services:
         delay: 10s
         max_attempts: 3
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.7
 
 # HAS ERRORS:
 #  rhythm-ms:
@@ -76,7 +78,8 @@ services:
 #      restart_policy:
 #        condition: on-failure
 #    networks:
-#      - external_tools_default
+#        external_tools_default:
+#          ipv4_address: 172.16.238.8
 
 
   office-ms:
@@ -97,7 +100,8 @@ services:
       system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
       system.privateKey.modulus: ${PRIVATE_KEY_MODULUS}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.9
 
   customer-ms:
     image: apache/fineract-cn-customer:latest
@@ -115,7 +119,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.10
 
   ledger-ms:
     ports:
@@ -133,7 +138,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.11
 
   portfolio-ms:
     image: apache/fineract-cn-portfolio:latest
@@ -150,7 +156,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.12
 
   deposit-account-management-ms:
     image: apache/fineract-cn-deposit-account-management:latest
@@ -168,7 +175,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.13
 
   teller-ms:
     image: apache/fineract-cn-teller:latest
@@ -186,7 +194,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.14
 
   reporting-ms:
     image: apache/fineract-cn-reporting:latest
@@ -204,7 +213,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.15
 
   payroll-ms:
     image: apache/fineract-cn-payroll:latest
@@ -222,7 +232,48 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.16
+
+  group-ms:
+    image: apache/fineract-cn-group:latest
+    ports:
+      - "2032:2032"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      external_tools_default:
+        ipv4_address: 172.16.238.17
+
+  # Docker image is not yet available
+  # notification-ms:
+  #     image: apache/fineract-cn-notification:latest
+  #     ports:
+  #       - "2033:2033"
+  #     environment:
+  #       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+  #       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+  #       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+  #       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+  #       postgresql.host: ${POSTGRESQL_HOST}
+  #       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+  #       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+  #       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+  #       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+  #       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+  #     networks:
+  #       external_tools_default:
+  #         ipv4_address: 172.16.238.18
+
 
 networks:
   external_tools_default:
diff --git a/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar b/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar
deleted file mode 100644
index 42251a5..0000000
Binary files a/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar and /dev/null differ
diff --git a/start-up.sh b/start-up.sh
new file mode 100755
index 0000000..14a2fdf
--- /dev/null
+++ b/start-up.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+set -e
+
+echo "Createing docker service network"
+docker network create --driver=bridge --subnet=172.16.238.0/24 external_tools_default
+
+cd external_tools/
+docker-compose up -d
+cassandra_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cassandra)
+postgres_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' postgres)
+
+# #Test Cassandra and Postgres
+echo "Waiting for Cassandra and Postgres ..."
+while ! nc -z "${cassandra_ip}" 9042 ; do
+  sleep 1
+done
+while ! nc -z "${postgres_ip}" 5432 ; do
+  sleep 1
+done
+echo "Cassandra and Postgres are up and running..."
+cd ..
+
+echo "Starting up Fineract CN microservices..."
+wget https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/lang/0.1.0-BUILD-SNAPSHOT/lang-0.1.0-BUILD-SNAPSHOT.jar
+java -cp lang-0.1.0-BUILD-SNAPSHOT.jar org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env
+cat env_variables >> .env
+
+docker-compose up -d
+echo "Successfully started fineract services."


[fineract-cn-docker-compose] 03/44: FINCN-165 restore description

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 0493f9353de9ab9f8bfa2bd54e15ce99d496b58b
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Sep 4 15:28:49 2019 +0300

    FINCN-165 restore description
---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 0473442..d212b5c 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 # Fineract CN Docker-Compose scripts
-
+This project contains Docker Compose Scripts for running Fineract CN especially in Development.	
 
 ## Requirements
 - Docker


[fineract-cn-docker-compose] 26/44: add more checks

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 1575482dd05a12e6371cbc0200a7eb2994cd6847
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Oct 2 15:32:20 2019 +0300

    add more checks
---
 ...act-Cn-Initial-Requests.postman_collection.json | 179 ++++++++++++++++++++-
 1 file changed, 177 insertions(+), 2 deletions(-)

diff --git a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
index dc1de37..51d6707 100644
--- a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
+++ b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
@@ -519,6 +519,19 @@
 		},
 		{
 			"name": "04.000 Create rhythm-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "4d75f048-905b-41af-b767-4314d5e3a050",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -567,6 +580,19 @@
 		},
 		{
 			"name": "04.001 Assign rhythm-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "ba66d4b9-95a1-45de-9d59-d54308c72273",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "PUT",
 				"header": [
@@ -1985,6 +2011,7 @@
 						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"setTimeout(function(){}, [3000]);",
 							""
 						],
 						"type": "text/javascript"
@@ -2032,6 +2059,19 @@
 		},
 		{
 			"name": "05.2 Create Admin User mifos",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "9486d316-2aca-409a-88ff-f17770249dca",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -2094,6 +2134,16 @@
 						],
 						"type": "text/javascript"
 					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "f0680830-0535-4a81-9151-84e78309789c",
+						"exec": [
+							"var delay3seconds = setTimeout(function(){}, [3000]);"
+						],
+						"type": "text/javascript"
+					}
 				}
 			],
 			"request": {
@@ -2428,6 +2478,16 @@
 						],
 						"type": "text/javascript"
 					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "5e84b9b4-361a-4ab5-9ef7-1766a05d940e",
+						"exec": [
+							"var delay3seconds = setTimeout(function(){}, [3000]);"
+						],
+						"type": "text/javascript"
+					}
 				}
 			],
 			"request": {
@@ -2662,7 +2722,7 @@
 					"script": {
 						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
 						"exec": [
-							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							"",
 							"",
 							"",
@@ -2800,6 +2860,19 @@
 		},
 		{
 			"name": "07.1 Create INCOME ledgers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "6260a2d4-def6-40e4-a87e-38f3d01f16b3",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -2841,6 +2914,19 @@
 		},
 		{
 			"name": "07.2 Create EXPENSE Ledgers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "be1a9019-cb18-4084-802b-cc6169e0b091",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -2882,6 +2968,19 @@
 		},
 		{
 			"name": "07.3 Create ASSETS ledgers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "3585bd0e-9598-43e6-b678-645bd64855dd",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -2923,6 +3022,19 @@
 		},
 		{
 			"name": "07.4 Create LIABILITY ledgers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "708e63ea-73ac-4c20-a92d-915fba3135f6",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -2964,6 +3076,19 @@
 		},
 		{
 			"name": "07.5 Create EQUITY ledgers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "e240003c-12d2-492c-bf43-970ed16564d5",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -3644,7 +3769,7 @@
 			"response": []
 		},
 		{
-			"name": "11.2. Get customer products",
+			"name": "11.20. Get customer products",
 			"protocolProfileBehavior": {
 				"disableBodyPruning": true
 			},
@@ -3694,6 +3819,56 @@
 			"response": []
 		},
 		{
+			"name": "11.21. Get member1 products",
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances?customer=member1",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances"
+					],
+					"query": [
+						{
+							"key": "customer",
+							"value": "member1"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
 			"name": "11.3 Get customer address",
 			"protocolProfileBehavior": {
 				"disableBodyPruning": true


[fineract-cn-docker-compose] 10/44: FINCN-165 fix service names in postman scripts

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit fb93b291b1db715361c0f0ede75eb7dfe6f1532e
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Sep 11 13:48:31 2019 +0300

    FINCN-165 fix service names in postman scripts
---
 README.md                                                    |  9 +++++++--
 .../Fineract-Cn-Initial-Requests.postman_collection.json     | 12 ++++++------
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/README.md b/README.md
index c0573e9..f049eb4 100644
--- a/README.md
+++ b/README.md
@@ -123,19 +123,24 @@ Postman scripts use service names (postgres, provisioner-ms, etc) when refering
 If you want to use the same Postman scripts when running micro services locally then add into your hosts (/etc/hosts in Unix) file:
 
 ```
+127.0.0.1 postgres
+127.0.0.1 cassandra
 127.0.0.1 provisioner-ms
 127.0.0.1 identity-ms
+127.0.0.1 rhythm-ms
 127.0.0.1 office-ms
 127.0.0.1 customer-ms
-127.0.0.1 portfolio-ms
 127.0.0.1 accounting-ms
+127.0.0.1 portfolio-ms
 127.0.0.1 deposit-account-management-ms
 127.0.0.1 teller-ms
 127.0.0.1 reporting-ms
 127.0.0.1 cheques-ms
 127.0.0.1 payroll-ms
 127.0.0.1 group-ms
-127.0.0.1 postgres
+127.0.0.1 notifications-ms
+127.0.0.1 fims-web-app
+
 ```
 
 ### How to reset everything and start from scratch
diff --git a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
index be8eac2..02895ba 100644
--- a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
+++ b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
@@ -86,7 +86,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"identifier\": \"{{tenantIdentifier}}\",\n\t\"name\": \"Playground\",\n\t\"description\": \"Sample tenant for demonstrating Fineract-CN functionality\",\n\t\"cassandraConnectionInfo\": {\n\t\t\"clusterName\": \"Datacenter1\",\n\t\t\"contactPoints\": \"127.0.0.1:9042\",\n\t\t\"keyspace\": \"playground\",\n\t\t\"replicationType\": \"Simple\",\n\t\t\"replicas\": \"1\"\n\t},\n\t\"databaseConnectionInfo\": {\n\t\t\"driverClass\": \"org.mariadb.jdbc.Driver\",\n\t\t\"database [...]
+					"raw": "{\n\t\"identifier\": \"{{tenantIdentifier}}\",\n\t\"name\": \"Playground\",\n\t\"description\": \"Sample tenant for demonstrating Fineract-CN functionality\",\n\t\"cassandraConnectionInfo\": {\n\t\t\"clusterName\": \"Datacenter1\",\n\t\t\"contactPoints\": \"cassandra:9042\",\n\t\t\"keyspace\": \"playground\",\n\t\t\"replicationType\": \"Simple\",\n\t\t\"replicas\": \"1\"\n\t},\n\t\"databaseConnectionInfo\": {\n\t\t\"driverClass\": \"org.postgresql.Driver\",\n\t\t\"databaseNa [...]
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants",
@@ -129,7 +129,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"identity-v1\",\n\t\"description\": \"Identity Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2021/identity/v1\"\n}"
+					"raw": "{\n\t\"name\": \"identity-v1\",\n\t\"description\": \"Identity Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://identity-ms:2021/identity/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -461,7 +461,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"office-v1\",\n\t\"description\": \"Office Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2023/office/v1\"\n}"
+					"raw": "{\n\t\"name\": \"office-v1\",\n\t\"description\": \"Office Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://office-ms:2023/office/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -545,7 +545,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"customer-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2024/customer/v1\"\n}"
+					"raw": "{\n\t\"name\": \"customer-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://customer-ms:2024/customer/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -629,7 +629,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"accounting-v1\",\n\t\"description\": \"Accounting Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2025/accounting/v1\"\n}"
+					"raw": "{\n\t\"name\": \"accounting-v1\",\n\t\"description\": \"Accounting Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://accounting-ms:2025/accounting/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -713,7 +713,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"deposit-v1\",\n\t\"description\": \"Deposit Management Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2026/deposit/v1\"\n}"
+					"raw": "{\n\t\"name\": \"deposit-v1\",\n\t\"description\": \"Deposit Management Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://deposit-account-management-ms:2027/deposit/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",


[fineract-cn-docker-compose] 27/44: Merge pull request #9 from aasaru/fix_typos_in_postman_scripts

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit dca74d0dc70853b6f853e3e7c24147bcac3eb296
Merge: 0aab6f8 1575482
Author: aasaru <aa...@gmail.com>
AuthorDate: Wed Oct 2 15:32:41 2019 +0300

    Merge pull request #9 from aasaru/fix_typos_in_postman_scripts
    
    Fix typos in postman scripts, add all conf parameters to docker-compose.yml, update readme

 README.md                                          |  21 ++-
 docker-compose.yml                                 | 131 ++++++---------
 env_variables                                      |   1 +
 external_tools/docker-compose.yml                  |  16 +-
 ...act-Cn-Initial-Requests.postman_collection.json | 187 ++++++++++++++++++++-
 5 files changed, 250 insertions(+), 106 deletions(-)


[fineract-cn-docker-compose] 06/44: update Readme

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 4cadf2c9edf29a3d11e1773d1ea5f189edb43ba6
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Thu Sep 5 17:18:44 2019 +0300

    update Readme
---
 README.md | 32 ++++++++++++++++++--------------
 1 file changed, 18 insertions(+), 14 deletions(-)

diff --git a/README.md b/README.md
index f418afc..c516bb1 100644
--- a/README.md
+++ b/README.md
@@ -11,14 +11,14 @@ This project contains Docker Compose Scripts for running Fineract CN especially
 `java -cp external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env`
 
 This library is taken from [fineract-cn-lang](https://github.com/apache/fineract-cn-lang#generate-and-print-rsa-keys).
-If needed you can pull a fresh copy of it:
 
-`wget https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/lang/0.1.0-BUILD-SNAPSHOT/lang-0.1.0-BUILD-SNAPSHOT.jar lang-0.1.0-BUILD-SNAPSHOT.jar`
+If needed you can pull a fresh copy of it:
+`wget https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/lang/0.1.0-BUILD-SNAPSHOT/lang-0.1.0-BUILD-SNAPSHOT.jar external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar`
 
 ### Add other environment variables to the end of the .env file
 `cat env_variables >> .env`
 
-If you run some service from localhost then you need to change the host parameter to 'localhost' of that service in .env file.
+If you run some service from localhost then [add these services to your hosts file](#use-the-postman-scripts-when-running-locally).
 
 ## Procedure
 
@@ -28,27 +28,26 @@ cd external-tools
 docker-compose up
 ```
 
-### Choose the services you want to run
-In the docker-compose.yml (that resides in project root) there are more than 10 services defined.
-Running all services together consumes a lot of memory.
-
-
 ### Start micro services
 First only start provisioner-ms by running following in project root:
 
 ```
 docker-compose up provisioner-ms 
 ```
+after it has started (and created table seshat to postgres) stop it.
+This is just to make sure provisioner gets to create the database the other services require.
 
-after it has started (and created table seshat to postgres) stop it and start a subset of services.
-
-For example you could start the following micro services and an fims-web-app
+### Choose the services you want to run
+In the docker-compose.yml (that resides in project root) there are more than 10 services defined.
+Running all services together consumes a lot of memory. So you can start a subset of services.
 
+For example you could start the following micro services and an fims-web-app:
 ```
 docker-compose up provisioner-ms identity-ms office-ms customer-ms accounting-ms fims-web-app
 ```
-If you want you can add other micro services (listed in docker-compose.yml) to the list, for example
- you could also add deposit-account-management-ms
+
+If you want you can add other micro services (listed in docker-compose.yml) to the list.
+For example you could also start `deposit-account-management-ms`
 
 # Provision
 
@@ -69,7 +68,6 @@ Initialize Postman as follows:
 4. Select the environment "Fineract-Cn-Initial-Setup-Environment" in the environment drop-down (top right corner in Postman).
 5. Execute the requests one by one by selecting them in the collection and then pressing "Send".
 
-
 The first request will retrieve a token. The response should look like this, with a different token:
 
 ```
@@ -154,3 +152,9 @@ docker-compose up
 
 There are some scripts in [https://github.com/openMF/fineract-cn-containers](https://github.com/openMF/fineract-cn-containers)
 that have been developed in the past for this purpose.
+
+## References
+
+Derived from [https://github.com/vishwasbabu/ProvisioningFineractCN](https://github.com/vishwasbabu/ProvisioningFineractCN) ,
+[https://github.com/apache/fineract-cn-demo-server](https://github.com/apache/fineract-cn-demo-server)
+and [https://github.com/senacor/BankingInTheCloud-Fineract](https://github.com/apache/fineract-cn-demo-server).


[fineract-cn-docker-compose] 40/44: Merge branch 'master' into typo_fixes

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 74c156e4cdded7493458847c3273d2f85c943f7c
Merge: e44bb68 c09dd20
Author: aasaru <aa...@gmail.com>
AuthorDate: Wed Nov 20 08:57:16 2019 +0200

    Merge branch 'master' into typo_fixes

 bash_scripts/provision.sh | 17 ++++++++++-------
 docker-compose.yml        | 11 -----------
 env_variables             |  1 +
 3 files changed, 11 insertions(+), 18 deletions(-)

diff --cc env_variables
index cf9cc56,b3ebbb6..1acf940
--- a/env_variables
+++ b/env_variables
@@@ -15,7 -14,8 +15,8 @@@ POSTGRESQL_USER=postgre
  RIBBON_EUREKA_SERVER=eureka:9090
  SCHEDULER_USER_NAME=imhotep
  SYSTEM_INITIAL_CLIENT_ID=service-runner
 -SERVER_MAX_HTTP_HEADER_SIZE=16384
+ 
 +FIMS_WEB_APP_IP=172.16.238.19
  PROVISIONER_IP=172.16.238.20
  IDENTITY_IP=172.16.238.21
  RHYTHM_IP=172.16.238.22


[fineract-cn-docker-compose] 29/44: Merge pull request #10 from ochamber/master

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 3aa8bf93242dd505c5588f0e80a1c43b229610d6
Merge: dca74d0 a96faa7
Author: Awasum Yannick <aw...@apache.org>
AuthorDate: Fri Oct 11 10:13:07 2019 +0100

    Merge pull request #10 from ochamber/master
    
    Update README.md

 README.md | 1 +
 1 file changed, 1 insertion(+)


[fineract-cn-docker-compose] 35/44: Merge pull request #13 from aasaru/cleanup_volumes

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 1b85975b226ec0e134f41a1eddb81d0938c2c2df
Merge: f20039c 4f824d5
Author: aasaru <aa...@gmail.com>
AuthorDate: Mon Oct 21 11:36:05 2019 +0300

    Merge pull request #13 from aasaru/cleanup_volumes
    
    cleanup

 docker-compose.yml | 11 -----------
 1 file changed, 11 deletions(-)


[fineract-cn-docker-compose] 23/44: add all possible configuration parameters to docker-compose.yml script. update readme

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 610e8c5d9509f2e89b47c1a614adefa1d766b069
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Oct 2 14:55:32 2019 +0300

    add all possible configuration parameters to docker-compose.yml script. update readme
---
 README.md          | 25 ++++++++++++++-----------
 docker-compose.yml | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 env_variables      |  1 +
 3 files changed, 65 insertions(+), 14 deletions(-)

diff --git a/README.md b/README.md
index 847739e..c4b3cfd 100644
--- a/README.md
+++ b/README.md
@@ -5,11 +5,13 @@ This project contains Docker Compose Scripts for running Fineract CN especially
 - Docker
 - Docker-compose
 
-## Deploy and provision Fineract CN
+# Deploy and provision Fineract CN
 
-You can either deploy and provision Fineract CN automatically using bash scripts or manually using postman.
+You can either deploy and provision Fineract CN automatically using bash scripts or manually using Postman.
+Postman is the preferred way as it is more tested and this way you understand better what is happening.
+Also this way you don't have to start all the micro services (helpful if your workstation is lacking resources).
 
-## 1. Deploy Fineract automtically using bash scripts
+# 1. Deploy and provision Fineract automtically using bash scripts
 
  - To start up all the Fineract CN services run:
 
@@ -63,14 +65,11 @@ Running all services together consumes a lot of memory. So you can start a subse
 
 For example you could start the following additional micro services and an fims-web-app:
 ```
-docker-compose up rhythm-ms identity-ms customer-ms accounting-ms deposit-ms portfolio-ms fims-web-app
+docker-compose up rhythm-ms identity-ms customer-ms accounting-ms deposit-ms portfolio-ms office-ms fims-web-app
 ```
 
 If you want you can add other micro services (listed in docker-compose.yml) to the list.
 
-
-# Provision
-
 ## Provisioning the Micro Services Using Postman
 
 We provide a postman-request-collection as well as a postman-environment that defines variables that are used to hold values received in responses.
@@ -116,7 +115,7 @@ docker-compose logs provisioner-ms
 2. Reach out to [mailing list](https://lists.apache.org/list.html?dev@fineract.apache.org) with the relevant details
 
 
-### Sign-in using fims-web-app
+# Sign-in using fims-web-app
 
 Prerequisites: Fineract-CN has been successfully provisioned by following the instructions in the previous sections
 User ```mifos``` is created in the the last two requests (user creation and role assignment) in the postman request-list.
@@ -133,7 +132,7 @@ password: password
 ```
 
 ### Use the Postman scripts when running locally
-Postman scripts use service names (postgres, provisioner-ms, etc) when refering to different services.
+Postman scripts use service names (postgres, provisioner-ms, etc) when referring to different services.
 If you want to use the same Postman scripts when running micro services locally then add into your hosts (/etc/hosts in Unix) file:
 
 ```
@@ -159,6 +158,8 @@ If you want to use the same Postman scripts when running micro services locally
 
 ### How to reset everything and start from scratch
 
+Run ./shut-down-and-reset.sh or
+
 ```
 cd external-tools
 docker-compose stop
@@ -168,10 +169,12 @@ docker volume rm external_tools_postgres-volume
 docker-compose up
 ```
 
+### Automating Postman scripts
+
+You can use [Newman](https://learning.getpostman.com/docs/postman/collection_runs/command_line_integration_with_newman/) to run Postman scripts from command line.
 
-## TODO
 
-- Provision the web services using a script
+## TODO
 - Adjust scripts for Kubernetes
 
 There are some scripts in [https://github.com/openMF/fineract-cn-containers](https://github.com/openMF/fineract-cn-containers)
diff --git a/docker-compose.yml b/docker-compose.yml
index a1e4bb5..cb72194 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -16,6 +16,8 @@ services:
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2020
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.initialclientid: ${SYSTEM_INITIAL_CLIENT_ID}
       system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
@@ -39,6 +41,10 @@ services:
     ports:
       - "2021:2021"
     environment:
+      bonecp.partitionCount: 1
+      bonecp.maxConnectionsPerPartition: 4
+      bonecp.minConnectionsPerPartition: 1
+      bonecp.acquireIncrement: 1
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
       cassandra.cluster.pwd: ${CASSANDRA_CLUSTER_PASSWORD}
       cassandra.cluster.user: ${CASSANDRA_CLUSTER_USER}
@@ -46,8 +52,11 @@ services:
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      identity.token.refresh.secureCookie: "false" # demoserver
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2021
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -69,15 +78,19 @@ services:
       - "2022:2022"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
+      rhythm.beatCheckRate: 600000
+      rhythm.user: ${SCHEDULER_USER_NAME}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2022
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
-      rhythm.beatCheckRate: 600000
     deploy:
       replicas: 1
       restart_policy:
@@ -85,7 +98,7 @@ services:
     networks:
       external_tools_default:
       fineract:
-          ipv4_address: ${RHYTHM_IP}
+        ipv4_address: ${RHYTHM_IP}
 
   office-ms:
     image: apache/fineract-cn-office:latest
@@ -93,11 +106,14 @@ services:
       - "2023:2023"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2023
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
@@ -115,12 +131,16 @@ services:
       - "2024:2024"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2024
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.initialclientid: ${SYSTEM_INITIAL_CLIENT_ID}
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -135,11 +155,14 @@ services:
     image: apache/fineract-cn-accounting:latest
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2025
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
@@ -155,6 +178,7 @@ services:
       - "2026:2026"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
@@ -162,6 +186,8 @@ services:
       custom.postgresql.user: ${POSTGRESQL_USER}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2026
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
@@ -177,11 +203,14 @@ services:
       - "2027:2027"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2027
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
@@ -197,11 +226,14 @@ services:
       - "2028:2028"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2028
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
@@ -217,11 +249,14 @@ services:
       - "2029:2029"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2029
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
@@ -237,11 +272,14 @@ services:
       - "2030:2030"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2030
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
@@ -257,11 +295,14 @@ services:
       - "2031:2031"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2031
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
@@ -277,11 +318,14 @@ services:
       - "2032:2032"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2032
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
@@ -294,14 +338,17 @@ services:
   notifications-ms:
     image: apache/fineract-cn-notifications:latest
     ports:
-     - "2033:2033"
+      - "2033:2033"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
+      server.port: 2033
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
diff --git a/env_variables b/env_variables
index 12b167a..b17564f 100644
--- a/env_variables
+++ b/env_variables
@@ -13,6 +13,7 @@ POSTGRESQL_PORT=5432
 POSTGRESQL_USER=postgres
 RIBBON_EUREKA_SERVER=eureka:9090
 SYSTEM_INITIAL_CLIENT_ID=service-runner
+SCHEDULER_USER_NAME=imhotep
 FIMS_WEB_APP_IP=172.16.238.19
 PROVISIONER_IP=172.16.238.20
 IDENTITY_IP=172.16.238.21


[fineract-cn-docker-compose] 05/44: add fims-web-app add Postman provisioning scripts taken from https://github.com/vishwasbabu/ProvisioningFineractCN rename ledger-ms to accounting-ms

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 252574ee0a8c540adee4d0917ae684f4720cefeb
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Thu Sep 5 17:10:44 2019 +0300

    add fims-web-app
    add Postman provisioning scripts taken from https://github.com/vishwasbabu/ProvisioningFineractCN
    rename ledger-ms to accounting-ms
---
 README.md                                          | 113 ++-
 docker-compose.yml                                 |  17 +-
 ...act-Cn-Initial-Requests.postman_collection.json | 872 +++++++++++++++++++++
 ...tial-Setup-Environment.postman_environment.json |  84 ++
 4 files changed, 1081 insertions(+), 5 deletions(-)

diff --git a/README.md b/README.md
index d212b5c..f418afc 100644
--- a/README.md
+++ b/README.md
@@ -29,20 +29,127 @@ docker-compose up
 ```
 
 ### Choose the services you want to run
-In the docker-compose.yml (that resides in project root) comment out the services  you don't want to run.
+In the docker-compose.yml (that resides in project root) there are more than 10 services defined.
 Running all services together consumes a lot of memory.
 
 
 ### Start micro services
+First only start provisioner-ms by running following in project root:
 
-In project root directory run:
 ```
+docker-compose up provisioner-ms 
+```
+
+after it has started (and created table seshat to postgres) stop it and start a subset of services.
+
+For example you could start the following micro services and an fims-web-app
+
+```
+docker-compose up provisioner-ms identity-ms office-ms customer-ms accounting-ms fims-web-app
+```
+If you want you can add other micro services (listed in docker-compose.yml) to the list, for example
+ you could also add deposit-account-management-ms
+
+# Provision
+
+## Provisioning the Micro Services Using Postman
+
+We provide a postman-request-collection as well as a postman-environment that defines variables that are used to hold values received in responses.
+Both files are located under [postman-initial-requests folder](postman_scripts):
+```
+postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
+postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
+```
+
+Initialize Postman as follows:
+
+1. Start Postman and load both files into Postman by clicking ```Import``` and then selecting the file.
+2. You will see the collection "Fineract-Cn-Initial-Requests" in the left sidebar.
+3. Open the collection by clicking on it.
+4. Select the environment "Fineract-Cn-Initial-Setup-Environment" in the environment drop-down (top right corner in Postman).
+5. Execute the requests one by one by selecting them in the collection and then pressing "Send".
+
+
+The first request will retrieve a token. The response should look like this, with a different token:
+
+```
+{
+    "token": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJhdWQiOiJwcm92aXNpb25lci12MSIsInN1YiI6IndlcGVtbmVmcmV0IiwiL21pZm9zLmlvL3NpZ25hdHVyZVRpbWVzdGFtcCI6IjIwMTctMDQtMThUMDlfNDRfMjIiLCIvbWlmb3MuaW8vdG9rZW5Db250ZW50IjoiUk9MRV9BRE1JTiIsImlzcyI6InN5c3RlbSIsImlhdCI6MTUwMDA1NjgxNywiZXhwIjoxNTAwNDE2ODE3fQ.OfxTUTStJbKQc4rAPW5PLIQYNjCG_uqcNPR4up6pIQBWLDxkgEiU9EF1WrB5NQdzXBJIHqjDFQpaVywm5DersIh4LxPGD3MZj3TqZK5_LUcZvBDTa4Xgb41e3xXkWB4TkN6KqfmiK12Ngjrrj7qZGBdtypDmFmZwKQRZIOL6T3QbI7LpbPGpeWjpWZirFgtcn5B1Z_h3r9r [...]
+    "accessTokenExpiration": "2019-07-18T22:26:57.784"
+}
+```
+
+If you don't get a token there is something wrong with your setup. The token is necessary for authentication in other requests thus be sure that this steps works.
+
+Important: Be sure to execute the requests in the right order! If you execute the requests that gives you the initial password (request "03.2 Create Identity Service for Tenant") twice you will not be able to retrieve the initial password again (due to the implementation of the identity service).
+If that happens the variable antonyUserPassword is empty (undefined) and you will not be able to sign in antony and change his password (03.3, 03.4).
+
+6. If you didn't start the micro service deposit-account-management-ms with docker-compose then
+you can assign deposits app to tenant (in step 07.1 and 07.2) but these services won't work.
+
+
+#### Debugging help
+
+1. Check if the micro services to which the requests are made are up and running.
+Check the container for details of failures (if any):
+
+docker-compose logs provisioner-ms
+
+
+2. Reach out to [mailing list](https://lists.apache.org/list.html?dev@fineract.apache.org) with the relevant details
+
+
+### Sign-in using fims-web-app
+
+Prerequisites: Fineract-CN has been successfully provisioned by following the instructions in the previous sections
+User ```mifos``` is created in the the last two requests (user creation and role assignment) in the postman request-list.
+This user has admin rights and is able to manage offices,customers and thier deposits.
+
+Navigate to http://localhost:8888 in your browser and enter the credentials of the user you want to sign in with.
+
+The following user-profile is available in fims-web-app after above setup was completed successfully:
+
+```
+tenant: playground
+user: mifos
+password: password
+```
+
+### Use the Postman scripts when running locally
+Postman scripts use service names (postgres, provisioner-ms, etc) when refering to different services.
+If you want to use the same Postman scripts when running micro services locally then add into your hosts (/etc/hosts in Unix) file:
+
+```
+127.0.0.1 provisioner-ms
+127.0.0.1 identity-ms
+127.0.0.1 office-ms
+127.0.0.1 customer-ms
+127.0.0.1 portfolio-ms
+127.0.0.1 accounting-ms
+127.0.0.1 deposit-account-management-ms
+127.0.0.1 teller-ms
+127.0.0.1 reporting-ms
+127.0.0.1 cheques-ms
+127.0.0.1 payroll-ms
+127.0.0.1 group-ms
+127.0.0.1 postgres
+```
+
+### How to reset everything and start from scratch
+
+```
+cd external-tools
+docker-compose stop
+docker-compose rm
+docker volume rm external_tools_cassandra-volume
+docker volume rm external_tools_postgres-volume
 docker-compose up
 ```
 
+
 ## TODO
 
-- Provision the web services
+- Provision the web services using a script
 - Adjust scripts for Kubernetes
 
 There are some scripts in [https://github.com/openMF/fineract-cn-containers](https://github.com/openMF/fineract-cn-containers)
diff --git a/docker-compose.yml b/docker-compose.yml
index 7ae1011..d110ee2 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -58,7 +58,7 @@ services:
     networks:
       - external_tools_default
 
-# HAS ERRORS:
+# TODO HAS ERRORS:
 #  rhythm-ms:
 #    image: apache/fineract-cn-rhythm:latest
 #    environment:
@@ -117,7 +117,7 @@ services:
     networks:
       - external_tools_default
 
-  ledger-ms:
+  accounting-ms:
     ports:
       - "2025:2025"
     image: apache/fineract-cn-accounting:latest
@@ -205,6 +205,9 @@ services:
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
       - external_tools_default
+#
+# TODO add checques-ms
+#
 
   payroll-ms:
     image: apache/fineract-cn-payroll:latest
@@ -223,6 +226,16 @@ services:
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
       - external_tools_default
+#
+# TODO group-ms
+#
+
+  fims-web-app:
+    image: aasaru/fineract-cn-fims-web-app:latest # TODO switch to apache repo
+    ports:
+      - "8888:8888"
+    networks:
+      - external_tools_default
 
 networks:
   external_tools_default:
diff --git a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
new file mode 100644
index 0000000..be8eac2
--- /dev/null
+++ b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
@@ -0,0 +1,872 @@
+{
+	"info": {
+		"_postman_id": "16b8ce24-0311-498b-b248-b91ddcc14b08",
+		"name": "Fineract-Initial-Requests",
+		"description": "Collection to initialize tenant",
+		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+	},
+	"item": [
+		{
+			"name": "01. Get token from system user",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "2a49d9a1-377c-4c03-90b8-1c285140de5a",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"rootUserToken\", jsonData.token);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [],
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/auth/token?grant_type=password&client_id={{client_id}}&username={{rootUser}}&password={{rootUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"auth",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "client_id",
+							"value": "{{client_id}}",
+							"description": "The initial Client Id used for starting service runner\n"
+						},
+						{
+							"key": "username",
+							"value": "{{rootUser}}",
+							"description": "Initial system user \"wepemnefret\"\n"
+						},
+						{
+							"key": "password",
+							"value": "{{rootUserPassword}}"
+						}
+					]
+				},
+				"description": "1. Get Token from System-User"
+			},
+			"response": []
+		},
+		{
+			"name": "02. Create first tenant",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"identifier\": \"{{tenantIdentifier}}\",\n\t\"name\": \"Playground\",\n\t\"description\": \"Sample tenant for demonstrating Fineract-CN functionality\",\n\t\"cassandraConnectionInfo\": {\n\t\t\"clusterName\": \"Datacenter1\",\n\t\t\"contactPoints\": \"127.0.0.1:9042\",\n\t\t\"keyspace\": \"playground\",\n\t\t\"replicationType\": \"Simple\",\n\t\t\"replicas\": \"1\"\n\t},\n\t\"databaseConnectionInfo\": {\n\t\t\"driverClass\": \"org.mariadb.jdbc.Driver\",\n\t\t\"database [...]
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.1 Create identity-v1 application",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}",
+						"type": "text",
+						"disabled": true
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"identity-v1\",\n\t\"description\": \"Identity Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2021/identity/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.2 Assign Identity Manager for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "206c2d92-7c20-46e9-8079-ead0c0adbbe0",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyUserPassword\", jsonData.adminPassword);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"identity-v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/identityservice",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"identityservice"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.3 Login Antony",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"type": "text/javascript",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						]
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=antony&password={{antonyUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "antony"
+						},
+						{
+							"key": "password",
+							"value": "{{antonyUserPassword}}"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.4 Change Antony Password",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"type": "text/javascript",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"",
+							"postman.setEnvironmentVariable(\"antonyUserPassword\", \"dGVzdA==\");",
+							"",
+							"",
+							""
+						]
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"password\": \"dGVzdA==\"\n}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users/antony/password",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users",
+						"antony",
+						"password"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.5 Login Antony with new password",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"type": "text/javascript",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						]
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username={{antonyUser}}&password={{antonyUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "{{antonyUser}}"
+						},
+						{
+							"key": "password",
+							"value": "{{antonyUserPassword}}"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.6 Assign Identity for Tenant",
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"identity-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/s{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"s{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.1 Create office-v1 application",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"office-v1\",\n\t\"description\": \"Office Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2023/office/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.2 Assign Office for Tenant",
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"office-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.1 Create customer-v1 application",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"customer-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2024/customer/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.2 Assign customer for Tenant",
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"customer-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.1 Create accounting-v1 application",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"accounting-v1\",\n\t\"description\": \"Accounting Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2025/accounting/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.2 Assign accounting for Tenant",
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"accounting-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.1 Create deposit-v1 application",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"deposit-v1\",\n\t\"description\": \"Deposit Management Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2026/deposit/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.2 Assign deposits for Tenant",
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"deposit-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "08.1 Create Admin Role for tenant \"playground\"",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\"identifier\":\"administrator\",\"permissions\":[{\"permittableEndpointGroupIdentifier\":\"identity__v1__roles\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"identity__v1__self\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"office__v1__employees\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"customer__v1__task\",\"al [...]
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/roles",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"roles"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "08.2 Create Admin User",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"identifier\": \"mifos\",\n\t\"role\": \"administrator\",\n\t\"password\": \"cGFzc3dvcmQ=\"\n}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users"
+					]
+				}
+			},
+			"response": []
+		}
+	]
+}
diff --git a/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json b/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
new file mode 100644
index 0000000..ee13692
--- /dev/null
+++ b/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
@@ -0,0 +1,84 @@
+{
+	"id": "91c46e16-2e81-441f-af81-349ca02d2052",
+	"name": "Fineract-Cn-Initial-Setup-Environment",
+	"values": [
+		{
+			"key": "host",
+			"value": "localhost",
+			"enabled": true
+		},
+		{
+			"key": "tenantIdentifier",
+			"value": "playground",
+			"enabled": true
+		},
+		{
+			"key": "user",
+			"value": "superuser",
+			"enabled": true
+		},
+		{
+			"key": "accessToken",
+			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJzdXBlcnVzZXIiLCIvbWlmb3MuaW8vc2lnbmF0dXJlVGltZXN0YW1wIjoiMjAxNy0wNC0yNlQwN18yNl8xMyIsIi9taWZvcy5pby90b2tlbkNvbnRlbnQiOiJ7XCJ0b2tlblBlcm1pc3Npb25zXCI6W3tcInBhdGhcIjpcInBvcnRmb2xpby12MS9wcm9kdWN0cy8qL2NoYXJnZXNcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiQ0hBTkdFXCJdfSx7XCJwYXRoXCI6XCJpZGVudGl0eS12MS9hcHBsaWNhdGlvbnMvKi9wZXJtaXNzaW9ucy8qL3VzZXJzL3t1c2VyaWRlbnRpZmllcn0vZW5hYmxlZFwiLFwiYWxsb3dlZE9wZXJhdGlvbnNcIjpbXCJSRUFEXCJdfSx7XCJwYXRoXCI6XCJpZGV [...]
+			"enabled": true
+		},
+		{
+			"key": "rootUser",
+			"value": "wepemnefret",
+			"enabled": true
+		},
+		{
+			"key": "rootUserToken",
+			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJhdWQiOiJwcm92aXNpb25lci12MSIsInN1YiI6IndlcGVtbmVmcmV0IiwiL2ZpbmNuLmFwYWNoZS5vcmcvcyI6IjIwMTktMDktMDRUMDZfNDNfNTIiLCIvZmluY24uYXBhY2hlLm9yZy9jIjoiUk9MRV9BRE1JTiIsImlzcyI6InN5c3RlbSIsImlhdCI6MTU2NzY5MDcxOSwiZXhwIjoxNTY3Njk0MzE5fQ.mG4Hs3IkU0_lHzazEidYU3EbVoHxmVhF3mBKWsnsLktE4PUnFjkfkP201RLypUzUTFTR4jp8ytDryOZQi-Cqku1BeRv8zQihJNFNL5khpmLnDKmelffE4BmM6t3wPsXSLke9orTL6HQEgNELcR03UhihGp_JvPYVQ5uzcSKcv1uG5U0IDZdKMAfvCdeu7uS5mV_H6tHnPjChbGcfPdB6wtk-4d7O [...]
+			"enabled": true
+		},
+		{
+			"key": "antonyUser",
+			"value": "antony",
+			"enabled": true
+		},
+		{
+			"key": "antonyToken",
+			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJhbnRvbnkiLCIvZmluY24uYXBhY2hlLm9yZy9zIjoiMjAxOS0wOS0wNVQxM18zOV80NiIsIi9maW5jbi5hcGFjaGUub3JnL2MiOiJ7XCJ0b2tlblBlcm1pc3Npb25zXCI6W3tcInBhdGhcIjpcImlkZW50aXR5LXYxL3VzZXJzL3t1c2VyaWRlbnRpZmllcn0vcGFzc3dvcmRcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiQ0hBTkdFXCIsXCJSRUFEXCIsXCJERUxFVEVcIl19LHtcInBhdGhcIjpcImlkZW50aXR5LXYxL3JvbGVzLypcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiQ0hBTkdFXCIsXCJSRUFEXCIsXCJERUxFVEVcIl19LHtcInBhdGhcIjpcImlkZW50aXR5LXYxL3VzZXJ [...]
+			"enabled": true
+		},
+		{
+			"key": "client_id",
+			"value": "service-runner",
+			"enabled": true
+		},
+		{
+			"key": "rootUserPassword",
+			"value": "oS/0IiAME/2unkN1momDrhAdNKOhGykYFH/mJN20",
+			"enabled": true
+		},
+		{
+			"key": "provisionerUrl",
+			"value": "provisioner-ms:2020",
+			"enabled": true
+		},
+		{
+			"key": "identityUrl",
+			"value": "identity-ms:2021",
+			"enabled": true
+		},
+		{
+			"key": "webappUrl",
+			"value": "localhost:8888",
+			"enabled": true
+		},
+		{
+			"key": "accountingUrl",
+			"value": "accounting-ms:2025",
+			"enabled": true
+		},
+		{
+			"key": "antonyUserPassword",
+			"value": "dGVzdA==",
+			"enabled": true
+		}
+	],
+	"_postman_variable_scope": "environment",
+	"_postman_exported_at": "2019-09-05T13:50:13.901Z",
+	"_postman_exported_using": "Postman/7.5.0"
+}


[fineract-cn-docker-compose] 43/44: improve readme

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 2966e86584449547d19a2127c0ad6e8e593cb99b
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Fri Nov 22 15:06:36 2019 +0200

    improve readme
---
 README.md | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/README.md b/README.md
index d54c1cc..52f854e 100644
--- a/README.md
+++ b/README.md
@@ -179,6 +179,12 @@ docker volume rm external_tools_postgres-volume
 docker-compose up
 ```
 
+## Integration tests
+We have a shell script that verifies if the setup still works.
+For this install [Newman](https://learning.getpostman.com/docs/postman/collection_runs/command_line_integration_with_newman/) and 
+run the script ./integration_test.sh. It takes about 15minutes to complete.
+Beware that the script overwrites contents of .env file.
+
 ## Note:
 **These scripts are ideal for a docker swarm deployment environment. If you are to deploy Fineract CN using Docker swarm you will have remove the network configuration from the docker-compose script and implement a load balancer (using docker swarm) that reflects the network configuration you just removed from the compose file.**
 


[fineract-cn-docker-compose] 09/44: FINCN-165 fix subnet size and notifications-ms network and image

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 88e47680842c98ef489430da547409fdbea894a2
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Sep 11 12:40:58 2019 +0300

    FINCN-165 fix subnet size and notifications-ms network and image
---
 docker-compose.yml                | 7 ++++---
 env_variables                     | 2 +-
 external_tools/docker-compose.yml | 2 +-
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index 21717c7..d0c1a09 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -285,8 +285,8 @@ services:
       fineract:
         ipv4_address: ${GROUP_IP}
 
-  notification-ms:
-    image: apache/fineract-cn-notification:latest
+  notifications-ms:
+    image: aasaru/fineract-cn-notifications:latest # TODO switch to apache repo
     ports:
      - "2033:2033"
     environment:
@@ -302,7 +302,8 @@ services:
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
       external_tools_default:
-        ipv4_address: ${NOTIFICATION_IP}
+      fineract:
+        ipv4_address: ${NOTIFICATIONS_IP}
 
   fims-web-app:
     image: aasaru/fineract-cn-fims-web-app:latest # TODO switch to apache repo
diff --git a/env_variables b/env_variables
index 2613508..dcec372 100644
--- a/env_variables
+++ b/env_variables
@@ -27,4 +27,4 @@ REPORTING_IP=172.16.238.29
 CHEQUES_IP=172.16.238.30
 PAYROLL_IP_IP=172.16.238.31
 GROUP_IP=172.16.238.32
-NOTIFICATION_IP=172.16.238.33
+NOTIFICATIONS_IP=172.16.238.33
diff --git a/external_tools/docker-compose.yml b/external_tools/docker-compose.yml
index f6aec16..137ad0f 100644
--- a/external_tools/docker-compose.yml
+++ b/external_tools/docker-compose.yml
@@ -74,4 +74,4 @@ networks:
     driver: bridge
     ipam:
       config:
-        - subnet: 172.16.238.64/29
+        - subnet: 172.16.238.64/26


[fineract-cn-docker-compose] 30/44: Update README.md

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit f3571f4726a6f7a56ca1e946c16d82f675f64c0b
Author: ochamber <oc...@users.noreply.github.com>
AuthorDate: Mon Oct 14 14:12:52 2019 +0200

    Update README.md
    
    typo
---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 717a996..366220f 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ You can either deploy and provision Fineract CN automatically using bash scripts
 Postman is the preferred way as it is more tested and this way you understand better what is happening.
 Also this way you don't have to start all the micro services (helpful if your workstation is lacking resources).
 
-# 1. Deploy and provision Fineract automtically using bash scripts
+# 1. Deploy and provision Fineract automatically using bash scripts
 
  - To start up all the Fineract CN services run:
 


[fineract-cn-docker-compose] 28/44: Update README.md

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit a96faa73a04cae1adf818b678e2423b74d1d8240
Author: ochamber <oc...@users.noreply.github.com>
AuthorDate: Fri Oct 11 10:30:26 2019 +0200

    Update README.md
    
    Added Java in Req section
---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index 35a75c6..717a996 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,7 @@ This project contains Docker Compose Scripts for running Fineract CN especially
 ## Requirements
 - Docker
 - Docker-compose
+- Java
 
 # Deploy and provision Fineract CN
 


[fineract-cn-docker-compose] 32/44: improve Postman scripts

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit bedf03bd028f6abdbaba0495852e7992dbec8217
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Fri Oct 18 16:49:59 2019 +0300

    improve Postman scripts
---
 README.md                                          |   14 +-
 docker-compose.yml                                 |  310 +-
 env_variables                                      |   16 +-
 external_tools/docker-compose.yml                  |    6 +-
 ...act-Cn-Initial-Requests.postman_collection.json | 3079 +++++++++++++-------
 ...tial-Setup-Environment.postman_environment.json |   80 +-
 6 files changed, 2440 insertions(+), 1065 deletions(-)

diff --git a/README.md b/README.md
index 366220f..d54c1cc 100644
--- a/README.md
+++ b/README.md
@@ -66,14 +66,19 @@ Running all services together consumes a lot of memory. So you can start a subse
 
 For example you could start the following additional micro services and an fims-web-app:
 ```
-docker-compose up rhythm-ms identity-ms customer-ms accounting-ms deposit-ms portfolio-ms office-ms fims-web-app
+docker-compose up rhythm-ms identity-ms customer-ms accounting-ms deposit-ms portfolio-ms office-ms teller-ms fims-web-app
 ```
-
 If you want you can add other micro services (listed in docker-compose.yml) to the list.
 
+Wait for all the started services (except provisioner) to appear at [Eureka console](http://eureka:8761/).
 
 # Provision
 
+## Description of provisioning logic
+
+Provisioning logic is described briefly [here](https://cwiki.apache.org/confluence/display/FINERACT/Fineract+CN+demo-server).
+Instead demo_server we have Postman scripts and we use 'playground' as tenant name we want to provision.
+
 ## Provisioning the Micro Services Using Postman
 
 We provide a postman-request-collection as well as a postman-environment that defines variables that are used to hold values received in responses.
@@ -115,8 +120,9 @@ Check the container for details of failures (if any):
 
 docker-compose logs provisioner-ms
 
+2. Check that apps have registered with eureka: http://localhost:8761/
 
-2. Reach out to [mailing list](https://lists.apache.org/list.html?dev@fineract.apache.org) with the relevant details
+3. Reach out to [mailing list](https://lists.apache.org/list.html?dev@fineract.apache.org) with the relevant details
 
 
 # Sign-in using fims-web-app
@@ -174,7 +180,7 @@ docker-compose up
 ```
 
 ## Note:
-**These scripts are ideal for a docker swarm deployment environment. If you are to deploy Fineract CN using Docker swarm you will have remove the network configuration from the docker-compose script and implement a load balancer (using docker swarm) that reflects the network configuratioin you just removed from the compose file.**
+**These scripts are ideal for a docker swarm deployment environment. If you are to deploy Fineract CN using Docker swarm you will have remove the network configuration from the docker-compose script and implement a load balancer (using docker swarm) that reflects the network configuration you just removed from the compose file.**
 
 ### Automating Postman scripts
 You can use [Newman](https://learning.getpostman.com/docs/postman/collection_runs/command_line_integration_with_newman/) to run Postman scripts from command line.
diff --git a/docker-compose.yml b/docker-compose.yml
index cb72194..e5492f8 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -6,18 +6,35 @@ services:
       - "2020:2020"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      bonecp.acquireIncrement: 1
+      bonecp.maxConnectionsPerPartition: 4
+      bonecp.minConnectionsPerPartition: 1
+      bonecp.partitionCount: 1
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
       cassandra.cluster.pwd: ${CASSANDRA_CLUSTER_PASSWORD}
       cassandra.cluster.user: ${CASSANDRA_CLUSTER_USER}
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
-      custom.postgresql.host: ${POSTGRESQL_HOST}
-      custom.postgresql.user: ${POSTGRESQL_USER}
+      cassandra.keyspace: ${CASSANDRA_KEYSPACE}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: provisioner-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
+      postgresql.database: seshat
       postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2020
+      spring.application.name: provisioner-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.initialclientid: ${SYSTEM_INITIAL_CLIENT_ID}
       system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
@@ -31,6 +48,9 @@ services:
         condition: any
         delay: 10s
         max_attempts: 3
+    volumes:
+      - ./node_config:/etc/configs/:ro
+      - ./node_logs:/tmp/logs
     networks:
       external_tools_default:
       fineract:
@@ -41,22 +61,32 @@ services:
     ports:
       - "2021:2021"
     environment:
-      bonecp.partitionCount: 1
-      bonecp.maxConnectionsPerPartition: 4
-      bonecp.minConnectionsPerPartition: 1
-      bonecp.acquireIncrement: 1
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
       cassandra.cluster.pwd: ${CASSANDRA_CLUSTER_PASSWORD}
       cassandra.cluster.user: ${CASSANDRA_CLUSTER_USER}
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      cassandra.keyspace: ${CASSANDRA_KEYSPACE}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
-      identity.token.refresh.secureCookie: "false" # demoserver
+      eureka.instance.hostname: identity-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
+      identity.token.refresh.secureCookie: "false"
       postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2021
+      spring.application.name: identity-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -66,28 +96,54 @@ services:
         condition: any
         delay: 10s
         max_attempts: 3
+    volumes:
+      - ./node_config:/etc/configs/:ro
+      - ./node_logs:/tmp/logs
     networks:
       external_tools_default:
       fineract:
         ipv4_address: ${IDENTITY_IP}
 
-  # TODO this image has error: https://issues.apache.org/jira/browse/FINCN-177
   rhythm-ms:
     image: apache/fineract-cn-rhythm:latest
     ports:
       - "2022:2022"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      bonecp.acquireIncrement: 1
+      bonecp.maxConnectionsPerPartition: 4
+      bonecp.minConnectionsPerPartition: 1
+      bonecp.partitionCount: 1
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
+      cassandra.cluster.pwd: password
+      cassandra.cluster.user: cassandra
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      cassandra.keyspace: ${CASSANDRA_KEYSPACE}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: rhythm-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
+      postgresql.database: seshat
       postgresql.host: ${POSTGRESQL_HOST}
+      postgresql.password: postgres
+      postgresql.port: 5432
+      postgresql.user: postgres
       rhythm.beatCheckRate: 600000
       rhythm.user: ${SCHEDULER_USER_NAME}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2022
+      spring.application.name: rhythm-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -95,6 +151,9 @@ services:
       replicas: 1
       restart_policy:
         condition: on-failure
+    volumes:
+      - ./node_config:/etc/configs/:ro
+      - ./node_logs:/tmp/logs
     networks:
       external_tools_default:
       fineract:
@@ -106,15 +165,37 @@ services:
       - "2023:2023"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      bonecp.acquireIncrement: 1
+      bonecp.maxConnectionsPerPartition: 4
+      bonecp.minConnectionsPerPartition: 1
+      bonecp.partitionCount: 1
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
+      cassandra.cluster.pwd: password
+      cassandra.cluster.user: cassandra
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      cassandra.keyspace: ${CASSANDRA_KEYSPACE}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: office-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
+      postgresql.database: seshat
       postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2023
-      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      spring.application.name: office-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
+      system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
+      system.privateKey.modulus: ${PRIVATE_KEY_MODULUS}
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -131,16 +212,34 @@ services:
       - "2024:2024"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      bonecp.acquireIncrement: 1
+      bonecp.maxConnectionsPerPartition: 4
+      bonecp.minConnectionsPerPartition: 1
+      bonecp.partitionCount: 1
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
+      cassandra.cluster.pwd: password
+      cassandra.cluster.user: cassandra
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      cassandra.keyspace: ${CASSANDRA_KEYSPACE}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: customer-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
       postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2024
-      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
-      system.initialclientid: ${SYSTEM_INITIAL_CLIENT_ID}
+      spring.application.name: customer-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -155,15 +254,38 @@ services:
     image: apache/fineract-cn-accounting:latest
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      bonecp.acquireIncrement: 1
+      bonecp.maxConnectionsPerPartition: 4
+      bonecp.minConnectionsPerPartition: 1
+      bonecp.partitionCount: 1
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
+      cassandra.cluster.pwd: password
+      cassandra.cluster.user: cassandra
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      cassandra.keyspace: ${CASSANDRA_KEYSPACE}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: accounting-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
+      postgresql.database: seshat
       postgresql.host: ${POSTGRESQL_HOST}
+      postgresql.password: postgres
+      postgresql.port: 5432
+      postgresql.user: postgres
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2025
-      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      spring.application.name: accounting-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -178,17 +300,39 @@ services:
       - "2026:2026"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      bonecp.acquireIncrement: 1
+      bonecp.maxConnectionsPerPartition: 4
+      bonecp.minConnectionsPerPartition: 1
+      bonecp.partitionCount: 1
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
+      cassandra.cluster.pwd: password
+      cassandra.cluster.user: cassandra
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      cassandra.keyspace: ${CASSANDRA_KEYSPACE}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
-      custom.postgresql.host: ${POSTGRESQL_HOST}
-      custom.postgresql.user: ${POSTGRESQL_USER}
+      eureka.instance.hostname: portfolio-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
+      portfolio.bookLateFeesAndInterestAsUser: imhotep
+      postgresql.database: seshat
       postgresql.host: ${POSTGRESQL_HOST}
+      postgresql.password: postgres
+      postgresql.port: 5432
+      postgresql.user: postgres
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2026
-      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      spring.application.name: portfolio-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -203,15 +347,30 @@ services:
       - "2027:2027"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
+      cassandra.cluster.pwd: ${CASSANDRA_CLUSTER_PASSWORD}
+      cassandra.cluster.user: ${CASSANDRA_CLUSTER_USER}
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      cassandra.keyspace: ${CASSANDRA_KEYSPACE}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: deposit-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
       postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2027
-      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      spring.application.name: deposit-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -219,6 +378,8 @@ services:
       external_tools_default:
       fineract:
         ipv4_address: ${DEPOSIT_ACCOUNT_MANAGEMENT_IP}
+        aliases:
+          - deposit-account-management-ms
 
   teller-ms:
     image: apache/fineract-cn-teller:latest
@@ -226,15 +387,30 @@ services:
       - "2028:2028"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
+      cassandra.cluster.pwd: ${CASSANDRA_CLUSTER_PASSWORD}
+      cassandra.cluster.user: ${CASSANDRA_CLUSTER_USER}
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      cassandra.keyspace: ${CASSANDRA_KEYSPACE}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: teller-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
       postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2028
-      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      spring.application.name: teller-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -249,15 +425,27 @@ services:
       - "2029:2029"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: reporting-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
       postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2029
-      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      spring.application.name: reporting-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -272,15 +460,27 @@ services:
       - "2030:2030"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: cheques-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
       postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2030
-      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      spring.application.name: cheques-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -295,15 +495,27 @@ services:
       - "2031:2031"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: payroll-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
       postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2031
-      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      spring.application.name: payroll-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -318,15 +530,27 @@ services:
       - "2032:2032"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: group-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
       postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2032
-      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      spring.application.name: group-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
@@ -336,20 +560,32 @@ services:
         ipv4_address: ${GROUP_IP}
 
   notifications-ms:
-    image: apache/fineract-cn-notifications:latest
+    image: apache/fineract-cn-notifications:latestC
     ports:
       - "2033:2033"
     environment:
       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cl.delete: ONE
+      cassandra.cl.read: ONE
+      cassandra.cl.write: ONE
       cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.fetchRegistry: "true"
+      eureka.client.initialInstanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS}
+      eureka.client.instanceInfoReplicationIntervalSeconds: ${EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS}
       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
-      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      eureka.instance.hostname: notifications-ms
+      eureka.instance.leaseRenewalIntervalInSeconds: ${EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS}
+      eureka.registration.enabled: "true"
+      feign.hystrix.enabled: "false"
       postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.eureka.enabled: "true"
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
       server.max-http-header-size: ${SERVER_MAX_HTTP_HEADER_SIZE}
       server.port: 2033
-      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      spring.application.name: notifications-v1
+      spring.cloud.config.enabled: "false"
+      spring.cloud.discovery.enabled: "true"
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
diff --git a/env_variables b/env_variables
index b17564f..1ab0b3e 100644
--- a/env_variables
+++ b/env_variables
@@ -1,20 +1,20 @@
 ACTIVEMQ_BROKER_URL=tcp://activemq:61616
-CASSANDRA_CLUSTER_NAME=Datacenter1
+CASSANDRA_CLUSTER_NAME=datacenter1
 CASSANDRA_CLUSTER_PASSWORD=password
 CASSANDRA_CLUSTER_USER=cassandra
 CASSANDRA_CONTACT_POINTS=cassandra:9042
-EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE=http://localhost:8761/eureka
-EUREKA_INSTANCE_HOSTNAME=eureka
-MARIADB_HOST=mariadb
-MARIADB_PASSWORD=mysql
-MARIADB_USER=root
+CASSANDRA_KEYSPACE=seshat
+EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS=25
+EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS=20
+EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE=http://eureka:8761/eureka
+EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS=20
 POSTGRESQL_HOST=postgres
 POSTGRESQL_PORT=5432
 POSTGRESQL_USER=postgres
 RIBBON_EUREKA_SERVER=eureka:9090
-SYSTEM_INITIAL_CLIENT_ID=service-runner
 SCHEDULER_USER_NAME=imhotep
-FIMS_WEB_APP_IP=172.16.238.19
+SYSTEM_INITIAL_CLIENT_ID=service-runner
+
 PROVISIONER_IP=172.16.238.20
 IDENTITY_IP=172.16.238.21
 RHYTHM_IP=172.16.238.22
diff --git a/external_tools/docker-compose.yml b/external_tools/docker-compose.yml
index 010666d..3718df8 100644
--- a/external_tools/docker-compose.yml
+++ b/external_tools/docker-compose.yml
@@ -26,7 +26,7 @@ services:
     ports:
       - "8761:8761"
     healthcheck:
-      test: curl -f http://localhost:8761 || exit 1
+      test: curl -f http://eureka:8761 || exit 1
       interval: 1m
       retries: 5
     deploy:
@@ -52,12 +52,12 @@ services:
       - postgres-volume:/var/lib/postgresql/data
 
   cassandra:
-    image: cassandra:latest
+    image: cassandra:3.11
     container_name: cassandra
     ports:
       - "9042:9042"
     healthcheck:
-      test: cqlsh ping -h localhost
+      test: cqlsh ping -h cassandra
       interval: 1m
       retries: 5
     deploy:
diff --git a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
index 51d6707..452f7ea 100644
--- a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
+++ b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
@@ -7,7 +7,7 @@
 	},
 	"item": [
 		{
-			"name": "01. Get token from system user",
+			"name": "01. Log in root user",
 			"event": [
 				{
 					"listen": "test",
@@ -67,12 +67,33 @@
 			"response": []
 		},
 		{
-			"name": "02. Create first tenant",
+			"name": "NB! ONLY CREATE apps you have started",
+			"request": {
+				"method": "OPTIONS",
+				"header": [],
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/auth/token",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"auth",
+						"token"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "02.01 Create identity-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "0b18908b-f2d4-4ce4-a8ad-3d1c0652a1bc",
+						"id": "fb7299ef-04d4-4869-a25b-d1b523098c6d",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -97,11 +118,17 @@
 						"name": "Content-Type",
 						"value": "application/json",
 						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}",
+						"type": "text",
+						"disabled": true
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"identifier\": \"{{tenantIdentifier}}\",\n\t\"name\": \"Playground\",\n\t\"description\": \"Sample tenant for demonstrating Fineract-CN functionality\",\n\t\"cassandraConnectionInfo\": {\n\t\t\"clusterName\": \"Datacenter1\",\n\t\t\"contactPoints\": \"cassandra:9042\",\n\t\t\"keyspace\": \"playground\",\n\t\t\"replicationType\": \"Simple\",\n\t\t\"replicas\": \"1\"\n\t},\n\t\"databaseConnectionInfo\": {\n\t\t\"driverClass\": \"org.postgresql.Driver\",\n\t\t\"databaseNa [...]
+					"raw": "{\n\t\"name\": \"identity-v1\",\n\t\"description\": \"Identity Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{identityUrl}}/identity/v1\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -109,7 +136,7 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
 					"protocol": "http",
 					"host": [
 						"{{provisionerUrl}}"
@@ -117,19 +144,19 @@
 					"path": [
 						"provisioner",
 						"v1",
-						"tenants"
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "03.1 Create identity-v1 application",
+			"name": "02.02 Create rhythm-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "fb7299ef-04d4-4869-a25b-d1b523098c6d",
+						"id": "4d75f048-905b-41af-b767-4314d5e3a050",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -157,14 +184,12 @@
 					},
 					{
 						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}",
-						"type": "text",
-						"disabled": true
+						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"identity-v1\",\n\t\"description\": \"Identity Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{identityUrl}}/identity/v1\"\n}",
+					"raw": "{\n\t\"name\": \"rhythm-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{rhythmUrl}}/rhythm/v1\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -187,19 +212,14 @@
 			"response": []
 		},
 		{
-			"name": "03.2 Assign Identity Manager for Tenant and obtain Tenant Admin (user antony) Password",
+			"name": "02.03 Create office-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "206c2d92-7c20-46e9-8079-ead0c0adbbe0",
+						"id": "bc3eeb3d-961c-449b-87b9-99606d0511b3",
 						"exec": [
-							"tests[\"Status code is 200\"] = responseCode.code === 200;",
-							"",
-							"var jsonData = JSON.parse(responseBody);",
-							"postman.setEnvironmentVariable(\"antonyUserPassword\", jsonData.adminPassword);",
-							"",
-							"",
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
 						],
 						"type": "text/javascript"
@@ -219,9 +239,7 @@
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"value": "application/json"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -230,15 +248,10 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"identity-v1\"\n}",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "{\n\t\"name\": \"office-v1\",\n\t\"description\": \"Office Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{officeUrl}}/office/v1\"\n}"
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/identityservice",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
 					"protocol": "http",
 					"host": [
 						"{{provisionerUrl}}"
@@ -246,30 +259,24 @@
 					"path": [
 						"provisioner",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
-						"identityservice"
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "03.3 Login SuperAdmin (Antony)",
+			"name": "02.04 Create customer-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"type": "text/javascript",
+						"id": "8adf52e4-af8a-49c8-86fc-c3174e637283",
 						"exec": [
-							"tests[\"Status code is 200\"] = responseCode.code === 200;",
-							"",
-							"var jsonData = JSON.parse(responseBody);",
-							"postman.setEnvironmentVariable(\"antonyToken\", jsonData.accessToken);",
-							"",
-							"",
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
-						]
+						],
+						"type": "text/javascript"
 					}
 				}
 			],
@@ -277,60 +284,50 @@
 				"method": "POST",
 				"header": [
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
 					},
 					{
 						"key": "Content-Type",
 						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{}"
+					"raw": "{\n\t\"name\": \"customer-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{customerUrl}}/customer/v1\"\n}"
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=antony&password={{antonyUserPassword}}",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"token"
-					],
-					"query": [
-						{
-							"key": "grant_type",
-							"value": "password"
-						},
-						{
-							"key": "username",
-							"value": "antony"
-						},
-						{
-							"key": "password",
-							"value": "{{antonyUserPassword}}"
-						}
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "03.4 Change Antony Password",
+			"name": "02.05 Create accounting-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "4a97cc02-4f7f-4a0d-b805-5ec4af08f7b0",
+						"id": "6a24d7f4-0056-42e6-8d20-c7d3bd3dfd09",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
-							"",
-							"postman.setEnvironmentVariable(\"antonyUserPassword\", \"dGVzdA==\");",
-							"",
-							"",
 							""
 						],
 						"type": "text/javascript"
@@ -338,21 +335,19 @@
 				}
 			],
 			"request": {
-				"method": "PUT",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
-						"value": "{{antonyToken}}"
+						"value": "{{rootUserToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{antonyUser}}"
+						"value": "{{rootUser}}"
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"value": "application/json"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -361,44 +356,32 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"password\": \"dGVzdA==\"\n}",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "{\n\t\"name\": \"accounting-v1\",\n\t\"description\": \"Accounting Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{accountingUrl}}/accounting/v1\"\n}"
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/users/antony/password",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"users",
-						"antony",
-						"password"
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "03.5 Login Antony with new password",
+			"name": "02.06 Create portfolio-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "b3b88517-d738-461b-ba9a-f57e872dfcb2",
+						"id": "3efb77f8-9bc7-4835-87e8-b4ebfb7abd11",
 						"exec": [
-							"tests[\"Status code is 200\"] = responseCode.code === 200;",
-							"",
-							"var jsonData = JSON.parse(responseBody);",
-							"postman.setEnvironmentVariable(\"antonyToken\", jsonData.accessToken);",
-							"",
-							"",
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
 						],
 						"type": "text/javascript"
@@ -409,54 +392,55 @@
 				"method": "POST",
 				"header": [
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{}"
+					"raw": "{\n\t\"name\": \"portfolio-v1\",\n\t\"description\": \"Portfolio\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{portfolioUrl}}/portfolio/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username={{antonyUser}}&password={{antonyUserPassword}}",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"token"
-					],
-					"query": [
-						{
-							"key": "grant_type",
-							"value": "password"
-						},
-						{
-							"key": "username",
-							"value": "{{antonyUser}}"
-						},
-						{
-							"key": "password",
-							"value": "{{antonyUserPassword}}"
-						}
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "03.6 Assign Identity for Tenant",
+			"name": "02.07 Create deposit-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "66378bb5-bb0e-4374-8d4f-67c56b78eea5",
+						"id": "870693ae-6f50-4b8e-9920-fa45e184f732",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -466,7 +450,7 @@
 				}
 			],
 			"request": {
-				"method": "PUT",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
@@ -487,10 +471,10 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"identity-v1\"\n\t}\n]"
+					"raw": "{\n\t\"name\": \"deposit-v1\",\n\t\"description\": \"Deposit Management Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{depositUrl}}/deposit/v1\"\n}"
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
 					"protocol": "http",
 					"host": [
 						"{{provisionerUrl}}"
@@ -498,8 +482,6 @@
 					"path": [
 						"provisioner",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
 						"applications"
 					]
 				}
@@ -507,23 +489,12 @@
 			"response": []
 		},
 		{
-			"name": "ONLY CREATE AND ADD apps you have started",
-			"request": {
-				"method": "OPTIONS",
-				"header": [],
-				"url": {
-					"raw": ""
-				}
-			},
-			"response": []
-		},
-		{
-			"name": "04.000 Create rhythm-v1 application",
+			"name": "02.08 Create teller-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "4d75f048-905b-41af-b767-4314d5e3a050",
+						"id": "0dbc31fb-0e82-492a-aab8-f30e1fdad5a5",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -545,9 +516,7 @@
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"value": "application/json"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -556,12 +525,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"rhythm-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://rhythm-ms:2022/rhythm/v1\"\n}",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "{\n\t\"name\": \"teller-v1\",\n\t\"description\": \"Teller\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{tellerUrl}}/teller/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -579,12 +543,12 @@
 			"response": []
 		},
 		{
-			"name": "04.001 Assign rhythm-v1 for Tenant",
+			"name": "02.09 Create reporting-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "ba66d4b9-95a1-45de-9d59-d54308c72273",
+						"id": "b92b9efb-afcb-4c12-b3af-0b8ca07aaef0",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -594,7 +558,7 @@
 				}
 			],
 			"request": {
-				"method": "PUT",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
@@ -617,7 +581,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"rhythm-v1\"\n\t}\n]",
+					"raw": "{\n\t\"name\": \"reporting-v1\",\n\t\"description\": \"Reporting\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{reportingUrl}}/reporting/v1\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -625,7 +589,7 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
 					"protocol": "http",
 					"host": [
 						"{{provisionerUrl}}"
@@ -633,8 +597,6 @@
 					"path": [
 						"provisioner",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
 						"applications"
 					]
 				}
@@ -642,12 +604,12 @@
 			"response": []
 		},
 		{
-			"name": "04.010 Create office-v1 application",
+			"name": "02.10 Create cheques-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "bc3eeb3d-961c-449b-87b9-99606d0511b3",
+						"id": "c91e5040-28c4-4a87-9132-85c420c78efe",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -669,7 +631,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -678,7 +642,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"office-v1\",\n\t\"description\": \"Office Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://office-ms:2023/office/v1\"\n}"
+					"raw": "{\n\t\"name\": \"cheques-v1\",\n\t\"description\": \"Cheques\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{chequesUrl}}/cheques/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -696,12 +665,12 @@
 			"response": []
 		},
 		{
-			"name": "04.011 Assign office-v1 for Tenant",
+			"name": "02.11 Create payroll-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "7f3f5ba7-5b63-4a44-b491-12e0436c1056",
+						"id": "f2eb7045-4dae-4ad7-9a0c-fddc35d21436",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -711,7 +680,7 @@
 				}
 			],
 			"request": {
-				"method": "PUT",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
@@ -734,7 +703,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"office-v1\"\n\t}\n]",
+					"raw": "{\n\t\"name\": \"payroll-v1\",\n\t\"description\": \"Payroll\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{payrollUrl}}/payroll/v1\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -742,7 +711,7 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
 					"protocol": "http",
 					"host": [
 						"{{provisionerUrl}}"
@@ -750,8 +719,6 @@
 					"path": [
 						"provisioner",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
 						"applications"
 					]
 				}
@@ -759,12 +726,12 @@
 			"response": []
 		},
 		{
-			"name": "04.020 Create customer-v1 application",
+			"name": "02.12 Create group-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "8adf52e4-af8a-49c8-86fc-c3174e637283",
+						"id": "b533921d-e3f5-45f0-b035-f1d6395b4703",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -786,7 +753,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -795,7 +764,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"customer-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{customerUrl}}/customer/v1\"\n}"
+					"raw": "{\n\t\"name\": \"group-v1\",\n\t\"description\": \"Group\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{groupUrl}}/group/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -813,12 +787,12 @@
 			"response": []
 		},
 		{
-			"name": "04.021 Assign customer-v1 for Tenant",
+			"name": "02.13 Create notifications-v1 application",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "d5f166cb-0a4d-44e2-ab41-fde67c2d1af7",
+						"id": "cfd7c51f-0aac-4b9b-9048-c3ca60672ba0",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -828,7 +802,7 @@
 				}
 			],
 			"request": {
-				"method": "PUT",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
@@ -851,7 +825,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"customer-v1\"\n\t}\n]",
+					"raw": "{\n\t\"name\": \"notifications-v1\",\n\t\"description\": \"Notifications\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{notificationsUrl}}/notification/v1\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -859,7 +833,7 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
 					"protocol": "http",
 					"host": [
 						"{{provisionerUrl}}"
@@ -867,8 +841,6 @@
 					"path": [
 						"provisioner",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
 						"applications"
 					]
 				}
@@ -876,12 +848,12 @@
 			"response": []
 		},
 		{
-			"name": "04.030 Create accounting-v1 application",
+			"name": "03.1 Create first tenant 'playground'",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "6a24d7f4-0056-42e6-8d20-c7d3bd3dfd09",
+						"id": "0b18908b-f2d4-4ce4-a8ad-3d1c0652a1bc",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -903,19 +875,22 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
-					},
-					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"accounting-v1\",\n\t\"description\": \"Accounting Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{accountingUrl}}/accounting/v1\"\n}"
+					"raw": "{\n\t\"identifier\": \"{{tenantIdentifier}}\",\n\t\"name\": \"Playground\",\n\t\"description\": \"Sample tenant for demonstrating Fineract-CN functionality\",\n\t\"cassandraConnectionInfo\": {\n\t\t\"clusterName\": \"datacenter1\",\n\t\t\"contactPoints\": \"cassandra:9042\",\n\t\t\"keyspace\": \"playground\",\n\t\t\"replicationType\": \"Simple\",\n\t\t\"replicas\": \"1\"\n\t},\n\t\"databaseConnectionInfo\": {\n\t\t\"driverClass\": \"org.postgresql.Driver\",\n\t\t\"databaseNa [...]
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants",
 					"protocol": "http",
 					"host": [
 						"{{provisionerUrl}}"
@@ -923,21 +898,26 @@
 					"path": [
 						"provisioner",
 						"v1",
-						"applications"
+						"tenants"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.031 Assign accounting-v1 for Tenant",
+			"name": "03.2 Assign identity-v1 for Tenant and obtain Tenant Admin (user antony) Password",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "af1b9ac1-c66c-4353-b59b-ec3e1bea864c",
+						"id": "206c2d92-7c20-46e9-8079-ead0c0adbbe0",
 						"exec": [
-							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyUserPassword\", jsonData.adminPassword);",
+							"",
+							"",
 							""
 						],
 						"type": "text/javascript"
@@ -945,7 +925,7 @@
 				}
 			],
 			"request": {
-				"method": "PUT",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
@@ -968,7 +948,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"accounting-v1\"\n\t}\n]",
+					"raw": "{\n\t\"name\": \"identity-v1\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -976,7 +956,7 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/identityservice",
 					"protocol": "http",
 					"host": [
 						"{{provisionerUrl}}"
@@ -986,21 +966,26 @@
 						"v1",
 						"tenants",
 						"{{tenantIdentifier}}",
-						"applications"
+						"identityservice"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.040 Create portfolio-v1 application",
+			"name": "03.3 Login Antony (tenant superadmin) with obtained password",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "3efb77f8-9bc7-4835-87e8-b4ebfb7abd11",
+						"id": "b3b88517-d738-461b-ba9a-f57e872dfcb2",
 						"exec": [
-							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyToken\", jsonData.accessToken);",
+							"",
+							"",
 							""
 						],
 						"type": "text/javascript"
@@ -1011,61 +996,78 @@
 				"method": "POST",
 				"header": [
 					{
-						"key": "Authorization",
-						"value": "{{rootUserToken}}"
-					},
-					{
-						"key": "User",
-						"value": "{{rootUser}}"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
-					},
-					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"value": "application/json"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"portfolio-v1\",\n\t\"description\": \"Portfolio\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://portfolio-ms:2026/portfolio/v1\"\n}",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "{}"
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username={{antonyUser}}&password={{antonyUserPassword}}",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"applications"
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "{{antonyUser}}"
+						},
+						{
+							"key": "password",
+							"value": "{{antonyUserPassword}}"
+						}
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.041 Assign portfolio-v1 for Tenant",
+			"name": "03.4 Change Antony Password to 'antonyPassword'",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "ef7b5c59-1623-4183-8196-b76e30922713",
+						"id": "4a97cc02-4f7f-4a0d-b805-5ec4af08f7b0",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"",
+							"//postman.setEnvironmentVariable(\"antonyUserPassword\", \"dDNuNG50NGRtMW4=\");",
+							"",
+							"",
 							""
 						],
 						"type": "text/javascript"
 					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "eaa4397b-8b4a-4032-914a-2408cf82ea4b",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"antonyUserPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`antonyUserPassword as BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"antonyUserPassword\", base64);"
+						],
+						"type": "text/javascript"
+					}
 				}
 			],
 			"request": {
@@ -1073,17 +1075,17 @@
 				"header": [
 					{
 						"key": "Authorization",
-						"value": "{{rootUserToken}}"
+						"value": "{{antonyToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{rootUser}}"
+						"value": "{{antonyUser}}"
 					},
 					{
 						"key": "Content-Type",
 						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"type": "text",
+						"value": "application/json"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -1092,7 +1094,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"portfolio-v1\"\n\t}\n]",
+					"raw": "{\n\t\"password\": \"{{antonyUserPassword}}\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -1100,34 +1102,38 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/users/antony/password",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
-						"applications"
+						"users",
+						"antony",
+						"password"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.050 Create deposit-v1 application",
+			"name": "03.5 LOGIN ANTONY (tenant SuperAdmin) with pwd 'antonyPassword'",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "870693ae-6f50-4b8e-9920-fa45e184f732",
+						"type": "text/javascript",
 						"exec": [
-							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyToken\", jsonData.accessToken);",
+							"",
+							"",
 							""
-						],
-						"type": "text/javascript"
+						]
 					}
 				}
 			],
@@ -1135,48 +1141,54 @@
 				"method": "POST",
 				"header": [
 					{
-						"key": "Authorization",
-						"value": "{{rootUserToken}}"
-					},
-					{
-						"key": "User",
-						"value": "{{rootUser}}"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					},
 					{
 						"key": "Content-Type",
 						"value": "application/json"
-					},
-					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"deposit-v1\",\n\t\"description\": \"Deposit Management Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{depositUrl}}/deposit/v1\"\n}"
+					"raw": "{}"
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=antony&password={{antonyUserPassword}}",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"applications"
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "antony"
+						},
+						{
+							"key": "password",
+							"value": "{{antonyUserPassword}}"
+						}
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.051 Assign deposits for Tenant",
+			"name": "04.01 Assign rhythm-v1 for Tenant",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "8b4e42c3-5a2f-437d-8f2c-55a6d398f601",
+						"id": "ba66d4b9-95a1-45de-9d59-d54308c72273",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -1198,7 +1210,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -1207,7 +1221,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"deposit-v1\"\n\t}\n]"
+					"raw": "[\n\t{\n\t\t\"name\": \"rhythm-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
@@ -1227,12 +1246,12 @@
 			"response": []
 		},
 		{
-			"name": "04.060 Create teller-v1 application",
+			"name": "04.02 Assign office-v1 for Tenant",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "0dbc31fb-0e82-492a-aab8-f30e1fdad5a5",
+						"id": "7f3f5ba7-5b63-4a44-b491-12e0436c1056",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -1242,7 +1261,7 @@
 				}
 			],
 			"request": {
-				"method": "POST",
+				"method": "PUT",
 				"header": [
 					{
 						"key": "Authorization",
@@ -1254,7 +1273,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -1263,10 +1284,15 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"teller-v1\",\n\t\"description\": \"Teller\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://teller-ms:2028/teller/v1\"\n}"
+					"raw": "[\n\t{\n\t\t\"name\": \"office-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
 						"{{provisionerUrl}}"
@@ -1274,6 +1300,8 @@
 					"path": [
 						"provisioner",
 						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
 						"applications"
 					]
 				}
@@ -1281,12 +1309,12 @@
 			"response": []
 		},
 		{
-			"name": "04.061 Assign teller-v1 for Tenant",
+			"name": "04.03 Assign customer-v1 for Tenant",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "99d87103-9033-4dc9-aaef-b82aef6f8e3a",
+						"id": "d5f166cb-0a4d-44e2-ab41-fde67c2d1af7",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -1308,7 +1336,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -1317,7 +1347,12 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"teller-v1\"\n\t}\n]"
+					"raw": "[\n\t{\n\t\t\"name\": \"customer-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
@@ -1337,14 +1372,15 @@
 			"response": []
 		},
 		{
-			"name": "04.070 Create reporting-v1 application",
+			"name": "05.1 Create administrator role for tenant \"playground\"",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "b92b9efb-afcb-4c12-b3af-0b8ca07aaef0",
+						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"setTimeout(function(){}, [3000]);",
 							""
 						],
 						"type": "text/javascript"
@@ -1355,79 +1391,86 @@
 				"method": "POST",
 				"header": [
 					{
-						"key": "Authorization",
-						"value": "{{rootUserToken}}"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					},
 					{
 						"key": "User",
-						"value": "{{rootUser}}"
+						"value": "{{antonyUser}}"
 					},
 					{
-						"key": "Content-Type",
-						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
 					},
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Content-Type",
+						"value": "application/json"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"reporting-v1\",\n\t\"description\": \"Reporting\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://reporting-ms:2029/reporting/v1\"\n}",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "{\n  \"identifier\": \"administrator\",\n  \"permissions\": [\n    {\n      \"permittableEndpointGroupIdentifier\": \"accounting__v1__account\",\n      \"allowedOperations\": [\n        \"READ\",\n        \"CHANGE\",\n        \"DELETE\"\n      ]\n    },\n    {\n      \"permittableEndpointGroupIdentifier\": \"accounting__v1__fin_condition\",\n      \"allowedOperations\": [\n        \"READ\",\n        \"CHANGE\",\n        \"DELETE\"\n      ]\n    },\n    {\n      \"permittable [...]
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/roles",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"applications"
+						"roles"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.071 Assign reporting-v1 for Tenant",
+			"name": "05.2 Create Admin User operator with password 'initialPassword'",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "c0c31e05-7498-46c9-8063-7987327fa1fa",
+						"id": "9486d316-2aca-409a-88ff-f17770249dca",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
 						],
 						"type": "text/javascript"
 					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "115a549d-513d-46ef-b8af-f9be111bd55d",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"initialPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`operatorPassword in BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"adminUserPassword\", base64);"
+						],
+						"type": "text/javascript"
+					}
 				}
 			],
 			"request": {
-				"method": "PUT",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
-						"value": "{{rootUserToken}}"
+						"value": "{{antonyToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{rootUser}}"
+						"value": "{{antonyUser}}"
 					},
 					{
 						"key": "Content-Type",
 						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"type": "text",
+						"value": "application/json"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -1436,7 +1479,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"reporting-v1\"\n\t}\n]",
+					"raw": "{\n\t\"identifier\": \"operator\",\n\t\"role\": \"administrator\",\n\t\"password\": \"{{adminUserPassword}}\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -1444,35 +1487,50 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/users",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
-						"applications"
+						"users"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.080 Create cheques-v1 application",
+			"name": "05.3 Log in with initial password",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "c91e5040-28c4-4a87-9132-85c420c78efe",
+						"id": "90d180ba-a4a4-47ce-b018-94c75b0ebe65",
 						"exec": [
-							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"adminUserToken\", jsonData.accessToken);",
+							"",
+							"const moment = require('moment');",
+							"var timestamp = moment().format(\"YYYY-MM-DD\") + \"T\" + moment().format(\"HH:mm:ss\");",
+							"tests[\"initial password is expired\"] = jsonData.passwordExpiration < timestamp;",
 							""
 						],
 						"type": "text/javascript"
 					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "0f7bafa6-8124-42cc-b0a4-9571119a5fc8",
+						"exec": [
+							"var delay3seconds = setTimeout(function(){}, [3000]);"
+						],
+						"type": "text/javascript"
+					}
 				}
 			],
 			"request": {
@@ -1480,11 +1538,11 @@
 				"header": [
 					{
 						"key": "Authorization",
-						"value": "{{rootUserToken}}"
+						"value": "{{antonyToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{rootUser}}"
+						"value": "{{antonyUser}}"
 					},
 					{
 						"key": "Content-Type",
@@ -1499,7 +1557,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"cheques-v1\",\n\t\"description\": \"Cheques\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://cheques-ms:2030/cheques/v1\"\n}",
+					"raw": "{}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -1507,60 +1565,92 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=operator&password={{adminUserPassword}}",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"applications"
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "operator"
+						},
+						{
+							"key": "password",
+							"value": "{{adminUserPassword}}",
+							"description": "Initial password"
+						}
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.081 Assign cheques-v1 for Tenant",
+			"name": "05.4 Change user 'operator' password to 'operatorPassword'",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "e696bb1f-9582-4861-9009-2b9ede155c3b",
+						"id": "af5b9059-bf36-4715-acc2-25d272552590",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"",
 							""
 						],
 						"type": "text/javascript"
 					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "91312a48-c2bd-4ea4-b4e6-8c388aec99e9",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"operatorPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`operatorPassword in BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"adminUserPassword\", base64);"
+						],
+						"type": "text/javascript"
+					}
 				}
 			],
 			"request": {
 				"method": "PUT",
 				"header": [
 					{
-						"key": "Authorization",
-						"value": "{{rootUserToken}}"
-					},
-					{
-						"key": "User",
-						"value": "{{rootUser}}"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					},
 					{
 						"key": "Content-Type",
 						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"type": "text",
+						"value": "application/json"
 					},
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Authorization",
+						"type": "text",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"type": "text",
+						"value": "{{adminUser}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"cheques-v1\"\n\t}\n]",
+					"raw": "{\n  \"password\": \"{{adminUserPassword}}\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -1568,31 +1658,39 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/users/operator/password",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
-						"applications"
+						"users",
+						"operator",
+						"password"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.090 Create payroll-v1 application",
+			"name": "05.5 LOG IN TENANT ADMIN (operator)",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "f2eb7045-4dae-4ad7-9a0c-fddc35d21436",
+						"id": "c8802a96-df5a-4916-b6fb-e27b33c386e6",
 						"exec": [
-							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"adminUserToken\", jsonData.accessToken);",
+							"",
+							"const moment = require('moment');",
+							"var timestamp = moment().format(\"YYYY-MM-DD\") + \"T\" + moment().format(\"HH:mm:ss\");",
+							"tests[\"password is not expired\"] = jsonData.passwordExpiration > timestamp;",
+							"",
 							""
 						],
 						"type": "text/javascript"
@@ -1603,79 +1701,95 @@
 				"method": "POST",
 				"header": [
 					{
-						"key": "Authorization",
-						"value": "{{rootUserToken}}"
-					},
-					{
-						"key": "User",
-						"value": "{{rootUser}}"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
-					},
-					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"value": "application/json"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"payroll-v1\",\n\t\"description\": \"Payroll\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://payroll-ms:2031/payroll/v1\"\n}",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "{}"
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=operator&password={{adminUserPassword}}",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"applications"
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "operator"
+						},
+						{
+							"key": "password",
+							"value": "{{adminUserPassword}}"
+						}
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.091 Assign payroll-v1 for Tenant",
+			"name": "05.6 Pull operator permissions",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "1a0f8ef5-a7a1-47d4-b83c-92a7b7e4ffcb",
+						"id": "9486d316-2aca-409a-88ff-f17770249dca",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
 						],
 						"type": "text/javascript"
 					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "115a549d-513d-46ef-b8af-f9be111bd55d",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"operatorPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`operatorPassword in BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"adminUserPassword\", base64);"
+						],
+						"type": "text/javascript"
+					}
 				}
 			],
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
 			"request": {
-				"method": "PUT",
+				"method": "GET",
 				"header": [
 					{
 						"key": "Authorization",
-						"value": "{{rootUserToken}}"
+						"value": "{{adminUserToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{rootUser}}"
+						"value": "{{adminUser}}"
 					},
 					{
 						"key": "Content-Type",
 						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"type": "text",
+						"value": "application/json"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -1684,7 +1798,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"payroll-v1\"\n\t}\n]",
+					"raw": "",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -1692,29 +1806,29 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/users/operator/permissions",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
-						"applications"
+						"users",
+						"operator",
+						"permissions"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.100 Create group-v1 application",
+			"name": "06.1 Create Scheduler role for tenant playground",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "b533921d-e3f5-45f0-b035-f1d6395b4703",
+						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -1727,27 +1841,27 @@
 				"method": "POST",
 				"header": [
 					{
-						"key": "Authorization",
-						"value": "{{rootUserToken}}"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					},
 					{
 						"key": "User",
-						"value": "{{rootUser}}"
+						"value": "{{antonyUser}}"
 					},
 					{
-						"key": "Content-Type",
-						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
 					},
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"group-v1\",\n\t\"description\": \"Group\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://group-ms:2032/group/v1\"\n}",
+					"raw": "{\n  \"identifier\": \"scheduler\",\n  \"permissions\": [\n    {\n      \"permittableEndpointGroupIdentifier\": \"identity__v1__app_self\",\n      \"allowedOperations\": [\n        \"CHANGE\"\n      ]\n    },\n    {\n      \"permittableEndpointGroupIdentifier\": \"portfolio__v1__khepri\",\n      \"allowedOperations\": [\n        \"CHANGE\"\n      ]\n    }\n  ]\n}\n",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -1755,29 +1869,48 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/roles",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"applications"
+						"roles"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.101 Assign group-v1 for Tenant",
+			"name": "06.2 Create Scheduler user imhotep with password 'initialImhotepPassword'",
 			"event": [
 				{
+					"listen": "prerequest",
+					"script": {
+						"id": "3469215d-1ba4-4891-aa3f-e45e343ab4de",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"",
+							"//Encrypt",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"initialImhotepPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`imhotepPassword in BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"schedulerUserPassword\", base64);",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				},
+				{
 					"listen": "test",
 					"script": {
-						"id": "32caff55-23cb-498a-b17c-0444894662ad",
+						"id": "1cad925a-87b3-4ba2-af86-a4d499d68f22",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"setTimeout(function(){}, [3000]);",
 							""
 						],
 						"type": "text/javascript"
@@ -1785,21 +1918,21 @@
 				}
 			],
 			"request": {
-				"method": "PUT",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
-						"value": "{{rootUserToken}}"
+						"value": "{{antonyToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{rootUser}}"
+						"value": "{{antonyUser}}"
 					},
 					{
 						"key": "Content-Type",
 						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"type": "text",
+						"value": "application/json"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -1808,7 +1941,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"group-v1\"\n\t}\n]",
+					"raw": "{\n\t\"identifier\": \"imhotep\",\n\t\"role\": \"scheduler\",\n\t\"password\": \"{{schedulerUserPassword}}\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -1816,62 +1949,69 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/users",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
-						"applications"
+						"users"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.110 Create notifications-v1 application",
+			"name": "06.3 Login Scheduler user imhotep",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "cfd7c51f-0aac-4b9b-9048-c3ca60672ba0",
+						"id": "272b3e2a-f1b2-41da-aa5d-9e017555d6d2",
 						"exec": [
-							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"var jsonData = JSON.parse(responseBody);",
+							"",
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"tests[\"access token was returned \"] = jsonData.accessToken !== undefined;",
+							"",
+							"postman.setEnvironmentVariable(\"schedulerUserToken\", jsonData.accessToken);",
+							"",
+							"",
 							""
 						],
 						"type": "text/javascript"
 					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "dd4a949c-cf1e-4385-aa25-3cb53d39d56d",
+						"exec": [
+							"var delay3seconds = setTimeout(function(){}, [3000]);"
+						],
+						"type": "text/javascript"
+					}
 				}
 			],
 			"request": {
 				"method": "POST",
 				"header": [
 					{
-						"key": "Authorization",
-						"value": "{{rootUserToken}}"
-					},
-					{
-						"key": "User",
-						"value": "{{rootUser}}"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					},
 					{
 						"key": "Content-Type",
 						"name": "Content-Type",
 						"value": "application/json",
 						"type": "text"
-					},
-					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"notifications-v1\",\n\t\"description\": \"Notifications\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://notifications-ms:2033/notification/v1\"\n}",
+					"raw": "{}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -1879,29 +2019,64 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=imhotep&password={{schedulerUserPassword}}",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"applications"
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "imhotep"
+						},
+						{
+							"key": "password",
+							"value": "{{schedulerUserPassword}}"
+						}
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.111 Assign notifications-v1 for Tenant",
+			"name": "06.4 Change imhotep user password to 'imhotepPassword'",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "f755efce-b652-48f8-aefb-4cee875df904",
+						"id": "af5b9059-bf36-4715-acc2-25d272552590",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "0198f255-d555-4a77-8825-04c5bbd1c54d",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"",
+							"//Encrypt",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"imhotepPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`imhotepPassword in BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"schedulerUserPassword\", base64);",
+							"",
 							""
 						],
 						"type": "text/javascript"
@@ -1912,12 +2087,8 @@
 				"method": "PUT",
 				"header": [
 					{
-						"key": "Authorization",
-						"value": "{{rootUserToken}}"
-					},
-					{
-						"key": "User",
-						"value": "{{rootUser}}"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					},
 					{
 						"key": "Content-Type",
@@ -1926,13 +2097,19 @@
 						"type": "text"
 					},
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Authorization",
+						"value": "{{schedulerUserToken}}",
+						"type": "text"
+					},
+					{
+						"key": "User",
+						"value": "imhotep",
+						"type": "text"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "[\n\t{\n\t\t\"name\": \"notifications-v1\"\n\t}\n]",
+					"raw": "{\n  \"password\": \"{{schedulerUserPassword}}\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -1940,78 +2117,106 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/users/imhotep/password",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
-						"applications"
+						"users",
+						"imhotep",
+						"password"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "04.999 List tenant applications (Only returning one is a bug?)",
-			"protocolProfileBehavior": {
-				"disableBodyPruning": true
-			},
+			"name": "06.5 Login user imhotep (who has scheduler role)",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"schedulerUserToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
-				"method": "GET",
+				"method": "POST",
 				"header": [
 					{
-						"key": "Authorization",
-						"value": "{{rootUserToken}}"
-					},
-					{
-						"key": "User",
-						"value": "{{rootUser}}"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
-					},
-					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": ""
+					"raw": "{}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=imhotep&password={{schedulerUserPassword}}",
 					"protocol": "http",
 					"host": [
-						"{{provisionerUrl}}"
+						"{{identityUrl}}"
 					],
 					"path": [
-						"provisioner",
+						"identity",
 						"v1",
-						"tenants",
-						"{{tenantIdentifier}}",
-						"applications"
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "imhotep"
+						},
+						{
+							"key": "password",
+							"value": "{{schedulerUserPassword}}"
+						}
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "05.1 Create Admin Role for tenant \"playground\"",
+			"name": "06.6 enable permission identity__v1__app_self for imhotep",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
+						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
-							"setTimeout(function(){}, [3000]);",
+							"",
+							"",
+							"",
 							""
 						],
 						"type": "text/javascript"
@@ -2019,31 +2224,40 @@
 				}
 			],
 			"request": {
-				"method": "POST",
+				"method": "PUT",
 				"header": [
 					{
 						"key": "X-Tenant-Identifier",
 						"value": "{{tenantIdentifier}}"
 					},
 					{
-						"key": "User",
-						"value": "{{antonyUser}}"
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
 					},
 					{
-						"key": "Authorization",
-						"value": "{{antonyToken}}"
+						"key": "User",
+						"value": "imhotep",
+						"type": "text"
 					},
 					{
-						"key": "Content-Type",
-						"value": "application/json"
+						"key": "Authorization",
+						"value": "{{schedulerUserToken}}",
+						"type": "text"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\"identifier\":\"administrator\",\"permissions\":[{\"permittableEndpointGroupIdentifier\":\"identity__v1__roles\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"identity__v1__self\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"office__v1__employees\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"customer__v1__task\",\"al [...]
+					"raw": "true",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/roles",
+					"raw": "http://{{identityUrl}}/identity/v1/applications/rhythm-v1/permissions/identity__v1__app_self/users/imhotep/enabled",
 					"protocol": "http",
 					"host": [
 						"{{identityUrl}}"
@@ -2051,19 +2265,25 @@
 					"path": [
 						"identity",
 						"v1",
-						"roles"
+						"applications",
+						"rhythm-v1",
+						"permissions",
+						"identity__v1__app_self",
+						"users",
+						"imhotep",
+						"enabled"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "05.2 Create Admin User mifos",
+			"name": "07.01 Assign accounting-v1 for Tenant",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "9486d316-2aca-409a-88ff-f17770249dca",
+						"id": "af1b9ac1-c66c-4353-b59b-ec3e1bea864c",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -2073,15 +2293,15 @@
 				}
 			],
 			"request": {
-				"method": "POST",
+				"method": "PUT",
 				"header": [
 					{
 						"key": "Authorization",
-						"value": "{{antonyToken}}"
+						"value": "{{rootUserToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{antonyUser}}"
+						"value": "{{rootUser}}"
 					},
 					{
 						"key": "Content-Type",
@@ -2096,7 +2316,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"identifier\": \"mifos\",\n\t\"role\": \"administrator\",\n\t\"password\": \"{{adminUserPassword}}\"\n}",
+					"raw": "[\n\t{\n\t\t\"name\": \"accounting-v1\"\n\t}\n]",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -2104,58 +2324,47 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/users",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"users"
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "05.3 Log in with old password ('password')",
+			"name": "07.020 Assign portfolio-v1 for Tenant",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "d86648d2-e737-4eb5-9999-f0cb5f2557f7",
+						"id": "ef7b5c59-1623-4183-8196-b76e30922713",
 						"exec": [
-							"tests[\"Status code is 200\"] = responseCode.code === 200;",
-							"",
-							"var jsonData = JSON.parse(responseBody);",
-							"postman.setEnvironmentVariable(\"adminUserToken\", jsonData.accessToken);",
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
 						],
 						"type": "text/javascript"
 					}
-				},
-				{
-					"listen": "prerequest",
-					"script": {
-						"id": "f0680830-0535-4a81-9151-84e78309789c",
-						"exec": [
-							"var delay3seconds = setTimeout(function(){}, [3000]);"
-						],
-						"type": "text/javascript"
-					}
 				}
 			],
 			"request": {
-				"method": "POST",
+				"method": "PUT",
 				"header": [
 					{
 						"key": "Authorization",
-						"value": "{{antonyToken}}"
+						"value": "{{rootUserToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{antonyUser}}"
+						"value": "{{rootUser}}"
 					},
 					{
 						"key": "Content-Type",
@@ -2170,7 +2379,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"identifier\": \"mifos\",\n\t\"role\": \"administrator\",\n\t\"password\": \"cGFzc3dvcmQ=\"\n}",
+					"raw": "[\n\t{\n\t\t\"name\": \"portfolio-v1\"\n\t}\n]",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -2178,45 +2387,30 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=mifos&password={{adminUserPassword}}",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"token"
-					],
-					"query": [
-						{
-							"key": "grant_type",
-							"value": "password"
-						},
-						{
-							"key": "username",
-							"value": "mifos"
-						},
-						{
-							"key": "password",
-							"value": "{{adminUserPassword}}",
-							"description": "Initial password"
-						}
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "05.4 Change Admin user password (required on first login)",
+			"name": "07.021 WAIT FOR PORTFOLIO TO PROVISION (~1min)",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "af5b9059-bf36-4715-acc2-25d272552590",
+						"id": "ef7b5c59-1623-4183-8196-b76e30922713",
 						"exec": [
-							"tests[\"Status code is 202\"] = responseCode.code === 202;",
-							"",
 							""
 						],
 						"type": "text/javascript"
@@ -2224,32 +2418,22 @@
 				}
 			],
 			"request": {
-				"method": "PUT",
+				"method": "OPTIONS",
 				"header": [
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
-					},
-					{
 						"key": "Content-Type",
 						"name": "Content-Type",
 						"value": "application/json",
 						"type": "text"
 					},
 					{
-						"key": "Authorization",
-						"value": "{{adminUserToken}}",
-						"type": "text"
-					},
-					{
-						"key": "User",
-						"value": "{{adminUser}}",
-						"type": "text"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n  \"password\": \"{{adminUserPassword}}\"\n}",
+					"raw": "",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -2257,34 +2441,30 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/users/mifos/password",
+					"raw": "http://{{portfolioUrl}}/portfolio/v1/",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{portfolioUrl}}"
 					],
 					"path": [
-						"identity",
+						"portfolio",
 						"v1",
-						"users",
-						"mifos",
-						"password"
+						""
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "05.5 ADMIN LOGIN",
+			"name": "07.022 enable permission portfolio__v1__khepri for user imhotep",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "af5b9059-bf36-4715-acc2-25d272552590",
+						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
 						"exec": [
-							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							"",
-							"var jsonData = JSON.parse(responseBody);",
-							"postman.setEnvironmentVariable(\"adminUserToken\", jsonData.accessToken);",
 							"",
 							"",
 							""
@@ -2294,7 +2474,7 @@
 				}
 			],
 			"request": {
-				"method": "POST",
+				"method": "PUT",
 				"header": [
 					{
 						"key": "X-Tenant-Identifier",
@@ -2302,15 +2482,32 @@
 					},
 					{
 						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
 						"value": "application/json"
+					},
+					{
+						"key": "User",
+						"value": "imhotep",
+						"type": "text"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{schedulerUserToken}}",
+						"type": "text"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{}"
+					"raw": "true",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=mifos&password={{adminUserPassword}}",
+					"raw": "http://{{identityUrl}}/identity/v1/applications/rhythm-v1/permissions/portfolio__v1__khepri/users/imhotep/enabled",
 					"protocol": "http",
 					"host": [
 						"{{identityUrl}}"
@@ -2318,33 +2515,45 @@
 					"path": [
 						"identity",
 						"v1",
-						"token"
+						"applications",
+						"rhythm-v1",
+						"permissions",
+						"portfolio__v1__khepri",
+						"users",
+						"imhotep",
+						"enabled"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "ONLY ASSIGN apps you have started",
+			"request": {
+				"method": "OPTIONS",
+				"header": [],
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
 					],
-					"query": [
-						{
-							"key": "grant_type",
-							"value": "password"
-						},
-						{
-							"key": "username",
-							"value": "mifos"
-						},
-						{
-							"key": "password",
-							"value": "{{adminUserPassword}}"
-						}
+					"path": [
+						"provisioner",
+						"v1",
+						""
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "06.1 Create Scheduler role for tenant playground",
+			"name": "07.03 Assign deposits for Tenant",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
+						"id": "8b4e42c3-5a2f-437d-8f2c-55a6d398f601",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -2354,58 +2563,53 @@
 				}
 			],
 			"request": {
-				"method": "POST",
+				"method": "PUT",
 				"header": [
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{adminUser}}"
-					},
-					{
-						"key": "Authorization",
-						"value": "{{adminUserToken}}"
+						"value": "{{rootUser}}"
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"type": "text",
 						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n  \"identifier\": \"scheduler\",\n  \"permissions\": [\n    {\n      \"permittableEndpointGroupIdentifier\": \"identity__v1__app_self\",\n      \"allowedOperations\": [\n        \"CHANGE\"\n      ]\n    },\n    {\n      \"permittableEndpointGroupIdentifier\": \"portfolio__v1__khepri\",\n      \"allowedOperations\": [\n        \"CHANGE\"\n      ]\n    }\n  ]\n}\n",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "[\n\t{\n\t\t\"name\": \"deposit-v1\"\n\t}\n]"
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/roles",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"roles"
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "06.2 Create Scheduler user imhotep with password '26500BC'",
+			"name": "07.04 Assign teller-v1 for Tenant",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "7d03384e-a570-48b4-a2f9-8f305dee9098",
+						"id": "99d87103-9033-4dc9-aaef-b82aef6f8e3a",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
@@ -2415,21 +2619,19 @@
 				}
 			],
 			"request": {
-				"method": "POST",
+				"method": "PUT",
 				"header": [
 					{
 						"key": "Authorization",
-						"value": "{{adminUserToken}}"
+						"value": "{{rootUserToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{adminUser}}"
+						"value": "{{rootUser}}"
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"value": "application/json"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -2438,75 +2640,65 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"identifier\": \"imhotep\",\n\t\"role\": \"scheduler\",\n\t\"password\": \"MjY1MDBCQw==\"\n}",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "[\n\t{\n\t\t\"name\": \"teller-v1\"\n\t}\n]"
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/users",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"users"
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "06.3 Login Scheduler user imhotep",
+			"name": "07.05 Assign reporting-v1 for Tenant",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
+						"id": "c0c31e05-7498-46c9-8063-7987327fa1fa",
 						"exec": [
-							"tests[\"Status code is 200\"] = responseCode.code === 200;",
-							"",
-							"var jsonData = JSON.parse(responseBody);",
-							"postman.setEnvironmentVariable(\"schedulerUserToken\", jsonData.accessToken);",
-							"",
-							"",
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
 						],
 						"type": "text/javascript"
 					}
-				},
-				{
-					"listen": "prerequest",
-					"script": {
-						"id": "5e84b9b4-361a-4ab5-9ef7-1766a05d940e",
-						"exec": [
-							"var delay3seconds = setTimeout(function(){}, [3000]);"
-						],
-						"type": "text/javascript"
-					}
 				}
 			],
 			"request": {
-				"method": "POST",
+				"method": "PUT",
 				"header": [
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
 					},
 					{
 						"key": "Content-Type",
 						"name": "Content-Type",
 						"value": "application/json",
 						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{}",
+					"raw": "[\n\t{\n\t\t\"name\": \"reporting-v1\"\n\t}\n]",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -2514,46 +2706,31 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=imhotep&password=MjY1MDBCQw==",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"token"
-					],
-					"query": [
-						{
-							"key": "grant_type",
-							"value": "password"
-						},
-						{
-							"key": "username",
-							"value": "imhotep"
-						},
-						{
-							"key": "password",
-							"value": "MjY1MDBCQw=="
-						}
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "06.4 Change imhotep user password to '26500BC'",
+			"name": "07.06 Assign cheques-v1 for Tenant",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "af5b9059-bf36-4715-acc2-25d272552590",
+						"id": "e696bb1f-9582-4861-9009-2b9ede155c3b",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
-							"",
-							"",
-							"",
 							""
 						],
 						"type": "text/javascript"
@@ -2564,29 +2741,27 @@
 				"method": "PUT",
 				"header": [
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
 					},
 					{
-						"key": "Content-Type",
-						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"key": "User",
+						"value": "{{rootUser}}"
 					},
 					{
-						"key": "Authorization",
-						"value": "{{schedulerUserToken}}",
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
 						"type": "text"
 					},
 					{
-						"key": "User",
-						"value": "imhotep",
-						"type": "text"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n  \"password\": \"MjY1MDBCQw==\"\n}",
+					"raw": "[\n\t{\n\t\t\"name\": \"cheques-v1\"\n\t}\n]",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -2594,36 +2769,31 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/users/imhotep/password",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"users",
-						"imhotep",
-						"password"
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "06.5 Loginuser imhotep (who has scheduler role)",
+			"name": "07.08 Assign payroll-v1 for Tenant",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
+						"id": "1a0f8ef5-a7a1-47d4-b83c-92a7b7e4ffcb",
 						"exec": [
-							"tests[\"Status code is 200\"] = responseCode.code === 200;",
-							"",
-							"var jsonData = JSON.parse(responseBody);",
-							"postman.setEnvironmentVariable(\"schedulerUserToken\", jsonData.accessToken);",
-							"",
-							"",
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
 							""
 						],
 						"type": "text/javascript"
@@ -2631,22 +2801,30 @@
 				}
 			],
 			"request": {
-				"method": "POST",
+				"method": "PUT",
 				"header": [
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
 					},
 					{
 						"key": "Content-Type",
 						"name": "Content-Type",
 						"value": "application/json",
 						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{}",
+					"raw": "[\n\t{\n\t\t\"name\": \"payroll-v1\"\n\t}\n]",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -2654,38 +2832,39 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=imhotep&password=MjY1MDBCQw==",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"token"
-					],
-					"query": [
-						{
-							"key": "grant_type",
-							"value": "password"
-						},
-						{
-							"key": "username",
-							"value": "imhotep"
-						},
-						{
-							"key": "password",
-							"value": "MjY1MDBCQw=="
-						}
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "Q1: WHY 06.6 and 06.7 FAIL?",
+			"name": "07.09 Assign group-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "32caff55-23cb-498a-b17c-0444894662ad",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
-				"method": "DELETE",
+				"method": "PUT",
 				"header": [
 					{
 						"key": "Authorization",
@@ -2697,7 +2876,9 @@
 					},
 					{
 						"key": "Content-Type",
-						"value": "application/json"
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -2706,26 +2887,39 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": ""
+					"raw": "[\n\t{\n\t\t\"name\": \"group-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
 				},
 				"url": {
-					"raw": ""
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "06.5 enable permission identity__v1__app_self for imhotep",
+			"name": "07.10 Assign notifications-v1 for Tenant",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
+						"id": "f755efce-b652-48f8-aefb-4cee875df904",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;",
-							"",
-							"",
-							"",
 							""
 						],
 						"type": "text/javascript"
@@ -2736,29 +2930,27 @@
 				"method": "PUT",
 				"header": [
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
 					},
 					{
-						"key": "Content-Type",
-						"name": "Content-Type",
-						"type": "text",
-						"value": "application/json"
+						"key": "User",
+						"value": "{{rootUser}}"
 					},
 					{
-						"key": "User",
-						"value": "imhotep",
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
 						"type": "text"
 					},
 					{
-						"key": "Authorization",
-						"value": "{{schedulerUserToken}}",
-						"type": "text"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "true",
+					"raw": "[\n\t{\n\t\t\"name\": \"notifications-v1\"\n\t}\n]",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -2766,100 +2958,70 @@
 					}
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/applications/rhythm-v1/permissions/identity__v1__app_self/users/imhotep/enabled",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"applications",
-						"rhythm-v1",
-						"permissions",
-						"identity__v1__app_self",
-						"users",
-						"imhotep",
-						"enabled"
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "06.6 enable permission portfolio__v1__khepri for user imhotep",
-			"event": [
-				{
-					"listen": "test",
-					"script": {
-						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
-						"exec": [
-							"tests[\"Status code is 200\"] = responseCode.code === 200;",
-							"",
-							"",
-							"",
-							""
-						],
-						"type": "text/javascript"
-					}
-				}
-			],
+			"name": "07.99 List tenant applications (Only returning one is a bug)",
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
 			"request": {
-				"method": "PUT",
+				"method": "GET",
 				"header": [
 					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
 					},
 					{
-						"key": "Content-Type",
-						"name": "Content-Type",
-						"type": "text",
-						"value": "application/json"
+						"key": "User",
+						"value": "{{rootUser}}"
 					},
 					{
-						"key": "User",
-						"value": "imhotep",
-						"type": "text"
+						"key": "Content-Type",
+						"value": "application/json"
 					},
 					{
-						"key": "Authorization",
-						"value": "{{schedulerUserToken}}",
-						"type": "text"
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
 					}
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "true",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": ""
 				},
 				"url": {
-					"raw": "http://{{identityUrl}}/identity/v1/applications/rhythm-v1/permissions/portfolio__v1__khepri/users/imhotep/enabled",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
-						"{{identityUrl}}"
+						"{{provisionerUrl}}"
 					],
 					"path": [
-						"identity",
+						"provisioner",
 						"v1",
-						"applications",
-						"rhythm-v1",
-						"permissions",
-						"portfolio__v1__khepri",
-						"users",
-						"imhotep",
-						"enabled"
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "07.1 Create INCOME ledgers",
+			"name": "08.1 Create REVENUE ledgers",
 			"event": [
 				{
 					"listen": "test",
@@ -2913,7 +3075,7 @@
 			"response": []
 		},
 		{
-			"name": "07.2 Create EXPENSE Ledgers",
+			"name": "08.2 Create EXPENSE Ledgers",
 			"event": [
 				{
 					"listen": "test",
@@ -2967,7 +3129,7 @@
 			"response": []
 		},
 		{
-			"name": "07.3 Create ASSETS ledgers",
+			"name": "08.3 Create ASSETS ledgers",
 			"event": [
 				{
 					"listen": "test",
@@ -3021,7 +3183,7 @@
 			"response": []
 		},
 		{
-			"name": "07.4 Create LIABILITY ledgers",
+			"name": "08.4 Create LIABILITY ledgers",
 			"event": [
 				{
 					"listen": "test",
@@ -3075,7 +3237,7 @@
 			"response": []
 		},
 		{
-			"name": "07.5 Create EQUITY ledgers",
+			"name": "08.5 Create EQUITY ledgers",
 			"event": [
 				{
 					"listen": "test",
@@ -3132,36 +3294,28 @@
 			"name": "NB! Readme has instructions how to run next step",
 			"request": {
 				"method": "OPTIONS",
-				"header": [
-					{
-						"key": "Authorization",
-						"value": "{{rootUserToken}}"
-					},
-					{
-						"key": "User",
-						"value": "{{rootUser}}"
-					},
-					{
-						"key": "Content-Type",
-						"value": "application/json"
-					},
-					{
-						"key": "X-Tenant-Identifier",
-						"value": "{{tenantIdentifier}}"
-					}
-				],
+				"header": [],
 				"body": {
 					"mode": "raw",
 					"raw": ""
 				},
 				"url": {
-					"raw": ""
+					"raw": "http://{{accountingUrl}}/accounting/v1/",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						""
+					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "08.1 Create accounts (user Runner and import accounts_with_type.csv)",
+			"name": "08.6 Create accounts (user Runner and import accounts_with_type.csv)",
 			"event": [
 				{
 					"listen": "test",
@@ -3229,21 +3383,85 @@
 			"response": []
 		},
 		{
-			"name": "09.1 Create member1",
+			"name": "08.7 Verify that accounts are configured",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "4e26fc95-4fad-4972-ac80-528581c28fcc",
+						"id": "edd32edb-8011-4f68-a1f1-adb2503f71ce",
 						"exec": [
-							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+							"var jsonData = JSON.parse(responseBody);",
+							"tests[\"There are 84 accounts\"] =  jsonData.totalElements === 84;",
+							""
 						],
 						"type": "text/javascript"
 					}
 				}
 			],
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
 			"request": {
-				"method": "POST",
+				"method": "GET",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/accounts?size=200",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"accounts"
+					],
+					"query": [
+						{
+							"key": "size",
+							"value": "200"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "09.10 Create member1",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "4e26fc95-4fad-4972-ac80-528581c28fcc",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
@@ -3282,7 +3500,7 @@
 			"response": []
 		},
 		{
-			"name": "09.2 Activate member1",
+			"name": "09.11 Activate member1",
 			"event": [
 				{
 					"listen": "test",
@@ -3294,7 +3512,891 @@
 						"type": "text/javascript"
 					}
 				}
-			],
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"action\": \"ACTIVATE\"\n}"
+				},
+				"url": {
+					"raw": "http://{{customerUrl}}/customer/v1/customers/member1/commands",
+					"protocol": "http",
+					"host": [
+						"{{customerUrl}}"
+					],
+					"path": [
+						"customer",
+						"v1",
+						"customers",
+						"member1",
+						"commands"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "09.20 Create customer10",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "d572df48-1555-41c8-839e-fa7e9dc0afcc",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n            \"identifier\": \"customer10\",\n            \"type\": \"PERSON\",\n            \"givenName\": \"First Name\",\n            \"middleName\": null,\n            \"surname\": \"LastnameCustomer10\",\n            \"dateOfBirth\": {\n                \"year\": 1922,\n                \"month\": 2,\n                \"day\": 22\n            },\n            \"address\": {\n            \t\"street\": \"ABC Street\",\n            \t\"region\": \"Nord\",\n            \t\"ci [...]
+				},
+				"url": {
+					"raw": "http://{{customerUrl}}/customer/v1/customers",
+					"protocol": "http",
+					"host": [
+						"{{customerUrl}}"
+					],
+					"path": [
+						"customer",
+						"v1",
+						"customers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "09.21 Activate customer10",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "afa41cb7-93c9-46d8-8c60-471ae8642097",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"action\": \"ACTIVATE\"\n}"
+				},
+				"url": {
+					"raw": "http://{{customerUrl}}/customer/v1/customers/customer10/commands",
+					"protocol": "http",
+					"host": [
+						"{{customerUrl}}"
+					],
+					"path": [
+						"customer",
+						"v1",
+						"customers",
+						"customer10",
+						"commands"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "10.10 Create savingsProduct004",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "854f50a3-980b-4450-b8a0-c1333d3beeac",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"identifier\": \"savingsProduct004\",\n  \"type\": \"SAVINGS\",\n  \"name\": \"Savings Product 004\",\n  \"description\": null,\n  \"minimumBalance\": 1,\n  \"interest\": 0.01,\n  \"flexible\": true,\n  \"term\": {\n    \"period\": \"1\",\n    \"timeUnit\": \"YEAR\",\n    \"interestPayable\": \"MATURITY\"\n  },\n  \"currency\": {\n    \"code\": \"EUR\",\n    \"name\": \"Euro\",\n    \"sign\": \"€\",\n    \"scale\": 2\n  },\n  \"charges\": [],\n  \"expenseAccountIdentif [...]
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/definitions",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"definitions"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "10.11 Activate savingsProduct004",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "c0ed6c3d-07f1-48e1-b9e6-f0423ae0c5e4",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"action\": \"ACTIVATE\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/definitions/savingsProduct004/commands",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"definitions",
+						"savingsProduct004",
+						"commands"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "10.20 Assign savingsProduct004 to customer10",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"productIdentifier\": \"savingsProduct004\",\n  \"beneficiaries\": [\n    \"customer10\"\n  ],\n  \"customerIdentifier\": \"customer10\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "11.21 Assign savingsProduct004 to member1",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"productIdentifier\": \"savingsProduct004\",\n  \"beneficiaries\": [\n    \"member1\"\n  ],\n  \"customerIdentifier\": \"member1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "10.30 Create checkingProduct108",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "35f0c037-cbfc-4ffc-b6c7-9c9846cc4018",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"identifier\": \"checkingProduct108\",\n  \"type\": \"CHECKING\",\n  \"name\": \"checking Product 108\",\n  \"description\": null,\n  \"minimumBalance\": 0,\n  \"interest\": 0,\n  \"flexible\": true,\n  \"term\": {\n    \"period\": \"2\",\n    \"timeUnit\": \"YEAR\",\n    \"interestPayable\": \"ANNUALLY\"\n  },\n  \"currency\": {\n    \"code\": \"EUR\",\n    \"name\": \"Euro\",\n    \"sign\": \"€\",\n    \"scale\": 2\n  },\n  \"charges\": [],\n  \"expenseAccountIdentif [...]
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/definitions",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"definitions"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "10.31 Activate checkingProduct108",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "9023188b-2b14-4403-aa1f-fc324dc26b9b",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"action\": \"ACTIVATE\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/definitions/checkingProduct108/commands",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"definitions",
+						"checkingProduct108",
+						"commands"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "10.41 Assign checkingProduct108 to customer10",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"productIdentifier\": \"checkingProduct108\",\n  \"beneficiaries\": [\n    \"customer10\"\n  ],\n  \"customerIdentifier\": \"customer10\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "10.42 Assign checkingProduct108 to member1",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"productIdentifier\": \"checkingProduct108\",\n  \"beneficiaries\": [\n    \"member1\"\n  ],\n  \"customerIdentifier\": \"member1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "11.3 Get customer10 product instances",
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances?customer=customer10",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances"
+					],
+					"query": [
+						{
+							"key": "customer",
+							"value": "customer10"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "11.4 Activate customer10 savings product",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances/customer10.9300.00001?command=ACTIVATE",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances",
+						"customer10.9300.00001"
+					],
+					"query": [
+						{
+							"key": "command",
+							"value": "ACTIVATE"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "11.5 Activate customer10 checking product",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances/customer10.9300.00002?command=ACTIVATE",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances",
+						"customer10.9300.00002"
+					],
+					"query": [
+						{
+							"key": "command",
+							"value": "ACTIVATE"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "11.6 Get customer10 product instances again",
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances?customer=customer10",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances"
+					],
+					"query": [
+						{
+							"key": "customer",
+							"value": "customer10"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "11.7 Get customer10 possible transaction types",
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances/transactiontypes?customer=customer10",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances",
+						"transactiontypes"
+					],
+					"query": [
+						{
+							"key": "customer",
+							"value": "customer10"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "11.8 Get member1 product instances",
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://{{depositUrl}}/deposit/v1/instances?customer=member1",
+					"protocol": "http",
+					"host": [
+						"{{depositUrl}}"
+					],
+					"path": [
+						"deposit",
+						"v1",
+						"instances"
+					],
+					"query": [
+						{
+							"key": "customer",
+							"value": "member1"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "11.90 Activate member1 savings product",
 			"request": {
 				"method": "POST",
 				"header": [
@@ -3317,39 +4419,32 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n  \"action\": \"ACTIVATE\"\n}"
+					"raw": ""
 				},
 				"url": {
-					"raw": "http://{{customerUrl}}/customer/v1/customers/member1/commands",
+					"raw": "http://{{depositUrl}}/deposit/v1/instances/member1.9300.00001?command=ACTIVATE",
 					"protocol": "http",
 					"host": [
-						"{{customerUrl}}"
+						"{{depositUrl}}"
 					],
 					"path": [
-						"customer",
+						"deposit",
 						"v1",
-						"customers",
-						"member1",
-						"commands"
+						"instances",
+						"member1.9300.00001"
+					],
+					"query": [
+						{
+							"key": "command",
+							"value": "ACTIVATE"
+						}
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "09.2 Create customer10",
-			"event": [
-				{
-					"listen": "test",
-					"script": {
-						"id": "d572df48-1555-41c8-839e-fa7e9dc0afcc",
-						"exec": [
-							"tests[\"Status code is 202\"] = responseCode.code === 202;"
-						],
-						"type": "text/javascript"
-					}
-				}
-			],
+			"name": "11.91 Activate member1 checking product",
 			"request": {
 				"method": "POST",
 				"header": [
@@ -3372,39 +4467,37 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n            \"identifier\": \"customer10\",\n            \"type\": \"PERSON\",\n            \"givenName\": \"First Name\",\n            \"middleName\": null,\n            \"surname\": \"LastnameCustomer10\",\n            \"dateOfBirth\": {\n                \"year\": 1922,\n                \"month\": 2,\n                \"day\": 22\n            },\n            \"address\": {\n            \t\"street\": \"ABC Street\",\n            \t\"region\": \"Nord\",\n            \t\"ci [...]
+					"raw": ""
 				},
 				"url": {
-					"raw": "http://{{customerUrl}}/customer/v1/customers",
+					"raw": "http://{{depositUrl}}/deposit/v1/instances/member1.9300.00002?command=ACTIVATE",
 					"protocol": "http",
 					"host": [
-						"{{customerUrl}}"
+						"{{depositUrl}}"
 					],
 					"path": [
-						"customer",
+						"deposit",
 						"v1",
-						"customers"
+						"instances",
+						"member1.9300.00002"
+					],
+					"query": [
+						{
+							"key": "command",
+							"value": "ACTIVATE"
+						}
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "09.3 Activate customer10",
-			"event": [
-				{
-					"listen": "test",
-					"script": {
-						"id": "afa41cb7-93c9-46d8-8c60-471ae8642097",
-						"exec": [
-							"tests[\"Status code is 202\"] = responseCode.code === 202;"
-						],
-						"type": "text/javascript"
-					}
-				}
-			],
+			"name": "11.93. Get member1 products",
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
 			"request": {
-				"method": "POST",
+				"method": "GET",
 				"header": [
 					{
 						"key": "Authorization",
@@ -3425,32 +4518,36 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n  \"action\": \"ACTIVATE\"\n}"
+					"raw": ""
 				},
 				"url": {
-					"raw": "http://{{customerUrl}}/customer/v1/customers/customer10/commands",
+					"raw": "http://{{depositUrl}}/deposit/v1/instances?customer=member1",
 					"protocol": "http",
 					"host": [
-						"{{customerUrl}}"
+						"{{depositUrl}}"
 					],
 					"path": [
-						"customer",
+						"deposit",
 						"v1",
-						"customers",
-						"customer10",
-						"commands"
+						"instances"
+					],
+					"query": [
+						{
+							"key": "customer",
+							"value": "member1"
+						}
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "10.1 Create savingsProduct001",
+			"name": "12.1 create HQ",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "854f50a3-980b-4450-b8a0-c1333d3beeac",
+						"id": "8824daa3-c0b2-4afe-9296-726bd33fb7a1",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;"
 						],
@@ -3471,9 +4568,7 @@
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"value": "application/json"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -3482,35 +4577,30 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n  \"identifier\": \"savingsProduct001\",\n  \"type\": \"SAVINGS\",\n  \"name\": \"Savings Product 1\",\n  \"description\": null,\n  \"minimumBalance\": 1,\n  \"interest\": 0.01,\n  \"flexible\": true,\n  \"term\": {\n    \"period\": \"1\",\n    \"timeUnit\": \"YEAR\",\n    \"interestPayable\": \"MATURITY\"\n  },\n  \"currency\": {\n    \"code\": \"EUR\",\n    \"name\": \"Euro\",\n    \"sign\": \"€\",\n    \"scale\": 2\n  },\n  \"charges\": [],\n  \"expenseAccountIdentifie [...]
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "{\n  \"identifier\": \"ourHQ\",\n  \"name\": \"Our headquarter\",\n  \"description\": null,\n  \"address\": {\n    \"street\": \"Street\",\n    \"city\": \"City\",\n    \"postalCode\": null,\n    \"region\": null,\n    \"country\": \"Germany\",\n    \"countryCode\": \"DE\"\n  }\n}"
 				},
 				"url": {
-					"raw": "http://{{depositUrl}}/deposit/v1/definitions",
+					"raw": "http://{{officeUrl}}/office/v1/offices",
 					"protocol": "http",
 					"host": [
-						"{{depositUrl}}"
+						"{{officeUrl}}"
 					],
 					"path": [
-						"deposit",
+						"office",
 						"v1",
-						"definitions"
+						"offices"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "10.2 Activate savingsProduct001",
+			"name": "12.2. create branch",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "c0ed6c3d-07f1-48e1-b9e6-f0423ae0c5e4",
+						"id": "67d85fff-6c6d-476d-9f71-36247ee2bc40",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;"
 						],
@@ -3531,8 +4621,6 @@
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"type": "text",
 						"value": "application/json"
 					},
 					{
@@ -3542,37 +4630,32 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n  \"action\": \"ACTIVATE\"\n}",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "{\n  \"identifier\": \"branch01\",\n  \"name\": \"Branch 14\",\n  \"description\": null,\n  \"address\": {\n    \"street\": \"Hohenzollernstraße\",\n    \"city\": \"München\",\n    \"postalCode\": null,\n    \"region\": null,\n    \"country\": \"Germany\",\n    \"countryCode\": \"DE\"\n  },\n  \"parentIdentifier\": \"ourHQ\"\n}"
 				},
 				"url": {
-					"raw": "http://{{depositUrl}}/deposit/v1/definitions/savingsProduct001/commands",
-					"protocol": "http",
+					"raw": "http:/{{officeUrl}}/office/v1/offices/ourHQ",
 					"host": [
-						"{{depositUrl}}"
+						"http:"
 					],
+					"port": "",
 					"path": [
-						"deposit",
+						"{{officeUrl}}",
+						"office",
 						"v1",
-						"definitions",
-						"savingsProduct001",
-						"commands"
+						"offices",
+						"ourHQ"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "10.3 Create Checking product",
+			"name": "12.3. create branch office",
 			"event": [
 				{
 					"listen": "test",
 					"script": {
-						"id": "35f0c037-cbfc-4ffc-b6c7-9c9846cc4018",
+						"id": "c7796fc7-df25-4206-a73c-5eb058e90cb0",
 						"exec": [
 							"tests[\"Status code is 202\"] = responseCode.code === 202;"
 						],
@@ -3593,8 +4676,6 @@
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"type": "text",
 						"value": "application/json"
 					},
 					{
@@ -3604,42 +4685,26 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n  \"identifier\": \"checkingProduct110\",\n  \"type\": \"CHECKING\",\n  \"name\": \"checking Product 110\",\n  \"description\": null,\n  \"minimumBalance\": 0,\n  \"interest\": 0,\n  \"flexible\": true,\n  \"term\": {\n    \"period\": \"2\",\n    \"timeUnit\": \"YEAR\",\n    \"interestPayable\": \"ANNUALLY\"\n  },\n  \"currency\": {\n    \"code\": \"EUR\",\n    \"name\": \"Euro\",\n    \"sign\": \"€\",\n    \"scale\": 2\n  },\n  \"charges\": [],\n  \"expenseAccountIdentif [...]
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "{\n  \"identifier\": \"office001\",\n  \"name\": \"Office 001 of branch01\",\n  \"description\": null,\n  \"address\": {\n    \"street\": \"Max-Planck-Straße 1\",\n    \"city\": \"München\",\n    \"postalCode\": null,\n    \"region\": null,\n    \"country\": \"Germany\",\n    \"countryCode\": \"DE\"\n  },\n  \"parentIdentifier\": \"branch01\"\n}"
 				},
 				"url": {
-					"raw": "http://{{depositUrl}}/deposit/v1/definitions",
+					"raw": "http://{{officeUrl}}/office/v1/offices/branch01",
 					"protocol": "http",
 					"host": [
-						"{{depositUrl}}"
+						"{{officeUrl}}"
 					],
 					"path": [
-						"deposit",
+						"office",
 						"v1",
-						"definitions"
+						"offices",
+						"branch01"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "10.4 Activate checkingProduct110",
-			"event": [
-				{
-					"listen": "test",
-					"script": {
-						"id": "9023188b-2b14-4403-aa1f-fc324dc26b9b",
-						"exec": [
-							"tests[\"Status code is 202\"] = responseCode.code === 202;"
-						],
-						"type": "text/javascript"
-					}
-				}
-			],
+			"name": "12.40. create employee Peter",
 			"request": {
 				"method": "POST",
 				"header": [
@@ -3653,8 +4718,6 @@
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"type": "text",
 						"value": "application/json"
 					},
 					{
@@ -3664,42 +4727,35 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n  \"action\": \"ACTIVATE\"\n}",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "{\n  \"identifier\": \"peter\",\n  \"givenName\": \"Peter\",\n  \"middleName\": null,\n  \"surname\": \"Gibbons\",\n  \"contactDetails\": [\n    {\n      \"group\": \"BUSINESS\",\n      \"type\": \"EMAIL\",\n      \"value\": \"peter@example.com\",\n      \"preferenceLevel\": 1\n    }\n  ],\n  \"assignedOffice\": \"office001\"\n}"
 				},
 				"url": {
-					"raw": "http://{{depositUrl}}/deposit/v1/definitions/checkingProduct110/commands",
+					"raw": "http://{{officeUrl}}/office/v1/employees",
 					"protocol": "http",
 					"host": [
-						"{{depositUrl}}"
+						"{{officeUrl}}"
 					],
 					"path": [
-						"deposit",
+						"office",
 						"v1",
-						"definitions",
-						"checkingProduct110",
-						"commands"
+						"employees"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "Q2: WHY customer is twice in next?",
+			"name": "12.41 create employee Samir",
 			"request": {
-				"method": "DELETE",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
-						"value": "{{rootUserToken}}"
+						"value": "{{adminUserToken}}"
 					},
 					{
 						"key": "User",
-						"value": "{{rootUser}}"
+						"value": "{{adminUser}}"
 					},
 					{
 						"key": "Content-Type",
@@ -3712,16 +4768,37 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": ""
+					"raw": "{\n  \"identifier\": \"samir\",\n  \"givenName\": \"Samir\",\n  \"middleName\": null,\n  \"surname\": \"Nagheenanajar\",\n  \"contactDetails\": [\n    {\n      \"group\": \"BUSINESS\",\n      \"type\": \"EMAIL\",\n      \"value\": \"samir@example.com\",\n      \"preferenceLevel\": 1\n    }\n  ],\n  \"assignedOffice\": \"office001\"\n}"
 				},
 				"url": {
-					"raw": ""
+					"raw": "http://{{officeUrl}}/office/v1/employees",
+					"protocol": "http",
+					"host": [
+						"{{officeUrl}}"
+					],
+					"path": [
+						"office",
+						"v1",
+						"employees"
+					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "11.1 Assign savingsProduct001 to customer10",
+			"name": "12.50. create teller1 to office001",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "ae00c4f4-e095-44bc-98ed-6f0a664a8439",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
 				"method": "POST",
 				"header": [
@@ -3735,9 +4812,7 @@
 					},
 					{
 						"key": "Content-Type",
-						"name": "Content-Type",
-						"value": "application/json",
-						"type": "text"
+						"value": "application/json"
 					},
 					{
 						"key": "X-Tenant-Identifier",
@@ -3746,35 +4821,41 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n  \"productIdentifier\": \"savingsProduct001\",\n  \"beneficiaries\": [\n    \"customer10\"\n  ],\n  \"customerIdentifier\": \"customer10\"\n}",
-					"options": {
-						"raw": {
-							"language": "json"
-						}
-					}
+					"raw": "{\n  \"code\": \"teller1\",\n  \"password\": \"teller1Password\",\n  \"cashdrawLimit\": \"1000\",\n  \"tellerAccountIdentifier\": \"7013\",\n  \"vaultAccountIdentifier\": \"7014\",\n  \"chequesReceivableAccount\": \"7011\",\n  \"cashOverShortAccount\": \"3190\",\n  \"denominationRequired\": false\n}"
 				},
 				"url": {
-					"raw": "http://{{depositUrl}}/deposit/v1/instances",
+					"raw": "http://{{tellerUrl}}/teller/v1/offices/office001/teller",
 					"protocol": "http",
 					"host": [
-						"{{depositUrl}}"
+						"{{tellerUrl}}"
 					],
 					"path": [
-						"deposit",
+						"teller",
 						"v1",
-						"instances"
+						"offices",
+						"office001",
+						"teller"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "11.20. Get customer products",
-			"protocolProfileBehavior": {
-				"disableBodyPruning": true
-			},
+			"name": "12.51 create teller2 to office001",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "ae00c4f4-e095-44bc-98ed-6f0a664a8439",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
-				"method": "GET",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
@@ -3795,36 +4876,41 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": ""
+					"raw": "{\n  \"code\": \"teller2\",\n  \"password\": \"teller2Password\",\n  \"cashdrawLimit\": \"1000\",\n  \"tellerAccountIdentifier\": \"7013\",\n  \"vaultAccountIdentifier\": \"7014\",\n  \"chequesReceivableAccount\": \"7011\",\n  \"cashOverShortAccount\": \"3190\",\n  \"denominationRequired\": false\n}"
 				},
 				"url": {
-					"raw": "http://{{depositUrl}}/deposit/v1/instances?customer=customer10",
+					"raw": "http://{{tellerUrl}}/teller/v1/offices/office001/teller",
 					"protocol": "http",
 					"host": [
-						"{{depositUrl}}"
+						"{{tellerUrl}}"
 					],
 					"path": [
-						"deposit",
+						"teller",
 						"v1",
-						"instances"
-					],
-					"query": [
-						{
-							"key": "customer",
-							"value": "customer10"
-						}
+						"offices",
+						"office001",
+						"teller"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "11.21. Get member1 products",
-			"protocolProfileBehavior": {
-				"disableBodyPruning": true
-			},
+			"name": "12.60 open teller1 and connect with Peter",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "ae00c4f4-e095-44bc-98ed-6f0a664a8439",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
-				"method": "GET",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
@@ -3845,36 +4931,43 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": ""
+					"raw": "{\n  \"action\": \"OPEN\",\n  \"assignedEmployeeIdentifier\": \"peter\",\n  \"adjustment\": \"DEBIT\",\n  \"amount\": \"5000\"\n}"
 				},
 				"url": {
-					"raw": "http://{{depositUrl}}/deposit/v1/instances?customer=member1",
+					"raw": "http://{{tellerUrl}}/teller/v1/offices/office001/teller/teller1/commands",
 					"protocol": "http",
 					"host": [
-						"{{depositUrl}}"
+						"{{tellerUrl}}"
 					],
 					"path": [
-						"deposit",
+						"teller",
 						"v1",
-						"instances"
-					],
-					"query": [
-						{
-							"key": "customer",
-							"value": "member1"
-						}
+						"offices",
+						"office001",
+						"teller",
+						"teller1",
+						"commands"
 					]
 				}
 			},
 			"response": []
 		},
 		{
-			"name": "11.3 Get customer address",
-			"protocolProfileBehavior": {
-				"disableBodyPruning": true
-			},
+			"name": "12.61 open teller2 and connect with Samir",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "ae00c4f4-e095-44bc-98ed-6f0a664a8439",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
 			"request": {
-				"method": "GET",
+				"method": "POST",
 				"header": [
 					{
 						"key": "Authorization",
@@ -3895,22 +4988,22 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": ""
+					"raw": "{\n  \"action\": \"OPEN\",\n  \"assignedEmployeeIdentifier\": \"samir\",\n  \"adjustment\": \"DEBIT\",\n  \"amount\": \"3000\"\n}"
 				},
 				"url": {
-					"raw": "http://localhost:8888/api/customer/v1/customers/customer10/identifications",
+					"raw": "http://{{tellerUrl}}/teller/v1/offices/office001/teller/teller2/commands",
 					"protocol": "http",
 					"host": [
-						"localhost"
+						"{{tellerUrl}}"
 					],
-					"port": "8888",
 					"path": [
-						"api",
-						"customer",
+						"teller",
 						"v1",
-						"customers",
-						"customer10",
-						"identifications"
+						"offices",
+						"office001",
+						"teller",
+						"teller2",
+						"commands"
 					]
 				}
 			},
@@ -3918,4 +5011,4 @@
 		}
 	],
 	"protocolProfileBehavior": {}
-}
+}
\ No newline at end of file
diff --git a/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json b/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
index 6428a72..9b92287 100644
--- a/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
+++ b/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
@@ -3,23 +3,13 @@
 	"name": "Fineract-Cn-Initial-Setup-Environment",
 	"values": [
 		{
-			"key": "host",
-			"value": "localhost",
-			"enabled": true
-		},
-		{
 			"key": "tenantIdentifier",
 			"value": "playground",
 			"enabled": true
 		},
 		{
-			"key": "user",
-			"value": "superuser",
-			"enabled": true
-		},
-		{
 			"key": "accessToken",
-			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJzdXBlcnVzZXIiLCIvbWlmb3MuaW8vc2lnbmF0dXJlVGltZXN0YW1wIjoiMjAxNy0wNC0yNlQwN18yNl8xMyIsIi9taWZvcy5pby90b2tlbkNvbnRlbnQiOiJ7XCJ0b2tlblBlcm1pc3Npb25zXCI6W3tcInBhdGhcIjpcInBvcnRmb2xpby12MS9wcm9kdWN0cy8qL2NoYXJnZXNcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiQ0hBTkdFXCJdfSx7XCJwYXRoXCI6XCJpZGVudGl0eS12MS9hcHBsaWNhdGlvbnMvKi9wZXJtaXNzaW9ucy8qL3VzZXJzL3t1c2VyaWRlbnRpZmllcn0vZW5hYmxlZFwiLFwiYWxsb3dlZE9wZXJhdGlvbnNcIjpbXCJSRUFEXCJdfSx7XCJwYXRoXCI6XCJpZGV [...]
+			"value": "",
 			"enabled": true
 		},
 		{
@@ -29,7 +19,7 @@
 		},
 		{
 			"key": "rootUserToken",
-			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJhdWQiOiJwcm92aXNpb25lci12MSIsInN1YiI6IndlcGVtbmVmcmV0IiwiL2ZpbmNuLmFwYWNoZS5vcmcvcyI6IjIwMTktMDktMTlUMTZfNTRfNTYiLCIvZmluY24uYXBhY2hlLm9yZy9jIjoiUk9MRV9BRE1JTiIsImlzcyI6InN5c3RlbSIsImlhdCI6MTU2OTI0NDMwNiwiZXhwIjoxNTY5MjQ3OTA2fQ.I6o8sv9ArXzr2u_-u0F53DeWpXBSAgLpQLrIF6Cumg4-lJtXyyqwiP34rBLDfj7PCeQSYLy59RR_o4j_isL0FhZZbTM97gZiNts6DY0Q7cuitLyDANYiHra4jhjzA85NH8lp_BDNVhRj2CsrcWXEciztiBzGy9dPS_AOts7ftQarOKilwZSw1KUZOIoMeYLbNk5tXELmREzTVGR8s_kEENdveWub [...]
+			"value": "",
 			"enabled": true
 		},
 		{
@@ -39,7 +29,7 @@
 		},
 		{
 			"key": "antonyToken",
-			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJhbnRvbnkiLCIvZmluY24uYXBhY2hlLm9yZy9zIjoiMjAxOS0wOS0yM1QxM18xMl8wOSIsIi9maW5jbi5hcGFjaGUub3JnL2MiOiJ7XCJ0b2tlblBlcm1pc3Npb25zXCI6W3tcInBhdGhcIjpcImlkZW50aXR5LXYxL3VzZXJzL3t1c2VyaWRlbnRpZmllcn0vcGVybWlzc2lvbnNcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiUkVBRFwiXX0se1wicGF0aFwiOlwiaWRlbnRpdHktdjEvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbmlkZW50aWZpZXJ9L3Blcm1pc3Npb25zXCIsXCJhbGxvd2VkT3BlcmF0aW9uc1wiOltcIlJFQURcIixcIkRFTEVURVwiLFwiQ0hBTkdFXCJdfSx7XCJwYXR [...]
+			"value": "",
 			"enabled": true
 		},
 		{
@@ -74,22 +64,22 @@
 		},
 		{
 			"key": "antonyUserPassword",
-			"value": "dGVzdA==",
+			"value": "YW50b255VXNlclBhc3N3b3Jk",
 			"enabled": true
 		},
 		{
 			"key": "adminUserPassword",
-			"value": "cGFzc3dvcmQ=",
+			"value": "b3BlcmF0b3JQYXNzd29yZA==",
 			"enabled": true
 		},
 		{
 			"key": "adminUserToken",
-			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJtaWZvcyIsIi9maW5jbi5hcGFjaGUub3JnL3MiOiIyMDE5LTA5LTIzVDEzXzEyXzA5IiwiL2ZpbmNuLmFwYWNoZS5vcmcvYyI6IntcInRva2VuUGVybWlzc2lvbnNcIjpbe1wicGF0aFwiOlwiaWRlbnRpdHktdjEvdXNlcnMve3VzZXJpZGVudGlmaWVyfS9wZXJtaXNzaW9uc1wiLFwiYWxsb3dlZE9wZXJhdGlvbnNcIjpbXCJSRUFEXCJdfSx7XCJwYXRoXCI6XCJjdXN0b21lci12MS90YXNrc1wiLFwiYWxsb3dlZE9wZXJhdGlvbnNcIjpbXCJSRUFEXCIsXCJDSEFOR0VcIl19LHtcInBhdGhcIjpcImRlcG9zaXQtdjEvZGVmaW5pdGlvbnMvKi9pbnN0YW5jZXNcIixcImFsbG93ZWRPcGV [...]
+			"value": "",
 			"enabled": true
 		},
 		{
 			"key": "adminUser",
-			"value": "mifos",
+			"value": "operator",
 			"enabled": true
 		},
 		{
@@ -104,11 +94,61 @@
 		},
 		{
 			"key": "schedulerUserToken",
-			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJpbWhvdGVwIiwiL2ZpbmNuLmFwYWNoZS5vcmcvcyI6IjIwMTktMDktMjNUMTNfMTJfMDkiLCIvZmluY24uYXBhY2hlLm9yZy9jIjoie1widG9rZW5QZXJtaXNzaW9uc1wiOlt7XCJwYXRoXCI6XCJpZGVudGl0eS12MS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uaWRlbnRpZmllcn0vcGVybWlzc2lvbnNcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiQ0hBTkdFXCJdfSx7XCJwYXRoXCI6XCJpZGVudGl0eS12MS91c2Vycy97dXNlcmlkZW50aWZpZXJ9L3Blcm1pc3Npb25zXCIsXCJhbGxvd2VkT3BlcmF0aW9uc1wiOltcIlJFQURcIl19LHtcInBhdGhcIjpcInBvcnRmb2xpby12MS9 [...]
+			"value": "",
+			"enabled": true
+		},
+		{
+			"key": "schedulerUserPassword",
+			"value": "aW1ob3RlcFBhc3N3b3Jk",
+			"enabled": true
+		},
+		{
+			"key": "officeUrl",
+			"value": "office-ms:2023",
+			"enabled": true
+		},
+		{
+			"key": "tellerUrl",
+			"value": "teller-ms:2028",
+			"enabled": true
+		},
+		{
+			"key": "portfolioUrl",
+			"value": "portfolio-ms:2026",
+			"enabled": true
+		},
+		{
+			"key": "rhythmUrl",
+			"value": "rhythm-ms:2022",
+			"enabled": true
+		},
+		{
+			"key": "reportingUrl",
+			"value": "reporting-ms:2029",
+			"enabled": true
+		},
+		{
+			"key": "chequesUrl",
+			"value": "cheques-ms:2030",
+			"enabled": true
+		},
+		{
+			"key": "payrollUrl",
+			"value": "payroll-ms:2031",
+			"enabled": true
+		},
+		{
+			"key": "groupUrl",
+			"value": "group-ms:2032",
+			"enabled": true
+		},
+		{
+			"key": "notificationsUrl",
+			"value": "notifications-ms:2033",
 			"enabled": true
 		}
 	],
 	"_postman_variable_scope": "environment",
-	"_postman_exported_at": "2019-09-23T14:12:43.724Z",
-	"_postman_exported_using": "Postman/7.7.3"
+	"_postman_exported_at": "2019-10-18T13:46:23.344Z",
+	"_postman_exported_using": "Postman/7.9.0"
 }


[fineract-cn-docker-compose] 37/44: Merge pull request #14 from Anh3h/review

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit c09dd2094a21a0fbca22f8b44b2438ce9cda039a
Merge: 1b85975 4d8bdb2
Author: Courage Angeh <co...@gmail.com>
AuthorDate: Tue Oct 29 10:54:00 2019 -0400

    Merge pull request #14 from Anh3h/review
    
    Encode password, fix typo error and add missing env variable

 bash_scripts/provision.sh | 17 ++++++++++-------
 docker-compose.yml        |  2 +-
 env_variables             |  1 +
 3 files changed, 12 insertions(+), 8 deletions(-)


[fineract-cn-docker-compose] 34/44: cleanup

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 4f824d5480099d729b50a20f7ecdfc6d9bcda8f4
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Mon Oct 21 11:35:34 2019 +0300

    cleanup
---
 docker-compose.yml | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index e5492f8..c8493da 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -48,9 +48,6 @@ services:
         condition: any
         delay: 10s
         max_attempts: 3
-    volumes:
-      - ./node_config:/etc/configs/:ro
-      - ./node_logs:/tmp/logs
     networks:
       external_tools_default:
       fineract:
@@ -96,9 +93,6 @@ services:
         condition: any
         delay: 10s
         max_attempts: 3
-    volumes:
-      - ./node_config:/etc/configs/:ro
-      - ./node_logs:/tmp/logs
     networks:
       external_tools_default:
       fineract:
@@ -151,9 +145,6 @@ services:
       replicas: 1
       restart_policy:
         condition: on-failure
-    volumes:
-      - ./node_config:/etc/configs/:ro
-      - ./node_logs:/tmp/logs
     networks:
       external_tools_default:
       fineract:
@@ -199,8 +190,6 @@ services:
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
-      system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
-      system.privateKey.modulus: ${PRIVATE_KEY_MODULUS}
     networks:
       external_tools_default:
       fineract:


[fineract-cn-docker-compose] 42/44: updated tests

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit e3efc96a97a764d05c9108208072ea459a7c983e
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Fri Nov 22 14:38:08 2019 +0200

    updated tests
---
 integration_test.sh                                |   11 +-
 ...-Initial-Requests_PART1.postman_collection.json | 2693 ++++++++++++++++++++
 2 files changed, 2703 insertions(+), 1 deletion(-)

diff --git a/integration_test.sh b/integration_test.sh
index 4abf7b4..8889d77 100755
--- a/integration_test.sh
+++ b/integration_test.sh
@@ -1,5 +1,6 @@
 #!/usr/bin/env bash
 
+rm .env
 cd external_tools
 docker-compose stop
 docker-compose rm -v -f
@@ -10,20 +11,28 @@ docker volume rm external_tools_postgres-volume
 docker-compose pull
 
 docker-compose up -d
+echo "Started external tools. Now waiting for them to start up."
 sleep 180
 cd ..
 
 java -cp external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env
 cat env_variables >> .env
+echo "env variables saved into .env"
 
 docker-compose stop
 docker-compose rm -f
 docker-compose pull
 
 docker-compose up -d provisioner-ms
+echo "Started provision-ms. Now waiting it to provision (create schema 'seshat' to Postgres and Cassandra)."
 sleep 180
 
 docker-compose up -d rhythm-ms identity-ms customer-ms accounting-ms deposit-ms portfolio-ms office-ms teller-ms fims-web-app
-sleep 180
+echo "Started set of micro services. Now waiting for them to start up"
+sleep 240
 
+echo "Start provisioning the system with Postman scripts."
+cd postman_scripts
+newman run Fineract-CN-Initial-Requests_PART1.postman_collection.json -e Fineract-Cn-Initial-Setup-Environment.postman_environment.json
 
+echo "Finished."
diff --git a/postman_scripts/Fineract-CN-Initial-Requests_PART1.postman_collection.json b/postman_scripts/Fineract-CN-Initial-Requests_PART1.postman_collection.json
new file mode 100644
index 0000000..1339a81
--- /dev/null
+++ b/postman_scripts/Fineract-CN-Initial-Requests_PART1.postman_collection.json
@@ -0,0 +1,2693 @@
+{
+	"info": {
+		"_postman_id": "ada8e456-15a7-4d33-8ccd-79d00130e427",
+		"name": "Fineract-CN-Initial-Requests_PART1",
+		"description": "Collection to initialize tenant",
+		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+	},
+	"item": [
+		{
+			"name": "00.1 Verify eureka is up",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "2a49d9a1-377c-4c03-90b8-1c285140de5a",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "GET",
+				"header": [],
+				"url": {
+					"raw": "http://eureka:8761/",
+					"protocol": "http",
+					"host": [
+						"eureka"
+					],
+					"port": "8761",
+					"path": [
+						""
+					]
+				},
+				"description": "1. Get Token from System-User"
+			},
+			"response": []
+		},
+		{
+			"name": "01. Log in root user",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "2a49d9a1-377c-4c03-90b8-1c285140de5a",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"rootUserToken\", jsonData.token);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [],
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/auth/token?grant_type=password&client_id={{client_id}}&username={{rootUser}}&password={{rootUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"auth",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "client_id",
+							"value": "{{client_id}}",
+							"description": "The initial Client Id used for starting service runner\n"
+						},
+						{
+							"key": "username",
+							"value": "{{rootUser}}",
+							"description": "Initial system user \"wepemnefret\"\n"
+						},
+						{
+							"key": "password",
+							"value": "{{rootUserPassword}}"
+						}
+					]
+				},
+				"description": "1. Get Token from System-User"
+			},
+			"response": []
+		},
+		{
+			"name": "NB! ONLY CREATE apps you have started",
+			"request": {
+				"method": "OPTIONS",
+				"header": [],
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/auth/token",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"auth",
+						"token"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "02.01 Create identity-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "fb7299ef-04d4-4869-a25b-d1b523098c6d",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}",
+						"type": "text",
+						"disabled": true
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"identity-v1\",\n\t\"description\": \"Identity Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{identityUrl}}/identity/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "02.02 Create rhythm-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "4d75f048-905b-41af-b767-4314d5e3a050",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"rhythm-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{rhythmUrl}}/rhythm/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "02.03 Create office-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "bc3eeb3d-961c-449b-87b9-99606d0511b3",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"office-v1\",\n\t\"description\": \"Office Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{officeUrl}}/office/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "02.04 Create customer-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "8adf52e4-af8a-49c8-86fc-c3174e637283",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"customer-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{customerUrl}}/customer/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "02.05 Create accounting-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "6a24d7f4-0056-42e6-8d20-c7d3bd3dfd09",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"accounting-v1\",\n\t\"description\": \"Accounting Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{accountingUrl}}/accounting/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "02.06 Create portfolio-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "3efb77f8-9bc7-4835-87e8-b4ebfb7abd11",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"portfolio-v1\",\n\t\"description\": \"Portfolio\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{portfolioUrl}}/portfolio/v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "02.07 Create deposit-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "870693ae-6f50-4b8e-9920-fa45e184f732",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"deposit-v1\",\n\t\"description\": \"Deposit Management Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{depositUrl}}/deposit/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "02.08 Create teller-v1 application",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "0dbc31fb-0e82-492a-aab8-f30e1fdad5a5",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"teller-v1\",\n\t\"description\": \"Teller\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://{{tellerUrl}}/teller/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.1 Create first tenant 'playground'",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "0b18908b-f2d4-4ce4-a8ad-3d1c0652a1bc",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"identifier\": \"{{tenantIdentifier}}\",\n\t\"name\": \"Playground\",\n\t\"description\": \"Sample tenant for demonstrating Fineract-CN functionality\",\n\t\"cassandraConnectionInfo\": {\n\t\t\"clusterName\": \"datacenter1\",\n\t\t\"contactPoints\": \"cassandra:9042\",\n\t\t\"keyspace\": \"playground\",\n\t\t\"replicationType\": \"Simple\",\n\t\t\"replicas\": \"1\"\n\t},\n\t\"databaseConnectionInfo\": {\n\t\t\"driverClass\": \"org.postgresql.Driver\",\n\t\t\"databaseNa [...]
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.2 Assign identity-v1 for Tenant and obtain Tenant Admin (user antony) Password",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "206c2d92-7c20-46e9-8079-ead0c0adbbe0",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyUserPassword\", jsonData.adminPassword);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"identity-v1\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/identityservice",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"identityservice"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.3 Login Antony (tenant superadmin) with obtained password",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "b3b88517-d738-461b-ba9a-f57e872dfcb2",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username={{antonyUser}}&password={{antonyUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "{{antonyUser}}"
+						},
+						{
+							"key": "password",
+							"value": "{{antonyUserPassword}}"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.4 Change Antony Password to 'antonyPassword'",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "4a97cc02-4f7f-4a0d-b805-5ec4af08f7b0",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"",
+							"var delay3seconds = setTimeout(function(){}, [3000]);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "eaa4397b-8b4a-4032-914a-2408cf82ea4b",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"antonyUserPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`antonyUserPassword as BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"antonyUserPassword\", base64);"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"password\": \"{{antonyUserPassword}}\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users/antony/password",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users",
+						"antony",
+						"password"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.5 LOGIN ANTONY (tenant SuperAdmin) with pwd 'antonyPassword'",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"type": "text/javascript",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						]
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=antony&password={{antonyUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "antony"
+						},
+						{
+							"key": "password",
+							"value": "{{antonyUserPassword}}"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.01 Assign rhythm-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "ba66d4b9-95a1-45de-9d59-d54308c72273",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"var delay90seconds = setTimeout(function(){}, [90000]);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"rhythm-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.02 Assign office-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "7f3f5ba7-5b63-4a44-b491-12e0436c1056",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"var delay20seconds = setTimeout(function(){}, [20000]);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"office-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.03 Assign customer-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "d5f166cb-0a4d-44e2-ab41-fde67c2d1af7",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"var delay20seconds = setTimeout(function(){}, [20000]);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"customer-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.1 Create administrator role for tenant \"playground\"",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"setTimeout(function(){}, [3000]);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"identifier\": \"administrator\",\n  \"permissions\": [\n    {\n      \"permittableEndpointGroupIdentifier\": \"accounting__v1__account\",\n      \"allowedOperations\": [\n        \"READ\",\n        \"CHANGE\",\n        \"DELETE\"\n      ]\n    },\n    {\n      \"permittableEndpointGroupIdentifier\": \"accounting__v1__fin_condition\",\n      \"allowedOperations\": [\n        \"READ\",\n        \"CHANGE\",\n        \"DELETE\"\n      ]\n    },\n    {\n      \"permittable [...]
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/roles",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"roles"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.2 Create Admin User operator with password 'initialPassword'",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "9486d316-2aca-409a-88ff-f17770249dca",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"var delay90seconds = setTimeout(function(){}, [2000]);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "115a549d-513d-46ef-b8af-f9be111bd55d",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"initialPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`operatorPassword in BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"adminUserPassword\", base64);"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"identifier\": \"operator\",\n\t\"role\": \"administrator\",\n\t\"password\": \"{{adminUserPassword}}\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.3 Log in with initial password",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "90d180ba-a4a4-47ce-b018-94c75b0ebe65",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"adminUserToken\", jsonData.accessToken);",
+							"",
+							"const moment = require('moment');",
+							"var timestamp = moment().format(\"YYYY-MM-DD\") + \"T\" + moment().format(\"HH:mm:ss\");",
+							"tests[\"initial password is expired\"] = jsonData.passwordExpiration < timestamp;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "0f7bafa6-8124-42cc-b0a4-9571119a5fc8",
+						"exec": [
+							"var delay3seconds = setTimeout(function(){}, [3000]);"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=operator&password={{adminUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "operator"
+						},
+						{
+							"key": "password",
+							"value": "{{adminUserPassword}}",
+							"description": "Initial password"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.4 Change user 'operator' password to 'operatorPassword'",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "af5b9059-bf36-4715-acc2-25d272552590",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"var delay90seconds = setTimeout(function(){}, [2000]);",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "91312a48-c2bd-4ea4-b4e6-8c388aec99e9",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"operatorPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`operatorPassword in BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"adminUserPassword\", base64);"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "Authorization",
+						"type": "text",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"type": "text",
+						"value": "{{adminUser}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"password\": \"{{adminUserPassword}}\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users/operator/password",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users",
+						"operator",
+						"password"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.5 LOG IN TENANT ADMIN (operator)",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "c8802a96-df5a-4916-b6fb-e27b33c386e6",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"adminUserToken\", jsonData.accessToken);",
+							"",
+							"const moment = require('moment');",
+							"var timestamp = moment().format(\"YYYY-MM-DD\") + \"T\" + moment().format(\"HH:mm:ss\");",
+							"tests[\"password is not expired\"] = jsonData.passwordExpiration > timestamp;",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=operator&password={{adminUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "operator"
+						},
+						{
+							"key": "password",
+							"value": "{{adminUserPassword}}"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.6 Pull operator permissions",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "9486d316-2aca-409a-88ff-f17770249dca",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "115a549d-513d-46ef-b8af-f9be111bd55d",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"operatorPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`operatorPassword in BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"adminUserPassword\", base64);"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users/operator/permissions",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users",
+						"operator",
+						"permissions"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.1 Create Scheduler role for tenant playground",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"var delay90seconds = setTimeout(function(){}, [2000]);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"identifier\": \"scheduler\",\n  \"permissions\": [\n    {\n      \"permittableEndpointGroupIdentifier\": \"identity__v1__app_self\",\n      \"allowedOperations\": [\n        \"CHANGE\"\n      ]\n    },\n    {\n      \"permittableEndpointGroupIdentifier\": \"portfolio__v1__khepri\",\n      \"allowedOperations\": [\n        \"CHANGE\"\n      ]\n    }\n  ]\n}\n",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/roles",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"roles"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.2 Create Scheduler user imhotep with password 'initialImhotepPassword'",
+			"event": [
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "3469215d-1ba4-4891-aa3f-e45e343ab4de",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"",
+							"//Encrypt",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"initialImhotepPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`imhotepPassword in BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"schedulerUserPassword\", base64);",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				},
+				{
+					"listen": "test",
+					"script": {
+						"id": "1cad925a-87b3-4ba2-af86-a4d499d68f22",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"setTimeout(function(){}, [3000]);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"identifier\": \"imhotep\",\n\t\"role\": \"scheduler\",\n\t\"password\": \"{{schedulerUserPassword}}\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.3 Login Scheduler user imhotep",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "272b3e2a-f1b2-41da-aa5d-9e017555d6d2",
+						"exec": [
+							"var jsonData = JSON.parse(responseBody);",
+							"",
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"tests[\"access token was returned \"] = jsonData.accessToken !== undefined;",
+							"",
+							"postman.setEnvironmentVariable(\"schedulerUserToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "dd4a949c-cf1e-4385-aa25-3cb53d39d56d",
+						"exec": [
+							"var delay3seconds = setTimeout(function(){}, [3000]);"
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=imhotep&password={{schedulerUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "imhotep"
+						},
+						{
+							"key": "password",
+							"value": "{{schedulerUserPassword}}"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.4 Change imhotep user password to 'imhotepPassword'",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "af5b9059-bf36-4715-acc2-25d272552590",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"var delay2seconds = setTimeout(function(){}, [2000]);",
+							"",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "0198f255-d555-4a77-8825-04c5bbd1c54d",
+						"exec": [
+							"var CryptoJS = require(\"crypto-js\")",
+							"",
+							"//Encrypt",
+							"var rawStr = CryptoJS.enc.Utf8.parse(\"imhotepPassword\")",
+							"var base64 = CryptoJS.enc.Base64.stringify(rawStr)",
+							"console.log(`imhotepPassword in BASE64: ${base64}`)",
+							"postman.setEnvironmentVariable(\"schedulerUserPassword\", base64);",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{schedulerUserToken}}",
+						"type": "text"
+					},
+					{
+						"key": "User",
+						"value": "imhotep",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"password\": \"{{schedulerUserPassword}}\"\n}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users/imhotep/password",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users",
+						"imhotep",
+						"password"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.5 Login user imhotep (who has scheduler role)",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"schedulerUserToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=imhotep&password={{schedulerUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "imhotep"
+						},
+						{
+							"key": "password",
+							"value": "{{schedulerUserPassword}}"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.6 enable permission identity__v1__app_self for imhotep",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "User",
+						"value": "imhotep",
+						"type": "text"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{schedulerUserToken}}",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "true",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/applications/rhythm-v1/permissions/identity__v1__app_self/users/imhotep/enabled",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"applications",
+						"rhythm-v1",
+						"permissions",
+						"identity__v1__app_self",
+						"users",
+						"imhotep",
+						"enabled"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.01 Assign accounting-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "af1b9ac1-c66c-4353-b59b-ec3e1bea864c",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"var delay90seconds = setTimeout(function(){}, [90000]);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"accounting-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.020 Assign portfolio-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "ef7b5c59-1623-4183-8196-b76e30922713",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"var delay90seconds = setTimeout(function(){}, [90000]);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"value": "application/json",
+						"type": "text"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"portfolio-v1\"\n\t}\n]",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.022 enable permission portfolio__v1__khepri for user imhotep",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "5830a8cd-f000-4b41-bfd2-1ac8c96812e4",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"name": "Content-Type",
+						"type": "text",
+						"value": "application/json"
+					},
+					{
+						"key": "User",
+						"value": "imhotep",
+						"type": "text"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{schedulerUserToken}}",
+						"type": "text"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "true",
+					"options": {
+						"raw": {
+							"language": "json"
+						}
+					}
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/applications/rhythm-v1/permissions/portfolio__v1__khepri/users/imhotep/enabled",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"applications",
+						"rhythm-v1",
+						"permissions",
+						"portfolio__v1__khepri",
+						"users",
+						"imhotep",
+						"enabled"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.03 Assign deposits for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "8b4e42c3-5a2f-437d-8f2c-55a6d398f601",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"var delay90seconds = setTimeout(function(){}, [90000]);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"deposit-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.04 Assign teller-v1 for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "99d87103-9033-4dc9-aaef-b82aef6f8e3a",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"teller-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "08.1 Create REVENUE ledgers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "6260a2d4-def6-40e4-a87e-38f3d01f16b3",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"description\": null,\n  \"type\": \"REVENUE\",\n  \"identifier\": \"1000\",\n  \"name\": \"Income\",\n  \"subLedgers\": [\n    {\n      \"description\": null,\n      \"type\": \"REVENUE\",\n      \"identifier\": \"1100\",\n      \"name\": \"Income from Loans\",\n      \"subLedgers\": [],\n      \"showAccountsInChart\": true\n    },\n    {\n      \"description\": null,\n      \"type\": \"REVENUE\",\n      \"identifier\": \"1200\",\n      \"name\": \"Investment Income\" [...]
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/ledgers",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"ledgers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "08.2 Create EXPENSE Ledgers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "be1a9019-cb18-4084-802b-cc6169e0b091",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"description\": null,\n  \"type\": \"EXPENSE\",\n  \"identifier\": \"2000\",\n  \"name\": \"Expenses\",\n  \"showAccountsInChart\": true,\n  \"subLedgers\": [\n    {\"description\": null, \"type\": \"EXPENSE\", \"identifier\": \"2100\",  \"name\": \"Employee Compensation\", \"subLedgers\": [], \"showAccountsInChart\": true },\n    {\"description\": null, \"type\": \"EXPENSE\", \"identifier\": \"2200\",  \"name\": \"Employee Benefits\", \"subLedgers\": [], \"showAccount [...]
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/ledgers",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"ledgers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "08.3 Create ASSETS ledgers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "3585bd0e-9598-43e6-b678-645bd64855dd",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"description\": null,\n  \"type\": \"ASSET\",\n  \"identifier\": \"7000\",\n  \"name\": \"Assets\",\n  \"showAccountsInChart\": true,\n  \"subLedgers\": [\n    {\n      \"description\": null,\n      \"type\": \"ASSET\",\n      \"identifier\": \"7010\",\n      \"name\": \"Loans to Members\",\n      \"subLedgers\": [],\n      \"showAccountsInChart\": true\n    },\n    {\n      \"description\": null,\n      \"type\": \"ASSET\",\n      \"identifier\": \"7020\",\n      \"na [...]
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/ledgers",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"ledgers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "08.4 Create LIABILITY ledgers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "708e63ea-73ac-4c20-a92d-915fba3135f6",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"description\": null,\n  \"type\": \"LIABILITY\",\n  \"identifier\": \"8000\",\n  \"name\": \"Accounts Payable\",\n  \"showAccountsInChart\": true,\n  \"subLedgers\": [\n    {\n      \"description\": null,\n      \"type\": \"LIABILITY\",\n      \"identifier\": \"8100\",\n      \"name\": \"Accounts Payable\",\n      \"subLedgers\": [],\n      \"showAccountsInChart\": true\n    },\n    {\n      \"description\": null,\n      \"type\": \"LIABILITY\",\n      \"identifier\": [...]
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/ledgers",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"ledgers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "08.5 Create EQUITY ledgers",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "e240003c-12d2-492c-bf43-970ed16564d5",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n  \"description\": null,\n  \"type\": \"EQUITY\",\n  \"identifier\": \"9000\",\n  \"name\": \"Equity\",\n  \"showAccountsInChart\": true,\n  \"subLedgers\": [\n    {\n      \"description\": null,\n      \"type\": \"EQUITY\",\n      \"identifier\": \"9100\",\n      \"name\": \"Member Savings\",\n      \"subLedgers\": [],\n      \"showAccountsInChart\": true\n    },\n    {\n      \"description\": null,\n      \"type\": \"EQUITY\",\n      \"identifier\": \"9300\",\n      \"n [...]
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/ledgers",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"ledgers"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "08.6 Assert ledgers created",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "e240003c-12d2-492c-bf43-970ed16564d5",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"tests[\"There are 84 accounts\"] =  jsonData.totalElements === 5;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				},
+				{
+					"listen": "prerequest",
+					"script": {
+						"id": "bd18e656-94f9-4c09-94df-69becea56213",
+						"exec": [
+							"var delay3seconds = setTimeout(function(){}, [3000]);",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"protocolProfileBehavior": {
+				"disableBodyPruning": true
+			},
+			"request": {
+				"method": "GET",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{adminUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{adminUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": ""
+				},
+				"url": {
+					"raw": "http://{{accountingUrl}}/accounting/v1/ledgers",
+					"protocol": "http",
+					"host": [
+						"{{accountingUrl}}"
+					],
+					"path": [
+						"accounting",
+						"v1",
+						"ledgers"
+					]
+				}
+			},
+			"response": []
+		}
+	],
+	"event": [
+		{
+			"listen": "prerequest",
+			"script": {
+				"id": "ab95cd30-13ab-41bc-a153-9c3625d46c11",
+				"type": "text/javascript",
+				"exec": [
+					""
+				]
+			}
+		},
+		{
+			"listen": "test",
+			"script": {
+				"id": "7e7f5c21-17f8-46e4-a2ab-c2367357569d",
+				"type": "text/javascript",
+				"exec": [
+					""
+				]
+			}
+		}
+	],
+	"protocolProfileBehavior": {}
+}
\ No newline at end of file


[fineract-cn-docker-compose] 22/44: fix typos in Postman scripts

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit c3cd6a25618059165727b89742f0961b66f97517
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Oct 2 14:54:02 2019 +0300

    fix typos in Postman scripts
---
 .../Fineract-Cn-Initial-Requests.postman_collection.json          | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
index ef7e4af..dc1de37 100644
--- a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
+++ b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
@@ -490,7 +490,7 @@
 					"raw": "[\n\t{\n\t\t\"name\": \"identity-v1\"\n\t}\n]"
 				},
 				"url": {
-					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/s{{tenantIdentifier}}/applications",
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
 					"protocol": "http",
 					"host": [
 						"{{provisionerUrl}}"
@@ -499,7 +499,7 @@
 						"provisioner",
 						"v1",
 						"tenants",
-						"s{{tenantIdentifier}}",
+						"{{tenantIdentifier}}",
 						"applications"
 					]
 				}
@@ -543,7 +543,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"rhythm-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://rhythym-ms:2022/rhythm/v1\"\n}",
+					"raw": "{\n\t\"name\": \"rhythm-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://rhythm-ms:2022/rhythm/v1\"\n}",
 					"options": {
 						"raw": {
 							"language": "json"
@@ -3743,4 +3743,4 @@
 		}
 	],
 	"protocolProfileBehavior": {}
-}
\ No newline at end of file
+}


[fineract-cn-docker-compose] 38/44: fix a few typos

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 43cf8e8451711204127917517cff6d4f663e0232
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Nov 20 08:46:17 2019 +0200

    fix a few typos
---
 docker-compose.yml | 2 +-
 env_variables      | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index e5492f8..18f0829 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -560,7 +560,7 @@ services:
         ipv4_address: ${GROUP_IP}
 
   notifications-ms:
-    image: apache/fineract-cn-notifications:latestC
+    image: apache/fineract-cn-notifications:latest
     ports:
       - "2033:2033"
     environment:
diff --git a/env_variables b/env_variables
index 1ab0b3e..cf9cc56 100644
--- a/env_variables
+++ b/env_variables
@@ -8,13 +8,14 @@ EUREKA_CLIENT_INITIALINSTANCEINFOREPLICATIONINTERVALSECONDS=25
 EUREKA_CLIENT_INSTANCEINFOREPLICATIONINTERVALSECONDS=20
 EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE=http://eureka:8761/eureka
 EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS=20
+SERVER_MAX_HTTP_HEADER_SIZE=16384
 POSTGRESQL_HOST=postgres
 POSTGRESQL_PORT=5432
 POSTGRESQL_USER=postgres
 RIBBON_EUREKA_SERVER=eureka:9090
 SCHEDULER_USER_NAME=imhotep
 SYSTEM_INITIAL_CLIENT_ID=service-runner
-
+FIMS_WEB_APP_IP=172.16.238.19
 PROVISIONER_IP=172.16.238.20
 IDENTITY_IP=172.16.238.21
 RHYTHM_IP=172.16.238.22


[fineract-cn-docker-compose] 17/44: Implement bash scripts to provisioner fineract cn services

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 8ae755b046282f82f6fd1cf74f9924b25510cdda
Author: Anh3h <co...@gmail.com>
AuthorDate: Wed Sep 18 03:10:16 2019 -0400

    Implement bash scripts to provisioner fineract cn services
---
 README.md                         |  23 ++-
 bash_scripts/provision.sh         | 311 ++++++++++++++++++++++++++++++++++++++
 docker-compose.yml                |   1 +
 external_tools/docker-compose.yml |   4 +
 shut-down-and-reset.sh            |   8 +
 start-up.sh                       |  18 ++-
 6 files changed, 356 insertions(+), 9 deletions(-)

diff --git a/README.md b/README.md
index f049eb4..1cc8d35 100644
--- a/README.md
+++ b/README.md
@@ -5,10 +5,25 @@ This project contains Docker Compose Scripts for running Fineract CN especially
 - Docker
 - Docker-compose
 
-## Automatic or manual provisioning
+## Deploy and provision Fineract CN
 
-You can either try to provision automatically using bash script `bash start-up.sh`
-Or you could achieve the same state by manually following the instructions below:
+You can either deploy and provision Fineract CN automatically using bash scripts or manually using postman.
+
+## 1. Deploy Fineract automtically using bash scripts
+
+ - To start up all the Fineract CN services run:
+
+    `bash start-up.sh`
+ - Then log the last Fineract CN microservice deployed by docker compose (fineract-cn-notification) to make sure all your Fineract services are now available.
+
+    `docker logs -f fineract-cn-docker-compose_notifications-ms_1`
+ - Finally provison the microservices by
+
+    `cd bash_scripts`
+
+    `bash provision.sh playground` #where playground is your tenant name
+
+## 2. Deploy Fineract manually using postman
 
 ## Perquisites
 
@@ -37,7 +52,7 @@ docker-compose up
 First only start provisioner-ms by running following in project root:
 
 ```
-docker-compose up provisioner-ms 
+docker-compose up provisioner-ms
 ```
 after it has started (and created table seshat to postgres) stop it.
 This is just to make sure provisioner gets to create the database the other services require.
diff --git a/bash_scripts/provision.sh b/bash_scripts/provision.sh
new file mode 100755
index 0000000..b179054
--- /dev/null
+++ b/bash_scripts/provision.sh
@@ -0,0 +1,311 @@
+#!/bin/bash
+set -e
+
+function init-variables {
+    CASSANDRA_REPLICATION_TYPE="Simple"
+    CASSANDRA_CONTACT_POINTS="cassandra:9042"
+    CASSANDRA_CLUSTER_NAME="Datacenter1"
+    CASSANDRA_REPLICAS="1"
+
+    POSTGRES_DRIVER_CLASS="org.postgresql.Driver"
+    POSTGRES_HOST="postgres"
+    POSTGRES_PWD="postgres"
+    POSTGRESQL_PORT="5432"
+    POSTGRESQL_USER="postgres"
+
+    PROVISIONER_URL="http://provisioner-ms:2020/provisioner/v1"
+    IDENTITY_URL="http://identity-ms:2021/identity/v1"
+    RHYTHM_URL="http://rhythm-ms:2022/rhythm/v1"
+    OFFICE_URL="http://office-ms:2023/office/v1"
+    CUSTOMER_URL="http://customer-ms:2024/customer/v1"
+    ACCOUNTING_URL="http://accounting-ms:2025/accounting/v1"
+    PORTFOLIO_URL="http://portfolio-ms:2026/portfolio/v1"
+    DEPOSIT_URL="http://deposit-account-management-ms:2027/deposit/v1"
+    TELLER_URL="http://teller-ms:2028/teller/v1"
+    REPORT_URL="http://reporting-ms:2029/report/v1"
+    CHEQUES_URL="http://cheques-ms:2030/cheques/v1"
+    PAYROLL_URL="http://payroll-ms:2031/payroll/v1"
+    GROUP_URL="http://group-ms:2032/group/v1"
+    NOTIFICATIONS_URL="http://notifications-ms:2033/notification/v1"
+
+    MS_VENDOR="Apache Fineract"
+    IDENTITY_MS_NAME="identity-v1"
+    RHYTHM_MS_NAME="rhythm-v1"
+    OFFICE_MS_NAME="office-v1"
+    CUSTOMER_MS_NAME="customer-v1"
+    ACCOUNTING_MS_NAME="accounting-v1"
+    PORTFOLIO_MS_NAME="portfolio-v1"
+    DEPOSIT_MS_NAME="deposit-v1"
+    TELLER_MS_NAME="teller-v1"
+    REPORT_MS_NAME="report-v1"
+    CHEQUES_MS_NAME="cheques-v1"
+    PAYROLL_MS_NAME="payroll-v1"
+    GROUP_MS_NAME="group-v1"
+    NOTIFICATIONS_MS_NAME="notification-v1"
+}
+
+function auto-seshat {
+    TOKEN=$( curl -s -X POST -H "Content-Type: application/json" \
+        "$PROVISIONER_URL"'/auth/token?grant_type=password&client_id=service-runner&username=wepemnefret&password=oS/0IiAME/2unkN1momDrhAdNKOhGykYFH/mJN20' \
+         | jq --raw-output '.token' )
+}
+
+function login {
+    local tenant="$1"
+    local username="$2"
+    local password="$3"
+
+    ACCESS_TOKEN=$( curl -s -X POST -H "Content-Type: application/json" -H "User: guest" -H "X-Tenant-Identifier: $tenant" \
+       "${IDENTITY_URL}/token?grant_type=password&username=${username}&password=${password}" \
+        | jq --raw-output '.accessToken' )
+}
+
+function create-application {
+    local name="$1"
+    local description="$2"
+    local vendor="$3"
+    local homepage="$4"
+
+    curl -H "Content-Type: application/json" -H "User: wepemnefret" -H "Authorization: ${TOKEN}" \
+    --data '{ "name": "'"$name"'", "description": "'"$description"'", "vendor": "'"$vendor"'", "homepage": "'"$homepage"'" }' \
+     ${PROVISIONER_URL}/applications
+    echo "Created microservice: $name"
+}
+
+function get-application {
+    echo ""
+    echo "Microservices: "
+    curl -s -H "Content-Type: application/json" -H "User: wepemnefret" -H "Authorization: ${TOKEN}" ${PROVISIONER_URL}/applications | jq '.'
+}
+
+function delete-application {
+    local service_name="$1"
+
+    curl -X delete -H "Content-Type: application/json" -H "User: wepemnefret" -H "Authorization: ${TOKEN}" ${PROVISIONER_URL}/applications/${service_name}
+    echo "Deleted microservice: $name"
+}
+
+function create-tenant {
+    local identifier="$1"
+    local name="$2"
+    local description="$3"
+    local database_name="$4"
+
+    curl -H "Content-Type: application/json" -H "User: wepemnefret" -H "Authorization: ${TOKEN}" \
+    --data '{
+	"identifier": "'"$identifier"'",
+	"name": "'"$name"'",
+	"description": "'"$description"'",
+	"cassandraConnectionInfo": {
+		"clusterName": "'"$CASSANDRA_CLUSTER_NAME"'",
+		"contactPoints": "'"$CASSANDRA_CONTACT_POINTS"'",
+		"keyspace": "'"$database_name"'",
+		"replicationType": "'"$CASSANDRA_REPLICATION_TYPE"'",
+		"replicas": "'"$CASSANDRA_REPLICAS"'"
+	},
+	"databaseConnectionInfo": {
+		"driverClass": "'"$POSTGRES_DRIVER_CLASS"'",
+		"databaseName": "'"$database_name"'",
+		"host": "'"$POSTGRES_HOST"'",
+		"port": "'"$POSTGRES_PORT"'",
+		"user": "'"$POSTGRES_USER"'",
+		"password": "'"$POSTGRES_PWD"'"
+	}}' \
+    ${PROVISIONER_URL}/tenants
+    echo "Created tenant: $database_name"
+}
+
+function get-tenants {
+    echo ""
+    echo "Tenants: "
+    curl -s -H "Content-Type: application/json" -H "User: wepemnefret" -H "Authorization: ${TOKEN}" ${PROVISIONER_URL}/tenants | jq '.'
+}
+
+function assign-identity-ms {
+    local tenant="$1"
+
+    ADMIN_PASSWORD=$( curl -s -H "Content-Type: application/json" -H "User: wepemnefret" -H "Authorization: ${TOKEN}" -H "X-Tenant-Identifier: $tenant" \
+	--data '{ "name": "'"$IDENTITY_MS_NAME"'" }' \
+	${PROVISIONER_URL}/tenants/${tenant}/identityservice | jq --raw-output '.adminPassword')
+    echo "Assigned identity microservice for tenant $tenant"
+}
+
+function get-tenant-services {
+    local tenant="$1"
+
+    echo ""
+    echo "$tenant services: "
+    curl -s -H "Content-Type: application/json" -H "User: wepemnefret" -H "Authorization: ${TOKEN}" -H "X-Tenant-Identifier: $tenant" ${PROVISIONER_URL}/tenants/$tenant/applications | jq '.'
+}
+
+function create-scheduler-role {
+    local tenant="$1"
+
+    curl -H "Content-Type: application/json" -H "User: antony" -H "Authorization: ${ACCESS_TOKEN}" -H "X-Tenant-Identifier: $tenant" \
+        --data '{
+                "identifier": "scheduler",
+                "permissions": [
+                        {
+                                "permittableEndpointGroupIdentifier": "identity__v1__app_self",
+                                "allowedOperations": ["CHANGE"]
+                        },
+                        {
+                                "permittableEndpointGroupIdentifier": "portfolio__v1__khepri",
+                                "allowedOperations": ["CHANGE"]
+                        }
+                ]
+        }' \
+        ${IDENTITY_URL}/roles
+    echo "Created scheduler role"
+}
+
+function create-org-admin-role {
+    local tenant="$1"
+
+    curl -H "Content-Type: application/json" -H "User: antony" -H "Authorization: ${ACCESS_TOKEN}" -H "X-Tenant-Identifier: $tenant" \
+        --data '{
+                "identifier": "orgadmin",
+                "permissions": [
+                        {
+                                "permittableEndpointGroupIdentifier": "office__v1__employees",
+                                "allowedOperations": ["READ", "CHANGE", "DELETE"]
+                        },
+                        {
+                                "permittableEndpointGroupIdentifier": "office__v1__offices",
+                                "allowedOperations": ["READ", "CHANGE", "DELETE"]
+                        },
+                        {
+                                "permittableEndpointGroupIdentifier": "identity__v1__users",
+                                "allowedOperations": ["READ", "CHANGE", "DELETE"]
+                        },
+                        {
+                                "permittableEndpointGroupIdentifier": "identity__v1__roles",
+                                "allowedOperations": ["READ", "CHANGE", "DELETE"]
+                        },
+                        {
+                                "permittableEndpointGroupIdentifier": "identity__v1__self",
+                                "allowedOperations": ["READ", "CHANGE", "DELETE"]
+                        },
+                        {
+                                "permittableEndpointGroupIdentifier": "accounting__v1__ledger",
+                                "allowedOperations": ["READ", "CHANGE", "DELETE"]
+                        },
+                        {
+                                "permittableEndpointGroupIdentifier": "accounting__v1__account",
+                                "allowedOperations": ["READ", "CHANGE", "DELETE"]
+                        }
+                ]
+        }' \
+        ${IDENTITY_URL}/roles
+    echo "Created organisation administrator role"
+}
+
+function create-user {
+    local tenant="$1"
+    local user="$2"
+    local user_identifier="$3"
+    local password="$4"
+    local role="$5"
+
+    curl -s -H "Content-Type: application/json" -H "User: $user" -H "Authorization: ${ACCESS_TOKEN}" -H "X-Tenant-Identifier: $tenant" \
+        --data '{
+                "identifier": "'"$user_identifier"'",
+                "password": "'"$password"'",
+                "role": "'"$role"'"
+        }' \
+        ${IDENTITY_URL}/users | jq '.'
+    echo "Created user: $user_identifier"
+}
+
+function get-users {
+    local tenant="$1"
+    local user="$2"
+
+    echo ""
+    echo "Users: "
+    curl -s -H "Content-Type: application/json" -H "User: $user" -H "Authorization: ${ACCESS_TOKEN}" -H "X-Tenant-Identifier: $tenant" ${IDENTITY_URL}/users | jq '.'
+}
+
+function update-password {
+    local tenant="$1"
+    local user="$2"
+    local password="$3"
+
+    curl -s -X PUT -H "Content-Type: application/json" -H "User: $user" -H "Authorization: ${ACCESS_TOKEN}" -H "X-Tenant-Identifier: $tenant" \
+        --data '{
+                "password": "'"$password"'"
+        }' \
+        ${IDENTITY_URL}/users/${user}/password | jq '.'
+    echo "Updated $user password"
+}
+
+function provision-app {
+    local tenant="$1"
+    local service="$2"
+
+    curl -s -X PUT -H "Content-Type: application/json" -H "User: wepemnefret" -H "Authorization: ${TOKEN}" \
+	--data '[{ "name": "'"$service"'" }]' \
+	${PROVISIONER_URL}/tenants/${tenant}/applications | jq '.'
+    echo "Provisioned microservice, $service for tenant, $tenant"
+}
+
+function set-application-permission-enabled-for-user {
+    local tenant="$1"
+    local service="$2"
+    local permission="$3"
+    local user="$4"
+
+    curl -s -X PUT -H "Content-Type: application/json" -H "User: $user" -H "Authorization: ${ACCESS_TOKEN}" -H "X-Tenant-Identifier: $tenant" \
+	--data 'true' \
+	${IDENTITY_URL}/applications/${service}/permissions/${permission}/users/${user}/enabled | jq '.'
+    echo "Enabled permission, $permission for service $service"
+}
+
+init-variables
+auto-seshat
+create-application "$IDENTITY_MS_NAME" "" "$MS_VENDOR" "$IDENTITY_URL"
+create-application "$RHYTHM_MS_NAME" "" "$MS_VENDOR" "$RHYTHM_URL"
+create-application "$OFFICE_MS_NAME" "" "$MS_VENDOR" "$OFFICE_URL"
+create-application "$CUSTOMER_MS_NAME" "" "$MS_VENDOR" "$CUSTOMER_URL"
+create-application "$ACCOUNTING_MS_NAME" "" "$MS_VENDOR" "$ACCOUNTING_URL"
+create-application "$PORTFOLIO_MS_NAME" "" "$MS_VENDOR" "$PORTFOLIO_URL"
+create-application "$DEPOSIT_MS_NAME" "" "$MS_VENDOR" "$DEPOSIT_URL"
+create-application "$TELLER_MS_NAME" "" "$MS_VENDOR" "$TELLER_URL"
+create-application "$REPORT_MS_NAME" "" "$MS_VENDOR" "$REPORT_URL"
+create-application "$CHEQUES_MS_NAME" "" "$MS_VENDOR" "$CHEQUES_URL"
+create-application "$PAYROLL_MS_NAME" "" "$MS_VENDOR" "$PAYROLL_URL"
+create-application "$GROUP_MS_NAME" "" "$MS_VENDOR" "$GROUP_URL"
+create-application "$NOTIFICATIONS_MS_NAME" "" "$MS_VENDOR" "$NOTIFICATIONS_URL"
+
+#Set tenant identifier
+TENANT=$1
+create-tenant ${TENANT} "${TENANT}" "All in one Demo Server" ${TENANT}
+assign-identity-ms ${TENANT}
+login ${TENANT} "antony" $ADMIN_PASSWORD
+create-scheduler-role ${TENANT}
+create-user ${TENANT} "antony" "imhotep" "p4ssw0rd" "scheduler"
+login ${TENANT} "imhotep" "p4ssw0rd"
+update-password ${TENANT} "imhotep" "p4ssw0rd"
+provision-app ${TENANT} $RHYTHM_MS_NAME
+login ${TENANT} "imhotep" "p4ssw0rd"
+# Rhythm is not available at the moment
+# set-application-permission-enabled-for-user ${TENANT} $RHYTHM_MS_NAME "identity__v1__app_self" "imhotep"
+provision-app ${TENANT} $OFFICE_MS_NAME
+provision-app ${TENANT} $ACCOUNTING_MS_NAME
+provision-app ${TENANT} $PORTFOLIO_MS_NAME
+# Rhythm is not available at the moment
+# set-application-permission-enabled-for-user ${TENANT} $RHYTHM_MS_NAME "portfolio__v1__khepri" "imhotep"
+provision-app ${TENANT} $CUSTOMER_MS_NAME
+provision-app ${TENANT} $DEPOSIT_MS_NAME
+provision-app ${TENANT} $TELLER_MS_NAME
+provision-app ${TENANT} $REPORT_MS_NAME
+provision-app ${TENANT} $CHEQUES_MS_NAME
+provision-app ${TENANT} $PAYROLL_MS_NAME
+provision-app ${TENANT} $GROUP_MS_NAME
+provision-app ${TENANT} $NOTIFICATIONS_MS_NAME
+login ${TENANT} "antony" $ADMIN_PASSWORD
+create-org-admin-role ${TENANT}
+create-user ${TENANT} "antony" "operator" "init1@l23" "orgadmin"
+login ${TENANT} "operator" "init1@l"
+
+echo "COMPLETED PROVISIONING PROCESS."
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index 2f7acaf..73e58aa 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -157,6 +157,7 @@ services:
       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
       postgresql.host: ${POSTGRESQL_HOST}
       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
diff --git a/external_tools/docker-compose.yml b/external_tools/docker-compose.yml
index 137ad0f..010666d 100644
--- a/external_tools/docker-compose.yml
+++ b/external_tools/docker-compose.yml
@@ -39,6 +39,10 @@ services:
   postgres:
     image: postgres:11
     container_name: postgres
+    command:
+      - "postgres"
+      - "-c"
+      - "max_connections=200"
     environment:
       POSTGRES_USER: postgres
       POSTGRES_PASSWORD: postgres
diff --git a/shut-down-and-reset.sh b/shut-down-and-reset.sh
new file mode 100755
index 0000000..a4941bb
--- /dev/null
+++ b/shut-down-and-reset.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+docker-compose down --remove-orphans
+cd external_tools/
+docker-compose down
+cd ..
+docker volume rm external_tools_cassandra-volume
+docker volume rm external_tools_postgres-volume
\ No newline at end of file
diff --git a/start-up.sh b/start-up.sh
index 97deace..8111bb8 100755
--- a/start-up.sh
+++ b/start-up.sh
@@ -1,12 +1,13 @@
 #!/bin/sh
 set -e
 
+# Start up Eureka, ActiveMQ, Cassandra and Postgres
 cd external_tools/
 docker-compose up -d
 cassandra_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cassandra)
 postgres_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' postgres)
 
-# #Test Cassandra and Postgres
+#Test Cassandra and Postgres
 echo "Waiting for Cassandra and Postgres ..."
 while ! nc -z "${cassandra_ip}" 9042 ; do
   sleep 1
@@ -17,10 +18,17 @@ done
 echo "Cassandra and Postgres are up and running..."
 cd ..
 
-echo "Starting up Fineract CN microservices..."
-wget https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/lang/0.1.0-BUILD-SNAPSHOT/lang-0.1.0-BUILD-SNAPSHOT.jar
-java -cp lang-0.1.0-BUILD-SNAPSHOT.jar org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env
+# Start up Fineract CN microservices
+java -cp external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env
 cat env_variables >> .env
 
+echo "Starting Provisioner... "
+docker-compose up -d provisioner-ms
+# Make sure provisioner is up and running
+echo "Waiting for provisioner to initialize database... "
+while ! docker logs fineract-cn-docker-compose_provisioner-ms_1 | grep -q "Started ProvisionerApplication in"; do
+  sleep 1
+done
+echo "Start remaining Fineract CN microservices... "
 docker-compose up -d
-echo "Successfully started fineract services."
+echo "Successfully started fineract services."
\ No newline at end of file


[fineract-cn-docker-compose] 33/44: Merge pull request #12 from aasaru/working_postman

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit f20039c36227e954a6ee1b6a0d0c5c12bf17d791
Merge: e472103 bedf03b
Author: aasaru <aa...@gmail.com>
AuthorDate: Fri Oct 18 16:51:15 2019 +0300

    Merge pull request #12 from aasaru/working_postman
    
    improve Postman scripts

 README.md                                          |   14 +-
 docker-compose.yml                                 |  310 +-
 env_variables                                      |   16 +-
 external_tools/docker-compose.yml                  |    6 +-
 ...act-Cn-Initial-Requests.postman_collection.json | 3079 +++++++++++++-------
 ...tial-Setup-Environment.postman_environment.json |   80 +-
 6 files changed, 2440 insertions(+), 1065 deletions(-)


[fineract-cn-docker-compose] 11/44: FINCN-165 fix provisioner network settings

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit eeebf2acdfd3aeeca75f63969cac888ef35c9fbf
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Sep 11 20:45:21 2019 +0300

    FINCN-165 fix provisioner network settings
---
 docker-compose.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docker-compose.yml b/docker-compose.yml
index d0c1a09..7b4dfd9 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -163,6 +163,7 @@ services:
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
       external_tools_default:
+      fineract:
         ipv4_address: ${PORTFOLIO_IP}
 
   deposit-account-management-ms:


[fineract-cn-docker-compose] 39/44: first idea of an integration test

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit e44bb688e89a04e943225ea2692d5b8176f2a74b
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Nov 20 08:48:34 2019 +0200

    first idea of an integration test
---
 integration_test.sh | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/integration_test.sh b/integration_test.sh
new file mode 100755
index 0000000..4abf7b4
--- /dev/null
+++ b/integration_test.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+
+cd external_tools
+docker-compose stop
+docker-compose rm -v -f
+
+docker volume rm external_tools_cassandra-volume
+docker volume rm external_tools_postgres-volume
+
+docker-compose pull
+
+docker-compose up -d
+sleep 180
+cd ..
+
+java -cp external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env
+cat env_variables >> .env
+
+docker-compose stop
+docker-compose rm -f
+docker-compose pull
+
+docker-compose up -d provisioner-ms
+sleep 180
+
+docker-compose up -d rhythm-ms identity-ms customer-ms accounting-ms deposit-ms portfolio-ms office-ms teller-ms fims-web-app
+sleep 180
+
+


[fineract-cn-docker-compose] 20/44: Merge pull request #6 from Anh3h/master

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 4438bd6521738fb10a7852cd2db9ddfbcc164c1f
Merge: f0e75ee 8ae755b
Author: Courage Angeh <co...@gmail.com>
AuthorDate: Tue Oct 1 11:50:44 2019 -0400

    Merge pull request #6 from Anh3h/master
    
    FINCN-165: Implement bash scripts to provisioner fineract cn services

 README.md                         |  23 ++-
 bash_scripts/provision.sh         | 311 ++++++++++++++++++++++++++++++++++++++
 external_tools/docker-compose.yml |   4 +
 shut-down-and-reset.sh            |   8 +
 start-up.sh                       |  18 ++-
 5 files changed, 355 insertions(+), 9 deletions(-)

diff --cc README.md
index 29e6d5f,1cc8d35..847739e
--- a/README.md
+++ b/README.md
@@@ -37,9 -52,9 +52,9 @@@ docker-compose u
  First only start provisioner-ms by running following in project root:
  
  ```
- docker-compose up provisioner-ms 
+ docker-compose up provisioner-ms
  ```
 -after it has started (and created table seshat to postgres) stop it.
 +after it has started (and created table seshat to Postgre database) you can start rest of the services.
  This is just to make sure provisioner gets to create the database the other services require.
  
  ### Choose the services you want to run


[fineract-cn-docker-compose] 41/44: Merge pull request #15 from aasaru/typo_fixes

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit ecb02efd693b368f8ebc161225f80097747d98cc
Merge: c09dd20 74c156e
Author: aasaru <aa...@gmail.com>
AuthorDate: Wed Nov 20 08:57:25 2019 +0200

    Merge pull request #15 from aasaru/typo_fixes
    
    Typo fixes

 env_variables       |  3 ++-
 integration_test.sh | 29 +++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)


[fineract-cn-docker-compose] 15/44: FINCN-176 point at fixed apache image, fix payroll ip variable name

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit bc970c81a6f7e720872c43e57abdb8d99b225078
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Tue Sep 17 09:43:54 2019 +0300

    FINCN-176 point at fixed apache image, fix payroll ip variable name
---
 docker-compose.yml | 3 +--
 env_variables      | 2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index 6726371..2f7acaf 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -306,8 +306,7 @@ services:
         ipv4_address: ${NOTIFICATIONS_IP}
 
   fims-web-app:
-    #image: apache/fineract-cn-fims-web-app:latest # uncomment after https://github.com/apache/fineract-cn-fims-web-app/pull/20 has been merged
-    image: aasaru/fineract-cn-fims-web-app:latest # temporary
+    image: apache/fineract-cn-fims-web-app:latest
     ports:
       - "8888:8888"
     networks:
diff --git a/env_variables b/env_variables
index dcec372..12b167a 100644
--- a/env_variables
+++ b/env_variables
@@ -25,6 +25,6 @@ DEPOSIT_ACCOUNT_MANAGEMENT_IP=172.16.238.27
 TELLER_IP=172.16.238.28
 REPORTING_IP=172.16.238.29
 CHEQUES_IP=172.16.238.30
-PAYROLL_IP_IP=172.16.238.31
+PAYROLL_IP=172.16.238.31
 GROUP_IP=172.16.238.32
 NOTIFICATIONS_IP=172.16.238.33


[fineract-cn-docker-compose] 01/44: Initialize repo

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 990b13c62c92e278ad5c96a667a1ae750110c8ba
Author: Awasum Yannick <aw...@apache.org>
AuthorDate: Wed Sep 4 12:49:11 2019 +0100

    Initialize repo
---
 README.md          | 7 +++++++
 docker-compose.yml | 0
 2 files changed, 7 insertions(+)

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..db8df2b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+# Fineract CN Docker Compose
+This project contains Docker Compose Scripts for running Fineract CN especially in Development.
+
+## Requirements
+- Docker
+- Docker Compose
+
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..e69de29


[fineract-cn-docker-compose] 24/44: Merge pull request #8 from Anh3h/docker-swarm

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 0aab6f8610c6109201718c0d3cd76fb3646e47d9
Merge: 4438bd6 ecad808
Author: aasaru <aa...@gmail.com>
AuthorDate: Wed Oct 2 15:20:11 2019 +0300

    Merge pull request #8 from Anh3h/docker-swarm
    
    Update README and docker-compose scripts for docker swarm deployment

 README.md                         |  4 +-
 docker-compose.yml                | 78 ++++++++++++++++++++++++++++++++++++++-
 external_tools/docker-compose.yml | 16 ++++++--
 3 files changed, 92 insertions(+), 6 deletions(-)


[fineract-cn-docker-compose] 08/44: Merge remote-tracking branch 'anh3h/master' into anh3h_master Make it work with mac

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 7c2009e2d4313ede49076d551e124f533a6a18d6
Merge: 4cadf2c a5e833a
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Tue Sep 10 15:42:17 2019 +0300

    Merge remote-tracking branch 'anh3h/master' into anh3h_master
    Make it work with mac

 README.md                         |   7 ++-
 docker-compose.yml                | 120 ++++++++++++++++++++++++++++++++------
 env_variables                     |  15 +++++
 external_tools/docker-compose.yml |   6 ++
 start-up.sh                       |  26 +++++++++
 5 files changed, 154 insertions(+), 20 deletions(-)

diff --cc README.md
index c516bb1,2c38ea2..c0573e9
--- a/README.md
+++ b/README.md
@@@ -5,7 -5,10 +5,12 @@@ This project contains Docker Compose Sc
  - Docker
  - Docker-compose
  
 -## Perquisites
++## Automatic or manual provisioning
++
++You can either try to provision automatically using bash script `bash start-up.sh`
++Or you could achieve the same state by manually following the instructions below:
+ 
 -### Start-up Fineract CN microservices using bash script
 - `bash start-up.sh`
 +## Perquisites
  
  ### Generate .env file with RSA keys
  `java -cp external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env`
diff --cc docker-compose.yml
index d110ee2,af2648c..21717c7
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@@ -30,7 -30,8 +30,9 @@@ services
          delay: 10s
          max_attempts: 3
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.6
++      fineract:
++        ipv4_address: ${PROVISIONER_IP}
  
    identity-ms:
      image: apache/fineract-cn-identity:0.0.1-M.1 # TODO replace with latest
@@@ -56,9 -57,10 +58,11 @@@
          delay: 10s
          max_attempts: 3
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.7
++      fineract:
++        ipv4_address: ${IDENTITY_IP}
  
- # TODO HAS ERRORS:
 -# HAS ERRORS:
++  # TODO HAS ERRORS:
  #  rhythm-ms:
  #    image: apache/fineract-cn-rhythm:latest
  #    environment:
@@@ -76,7 -78,8 +80,9 @@@
  #      restart_policy:
  #        condition: on-failure
  #    networks:
- #      - external_tools_default
 -#        external_tools_default:
 -#          ipv4_address: 172.16.238.8
++#      external_tools_default:
++#      fineract:
++#          ipv4_address: ${RHYTHM_IP}
  
  
    office-ms:
@@@ -97,7 -100,8 +103,9 @@@
        system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
        system.privateKey.modulus: ${PRIVATE_KEY_MODULUS}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.9
++      fineract:
++        ipv4_address: ${OFFICE_IP}
  
    customer-ms:
      image: apache/fineract-cn-customer:latest
@@@ -115,9 -119,10 +123,11 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.10
++      fineract:
++        ipv4_address: ${CUSTOMER_IP}
  
 -  ledger-ms:
 +  accounting-ms:
      ports:
        - "2025:2025"
      image: apache/fineract-cn-accounting:latest
@@@ -133,7 -138,8 +143,9 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.11
++      fineract:
++        ipv4_address: ${ACCOUNTING_IP}
  
    portfolio-ms:
      image: apache/fineract-cn-portfolio:latest
@@@ -150,7 -156,8 +162,8 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.12
++        ipv4_address: ${PORTFOLIO_IP}
  
    deposit-account-management-ms:
      image: apache/fineract-cn-deposit-account-management:latest
@@@ -168,7 -175,8 +181,9 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.13
++      fineract:
++        ipv4_address: ${DEPOSIT_ACCOUNT_MANAGEMENT_IP}
  
    teller-ms:
      image: apache/fineract-cn-teller:latest
@@@ -186,7 -194,8 +201,9 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.14
++      fineract:
++        ipv4_address: ${TELLER_IP}
  
    reporting-ms:
      image: apache/fineract-cn-reporting:latest
@@@ -204,10 -213,8 +221,29 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
- #
- # TODO add checques-ms
- #
+       external_tools_default:
 -        ipv4_address: 172.16.238.15
++      fineract:
++        ipv4_address: ${REPORTING_IP}
++
++  cheques-ms:
++    image: apache/fineract-cn-reporting:latest
++    ports:
++      - "2030:2030"
++    environment:
++      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
++      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
++      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
++      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
++      postgresql.host: ${POSTGRESQL_HOST}
++      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
++      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
++      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
++      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
++      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
++    networks:
++      external_tools_default:
++      fineract:
++        ipv4_address: ${CHEQUES_IP}
  
    payroll-ms:
      image: apache/fineract-cn-payroll:latest
@@@ -225,19 -232,50 +261,65 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
- #
- # TODO group-ms
- #
+       external_tools_default:
 -        ipv4_address: 172.16.238.16
++      fineract:
++        ipv4_address: ${PAYROLL_IP}
+ 
+   group-ms:
+     image: apache/fineract-cn-group:latest
+     ports:
+       - "2032:2032"
+     environment:
+       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+       postgresql.host: ${POSTGRESQL_HOST}
+       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+     networks:
+       external_tools_default:
 -        ipv4_address: 172.16.238.17
++      fineract:
++        ipv4_address: ${GROUP_IP}
++
++  notification-ms:
++    image: apache/fineract-cn-notification:latest
++    ports:
++     - "2033:2033"
++    environment:
++      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
++      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
++      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
++      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
++      postgresql.host: ${POSTGRESQL_HOST}
++      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
++      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
++      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
++      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
++      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
++    networks:
++      external_tools_default:
++        ipv4_address: ${NOTIFICATION_IP}
  
 -  # Docker image is not yet available
 -  # notification-ms:
 -  #     image: apache/fineract-cn-notification:latest
 -  #     ports:
 -  #       - "2033:2033"
 -  #     environment:
 -  #       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
 -  #       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
 -  #       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
 -  #       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
 -  #       postgresql.host: ${POSTGRESQL_HOST}
 -  #       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
 -  #       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
 -  #       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
 -  #       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
 -  #       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
 -  #     networks:
 -  #       external_tools_default:
 -  #         ipv4_address: 172.16.238.18
 +  fims-web-app:
 +    image: aasaru/fineract-cn-fims-web-app:latest # TODO switch to apache repo
 +    ports:
 +      - "8888:8888"
 +    networks:
-       - external_tools_default
++      external_tools_default:
++      fineract:
++        ipv4_address: ${FIMS_WEB_APP_IP}
+ 
  
  networks:
    external_tools_default:
      external:
        name: external_tools_default
++  fineract:
++    driver: bridge
++    ipam:
++      config:
++        - subnet: 172.16.238.0/26
diff --cc env_variables
index 16cc9ae,16cc9ae..2613508
--- a/env_variables
+++ b/env_variables
@@@ -13,3 -13,3 +13,18 @@@ POSTGRESQL_PORT=543
  POSTGRESQL_USER=postgres
  RIBBON_EUREKA_SERVER=eureka:9090
  SYSTEM_INITIAL_CLIENT_ID=service-runner
++FIMS_WEB_APP_IP=172.16.238.19
++PROVISIONER_IP=172.16.238.20
++IDENTITY_IP=172.16.238.21
++RHYTHM_IP=172.16.238.22
++OFFICE_IP=172.16.238.23
++CUSTOMER_IP=172.16.238.24
++ACCOUNTING_IP=172.16.238.25
++PORTFOLIO_IP=172.16.238.26
++DEPOSIT_ACCOUNT_MANAGEMENT_IP=172.16.238.27
++TELLER_IP=172.16.238.28
++REPORTING_IP=172.16.238.29
++CHEQUES_IP=172.16.238.30
++PAYROLL_IP_IP=172.16.238.31
++GROUP_IP=172.16.238.32
++NOTIFICATION_IP=172.16.238.33
diff --cc external_tools/docker-compose.yml
index 1f30a07,1f30a07..f6aec16
--- a/external_tools/docker-compose.yml
+++ b/external_tools/docker-compose.yml
@@@ -69,3 -69,3 +69,9 @@@ volumes
    cassandra-volume:
    postgres-volume:
  
++networks:
++  default:
++    driver: bridge
++    ipam:
++      config:
++        - subnet: 172.16.238.64/29
diff --cc start-up.sh
index 0000000,14a2fdf..97deace
mode 000000,100755..100755
--- a/start-up.sh
+++ b/start-up.sh
@@@ -1,0 -1,29 +1,26 @@@
+ #!/bin/sh
+ set -e
+ 
 -echo "Createing docker service network"
 -docker network create --driver=bridge --subnet=172.16.238.0/24 external_tools_default
 -
+ cd external_tools/
+ docker-compose up -d
+ cassandra_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cassandra)
+ postgres_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' postgres)
+ 
+ # #Test Cassandra and Postgres
+ echo "Waiting for Cassandra and Postgres ..."
+ while ! nc -z "${cassandra_ip}" 9042 ; do
+   sleep 1
+ done
+ while ! nc -z "${postgres_ip}" 5432 ; do
+   sleep 1
+ done
+ echo "Cassandra and Postgres are up and running..."
+ cd ..
+ 
+ echo "Starting up Fineract CN microservices..."
+ wget https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/lang/0.1.0-BUILD-SNAPSHOT/lang-0.1.0-BUILD-SNAPSHOT.jar
+ java -cp lang-0.1.0-BUILD-SNAPSHOT.jar org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env
+ cat env_variables >> .env
+ 
+ docker-compose up -d
+ echo "Successfully started fineract services."


[fineract-cn-docker-compose] 16/44: Merge pull request #5 from aasaru/FINCN-176

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit ec6397db7672859c39bbab92f426452002dd5c8c
Merge: a5ed548 bc970c8
Author: aasaru <aa...@gmail.com>
AuthorDate: Tue Sep 17 09:46:21 2019 +0300

    Merge pull request #5 from aasaru/FINCN-176
    
    FINCN-176 fix cheques image name, point at fixed apache images, fix payroll ip variable name

 docker-compose.yml | 51 +++++++++++++++++++++++++--------------------------
 env_variables      |  2 +-
 2 files changed, 26 insertions(+), 27 deletions(-)


[fineract-cn-docker-compose] 31/44: Merge pull request #11 from ochamber/master

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit e47210354a52319728bee3197dc2f39e45ca76b9
Merge: 3aa8bf9 f3571f4
Author: aasaru <aa...@gmail.com>
AuthorDate: Fri Oct 18 15:04:19 2019 +0300

    Merge pull request #11 from ochamber/master
    
    Update README.md

 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)


[fineract-cn-docker-compose] 19/44: Merge pull request #7 from aasaru/improve_postman_scripts

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

juhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit f0e75eec38116a06193f14ac0ff45c4993cada0d
Merge: ec6397d 96753fb
Author: aasaru <aa...@gmail.com>
AuthorDate: Mon Sep 23 17:21:01 2019 +0300

    Merge pull request #7 from aasaru/improve_postman_scripts
    
    Improve Postman provisioning scripts

 README.md                                          |   19 +-
 docker-compose.yml                                 |    9 +-
 ...act-Cn-Initial-Requests.postman_collection.json | 2992 +++++++++++++++++++-
 ...tial-Setup-Environment.postman_environment.json |   40 +-
 postman_scripts/accounts_with_type.csv             |   85 +
 5 files changed, 3069 insertions(+), 76 deletions(-)